Merge branch 'master' into list-renaming

This commit is contained in:
Nathan Merz
2020-11-20 15:56:57 -05:00
committed by GitHub
22 changed files with 625 additions and 39 deletions

View File

@@ -2,20 +2,15 @@ package com.example.listify;
import android.os.Bundle;
import android.view.View;
import android.widget.*;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import com.bumptech.glide.Glide;
import com.example.listify.data.List;
import com.example.listify.data.ListEntry;
import com.example.listify.model.Product;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONException;
import java.io.IOException;
@@ -233,7 +228,7 @@ public class ItemDetails extends AppCompatActivity implements ListPickerDialogFr
Requestor requestor = new Requestor(am, configs.getProperty("apiKey"));
SynchronousReceiver<Integer> idReceiver = new SynchronousReceiver<>();
com.example.listify.data.List newList = new List(-1, name, "user filled by lambda", Instant.now().toEpochMilli());
com.example.listify.data.List newList = new List(-1, name, "user filled by lambda", Instant.now().toEpochMilli(), -1);
Thread t = new Thread(new Runnable() {
@Override

View File

@@ -325,7 +325,7 @@ public class ListPage extends AppCompatActivity implements Requestor.Receiver {
MyAdapter (Context c, ArrayList<String> names, ArrayList<String> stores, ArrayList<String> prices, ArrayList<String> quantity, ArrayList<String> images) {
super(c, R.layout.activity_listproductentry, R.id.productView, names);
super(c, R.layout.shopping_list_product_entry, R.id.productView, names);
context = c;
pNames = names;
pStores = stores;
@@ -338,7 +338,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.activity_listproductentry, parent,false);
View listproduct = layoutInflater.inflate(R.layout.shopping_list_product_entry, parent,false);
decrQuan = (Button) listproduct.findViewById(R.id.buttonDecr);
incrQuan = (Button) listproduct.findViewById(R.id.buttonIncr);

View File

@@ -0,0 +1,102 @@
package com.example.listify;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.example.listify.adapter.ShareeSwipeableAdapter;
import com.example.listify.adapter.ShoppingListsSwipeableAdapter;
import com.example.listify.data.Chain;
import com.example.listify.data.Item;
import com.example.listify.data.List;
import com.example.listify.data.ListEntry;
import com.example.listify.data.ListShare;
import org.json.JSONException;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import static com.example.listify.MainActivity.am;
public class ListSharees extends AppCompatActivity implements Requestor.Receiver {
ShareeSwipeableAdapter myAdapter;
Requestor requestor;
ProgressBar loadingListItems;
DecimalFormat df = new DecimalFormat("0.00");
// TODO: Display a message if their list is empty
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listofsharees);
final int listID = (int) getIntent().getSerializableExtra("listID");
Properties configs = new Properties();
try {
configs = AuthManager.loadProperties(this, "android.resource://" + getPackageName() + "/raw/auths.json");
} catch (IOException | JSONException e) {
e.printStackTrace();
}
requestor = new Requestor(am, configs.getProperty("apiKey"));
requestor.getObject(Integer.toString(listID), ListShare.class, this);
loadingListItems = findViewById(R.id.progress_loading_list_items);
loadingListItems.setVisibility(View.VISIBLE);
}
@Override
public void acceptDelivery(Object delivered) {
ListShare sharee = (ListShare) delivered;
if(sharee != null) {
SynchronousReceiver<ListShare> listShareReceiver = new SynchronousReceiver<>();
requestor.getObject(Integer.toString(sharee.getListID()), ListShare.class, listShareReceiver, listShareReceiver);
ArrayList<ListShare> resultList = new ArrayList<>();
ListShare result;
try {
result = listShareReceiver.await();
}
catch (Exception e) {
e.printStackTrace();
result = null;
}
if(result != null) {
resultList.add(result);
for(ListShare r : result.getEntries()) {
resultList.add(r);
}
myAdapter = new ShareeSwipeableAdapter(this, resultList);
}
}
}
}

View File

@@ -17,6 +17,7 @@ import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import com.amplifyframework.auth.AuthException;
import com.example.listify.data.List;
import com.example.listify.data.ListReposition;
import com.example.listify.data.SearchHistory;
import com.example.listify.ui.LoginPage;
import com.google.android.material.navigation.NavigationView;
@@ -109,6 +110,7 @@ public class MainActivity extends AppCompatActivity implements CreateListDialogF
try {
requestor.putObject(new List(293, "Java.py", "me!", 1));
System.out.println(historyReceiver.await());
requestor.putObject(new ListReposition(291, 1));
} catch (Exception e) {
e.printStackTrace();
}
@@ -200,7 +202,7 @@ public class MainActivity extends AppCompatActivity implements CreateListDialogF
Requestor requestor = new Requestor(am, configs.getProperty("apiKey"));
SynchronousReceiver<Integer> idReceiver = new SynchronousReceiver<>();
List newList = new List(-1, name, "user filled by lambda", Instant.now().toEpochMilli());
List newList = new List(-1, name, "user filled by lambda", Instant.now().toEpochMilli(), -1);
try {
requestor.postObject(newList, idReceiver, idReceiver);

View File

@@ -0,0 +1,128 @@
package com.example.listify.adapter;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.chauthai.swipereveallayout.SwipeRevealLayout;
import com.chauthai.swipereveallayout.ViewBinderHelper;
import com.example.listify.AuthManager;
import com.example.listify.ListPage;
import com.example.listify.R;
import com.example.listify.Requestor;
import com.example.listify.data.List;
import com.example.listify.data.ListShare;
import org.json.JSONException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;
import static com.example.listify.MainActivity.am;
public class ShareeSwipeableAdapter extends BaseAdapter {
private Activity activity;
private ArrayList<ListShare> sharees;
private LayoutInflater inflater;
private final ViewBinderHelper binderHelper;
public ShareeSwipeableAdapter(Activity activity, ArrayList<ListShare> sharees){
binderHelper = new ViewBinderHelper();
this.activity = activity;
this.sharees = sharees;
}
@Override
public int getCount() {
return sharees.size();
}
@Override
public Object getItem(int position) {
return sharees.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
Properties configs = new Properties();
try {
configs = AuthManager.loadProperties(activity, "android.resource://" + activity.getPackageName() + "/raw/auths.json");
} catch (IOException | JSONException e) {
e.printStackTrace();
}
Requestor requestor = new Requestor(am, configs.getProperty("apiKey"));
if (inflater == null) {
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
if (convertView == null) {
convertView = inflater.inflate(R.layout.shopping_lists_swipeable_name_item, null);
holder = new ViewHolder();
holder.swipeLayout = (SwipeRevealLayout)convertView.findViewById(R.id.swipe_layout);
holder.frontView = convertView.findViewById(R.id.front_layout);
holder.deleteList = convertView.findViewById(R.id.delete_list);
holder.shareList = convertView.findViewById(R.id.share_list);
holder.textView = (TextView) convertView.findViewById(R.id.shopping_list_name);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
final ListShare currSharee = sharees.get(position);
// Bind the view to the unique list ID
binderHelper.bind(holder.swipeLayout, currSharee.getShareWithEmail());
holder.textView.setText(currSharee.getShareWithEmail());
holder.deleteList.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
holder.shareList.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
holder.frontView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
return convertView;
}
private class ViewHolder {
SwipeRevealLayout swipeLayout;
View frontView;
View deleteList;
View shareList;
TextView textView;
}
}

View File

@@ -9,18 +9,20 @@ public class List {
long lastUpdated;
final ListEntry[] entries;
boolean shared;
Integer uiPosition;
public List(Integer listID, String name, String owner, long lastUpdated, ListEntry[] entries, boolean shared) {
public List(Integer listID, String name, String owner, long lastUpdated, ListEntry[] entries, boolean shared, Integer uiPosition) {
this.listID = listID;
this.name = name;
this.owner = owner;
this.lastUpdated = lastUpdated;
this.entries = entries;
this.shared = false;
this.uiPosition = uiPosition;
}
public List(Integer listID, String name, String owner, long lastUpdated) {
this(listID, name, owner, lastUpdated, null, false);
public List(Integer listID, String name, String owner, long lastUpdated, Integer uiPosition) {
this(listID, name, owner, lastUpdated, null, false, uiPosition);
}
@Override
@@ -32,6 +34,7 @@ public class List {
", lastUpdated=" + lastUpdated +
", entries=" + Arrays.toString(entries) +
", shared=" + shared +
", uiPosition=" + uiPosition +
'}';
}
@@ -67,10 +70,6 @@ public class List {
this.lastUpdated = lastUpdated;
}
public ListEntry[] getEntries() {
return entries;
}
public boolean isShared() {
return shared;
}
@@ -78,4 +77,15 @@ public class List {
public void setShared(boolean shared) {
this.shared = shared;
}
public Integer getUiPosition() {
return uiPosition;
}
public void setUiPosition(Integer uiPosition) {
this.uiPosition = uiPosition;
public ListEntry[] getEntries() {
return entries;
}
}

View File

@@ -0,0 +1,35 @@
package com.example.listify.data;
public class ListReposition {
Integer listID;
Integer newPosition;
public ListReposition(Integer listID, Integer newPosition) {
this.listID = listID;
this.newPosition = newPosition;
}
@Override
public String toString() {
return "ListReposition{" +
"listID=" + listID +
", newPosition=" + newPosition +
'}';
}
public Integer getListID() {
return listID;
}
public void setListID(Integer listID) {
this.listID = listID;
}
public Integer getNewPosition() {
return newPosition;
}
public void setNewPosition(Integer newPosition) {
this.newPosition = newPosition;
}
}

View File

@@ -9,9 +9,10 @@ import java.util.Map;
public class ListShare {
Integer listID;
String shareWithEmail;
final ListShare[] other;
Integer permissionLevel;
private static final Map<Integer, String> keysToPerms;
static {
//All keys should be a prime number > 1
//All keys need to be maintained here and in List module->ListPermissions class on the Lambda side
@@ -22,18 +23,20 @@ public class ListShare {
keysToPermsTemp.put(7, "share");
keysToPerms = Collections.unmodifiableMap(keysToPermsTemp);
}
public ListShare(Integer listID, String shareWithEmail, Integer permissionLevel) {
public ListShare(Integer listID, String shareWithEmail, Integer permissionLevel, ListShare[] other) {
this.listID = listID;
this.shareWithEmail = shareWithEmail;
this.permissionLevel = permissionLevel;
this.other = other
}
public ListShare(Integer listID, String shareWithEmail, String permissionsRaw) {
public ListShare(Integer listID, String shareWithEmail, String permissionsRaw, ListShare[] other) {
String permissions = permissionsRaw.toLowerCase();
this.listID = listID;
this.shareWithEmail = shareWithEmail;
permissionLevel = 1;
this.other = other;
for (Map.Entry<Integer, String> keytoPermEntry: keysToPerms.entrySet()) {
if (permissions.contains(keytoPermEntry.getValue())) {
permissionLevel *= keytoPermEntry.getKey();
@@ -62,6 +65,7 @@ public class ListShare {
}
toReturn.append("]}");
return toReturn.toString();
}
public Integer getListID() {
@@ -79,7 +83,11 @@ public class ListShare {
public void setShareWithEmail(String shareWithEmail) {
this.shareWithEmail = shareWithEmail;
}
public ListShare[] getEntries() {
return other;
}
public Integer getPermissionLevel() {
return permissionLevel;
}
@@ -87,5 +95,4 @@ public class ListShare {
public void setPermissionLevel(Integer permissionLevel) {
this.permissionLevel = permissionLevel;
}
}

View File

@@ -110,7 +110,7 @@ public class HomeFragment extends Fragment implements CreateListDialogFragment.O
Requestor requestor = new Requestor(am, configs.getProperty("apiKey"));
SynchronousReceiver<Integer> idReceiver = new SynchronousReceiver<>();
List newList = new List(-1, name, "user filled by lambda", Instant.now().toEpochMilli());
List newList = new List(-1, name, "user filled by lambda", Instant.now().toEpochMilli() , -1);
try {
requestor.postObject(newList, idReceiver, idReceiver);

View File

@@ -0,0 +1,22 @@
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/progress_loading_list_items"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:indeterminate="true"
android:visibility="gone"/>
<ListView
android:id="@+id/listOfSharees"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="0dp" />
</RelativeLayout>