From 680c545d76535a439835dd40a65555e8c606273d Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sat, 14 Nov 2020 19:12:03 -0500 Subject: [PATCH 01/11] Display shopping list name in titlebar --- .../java/com/example/listify/ListPage.java | 8 +++++--- .../ShoppingListsSwipeableAdapter.java | 3 ++- .../listify/ui/home/HomeViewModel.java | 19 ------------------- 3 files changed, 7 insertions(+), 23 deletions(-) delete mode 100644 Listify/app/src/main/java/com/example/listify/ui/home/HomeViewModel.java 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 1efd025..c2d3db5 100644 --- a/Listify/app/src/main/java/com/example/listify/ListPage.java +++ b/Listify/app/src/main/java/com/example/listify/ListPage.java @@ -70,7 +70,9 @@ public class ListPage extends AppCompatActivity implements Requestor.Receiver { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); - final int listID = (int) getIntent().getSerializableExtra("listID"); + final int LIST_ID = (int) getIntent().getSerializableExtra("listID"); + final String LIST_NAME = (String) getIntent().getSerializableExtra("listName"); + setTitle(LIST_NAME); Properties configs = new Properties(); try { @@ -79,7 +81,7 @@ public class ListPage extends AppCompatActivity implements Requestor.Receiver { e.printStackTrace(); } requestor = new Requestor(am, configs.getProperty("apiKey")); - requestor.getObject(Integer.toString(listID), List.class, this); + requestor.getObject(Integer.toString(LIST_ID), List.class, this); listView = findViewById(R.id.listView); myAdapter = new MyAdapter(this, pNames, pStores, pPrices, pQuantity, pImages); @@ -125,7 +127,7 @@ public class ListPage extends AppCompatActivity implements Requestor.Receiver { public void onClick(DialogInterface dialog, int which) { EditText sharedEmailText = (EditText) codeView.findViewById(R.id.editTextTextSharedEmail); String sharedEmail = sharedEmailText.getText().toString(); - ListShare listShare = new ListShare(listID, sharedEmail); + ListShare listShare = new ListShare(LIST_ID, sharedEmail); try { requestor.postObject(listShare); } diff --git a/Listify/app/src/main/java/com/example/listify/adapter/ShoppingListsSwipeableAdapter.java b/Listify/app/src/main/java/com/example/listify/adapter/ShoppingListsSwipeableAdapter.java index 892f2f0..16a3e65 100644 --- a/Listify/app/src/main/java/com/example/listify/adapter/ShoppingListsSwipeableAdapter.java +++ b/Listify/app/src/main/java/com/example/listify/adapter/ShoppingListsSwipeableAdapter.java @@ -157,8 +157,9 @@ public class ShoppingListsSwipeableAdapter extends BaseAdapter { public void onClick(View v) { Intent listPage = new Intent(activity, ListPage.class); - // Send the list ID + // Send the list ID and list name listPage.putExtra("listID", curList.getItemID()); + listPage.putExtra("listName", curList.getName()); activity.startActivity(listPage); } }); diff --git a/Listify/app/src/main/java/com/example/listify/ui/home/HomeViewModel.java b/Listify/app/src/main/java/com/example/listify/ui/home/HomeViewModel.java deleted file mode 100644 index 22e1280..0000000 --- a/Listify/app/src/main/java/com/example/listify/ui/home/HomeViewModel.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.example.listify.ui.home; - -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; - -public class HomeViewModel extends ViewModel { - - private MutableLiveData mText; - - public HomeViewModel() { - mText = new MutableLiveData<>(); - mText.setValue("This is home fragment"); - } - - public LiveData getText() { - return mText; - } -} \ No newline at end of file From 07733caed741076a324db60c16773e8811373f48 Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sat, 14 Nov 2020 19:35:11 -0500 Subject: [PATCH 02/11] Lists activity displays item count on each list --- .../adapter/ShoppingListsSwipeableAdapter.java | 13 +++++++++---- .../layout/shopping_lists_swipeable_name_item.xml | 11 +++++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/Listify/app/src/main/java/com/example/listify/adapter/ShoppingListsSwipeableAdapter.java b/Listify/app/src/main/java/com/example/listify/adapter/ShoppingListsSwipeableAdapter.java index 16a3e65..c423a56 100644 --- a/Listify/app/src/main/java/com/example/listify/adapter/ShoppingListsSwipeableAdapter.java +++ b/Listify/app/src/main/java/com/example/listify/adapter/ShoppingListsSwipeableAdapter.java @@ -80,7 +80,8 @@ public class ShoppingListsSwipeableAdapter extends BaseAdapter { 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); + holder.listName = (TextView) convertView.findViewById(R.id.shopping_list_name); + holder.itemCount = (TextView) convertView.findViewById(R.id.shopping_list_item_count); convertView.setTag(holder); } else { @@ -93,11 +94,14 @@ public class ShoppingListsSwipeableAdapter extends BaseAdapter { binderHelper.bind(holder.swipeLayout, Integer.toString(curList.getItemID())); if(curList.isShared()) { - holder.textView.setText(curList.getName() + " (shared)"); + holder.listName.setText(curList.getName() + " (shared)"); } else { - holder.textView.setText(curList.getName()); + holder.listName.setText(curList.getName()); } + + holder.itemCount.setText(String.format("%d items", curList.getEntries().length)); + holder.deleteList.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -172,6 +176,7 @@ public class ShoppingListsSwipeableAdapter extends BaseAdapter { View frontView; View deleteList; View shareList; - TextView textView; + TextView listName; + TextView itemCount; } } diff --git a/Listify/app/src/main/res/layout/shopping_lists_swipeable_name_item.xml b/Listify/app/src/main/res/layout/shopping_lists_swipeable_name_item.xml index 98f9613..9ecf6db 100644 --- a/Listify/app/src/main/res/layout/shopping_lists_swipeable_name_item.xml +++ b/Listify/app/src/main/res/layout/shopping_lists_swipeable_name_item.xml @@ -40,11 +40,18 @@ android:layout_height="50dp"> + android:layout_gravity="center_vertical"/> + + \ No newline at end of file From c0f79a70efbd524925d5279437b18c95d248c5e2 Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sat, 14 Nov 2020 19:55:30 -0500 Subject: [PATCH 03/11] Search, filter, and sort scroll to the top of the results --- .../com/example/listify/SearchResults.java | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Listify/app/src/main/java/com/example/listify/SearchResults.java b/Listify/app/src/main/java/com/example/listify/SearchResults.java index 7390cb0..dcba569 100644 --- a/Listify/app/src/main/java/com/example/listify/SearchResults.java +++ b/Listify/app/src/main/java/com/example/listify/SearchResults.java @@ -28,7 +28,7 @@ import java.util.Properties; import static com.example.listify.MainActivity.am; public class SearchResults extends AppCompatActivity implements FilterDialogFragment.OnFilterListener, SortDialogFragment.OnSortListener, Requestor.Receiver { - private ListView listView; + private ListView resultsListView; private MenuItem filterItem; private ProgressBar loadingSearch; private SearchResultsListAdapter searchResultsListAdapter; @@ -95,10 +95,10 @@ public class SearchResults extends AppCompatActivity implements FilterDialogFrag } }); - ListView listView = (ListView) findViewById(R.id.search_results_list); + resultsListView = (ListView) findViewById(R.id.search_results_list); searchResultsListAdapter = new SearchResultsListAdapter(this, resultsProductListSorted); - listView.setAdapter(searchResultsListAdapter); - listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + resultsListView.setAdapter(searchResultsListAdapter); + resultsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Intent itemDetailsPage = new Intent(SearchResults.this, ItemDetails.class); @@ -207,13 +207,22 @@ public class SearchResults extends AppCompatActivity implements FilterDialogFrag requestor.getObject(query, ItemSearch.class, this); } - // TODO: Scroll the list back to the top when a search, sort, or filter is performed // Sorts the search results private void sortResults() { // Reset the filtered list resultsProductListSorted.clear(); resultsProductListSorted.addAll(resultsProductList); + // Scroll the user back to the top of the results + if (resultsListView != null) { + runOnUiThread(new Runnable() { + @Override + public void run() { + resultsListView.smoothScrollToPosition(0); + } + }); + } + // Sort Modes // 0 default (no sorting) // 1 itemName From 72a201a0fe9f14f5a87f464d7292bc8b9f15266b Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sat, 14 Nov 2020 22:27:47 -0500 Subject: [PATCH 04/11] Search displays 'No Results' when results are empty --- .../com/example/listify/SearchResults.java | 18 +++++++++++++++++- .../main/res/layout/content_search_results.xml | 10 ++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Listify/app/src/main/java/com/example/listify/SearchResults.java b/Listify/app/src/main/java/com/example/listify/SearchResults.java index dcba569..379ac8d 100644 --- a/Listify/app/src/main/java/com/example/listify/SearchResults.java +++ b/Listify/app/src/main/java/com/example/listify/SearchResults.java @@ -13,6 +13,8 @@ import android.widget.ImageView; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.SearchView; +import android.widget.TextView; + import com.example.listify.adapter.SearchResultsListAdapter; import com.example.listify.data.Chain; import com.example.listify.data.ItemSearch; @@ -31,6 +33,7 @@ public class SearchResults extends AppCompatActivity implements FilterDialogFrag private ListView resultsListView; private MenuItem filterItem; private ProgressBar loadingSearch; + private TextView tvNoResults; private SearchResultsListAdapter searchResultsListAdapter; private List resultsProductList = new ArrayList<>(); private List resultsProductListSorted = new ArrayList<>(); @@ -64,6 +67,7 @@ public class SearchResults extends AppCompatActivity implements FilterDialogFrag setSupportActionBar(toolbar); loadingSearch = (ProgressBar) findViewById(R.id.progress_loading_search); + tvNoResults = (TextView) findViewById(R.id.tv_search_no_results); // Back button closes this activity and returns to previous activity (MainActivity) ImageButton backButton = (ImageButton) findViewById(R.id.backToHomeButton); @@ -320,10 +324,22 @@ public class SearchResults extends AppCompatActivity implements FilterDialogFrag } // This is called after the search results come back from the server - // TODO: Display a "no results" message if nothing is found when searching @Override public void acceptDelivery(Object delivered) { ItemSearch results = (ItemSearch) delivered; + + // Display "no results" message if the search returns none + runOnUiThread(new Runnable() { + @Override + public void run() { + if (results.getResults().size() == 0) { + tvNoResults.setVisibility(View.VISIBLE); + } else { + tvNoResults.setVisibility(View.GONE); + } + } + }); + try { HashMap chainNameMap = new HashMap<>(); for (int i = 0; i < results.getResults().size(); i++) { diff --git a/Listify/app/src/main/res/layout/content_search_results.xml b/Listify/app/src/main/res/layout/content_search_results.xml index 51ff208..882de3b 100644 --- a/Listify/app/src/main/res/layout/content_search_results.xml +++ b/Listify/app/src/main/res/layout/content_search_results.xml @@ -29,4 +29,14 @@ android:divider="@color/list_divider" android:dividerHeight="1dp"/> + + \ No newline at end of file From 757ac20fe66fd4f7c1d44b90723f684433ff57d7 Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sat, 14 Nov 2020 22:36:42 -0500 Subject: [PATCH 05/11] Broken images in search now display a broke image icon --- .../example/listify/adapter/SearchResultsListAdapter.java | 7 ++++++- .../app/src/main/res/drawable/ic_baseline_image_600.xml | 5 +++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 Listify/app/src/main/res/drawable/ic_baseline_image_600.xml diff --git a/Listify/app/src/main/java/com/example/listify/adapter/SearchResultsListAdapter.java b/Listify/app/src/main/java/com/example/listify/adapter/SearchResultsListAdapter.java index bc02c73..fcf973a 100644 --- a/Listify/app/src/main/java/com/example/listify/adapter/SearchResultsListAdapter.java +++ b/Listify/app/src/main/java/com/example/listify/adapter/SearchResultsListAdapter.java @@ -10,6 +10,7 @@ import android.widget.ImageView; import android.widget.TextView; import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; import com.example.listify.model.Product; import com.example.listify.R; @@ -56,7 +57,11 @@ public class SearchResultsListAdapter extends BaseAdapter { Product product = productList.get(position); // TODO: If image url is broken, display @drawable/ic_baseline_broken_image_600.xml - Glide.with(activity).load(product.getImageUrl()).into(productImage); + Glide.with(activity) + .applyDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_baseline_image_600).error(R.drawable.ic_baseline_broken_image_600)) + .load(product.getImageUrl()) + .into(productImage); + if (product.getItemName().length() >= 60) { itemName.setText(product.getItemName().substring(0, 60) + "..."); } else { diff --git a/Listify/app/src/main/res/drawable/ic_baseline_image_600.xml b/Listify/app/src/main/res/drawable/ic_baseline_image_600.xml new file mode 100644 index 0000000..1f1ec73 --- /dev/null +++ b/Listify/app/src/main/res/drawable/ic_baseline_image_600.xml @@ -0,0 +1,5 @@ + + + From 09349653066d338032ba34ed197b634a09b55253 Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sat, 14 Nov 2020 22:51:02 -0500 Subject: [PATCH 06/11] Restrict quantities when adding item to a list --- .../example/listify/ListPickerDialogFragment.java | 12 +++++++++++- .../listify/adapter/SearchResultsListAdapter.java | 2 +- .../app/src/main/res/layout/dialog_add_to_list.xml | 1 + 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Listify/app/src/main/java/com/example/listify/ListPickerDialogFragment.java b/Listify/app/src/main/java/com/example/listify/ListPickerDialogFragment.java index b9c4959..01331c5 100644 --- a/Listify/app/src/main/java/com/example/listify/ListPickerDialogFragment.java +++ b/Listify/app/src/main/java/com/example/listify/ListPickerDialogFragment.java @@ -90,8 +90,13 @@ public class ListPickerDialogFragment extends DialogFragment { btnMinus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + // Set to 1 if it is empty + if (etQuantity.getText().toString().equals("")) { + etQuantity.setText("1"); + } + int curQauntity = Integer.parseInt(etQuantity.getText().toString()); - if (curQauntity > 0) { + if (curQauntity > 1) { curQauntity--; etQuantity.setText(String.format("%d", curQauntity)); } @@ -102,6 +107,11 @@ public class ListPickerDialogFragment extends DialogFragment { btnPlus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { + // Set to 1 if it is empty + if (etQuantity.getText().toString().equals("")) { + etQuantity.setText("1"); + } + int curQauntity = Integer.parseInt(etQuantity.getText().toString()); curQauntity++; etQuantity.setText(String.format("%d", curQauntity)); diff --git a/Listify/app/src/main/java/com/example/listify/adapter/SearchResultsListAdapter.java b/Listify/app/src/main/java/com/example/listify/adapter/SearchResultsListAdapter.java index fcf973a..9b3ddf7 100644 --- a/Listify/app/src/main/java/com/example/listify/adapter/SearchResultsListAdapter.java +++ b/Listify/app/src/main/java/com/example/listify/adapter/SearchResultsListAdapter.java @@ -56,7 +56,7 @@ public class SearchResultsListAdapter extends BaseAdapter { TextView itemStore = (TextView) convertView.findViewById(R.id.item_store); Product product = productList.get(position); - // TODO: If image url is broken, display @drawable/ic_baseline_broken_image_600.xml + Glide.with(activity) .applyDefaultRequestOptions(new RequestOptions().placeholder(R.drawable.ic_baseline_image_600).error(R.drawable.ic_baseline_broken_image_600)) .load(product.getImageUrl()) diff --git a/Listify/app/src/main/res/layout/dialog_add_to_list.xml b/Listify/app/src/main/res/layout/dialog_add_to_list.xml index 5e255f9..4273676 100644 --- a/Listify/app/src/main/res/layout/dialog_add_to_list.xml +++ b/Listify/app/src/main/res/layout/dialog_add_to_list.xml @@ -38,6 +38,7 @@ android:layout_width="60dp" android:layout_height="50dp" android:text="@string/_1" + android:digits="0123456789" android:inputType="number"/>