Show rating bar food and list comment user

This commit is contained in:
Nezumi
2023-03-26 13:14:18 +07:00
parent 4873faefaa
commit 84fbf2f376
21 changed files with 500 additions and 239 deletions
+1 -1
View File
@@ -7,7 +7,7 @@
<option name="testRunner" value="GRADLE" /> <option name="testRunner" value="GRADLE" />
<option name="distributionType" value="DEFAULT_WRAPPED" /> <option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" /> <option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="JDK" /> <option name="gradleJvm" value="jbr-17" />
<option name="modules"> <option name="modules">
<set> <set>
<option value="$PROJECT_DIR$" /> <option value="$PROJECT_DIR$" />
+2 -1
View File
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" /> <component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="jbr-17" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_17_PREVIEW" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">
@@ -3,6 +3,7 @@ package com.capstone.foodify.API;
import com.capstone.foodify.Model.Category; import com.capstone.foodify.Model.Category;
import com.capstone.foodify.Model.DistrictWardResponse; import com.capstone.foodify.Model.DistrictWardResponse;
import com.capstone.foodify.Model.Food; import com.capstone.foodify.Model.Food;
import com.capstone.foodify.Model.Response.Comments;
import com.capstone.foodify.Model.Response.CustomResponse; import com.capstone.foodify.Model.Response.CustomResponse;
import com.capstone.foodify.Model.Response.Foods; import com.capstone.foodify.Model.Response.Foods;
import com.capstone.foodify.Model.Response.Shops; import com.capstone.foodify.Model.Response.Shops;
@@ -29,7 +30,7 @@ public interface FoodApi {
Gson gson = new GsonBuilder().setDateFormat("HH:mm:ss dd-MM-yyyy").setLenient().create(); Gson gson = new GsonBuilder().setDateFormat("HH:mm:ss dd-MM-yyyy").setLenient().create();
FoodApi apiService = new Retrofit.Builder() FoodApi apiService = new Retrofit.Builder()
.baseUrl("https://foodify-backend-production.up.railway.app/api/").addConverterFactory(GsonConverterFactory.create(gson)) .baseUrl("http://192.168.1.183:8080/api/").addConverterFactory(GsonConverterFactory.create(gson))
.build() .build()
.create(FoodApi.class); .create(FoodApi.class);
@@ -78,4 +79,7 @@ public interface FoodApi {
@POST("auth/check") @POST("auth/check")
Call<CustomResponse> checkEmailOrPhoneExist (@Body User user); Call<CustomResponse> checkEmailOrPhoneExist (@Body User user);
@GET("products/{productId}/comments")
Call<Comments> getCommentByProductId(@Path("productId") int productId, @Query("pageNo") int pageNo, @Query("pageSize") int pageSize, @Query("sortBy") String sortBy, @Query("sortDir") String sortDir);
} }
@@ -6,7 +6,9 @@ import androidx.annotation.NonNull;
import com.capstone.foodify.Model.Address; import com.capstone.foodify.Model.Address;
import com.capstone.foodify.Model.Food; import com.capstone.foodify.Model.Food;
import com.capstone.foodify.Model.Order;
import com.capstone.foodify.Model.Response.Addresses; import com.capstone.foodify.Model.Response.Addresses;
import com.capstone.foodify.Model.Response.Comments;
import com.capstone.foodify.Model.Response.CustomResponse; import com.capstone.foodify.Model.Response.CustomResponse;
import com.capstone.foodify.Model.Response.Foods; import com.capstone.foodify.Model.Response.Foods;
import com.capstone.foodify.Model.User; import com.capstone.foodify.Model.User;
@@ -46,7 +48,7 @@ public interface FoodApiToken {
FoodApiToken apiService = new Retrofit.Builder() FoodApiToken apiService = new Retrofit.Builder()
.client(client) .client(client)
.baseUrl("https://foodify-backend-production.up.railway.app/api/").addConverterFactory(GsonConverterFactory.create(gson)) .baseUrl("http://192.168.1.183:8080/api/").addConverterFactory(GsonConverterFactory.create(gson))
.build() .build()
.create(FoodApiToken.class); .create(FoodApiToken.class);
@@ -77,4 +79,7 @@ public interface FoodApiToken {
@DELETE("users/{userId}/addresses/{addressId}") @DELETE("users/{userId}/addresses/{addressId}")
Call<CustomResponse> deleteAddressUser(@Path("userId") int userId, @Path("addressId") int addressId); Call<CustomResponse> deleteAddressUser(@Path("userId") int userId, @Path("addressId") int addressId);
@POST("user/{userId}/orders")
Call<Order> createOrder(@Path("userId") int userId, @Body Order order);
} }
@@ -13,23 +13,27 @@ import android.view.WindowManager;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.widget.NestedScrollView;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.capstone.foodify.API.FoodApi; import com.capstone.foodify.API.FoodApi;
import com.capstone.foodify.API.FoodApiToken; import com.capstone.foodify.API.FoodApiToken;
import com.capstone.foodify.Adapter.ReviewAdapter; import com.capstone.foodify.Adapter.CommentAdapter;
import com.capstone.foodify.Common; import com.capstone.foodify.Common;
import com.capstone.foodify.Model.Basket; import com.capstone.foodify.Model.Basket;
import com.capstone.foodify.Model.Food; import com.capstone.foodify.Model.Food;
import com.capstone.foodify.Model.Image; import com.capstone.foodify.Model.Image;
import com.capstone.foodify.Model.Response.Comments;
import com.capstone.foodify.Model.Response.CustomResponse; import com.capstone.foodify.Model.Response.CustomResponse;
import com.capstone.foodify.Model.Review; import com.capstone.foodify.Model.Comment;
import com.capstone.foodify.R; import com.capstone.foodify.R;
import com.denzcoskun.imageslider.ImageSlider; import com.denzcoskun.imageslider.ImageSlider;
import com.denzcoskun.imageslider.constants.ScaleTypes; import com.denzcoskun.imageslider.constants.ScaleTypes;
@@ -38,6 +42,7 @@ import com.mcdev.quantitizerlibrary.AnimationStyle;
import com.mcdev.quantitizerlibrary.HorizontalQuantitizer; import com.mcdev.quantitizerlibrary.HorizontalQuantitizer;
import com.mcdev.quantitizerlibrary.QuantitizerListener; import com.mcdev.quantitizerlibrary.QuantitizerListener;
import com.willy.ratingbar.RotationRatingBar; import com.willy.ratingbar.RotationRatingBar;
import com.willy.ratingbar.ScaleRatingBar;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -47,20 +52,27 @@ import retrofit2.Callback;
import retrofit2.Response; import retrofit2.Response;
public class FoodDetailActivity extends AppCompatActivity { public class FoodDetailActivity extends AppCompatActivity {
private static int CURRENT_PAGE = 0;
private static final int PAGE_SIZE = 8;
private static final String SORT_BY = "id";
private static final String SORT_DIR = "asc";
private static boolean LAST_PAGE;
private HorizontalQuantitizer horizontalQuantitizer; private HorizontalQuantitizer horizontalQuantitizer;
private ImageSlider imageSlider; private ImageSlider imageSlider;
private ImageView back_image, not_favorite, is_favorite; private ImageView back_image, not_favorite, is_favorite;
private String foodId = ""; private String foodId = "";
private Food food; private Food food;
private TextView foodName_txt, shopName_txt, discount_txt, price_txt, countRating_txt, description_content_txt; private TextView foodName_txt, shopName_txt, discount_txt, price_txt, countRating_txt, description_content_txt, endOfListText;
private ConstraintLayout content_view; private ConstraintLayout content_view;
private Button add_to_basket_button; private Button add_to_basket_button;
private float totalPrice, price; private float totalPrice, price;
private RecyclerView recyclerView_review; private RecyclerView recyclerView_comment;
private ReviewAdapter reviewAdapter; private CommentAdapter commentAdapter;
private Button rating_button; private Button rating_button;
private ScaleRatingBar ratingBar;
private ConstraintLayout progressLayout; private ConstraintLayout progressLayout;
private NestedScrollView nestedScrollView;
private ProgressBar progressBar;
@Override @Override
@@ -81,18 +93,26 @@ public class FoodDetailActivity extends AppCompatActivity {
is_favorite = findViewById(R.id.is_favorite); is_favorite = findViewById(R.id.is_favorite);
countRating_txt = findViewById(R.id.count_rating_text_view); countRating_txt = findViewById(R.id.count_rating_text_view);
description_content_txt = findViewById(R.id.content_description_text_view); description_content_txt = findViewById(R.id.content_description_text_view);
recyclerView_review = findViewById(R.id.recycler_view_review); recyclerView_comment = findViewById(R.id.recycler_view_comment);
rating_button = findViewById(R.id.rating_button); rating_button = findViewById(R.id.rating_button);
content_view = findViewById(R.id.content_view); content_view = findViewById(R.id.content_view);
progressLayout = findViewById(R.id.progress_layout); progressLayout = findViewById(R.id.progress_layout);
nestedScrollView = findViewById(R.id.food_detail);
endOfListText = findViewById(R.id.end_of_list_text);
progressBar = findViewById(R.id.progress_bar);
ratingBar = findViewById(R.id.rating_bar);
reviewAdapter = new ReviewAdapter(this); commentAdapter = new CommentAdapter(this);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
recyclerView_review.setLayoutManager(linearLayoutManager); recyclerView_comment.setLayoutManager(linearLayoutManager);
reviewAdapter.setData(getListReview()); //Get data
recyclerView_review.setAdapter(reviewAdapter); if (getIntent() != null)
foodId = getIntent().getStringExtra("FoodId");
commentAdapter.setData(getListComment(0));
recyclerView_comment.setAdapter(commentAdapter);
hideUI(); hideUI();
@@ -127,10 +147,6 @@ public class FoodDetailActivity extends AppCompatActivity {
} }
}); });
//Get data
if (getIntent() != null)
foodId = getIntent().getStringExtra("FoodId");
getFoodById(foodId); getFoodById(foodId);
//Turn previous action when click //Turn previous action when click
@@ -141,11 +157,11 @@ public class FoodDetailActivity extends AppCompatActivity {
} }
}); });
//Open dialog review //Open dialog comment
rating_button.setOnClickListener(new View.OnClickListener() { rating_button.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
openReviewDialog(Gravity.CENTER); openCommentDialog(Gravity.CENTER);
} }
}); });
@@ -180,6 +196,19 @@ public class FoodDetailActivity extends AppCompatActivity {
removeFavoriteFood(); removeFavoriteFood();
} }
}); });
//Set event when user scroll down
if (nestedScrollView != null) {
nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(@NonNull NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight())) {
//When user scroll to bottom, load more data
dataLoadMore();
}
}
});
}
} }
private void isFavoriteIcon(){ private void isFavoriteIcon(){
@@ -261,16 +290,40 @@ public class FoodDetailActivity extends AppCompatActivity {
} }
} }
private List<Review> getListReview() { private List<Comment> getListComment(int page) {
ArrayList<Review> listReview = new ArrayList<>(); ArrayList<Comment> listComment = new ArrayList<>();
listReview.add(new Review("User A", 5, "Very Good!")); FoodApi.apiService.getCommentByProductId(Integer.parseInt(foodId), page, PAGE_SIZE, SORT_BY, SORT_DIR).enqueue(new Callback<Comments>() {
listReview.add(new Review("User B", 1, "Bad!")); @Override
listReview.add(new Review("User C", 4, "Delicious!")); public void onResponse(Call<Comments> call, Response<Comments> response) {
listReview.add(new Review("User D", 3, "OK!")); if(response.code() == 200){
listReview.add(new Review("User E", 5, "Awesome!")); List<Comment> tempCommentList = response.body().getComments();
return listReview; //Init data
listComment.addAll(tempCommentList);
LAST_PAGE = response.body().getPage().isLast();
if(LAST_PAGE){
progressBar.setVisibility(View.GONE);
endOfListText.setVisibility(View.VISIBLE);
}
if(listComment.size() == 0)
endOfListText.setVisibility(View.GONE);
commentAdapter.notifyDataSetChanged();
} else {
Toast.makeText(FoodDetailActivity.this, "Mã lỗi: " + response.code(), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<Comments> call, Throwable t) {
Toast.makeText(FoodDetailActivity.this, "Đã có lỗi từ hệ thống!", Toast.LENGTH_SHORT).show();
}
});
return listComment;
} }
private void hideUI() { private void hideUI() {
@@ -288,7 +341,14 @@ public class FoodDetailActivity extends AppCompatActivity {
foodName_txt.setText(food.getName()); foodName_txt.setText(food.getName());
shopName_txt.setText(food.getShop().getName()); shopName_txt.setText(food.getShop().getName());
description_content_txt.setText(food.getDescription()); description_content_txt.setText(food.getDescription());
countRating_txt.setText(food.getReviewCount() + " rating"); ratingBar.setRating(food.getAverageRating());
if(food.getCommentCount() == null || Integer.parseInt(food.getCommentCount()) == 0){
countRating_txt.setText("Chưa có bình luận nào!");
} else {
countRating_txt.setText(food.getCommentCount() + " rating");
}
add_to_basket_button.setText("ADD TO BASKET - " + Common.changeCurrencyUnit(0)); add_to_basket_button.setText("ADD TO BASKET - " + Common.changeCurrencyUnit(0));
@@ -371,10 +431,10 @@ public class FoodDetailActivity extends AppCompatActivity {
}); });
} }
private void openReviewDialog(int gravity){ private void openCommentDialog(int gravity){
final Dialog dialog = new Dialog(this); final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_review); dialog.setContentView(R.layout.dialog_comment);
Window window = dialog.getWindow(); Window window = dialog.getWindow();
if(window == null) if(window == null)
@@ -393,7 +453,7 @@ public class FoodDetailActivity extends AppCompatActivity {
dialog.setCancelable(false); dialog.setCancelable(false);
} }
EditText review_content = dialog.findViewById(R.id.edit_text_review); EditText comment_content = dialog.findViewById(R.id.edit_text_comment);
RotationRatingBar ratingBar = dialog.findViewById(R.id.rating_bar); RotationRatingBar ratingBar = dialog.findViewById(R.id.rating_bar);
Button confirm = dialog.findViewById(R.id.confirm_button); Button confirm = dialog.findViewById(R.id.confirm_button);
Button cancel = dialog.findViewById(R.id.cancel_button); Button cancel = dialog.findViewById(R.id.cancel_button);
@@ -405,8 +465,17 @@ public class FoodDetailActivity extends AppCompatActivity {
} }
}); });
//TODO: Update review dialog //TODO: Update comment dialog
dialog.show(); dialog.show();
} }
private void dataLoadMore() {
if(!LAST_PAGE){
getListComment(++CURRENT_PAGE);
} else {
progressBar.setVisibility(View.GONE);
endOfListText.setVisibility(View.VISIBLE);
}
}
} }
@@ -32,16 +32,19 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.capstone.foodify.API.FoodApi; import com.capstone.foodify.API.FoodApi;
import com.capstone.foodify.API.FoodApiToken;
import com.capstone.foodify.API.GoogleMapApi; import com.capstone.foodify.API.GoogleMapApi;
import com.capstone.foodify.Adapter.OrderDetailAdapter; import com.capstone.foodify.Adapter.OrderDetailAdapter;
import com.capstone.foodify.Common; import com.capstone.foodify.Common;
import com.capstone.foodify.Model.Address; import com.capstone.foodify.Model.Address;
import com.capstone.foodify.Model.DistrictWardResponse; import com.capstone.foodify.Model.DistrictWardResponse;
import com.capstone.foodify.Model.GoogleMap.GoogleMapResponse; import com.capstone.foodify.Model.GoogleMap.GoogleMapResponse;
import com.capstone.foodify.Model.Order;
import com.capstone.foodify.R; import com.capstone.foodify.R;
import com.capstone.foodify.ZaloPay.Api.CreateOrder; import com.capstone.foodify.ZaloPay.Api.CreateOrder;
import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.LatLng;
import com.google.android.material.textfield.TextInputLayout; import com.google.android.material.textfield.TextInputLayout;
import com.google.firebase.auth.FirebaseAuth;
import com.thecode.aestheticdialogs.AestheticDialog; import com.thecode.aestheticdialogs.AestheticDialog;
import com.thecode.aestheticdialogs.DialogStyle; import com.thecode.aestheticdialogs.DialogStyle;
import com.thecode.aestheticdialogs.DialogType; import com.thecode.aestheticdialogs.DialogType;
@@ -118,6 +121,9 @@ public class OrderCheckOutActivity extends AppCompatActivity {
txt_ship_cost = findViewById(R.id.txt_ship_cost); txt_ship_cost = findViewById(R.id.txt_ship_cost);
btn_ZaloPay = findViewById(R.id.btnZaloPay); btn_ZaloPay = findViewById(R.id.btnZaloPay);
//Reload user data
Common.reloadUser(this);
if(getIntent() != null){ if(getIntent() != null){
total = getIntent().getFloatExtra("total", 0); total = getIntent().getFloatExtra("total", 0);
@@ -187,6 +193,11 @@ public class OrderCheckOutActivity extends AppCompatActivity {
} }
} }
if(radio_button_selected == take_food_from_shop){
//Action 4
finalAddress = "Đến shop lấy";
}
if(finalAddress == null){ if(finalAddress == null){
Toast.makeText(OrderCheckOutActivity.this, "Bạn chưa chọn địa chỉ!", Toast.LENGTH_SHORT).show(); Toast.makeText(OrderCheckOutActivity.this, "Bạn chưa chọn địa chỉ!", Toast.LENGTH_SHORT).show();
} else { } else {
@@ -221,86 +232,118 @@ public class OrderCheckOutActivity extends AppCompatActivity {
public void onClick(View v) { public void onClick(View v) {
progress_layout.setVisibility(View.VISIBLE); progress_layout.setVisibility(View.VISIBLE);
//Check address is null or not
if(finalAddress != null){
CreateOrder orderApi = new CreateOrder(); if(!Common.CURRENT_USER.isLocked()){
//Create order
try { //Check address is null or not
JSONObject data = orderApi.createOrder(String.valueOf((int) total)); if(finalAddress != null){
String code = data.getString("return_code");
CreateOrder orderApi = new CreateOrder();
try {
JSONObject data = orderApi.createOrder(String.valueOf((int) total));
String code = data.getString("return_code");
if (code.equals("1")) { if (code.equals("1")) {
//Success create order //Success create order
String token = data.getString("zp_trans_token"); String token = data.getString("zp_trans_token");
ZaloPaySDK.getInstance().payOrder(OrderCheckOutActivity.this, token, "demozpdk://app", new PayOrderListener() { ZaloPaySDK.getInstance().payOrder(OrderCheckOutActivity.this, token, "demozpdk://app", new PayOrderListener() {
@Override @Override
public void onPaymentSucceeded(final String transactionId, final String transToken, final String appTransID) { public void onPaymentSucceeded(final String transactionId, final String transToken, final String appTransID) {
runOnUiThread(new Runnable() { runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
new AestheticDialog.Builder(OrderCheckOutActivity.this, DialogStyle.FLAT, DialogType.SUCCESS) new AestheticDialog.Builder(OrderCheckOutActivity.this, DialogStyle.FLAT, DialogType.SUCCESS)
.setTitle("Thành công!") .setTitle("Thành công!")
.setMessage("Bạn đã thanh toán thành công cho đơn hàng #" + transactionId) .setMessage("Bạn đã thanh toán thành công cho đơn hàng #" + transactionId)
.setCancelable(true) .setCancelable(true)
.setOnClickListener(new OnDialogClickListener() { .setOnClickListener(new OnDialogClickListener() {
@Override @Override
public void onClick(@NonNull AestheticDialog.Builder builder) { public void onClick(@NonNull AestheticDialog.Builder builder) {
Common.LIST_BASKET_FOOD.clear();
startActivity(new Intent(OrderCheckOutActivity.this, MainActivity.class));
finish();
}
})
.show();
progress_layout.setVisibility(View.GONE); createOrderFood(transactionId);
}
}); Common.LIST_BASKET_FOOD.clear();
} startActivity(new Intent(OrderCheckOutActivity.this, MainActivity.class));
finish();
}
})
.show();
@Override progress_layout.setVisibility(View.GONE);
public void onPaymentCanceled(String zpTransToken, String appTransID) { }
new AestheticDialog.Builder(OrderCheckOutActivity.this, DialogStyle.RAINBOW, DialogType.INFO)
.setTitle("Thông báo!")
.setMessage("Huỷ thanh toán thành công!")
.setCancelable(true)
.show();
progress_layout.setVisibility(View.GONE);
}
@Override });
public void onPaymentError(ZaloPayError zaloPayError, String zpTransToken, String appTransID) { }
new AestheticDialog.Builder(OrderCheckOutActivity.this, DialogStyle.FLAT, DialogType.ERROR)
.setTitle("Thanh toán chưa thành công!") @Override
.setMessage("Xin vui lòng thử lại!") public void onPaymentCanceled(String zpTransToken, String appTransID) {
.setCancelable(true) new AestheticDialog.Builder(OrderCheckOutActivity.this, DialogStyle.RAINBOW, DialogType.INFO)
.setOnClickListener(new OnDialogClickListener() { .setTitle("Thông báo!")
@Override .setMessage("Huỷ thanh toán thành công!")
public void onClick(@NonNull AestheticDialog.Builder builder) { .setCancelable(true)
startActivity(new Intent(OrderCheckOutActivity.this, MainActivity.class)); .show();
finish(); progress_layout.setVisibility(View.GONE);
} }
})
.show(); @Override
progress_layout.setVisibility(View.GONE); public void onPaymentError(ZaloPayError zaloPayError, String zpTransToken, String appTransID) {
} new AestheticDialog.Builder(OrderCheckOutActivity.this, DialogStyle.FLAT, DialogType.ERROR)
}); .setTitle("Thanh toán chưa thành công!")
.setMessage("Xin vui lòng thử lại!")
.setCancelable(true)
.setOnClickListener(new OnDialogClickListener() {
@Override
public void onClick(@NonNull AestheticDialog.Builder builder) {
startActivity(new Intent(OrderCheckOutActivity.this, MainActivity.class));
finish();
}
})
.show();
progress_layout.setVisibility(View.GONE);
}
});
}
} catch (Exception e) {
e.printStackTrace();
} }
} else {
} catch (Exception e) { Toast.makeText(OrderCheckOutActivity.this, "Bạn chưa chọn địa chỉ!", Toast.LENGTH_SHORT).show();
e.printStackTrace(); progress_layout.setVisibility(View.GONE);
} }
} else { } else {
Toast.makeText(OrderCheckOutActivity.this, "Bạn chưa chọn địa chỉ!", Toast.LENGTH_SHORT).show(); //Show notification account locked
progress_layout.setVisibility(View.GONE); FirebaseAuth.getInstance().signOut();
Common.showErrorServerNotification(OrderCheckOutActivity.this, "Tài khoản của bạn đã bị khoá!");
} }
} }
}); });
} }
private void createOrderFood(String transactionId) {
// //Create order object
// Order order = new Order(transactionId, "");
//
// FoodApiToken.apiService.createOrder(Common.CURRENT_USER.getId()).enqueue(new Callback<Order>() {
// @Override
// public void onResponse(Call<Order> call, Response<Order> response) {
//
// }
//
// @Override
// public void onFailure(Call<Order> call, Throwable t) {
//
// }
// });
}
private void getDistanceAndCalculateShipCost(String address) { private void getDistanceAndCalculateShipCost(String address) {
//Get location from address //Get location from address
@@ -525,6 +568,9 @@ public class OrderCheckOutActivity extends AppCompatActivity {
manual_input_address_layout.setVisibility(View.GONE); manual_input_address_layout.setVisibility(View.GONE);
spn_list_address.setVisibility(View.GONE); spn_list_address.setVisibility(View.GONE);
edt_address_detect.setVisibility(View.GONE); edt_address_detect.setVisibility(View.GONE);
//Reset address;
finalAddress = null;
} }
} }
} }
@@ -164,21 +164,33 @@ public class SignInActivity extends AppCompatActivity {
if(task.isSuccessful()){ if(task.isSuccessful()){
Common.TOKEN = task.getResult().getToken(); Common.TOKEN = task.getResult().getToken();
//Get user from database //Get user from database
FoodApiToken.apiService.getUserFromEmail(user.getEmail()).enqueue(new Callback<User>() { FoodApiToken.apiService.getUserFromEmail(user.getEmail()).enqueue(new Callback<User>() {
@Override @Override
public void onResponse(Call<User> call, Response<User> response) { public void onResponse(Call<User> call, Response<User> response) {
User userData = response.body(); if(response.code() == 200){
if(userData != null){ User userData = response.body();
Common.CURRENT_USER = userData; if(userData != null){
//Check user is lock or not
if(!userData.isLocked()){
Common.CURRENT_USER = userData;
//Dismiss progress bar
progressLayout.setVisibility(View.GONE);
startActivity(new Intent(SignInActivity.this, MainActivity.class));
}
else{
Toast.makeText(SignInActivity.this, "Tài khoản của bạn đã bị khoá!", Toast.LENGTH_SHORT).show();
FirebaseAuth.getInstance().signOut();
//Dismiss progress bar
progressLayout.setVisibility(View.GONE);
}
}
} }
//Dismiss progress bar
progressLayout.setVisibility(View.GONE);
startActivity(new Intent(SignInActivity.this, MainActivity.class));
} }
@Override @Override
@@ -163,16 +163,7 @@ public class SignUpActivity extends AppCompatActivity {
private void checkEmailOrPhoneExist(){ private void checkEmailOrPhoneExist(){
//Create user object //Create user object
User user = new User(); User user = new User(new Address(address, ward, district), dateOfBirth, email, name, identifiedCode, phone);
user.setAddress(new Address(address, ward, district));
user.setDateOfBirth(dateOfBirth);
user.setEmail(email);
user.setFullName(name);
user.setIdentifiedCode(identifiedCode);
user.setImageUrl("");
user.setLocked(false);
user.setPhoneNumber(phone);
user.setRoleName("ROLE_USER");
FoodApi.apiService.checkEmailOrPhoneExist(user).enqueue(new Callback<CustomResponse>() { FoodApi.apiService.checkEmailOrPhoneExist(user).enqueue(new Callback<CustomResponse>() {
@Override @Override
@@ -251,6 +251,7 @@ public class VerifyAccountActivity extends AppCompatActivity {
startActivity(new Intent(VerifyAccountActivity.this, SignInActivity.class)); startActivity(new Intent(VerifyAccountActivity.this, SignInActivity.class));
finish(); finish();
} else { } else {
progressLayout.setVisibility(View.GONE);
Toast.makeText(VerifyAccountActivity.this, "Lỗi hệ thống! Code: " + response.code(), Toast.LENGTH_SHORT).show(); Toast.makeText(VerifyAccountActivity.this, "Lỗi hệ thống! Code: " + response.code(), Toast.LENGTH_SHORT).show();
} }
} }
@@ -9,55 +9,55 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.capstone.foodify.Model.Review; import com.capstone.foodify.Model.Comment;
import com.capstone.foodify.R; import com.capstone.foodify.R;
import com.willy.ratingbar.ScaleRatingBar; import com.willy.ratingbar.ScaleRatingBar;
import java.util.List; import java.util.List;
public class ReviewAdapter extends RecyclerView.Adapter<ReviewAdapter.ReviewViewHolder> { public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.CommentViewHolder> {
private List<Review> listReview; private List<Comment> listComment;
private Context context; private Context context;
public ReviewAdapter(Context context) { public CommentAdapter(Context context) {
this.context = context; this.context = context;
} }
public void setData(List<Review> listReview){ public void setData(List<Comment> listComment){
this.listReview = listReview; this.listComment = listComment;
notifyDataSetChanged(); notifyDataSetChanged();
} }
@NonNull @NonNull
@Override @Override
public ReviewViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { public CommentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_review, parent, false); View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comment, parent, false);
return new ReviewViewHolder(view); return new CommentViewHolder(view);
} }
@Override @Override
public void onBindViewHolder(@NonNull ReviewViewHolder holder, int position) { public void onBindViewHolder(@NonNull CommentViewHolder holder, int position) {
Review review = listReview.get(position); Comment comment = listComment.get(position);
holder.name.setText(review.getName()); holder.name.setText(comment.getUser().getFullName());
holder.ratingScore.setRating(review.getRatingScore()); holder.ratingScore.setRating(comment.getRating());
holder.content.setText(review.getContent()); holder.content.setText(comment.getContent());
} }
@Override @Override
public int getItemCount() { public int getItemCount() {
if(listReview != null) if(listComment != null)
return listReview.size(); return listComment.size();
return 0; return 0;
} }
public class ReviewViewHolder extends RecyclerView.ViewHolder{ public class CommentViewHolder extends RecyclerView.ViewHolder{
private TextView name, content; private TextView name, content;
private ScaleRatingBar ratingScore; private ScaleRatingBar ratingScore;
public ReviewViewHolder(@NonNull View itemView) { public CommentViewHolder(@NonNull View itemView) {
super(itemView); super(itemView);
name = itemView.findViewById(R.id.user_name_text_view); name = itemView.findViewById(R.id.user_name_text_view);
@@ -7,12 +7,14 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.capstone.foodify.Activity.FoodDetailActivity; import com.capstone.foodify.Activity.FoodDetailActivity;
import com.capstone.foodify.Common; import com.capstone.foodify.Common;
import com.capstone.foodify.Model.Basket;
import com.capstone.foodify.Model.Food; import com.capstone.foodify.Model.Food;
import com.capstone.foodify.R; import com.capstone.foodify.R;
import com.squareup.picasso.Picasso; import com.squareup.picasso.Picasso;
@@ -80,7 +82,41 @@ public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.FoodViewHolder
holder.price.setText(Common.changeCurrencyUnit(cost)); holder.price.setText(Common.changeCurrencyUnit(cost));
holder.basket_icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Basket foodInBasket = Common.getFoodExistInBasket(food.getId());
if(foodInBasket == null){
//If item is not exist in basket
//Check food image is null or not
String imageTemp = null;
if(food.getImages().size() > 0)
imageTemp = food.getImages().get(0).getImageUrl();
Common.LIST_BASKET_FOOD.add(new Basket(food.getId(), imageTemp, food.getName(), food.getCost(), food.getShop().getName(),
"1", food.getDiscountPercent()));
} else {
//If item is exist in basket
for(int i = 0; i < Common.LIST_BASKET_FOOD.size(); i++){
String foodId = Common.LIST_BASKET_FOOD.get(i).getId();
//Find foodId exist
if(foodId.equals(food.getId())){
//Get quantity food from basket
String quantity = Common.LIST_BASKET_FOOD.get(i).getQuantity();
//Change quantity food from basket
int quantityInt = Integer.parseInt(quantity) + 1;
Common.LIST_BASKET_FOOD.get(i).setQuantity(String.valueOf(quantityInt));
break;
}
}
}
Toast.makeText(context, "Đã thêm " + food.getName() + " vào giỏ hàng!", Toast.LENGTH_SHORT).show();
}
});
holder.itemView.setOnClickListener(new View.OnClickListener() { holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
@@ -102,7 +138,7 @@ public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.FoodViewHolder
public class FoodViewHolder extends RecyclerView.ViewHolder{ public class FoodViewHolder extends RecyclerView.ViewHolder{
private ImageView image; private ImageView image, basket_icon;
private TextView name, price, discount; private TextView name, price, discount;
public FoodViewHolder(@NonNull View itemView) { public FoodViewHolder(@NonNull View itemView) {
@@ -112,6 +148,7 @@ public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.FoodViewHolder
name = itemView.findViewById(R.id.title); name = itemView.findViewById(R.id.title);
price = itemView.findViewById(R.id.price); price = itemView.findViewById(R.id.price);
discount = itemView.findViewById(R.id.discount); discount = itemView.findViewById(R.id.discount);
basket_icon = itemView.findViewById(R.id.basket_icon);
} }
} }
} }
@@ -2,20 +2,26 @@ package com.capstone.foodify;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.res.AssetManager; import android.content.res.AssetManager;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.NetworkCapabilities; import android.net.NetworkCapabilities;
import android.net.NetworkInfo; import android.net.NetworkInfo;
import android.os.Build; import android.os.Build;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.IntRange; import androidx.annotation.IntRange;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.capstone.foodify.API.FoodApiToken; import com.capstone.foodify.API.FoodApiToken;
import com.capstone.foodify.Activity.MainActivity;
import com.capstone.foodify.Activity.SignInActivity;
import com.capstone.foodify.Fragment.HomeFragment; import com.capstone.foodify.Fragment.HomeFragment;
import com.capstone.foodify.Model.Basket; import com.capstone.foodify.Model.Basket;
import com.capstone.foodify.Model.User; import com.capstone.foodify.Model.User;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.FirebaseUser;
import com.thecode.aestheticdialogs.AestheticDialog; import com.thecode.aestheticdialogs.AestheticDialog;
import com.thecode.aestheticdialogs.DialogStyle; import com.thecode.aestheticdialogs.DialogStyle;
@@ -57,6 +63,26 @@ public class Common {
return Typeface.createFromAsset(assetManager, "font/opensans.ttf"); return Typeface.createFromAsset(assetManager, "font/opensans.ttf");
} }
public static void reloadUser(Activity activity){
FoodApiToken.apiService.getUserFromEmail(Common.CURRENT_USER.getEmail()).enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
if(response.code() == 200){
User userData = response.body();
if(userData != null){
Common.CURRENT_USER = userData;
}
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
System.out.println("ERROR: " + t);
Common.showErrorServerNotification(activity, "Lỗi kết nối hệ thống!");
}
});
}
@IntRange(from = 0, to = 3) @IntRange(from = 0, to = 3)
public static int getConnectionType(Context context) { public static int getConnectionType(Context context) {
int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi
@@ -125,6 +151,7 @@ public class Common {
.setOnClickListener(new OnDialogClickListener() { .setOnClickListener(new OnDialogClickListener() {
@Override @Override
public void onClick(@NonNull AestheticDialog.Builder builder) { public void onClick(@NonNull AestheticDialog.Builder builder) {
activity.finishAffinity(); activity.finishAffinity();
System.exit(0); System.exit(0);
} }
@@ -0,0 +1,40 @@
package com.capstone.foodify.Model;
public class Comment {
private int id;
private String content;
private float rating;
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public float getRating() {
return rating;
}
public void setRating(float rating) {
this.rating = rating;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
@@ -10,7 +10,7 @@ public class Food implements Comparable<Food>{
private float discountPercent; private float discountPercent;
private float cost; private float cost;
private float averageRating; private float averageRating;
private String reviewCount; private String commentCount;
private Shop shop; private Shop shop;
private List<Category> categories; private List<Category> categories;
private List<Image> images; private List<Image> images;
@@ -73,12 +73,12 @@ public class Food implements Comparable<Food>{
this.averageRating = averageRating; this.averageRating = averageRating;
} }
public String getReviewCount() { public String getCommentCount() {
return reviewCount; return commentCount;
} }
public void setReviewCount(String reviewCount) { public void setCommentCount(String commentCount) {
this.reviewCount = reviewCount; this.commentCount = commentCount;
} }
public Shop getShop() { public Shop getShop() {
@@ -123,7 +123,7 @@ public class Food implements Comparable<Food>{
", discountPercent=" + discountPercent + ", discountPercent=" + discountPercent +
", cost=" + cost + ", cost=" + cost +
", averageRating=" + averageRating + ", averageRating=" + averageRating +
", reviewCount='" + reviewCount + '\'' + ", commentCount='" + commentCount + '\'' +
", shop=" + shop + ", shop=" + shop +
", categories=" + categories + ", categories=" + categories +
", images=" + images + ", images=" + images +
@@ -5,18 +5,21 @@ import java.util.List;
public class Order { public class Order {
private int id; private int id;
private String orderTrackingNumber; private String orderTrackingNumber;
private int userId;
private int shipperId; private int shipperId;
private String paymentMethod; private String paymentMethod;
private float productCost;
private float shippingCost; private float shippingCost;
private float total;
private String status; private String status;
private int address_id; private String address;
private List<OrderDetail> orderDetails; private List<OrderDetail> orderDetails;
public Order(String orderTrackingNumber) { public Order(String orderTrackingNumber, int shipperId, String paymentMethod, float shippingCost, String status, String address, List<OrderDetail> orderDetails) {
this.orderTrackingNumber = orderTrackingNumber; this.orderTrackingNumber = orderTrackingNumber;
this.shipperId = shipperId;
this.paymentMethod = paymentMethod;
this.shippingCost = shippingCost;
this.status = status;
this.address = address;
this.orderDetails = orderDetails;
} }
public int getId() { public int getId() {
@@ -27,6 +30,9 @@ public class Order {
this.id = id; this.id = id;
} }
public Order(String orderTrackingNumber) {
this.orderTrackingNumber = orderTrackingNumber;
}
public String getOrderTrackingNumber() { public String getOrderTrackingNumber() {
return orderTrackingNumber; return orderTrackingNumber;
} }
@@ -35,14 +41,6 @@ public class Order {
this.orderTrackingNumber = orderTrackingNumber; this.orderTrackingNumber = orderTrackingNumber;
} }
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getShipperId() { public int getShipperId() {
return shipperId; return shipperId;
} }
@@ -59,14 +57,6 @@ public class Order {
this.paymentMethod = paymentMethod; this.paymentMethod = paymentMethod;
} }
public float getProductCost() {
return productCost;
}
public void setProductCost(float productCost) {
this.productCost = productCost;
}
public float getShippingCost() { public float getShippingCost() {
return shippingCost; return shippingCost;
} }
@@ -75,14 +65,6 @@ public class Order {
this.shippingCost = shippingCost; this.shippingCost = shippingCost;
} }
public float getTotal() {
return total;
}
public void setTotal(float total) {
this.total = total;
}
public String getStatus() { public String getStatus() {
return status; return status;
} }
@@ -91,12 +73,20 @@ public class Order {
this.status = status; this.status = status;
} }
public int getAddress_id() { public String getAddress() {
return address_id; return address;
} }
public void setAddress_id(int address_id) { public void setAddress(String address) {
this.address_id = address_id; this.address = address;
}
public List<OrderDetail> getOrderDetails() {
return orderDetails;
}
public void setOrderDetails(List<OrderDetail> orderDetails) {
this.orderDetails = orderDetails;
} }
public List<OrderDetail> getListOrderDetail() { public List<OrderDetail> getListOrderDetail() {
@@ -0,0 +1,27 @@
package com.capstone.foodify.Model.Response;
import com.capstone.foodify.Model.Comment;
import com.capstone.foodify.Model.Page;
import java.util.List;
public class Comments {
private List<Comment> comments;
private Page page;
public List<Comment> getComments() {
return comments;
}
public void setComments(List<Comment> comments) {
this.comments = comments;
}
public Page getPage() {
return page;
}
public void setPage(Page page) {
this.page = page;
}
}
@@ -1,40 +0,0 @@
package com.capstone.foodify.Model;
public class Review {
private String name;
private int ratingScore;
private String content;
public Review() {
}
public Review(String name, int ratingScore, String content) {
this.name = name;
this.ratingScore = ratingScore;
this.content = content;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getRatingScore() {
return ratingScore;
}
public void setRatingScore(int ratingScore) {
this.ratingScore = ratingScore;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
@@ -20,9 +20,19 @@ public class User implements Serializable {
private int defaultAddress; private int defaultAddress;
private List<Address> addresses; private List<Address> addresses;
public User() { public User(Address address, String dateOfBirth, String email, String fullName, String identifiedCode, String phoneNumber) {
this.address = address;
this.dateOfBirth = dateOfBirth;
this.email = email;
this.fullName = fullName;
this.identifiedCode = identifiedCode;
this.imageUrl = "";
this.phoneNumber = phoneNumber;
this.roleName = "ROLE_USER";
this.isLocked = false;
} }
public User(){}
public int getId() { public int getId() {
return id; return id;
} }
@@ -87,14 +97,6 @@ public class User implements Serializable {
this.imageUrl = imageUrl; this.imageUrl = imageUrl;
} }
public boolean getIsLocked() {
return isLocked;
}
public void setIsLocked(boolean isLocked) {
this.isLocked = isLocked;
}
public String getPhoneNumber() { public String getPhoneNumber() {
return phoneNumber; return phoneNumber;
} }
@@ -152,12 +152,45 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
/> />
<LinearLayout
android:id="@+id/rating_layout"
android:layout_width="match_parent"
android:layout_marginTop="10dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/content_description_text_view"
app:layout_constraintStart_toStartOf="parent"
>
<TextView
android:text="Đánh giá:"
android:textSize="17sp"
android:textColor="@color/black"
android:fontFamily="@font/opensans"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="10dp"
/>
<com.willy.ratingbar.ScaleRatingBar
android:id="@+id/rating_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srb_starPadding="5dp"
app:srb_clickable="false"
app:srb_starWidth="22dp"
app:srb_starHeight="22dp"
app:srb_numStars="5"
app:srb_scrollable="false"
/>
</LinearLayout>
<androidx.constraintlayout.widget.ConstraintLayout <androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout" android:id="@+id/constraintLayout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="30dp" android:layout_marginTop="30dp"
app:layout_constraintTop_toBottomOf="@id/content_description_text_view" app:layout_constraintTop_toBottomOf="@id/rating_layout"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
> >
@@ -278,14 +311,39 @@
</LinearLayout> </LinearLayout>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_review" android:id="@+id/recycler_view_comment"
tools:listitem="@layout/item_review" tools:listitem="@layout/item_comment"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/linear_layout_2" app:layout_constraintTop_toBottomOf="@id/linear_layout_2"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
/> />
<ProgressBar
android:id="@+id/progress_bar"
android:indeterminateTint="@color/primaryColor"
app:layout_constraintTop_toBottomOf="@id/recycler_view_comment"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/end_of_list_text"
android:text="End of list"
android:fontFamily="@font/opensans"
android:textColor="@color/grayLight"
android:visibility="gone"
android:layout_marginTop="5dp"
app:layout_constraintTop_toBottomOf="@id/progress_bar"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView> </androidx.core.widget.NestedScrollView>
@@ -309,13 +367,4 @@
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
<ProgressBar
android:id="@+id/progress_bar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|center_vertical"
android:visibility="gone"
android:indeterminateTint="@color/primaryColor"
/>
</androidx.coordinatorlayout.widget.CoordinatorLayout> </androidx.coordinatorlayout.widget.CoordinatorLayout>
@@ -48,7 +48,7 @@
/> />
<EditText <EditText
android:id="@+id/edit_text_review" android:id="@+id/edit_text_comment"
android:textSize="15sp" android:textSize="15sp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@@ -76,7 +76,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/bg_primary_color_dark_corner" android:background="@drawable/bg_primary_color_dark_corner"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
app:layout_constraintTop_toBottomOf="@id/edit_text_review" app:layout_constraintTop_toBottomOf="@id/edit_text_comment"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/cancel_button" app:layout_constraintEnd_toStartOf="@id/cancel_button"
/> />
@@ -91,7 +91,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/bg_grey_color_corner" android:background="@drawable/bg_grey_color_corner"
android:layout_marginTop="10dp" android:layout_marginTop="10dp"
app:layout_constraintTop_toBottomOf="@id/edit_text_review" app:layout_constraintTop_toBottomOf="@id/edit_text_comment"
app:layout_constraintStart_toEndOf="@id/confirm_button" app:layout_constraintStart_toEndOf="@id/confirm_button"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
/> />