Made List page show up first after signing in

This commit is contained in:
Aaron Sun 2020-11-10 17:35:12 -08:00
parent aa2f68c3e5
commit 96e0adf883
4 changed files with 235 additions and 264 deletions

View File

@ -1,49 +1,82 @@
package com.example.listify.ui.home; package com.example.listify.ui.home;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button; import android.widget.ListView;
import android.widget.EditText; import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.example.listify.AuthManager; import com.example.listify.AuthManager;
import com.example.listify.CreateListDialogFragment;
import com.example.listify.LoadingCircleDialog;
import com.example.listify.R; import com.example.listify.R;
import com.example.listify.Requestor; import com.example.listify.Requestor;
import com.example.listify.SynchronousReceiver;
import com.example.listify.adapter.ShoppingListsSwipeableAdapter;
import com.example.listify.data.List;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.json.JSONException; import org.json.JSONException;
import java.io.IOException; import java.io.IOException;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Properties; import java.util.Properties;
import static com.example.listify.MainActivity.am; import static com.example.listify.MainActivity.am;
public class HomeFragment extends Fragment { public class HomeFragment extends Fragment implements CreateListDialogFragment.OnNewListListener, Requestor.Receiver {
private Button toDeleteAccountPage; ArrayList<List> shoppingLists = new ArrayList<>();
ShoppingListsSwipeableAdapter shoppingListsSwipeableAdapter;
Requestor requestor;
ListView shoppingListsView;
ProgressBar loadingLists;
int resultsIndex;
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_home, container, false); View root = inflater.inflate(R.layout.fragment_home, container, false);
shoppingListsView = root.findViewById(R.id.shopping_lists);
loadingLists = (ProgressBar) root.findViewById(R.id.progress_loading_lists);
loadingLists.setVisibility(View.VISIBLE);
toDeleteAccountPage = (Button) root.findViewById(R.id.button); Properties configs = new Properties();
toDeleteAccountPage.setOnClickListener(new View.OnClickListener() { try {
configs = AuthManager.loadProperties(getContext(), "android.resource://" + getActivity().getPackageName() + "/raw/auths.json");
} catch (IOException | JSONException e) {
e.printStackTrace();
}
requestor = new Requestor(am, configs.getProperty("apiKey"));
SynchronousReceiver<Integer[]> listIdsReceiver = new SynchronousReceiver<>();
final Requestor.Receiver<Integer[]> recv = this;
requestor.getListOfIds(List.class, recv, null);
FloatingActionButton fab = (FloatingActionButton) root.findViewById(R.id.new_list_fab);
Fragment thisFragment = this;
fab.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
View passwordView = getLayoutInflater().inflate(R.layout.activity_code, null); CreateListDialogFragment createListDialogFragment = new CreateListDialogFragment();
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); createListDialogFragment.show(getFragmentManager(), "Create New List");
builder.setView(passwordView); createListDialogFragment.setTargetFragment(thisFragment, 0);
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() {
return root;
}
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void sendNewListName(String name) {
EditText passwordText = (EditText) passwordView.findViewById(R.id.editTextCode); LoadingCircleDialog loadingDialog = new LoadingCircleDialog(getActivity());
String password = passwordText.getText().toString(); loadingDialog.show();
if(password.equals(am.getPassword())) {
try {
Properties configs = new Properties(); Properties configs = new Properties();
try { try {
configs = AuthManager.loadProperties(getContext(), "android.resource://" + getActivity().getPackageName() + "/raw/auths.json"); configs = AuthManager.loadProperties(getContext(), "android.resource://" + getActivity().getPackageName() + "/raw/auths.json");
@ -51,51 +84,101 @@ public class HomeFragment extends Fragment {
e.printStackTrace(); e.printStackTrace();
} }
Requestor requestor = new Requestor(am, configs.getProperty("apiKey")); Requestor requestor = new Requestor(am, configs.getProperty("apiKey"));
SynchronousReceiver<Integer> idReceiver = new SynchronousReceiver<>();
// try { List newList = new List(-1, name, "user filled by lambda", Instant.now().toEpochMilli());
// am.changePassword(am.getEmail());
// } try {
// catch (Exception e) {} requestor.postObject(newList, idReceiver, idReceiver);
/*try { } catch (Exception e) {
am.confirmPasswordReset("", ""); Toast.makeText(getContext(), "An error occurred", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
newList.setItemID(idReceiver.await());
} catch (Exception e) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getContext(), "An error occurred", Toast.LENGTH_LONG).show();
loadingDialog.cancel();
}
});
e.printStackTrace();
}
shoppingLists.add(newList);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
shoppingListsSwipeableAdapter.notifyDataSetChanged();
loadingDialog.cancel();
Toast.makeText(getContext(), String.format("%s created", name), Toast.LENGTH_LONG).show();
}
});
}
});
t.start();
} }
String[] TO = {am.getEmail()}; @Override
Intent emailIntent = new Intent(Intent.ACTION_SEND); public void acceptDelivery(Object delivered) {
emailIntent.setData(Uri.parse("mailto:")); Integer[] listIds = (Integer[]) delivered;
emailIntent.setType("text/plain"); // Create threads and add them to a list
emailIntent.putExtra(Intent.EXTRA_EMAIL, TO); Thread[] threads = new Thread[listIds.length];
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Listify account deleted"); List[] results = new List[listIds.length];
emailIntent.putExtra(Intent.EXTRA_TEXT, "Hello, this email is to confirm that you have deleted your Listify account."); for (int i = 0; i < listIds.length; i++) {
SynchronousReceiver<List> listReceiver = new SynchronousReceiver<>();
requestor.getObject(Integer.toString(listIds[i]), List.class, listReceiver, listReceiver);
final int finalI = i;
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try { try {
startActivity(Intent.createChooser(emailIntent, "Send mail...")); results[finalI] = listReceiver.await();
Log.i("Finished sending email...", "");
System.out.println("A");
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
System.out.println("B");
}*/
am.deleteUser(requestor);
am.nullify();
Intent intent = new Intent(getActivity(), com.example.listify.ui.LoginPage.class);
startActivity(intent);
}
catch (Exception e) {
Log.i("Authentication", e.toString());
}
} }
} }
}); });
builder.setNegativeButton("No", new DialogInterface.OnClickListener() { threads[i] = t;
t.start();
}
// Wait for each thread to finish and add results to shoppingLists
for (int i = 0; i < threads.length; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
shoppingLists.add(results[i]);
}
// Set adapter and display this users lists
shoppingListsSwipeableAdapter = new ShoppingListsSwipeableAdapter(getActivity(), shoppingLists);
getActivity().runOnUiThread(new Runnable() {
@Override @Override
public void onClick(DialogInterface dialog, int which) {} public void run() {
}); shoppingListsView.setAdapter(shoppingListsSwipeableAdapter);
AlertDialog dialog = builder.create(); // shoppingListsView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
dialog.show(); // @Override
// public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Intent listPage = new Intent(getContext(), ListPage.class);
//
// // Send the list ID
// listPage.putExtra("listID", shoppingLists.get(position).getItemID());
// startActivity(listPage);
// }
// });
loadingLists.setVisibility(View.GONE);
} }
}); });
return root;
} }
} }

