/app/src/main/java/com/antonio/seekr/activities/LoginActivity.java

https://gitlab.com/toni8/seekr · Java · 352 lines · 282 code · 57 blank · 13 comment · 28 complexity · 92417187561b70a46986d89bc341fa2e MD5 · raw file

  1. package com.antonio.seekr.activities;
  2. import android.content.Context;
  3. import android.content.Intent;
  4. import android.os.Bundle;
  5. import android.support.annotation.NonNull;
  6. import android.support.design.widget.Snackbar;
  7. import android.support.design.widget.TextInputLayout;
  8. import android.support.v4.content.ContextCompat;
  9. import android.support.v7.app.AppCompatActivity;
  10. import android.text.InputType;
  11. import android.view.View;
  12. import android.view.ViewGroup;
  13. import android.view.inputmethod.InputMethodManager;
  14. import android.widget.Button;
  15. import android.widget.EditText;
  16. import android.widget.ImageView;
  17. import android.widget.ProgressBar;
  18. import android.widget.TextView;
  19. import com.afollestad.materialdialogs.MaterialDialog;
  20. import com.antonio.seekr.R;
  21. import com.antonio.seekr.data.Data;
  22. import com.antonio.seekr.models.Student;
  23. import com.antonio.seekr.utils.Constants;
  24. import com.antonio.seekr.utils.Utils;
  25. import com.antonio.seekr.utils.Validators;
  26. import com.google.android.gms.tasks.OnCompleteListener;
  27. import com.google.android.gms.tasks.Task;
  28. import com.google.firebase.auth.AuthCredential;
  29. import com.google.firebase.auth.AuthResult;
  30. import com.google.firebase.auth.EmailAuthProvider;
  31. import com.google.firebase.auth.FirebaseAuth;
  32. import com.google.firebase.auth.FirebaseUser;
  33. import com.google.firebase.database.DataSnapshot;
  34. import com.google.firebase.database.DatabaseError;
  35. import com.google.firebase.database.DatabaseReference;
  36. import com.google.firebase.database.FirebaseDatabase;
  37. import com.google.firebase.database.ValueEventListener;
  38. import com.transitionseverywhere.Transition;
  39. import com.transitionseverywhere.TransitionManager;
  40. import com.transitionseverywhere.extra.Scale;
  41. public class LoginActivity extends AppCompatActivity {
  42. private DatabaseReference mDatabase;
  43. private FirebaseAuth firebaseAuth;
  44. private EditText inputEmail, inputPassword, inputConfirmPassword;
  45. private TextInputLayout inputLayoutName, inputLayoutEmail, inputLayoutPassword, inputLayoutConfirmPassword;
  46. private Button btnChangeLayout, btnSubmit;
  47. private boolean isRegistering = false;
  48. private String email, password;
  49. private String btnText = "";
  50. private Validators validators;
  51. private ProgressBar progressBar;
  52. private int firstLogin = 1;
  53. ViewGroup transitionsContainer, successRegistrationContainer;
  54. ImageView ivSuccess;
  55. TextView tvForgotPass;
  56. @Override
  57. protected void onCreate(Bundle savedInstanceState) {
  58. super.onCreate(savedInstanceState);
  59. setContentView(R.layout.activity_login);
  60. firebaseAuth = FirebaseAuth.getInstance();
  61. validators = new Validators(this);
  62. transitionsContainer = (ViewGroup) findViewById(R.id.activity_login_rl);
  63. successRegistrationContainer = (ViewGroup) findViewById(R.id.success_register_container);
  64. tvForgotPass = (TextView) findViewById(R.id.tv_forgot_pass);
  65. ivSuccess = (ImageView) findViewById(R.id.iv_register_success);
  66. progressBar = (ProgressBar) findViewById(R.id.progressBar);
  67. btnChangeLayout = (Button) findViewById(R.id.btn_change_layout);
  68. btnSubmit = (Button) findViewById(R.id.btn_submit);
  69. inputEmail = (EditText) findViewById(R.id.input_email);
  70. inputPassword = (EditText) findViewById(R.id.input_password);
  71. inputConfirmPassword = (EditText) findViewById(R.id.input_confirm_password);
  72. inputLayoutEmail = (TextInputLayout) findViewById(R.id.input_layout_email);
  73. inputLayoutPassword = (TextInputLayout) findViewById(R.id.input_layout_password);
  74. inputLayoutConfirmPassword = (TextInputLayout) findViewById(R.id.input_layout_confirm_password);
  75. tvForgotPass.setOnClickListener(new View.OnClickListener() {
  76. @Override
  77. public void onClick(View v) {
  78. new MaterialDialog.Builder(LoginActivity.this)
  79. .title("Enter your email")
  80. .backgroundColor(ContextCompat.getColor(LoginActivity.this, R.color.white))
  81. .itemsColor(ContextCompat.getColor(LoginActivity.this, R.color.colorAccent))
  82. .negativeColor(ContextCompat.getColor(LoginActivity.this, R.color.colorAccent))
  83. .contentColor(ContextCompat.getColor(LoginActivity.this, R.color.colorTextPrimary))
  84. .titleColor(ContextCompat.getColor(getApplicationContext(), R.color.colorTextPrimary))
  85. .inputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS)
  86. .input("Email", "", new MaterialDialog.InputCallback() {
  87. @Override
  88. public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
  89. FirebaseAuth.getInstance().sendPasswordResetEmail(input.toString())
  90. .addOnCompleteListener(new OnCompleteListener<Void>() {
  91. @Override
  92. public void onComplete(@NonNull Task<Void> task) {
  93. if (task.isSuccessful()) {
  94. Utils.showInfoDialog(LoginActivity.this
  95. , "Email sent."
  96. , "A password reset email has been sent to your address.");
  97. } else {
  98. Utils.showInfoDialog(LoginActivity.this
  99. , "Email not sent."
  100. , "There has been an error. Please check your address and try again.");
  101. }
  102. }
  103. });
  104. }
  105. }).show();
  106. }
  107. });
  108. btnChangeLayout.setOnClickListener(new View.OnClickListener() {
  109. @Override
  110. public void onClick(View arg0) {
  111. changeLayout();
  112. }
  113. });
  114. btnSubmit.setOnClickListener(new View.OnClickListener() {
  115. @Override
  116. public void onClick(View arg0) {
  117. // finalizeRegistration();
  118. /* if(isRegistering)
  119. finalizeRegistration();
  120. else {
  121. startActivity(new Intent(LoginActivity.this, FirstLoginActivity.class));
  122. overridePendingTransition(R.anim.open_translate, R.anim.close_scale);
  123. }*/
  124. if (isRegistering) {
  125. registerUser();
  126. } else {
  127. InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  128. imm.hideSoftInputFromWindow(findViewById(R.id.activity_login_rl).getWindowToken(), 0);
  129. loginUser();
  130. }
  131. }
  132. });
  133. }
  134. private void registerUser() {
  135. if (!validators.validateEmail(inputEmail, inputLayoutEmail)) {
  136. return;
  137. }
  138. if (!validators.validatePassword(inputPassword, inputLayoutPassword, isRegistering)) {
  139. return;
  140. }
  141. if (!validators.validateConfirmPassword(inputPassword, inputConfirmPassword, inputLayoutPassword)) {
  142. return;
  143. }
  144. handleButtonProgress();
  145. email = inputEmail.getText().toString().trim();
  146. password = inputPassword.getText().toString().trim();
  147. //creating a new user
  148. firebaseAuth.createUserWithEmailAndPassword(email, password)
  149. .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
  150. @Override
  151. public void onComplete(@NonNull Task<AuthResult> task) {
  152. handleButtonProgress();
  153. if (task.isSuccessful()) {
  154. final FirebaseUser user = firebaseAuth.getCurrentUser();
  155. // task.getResult().getUser();
  156. if (user != null) {
  157. AuthCredential credential = EmailAuthProvider
  158. .getCredential(email, password);
  159. user.reauthenticate(credential)
  160. .addOnCompleteListener(new OnCompleteListener<Void>() {
  161. @Override
  162. public void onComplete(@NonNull Task<Void> task) {
  163. user.sendEmailVerification()
  164. .addOnCompleteListener(new OnCompleteListener<Void>() {
  165. @Override
  166. public void onComplete(@NonNull Task<Void> task) {
  167. if (task.isSuccessful()) {
  168. mDatabase = FirebaseDatabase.getInstance().getReference();
  169. Student student = new Student();
  170. student.setFirstLogin(1);
  171. student.setStudentId(user.getUid());
  172. mDatabase.child("users").child(user.getUid()).setValue(student);
  173. finalizeRegistration();
  174. } else {
  175. Utils.showInfoDialog(LoginActivity.this
  176. , "Error"
  177. , "Error sending verification email. Please contact us to resolve this problem.");
  178. }
  179. }
  180. });
  181. }
  182. });
  183. }
  184. } else {
  185. Utils.showInfoDialog(LoginActivity.this
  186. , "Error"
  187. , "Registration Error");
  188. }
  189. }
  190. });
  191. }
  192. private void finalizeRegistration() {
  193. successRegistrationContainer.setVisibility(View.VISIBLE);
  194. Transition scaleTransition = new Scale();
  195. scaleTransition.setDuration(500);
  196. TransitionManager.beginDelayedTransition(successRegistrationContainer, scaleTransition);
  197. ivSuccess.setVisibility(View.VISIBLE);
  198. Utils.playSound(this);
  199. successRegistrationContainer.setOnClickListener(new View.OnClickListener() {
  200. @Override
  201. public void onClick(View view) {
  202. changeLayout();
  203. }
  204. });
  205. }
  206. private void changeLayout() {
  207. isRegistering = !isRegistering;
  208. TransitionManager.beginDelayedTransition(transitionsContainer);
  209. inputLayoutConfirmPassword.setVisibility(isRegistering ? View.VISIBLE : View.GONE);
  210. btnChangeLayout.setText(isRegistering ? Constants.LOGIN : Constants.SIGNUP);
  211. btnSubmit.setText(isRegistering ? Constants.SIGNUP : Constants.LOGIN);
  212. //if registration has been completed, hide the overlay and clear the edittexts
  213. if (successRegistrationContainer.getVisibility() == View.VISIBLE) {
  214. successRegistrationContainer.setVisibility(View.INVISIBLE);
  215. ivSuccess.setVisibility(View.INVISIBLE);
  216. inputEmail.setText("");
  217. inputPassword.setText("");
  218. inputConfirmPassword.setText("");
  219. }
  220. }
  221. private void loginUser() {
  222. if (!validators.validateEmail(inputEmail, inputLayoutEmail)) {
  223. return;
  224. }
  225. if (!validators.validatePassword(inputPassword, inputLayoutPassword, isRegistering)) {
  226. return;
  227. }
  228. handleButtonProgress();
  229. email = inputEmail.getText().toString().trim();
  230. password = inputPassword.getText().toString().trim();
  231. firebaseAuth.signInWithEmailAndPassword(email, password)
  232. .addOnCompleteListener(LoginActivity.this, new OnCompleteListener<AuthResult>() {
  233. @Override
  234. public void onComplete(@NonNull Task<AuthResult> task) {
  235. // If sign in fails, display a message to the user. If sign in succeeds
  236. // the auth state listener will be notified and logic to handle the
  237. // signed in user can be handled in the listener.
  238. if (task.isSuccessful()) {
  239. if (task.getResult().getUser().isEmailVerified()) {
  240. firstTimeLogin(task.getResult().getUser().getUid());
  241. } else {
  242. handleButtonProgress();
  243. InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  244. imm.hideSoftInputFromWindow(findViewById(R.id.activity_login_rl).getWindowToken(), 0);
  245. Snackbar.make(findViewById(R.id.activity_login_rl), "Please verify your email address.", Snackbar.LENGTH_LONG).show();
  246. }
  247. } else {
  248. handleButtonProgress();
  249. InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
  250. imm.hideSoftInputFromWindow(findViewById(R.id.activity_login_rl).getWindowToken(), 0);
  251. Utils.showInfoDialog(LoginActivity.this
  252. , "Error"
  253. , "Invalid email and/or password");
  254. }
  255. }
  256. });
  257. }
  258. private void handleButtonProgress() {
  259. if (!btnSubmit.getText().toString().equals(""))
  260. btnText = btnSubmit.getText().toString();
  261. if (progressBar.getVisibility() == View.VISIBLE) {
  262. btnSubmit.setText(btnText);
  263. btnSubmit.setEnabled(true);
  264. progressBar.setVisibility(View.GONE);
  265. } else {
  266. btnSubmit.setText("");
  267. btnSubmit.setEnabled(false);
  268. progressBar.setVisibility(View.VISIBLE);
  269. }
  270. }
  271. private void firstTimeLogin(final String id) {
  272. mDatabase = FirebaseDatabase.getInstance().getReference("users").child(id);
  273. ValueEventListener postListener = new ValueEventListener() {
  274. @Override
  275. public void onDataChange(DataSnapshot dataSnapshot) {
  276. Student s = dataSnapshot.getValue(Student.class);
  277. if (s.getFirstLogin() == 1) {
  278. startActivity(new Intent(LoginActivity.this, FirstLoginActivity.class));
  279. overridePendingTransition(R.anim.open_translate, R.anim.close_scale);
  280. finish();
  281. } else {
  282. Data.getInstance().setMe(s);
  283. startActivity(new Intent(LoginActivity.this, MainActivity.class));
  284. overridePendingTransition(R.anim.open_translate, R.anim.close_scale);
  285. finish();
  286. }
  287. }
  288. @Override
  289. public void onCancelled(DatabaseError databaseError) {
  290. handleButtonProgress();
  291. }
  292. };
  293. mDatabase.addListenerForSingleValueEvent(postListener);
  294. }
  295. }