From da920372ab1c0bd9b79925cb1f86ad9b1f5c0847 Mon Sep 17 00:00:00 2001
From: phanhuuloi27 <73208452+Nezumi2711@users.noreply.github.com>
Date: Sun, 3 Jul 2022 21:03:43 +0700
Subject: [PATCH] Search all food
---
Foodify/app/src/main/AndroidManifest.xml | 13 +-
.../main/java/com/waterbase/foodify/Home.java | 15 +
.../com/waterbase/foodify/SearchActivity.java | 314 ++++++++++++++++++
.../res/drawable/ic_baseline_search_24.xml | 5 +
.../src/main/res/layout/activity_search.xml | 33 ++
Foodify/app/src/main/res/menu/home.xml | 15 +
6 files changed, 391 insertions(+), 4 deletions(-)
create mode 100644 Foodify/app/src/main/java/com/waterbase/foodify/SearchActivity.java
create mode 100644 Foodify/app/src/main/res/drawable/ic_baseline_search_24.xml
create mode 100644 Foodify/app/src/main/res/layout/activity_search.xml
create mode 100644 Foodify/app/src/main/res/menu/home.xml
diff --git a/Foodify/app/src/main/AndroidManifest.xml b/Foodify/app/src/main/AndroidManifest.xml
index cac6fa1..e91c296 100644
--- a/Foodify/app/src/main/AndroidManifest.xml
+++ b/Foodify/app/src/main/AndroidManifest.xml
@@ -20,19 +20,24 @@
android:theme="@style/Theme.Foodify"
tools:replace="android:theme"
tools:targetApi="31">
+
-
+
-
-
+
+
adapter;
+ FirebaseRecyclerAdapter searchAdapter;
+ List suggestList = new ArrayList<>();
+ MaterialSearchBar materialSearchBar;
+
+ RecyclerView recyclerView;
+ RecyclerView.LayoutManager layoutManager;
+
+ FirebaseDatabase database;
+ DatabaseReference foodList;
+
+ //Favorites
+ Database localDB;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_search);
+
+ //Firebase
+ database = FirebaseDatabase.getInstance();
+ foodList = database.getReference("Foods");
+
+ //Local DB
+ localDB = new Database(this);
+
+ recyclerView = (RecyclerView) findViewById(R.id.recyler_search);
+ recyclerView.setHasFixedSize(true);
+ layoutManager = new LinearLayoutManager(this);
+ recyclerView.setLayoutManager(layoutManager);
+
+ //Search
+ materialSearchBar = (MaterialSearchBar) findViewById(R.id.searchBar);
+ materialSearchBar.setHint("Enter your food");
+ loadSuggest();
+ materialSearchBar.setCardViewElevation(10);
+ materialSearchBar.addTextChangeListener(new TextWatcher() {
+ @Override
+ public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+ }
+
+ @Override
+ public void onTextChanged(CharSequence s, int start, int before, int count) {
+ //When user type their text, we will change suggest list
+
+ List suggest = new ArrayList();
+ for (String search : suggestList) {
+ if (search.toLowerCase().contains(materialSearchBar.getText().toLowerCase()))
+ suggest.add(search);
+ }
+ materialSearchBar.setLastSuggestions(suggest);
+ }
+
+ @Override
+ public void afterTextChanged(Editable s) {
+
+ }
+ });
+ materialSearchBar.setOnSearchActionListener(new MaterialSearchBar.OnSearchActionListener() {
+ @Override
+ public void onSearchStateChanged(boolean enabled) {
+ //When search bar is close
+ //Restore original adapter
+ if (!enabled)
+ recyclerView.setAdapter(adapter);
+ }
+
+ @Override
+ public void onSearchConfirmed(CharSequence text) {
+ //When search finish
+ //Show result of search adapter
+ startSearch(text);
+ }
+
+ @Override
+ public void onButtonClicked(int buttonCode) {
+
+ }
+ });
+
+ //Load add foods
+ loadAddFood();
+ }
+
+ private void loadAddFood() {
+ //Create query by category Id
+ Query searchByName = foodList;
+ //Create Options with query
+ FirebaseRecyclerOptions foodOptions = new FirebaseRecyclerOptions.Builder()
+ .setQuery(searchByName, Food.class)
+ .build();
+
+ adapter = new FirebaseRecyclerAdapter(foodOptions) {
+ @Override
+ protected void onBindViewHolder(@NonNull FoodViewHolder viewHolder, int position, @NonNull Food model) {
+ viewHolder.food_name.setText(model.getName());
+
+ if (Integer.parseInt(model.getDiscount()) > 0) {
+ String foodPrice = model.getPrice() + "đ";
+ long newFoodPrice = Long.parseLong(model.getPrice()) - Long.parseLong(model.getPrice()) * Long.parseLong(model.getDiscount()) / 100;
+ SpannableStringBuilder spnBuilder = new SpannableStringBuilder(foodPrice);
+ StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
+ spnBuilder.setSpan(strikethroughSpan, 0, foodPrice.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ viewHolder.food_price.setText(spnBuilder);
+ viewHolder.newPrice.setText(newFoodPrice + "đ");
+ } else {
+ viewHolder.food_price.setText(String.format("%s đ", model.getPrice()));
+ viewHolder.discount.setVisibility(View.GONE);
+ viewHolder.newPrice.setVisibility(View.GONE);
+ }
+
+
+ viewHolder.discount.setText("- " + model.getDiscount() + "%");
+ Picasso.with(getBaseContext()).load(model.getImage()).into(viewHolder.food_image);
+
+ //Quick Cart
+
+ viewHolder.quick_cart.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ boolean ifExists = new Database(getBaseContext()).checkFoodExists(adapter.getRef(viewHolder.getAdapterPosition()).getKey(), Common.currentUser.getPhone());
+ if (!ifExists) {
+ new Database(getBaseContext()).addToCart(new Order(
+ Common.currentUser.getPhone(),
+ adapter.getRef(viewHolder.getAdapterPosition()).getKey(),
+ model.getName(),
+ "1",
+ model.getPrice(),
+ model.getDiscount(),
+ model.getImage()
+ ));
+ } else {
+ new Database(getBaseContext()).increaseCart(Common.currentUser.getPhone(), adapter.getRef(viewHolder.getAdapterPosition()).getKey());
+ }
+
+ Toast.makeText(SearchActivity.this, "Đã thêm vào giỏ hàng!", Toast.LENGTH_SHORT).show();
+ }
+ });
+
+
+ //Add Favorites
+ if (localDB.isFavorite(adapter.getRef(position).getKey(), Common.currentUser.getPhone()))
+ viewHolder.fav_image.setImageResource(R.drawable.ic_baseline_favorite_24);
+
+ //Click to change state of Favorites
+ viewHolder.fav_image.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (!localDB.isFavorite(adapter.getRef(viewHolder.getAdapterPosition()).getKey(), Common.currentUser.getPhone())) {
+ localDB.addToFavorites(adapter.getRef(viewHolder.getAdapterPosition()).getKey(), Common.currentUser.getPhone());
+ viewHolder.fav_image.setImageResource(R.drawable.ic_baseline_favorite_24);
+ Toast.makeText(SearchActivity.this, model.getName() + " đã thêm vào danh sách yêu thích", Toast.LENGTH_SHORT).show();
+ } else {
+ localDB.removeFromFavorites(adapter.getRef(viewHolder.getAdapterPosition()).getKey(), Common.currentUser.getPhone());
+ viewHolder.fav_image.setImageResource(R.drawable.ic_baseline_favorite_border_24);
+ Toast.makeText(SearchActivity.this, model.getName() + " đã xoá khỏi danh sách yêu thích", Toast.LENGTH_SHORT).show();
+ }
+ }
+ });
+
+ viewHolder.setItemClickListener(new ItemClickListener() {
+ @Override
+ public void onClick(View view, int position, boolean isLongClick) {
+ //Start Activity
+ Intent foodDetail = new Intent(SearchActivity.this, FoodDetail.class);
+ foodDetail.putExtra("FoodId", adapter.getRef(position).getKey()); // Send Food Id to new activity
+ startActivity(foodDetail);
+ }
+ });
+ }
+
+ @NonNull
+ @Override
+ public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View itemView = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.food_item, parent, false);
+ return new FoodViewHolder(itemView);
+ }
+ };
+
+ //Set Adapter
+ recyclerView.setAdapter(adapter);
+ adapter.startListening();
+
+ recyclerView.getAdapter().notifyDataSetChanged();
+ recyclerView.scheduleLayoutAnimation();
+ }
+
+ private void loadSuggest() {
+ foodList.addListenerForSingleValueEvent(new ValueEventListener() {
+ @Override
+ public void onDataChange(DataSnapshot dataSnapshot) {
+ for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
+ Food item = postSnapshot.getValue(Food.class);
+ suggestList.add(item.getName());
+ }
+
+ materialSearchBar.setLastSuggestions(suggestList);
+ }
+
+ @Override
+ public void onCancelled(DatabaseError databaseError) {
+
+ }
+ });
+ }
+
+ private void startSearch(CharSequence text) {
+ //Create query by name
+ Query searchByName = foodList.orderByChild("name").equalTo(text.toString());
+ //Create options with query
+ FirebaseRecyclerOptions foodOptions = new FirebaseRecyclerOptions.Builder()
+ .setQuery(searchByName, Food.class)
+ .build();
+ searchAdapter = new FirebaseRecyclerAdapter(foodOptions) {
+ @Override
+ protected void onBindViewHolder(@NonNull FoodViewHolder viewHolder, int i, @NonNull Food model) {
+ viewHolder.food_name.setText(model.getName());
+
+ if (Integer.parseInt(model.getDiscount()) > 0) {
+ String foodPrice = model.getPrice() + "đ";
+ long newFoodPrice = Long.parseLong(model.getPrice()) - Long.parseLong(model.getPrice()) * Long.parseLong(model.getDiscount()) / 100;
+ SpannableStringBuilder spnBuilder = new SpannableStringBuilder(foodPrice);
+ StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
+ spnBuilder.setSpan(strikethroughSpan, 0, foodPrice.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ viewHolder.food_price.setText(spnBuilder);
+ viewHolder.newPrice.setText(newFoodPrice + "đ");
+ } else {
+ viewHolder.food_price.setText(String.format("%s đ", model.getPrice()));
+ viewHolder.discount.setVisibility(View.GONE);
+ viewHolder.newPrice.setVisibility(View.GONE);
+ }
+
+ Picasso.with(getBaseContext()).load(model.getImage()).into(viewHolder.food_image);
+
+ viewHolder.setItemClickListener(new ItemClickListener() {
+ @Override
+ public void onClick(View view, int position, boolean isLongClick) {
+ //Start Activity
+ Intent foodDetail = new Intent(SearchActivity.this, FoodDetail.class);
+ foodDetail.putExtra("FoodId", searchAdapter.getRef(position).getKey()); // Send Food Id to new activity
+ startActivity(foodDetail);
+ }
+ });
+ }
+
+ @NonNull
+ @Override
+ public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ View itemView = LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.food_item, parent, false);
+ return new FoodViewHolder(itemView);
+ }
+ };
+
+ searchAdapter.startListening();
+ recyclerView.setAdapter(searchAdapter); //Set adapter for Recycler View is Search result
+ }
+
+ @Override
+ protected void onStop() {
+ if(adapter != null)
+ adapter.stopListening();
+ if(searchAdapter != null)
+ searchAdapter.stopListening();
+ super.onStop();
+ }
+
+}
\ No newline at end of file
diff --git a/Foodify/app/src/main/res/drawable/ic_baseline_search_24.xml b/Foodify/app/src/main/res/drawable/ic_baseline_search_24.xml
new file mode 100644
index 0000000..e2dd96c
--- /dev/null
+++ b/Foodify/app/src/main/res/drawable/ic_baseline_search_24.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/Foodify/app/src/main/res/layout/activity_search.xml b/Foodify/app/src/main/res/layout/activity_search.xml
new file mode 100644
index 0000000..09be04b
--- /dev/null
+++ b/Foodify/app/src/main/res/layout/activity_search.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Foodify/app/src/main/res/menu/home.xml b/Foodify/app/src/main/res/menu/home.xml
new file mode 100644
index 0000000..fcbc4af
--- /dev/null
+++ b/Foodify/app/src/main/res/menu/home.xml
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file