View File

@ -1,81 +1,51 @@
package com.example.listify.ui.lists; package com.example.listify.ui.lists;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.widget.ListView; import android.widget.Button;
import android.widget.ProgressBar; import android.widget.EditText;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import com.example.listify.AuthManager; import com.example.listify.AuthManager;
import com.example.listify.CreateListDialogFragment;
import com.example.listify.LoadingCircleDialog;
import com.example.listify.R; import com.example.listify.R;
import com.example.listify.Requestor; import com.example.listify.Requestor;
import com.example.listify.SynchronousReceiver;
import com.example.listify.adapter.ShoppingListsSwipeableAdapter;
import com.example.listify.data.List;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import org.json.JSONException; import org.json.JSONException;
import java.io.IOException; import java.io.IOException;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Properties; import java.util.Properties;
import static com.example.listify.MainActivity.am; import static com.example.listify.MainActivity.am;
public class ListsFragment extends Fragment implements CreateListDialogFragment.OnNewListListener, Requestor.Receiver { public class ListsFragment extends Fragment {
ArrayList<List> shoppingLists = new ArrayList<>(); private Button toDeleteAccountPage;
ShoppingListsSwipeableAdapter shoppingListsSwipeableAdapter;
Requestor requestor;
ListView shoppingListsView;
ProgressBar loadingLists;
int resultsIndex;
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_lists, container, false); View root = inflater.inflate(R.layout.fragment_lists, container, false);
shoppingListsView = root.findViewById(R.id.shopping_lists);
loadingLists = (ProgressBar) root.findViewById(R.id.progress_loading_lists);
loadingLists.setVisibility(View.VISIBLE);
Properties configs = new Properties(); toDeleteAccountPage = (Button) root.findViewById(R.id.button);
try { toDeleteAccountPage.setOnClickListener(new View.OnClickListener() {
configs = AuthManager.loadProperties(getContext(), "android.resource://" + getActivity().getPackageName() + "/raw/auths.json");
} catch (IOException | JSONException e) {
e.printStackTrace();
}
requestor = new Requestor(am, configs.getProperty("apiKey"));
SynchronousReceiver<Integer[]> listIdsReceiver = new SynchronousReceiver<>();
final Requestor.Receiver<Integer[]> recv = this;
requestor.getListOfIds(List.class, recv, null);
FloatingActionButton fab = (FloatingActionButton) root.findViewById(R.id.new_list_fab);
Fragment thisFragment = this;
fab.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
CreateListDialogFragment createListDialogFragment = new CreateListDialogFragment(); View passwordView = getLayoutInflater().inflate(R.layout.activity_code, null);
createListDialogFragment.show(getFragmentManager(), "Create New List"); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
createListDialogFragment.setTargetFragment(thisFragment, 0); 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() {
return root;
}
@Override @Override
public void sendNewListName(String name) { public void onClick(DialogInterface dialog, int which) {
LoadingCircleDialog loadingDialog = new LoadingCircleDialog(getActivity()); EditText passwordText = (EditText) passwordView.findViewById(R.id.editTextCode);
loadingDialog.show(); String password = passwordText.getText().toString();
if(password.equals(am.getPassword())) {
try {
Properties configs = new Properties(); Properties configs = new Properties();
try { try {
configs = AuthManager.loadProperties(getContext(), "android.resource://" + getActivity().getPackageName() + "/raw/auths.json"); configs = AuthManager.loadProperties(getContext(), "android.resource://" + getActivity().getPackageName() + "/raw/auths.json");
@ -83,101 +53,26 @@ public class ListsFragment extends Fragment implements CreateListDialogFragment.
e.printStackTrace(); e.printStackTrace();
} }
Requestor requestor = new Requestor(am, configs.getProperty("apiKey")); Requestor requestor = new Requestor(am, configs.getProperty("apiKey"));
SynchronousReceiver<Integer> idReceiver = new SynchronousReceiver<>(); am.deleteUser(requestor);
am.nullify();
List newList = new List(-1, name, "user filled by lambda", Instant.now().toEpochMilli()); Intent intent = new Intent(getActivity(), com.example.listify.ui.LoginPage.class);
startActivity(intent);
try {
requestor.postObject(newList, idReceiver, idReceiver);
} catch (Exception e) {
Toast.makeText(getContext(), "An error occurred", Toast.LENGTH_LONG).show();
e.printStackTrace();
} }
Thread t = new Thread(new Runnable() { catch (Exception e) {
@Override Log.i("Authentication", e.toString());
public void run() {
try {
newList.setItemID(idReceiver.await());
} catch (Exception e) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getContext(), "An error occurred", Toast.LENGTH_LONG).show();
loadingDialog.cancel();
} }
});
e.printStackTrace();
}
shoppingLists.add(newList);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
shoppingListsSwipeableAdapter.notifyDataSetChanged();
loadingDialog.cancel();
Toast.makeText(getContext(), String.format("%s created", name), Toast.LENGTH_LONG).show();
}
});
}
});
t.start();
}
@Override
public void acceptDelivery(Object delivered) {
Integer[] listIds = (Integer[]) delivered;
// Create threads and add them to a list
Thread[] threads = new Thread[listIds.length];
List[] results = new List[listIds.length];
for (int i = 0; i < listIds.length; i++) {
SynchronousReceiver<List> listReceiver = new SynchronousReceiver<>();
requestor.getObject(Integer.toString(listIds[i]), List.class, listReceiver, listReceiver);
final int finalI = i;
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
results[finalI] = listReceiver.await();
} catch (Exception e) {
e.printStackTrace();
} }
} }
}); });
threads[i] = t; builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
t.start();
}
// Wait for each thread to finish and add results to shoppingLists
for (int i = 0; i < threads.length; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
shoppingLists.add(results[i]);
}
// Set adapter and display this users lists
shoppingListsSwipeableAdapter = new ShoppingListsSwipeableAdapter(getActivity(), shoppingLists);
getActivity().runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void onClick(DialogInterface dialog, int which) {}
shoppingListsView.setAdapter(shoppingListsSwipeableAdapter); });
// shoppingListsView.setOnItemClickListener(new AdapterView.OnItemClickListener() { AlertDialog dialog = builder.create();
// @Override dialog.show();
// public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Intent listPage = new Intent(getContext(), ListPage.class);
//
// // Send the list ID
// listPage.putExtra("listID", shoppingLists.get(position).getItemID());
// startActivity(listPage);
// }
// });
loadingLists.setVisibility(View.GONE);
} }
}); });
return root;
} }
} }

