mirror of
https://github.com/Nezumi-2711/Foodify.git
synced 2026-09-22 13:38:41 +00:00
Add and remove favorite food function
This commit is contained in:
@@ -31,7 +31,6 @@
|
||||
<activity
|
||||
android:name=".Activity.FavoriteFoodActivity"
|
||||
android:exported="false"
|
||||
android:noHistory="true"
|
||||
/>
|
||||
<activity
|
||||
android:name=".Activity.ShopDetailActivity"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -97,13 +97,22 @@
|
||||
android:layout_gravity="right"
|
||||
/>
|
||||
<ImageView
|
||||
android:id="@+id/favorite_icon"
|
||||
android:id="@+id/not_favorite"
|
||||
android:src="@drawable/baseline_favorite_border_24"
|
||||
android:layout_width="30dp"
|
||||
android:layout_height="30dp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_gravity="right"
|
||||
/>
|
||||
<ImageView
|
||||
android:id="@+id/is_favorite"
|
||||
android:src="@drawable/baseline_favorite_24"
|
||||
android:layout_width="30dp"
|
||||
android:layout_height="30dp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_gravity="right"
|
||||
android:visibility="gone"
|
||||
/>
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -21,49 +21,21 @@
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/header_title"
|
||||
android:layout_width="match_parent"
|
||||
<TextView
|
||||
android:id="@+id/welcome_text"
|
||||
android:text="@string/hello_guest"
|
||||
android:textSize="18sp"
|
||||
android:layout_marginTop="40dp"
|
||||
android:fontFamily="@font/opensans"
|
||||
android:textStyle="bold"
|
||||
android:textColor="@color/black"
|
||||
android:layout_weight="0.7"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
app:layout_constraintTop_toTopOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
android:orientation="horizontal"
|
||||
>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/welcome_text"
|
||||
android:text="@string/hello_guest"
|
||||
android:textSize="22sp"
|
||||
android:fontFamily="@font/opensans"
|
||||
android:textStyle="bold"
|
||||
android:textColor="@color/black"
|
||||
android:layout_weight="0.7"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text_address"
|
||||
android:text="@string/home"
|
||||
android:textSize="18sp"
|
||||
android:textStyle="bold"
|
||||
android:textColor="@color/secondary"
|
||||
android:textAlignment="center"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
<ImageView
|
||||
android:src="@drawable/location"
|
||||
android:layout_weight="0.1"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="30dp"
|
||||
android:contentDescription="@string/location_icon"
|
||||
app:tint="@color/secondary"
|
||||
/>
|
||||
|
||||
</LinearLayout>
|
||||
/>
|
||||
|
||||
<com.denzcoskun.imageslider.ImageSlider
|
||||
android:id="@+id/slider"
|
||||
@@ -74,7 +46,7 @@
|
||||
app:iss_corner_radius="40"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="180dp"
|
||||
app:layout_constraintTop_toBottomOf="@id/header_title"
|
||||
app:layout_constraintTop_toBottomOf="@id/welcome_text"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user