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