View File

@ -1,19 +1,35 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".ui.home.HomeFragment"> tools:context=".ui.home.HomeFragment">
<Button <ProgressBar
android:id="@+id/button" android:id="@+id/progress_loading_lists"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="Delete Account" android:layout_centerHorizontal="true"
app:layout_constraintBottom_toBottomOf="parent" android:layout_centerVertical="true"
app:layout_constraintEnd_toEndOf="parent" android:indeterminate="true"
app:layout_constraintStart_toStartOf="parent" android:visibility="gone"/>
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout> <ListView
android:id="@+id/shopping_lists"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="@color/list_divider"
android:dividerHeight="1dp"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/new_list_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/fab_margin"
app:srcCompat="@drawable/ic_baseline_add_28"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"/>
</RelativeLayout>

View File

@ -1,41 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".ui.lists.ListsFragment"
tools:showIn="@layout/fragment_lists">
<ProgressBar <Button
android:id="@+id/progress_loading_lists" android:id="@+id/button"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerHorizontal="true" android:layout_marginBottom="16dp"
android:layout_centerVertical="true" android:text="Delete Account"
android:indeterminate="true" app:layout_constraintBottom_toBottomOf="parent"
android:visibility="gone"/> app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ListView </androidx.constraintlayout.widget.ConstraintLayout>
android:id="@+id/shopping_lists"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="@color/list_divider"
android:dividerHeight="1dp"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/new_list_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/fab_margin"
app:srcCompat="@drawable/ic_baseline_add_28"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"/>
</RelativeLayout>