From b498220d9fbf99d9669df5d69e5126e5ab53f6fe Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sat, 3 Oct 2020 01:34:26 -0400 Subject: [PATCH 01/17] Fixed search results not being cleared after new search --- .../src/main/java/com/example/listify/SearchResults.java | 8 +++++++- 1 file changed, 7 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 e87fd48..eafb400 100644 --- a/Listify/app/src/main/java/com/example/listify/SearchResults.java +++ b/Listify/app/src/main/java/com/example/listify/SearchResults.java @@ -1,4 +1,5 @@ package com.example.listify; +import android.content.Intent; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; @@ -77,7 +78,9 @@ public class SearchResults extends AppCompatActivity implements SortDialogFragme listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - Toast.makeText(SearchResults.this, resultsProductListSorted.get(position).getItemName(), Toast.LENGTH_SHORT).show(); +// Toast.makeText(SearchResults.this, resultsProductListSorted.get(position).getItemName(), Toast.LENGTH_SHORT).show(); + Intent itemDetails = new Intent(SearchResults.this, ItemDetails.class); + startActivity(itemDetails); } }); @@ -129,6 +132,9 @@ public class SearchResults extends AppCompatActivity implements SortDialogFragme // TODO: Create a new Product Object for each result // TODO: Add each result to productList + // Clear the old search results + resultsProductList = new ArrayList<>(); + // Hardcode some search results... for (int i = 0; i < 2; i++) { Product a = new Product("Bottled Water", "0000", "Walmart", "0001", "0123456780", "Bro, it's water...", "Grocery", 13.37, "9/24/2020", "1", "http://3.bp.blogspot.com/-MfroPPQVDKo/UyhUZWqGvkI/AAAAAAAAB-I/DGk622onsvc/s1600/lettuce-b-kool-cat-meme.jpg"); From b951983112f502d1a80c0d8b9f20be3edd8bf629 Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sat, 3 Oct 2020 16:52:11 -0400 Subject: [PATCH 02/17] Fix for long titles on search results --- .../example/listify/adapter/SearchResultsListAdapter.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 61f9473..cc4306c 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 @@ -57,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); - itemName.setText(product.getItemName()); + if (product.getItemName().length() >= 35) { + itemName.setText(product.getItemName().substring(0, 35) + "..."); + } else { + itemName.setText(product.getItemName()); + } price.setText(String.format("$%.2f", product.getPrice())); itemStore.setText(product.getChainName()); From 790d935e40911670d6dda93cd4d17bd179b99175 Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sat, 3 Oct 2020 17:48:28 -0400 Subject: [PATCH 03/17] Layout for item details page --- Listify/app/src/main/AndroidManifest.xml | 27 +++--- .../java/com/example/listify/ItemDetails.java | 83 +++++++++++++++++++ .../com/example/listify/SearchResults.java | 19 ++++- .../com/example/listify/model/Product.java | 4 +- .../main/res/drawable/ic_baseline_add_28.xml | 5 ++ .../main/res/layout/activity_item_details.xml | 70 ++++++++++++++++ .../main/res/layout/content_item_details.xml | 80 ++++++++++++++++++ Listify/app/src/main/res/values/colors.xml | 1 + Listify/app/src/main/res/values/dimens.xml | 5 ++ Listify/app/src/main/res/values/strings.xml | 1 + 10 files changed, 280 insertions(+), 15 deletions(-) create mode 100644 Listify/app/src/main/java/com/example/listify/ItemDetails.java create mode 100644 Listify/app/src/main/res/drawable/ic_baseline_add_28.xml create mode 100644 Listify/app/src/main/res/layout/activity_item_details.xml create mode 100644 Listify/app/src/main/res/layout/content_item_details.xml diff --git a/Listify/app/src/main/AndroidManifest.xml b/Listify/app/src/main/AndroidManifest.xml index d6e08aa..170664e 100644 --- a/Listify/app/src/main/AndroidManifest.xml +++ b/Listify/app/src/main/AndroidManifest.xml @@ -1,7 +1,8 @@ - + + - + - + + + + android:theme="@style/AppTheme.NoActionBar"> + - - - - - - + + + + + \ No newline at end of file diff --git a/Listify/app/src/main/java/com/example/listify/ItemDetails.java b/Listify/app/src/main/java/com/example/listify/ItemDetails.java new file mode 100644 index 0000000..8b70f19 --- /dev/null +++ b/Listify/app/src/main/java/com/example/listify/ItemDetails.java @@ -0,0 +1,83 @@ +package com.example.listify; + +import android.os.Bundle; +import com.bumptech.glide.Glide; +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.TextView; + +public class ItemDetails extends AppCompatActivity { + private Product curProduct; + private FloatingActionButton fab1; + private FloatingActionButton fab2; + private TextView tvItemName; + private TextView tvStoreName; + private ImageView itemImage; + private TextView tvItemDesc; + private ImageButton backToSearchbutton; + + private boolean isFABOpen = false; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_item_details); + Toolbar toolbar = findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + + curProduct = (Product) getIntent().getSerializableExtra("SelectedProduct"); + + FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); + fab1 = (FloatingActionButton) findViewById(R.id.fab1); + fab2 = (FloatingActionButton) findViewById(R.id.fab2); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (!isFABOpen) { + showFABMenu(); + } else { + closeFABMenu(); + } + } + }); + + tvItemName = (TextView) findViewById(R.id.item_name); + tvItemName.setText(curProduct.getItemName()); + + itemImage = (ImageView) findViewById(R.id.item_image); + Glide.with(this).load(curProduct.getImageUrl()).into(itemImage); + + tvStoreName = (TextView) findViewById(R.id.store_name); + tvStoreName.setText(curProduct.getChainName()); + + tvItemDesc = (TextView) findViewById(R.id.item_desc); + tvItemDesc.setText(curProduct.getDescription()); + + backToSearchbutton = (ImageButton) findViewById(R.id.back_to_search_results_button); + backToSearchbutton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + private void showFABMenu(){ + isFABOpen=true; + fab1.animate().translationY(-getResources().getDimension(R.dimen.standard_55)); + fab2.animate().translationY(-getResources().getDimension(R.dimen.standard_105)); + } + + private void closeFABMenu(){ + isFABOpen=false; + fab1.animate().translationY(0); + fab2.animate().translationY(0); + } + + +} \ No newline at end of file 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 eafb400..74c80ed 100644 --- a/Listify/app/src/main/java/com/example/listify/SearchResults.java +++ b/Listify/app/src/main/java/com/example/listify/SearchResults.java @@ -79,8 +79,11 @@ public class SearchResults extends AppCompatActivity implements SortDialogFragme @Override public void onItemClick(AdapterView parent, View view, int position, long id) { // Toast.makeText(SearchResults.this, resultsProductListSorted.get(position).getItemName(), Toast.LENGTH_SHORT).show(); - Intent itemDetails = new Intent(SearchResults.this, ItemDetails.class); - startActivity(itemDetails); + Intent itemDetailsPage = new Intent(SearchResults.this, ItemDetails.class); + + // Send the selected product + itemDetailsPage.putExtra("SelectedProduct", resultsProductListSorted.get(position)); + startActivity(itemDetailsPage); } }); @@ -142,13 +145,23 @@ public class SearchResults extends AppCompatActivity implements SortDialogFragme Product c = new Product("Lettuce", "0002", "Walmart", "0001", "0123456782", "Burger King foot lettuce", "Grocery", 0.60, "9/24/2020", "1", "https://www.cattitudedaily.com/wp-content/uploads/2019/12/white-cat-meme-feature.jpg"); Product d = new Product("Video Game", "0003", "Walmart", "0001", "0123456783", "Fun Vidya Gaemz", "Electronics", 60.00, "9/24/2020", "1", "https://i1.wp.com/bestlifeonline.com/wp-content/uploads/2018/06/cat-meme-67.jpg?resize=1024%2C1024&ssl=1"); Product e = new Product("Mountain Dew", "0004", "Walmart", "0001", "0123456784", "Gamer fuel", "Grocery", 5.87, "9/24/2020", "1", "https://memeguy.com/photos/images/gaming-cat-7680.png"); - Product f = new Product("Tire", "0005", "Walmart", "0001", "0123456785", "30 inch rims", "Automotive", 146.97, "9/24/2020", "1", "http://cdn.sheknows.com/articles/2013/05/pet5.jpg"); + Product f = new Product("Tire", "0005", "Kroger", "0002", "0123456785", "30 inch rims", "Automotive", 146.97, "9/24/2020", "1", "http://cdn.sheknows.com/articles/2013/05/pet5.jpg"); + Product g = new Product("This is a test for a product that has a very long title to see if the text overflows", "0006", "Target", "0003", "0123456786", "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Elit ut aliquam purus sit amet luctus venenatis. Tellus orci ac auctor augue mauris augue neque gravida. Habitant morbi tristique senectus et netus. Dignissim diam quis enim lobortis. Suspendisse sed nisi lacus sed viverra tellus in. Viverra adipiscing at in tellus integer feugiat scelerisque. Volutpat consequat mauris nunc congue nisi vitae suscipit tellus. Habitant morbi tristique senectus et netus et malesuada. Quis enim lobortis scelerisque fermentum dui faucibus in ornare quam. Mattis pellentesque id nibh tortor id aliquet. Volutpat blandit aliquam etiam erat. Vestibulum lorem sed risus ultricies tristique nulla aliquet.\n" + + "\n" + + "Placerat orci nulla pellentesque dignissim. Quisque non tellus orci ac. Mattis enim ut tellus elementum sagittis vitae et. Interdum velit euismod in pellentesque massa placerat duis ultricies. Id nibh tortor id aliquet lectus. Massa placerat duis ultricies lacus sed. Convallis convallis tellus id interdum velit laoreet id donec. Amet luctus venenatis lectus magna fringilla urna porttitor rhoncus. Sodales ut eu sem integer vitae justo. Viverra ipsum nunc aliquet bibendum enim facilisis.\n" + + "\n" + + "Eget felis eget nunc lobortis mattis aliquam faucibus purus. Odio morbi quis commodo odio aenean sed adipiscing. Hac habitasse platea dictumst quisque sagittis purus sit. Nam libero justo laoreet sit. Et malesuada fames ac turpis egestas. Erat nam at lectus urna duis convallis convallis. Morbi tincidunt ornare massa eget egestas purus viverra accumsan in. Ut venenatis tellus in metus vulputate eu scelerisque felis imperdiet. At auctor urna nunc id cursus. Sed elementum tempus egestas sed. Lorem dolor sed viverra ipsum nunc aliquet bibendum. Orci eu lobortis elementum nibh tellus molestie. Porttitor leo a diam sollicitudin tempor. Adipiscing bibendum est ultricies integer quis auctor elit sed. Arcu cursus euismod quis viverra nibh. A diam sollicitudin tempor id eu nisl.\n" + + "\n" + + "Sapien eget mi proin sed libero enim sed faucibus turpis. Pharetra massa massa ultricies mi quis hendrerit dolor magna. Integer enim neque volutpat ac tincidunt vitae semper. Euismod lacinia at quis risus sed vulputate. Ut venenatis tellus in metus vulputate eu scelerisque. Etiam erat velit scelerisque in dictum non consectetur. Viverra nam libero justo laoreet sit amet cursus sit. Arcu non sodales neque sodales. Vivamus arcu felis bibendum ut tristique et egestas quis. Sed adipiscing diam donec adipiscing tristique risus. Sollicitudin tempor id eu nisl nunc mi ipsum faucibus vitae. Velit ut tortor pretium viverra suspendisse potenti nullam ac tortor. Non nisi est sit amet facilisis magna etiam. Tortor at risus viverra adipiscing. Donec ultrices tincidunt arcu non sodales neque sodales. Eget egestas purus viverra accumsan. Enim lobortis scelerisque fermentum dui faucibus in ornare. Porttitor massa id neque aliquam. Ut consequat semper viverra nam. Orci ac auctor augue mauris augue neque gravida.\n" + + "\n" + + "Lacus sed viverra tellus in hac habitasse platea dictumst. Nec ullamcorper sit amet risus nullam eget felis eget nunc. Semper feugiat nibh sed pulvinar. Consequat nisl vel pretium lectus quam id leo in. Volutpat maecenas volutpat blandit aliquam etiam erat velit scelerisque. Faucibus a pellentesque sit amet porttitor eget. Sed viverra tellus in hac habitasse platea dictumst vestibulum. Placerat vestibulum lectus mauris ultrices eros in cursus turpis. Sed tempus urna et pharetra pharetra massa massa ultricies mi. Ornare arcu odio ut sem. Ornare arcu dui vivamus arcu felis bibendum ut. Feugiat pretium nibh ipsum consequat. Consectetur adipiscing elit ut aliquam purus sit amet luctus venenatis. Felis eget velit aliquet sagittis id consectetur purus ut.", "Automotive", 45.22, "9/24/2020", "1", "http://cdn.sheknows.com/articles/2013/05/pet5.jpg"); resultsProductList.add(a); resultsProductList.add(b); resultsProductList.add(c); resultsProductList.add(d); resultsProductList.add(e); resultsProductList.add(f); + resultsProductList.add(g); } // Create a list of all stores in the results so the user can filter by store name diff --git a/Listify/app/src/main/java/com/example/listify/model/Product.java b/Listify/app/src/main/java/com/example/listify/model/Product.java index db52386..654ac6b 100644 --- a/Listify/app/src/main/java/com/example/listify/model/Product.java +++ b/Listify/app/src/main/java/com/example/listify/model/Product.java @@ -1,6 +1,8 @@ package com.example.listify.model; -public class Product { +import java.io.Serializable; + +public class Product implements Serializable { private String itemName; private String itemId; private String chainName; diff --git a/Listify/app/src/main/res/drawable/ic_baseline_add_28.xml b/Listify/app/src/main/res/drawable/ic_baseline_add_28.xml new file mode 100644 index 0000000..28957a3 --- /dev/null +++ b/Listify/app/src/main/res/drawable/ic_baseline_add_28.xml @@ -0,0 +1,5 @@ + + + diff --git a/Listify/app/src/main/res/layout/activity_item_details.xml b/Listify/app/src/main/res/layout/activity_item_details.xml new file mode 100644 index 0000000..feace5e --- /dev/null +++ b/Listify/app/src/main/res/layout/activity_item_details.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Listify/app/src/main/res/layout/content_item_details.xml b/Listify/app/src/main/res/layout/content_item_details.xml new file mode 100644 index 0000000..35c243a --- /dev/null +++ b/Listify/app/src/main/res/layout/content_item_details.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Listify/app/src/main/res/values/colors.xml b/Listify/app/src/main/res/values/colors.xml index c6d89eb..a9055a6 100644 --- a/Listify/app/src/main/res/values/colors.xml +++ b/Listify/app/src/main/res/values/colors.xml @@ -10,4 +10,5 @@ #ffffff #ebeef0 #1c9ef4 + #e6e6e6 \ No newline at end of file diff --git a/Listify/app/src/main/res/values/dimens.xml b/Listify/app/src/main/res/values/dimens.xml index 4ab4520..2a14b50 100644 --- a/Listify/app/src/main/res/values/dimens.xml +++ b/Listify/app/src/main/res/values/dimens.xml @@ -5,4 +5,9 @@ 8dp 176dp 16dp + 20dp + + 55dp + 105dp + 155dp \ No newline at end of file diff --git a/Listify/app/src/main/res/values/strings.xml b/Listify/app/src/main/res/values/strings.xml index 6299f7d..8869c5d 100644 --- a/Listify/app/src/main/res/values/strings.xml +++ b/Listify/app/src/main/res/values/strings.xml @@ -29,4 +29,5 @@ Search Button SearchResults Store selection + ItemDetails \ No newline at end of file From b269bc6e78e44ced61dfeed9255d846c95d134aa Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sat, 3 Oct 2020 21:50:21 -0400 Subject: [PATCH 04/17] Item details layout --- .../java/com/example/listify/ItemDetails.java | 35 +++++++--- .../main/res/drawable/ic_baseline_add_28.xml | 2 +- .../res/drawable/ic_baseline_create_28.xml | 5 ++ .../res/drawable/ic_baseline_post_add_28.xml | 9 +++ .../main/res/layout/activity_item_details.xml | 68 +++++++++++++------ .../main/res/layout/content_item_details.xml | 67 +++++++++--------- Listify/app/src/main/res/values/strings.xml | 7 ++ 7 files changed, 128 insertions(+), 65 deletions(-) create mode 100644 Listify/app/src/main/res/drawable/ic_baseline_create_28.xml create mode 100644 Listify/app/src/main/res/drawable/ic_baseline_post_add_28.xml diff --git a/Listify/app/src/main/java/com/example/listify/ItemDetails.java b/Listify/app/src/main/java/com/example/listify/ItemDetails.java index 8b70f19..8da738f 100644 --- a/Listify/app/src/main/java/com/example/listify/ItemDetails.java +++ b/Listify/app/src/main/java/com/example/listify/ItemDetails.java @@ -9,15 +9,19 @@ 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; public class ItemDetails extends AppCompatActivity { private Product curProduct; - private FloatingActionButton fab1; - private FloatingActionButton fab2; + private LinearLayout lin1; + private LinearLayout lin2; + private TextView tvCreateNew; + private TextView tvAddItem; private TextView tvItemName; private TextView tvStoreName; private ImageView itemImage; + private TextView tvItemPrice; private TextView tvItemDesc; private ImageButton backToSearchbutton; @@ -33,8 +37,10 @@ public class ItemDetails extends AppCompatActivity { curProduct = (Product) getIntent().getSerializableExtra("SelectedProduct"); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); - fab1 = (FloatingActionButton) findViewById(R.id.fab1); - fab2 = (FloatingActionButton) findViewById(R.id.fab2); +// fab1 = (FloatingActionButton) findViewById(R.id.fab1); +// fab2 = (FloatingActionButton) findViewById(R.id.fab2); + lin1 = (LinearLayout) findViewById(R.id.lin1); + lin2 = (LinearLayout) findViewById(R.id.lin2); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -55,9 +61,18 @@ public class ItemDetails extends AppCompatActivity { tvStoreName = (TextView) findViewById(R.id.store_name); tvStoreName.setText(curProduct.getChainName()); + tvItemPrice = (TextView) findViewById(R.id.item_price); + tvItemPrice.setText(String.format("$%.2f", curProduct.getPrice())); + tvItemDesc = (TextView) findViewById(R.id.item_desc); tvItemDesc.setText(curProduct.getDescription()); + tvCreateNew = (TextView) findViewById(R.id.create_new_list); + tvCreateNew.setVisibility(View.INVISIBLE); + + tvAddItem = (TextView) findViewById(R.id.add_item_to_list); + tvAddItem.setVisibility(View.INVISIBLE); + backToSearchbutton = (ImageButton) findViewById(R.id.back_to_search_results_button); backToSearchbutton.setOnClickListener(new View.OnClickListener() { @Override @@ -69,14 +84,18 @@ public class ItemDetails extends AppCompatActivity { private void showFABMenu(){ isFABOpen=true; - fab1.animate().translationY(-getResources().getDimension(R.dimen.standard_55)); - fab2.animate().translationY(-getResources().getDimension(R.dimen.standard_105)); + lin1.animate().translationY(-getResources().getDimension(R.dimen.standard_55)); + lin2.animate().translationY(-getResources().getDimension(R.dimen.standard_105)); + tvAddItem.setVisibility(View.VISIBLE); + tvCreateNew.setVisibility(View.VISIBLE); } private void closeFABMenu(){ isFABOpen=false; - fab1.animate().translationY(0); - fab2.animate().translationY(0); + lin1.animate().translationY(0); + lin2.animate().translationY(0); + tvAddItem.setVisibility(View.INVISIBLE); + tvCreateNew.setVisibility(View.INVISIBLE); } diff --git a/Listify/app/src/main/res/drawable/ic_baseline_add_28.xml b/Listify/app/src/main/res/drawable/ic_baseline_add_28.xml index 28957a3..f320e60 100644 --- a/Listify/app/src/main/res/drawable/ic_baseline_add_28.xml +++ b/Listify/app/src/main/res/drawable/ic_baseline_add_28.xml @@ -1,4 +1,4 @@ - diff --git a/Listify/app/src/main/res/drawable/ic_baseline_create_28.xml b/Listify/app/src/main/res/drawable/ic_baseline_create_28.xml new file mode 100644 index 0000000..3740c94 --- /dev/null +++ b/Listify/app/src/main/res/drawable/ic_baseline_create_28.xml @@ -0,0 +1,5 @@ + + + diff --git a/Listify/app/src/main/res/drawable/ic_baseline_post_add_28.xml b/Listify/app/src/main/res/drawable/ic_baseline_post_add_28.xml new file mode 100644 index 0000000..4b9cc60 --- /dev/null +++ b/Listify/app/src/main/res/drawable/ic_baseline_post_add_28.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/Listify/app/src/main/res/layout/activity_item_details.xml b/Listify/app/src/main/res/layout/activity_item_details.xml index feace5e..6ad4ac1 100644 --- a/Listify/app/src/main/res/layout/activity_item_details.xml +++ b/Listify/app/src/main/res/layout/activity_item_details.xml @@ -34,21 +34,56 @@ - + android:layout_marginBottom="22dp"> - + + + + + + android:layout_marginBottom="22dp"> + + + + + + + + - - - - - - - - - \ No newline at end of file diff --git a/Listify/app/src/main/res/layout/content_item_details.xml b/Listify/app/src/main/res/layout/content_item_details.xml index 35c243a..0e98ba7 100644 --- a/Listify/app/src/main/res/layout/content_item_details.xml +++ b/Listify/app/src/main/res/layout/content_item_details.xml @@ -13,28 +13,24 @@ android:layout_marginStart="50dp" android:layout_marginTop="16dp" android:layout_marginEnd="50dp" - android:text="Product Name" + android:text="@string/default_product_name" android:textSize="16sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - - - - - - - - - - - - - - + + app:layout_constraintTop_toTopOf="parent" + android:contentDescription="@string/product_image_description" /> + + - - \ No newline at end of file diff --git a/Listify/app/src/main/res/values/strings.xml b/Listify/app/src/main/res/values/strings.xml index 8869c5d..2de5c80 100644 --- a/Listify/app/src/main/res/values/strings.xml +++ b/Listify/app/src/main/res/values/strings.xml @@ -30,4 +30,11 @@ SearchResults Store selection ItemDetails + Add to list + Create new list + Product Name + Store + $00.00 + Description + Product Image \ No newline at end of file From afe15703eeb66d8b5e7b24af6555472b506637bb Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sun, 4 Oct 2020 00:13:31 -0400 Subject: [PATCH 05/17] Adapter and ShoppingList class for displaying shopping lists --- .../com/example/listify/MainActivity.java | 1 + .../adapter/DisplayShoppingListsAdapter.java | 56 ++++++++++++++ .../example/listify/model/ShoppingList.java | 74 +++++++++++++++++++ .../layout/display_shopping_lists_item.xml | 8 ++ 4 files changed, 139 insertions(+) create mode 100644 Listify/app/src/main/java/com/example/listify/adapter/DisplayShoppingListsAdapter.java create mode 100644 Listify/app/src/main/java/com/example/listify/model/ShoppingList.java create mode 100644 Listify/app/src/main/res/layout/display_shopping_lists_item.xml 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 0549e08..2575fb3 100644 --- a/Listify/app/src/main/java/com/example/listify/MainActivity.java +++ b/Listify/app/src/main/java/com/example/listify/MainActivity.java @@ -82,6 +82,7 @@ public class MainActivity extends AppCompatActivity { NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration); NavigationUI.setupWithNavController(navigationView, navController); + // Handle search button click ImageButton searchButton = (ImageButton) findViewById(R.id.searchButton); searchButton.setOnClickListener(new View.OnClickListener() { diff --git a/Listify/app/src/main/java/com/example/listify/adapter/DisplayShoppingListsAdapter.java b/Listify/app/src/main/java/com/example/listify/adapter/DisplayShoppingListsAdapter.java new file mode 100644 index 0000000..6e94238 --- /dev/null +++ b/Listify/app/src/main/java/com/example/listify/adapter/DisplayShoppingListsAdapter.java @@ -0,0 +1,56 @@ +package com.example.listify.adapter; + +import android.app.Activity; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; +import com.example.listify.R; +import com.example.listify.model.ShoppingList; + +import java.util.ArrayList; + +public class DisplayShoppingListsAdapter extends BaseAdapter { + private Activity activity; + private ArrayList lists; + private LayoutInflater inflater; + + public DisplayShoppingListsAdapter(Activity activity, ArrayList lists){ + this.activity = activity; + this.lists = lists; + } + + @Override + public int getCount() { + return lists.size(); + } + + @Override + public Object getItem(int position) { + return lists.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (inflater == null) { + inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + } + if (convertView == null) { + convertView = inflater.inflate(R.layout.search_list_item, null); + } + + ShoppingList curList = lists.get(position); + + TextView tvListName = (TextView) convertView.findViewById(R.id.shopping_list_name); + tvListName.setText(curList.getName()); + + return convertView; + } +} diff --git a/Listify/app/src/main/java/com/example/listify/model/ShoppingList.java b/Listify/app/src/main/java/com/example/listify/model/ShoppingList.java new file mode 100644 index 0000000..d833eed --- /dev/null +++ b/Listify/app/src/main/java/com/example/listify/model/ShoppingList.java @@ -0,0 +1,74 @@ +package com.example.listify.model; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.ArrayList; +import java.util.Collection; + +public class ShoppingList extends ArrayList { + private ArrayList list; + private String name; + + public ShoppingList(String name) { + list = new ArrayList(); + this.name = name; + } + + public Product get(int position) { + return this.list.get(position); + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public int size() { + return list.size(); + } + + @Override + public boolean isEmpty() { + return list.isEmpty(); + } + + @Override + public boolean contains(@Nullable Object o) { + return list.contains(o); + } + + @Override + public int indexOf(@Nullable Object o) { + return list.indexOf(o); + } + + @Override + public boolean add(Product product) { + return list.add(product); + } + + @Override + public Product remove(int index) { + return list.remove(index); + } + + @Override + public void clear() { + list.clear(); + } + + @Override + public boolean remove(@Nullable Object o) { + return list.remove(o); + } + + @Override + public boolean addAll(@NonNull Collection c) { + return list.addAll(c); + } +} diff --git a/Listify/app/src/main/res/layout/display_shopping_lists_item.xml b/Listify/app/src/main/res/layout/display_shopping_lists_item.xml new file mode 100644 index 0000000..45c92e4 --- /dev/null +++ b/Listify/app/src/main/res/layout/display_shopping_lists_item.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file From 64d4fb0192130ddaffd3e508b49a65d03461a855 Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sun, 4 Oct 2020 00:47:27 -0400 Subject: [PATCH 06/17] Fix search results not filtering by store selection --- .../com/example/listify/SearchResults.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 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 e87fd48..328f273 100644 --- a/Listify/app/src/main/java/com/example/listify/SearchResults.java +++ b/Listify/app/src/main/java/com/example/listify/SearchResults.java @@ -137,12 +137,16 @@ public class SearchResults extends AppCompatActivity implements SortDialogFragme Product d = new Product("Video Game", "0003", "Walmart", "0001", "0123456783", "Fun Vidya Gaemz", "Electronics", 60.00, "9/24/2020", "1", "https://i1.wp.com/bestlifeonline.com/wp-content/uploads/2018/06/cat-meme-67.jpg?resize=1024%2C1024&ssl=1"); Product e = new Product("Mountain Dew", "0004", "Walmart", "0001", "0123456784", "Gamer fuel", "Grocery", 5.87, "9/24/2020", "1", "https://memeguy.com/photos/images/gaming-cat-7680.png"); Product f = new Product("Tire", "0005", "Walmart", "0001", "0123456785", "30 inch rims", "Automotive", 146.97, "9/24/2020", "1", "http://cdn.sheknows.com/articles/2013/05/pet5.jpg"); + Product g = new Product("Bottled Water", "0000", "Target", "0001", "0123456780", "Bro, it's water...", "Grocery", 13.37, "9/24/2020", "1", "http://3.bp.blogspot.com/-MfroPPQVDKo/UyhUZWqGvkI/AAAAAAAAB-I/DGk622onsvc/s1600/lettuce-b-kool-cat-meme.jpg"); + Product h = new Product("Tin Foil", "0001", "Kroger", "0001", "0123456781", "Not aluminum foil", "Grocery", 1.00, "9/24/2020", "1", "https://i.ytimg.com/vi/q9N1doYMxR0/maxresdefault.jpg"); resultsProductList.add(a); resultsProductList.add(b); resultsProductList.add(c); resultsProductList.add(d); resultsProductList.add(e); resultsProductList.add(f); + resultsProductList.add(g); + resultsProductList.add(h); } // Create a list of all stores in the results so the user can filter by store name @@ -173,8 +177,7 @@ public class SearchResults extends AppCompatActivity implements SortDialogFragme case 0: resultsProductListSorted.clear(); resultsProductListSorted.addAll(resultsProductList); - searchResultsListAdapter.notifyDataSetChanged(); - return; + break; case 1: resultsProductListSorted.sort(new Comparator() { @Override @@ -219,7 +222,7 @@ public class SearchResults extends AppCompatActivity implements SortDialogFragme break; } - if (this.descending) { + if (this.sortMode != 0 & this.descending) { for (int i = 0; i < resultsProductListSorted.size() / 2; i++) { Product temp = resultsProductListSorted.get(i); resultsProductListSorted.set(i, resultsProductListSorted.get(resultsProductListSorted.size() - i - 1)); @@ -227,6 +230,18 @@ public class SearchResults extends AppCompatActivity implements SortDialogFragme } } + // Only keep results that match the current store selection + if (this.storeSelection != 0) { + ArrayList temp = new ArrayList<>(); + resultsProductListSorted.forEach(product -> { + if (product.getChainName().equals(this.stores.get(this.storeSelection - 1))) { + temp.add(product); + } + }); + resultsProductListSorted.clear(); + resultsProductListSorted.addAll(temp); + } + searchResultsListAdapter.notifyDataSetChanged(); } } \ No newline at end of file From 4a1bab20012d4f5de89f67ca324b5a108601bb4d Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sun, 4 Oct 2020 19:48:00 -0400 Subject: [PATCH 07/17] Display users lists --- .../com/example/listify/MainActivity.java | 4 +- .../adapter/DisplayShoppingListsAdapter.java | 2 +- .../listify/ui/lists/ListsFragment.java | 53 +++++++++++++++++++ .../res/drawable/ic_baseline_list_alt_28.xml | 5 ++ .../app/src/main/res/layout/app_bar_lists.xml | 46 ++++++++++++++++ .../layout/display_shopping_lists_item.xml | 16 +++++- .../src/main/res/layout/fragment_lists.xml | 22 ++++++++ .../main/res/menu/activity_main_drawer.xml | 4 ++ Listify/app/src/main/res/menu/lists_menu.xml | 9 ++++ .../main/res/navigation/mobile_navigation.xml | 6 +++ Listify/app/src/main/res/values/strings.xml | 1 + 11 files changed, 163 insertions(+), 5 deletions(-) create mode 100644 Listify/app/src/main/java/com/example/listify/ui/lists/ListsFragment.java create mode 100644 Listify/app/src/main/res/drawable/ic_baseline_list_alt_28.xml create mode 100644 Listify/app/src/main/res/layout/app_bar_lists.xml create mode 100644 Listify/app/src/main/res/layout/fragment_lists.xml create mode 100644 Listify/app/src/main/res/menu/lists_menu.xml 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 2575fb3..3cdd75b 100644 --- a/Listify/app/src/main/java/com/example/listify/MainActivity.java +++ b/Listify/app/src/main/java/com/example/listify/MainActivity.java @@ -76,13 +76,13 @@ public class MainActivity extends AppCompatActivity { NavigationView navigationView = findViewById(R.id.nav_view); // Passing each menu ID as a set of Ids because each menu should be considered as top level destinations. mAppBarConfiguration = new AppBarConfiguration.Builder( - R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow) + R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow, R.id.nav_lists) .setDrawerLayout(drawer) .build(); NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment); NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration); NavigationUI.setupWithNavController(navigationView, navController); - + // Handle search button click ImageButton searchButton = (ImageButton) findViewById(R.id.searchButton); searchButton.setOnClickListener(new View.OnClickListener() { diff --git a/Listify/app/src/main/java/com/example/listify/adapter/DisplayShoppingListsAdapter.java b/Listify/app/src/main/java/com/example/listify/adapter/DisplayShoppingListsAdapter.java index 6e94238..4de7e08 100644 --- a/Listify/app/src/main/java/com/example/listify/adapter/DisplayShoppingListsAdapter.java +++ b/Listify/app/src/main/java/com/example/listify/adapter/DisplayShoppingListsAdapter.java @@ -43,7 +43,7 @@ public class DisplayShoppingListsAdapter extends BaseAdapter { inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } if (convertView == null) { - convertView = inflater.inflate(R.layout.search_list_item, null); + convertView = inflater.inflate(R.layout.display_shopping_lists_item, null); } ShoppingList curList = lists.get(position); diff --git a/Listify/app/src/main/java/com/example/listify/ui/lists/ListsFragment.java b/Listify/app/src/main/java/com/example/listify/ui/lists/ListsFragment.java new file mode 100644 index 0000000..b188136 --- /dev/null +++ b/Listify/app/src/main/java/com/example/listify/ui/lists/ListsFragment.java @@ -0,0 +1,53 @@ +package com.example.listify.ui.lists; + +import android.os.Bundle; +import android.view.View; +import android.view.ViewGroup; +import android.view.LayoutInflater; +import android.widget.AdapterView; +import android.widget.ListView; +import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.Fragment; + +import com.example.listify.MainActivity; +import com.example.listify.R; +import com.example.listify.adapter.DisplayShoppingListsAdapter; +import com.example.listify.model.ShoppingList; + +import java.util.ArrayList; + +public class ListsFragment extends Fragment { + ListView shoppingListsView; + + public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View root = inflater.inflate(R.layout.fragment_lists, container, false); + +// Toolbar toolbar = (Toolbar) root.findViewById(R.id.toolbar_lists); +// ((AppCompatActivity)getActivity()).setActionBar(toolbar); + + // Hardcode shopping lists to demonstrate displaying lists + shoppingListsView = root.findViewById(R.id.shopping_lists); + ShoppingList a = new ShoppingList("first list"); + ShoppingList b = new ShoppingList("Groceries"); + ShoppingList c = new ShoppingList("Expensive Stuff"); + ArrayList shoppingLists = new ArrayList<>(); + shoppingLists.add(a); + shoppingLists.add(b); + shoppingLists.add(c); + + // Set adapter and display this users lists + DisplayShoppingListsAdapter displayShoppingListsAdapter = new DisplayShoppingListsAdapter(getActivity(), shoppingLists); + shoppingListsView.setAdapter(displayShoppingListsAdapter); + shoppingListsView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Toast.makeText(getContext(), "open and display " + shoppingLists.get(position).getName(), Toast.LENGTH_SHORT).show(); + } + }); + + return root; + } +} \ No newline at end of file diff --git a/Listify/app/src/main/res/drawable/ic_baseline_list_alt_28.xml b/Listify/app/src/main/res/drawable/ic_baseline_list_alt_28.xml new file mode 100644 index 0000000..e8b9972 --- /dev/null +++ b/Listify/app/src/main/res/drawable/ic_baseline_list_alt_28.xml @@ -0,0 +1,5 @@ + + + diff --git a/Listify/app/src/main/res/layout/app_bar_lists.xml b/Listify/app/src/main/res/layout/app_bar_lists.xml new file mode 100644 index 0000000..6f0d3ab --- /dev/null +++ b/Listify/app/src/main/res/layout/app_bar_lists.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Listify/app/src/main/res/layout/display_shopping_lists_item.xml b/Listify/app/src/main/res/layout/display_shopping_lists_item.xml index 45c92e4..5419294 100644 --- a/Listify/app/src/main/res/layout/display_shopping_lists_item.xml +++ b/Listify/app/src/main/res/layout/display_shopping_lists_item.xml @@ -1,8 +1,20 @@ + android:layout_width="match_parent" + android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto"> + android:layout_height="wrap_content" + android:layout_marginStart="8dp" + android:layout_marginTop="10dp" + android:layout_marginBottom="10dp" + android:layout_marginEnd="8dp" + android:textSize="20sp" + android:textStyle="bold" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> \ No newline at end of file diff --git a/Listify/app/src/main/res/layout/fragment_lists.xml b/Listify/app/src/main/res/layout/fragment_lists.xml new file mode 100644 index 0000000..fc4831a --- /dev/null +++ b/Listify/app/src/main/res/layout/fragment_lists.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/Listify/app/src/main/res/menu/activity_main_drawer.xml b/Listify/app/src/main/res/menu/activity_main_drawer.xml index d7f2df2..f95fd19 100644 --- a/Listify/app/src/main/res/menu/activity_main_drawer.xml +++ b/Listify/app/src/main/res/menu/activity_main_drawer.xml @@ -16,5 +16,9 @@ android:id="@+id/nav_slideshow" android:icon="@drawable/ic_menu_slideshow" android:title="@string/menu_slideshow" /> + \ No newline at end of file diff --git a/Listify/app/src/main/res/menu/lists_menu.xml b/Listify/app/src/main/res/menu/lists_menu.xml new file mode 100644 index 0000000..493c783 --- /dev/null +++ b/Listify/app/src/main/res/menu/lists_menu.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/Listify/app/src/main/res/navigation/mobile_navigation.xml b/Listify/app/src/main/res/navigation/mobile_navigation.xml index a8103d9..274deba 100644 --- a/Listify/app/src/main/res/navigation/mobile_navigation.xml +++ b/Listify/app/src/main/res/navigation/mobile_navigation.xml @@ -22,4 +22,10 @@ android:name="com.example.listify.ui.slideshow.SlideshowFragment" android:label="@string/menu_slideshow" tools:layout="@layout/fragment_slideshow" /> + + \ No newline at end of file diff --git a/Listify/app/src/main/res/values/strings.xml b/Listify/app/src/main/res/values/strings.xml index 6299f7d..293ec9c 100644 --- a/Listify/app/src/main/res/values/strings.xml +++ b/Listify/app/src/main/res/values/strings.xml @@ -29,4 +29,5 @@ Search Button SearchResults Store selection + My Lists \ No newline at end of file From dd13995ffefe632dd89e9a57439a06d6f755e452 Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Sun, 4 Oct 2020 21:17:02 -0400 Subject: [PATCH 08/17] Fix bug in search results sorting --- .../src/main/java/com/example/listify/SearchResults.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 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 328f273..28d6d8d 100644 --- a/Listify/app/src/main/java/com/example/listify/SearchResults.java +++ b/Listify/app/src/main/java/com/example/listify/SearchResults.java @@ -165,6 +165,10 @@ public class SearchResults extends AppCompatActivity implements SortDialogFragme // Sorts the search results private void sortResults() { + // Reset the filtered list + resultsProductListSorted.clear(); + resultsProductListSorted.addAll(resultsProductList); + // Sort Modes // 0 default (no sorting) // 1 itemName @@ -175,8 +179,7 @@ public class SearchResults extends AppCompatActivity implements SortDialogFragme // Sort based on mode switch (this.sortMode) { case 0: - resultsProductListSorted.clear(); - resultsProductListSorted.addAll(resultsProductList); + // Do nothing break; case 1: resultsProductListSorted.sort(new Comparator() { From 12bee4c48cfb23c1ab00f8c1d3f3c116f67ca583 Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Mon, 5 Oct 2020 19:57:39 -0400 Subject: [PATCH 09/17] Add floating action button to lists fragment --- .../java/com/example/listify/ui/lists/ListsFragment.java | 9 +++++++++ Listify/app/src/main/res/layout/fragment_lists.xml | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/Listify/app/src/main/java/com/example/listify/ui/lists/ListsFragment.java b/Listify/app/src/main/java/com/example/listify/ui/lists/ListsFragment.java index b188136..de5585a 100644 --- a/Listify/app/src/main/java/com/example/listify/ui/lists/ListsFragment.java +++ b/Listify/app/src/main/java/com/example/listify/ui/lists/ListsFragment.java @@ -16,6 +16,7 @@ import com.example.listify.MainActivity; import com.example.listify.R; import com.example.listify.adapter.DisplayShoppingListsAdapter; import com.example.listify.model.ShoppingList; +import com.google.android.material.floatingactionbutton.FloatingActionButton; import java.util.ArrayList; @@ -48,6 +49,14 @@ public class ListsFragment extends Fragment { } }); + FloatingActionButton fab = (FloatingActionButton) root.findViewById(R.id.new_list_fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(getContext(), "yo", Toast.LENGTH_SHORT).show(); + } + }); + return root; } } \ No newline at end of file diff --git a/Listify/app/src/main/res/layout/fragment_lists.xml b/Listify/app/src/main/res/layout/fragment_lists.xml index fc4831a..19493ab 100644 --- a/Listify/app/src/main/res/layout/fragment_lists.xml +++ b/Listify/app/src/main/res/layout/fragment_lists.xml @@ -19,4 +19,13 @@ android:divider="@color/list_divider" android:dividerHeight="1dp"/> + + \ No newline at end of file From 5fe666fbbb0b597cf14f953d98d20aa2ba7028d4 Mon Sep 17 00:00:00 2001 From: Clayton Wilson Date: Mon, 5 Oct 2020 21:24:50 -0400 Subject: [PATCH 10/17] Add-to-list dialog and functionality on item details page --- .../java/com/example/listify/ItemDetails.java | 59 +++++++-- .../listify/ListPickerDialogFragment.java | 121 ++++++++++++++++++ .../adapter/DisplayShoppingListsAdapter.java | 55 ++++++++ .../example/listify/model/ShoppingList.java | 74 +++++++++++ .../main/res/layout/activity_item_details.xml | 4 +- .../main/res/layout/dialog_add_to_list.xml | 41 ++++++ .../layout/display_shopping_lists_item.xml | 20 +++ 7 files changed, 361 insertions(+), 13 deletions(-) create mode 100644 Listify/app/src/main/java/com/example/listify/ListPickerDialogFragment.java create mode 100644 Listify/app/src/main/java/com/example/listify/adapter/DisplayShoppingListsAdapter.java create mode 100644 Listify/app/src/main/java/com/example/listify/model/ShoppingList.java create mode 100644 Listify/app/src/main/res/layout/dialog_add_to_list.xml create mode 100644 Listify/app/src/main/res/layout/display_shopping_lists_item.xml diff --git a/Listify/app/src/main/java/com/example/listify/ItemDetails.java b/Listify/app/src/main/java/com/example/listify/ItemDetails.java index 8da738f..2417b93 100644 --- a/Listify/app/src/main/java/com/example/listify/ItemDetails.java +++ b/Listify/app/src/main/java/com/example/listify/ItemDetails.java @@ -1,8 +1,12 @@ package com.example.listify; import android.os.Bundle; + +import com.amazonaws.services.cognitoidentityprovider.model.TooManyFailedAttemptsException; import com.bumptech.glide.Glide; +import com.example.listify.adapter.DisplayShoppingListsAdapter; import com.example.listify.model.Product; +import com.example.listify.model.ShoppingList; import com.google.android.material.floatingactionbutton.FloatingActionButton; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; @@ -11,11 +15,14 @@ import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; +import android.widget.Toast; -public class ItemDetails extends AppCompatActivity { +import java.util.ArrayList; + +public class ItemDetails extends AppCompatActivity implements ListPickerDialogFragment.OnListPickListener { private Product curProduct; - private LinearLayout lin1; - private LinearLayout lin2; + private LinearLayout linAddItem; + private LinearLayout linCreateList; private TextView tvCreateNew; private TextView tvAddItem; private TextView tvItemName; @@ -25,6 +32,8 @@ public class ItemDetails extends AppCompatActivity { private TextView tvItemDesc; private ImageButton backToSearchbutton; + ArrayList shoppingLists = new ArrayList<>(); + private boolean isFABOpen = false; @Override @@ -34,13 +43,13 @@ public class ItemDetails extends AppCompatActivity { Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); + // Load Product object from search results activity curProduct = (Product) getIntent().getSerializableExtra("SelectedProduct"); + // Set up floating action buttons FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); -// fab1 = (FloatingActionButton) findViewById(R.id.fab1); -// fab2 = (FloatingActionButton) findViewById(R.id.fab2); - lin1 = (LinearLayout) findViewById(R.id.lin1); - lin2 = (LinearLayout) findViewById(R.id.lin2); + linAddItem = (LinearLayout) findViewById(R.id.lin_add_item); + linCreateList = (LinearLayout) findViewById(R.id.lin_create_list); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { @@ -52,6 +61,30 @@ public class ItemDetails extends AppCompatActivity { } }); + linAddItem.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + closeFABMenu(); + + // Hardcode shopping lists to demonstrate displaying lists + for (int i = 0; i < 10; i++) { + shoppingLists.add(new ShoppingList(Integer.toString(i))); + } + + ListPickerDialogFragment listPickerDialog = new ListPickerDialogFragment(shoppingLists); + listPickerDialog.show(getSupportFragmentManager(), "User Lists"); + } + }); + + linCreateList.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(ItemDetails.this, "create", Toast.LENGTH_SHORT).show(); + closeFABMenu(); + } + }); + + // Set data tvItemName = (TextView) findViewById(R.id.item_name); tvItemName.setText(curProduct.getItemName()); @@ -84,19 +117,23 @@ public class ItemDetails extends AppCompatActivity { private void showFABMenu(){ isFABOpen=true; - lin1.animate().translationY(-getResources().getDimension(R.dimen.standard_55)); - lin2.animate().translationY(-getResources().getDimension(R.dimen.standard_105)); + linAddItem.animate().translationY(-getResources().getDimension(R.dimen.standard_55)); + linCreateList.animate().translationY(-getResources().getDimension(R.dimen.standard_105)); tvAddItem.setVisibility(View.VISIBLE); tvCreateNew.setVisibility(View.VISIBLE); } private void closeFABMenu(){ isFABOpen=false; - lin1.animate().translationY(0); - lin2.animate().translationY(0); + linAddItem.animate().translationY(0); + linCreateList.animate().translationY(0); tvAddItem.setVisibility(View.INVISIBLE); tvCreateNew.setVisibility(View.INVISIBLE); } + @Override + public void sendListSelection(int selectedListIndex, int quantity) { + Toast.makeText(this, String.format("%d of Item added to %s", quantity, shoppingLists.get(selectedListIndex).getName()), Toast.LENGTH_SHORT).show(); + } } \ No newline at end of file diff --git a/Listify/app/src/main/java/com/example/listify/ListPickerDialogFragment.java b/Listify/app/src/main/java/com/example/listify/ListPickerDialogFragment.java new file mode 100644 index 0000000..b9f7310 --- /dev/null +++ b/Listify/app/src/main/java/com/example/listify/ListPickerDialogFragment.java @@ -0,0 +1,121 @@ +package com.example.listify; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.AdapterView; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ListView; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; +import com.example.listify.adapter.DisplayShoppingListsAdapter; +import com.example.listify.model.ShoppingList; +import java.util.ArrayList; + + +public class ListPickerDialogFragment extends DialogFragment { + + public interface OnListPickListener { + void sendListSelection(int selectedListIndex, int quantity); + } + + public OnListPickListener onListPickListener; + + ListView userListsView; + DisplayShoppingListsAdapter displayShoppingListsAdapter; + Button btnMinus; + Button btnPlus; + EditText etQuantity; + private ArrayList userLists; + private int selectedListIndex; + + public ListPickerDialogFragment(ArrayList userLists) { + this.userLists = userLists; + } + + + @Override + public Dialog onCreateDialog(final Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + // Get the layout inflater + LayoutInflater inflater = requireActivity().getLayoutInflater(); + + // Inflate and set the layout for the dialog + // Pass null as the parent view because its going in the dialog layout + View root = inflater.inflate(R.layout.dialog_add_to_list, null); + builder.setView(root) + // Add action buttons + .setPositiveButton("OK", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + onListPickListener.sendListSelection(selectedListIndex, Integer.parseInt(etQuantity.getText().toString())); + } + }) + .setNegativeButton("cancel", new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + ListPickerDialogFragment.this.getDialog().cancel(); + } + }); + + // Display user's shopping lists + userListsView = (ListView) root.findViewById(R.id.user_lists); + displayShoppingListsAdapter = new DisplayShoppingListsAdapter(getActivity(), userLists); + userListsView.setAdapter(displayShoppingListsAdapter); + + userListsView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + for (int i = 0; i < parent.getChildCount(); i++) { + parent.getChildAt(i).setBackgroundColor(Color.TRANSPARENT); + } + + view.setBackgroundColor(Color.GREEN); + selectedListIndex = position; + } + }); + + // Set up quantity selection + etQuantity = (EditText) root.findViewById(R.id.et_quantity); + + btnMinus = (Button) root.findViewById(R.id.btn_minus); + btnMinus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int curQauntity = Integer.parseInt(etQuantity.getText().toString()); + if (curQauntity > 0) { + curQauntity--; + etQuantity.setText(String.format("%d", curQauntity)); + } + } + }); + + btnPlus = (Button) root.findViewById(R.id.btn_plus); + btnPlus.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + int curQauntity = Integer.parseInt(etQuantity.getText().toString()); + curQauntity++; + etQuantity.setText(String.format("%d", curQauntity)); + } + }); + + return builder.create(); + } + + // Required to extend DialogFragment + @Override + public void onAttach(@NonNull Context context) { + super.onAttach(context); + try { + onListPickListener = (OnListPickListener) getActivity(); + } catch (ClassCastException e) { + Log.e("ListPickerDialogFragment", "onAttach: ClassCastException: " + e.getMessage()); + } + } +} diff --git a/Listify/app/src/main/java/com/example/listify/adapter/DisplayShoppingListsAdapter.java b/Listify/app/src/main/java/com/example/listify/adapter/DisplayShoppingListsAdapter.java new file mode 100644 index 0000000..056fec5 --- /dev/null +++ b/Listify/app/src/main/java/com/example/listify/adapter/DisplayShoppingListsAdapter.java @@ -0,0 +1,55 @@ +package com.example.listify.adapter; + +import android.app.Activity; +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; +import com.example.listify.R; +import com.example.listify.model.ShoppingList; +import java.util.ArrayList; + +public class DisplayShoppingListsAdapter extends BaseAdapter { + private Activity activity; + private ArrayList lists; + private LayoutInflater inflater; + + public DisplayShoppingListsAdapter(Activity activity, ArrayList lists){ + this.activity = activity; + this.lists = lists; + } + + @Override + public int getCount() { + return lists.size(); + } + + @Override + public Object getItem(int position) { + return lists.get(position); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (inflater == null) { + inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + } + if (convertView == null) { + convertView = inflater.inflate(R.layout.display_shopping_lists_item, null); + } + + ShoppingList curList = lists.get(position); + + TextView tvListName = (TextView) convertView.findViewById(R.id.shopping_list_name); + tvListName.setText(curList.getName()); + + return convertView; + } +} \ No newline at end of file diff --git a/Listify/app/src/main/java/com/example/listify/model/ShoppingList.java b/Listify/app/src/main/java/com/example/listify/model/ShoppingList.java new file mode 100644 index 0000000..0775c30 --- /dev/null +++ b/Listify/app/src/main/java/com/example/listify/model/ShoppingList.java @@ -0,0 +1,74 @@ +package com.example.listify.model; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.util.ArrayList; +import java.util.Collection; + +public class ShoppingList extends ArrayList { + private ArrayList list; + private String name; + + public ShoppingList(String name) { + list = new ArrayList(); + this.name = name; + } + + public Product get(int position) { + return this.list.get(position); + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public int size() { + return list.size(); + } + + @Override + public boolean isEmpty() { + return list.isEmpty(); + } + + @Override + public boolean contains(@Nullable Object o) { + return list.contains(o); + } + + @Override + public int indexOf(@Nullable Object o) { + return list.indexOf(o); + } + + @Override + public boolean add(Product product) { + return list.add(product); + } + + @Override + public Product remove(int index) { + return list.remove(index); + } + + @Override + public void clear() { + list.clear(); + } + + @Override + public boolean remove(@Nullable Object o) { + return list.remove(o); + } + + @Override + public boolean addAll(@NonNull Collection c) { + return list.addAll(c); + } +} \ No newline at end of file diff --git a/Listify/app/src/main/res/layout/activity_item_details.xml b/Listify/app/src/main/res/layout/activity_item_details.xml index 6ad4ac1..49f9f75 100644 --- a/Listify/app/src/main/res/layout/activity_item_details.xml +++ b/Listify/app/src/main/res/layout/activity_item_details.xml @@ -37,7 +37,7 @@ @@ -61,7 +61,7 @@ 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 new file mode 100644 index 0000000..8c93694 --- /dev/null +++ b/Listify/app/src/main/res/layout/dialog_add_to_list.xml @@ -0,0 +1,41 @@ + + + + + + +