From 6d5682be6d6873b911180c1faa0691b8ddb4f202 Mon Sep 17 00:00:00 2001 From: Nezumi <123229563+Nez27@users.noreply.github.com> Date: Mon, 20 Feb 2023 13:04:14 +0700 Subject: [PATCH] Init data from API to screen, fix some UI --- .../com/capstone/foodify/API/FoodApi.java | 11 +- .../foodify/Activity/FoodDetailActivity.java | 184 +++++++++++++++++- .../foodify/Fragment/HomeFragment.java | 1 + .../foodify/Fragment/SearchFragment.java | 7 +- .../com/capstone/foodify/Model/Food/Food.java | 34 +++- .../foodify/Model/Food/FoodAdapter.java | 30 +-- .../foodify/Model/Food/ImageFood.java | 37 ++++ .../foodify/Model/Menu/MenuAdapter.java | 2 +- .../main/res/layout/activity_food_detail.xml | 20 +- app/src/main/res/layout/list_foods.xml | 44 +++-- 10 files changed, 306 insertions(+), 64 deletions(-) create mode 100644 app/src/main/java/com/capstone/foodify/Model/Food/ImageFood.java diff --git a/app/src/main/java/com/capstone/foodify/API/FoodApi.java b/app/src/main/java/com/capstone/foodify/API/FoodApi.java index b445f33..c6bfcc3 100644 --- a/app/src/main/java/com/capstone/foodify/API/FoodApi.java +++ b/app/src/main/java/com/capstone/foodify/API/FoodApi.java @@ -2,6 +2,7 @@ package com.capstone.foodify.API; import com.capstone.foodify.Model.Category.Category; import com.capstone.foodify.Model.Food.Food; +import com.capstone.foodify.Model.Food.ImageFood; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -33,12 +34,18 @@ public interface FoodApi { @GET("listFood") Call> listFood(@Query("search") String search, @Query("page") int page, @Query("limit") int limit); + @GET("listFood") + Call> listFood(@Query("page") int page, @Query("limit") int limit); + @GET("Category") Call> listCategory(); @GET("Category/{id}/food") Call> listFoodByCategory(@Path("id") String id); - @GET("listFood") - Call> listFoodByPagination(@Query("page") int page, @Query("limit") int limit); + @GET("detail/{id}") + Call detailFood(@Path("id") String id); + + @GET("detail/{id}/image") + Call> getImageFoodById(@Path("id") String id); } diff --git a/app/src/main/java/com/capstone/foodify/Activity/FoodDetailActivity.java b/app/src/main/java/com/capstone/foodify/Activity/FoodDetailActivity.java index fe05b0a..d44ba7b 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/FoodDetailActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/FoodDetailActivity.java @@ -4,23 +4,50 @@ import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; +import android.widget.Button; import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ProgressBar; +import android.widget.TextView; +import android.widget.Toast; +import com.capstone.foodify.API.FoodApi; +import com.capstone.foodify.Model.Food.Food; +import com.capstone.foodify.Model.Food.ImageFood; import com.capstone.foodify.R; import com.denzcoskun.imageslider.ImageSlider; import com.denzcoskun.imageslider.constants.ScaleTypes; import com.denzcoskun.imageslider.models.SlideModel; import com.mcdev.quantitizerlibrary.AnimationStyle; import com.mcdev.quantitizerlibrary.HorizontalQuantitizer; +import com.mcdev.quantitizerlibrary.QuantitizerListener; +import java.lang.reflect.Array; +import java.text.NumberFormat; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Locale; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; public class FoodDetailActivity extends AppCompatActivity { - HorizontalQuantitizer horizontalQuantitizer; - ImageSlider imageSlider; - ImageView back_image; + private HorizontalQuantitizer horizontalQuantitizer; + private ImageSlider imageSlider; + private ImageView back_image, favourite_icon; + private String foodId = ""; + private Food food; + private static List imageFood = new ArrayList<>(); + private TextView foodName_txt, shopName_txt, discount_txt, description_txt, price_txt, total_txt, countRating_txt, description_content_txt; + private ProgressBar progressBar; + private Button add_to_basket_button; + private LinearLayout linearLayout, linearLayout2, linearLayout3; + private View line; + private float totalPrice, price; + @Override protected void onCreate(Bundle savedInstanceState) { @@ -31,19 +58,53 @@ public class FoodDetailActivity extends AppCompatActivity { horizontalQuantitizer = findViewById(R.id.quantity_option); imageSlider = findViewById(R.id.slider); back_image = findViewById(R.id.back_image); + foodName_txt = findViewById(R.id.food_name_text_view); + shopName_txt = findViewById(R.id.shop_name_text_view); + discount_txt = findViewById(R.id.discount); + description_txt = findViewById(R.id.description_text_view); + price_txt = findViewById(R.id.price); + progressBar = findViewById(R.id.progress_bar); + add_to_basket_button = findViewById(R.id.add_to_basket_button); + linearLayout = findViewById(R.id.linear_layout_1); + linearLayout2 = findViewById(R.id.linear_layout_2); + linearLayout3 = findViewById(R.id.linear_layout_3); + favourite_icon = findViewById(R.id.favorite_icon); + line = findViewById(R.id.line); + total_txt = findViewById(R.id.total_text_view); + countRating_txt = findViewById(R.id.count_rating_text_view); + description_content_txt = findViewById(R.id.content_description_text_view); + hideUI(); + //Customize UI Horizontal Quantitizer horizontalQuantitizer.setTextAnimationStyle(AnimationStyle.SLIDE_IN_REVERSE); horizontalQuantitizer.setPlusIconBackgroundColor(R.color.white); horizontalQuantitizer.setMinusIconBackgroundColor(R.color.white); - List slideModels = new ArrayList<>(); - slideModels.add(new SlideModel("https://firebasestorage.googleapis.com/v0/b/foodify-55954.appspot.com/o/basil-minced-pork-with-rice-fried-egg.jpg?alt=media&token=838ea008-5525-44fb-a5b0-cf77877184a8", null)); - slideModels.add(new SlideModel("https://firebasestorage.googleapis.com/v0/b/foodify-55954.appspot.com/o/delicious-vietnamese-food-including-pho-ga-noodles-spring-rolls-white-table.jpg?alt=media&token=c19919c7-f69d-4933-b955-3fa627e411a0", null)); - slideModels.add(new SlideModel("https://firebasestorage.googleapis.com/v0/b/foodify-55954.appspot.com/o/fried-spring-rolls-cutting-board.jpg?alt=media&token=a2f64b21-578c-427f-bbc8-767280ee82e0", null)); - slideModels.add(new SlideModel("https://firebasestorage.googleapis.com/v0/b/foodify-55954.appspot.com/o/pieces-chicken-fillet-with-mushrooms-stewed-tomato-sauce-with-boiled-broccoli-rice-proper-nutrition-healthy-lifestyle-dietetic-menu-top-view.jpg?alt=media&token=deded3b6-db7b-4a8d-9720-66ddef916d6f", null)); - slideModels.add(new SlideModel("https://firebasestorage.googleapis.com/v0/b/foodify-55954.appspot.com/o/top-view-fresh-delicious-vietnamese-food-table.jpg?alt=media&token=eec8a996-2a12-4b47-b369-8d4d1e91b20a", null)); + horizontalQuantitizer.setQuantitizerListener(new QuantitizerListener() { + @Override + public void onIncrease() { + } - imageSlider.setImageList(slideModels, ScaleTypes.FIT); + @Override + public void onDecrease() { + } + + @Override + public void onValueChanged(int i) { + Locale locale = new Locale("vi", "VN"); + NumberFormat fmt = NumberFormat.getCurrencyInstance(locale); + + if(totalPrice >= 0) + totalPrice = price * i; + add_to_basket_button.setText("Add to basket - " + fmt.format(totalPrice)); + } + }); + + //Get data + if(getIntent() != null) + foodId = getIntent().getStringExtra("FoodId"); + + getImageFoodById(foodId); back_image.setOnClickListener(new View.OnClickListener() { @Override @@ -52,4 +113,107 @@ public class FoodDetailActivity extends AppCompatActivity { } }); } + + private void hideUI() { + horizontalQuantitizer.setVisibility(View.GONE); + imageSlider.setVisibility(View.GONE); + back_image.setVisibility(View.GONE); + shopName_txt.setVisibility(View.GONE); + description_txt.setVisibility(View.GONE); + price_txt.setVisibility(View.GONE); + add_to_basket_button.setVisibility(View.GONE); + linearLayout.setVisibility(View.GONE); + linearLayout2.setVisibility(View.GONE); + linearLayout3.setVisibility(View.GONE); + line.setVisibility(View.GONE); + total_txt.setVisibility(View.GONE); + description_content_txt.setVisibility(View.GONE); + + progressBar.setVisibility(View.VISIBLE); + } + + private void showUI() { + horizontalQuantitizer.setVisibility(View.VISIBLE); + imageSlider.setVisibility(View.VISIBLE); + back_image.setVisibility(View.VISIBLE); + shopName_txt.setVisibility(View.VISIBLE); + description_txt.setVisibility(View.VISIBLE); + price_txt.setVisibility(View.VISIBLE); + add_to_basket_button.setVisibility(View.VISIBLE); + linearLayout.setVisibility(View.VISIBLE); + linearLayout2.setVisibility(View.VISIBLE); + linearLayout3.setVisibility(View.VISIBLE); + line.setVisibility(View.VISIBLE); + total_txt.setVisibility(View.VISIBLE); + description_content_txt.setVisibility(View.VISIBLE); + + + progressBar.setVisibility(View.GONE); + } + + private void initData(){ + Locale locale = new Locale("vi", "VN"); + NumberFormat fmt = NumberFormat.getCurrencyInstance(locale); + + price = Float.parseFloat(food.getPrice()); + + foodName_txt.setText(food.getName()); + shopName_txt.setText("Shop Name"); + price_txt.setText(fmt.format(Float.parseFloat(food.getPrice()))); + discount_txt.setText("-" + food.getDiscount() + "%"); + description_content_txt.setText(food.getDescription()); + countRating_txt.setText(food.getReviewCount()); + + add_to_basket_button.setText("ADD TO BASKET - " + fmt.format(0)); + + List slideModels = new ArrayList<>(); + if(imageFood != null){ + for(String imageUrl: imageFood) + slideModels.add(new SlideModel(imageUrl, null)); + } + imageSlider.setImageList(slideModels, ScaleTypes.FIT); + + } + + private void getFoodById(String foodId){ + FoodApi.apiService.detailFood(foodId).enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + Food tempFood = response.body(); + if(tempFood != null) + food = tempFood; + + initData(); + showUI(); + } + + @Override + public void onFailure(Call call, Throwable t) { + Toast.makeText(FoodDetailActivity.this, "Lỗi Food" + t, Toast.LENGTH_SHORT).show(); + } + }); + } + + private void getImageFoodById(String foodId) { + FoodApi.apiService.getImageFoodById(foodId).enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + List imageFoodData = response.body(); + if (imageFoodData != null){ + imageFood.clear(); + for(ImageFood imageFoodTemp: imageFoodData){ + imageFood.add(imageFoodTemp.getImageUrl()); + } + } + + getFoodById(foodId); + } + + @Override + public void onFailure(Call> call, Throwable t) { + Toast.makeText(FoodDetailActivity.this, "Lỗi Image" + t, Toast.LENGTH_SHORT).show(); + } + }); + + } } \ No newline at end of file diff --git a/app/src/main/java/com/capstone/foodify/Fragment/HomeFragment.java b/app/src/main/java/com/capstone/foodify/Fragment/HomeFragment.java index 8cb2f78..6ce4ff4 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/HomeFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/HomeFragment.java @@ -53,6 +53,7 @@ public class HomeFragment extends Fragment { recyclerView_restaurant = view.findViewById(R.id.recycler_view_restaurant); shopAdapter = new ShopAdapter(getContext()); + if(listFood.isEmpty() || drinkFood.isEmpty()){ getListFood(); } else { diff --git a/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java b/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java index 8e010e3..197b1a5 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java @@ -2,13 +2,10 @@ package com.capstone.foodify.Fragment; import static com.capstone.foodify.Fragment.HomeFragment.listFood; -import android.app.Activity; import android.os.Bundle; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.inputmethod.InputMethodManager; import android.widget.CompoundButton; import android.widget.ProgressBar; import android.widget.TextView; @@ -23,7 +20,6 @@ import androidx.recyclerview.widget.RecyclerView; import com.capstone.foodify.API.FoodApi; import com.capstone.foodify.Model.Category.Category; import com.capstone.foodify.Model.Food.Food; -import com.capstone.foodify.Model.Food.FoodAdapter; import com.capstone.foodify.Model.Food.FoodSearchAdapter; import com.capstone.foodify.R; import com.google.android.material.chip.Chip; @@ -31,7 +27,6 @@ import com.google.android.material.chip.ChipGroup; import com.paulrybitskyi.persistentsearchview.PersistentSearchView; import com.paulrybitskyi.persistentsearchview.listeners.OnSearchConfirmedListener; import com.paulrybitskyi.persistentsearchview.listeners.OnSearchQueryChangeListener; -import com.paulrybitskyi.persistentsearchview.utils.VoiceRecognitionDelegate; import java.util.ArrayList; import java.util.List; @@ -219,7 +214,7 @@ public class SearchFragment extends Fragment { } private void getListFoodByPagination(int page){ - FoodApi.apiService.listFoodByPagination(page, LIMIT).enqueue(new Callback>() { + FoodApi.apiService.listFood(page, LIMIT).enqueue(new Callback>() { @Override public void onResponse(Call> call, Response> response) { loadFoodAdapter(response); diff --git a/app/src/main/java/com/capstone/foodify/Model/Food/Food.java b/app/src/main/java/com/capstone/foodify/Model/Food/Food.java index c7f0d6e..177b485 100644 --- a/app/src/main/java/com/capstone/foodify/Model/Food/Food.java +++ b/app/src/main/java/com/capstone/foodify/Model/Food/Food.java @@ -5,6 +5,18 @@ public class Food { private String img; private String name; private String price; + private String discount; + private String description; + + private String reviewCount; + + public String getReviewCount() { + return reviewCount; + } + + public void setReviewCount(String reviewCount) { + this.reviewCount = reviewCount; + } public Food() { } @@ -33,7 +45,6 @@ public class Food { this.name = name; } - public String getPrice() { return price; } @@ -42,14 +53,19 @@ public class Food { this.price = price; } + public String getDiscount() { + return discount; + } - @Override - public String toString() { - return "Food{" + - "id='" + id + '\'' + - ", img='" + img + '\'' + - ", name='" + name + '\'' + - ", price='" + price + '\'' + - '}'; + public void setDiscount(String discount) { + this.discount = discount; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; } } diff --git a/app/src/main/java/com/capstone/foodify/Model/Food/FoodAdapter.java b/app/src/main/java/com/capstone/foodify/Model/Food/FoodAdapter.java index ac9e792..a1ea82a 100644 --- a/app/src/main/java/com/capstone/foodify/Model/Food/FoodAdapter.java +++ b/app/src/main/java/com/capstone/foodify/Model/Food/FoodAdapter.java @@ -16,7 +16,9 @@ import com.capstone.foodify.Activity.FoodDetailActivity; import com.capstone.foodify.R; import com.squareup.picasso.Picasso; +import java.text.NumberFormat; import java.util.List; +import java.util.Locale; public class FoodAdapter extends RecyclerView.Adapter{ @@ -37,15 +39,6 @@ public class FoodAdapter extends RecyclerView.Adapter= 19){ + if(foodName.length() >= 30){ StringBuilder stringBuilder = new StringBuilder(food.getName()); - stringBuilder.replace(19, food.getName().length(), "..." ); + stringBuilder.replace(30, food.getName().length(), "..." ); holder.name.setText(stringBuilder); } else { holder.name.setText(foodName); } Picasso.get().load(food.getImg()).into(holder.image); - holder.price.setText(food.getPrice()); + holder.price.setText(fmt.format(Float.parseFloat(food.getPrice()))); + + holder.itemView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(context, FoodDetailActivity.class); + intent.putExtra("FoodId", food.getId()); + context.startActivity(intent); + } + }); + } @Override diff --git a/app/src/main/java/com/capstone/foodify/Model/Food/ImageFood.java b/app/src/main/java/com/capstone/foodify/Model/Food/ImageFood.java new file mode 100644 index 0000000..6dedf66 --- /dev/null +++ b/app/src/main/java/com/capstone/foodify/Model/Food/ImageFood.java @@ -0,0 +1,37 @@ +package com.capstone.foodify.Model.Food; + +public class ImageFood { + private String imageUrl; + private String id; + private String detailId; + + public ImageFood(String imageUrl, String id, String detailId) { + this.imageUrl = imageUrl; + this.id = id; + this.detailId = detailId; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getDetailId() { + return detailId; + } + + public void setDetailId(String detailId) { + this.detailId = detailId; + } +} diff --git a/app/src/main/java/com/capstone/foodify/Model/Menu/MenuAdapter.java b/app/src/main/java/com/capstone/foodify/Model/Menu/MenuAdapter.java index 3e0a4f0..bc2f7c3 100644 --- a/app/src/main/java/com/capstone/foodify/Model/Menu/MenuAdapter.java +++ b/app/src/main/java/com/capstone/foodify/Model/Menu/MenuAdapter.java @@ -49,7 +49,7 @@ public class MenuAdapter extends RecyclerView.Adapter @@ -155,6 +155,7 @@ > - - + + \ No newline at end of file diff --git a/app/src/main/res/layout/list_foods.xml b/app/src/main/res/layout/list_foods.xml index 2c1b074..be79439 100644 --- a/app/src/main/res/layout/list_foods.xml +++ b/app/src/main/res/layout/list_foods.xml @@ -1,6 +1,6 @@ - + + + +