mirror of
https://github.com/Nezumi-2711/Foodify.git
synced 2026-09-22 20:00:50 +00:00
Add and remove favorite food function
This commit is contained in:
@@ -3,7 +3,7 @@ package com.capstone.foodify.API;
|
||||
import com.capstone.foodify.Model.Category;
|
||||
import com.capstone.foodify.Model.DistrictWardResponse;
|
||||
import com.capstone.foodify.Model.Food;
|
||||
import com.capstone.foodify.Model.Response.EmailOrPhoneExist;
|
||||
import com.capstone.foodify.Model.Response.CustomResponse;
|
||||
import com.capstone.foodify.Model.Response.Foods;
|
||||
import com.capstone.foodify.Model.Response.Shops;
|
||||
import com.capstone.foodify.Model.Shop;
|
||||
@@ -29,7 +29,7 @@ public interface FoodApi {
|
||||
Gson gson = new GsonBuilder().setDateFormat("HH:mm:ss dd-MM-yyyy").setLenient().create();
|
||||
|
||||
FoodApi apiService = new Retrofit.Builder()
|
||||
.baseUrl("http://192.168.1.88:8080/api/").addConverterFactory(GsonConverterFactory.create(gson))
|
||||
.baseUrl("http://192.168.1.183:8080/api/").addConverterFactory(GsonConverterFactory.create(gson))
|
||||
.build()
|
||||
.create(FoodApi.class);
|
||||
|
||||
@@ -77,5 +77,5 @@ public interface FoodApi {
|
||||
Call<User> register(@Body User user);
|
||||
|
||||
@POST("auth/check")
|
||||
Call<EmailOrPhoneExist> checkEmailOrPhoneExist (@Body User user);
|
||||
Call<CustomResponse> checkEmailOrPhoneExist (@Body User user);
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import static com.capstone.foodify.Common.TOKEN;
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.capstone.foodify.Model.Food;
|
||||
import com.capstone.foodify.Model.Response.CustomResponse;
|
||||
import com.capstone.foodify.Model.Response.Foods;
|
||||
import com.capstone.foodify.Model.User;
|
||||
import com.google.gson.Gson;
|
||||
@@ -29,7 +30,7 @@ import retrofit2.http.Path;
|
||||
import retrofit2.http.Query;
|
||||
|
||||
public interface FoodApiToken {
|
||||
Gson gson = new GsonBuilder().setDateFormat("HH:mm:ss dd-MM-yyyy").create();
|
||||
Gson gson = new GsonBuilder().setDateFormat("HH:mm:ss dd-MM-yyyy").setLenient().create();
|
||||
|
||||
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
|
||||
@NonNull
|
||||
@@ -43,7 +44,7 @@ public interface FoodApiToken {
|
||||
|
||||
FoodApiToken apiService = new Retrofit.Builder()
|
||||
.client(client)
|
||||
.baseUrl("http://192.168.1.88:8080/api/").addConverterFactory(GsonConverterFactory.create(gson))
|
||||
.baseUrl("http://192.168.1.183:8080/api/").addConverterFactory(GsonConverterFactory.create(gson))
|
||||
.build()
|
||||
.create(FoodApiToken.class);
|
||||
|
||||
@@ -62,4 +63,7 @@ public interface FoodApiToken {
|
||||
|
||||
@PUT("users/{userId}")
|
||||
Call<User> updateUser(@Path("userId") int userId, @Body User user);
|
||||
|
||||
@GET("users/{userId}/loves/{productId}")
|
||||
Call<CustomResponse> checkFoodIsFavorite(@Path("userId") int userId, @Path("productId") int productId);
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import com.capstone.foodify.Common;
|
||||
import com.capstone.foodify.Model.Basket;
|
||||
import com.capstone.foodify.Model.Food;
|
||||
import com.capstone.foodify.Model.Image;
|
||||
import com.capstone.foodify.Model.Response.CustomResponse;
|
||||
import com.capstone.foodify.Model.Review;
|
||||
import com.capstone.foodify.Adapter.ReviewAdapter;
|
||||
import com.capstone.foodify.R;
|
||||
@@ -51,7 +52,7 @@ public class FoodDetailActivity extends AppCompatActivity {
|
||||
|
||||
private HorizontalQuantitizer horizontalQuantitizer;
|
||||
private ImageSlider imageSlider;
|
||||
private ImageView back_image, favorite_icon;
|
||||
private ImageView back_image, not_favorite, is_favorite;
|
||||
private String foodId = "";
|
||||
private Food food;
|
||||
private TextView foodName_txt, shopName_txt, discount_txt, price_txt, total_txt, countRating_txt, description_content_txt;
|
||||
@@ -78,7 +79,8 @@ public class FoodDetailActivity extends AppCompatActivity {
|
||||
discount_txt = findViewById(R.id.discount);
|
||||
price_txt = findViewById(R.id.price);
|
||||
add_to_basket_button = findViewById(R.id.add_to_basket_button);
|
||||
favorite_icon = findViewById(R.id.favorite_icon);
|
||||
not_favorite = findViewById(R.id.not_favorite);
|
||||
is_favorite = findViewById(R.id.is_favorite);
|
||||
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);
|
||||
@@ -161,14 +163,30 @@ public class FoodDetailActivity extends AppCompatActivity {
|
||||
});
|
||||
|
||||
//Add food to favorite when user on click
|
||||
favorite_icon.setOnClickListener(new View.OnClickListener() {
|
||||
not_favorite.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
//TODO Check food has been in favorite food or not
|
||||
|
||||
addFoodToFavorite();
|
||||
}
|
||||
});
|
||||
|
||||
//Remove food from favorite
|
||||
is_favorite.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
removeFavoriteFood();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void isFavoriteIcon(){
|
||||
not_favorite.setVisibility(View.GONE);
|
||||
is_favorite.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
private void notFavoriteIcon(){
|
||||
not_favorite.setVisibility(View.VISIBLE);
|
||||
is_favorite.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
private void addFoodToFavorite() {
|
||||
@@ -176,7 +194,7 @@ public class FoodDetailActivity extends AppCompatActivity {
|
||||
@Override
|
||||
public void onResponse(Call<Food> call, Response<Food> response) {
|
||||
Toast.makeText(FoodDetailActivity.this, "Đã thêm " + food.getName() + " vào danh sách yêu thích!", Toast.LENGTH_SHORT).show();
|
||||
favorite_icon.setImageResource(R.drawable.baseline_favorite_24);
|
||||
isFavoriteIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -191,7 +209,7 @@ public class FoodDetailActivity extends AppCompatActivity {
|
||||
@Override
|
||||
public void onResponse(Call<Food> call, Response<Food> response) {
|
||||
Toast.makeText(FoodDetailActivity.this, "Đã xoá " + food.getName() + " khỏi danh sách yêu thích!", Toast.LENGTH_SHORT).show();
|
||||
favorite_icon.setImageResource(R.drawable.baseline_favorite_border_24);
|
||||
notFavoriteIcon();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -293,6 +311,32 @@ public class FoodDetailActivity extends AppCompatActivity {
|
||||
}
|
||||
}
|
||||
|
||||
private void checkFoodIsFavorite(int foodId){
|
||||
FoodApiToken.apiService.checkFoodIsFavorite(Common.CURRENT_USER.getId(), foodId).enqueue(new Callback<CustomResponse>() {
|
||||
@Override
|
||||
public void onResponse(Call<CustomResponse> call, Response<CustomResponse> response) {
|
||||
CustomResponse dataResponse = response.body();
|
||||
|
||||
boolean isFavorite = false;
|
||||
|
||||
if(dataResponse != null)
|
||||
isFavorite = dataResponse.isTrue();
|
||||
|
||||
if(isFavorite)
|
||||
isFavoriteIcon();
|
||||
else
|
||||
notFavoriteIcon();
|
||||
|
||||
showUI();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Call<CustomResponse> call, Throwable t) {
|
||||
Toast.makeText(FoodDetailActivity.this, "Oops, đã có lỗi xảy ra! Vui lòng thử lại sau!", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void getFoodById(String foodId) {
|
||||
FoodApi.apiService.detailFood(foodId).enqueue(new Callback<Food>() {
|
||||
@Override
|
||||
@@ -302,7 +346,7 @@ public class FoodDetailActivity extends AppCompatActivity {
|
||||
food = tempFood;
|
||||
|
||||
initData();
|
||||
showUI();
|
||||
checkFoodIsFavorite(Integer.parseInt(foodId));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -15,6 +15,7 @@ import androidx.viewpager2.widget.ViewPager2;
|
||||
|
||||
import com.capstone.foodify.API.FoodApiToken;
|
||||
import com.capstone.foodify.Common;
|
||||
import com.capstone.foodify.Fragment.HomeFragment;
|
||||
import com.capstone.foodify.Model.User;
|
||||
import com.capstone.foodify.R;
|
||||
import com.capstone.foodify.ViewPagerAdapter;
|
||||
@@ -62,6 +63,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
User userData = response.body();
|
||||
if(userData != null){
|
||||
Common.CURRENT_USER = userData;
|
||||
HomeFragment.setNameUser(Common.CURRENT_USER.getFullName());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -9,8 +9,6 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Typeface;
|
||||
import android.os.Bundle;
|
||||
import android.text.Editable;
|
||||
import android.text.TextWatcher;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
@@ -26,7 +24,7 @@ import com.capstone.foodify.API.FoodApi;
|
||||
import com.capstone.foodify.Common;
|
||||
import com.capstone.foodify.Model.Address;
|
||||
import com.capstone.foodify.Model.DistrictWardResponse;
|
||||
import com.capstone.foodify.Model.Response.EmailOrPhoneExist;
|
||||
import com.capstone.foodify.Model.Response.CustomResponse;
|
||||
import com.capstone.foodify.Model.User;
|
||||
import com.capstone.foodify.R;
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
@@ -174,10 +172,10 @@ public class SignUpActivity extends AppCompatActivity {
|
||||
user.setPhoneNumber(phone);
|
||||
user.setRoleName("ROLE_USER");
|
||||
|
||||
FoodApi.apiService.checkEmailOrPhoneExist(user).enqueue(new Callback<EmailOrPhoneExist>() {
|
||||
FoodApi.apiService.checkEmailOrPhoneExist(user).enqueue(new Callback<CustomResponse>() {
|
||||
@Override
|
||||
public void onResponse(Call<EmailOrPhoneExist> call, Response<EmailOrPhoneExist> response) {
|
||||
EmailOrPhoneExist dataTemp = response.body();
|
||||
public void onResponse(Call<CustomResponse> call, Response<CustomResponse> response) {
|
||||
CustomResponse dataTemp = response.body();
|
||||
|
||||
boolean isExist = false;
|
||||
|
||||
@@ -194,7 +192,7 @@ public class SignUpActivity extends AppCompatActivity {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Call<EmailOrPhoneExist> call, Throwable t) {
|
||||
public void onFailure(Call<CustomResponse> call, Throwable t) {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.capstone.foodify.Adapter;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -113,6 +114,16 @@ public class FoodFavoriteAdapter extends RecyclerView.Adapter<FoodFavoriteAdapt
|
||||
Toast.makeText(context, "Đã thêm " + food.getName() + " vào giỏ hàng!", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
});
|
||||
|
||||
//Move to food detail when user click on item
|
||||
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
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
import androidx.fragment.app.Fragment;
|
||||
@@ -47,6 +48,7 @@ public class HomeFragment extends Fragment {
|
||||
private MenuAdapter menuAdapter;
|
||||
private ShopAdapter shopAdapter;
|
||||
private ConstraintLayout progressLayout;
|
||||
private static TextView welcomeText;
|
||||
|
||||
|
||||
@Override
|
||||
@@ -61,6 +63,7 @@ public class HomeFragment extends Fragment {
|
||||
recyclerView_restaurant = view.findViewById(R.id.recycler_view_restaurant);
|
||||
shopAdapter = new ShopAdapter(getContext());
|
||||
progressLayout = getActivity().findViewById(R.id.progress_layout);
|
||||
welcomeText = view.findViewById(R.id.welcome_text);
|
||||
|
||||
|
||||
if(listFood.isEmpty() || recentFood.isEmpty()){
|
||||
@@ -89,6 +92,14 @@ public class HomeFragment extends Fragment {
|
||||
System.out.println("Main activity destroy!");
|
||||
}
|
||||
|
||||
public static void setNameUser(String name){
|
||||
//Set name user while user already login
|
||||
if(Common.CURRENT_USER != null)
|
||||
welcomeText.setText("Xin chào, " + Common.CURRENT_USER.getFullName() + "!");
|
||||
else
|
||||
welcomeText.setText("Xin chào, khách!");
|
||||
}
|
||||
|
||||
private void showSlider(){
|
||||
|
||||
FoodApi.apiService.listSlider().enqueue(new Callback<List<Slider>>() {
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package com.capstone.foodify.Model.Response;
|
||||
|
||||
public class EmailOrPhoneExist {
|
||||
public class CustomResponse {
|
||||
private String title;
|
||||
private boolean isTrue;
|
||||
|
||||
Reference in New Issue
Block a user