Advertisement
Guest User

Untitled

a guest
Oct 3rd, 2018
1,066
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.04 KB | None | 0 0
  1. package com.developerincorp.instagram.ui.fragment;
  2.  
  3. import android.content.Intent;
  4. import android.net.Uri;
  5. import android.os.Bundle;
  6. import android.support.annotation.Nullable;
  7. import android.support.design.widget.TextInputEditText;
  8. import android.support.design.widget.TextInputLayout;
  9. import android.text.Editable;
  10. import android.text.TextUtils;
  11. import android.text.TextWatcher;
  12. import android.util.Log;
  13. import android.view.LayoutInflater;
  14. import android.view.View;
  15. import android.view.ViewGroup;
  16. import android.widget.Button;
  17. import android.widget.CheckBox;
  18. import android.widget.EditText;
  19. import android.widget.ImageView;
  20. import android.widget.ProgressBar;
  21. import android.widget.ScrollView;
  22.  
  23. import com.developerincorp.instagram.R;
  24. import com.developerincorp.instagram.data.CurrentUser;
  25. import com.developerincorp.instagram.data.SessionParams;
  26. import com.developerincorp.instagram.data.model.LoginResponse;
  27. import com.developerincorp.instagram.net.Config;
  28. import com.developerincorp.instagram.net.InstagramNetworkHelper;
  29. import com.developerincorp.instagram.ui.activity.AccountVerificationActivity;
  30. import com.developerincorp.instagram.ui.activity.NavigationActivity;
  31. import com.developerincorp.instagram.ui.activity.PhoneVerificationActivity;
  32. import com.developerincorp.instagram.ui.base.CommonFragment;
  33. import com.developerincorp.instagram.util.NavigationUtils;
  34. import com.github.omadahealth.lollipin.lib.managers.AppLock;
  35. import com.google.gson.Gson;
  36. import com.google.gson.GsonBuilder;
  37.  
  38. import net.yslibrary.android.keyboardvisibilityevent.KeyboardVisibilityEvent;
  39. import net.yslibrary.android.keyboardvisibilityevent.KeyboardVisibilityEventListener;
  40.  
  41. import java.util.HashMap;
  42. import java.util.Map;
  43.  
  44. import butterknife.BindView;
  45. import butterknife.ButterKnife;
  46. import butterknife.OnClick;
  47. import okhttp3.Headers;
  48. import okhttp3.ResponseBody;
  49. import retrofit2.Call;
  50. import retrofit2.Callback;
  51. import retrofit2.Response;
  52.  
  53. import static com.developerincorp.instagram.net.Config.PRIVACY_POLICY_URL;
  54. import static com.developerincorp.instagram.util.Constant.CHECKPOINT_KEY;
  55. import static com.developerincorp.instagram.util.Constant.CSRFTOKEN_KEY;
  56. import static com.developerincorp.instagram.util.Constant.IDENTIFIER_CODE_KEY;
  57. import static com.developerincorp.instagram.util.Constant.OBFUSCATED_PHONE_NUMBER_KEY;
  58. import static com.developerincorp.instagram.util.Constant.USER_NAME_KEY;
  59. import static com.developerincorp.instagram.util.LogUtils.makeLogTag;
  60. import static com.developerincorp.instagram.util.ParseUtils.getCookieValue;
  61.  
  62. public class LoginFragment extends CommonFragment implements KeyboardVisibilityEventListener {
  63.  
  64. @BindView(R.id.scrollView) ScrollView scrollView;
  65. @BindView(R.id.il_login) TextInputLayout ilLogin;
  66. @BindView(R.id.il_password) TextInputLayout ilPassword;
  67. @BindView(R.id.et_login) EditText etLogin;
  68. @BindView(R.id.et_password) EditText etPassword;
  69. @BindView(R.id.btn_login) Button btnLogin;
  70. @BindView(R.id.btn_login_from_insta) ViewGroup btnLoginFromInsta;
  71. @BindView(R.id.sw_policy) CheckBox swPolicy;
  72. @BindView(R.id.progress_bar) ProgressBar progressBar;
  73. @BindView(R.id.vg_login_form) ViewGroup vgLoginForm;
  74. @BindView(R.id.iv_login_bkg) ImageView ivLoginBkg;
  75.  
  76. private HashMap<String, String> headers;
  77.  
  78. private static final String LOG_TAG = makeLogTag(LoginFragment.class);
  79.  
  80. @Nullable
  81. @Override
  82. public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
  83. View view = inflater.inflate(R.layout.login_fragment, container, false);
  84. ButterKnife.bind(this, view);
  85. setUpViews();
  86. loadCsrftoken();
  87. KeyboardVisibilityEvent.setEventListener(getActivity(), this);
  88. return view;
  89. }
  90.  
  91. @OnClick(R.id.btn_login)
  92. void onLoginClick(final View view) {
  93. if (headers != null) {
  94. String login = etLogin.getText().toString();
  95. String password = etPassword.getText().toString();
  96.  
  97. if (validateLogin(login) & validatePassword(password) & validatePolicy()) {
  98. login(headers, login, password);
  99. hideInput(view);
  100. showProgress(true);
  101. }
  102. }
  103. }
  104.  
  105. @OnClick(R.id.tv_policy)
  106. void onAgreePolicyClick(final View view) {
  107. Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(PRIVACY_POLICY_URL));
  108. startActivity(browserIntent);
  109. }
  110.  
  111. @OnClick(R.id.btn_login_from_insta)
  112. void onInstaLoginClick(final View view) {
  113. vgLoginForm.setVisibility(View.VISIBLE);
  114. ivLoginBkg.setVisibility(View.GONE);
  115. btnLoginFromInsta.setVisibility(View.GONE);
  116. }
  117.  
  118. private boolean validateLogin(String login) {
  119. boolean isValid = !TextUtils.isEmpty(login);
  120. if (!isValid) {
  121. ilLogin.setError(getActivity().getString(R.string.field_not_filled));
  122. }
  123. return isValid;
  124. }
  125.  
  126. private boolean validatePassword(String password) {
  127. boolean isValid = !TextUtils.isEmpty(password);
  128. if (!isValid) {
  129. ilPassword.setError(getActivity().getString(R.string.field_not_filled));
  130. }
  131. return isValid;
  132. }
  133.  
  134. private boolean validatePolicy() {
  135. return swPolicy.isChecked();
  136. }
  137.  
  138. @Override
  139. public void onVisibilityChanged(boolean isOpen) {
  140. if (isOpen) {
  141. scrollView.post(() -> scrollView.fullScroll(ScrollView.FOCUS_DOWN));
  142. }
  143. }
  144.  
  145. public void login(Map<String, String> headers, String name, String pass) {
  146. InstagramNetworkHelper.getInstance().getInstagramWebService().login(headers, name, pass).enqueue(new Callback<ResponseBody>() {
  147.  
  148. @Override
  149. public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
  150. try {
  151. String resp;
  152. if (response.isSuccessful()) {
  153. resp = response.body().string();
  154. } else {
  155. resp = response.errorBody().string();
  156. }
  157.  
  158. Gson gson = new GsonBuilder().create();
  159. LoginResponse loginResponse = gson.fromJson(resp, LoginResponse.class);
  160. LoginResponse.TwoFactorInfo info = loginResponse.getTwoFactorInfo();
  161. //Log.i(LOG_TAG, "LoginResponse_! " + loginResponse.toString());
  162.  
  163. if (loginResponse.isAuthenticated()) {
  164. authSuccess(name, response.headers());
  165. } else if (loginResponse.isTwoFactorRequired() && (info.isSmsTwoFactorOn() | info.isTotpTwoFactorOn())) {
  166. startPhoneVerificationScreen(loginResponse, getCookieValue(response.headers(), "csrftoken"));
  167. } else {
  168. onAuthenticatedError(loginResponse);
  169. }
  170. } catch (Exception e) {
  171. e.printStackTrace();
  172. } finally {
  173. showProgress(false);
  174. }
  175. }
  176.  
  177. @Override
  178. public void onFailure(Call<ResponseBody> call, Throwable t) {
  179. showProgress(false);
  180. }
  181. });
  182. }
  183.  
  184. public void loadCsrftoken() {
  185. InstagramNetworkHelper.getInstance().getInstagramWebService().getCsrftoken().enqueue(new Callback<ResponseBody>() {
  186.  
  187. @Override
  188. public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
  189. try {
  190. headers = new HashMap<>();
  191. headers.put("X-CSRFToken", getCookieValue(response.headers(), "csrftoken"));
  192. headers.put("X-Instagram-AJAX", "1");
  193. headers.put("X-Requested-With", "XMLHttpRequest");
  194. headers.put("Referer", Config.INSTAGRAM_LOGIN_URL);
  195. 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");
  196. } catch (Exception e) {
  197. e.printStackTrace();
  198. }
  199. }
  200.  
  201. @Override
  202. public void onFailure(Call<ResponseBody> call, Throwable t) {
  203.  
  204. }
  205. });
  206. }
  207.  
  208. private void authSuccess(String userName, Headers headers) {
  209. try {
  210. //Log.i(LOG_TAG, " userName " + userName);
  211. HashMap<String, String> hashMap = new HashMap<>();
  212. String csrftoken = getCookieValue(headers, "csrftoken");
  213. hashMap.put("csrftoken", csrftoken);
  214. hashMap.put("sessionid", getCookieValue(headers, "sessionid"));
  215. hashMap.put("mid", getCookieValue(headers, "mid"));
  216. SessionParams.get().setCookie(hashMap).save();
  217. InstagramNetworkHelper.resetInstance();
  218. CurrentUser currentUser = CurrentUser.get();
  219. currentUser.setUserLogin(true).setUserName(userName).setCsrftoken(csrftoken).save();
  220.  
  221. startNavigationScreen();
  222. } catch (Exception e) {
  223. e.printStackTrace();
  224. }
  225. }
  226.  
  227. private void onAuthenticatedError(LoginResponse loginResponse) {
  228. String message = loginResponse.getMessage();
  229. if (!TextUtils.isEmpty(message) && message.equals("checkpoint_required")) {
  230. startAccountVerificationScreen(loginResponse);
  231. } else {
  232. NavigationUtils.showEasyDialog(getActivity(), null, getString(R.string.login_error));
  233. }
  234. }
  235.  
  236. private void showProgress(boolean state) {
  237. progressBar.setVisibility(state ? View.VISIBLE : View.GONE);
  238. vgLoginForm.setVisibility(state ? View.GONE : View.VISIBLE);
  239. }
  240.  
  241. private void startNavigationScreen() {
  242. startActivity(new Intent(getActivity(), NavigationActivity.class));
  243. getActivity().finish();
  244. }
  245.  
  246. private void startAccountVerificationScreen(LoginResponse loginResponse) {
  247. String checkpoint = loginResponse.getCheckpoint_url();
  248. Intent intent = new Intent(getActivity(), AccountVerificationActivity.class);
  249. intent.putExtra(CHECKPOINT_KEY, checkpoint);
  250. startActivity(intent);
  251. }
  252.  
  253. private void startPhoneVerificationScreen(LoginResponse loginResponse, String csrftoken) {
  254. LoginResponse.TwoFactorInfo info = loginResponse.getTwoFactorInfo();
  255. if (info != null) {
  256. Intent intent = new Intent(getActivity(), PhoneVerificationActivity.class);
  257. intent.putExtra(AppLock.EXTRA_TYPE, AppLock.ENABLE_PINLOCK);
  258. intent.putExtra(USER_NAME_KEY, info.getUsername());
  259. intent.putExtra(IDENTIFIER_CODE_KEY, info.getTwoFactorIdentifier());
  260. intent.putExtra(CSRFTOKEN_KEY, csrftoken);
  261. intent.putExtra(OBFUSCATED_PHONE_NUMBER_KEY, info.getObfuscatedPhoneNumber());
  262. startActivity(intent);
  263. }
  264. }
  265.  
  266. private void setUpViews() {
  267. etLogin.addTextChangedListener(new TextWatcher() {
  268. @Override
  269. public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  270.  
  271. }
  272.  
  273. @Override
  274. public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  275. if (!TextUtils.isEmpty(charSequence.toString())) ilLogin.setErrorEnabled(false);
  276. }
  277.  
  278. @Override
  279. public void afterTextChanged(Editable editable) {
  280.  
  281. }
  282. });
  283.  
  284. etPassword.addTextChangedListener(new TextWatcher() {
  285. @Override
  286. public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  287.  
  288. }
  289.  
  290. @Override
  291. public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
  292. if (!TextUtils.isEmpty(charSequence.toString())) ilPassword.setErrorEnabled(false);
  293. }
  294.  
  295. @Override
  296. public void afterTextChanged(Editable editable) {
  297.  
  298. }
  299. });
  300. }
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement