Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.developerincorp.instagram.ui.fragment;
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Bundle;
- import android.support.annotation.Nullable;
- import android.support.design.widget.TextInputEditText;
- import android.support.design.widget.TextInputLayout;
- import android.text.Editable;
- import android.text.TextUtils;
- import android.text.TextWatcher;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.Button;
- import android.widget.CheckBox;
- import android.widget.EditText;
- import android.widget.ImageView;
- import android.widget.ProgressBar;
- import android.widget.ScrollView;
- import com.developerincorp.instagram.R;
- import com.developerincorp.instagram.data.CurrentUser;
- import com.developerincorp.instagram.data.SessionParams;
- import com.developerincorp.instagram.data.model.LoginResponse;
- import com.developerincorp.instagram.net.Config;
- import com.developerincorp.instagram.net.InstagramNetworkHelper;
- import com.developerincorp.instagram.ui.activity.AccountVerificationActivity;
- import com.developerincorp.instagram.ui.activity.NavigationActivity;
- import com.developerincorp.instagram.ui.activity.PhoneVerificationActivity;
- import com.developerincorp.instagram.ui.base.CommonFragment;
- import com.developerincorp.instagram.util.NavigationUtils;
- import com.github.omadahealth.lollipin.lib.managers.AppLock;
- import com.google.gson.Gson;
- import com.google.gson.GsonBuilder;
- import net.yslibrary.android.keyboardvisibilityevent.KeyboardVisibilityEvent;
- import net.yslibrary.android.keyboardvisibilityevent.KeyboardVisibilityEventListener;
- import java.util.HashMap;
- import java.util.Map;
- import butterknife.BindView;
- import butterknife.ButterKnife;
- import butterknife.OnClick;
- import okhttp3.Headers;
- import okhttp3.ResponseBody;
- import retrofit2.Call;
- import retrofit2.Callback;
- import retrofit2.Response;
- import static com.developerincorp.instagram.net.Config.PRIVACY_POLICY_URL;
- import static com.developerincorp.instagram.util.Constant.CHECKPOINT_KEY;
- import static com.developerincorp.instagram.util.Constant.CSRFTOKEN_KEY;
- import static com.developerincorp.instagram.util.Constant.IDENTIFIER_CODE_KEY;
- import static com.developerincorp.instagram.util.Constant.OBFUSCATED_PHONE_NUMBER_KEY;
- import static com.developerincorp.instagram.util.Constant.USER_NAME_KEY;
- import static com.developerincorp.instagram.util.LogUtils.makeLogTag;
- import static com.developerincorp.instagram.util.ParseUtils.getCookieValue;
- public class LoginFragment extends CommonFragment implements KeyboardVisibilityEventListener {
- @BindView(R.id.scrollView) ScrollView scrollView;
- @BindView(R.id.il_login) TextInputLayout ilLogin;
- @BindView(R.id.il_password) TextInputLayout ilPassword;
- @BindView(R.id.et_login) EditText etLogin;
- @BindView(R.id.et_password) EditText etPassword;
- @BindView(R.id.btn_login) Button btnLogin;
- @BindView(R.id.btn_login_from_insta) ViewGroup btnLoginFromInsta;
- @BindView(R.id.sw_policy) CheckBox swPolicy;
- @BindView(R.id.progress_bar) ProgressBar progressBar;
- @BindView(R.id.vg_login_form) ViewGroup vgLoginForm;
- @BindView(R.id.iv_login_bkg) ImageView ivLoginBkg;
- private HashMap<String, String> headers;
- private static final String LOG_TAG = makeLogTag(LoginFragment.class);
- @Nullable
- @Override
- public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.login_fragment, container, false);
- ButterKnife.bind(this, view);
- setUpViews();
- loadCsrftoken();
- KeyboardVisibilityEvent.setEventListener(getActivity(), this);
- return view;
- }
- @OnClick(R.id.btn_login)
- void onLoginClick(final View view) {
- if (headers != null) {
- String login = etLogin.getText().toString();
- String password = etPassword.getText().toString();
- if (validateLogin(login) & validatePassword(password) & validatePolicy()) {
- login(headers, login, password);
- hideInput(view);
- showProgress(true);
- }
- }
- }
- @OnClick(R.id.tv_policy)
- void onAgreePolicyClick(final View view) {
- Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(PRIVACY_POLICY_URL));
- startActivity(browserIntent);
- }
- @OnClick(R.id.btn_login_from_insta)
- void onInstaLoginClick(final View view) {
- vgLoginForm.setVisibility(View.VISIBLE);
- ivLoginBkg.setVisibility(View.GONE);
- btnLoginFromInsta.setVisibility(View.GONE);
- }
- private boolean validateLogin(String login) {
- boolean isValid = !TextUtils.isEmpty(login);
- if (!isValid) {
- ilLogin.setError(getActivity().getString(R.string.field_not_filled));
- }
- return isValid;
- }
- private boolean validatePassword(String password) {
- boolean isValid = !TextUtils.isEmpty(password);
- if (!isValid) {
- ilPassword.setError(getActivity().getString(R.string.field_not_filled));
- }
- return isValid;
- }
- private boolean validatePolicy() {
- return swPolicy.isChecked();
- }
- @Override
- public void onVisibilityChanged(boolean isOpen) {
- if (isOpen) {
- scrollView.post(() -> scrollView.fullScroll(ScrollView.FOCUS_DOWN));
- }
- }
- public void login(Map<String, String> headers, String name, String pass) {
- InstagramNetworkHelper.getInstance().getInstagramWebService().login(headers, name, pass).enqueue(new Callback<ResponseBody>() {
- @Override
- public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
- try {
- String resp;
- if (response.isSuccessful()) {
- resp = response.body().string();
- } else {
- resp = response.errorBody().string();
- }
- Gson gson = new GsonBuilder().create();
- LoginResponse loginResponse = gson.fromJson(resp, LoginResponse.class);
- LoginResponse.TwoFactorInfo info = loginResponse.getTwoFactorInfo();
- //Log.i(LOG_TAG, "LoginResponse_! " + loginResponse.toString());
- if (loginResponse.isAuthenticated()) {
- authSuccess(name, response.headers());
- } else if (loginResponse.isTwoFactorRequired() && (info.isSmsTwoFactorOn() | info.isTotpTwoFactorOn())) {
- startPhoneVerificationScreen(loginResponse, getCookieValue(response.headers(), "csrftoken"));
- } else {
- onAuthenticatedError(loginResponse);
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- showProgress(false);
- }
- }
- @Override
- public void onFailure(Call<ResponseBody> call, Throwable t) {
- showProgress(false);
- }
- });
- }
- public void loadCsrftoken() {
- InstagramNetworkHelper.getInstance().getInstagramWebService().getCsrftoken().enqueue(new Callback<ResponseBody>() {
- @Override
- public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
- try {
- headers = new HashMap<>();
- headers.put("X-CSRFToken", getCookieValue(response.headers(), "csrftoken"));
- headers.put("X-Instagram-AJAX", "1");
- headers.put("X-Requested-With", "XMLHttpRequest");
- headers.put("Referer", Config.INSTAGRAM_LOGIN_URL);
- headers.put("User-Agent", "Mozilla/5.0 (Linux; Android 4.4.2; Android SDK built for x86 Build/KK) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- @Override
- public void onFailure(Call<ResponseBody> call, Throwable t) {
- }
- });
- }
- private void authSuccess(String userName, Headers headers) {
- try {
- //Log.i(LOG_TAG, " userName " + userName);
- HashMap<String, String> hashMap = new HashMap<>();
- String csrftoken = getCookieValue(headers, "csrftoken");
- hashMap.put("csrftoken", csrftoken);
- hashMap.put("sessionid", getCookieValue(headers, "sessionid"));
- hashMap.put("mid", getCookieValue(headers, "mid"));
- SessionParams.get().setCookie(hashMap).save();
- InstagramNetworkHelper.resetInstance();
- CurrentUser currentUser = CurrentUser.get();
- currentUser.setUserLogin(true).setUserName(userName).setCsrftoken(csrftoken).save();
- startNavigationScreen();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- private void onAuthenticatedError(LoginResponse loginResponse) {
- String message = loginResponse.getMessage();
- if (!TextUtils.isEmpty(message) && message.equals("checkpoint_required")) {
- startAccountVerificationScreen(loginResponse);
- } else {
- NavigationUtils.showEasyDialog(getActivity(), null, getString(R.string.login_error));
- }
- }
- private void showProgress(boolean state) {
- progressBar.setVisibility(state ? View.VISIBLE : View.GONE);
- vgLoginForm.setVisibility(state ? View.GONE : View.VISIBLE);
- }
- private void startNavigationScreen() {
- startActivity(new Intent(getActivity(), NavigationActivity.class));
- getActivity().finish();
- }
- private void startAccountVerificationScreen(LoginResponse loginResponse) {
- String checkpoint = loginResponse.getCheckpoint_url();
- Intent intent = new Intent(getActivity(), AccountVerificationActivity.class);
- intent.putExtra(CHECKPOINT_KEY, checkpoint);
- startActivity(intent);
- }
- private void startPhoneVerificationScreen(LoginResponse loginResponse, String csrftoken) {
- LoginResponse.TwoFactorInfo info = loginResponse.getTwoFactorInfo();
- if (info != null) {
- Intent intent = new Intent(getActivity(), PhoneVerificationActivity.class);
- intent.putExtra(AppLock.EXTRA_TYPE, AppLock.ENABLE_PINLOCK);
- intent.putExtra(USER_NAME_KEY, info.getUsername());
- intent.putExtra(IDENTIFIER_CODE_KEY, info.getTwoFactorIdentifier());
- intent.putExtra(CSRFTOKEN_KEY, csrftoken);
- intent.putExtra(OBFUSCATED_PHONE_NUMBER_KEY, info.getObfuscatedPhoneNumber());
- startActivity(intent);
- }
- }
- private void setUpViews() {
- etLogin.addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
- }
- @Override
- public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
- if (!TextUtils.isEmpty(charSequence.toString())) ilLogin.setErrorEnabled(false);
- }
- @Override
- public void afterTextChanged(Editable editable) {
- }
- });
- etPassword.addTextChangedListener(new TextWatcher() {
- @Override
- public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
- }
- @Override
- public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
- if (!TextUtils.isEmpty(charSequence.toString())) ilPassword.setErrorEnabled(false);
- }
- @Override
- public void afterTextChanged(Editable editable) {
- }
- });
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement