Skip to content

Commit 8e8b5fa

Browse files
committed
improve user authentication process by adding registeractivity and security question functions
1 parent 5698bf2 commit 8e8b5fa

19 files changed

Lines changed: 810 additions & 66 deletions
0 Bytes
Binary file not shown.

app/src/main/AndroidManifest.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,13 @@
9191
android:parentActivityName=".ShowingCreditActivity" />
9292
<activity
9393
android:name=".LoginActivity"
94-
android:theme="@style/AppTheme.NoActionBar"
95-
/>
94+
android:theme="@style/AppTheme.NoActionBar" />
9695
<activity
9796
android:name=".PreferencesActivity"
9897
android:label="Settings"
99-
android:parentActivityName=".MainActivity"/>
98+
android:parentActivityName=".MainActivity" />
99+
<activity android:name=".RegisterActivity"
100+
android:theme="@style/AppTheme.NoActionBar"/>
100101
</application>
101102

102103
</manifest>
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package com.example.hongjo.myfinancialmanager;
2+
3+
4+
import android.app.Activity;
5+
import android.app.DialogFragment;
6+
import android.os.Bundle;
7+
import android.support.v4.app.Fragment;
8+
import android.view.LayoutInflater;
9+
import android.view.View;
10+
import android.view.ViewGroup;
11+
import android.widget.AdapterView;
12+
import android.widget.ArrayAdapter;
13+
import android.widget.ListView;
14+
15+
import java.util.ArrayList;
16+
import java.util.Arrays;
17+
import java.util.List;
18+
19+
20+
/**
21+
* Name: HONGJO LIM
22+
* Date: Jun 22nd, 2018
23+
* Purpose: This is a fragment to choose a security question from, when the user tries to register
24+
*/
25+
public class ChoosingSecurityQuestionFragment extends DialogFragment {
26+
27+
private ChoosingSecurityQuestionFragment.FromCallBack activity;
28+
private ListView securityQuestionList;
29+
30+
private String[] securityQuestions;
31+
32+
public ChoosingSecurityQuestionFragment() {
33+
34+
}
35+
36+
@Override
37+
public void onAttach(Activity activity){
38+
super.onAttach(activity);
39+
this.activity = (ChoosingSecurityQuestionFragment.FromCallBack) activity;
40+
41+
}
42+
43+
@Override
44+
public View onCreateView(LayoutInflater inflater, ViewGroup container,
45+
Bundle savedInstanceState) {
46+
// Inflate the layout for this fragment
47+
View view = inflater.inflate(R.layout.fragment_choosing_security_question, container, false);
48+
securityQuestionList = view.findViewById(R.id.security_question_listView);
49+
50+
securityQuestions = getActivity().getResources().getStringArray(R.array.security_question);
51+
securityQuestionList.setAdapter(new ArrayAdapter<String>(getContext(),
52+
R.layout.security_question_item,
53+
getActivity().getResources().getStringArray(R.array.security_question)));
54+
55+
securityQuestionList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
56+
@Override
57+
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
58+
activity.securityQuestionSelected((int) id, securityQuestions[(int) id]);
59+
dismiss();
60+
}
61+
});
62+
63+
return view;
64+
}
65+
66+
public interface FromCallBack{
67+
68+
void securityQuestionSelected(int securityQuestionIndex, String securityQuestion);
69+
}
70+
71+
}

app/src/main/java/com/example/hongjo/myfinancialmanager/LoginActivity.java

Lines changed: 83 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.example.hongjo.myfinancialmanager;
22

3+
import android.app.LoaderManager;
4+
import android.content.CursorLoader;
5+
import android.content.Loader;
36
import android.content.ContentValues;
47
import android.content.Intent;
8+
import android.database.Cursor;
59
import android.os.Bundle;
610
import android.support.v7.app.AlertDialog;
711
import android.support.v7.app.AppCompatActivity;
@@ -17,7 +21,8 @@
1721
import com.example.hongjo.myfinancialmanager.model.User;
1822

