diff --git a/Listify/app/src/main/AndroidManifest.xml b/Listify/app/src/main/AndroidManifest.xml index 73d5a0d..7389dd5 100644 --- a/Listify/app/src/main/AndroidManifest.xml +++ b/Listify/app/src/main/AndroidManifest.xml @@ -33,9 +33,9 @@ android:name=".SearchResults" android:label="" android:theme="@style/AppTheme.NoActionBar"> - - + + diff --git a/Listify/app/src/main/java/com/example/listify/AuthManager.java b/Listify/app/src/main/java/com/example/listify/AuthManager.java index 7e38e72..4ece51a 100644 --- a/Listify/app/src/main/java/com/example/listify/AuthManager.java +++ b/Listify/app/src/main/java/com/example/listify/AuthManager.java @@ -28,7 +28,6 @@ public class AuthManager { String password = null; volatile boolean waiting = false; - void fetchAuthSession() throws AuthException { waiting = true; Amplify.Auth.fetchAuthSession( @@ -61,6 +60,13 @@ public class AuthManager { return authSession.getUserPoolTokens().getValue().getIdToken(); } + public String getEmail() { + return email; + } + + public String getPassword() { + return password; + } public void setAuthSession(AuthSession toSet) { authSession = (AWSCognitoAuthSession) toSet; @@ -117,7 +123,6 @@ public class AuthManager { error -> setAuthError(error) ); throwIfAuthError(); - } public void confirmSignUp(String confirmationCode) throws AuthException { @@ -151,13 +156,15 @@ public class AuthManager { public void signOutUser() throws AuthException { authSession = null; + email = null; + password = null; waiting = true; Amplify.Auth.signOut(this::signOutSuccess, error -> setAuthError(error)); throwIfAuthError(); } public void changePassword(String email) throws AuthException { - this.email = email; + //this.email = email; //waiting = true; Amplify.Auth.resetPassword(email, result -> setAuthResetPasswordResult(result), error -> setAuthError(error)); throwIfAuthError(); diff --git a/Listify/app/src/main/java/com/example/listify/ListPage.java b/Listify/app/src/main/java/com/example/listify/ListPage.java index e05d1f6..69d5b83 100644 --- a/Listify/app/src/main/java/com/example/listify/ListPage.java +++ b/Listify/app/src/main/java/com/example/listify/ListPage.java @@ -131,7 +131,7 @@ public class ListPage extends AppCompatActivity implements Requestor.Receiver { ArrayList pImages; MyAdapter (Context c, ArrayList names, ArrayList stores, ArrayList prices, ArrayList quantity, ArrayList images) { - super(c, R.layout.listproduct, R.id.productView, names); + super(c, R.layout.activity_listproductentry, R.id.productView, names); context = c; pNames = names; pStores = stores; @@ -144,7 +144,7 @@ public class ListPage extends AppCompatActivity implements Requestor.Receiver { @Override public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { LayoutInflater layoutInflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View listproduct = layoutInflater.inflate(R.layout.listproduct, parent,false); + View listproduct = layoutInflater.inflate(R.layout.activity_listproductentry, parent,false); decrQuan = (Button) listproduct.findViewById(R.id.buttonDecr); incrQuan = (Button) listproduct.findViewById(R.id.buttonIncr); diff --git a/Listify/app/src/main/java/com/example/listify/MainActivity.java b/Listify/app/src/main/java/com/example/listify/MainActivity.java index 0dfb9cc..dd6d2bc 100644 --- a/Listify/app/src/main/java/com/example/listify/MainActivity.java +++ b/Listify/app/src/main/java/com/example/listify/MainActivity.java @@ -2,6 +2,7 @@ package com.example.listify; import android.content.Intent; import android.os.Bundle; +import android.os.Handler; import android.util.Log; import android.view.MenuItem; import android.view.View; @@ -14,12 +15,16 @@ import androidx.navigation.NavController; import androidx.navigation.Navigation; import androidx.navigation.ui.AppBarConfiguration; import androidx.navigation.ui.NavigationUI; + import com.amplifyframework.auth.AuthException; import com.example.listify.data.Item; import com.example.listify.data.ItemSearch; import com.example.listify.data.List; import com.example.listify.data.ListEntry; +import com.example.listify.ui.LoginPage; import com.google.android.material.navigation.NavigationView; +import static com.example.listify.SplashActivity.showSplash; + import org.json.JSONException; import java.io.IOException; import java.time.Instant; @@ -29,13 +34,30 @@ import java.util.Random; public class MainActivity extends AppCompatActivity implements CreateListDialogFragment.OnNewListListener { private AppBarConfiguration mAppBarConfiguration; - public static AuthManager am = new AuthManager(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + if(showSplash) { + showSplash = false; + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + Intent intent = new Intent(MainActivity.this, SplashActivity.class); + startActivity(intent); + finish(); + } + }, 1); + } + + if(am.getEmail() == null) { + Intent intent = new Intent(MainActivity.this, LoginPage.class); + startActivity(intent); + } + //------------------------------Auth Testing---------------------------------------------// @@ -180,6 +202,24 @@ public class MainActivity extends AppCompatActivity implements CreateListDialogF }); } + public void onClickSignout(MenuItem m) { + m.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + try { + am.signOutUser(); + Intent intent = new Intent(MainActivity.this, com.example.listify.ui.LoginPage.class); + startActivity(intent); + finish(); + } + catch (Exception e) { + Log.i("Authentication", e.toString()); + } + return false; + } + }); + } + @Override public void sendNewListName(String name) { Properties configs = new Properties(); diff --git a/Listify/app/src/main/java/com/example/listify/SplashActivity.java b/Listify/app/src/main/java/com/example/listify/SplashActivity.java new file mode 100644 index 0000000..a5d9c2a --- /dev/null +++ b/Listify/app/src/main/java/com/example/listify/SplashActivity.java @@ -0,0 +1,28 @@ +package com.example.listify; + +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; + +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +public class SplashActivity extends AppCompatActivity { + public static boolean showSplash = true; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_splashscreen); + + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + showSplash = false; + Intent intent = new Intent(SplashActivity.this, MainActivity.class); + startActivity(intent); + finish(); + } + }, 3000); + } +} \ No newline at end of file diff --git a/Listify/app/src/main/java/com/example/listify/ui/CodePage.java b/Listify/app/src/main/java/com/example/listify/ui/CodePage.java deleted file mode 100644 index d2f9e81..0000000 --- a/Listify/app/src/main/java/com/example/listify/ui/CodePage.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.example.listify.ui; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.Intent; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.Button; -import android.widget.EditText; - -import com.example.listify.AuthManager; -import com.example.listify.R; -import com.example.listify.MainActivity; - -import androidx.annotation.NonNull; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.app.AppCompatDialog; -import androidx.appcompat.app.AppCompatDialogFragment; - -public class CodePage extends AppCompatDialogFragment { - private EditText ediTextCode; - - private CodeDialogListener listener; - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - LayoutInflater inflater = getActivity().getLayoutInflater(); - View view = inflater.inflate(R.layout.activity_code, null); - - builder.setView(view) - .setTitle("Verification code") - .setPositiveButton("Submit", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - String code = ediTextCode.getText().toString(); - listener.sendCode("" + code + "", false); - } - }) - .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - String code = ediTextCode.getText().toString(); - listener.sendCode("" + code + "", true); - } - }); - - ediTextCode = view.findViewById(R.id.editTextCode); - - return builder.create(); - } - - @Override - public void onAttach(@NonNull Context context) { - super.onAttach(context); - - try { - listener = (CodeDialogListener) context; - } catch (ClassCastException e) { - throw new ClassCastException("CodeDialogListener not implemented."); - } - } - - public interface CodeDialogListener { - void sendCode(String code, boolean cancel); - } -} \ No newline at end of file diff --git a/Listify/app/src/main/java/com/example/listify/ui/ForgotPasswordPage.java b/Listify/app/src/main/java/com/example/listify/ui/ForgotPasswordPage.java index a06d23a..7b58531 100644 --- a/Listify/app/src/main/java/com/example/listify/ui/ForgotPasswordPage.java +++ b/Listify/app/src/main/java/com/example/listify/ui/ForgotPasswordPage.java @@ -1,5 +1,7 @@ package com.example.listify.ui; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.util.Log; @@ -8,31 +10,46 @@ import android.widget.Button; import android.widget.EditText; import android.widget.TextView; +import com.example.listify.MainActivity; import com.example.listify.R; import static com.example.listify.MainActivity.am; import androidx.appcompat.app.AppCompatActivity; -public class ForgotPasswordPage extends AppCompatActivity implements CodePage.CodeDialogListener { +public class ForgotPasswordPage extends AppCompatActivity { private Button button1; //Code page button String email; String newPassword; + String confirmNewPassword; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_forgotpswd); + if(am.getEmail() != null) { + Intent intent = new Intent(ForgotPasswordPage.this, MainActivity.class); + startActivity(intent); + } + button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - EditText emailText = (EditText) findViewById(R.id.editTextTextEmailAddress2); - EditText newPasswordText = (EditText) findViewById(R.id.editTextTextPassword2); + EditText emailText = (EditText) findViewById(R.id.editTextTextEmailAddress); + EditText newPasswordText = (EditText) findViewById(R.id.editTextTextPassword); + EditText confirmNewPasswordText = (EditText) findViewById(R.id.editTextTextPassword2); email = emailText.getText().toString(); newPassword = newPasswordText.getText().toString(); + confirmNewPassword = confirmNewPasswordText.getText().toString(); + + if(!newPassword.equals(confirmNewPassword)) { + TextView invalidCred = findViewById(R.id.textView6); + invalidCred.setText("\"Confirm New Password\" does not match \"New Password\"."); + return; + } try { am.changePassword(email); @@ -41,29 +58,39 @@ public class ForgotPasswordPage extends AppCompatActivity implements CodePage.Co Log.i("Authentication", e.toString()); TextView invalidCred = findViewById(R.id.textView6); invalidCred.setText("Password criteria not met. Please try again."); + return; } - openDialog(); + + View codeView = getLayoutInflater().inflate(R.layout.activity_code, null); + AlertDialog.Builder builder = new AlertDialog.Builder(ForgotPasswordPage.this); + builder.setView(codeView); + builder.setTitle("Verification code"); + builder.setMessage("Please enter the 6-digit verification code sent to your email."); + builder.setPositiveButton("Submit", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + EditText codeText = (EditText) codeView.findViewById(R.id.editTextCode); + String code = codeText.getText().toString(); + try { + am.confirmPasswordReset(newPassword, code); + Intent intent = new Intent(ForgotPasswordPage.this, LoginPage.class); + startActivity(intent); + finish(); + } + catch (Exception e) { + Log.i("Authentication", e.toString()); + } + } + }); + builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + return; + } + }); + AlertDialog dialog = builder.create(); + dialog.show(); } }); } - - public void openDialog() { - CodePage codePage = new CodePage(); - codePage.show(getSupportFragmentManager(), "Verification code"); - } - - @Override - public void sendCode(String code, boolean cancel) { - if(!cancel) { - try { - am.confirmPasswordReset(newPassword, code); - } - catch (Exception e) { - Log.i("Authentication", e.toString()); - } - } - - Intent intent = new Intent(ForgotPasswordPage.this, LoginPage.class); - startActivity(intent); - } } \ No newline at end of file diff --git a/Listify/app/src/main/java/com/example/listify/ui/LoginPage.java b/Listify/app/src/main/java/com/example/listify/ui/LoginPage.java index 65e3ce0..3754b52 100644 --- a/Listify/app/src/main/java/com/example/listify/ui/LoginPage.java +++ b/Listify/app/src/main/java/com/example/listify/ui/LoginPage.java @@ -25,6 +25,11 @@ public class LoginPage extends AppCompatActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); + if(am.getEmail() != null) { + Intent intent = new Intent(LoginPage.this, MainActivity.class); + startActivity(intent); + } + button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override @@ -57,6 +62,7 @@ public class LoginPage extends AppCompatActivity { am.signIn(email, password); Intent intent = new Intent(LoginPage.this, MainActivity.class); startActivity(intent); + finish(); } catch(Exception e) { Log.i("Authentication", e.toString()); diff --git a/Listify/app/src/main/java/com/example/listify/ui/SignupPage.java b/Listify/app/src/main/java/com/example/listify/ui/SignupPage.java index c3a691a..e438f7a 100644 --- a/Listify/app/src/main/java/com/example/listify/ui/SignupPage.java +++ b/Listify/app/src/main/java/com/example/listify/ui/SignupPage.java @@ -1,5 +1,7 @@ package com.example.listify.ui; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.util.Log; @@ -11,19 +13,35 @@ import android.widget.TextView; import com.example.listify.R; import com.example.listify.AuthManager; import com.example.listify.MainActivity; +import com.example.listify.Requestor; + +import org.json.JSONException; + +import java.io.IOException; +import java.util.Properties; + import static com.example.listify.MainActivity.am; import androidx.appcompat.app.AppCompatActivity; -public class SignupPage extends AppCompatActivity implements CodePage.CodeDialogListener { +public class SignupPage extends AppCompatActivity { private Button button1; //Log in page button private Button button2; //Sign up button + String email; + String password; + String confirmPassword; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_signup); + if(am.getEmail() != null) { + Intent intent = new Intent(SignupPage.this, MainActivity.class); + startActivity(intent); + } + button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override @@ -41,9 +59,9 @@ public class SignupPage extends AppCompatActivity implements CodePage.CodeDialog EditText passwordText = (EditText) findViewById(R.id.editTextTextPassword); EditText confirmPasswordText = (EditText) findViewById(R.id.editTextTextPassword2); - String email = emailText.getText().toString(); - String password = passwordText.getText().toString(); - String confirmPassword = confirmPasswordText.getText().toString(); + email = emailText.getText().toString(); + password = passwordText.getText().toString(); + confirmPassword = confirmPasswordText.getText().toString(); if(!password.equals(confirmPassword)) { TextView invalidCred = findViewById(R.id.textView3); @@ -61,27 +79,37 @@ public class SignupPage extends AppCompatActivity implements CodePage.CodeDialog return; } - openDialog(); + View codeView = getLayoutInflater().inflate(R.layout.activity_code, null); + AlertDialog.Builder builder = new AlertDialog.Builder(SignupPage.this); + builder.setView(codeView); + builder.setTitle("Verification code"); + builder.setMessage("Please enter the 6-digit verification code sent to your email."); + builder.setPositiveButton("Submit", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + EditText codeText = (EditText) codeView.findViewById(R.id.editTextCode); + String code = codeText.getText().toString(); + try { + am.confirmSignUp(code); + am.signIn(email, password); + Intent intent = new Intent(SignupPage.this, MainActivity.class); + startActivity(intent); + finish(); + } + catch (Exception e) { + Log.i("Authentication", e.toString()); + } + } + }); + builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + return; + } + }); + AlertDialog dialog = builder.create(); + dialog.show(); } }); } - - public void openDialog() { - CodePage codePage = new CodePage(); - codePage.show(getSupportFragmentManager(), "Verification code"); - } - - @Override - public void sendCode(String code, boolean cancel) { - if(!cancel) { - try { - am.confirmSignUp(code); - Intent intent = new Intent(SignupPage.this, MainActivity.class); - startActivity(intent); - } - catch (Exception e) { - Log.i("Authentication", e.toString()); - } - } - } } \ No newline at end of file diff --git a/Listify/app/src/main/java/com/example/listify/ui/home/HomeFragment.java b/Listify/app/src/main/java/com/example/listify/ui/home/HomeFragment.java index 6e7b513..8eb6840 100644 --- a/Listify/app/src/main/java/com/example/listify/ui/home/HomeFragment.java +++ b/Listify/app/src/main/java/com/example/listify/ui/home/HomeFragment.java @@ -1,5 +1,7 @@ package com.example.listify.ui.home; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.util.Log; @@ -8,6 +10,8 @@ import android.widget.Button; import android.view.ViewGroup; import android.view.LayoutInflater; +import android.widget.EditText; + import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; @@ -25,41 +29,53 @@ import java.io.IOException; import java.util.Properties; public class HomeFragment extends Fragment { - private Button toLoginPage; - private Button toListPage; + private Button toDeleteAccountPage; public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_home, container, false); - toLoginPage = (Button) root.findViewById(R.id.button1); - toLoginPage.setOnClickListener(new View.OnClickListener() { + toDeleteAccountPage = (Button) root.findViewById(R.id.button); + toDeleteAccountPage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - Intent intent = new Intent(getActivity(), com.example.listify.ui.LoginPage.class); - startActivity(intent); - } - }); - - toListPage = (Button) root.findViewById(R.id.button2); - toListPage.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - //Intent intent = new Intent(HomeFragment.this.getActivity(), com.example.listify.ListPage.class); - //startActivity(intent); - - try { - Properties configs = new Properties(); - try { - configs = AuthManager.loadProperties(getContext(), "android.resource://" + getActivity().getPackageName() + "/raw/auths.json"); - } catch (IOException | JSONException e) { - e.printStackTrace(); + View passwordView = getLayoutInflater().inflate(R.layout.activity_code, null); + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setView(passwordView); + builder.setTitle("Account deletion verification"); + builder.setMessage("Are you sure you want to delete your account? If so, enter your password below and hit \"Yes\"."); + builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + EditText passwordText = (EditText) passwordView.findViewById(R.id.editTextCode); + String password = passwordText.getText().toString(); + if(password.equals(am.getPassword())) { + try { + Properties configs = new Properties(); + try { + configs = AuthManager.loadProperties(getContext(), "android.resource://" + getActivity().getPackageName() + "/raw/auths.json"); + } catch (IOException | JSONException e) { + e.printStackTrace(); + } + Requestor requestor = new Requestor(am, configs.getProperty("apiKey")); + am.deleteUser(requestor); + Intent intent = new Intent(getActivity(), com.example.listify.ui.LoginPage.class); + startActivity(intent); + getActivity().finish(); + } + catch (Exception e) { + Log.i("Authentication", e.toString()); + } + } } - Requestor requestor = new Requestor(am, configs.getProperty("apiKey")); - am.deleteUser(requestor); - } - catch (Exception e) { - Log.i("Authentication", e.toString()); - } + }); + builder.setNegativeButton("No", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + return; + } + }); + AlertDialog dialog = builder.create(); + dialog.show(); } }); diff --git a/Listify/app/src/main/res/layout/activity_code.xml b/Listify/app/src/main/res/layout/activity_code.xml index 2c06f6a..7b8bd91 100644 --- a/Listify/app/src/main/res/layout/activity_code.xml +++ b/Listify/app/src/main/res/layout/activity_code.xml @@ -11,8 +11,8 @@ android:layout_height="wrap_content" android:layout_marginTop="16dp" android:ems="10" - android:hint="Code" - android:inputType="textPersonName" + android:hint="" + android:inputType="textPassword" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/Listify/app/src/main/res/layout/activity_forgotpswd.xml b/Listify/app/src/main/res/layout/activity_forgotpswd.xml index 8e4055c..7080bbd 100644 --- a/Listify/app/src/main/res/layout/activity_forgotpswd.xml +++ b/Listify/app/src/main/res/layout/activity_forgotpswd.xml @@ -9,51 +9,64 @@ android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="52dp" + android:layout_marginTop="51dp" android:text="Submit" app:layout_constraintEnd_toStartOf="@+id/textView6" app:layout_constraintStart_toStartOf="@+id/textView6" app:layout_constraintTop_toBottomOf="@+id/editTextTextPassword2" /> + + - - + app:layout_constraintTop_toBottomOf="@+id/editTextTextPassword" /> + + \ No newline at end of file diff --git a/Listify/app/src/main/res/layout/listproduct.xml b/Listify/app/src/main/res/layout/activity_listproductentry.xml similarity index 100% rename from Listify/app/src/main/res/layout/listproduct.xml rename to Listify/app/src/main/res/layout/activity_listproductentry.xml diff --git a/Listify/app/src/main/res/layout/activity_signup.xml b/Listify/app/src/main/res/layout/activity_signup.xml index 6af1bfd..1671732 100644 --- a/Listify/app/src/main/res/layout/activity_signup.xml +++ b/Listify/app/src/main/res/layout/activity_signup.xml @@ -33,7 +33,7 @@ android:layout_marginTop="23dp" android:ems="10" android:hint="Password" - android:inputType="textPersonName" + android:inputType="textPassword" app:layout_constraintStart_toStartOf="@+id/editTextTextEmailAddress" app:layout_constraintTop_toBottomOf="@+id/editTextTextEmailAddress" /> diff --git a/Listify/app/src/main/res/layout/fragment_home.xml b/Listify/app/src/main/res/layout/fragment_home.xml index f43f76a..a938244 100644 --- a/Listify/app/src/main/res/layout/fragment_home.xml +++ b/Listify/app/src/main/res/layout/fragment_home.xml @@ -7,42 +7,13 @@ tools:context=".ui.home.HomeFragment">