1923
//this app only accepts 1 user account because it is run in local Database
20-
public class LoginActivity extends AppCompatActivity{
24+
public class LoginActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>,
25+
ShowingSecurityQuestionFragment.FromCallBack{
2126

2227
//key for shared preference
2328
public static final String ENABLE_LOGIN = "ENABLE_LOGIN";
@@ -32,6 +37,12 @@ public class LoginActivity extends AppCompatActivity{
3237

3338
private TextView forgotPassword;
3439

40+
/**
41+
* This variable is used as the key, when passing a security question string
42+
* as an argument to the ShowingSecurityQuestionFragment.java class
43+
*/
44+
public static final String SECURITY_QUESTION = "security_question";
45+
3546
@Override
3647
protected void onCreate(Bundle savedInstanceState) {
3748
super.onCreate(savedInstanceState);
@@ -57,12 +68,15 @@ protected void onCreate(Bundle savedInstanceState) {
5768
forgotPassword = findViewById(R.id.forgot_password);
5869

5970
Button signIn = findViewById(R.id.sign_in_button);
60-
Button createAccount = findViewById(R.id.create_account_button);
71+
Button register = findViewById(R.id.register);
6172

6273
signIn.setOnClickListener(listener);
63-
createAccount.setOnClickListener(listener);
74+
register.setOnClickListener(listener);
6475
forgotPassword.setOnClickListener(listener);
6576

77+
//init the LoaderManager
78+
getLoaderManager().initLoader(0, null, this);
79+
6680
}
6781

6882
View.OnClickListener listener = new View.OnClickListener(){
@@ -74,14 +88,26 @@ public void onClick(View view){
7488
case R.id.sign_in_button:
7589
checkValidity();
7690
break;
77-
case R.id.create_account_button:
78-
register();
91+
case R.id.register:
92+
//if user data already exists, show this alert dialog
93+
if(user!=null){
94+
AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);
95+
builder.setTitle(R.string.register_error);
96+
builder.setMessage(R.string.sign_up_error_user_already_in_database);
97+
builder.setPositiveButton("OK", null).create().show();
98+
return;
99+
}
100+
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
101+
startActivity(intent);
102+
finish();
79103
break;
80104
case R.id.forgot_password:
81105
//if the user forgets the password, send it to the user's email
82-
//TO DO: send the user email with his/her message
106+
//TO DO: let the user answer his/her security question
83107
if(user!=null) {
84-
Toast.makeText(LoginActivity.this, user.getPassword(), Toast.LENGTH_SHORT).show();
108+
promptSecurityQuestion();
109+
}else{
110+
Toast.makeText(LoginActivity.this, "Please create a new account", Toast.LENGTH_SHORT).show();
85111
}
86112
break;
87113
}
@@ -128,50 +154,70 @@ private void checkValidity(){
128154
builder.setMessage(R.string.sign_in_error_no_email_in_database);
129155
builder.setCancelable(false).setPositiveButton("OK", null).create().show();
130156
}
131-
132157
}
133158

134-
//this method is to create account
135-
private void register(){
159+
/**
160+
* This method is to show the security question and get the answer to it.
161+
* It is called when the user forgets the password or id
162+
*/
163+
164+
private void promptSecurityQuestion(){
165+
166+
ShowingSecurityQuestionFragment fragment = new ShowingSecurityQuestionFragment();
167+
168+
int index = user.getSecurityQNum();
169+
String securityQuestion = getResources().getStringArray(R.array.security_question)[index];
170+
171+
Bundle bundle = new Bundle();
172+
bundle.putString(SECURITY_QUESTION, securityQuestion);
173+
fragment.setArguments(bundle);
174+
fragment.show(getSupportFragmentManager(), "PROMPT_SECURITY_QUESTION");
136175

176+
}
177+
178+
private void reLoad(){
179+
getLoaderManager().restartLoader(0, null, this);
137180
user = mDataSource.getUser();
181+
}
138182

139-
AlertDialog.Builder builder = new AlertDialog.Builder(this);
140-
builder.setTitle(R.string.register_error);
183+
@Override
184+
public void onResume(){
185+
super.onResume();
186+
mDataSource.open();
187+
reLoad();
188+
}
141189

142-
if(user!=null){
143-
builder.setMessage(R.string.sign_up_error_user_already_in_database);
144-
builder.setPositiveButton("OK", null).create().show();
145-
return;
146-
}
190+
@Override
191+
public void onPause(){
192+
super.onPause();
193+
mDataSource.close();
194+
}
147195

148-
email = emailEdt.getText().toString();
149-
password = passwordEdt.getText().toString();
150196

151-
if(!email.contains("@")){
152-
builder.setMessage(R.string.register_error_invalid_email)
153-
.setPositiveButton("OK", null).create().show();
154-
}else if(password.trim().length()<8){
155-
builder.setMessage(R.string.register_error_short_password)
156-
.setPositiveButton("OK", null).create().show();
157-
}else{
158-
insertUser(email, password);
159-
builder.setTitle(R.string.register_ok_account_created);
160-
builder.setMessage(R.string.promt_sign_in).setPositiveButton("OK", null).create().show();
161-
emailEdt.setText(email);
162-
passwordEdt.setText("");
163-
}
197+
@Override
198+
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
199+
return new CursorLoader(this, DataProvider.USER_URI,
200+
null, null, null, null);
164201
}
165202

166-
private void insertUser(String email, String password){
203+
@Override
204+
public void onLoadFinished(android.content.Loader<Cursor> loader, Cursor cursor) {
167205

168-
ContentValues values = new ContentValues();
206+
}
169207

170-
values.put(UserTable.COL1, email);
171-
values.put(UserTable.COL2, password);
208+
@Override
209+
public void onLoaderReset(android.content.Loader<Cursor> loader) {
172210

173-
getContentResolver().insert(DataProvider.USER_URI, values);
174211
}
175212

213+
@Override
214+
public void securityQuestionAnswered(String securityAnswer) {
215+
216+
if(securityAnswer.toLowerCase().equals(user.getSecuirtyAnswer().toLowerCase())){
217+
Toast.makeText(this, "Your password is: "+user.getPassword() , Toast.LENGTH_LONG).show();
218+
}else{
219+
Toast.makeText(this, "Wrong security answer!", Toast.LENGTH_SHORT).show();
220+
}
221+
}
176222
}
177223

0 commit comments

Comments
 (0)