diff --git a/app/build.gradle b/app/build.gradle index 03370b6..bba9473 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,7 +26,7 @@ android { minSdk 26 targetSdk 32 versionCode 1 - versionName "0.1.1" + versionName "0.1.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" signingConfig signingConfigs.release diff --git a/app/release/app-release.apk b/app/release/app-release.apk index b7e0c3d..5c6c760 100644 Binary files a/app/release/app-release.apk and b/app/release/app-release.apk differ diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json index 876537d..521f4a6 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -12,7 +12,7 @@ "filters": [], "attributes": [], "versionCode": 1, - "versionName": "0.1.1", + "versionName": "0.1.2", "outputFile": "app-release.apk" } ], 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 85f6cad..491ec81 100644 --- a/app/src/main/java/com/capstone/foodify/API/FoodApi.java +++ b/app/src/main/java/com/capstone/foodify/API/FoodApi.java @@ -63,9 +63,6 @@ public interface FoodApi { @GET("products/{id}") Call detailFood(@Path("id") String id); - @GET("shops/{id}") - Call detailShop(@Path("id") int id); - @GET("products/shops/{id}") Call listFoodByShopId(@Path("id") int id, @Query("pageNo") int pageNo, @Query("pageSize") int pageSize, @Query("sortBy") String sortBy, @Query("sortDir") String sortDir); diff --git a/app/src/main/java/com/capstone/foodify/Activity/AccountAndProfileActivity.java b/app/src/main/java/com/capstone/foodify/Activity/AccountAndProfileActivity.java index 4b3d62e..c9e153d 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/AccountAndProfileActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/AccountAndProfileActivity.java @@ -3,10 +3,14 @@ package com.capstone.foodify.Activity; import android.app.Activity; import android.app.DatePickerDialog; import android.content.ContentResolver; +import android.content.Context; import android.content.Intent; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.net.Uri; import android.os.Bundle; import android.os.CountDownTimer; +import android.util.Log; import android.view.View; import android.webkit.MimeTypeMap; import android.widget.Button; @@ -21,6 +25,7 @@ import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; @@ -42,11 +47,8 @@ import com.google.firebase.storage.StorageReference; import com.google.firebase.storage.UploadTask; import com.makeramen.roundedimageview.RoundedImageView; import com.squareup.picasso.Picasso; -import com.thecode.aestheticdialogs.AestheticDialog; -import com.thecode.aestheticdialogs.DialogAnimation; import com.thecode.aestheticdialogs.DialogStyle; import com.thecode.aestheticdialogs.DialogType; -import com.thecode.aestheticdialogs.OnDialogClickListener; import java.text.SimpleDateFormat; import java.util.Calendar; @@ -59,21 +61,22 @@ import retrofit2.Response; public class AccountAndProfileActivity extends AppCompatActivity { + private static final String TAG = "AccountAndProfileActivity"; private static final String FOLDER_DIRECTORY = "UserImages/"; - TextInputLayout textInput_email, textInput_phone, textInput_fullName, textInput_birthDay; - TextView txt_countdown, txt_resend_code, txt_verify_email; - EditText edt_birthday, edt_email, edt_phone, edt_fullName; - final Calendar myCalendar= Calendar.getInstance(); - LinearLayout change_password, countdown_layout; - Button update_button, update_image_button; - ImageView back_image; - RoundedImageView profile_avatar; + private TextInputLayout textInput_email, textInput_phone, textInput_fullName, textInput_birthDay; + private TextView txt_countdown, txt_resend_code, txt_verify_email; + private EditText edt_birthday, edt_email, edt_phone, edt_fullName; + private final Calendar myCalendar= Calendar.getInstance(); + private LinearLayout change_password, countdown_layout; + private Button update_button, update_image_button; + private ImageView back_image; + private RoundedImageView profile_avatar; private Uri imageUri; - final private StorageReference storageReference = FirebaseStorage.getInstance().getReference(); - ConstraintLayout progressLayout; - FirebaseAuth mAuth; - FirebaseUser firebaseUser; - CountDownTimer count = new CountDownTimer(60000, 1000) { + private final StorageReference storageReference = FirebaseStorage.getInstance().getReference(); + private ConstraintLayout progressLayout; + private FirebaseAuth mAuth; + private FirebaseUser firebaseUser; + private final CountDownTimer count = new CountDownTimer(60000, 1000) { @Override public void onTick(long millisUntilFinished) { txt_countdown.setText(millisUntilFinished / 1000 + " giây"); @@ -95,6 +98,10 @@ public class AccountAndProfileActivity extends AppCompatActivity { initComponent(); setFontUI(); + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } + //Init data initData(); @@ -206,7 +213,7 @@ public class AccountAndProfileActivity extends AppCompatActivity { @Override public void onFailure(@NonNull Exception e) { - Toast.makeText(AccountAndProfileActivity.this, "Failed", Toast.LENGTH_SHORT).show(); + Toast.makeText(AccountAndProfileActivity.this, "Tải ảnh thất bại!", Toast.LENGTH_SHORT).show(); } }); } @@ -319,7 +326,7 @@ public class AccountAndProfileActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Common.showErrorServerNotification(AccountAndProfileActivity.this, "Không thể cập nhật thông tin, vui lòng thử lại sau!"); + Log.e(TAG, t.toString()); progressLayout.setVisibility(View.GONE); } }); @@ -387,4 +394,23 @@ public class AccountAndProfileActivity extends AppCompatActivity { SimpleDateFormat dateFormat=new SimpleDateFormat(Common.FORMAT_DATE, Locale.US); edt_birthday.setText(dateFormat.format(myCalendar.getTime())); } + + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } } \ No newline at end of file diff --git a/app/src/main/java/com/capstone/foodify/Activity/AddressManagerActivity.java b/app/src/main/java/com/capstone/foodify/Activity/AddressManagerActivity.java index f59de76..c1c5fe6 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/AddressManagerActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/AddressManagerActivity.java @@ -2,7 +2,10 @@ package com.capstone.foodify.Activity; import android.content.Context; import android.graphics.Typeface; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -16,6 +19,7 @@ import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.IntRange; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.recyclerview.widget.LinearLayoutManager; @@ -47,6 +51,7 @@ import retrofit2.Response; public class AddressManagerActivity extends AppCompatActivity { + private static final String TAG = "AddressManagerActivity"; private Address defaultAddress = null; private RecyclerView recycler_view_address; private AddressAdapter adapter; @@ -55,14 +60,33 @@ public class AddressManagerActivity extends AppCompatActivity { private ImageView back_image, edit_btn; private TextView txt_Address, errorTextDistrictWard; private List
listAddress = new ArrayList<>(); - Spinner wardSpinner, districtSpinner; - EditText edt_address; - ConstraintLayout progressLayout, progressLayoutDialog; - CheckBox default_address_checkbox; + private Spinner wardSpinner, districtSpinner; + private EditText edt_address; + private ConstraintLayout progressLayout, progressLayoutDialog; + private CheckBox default_address_checkbox; private static final ArrayList wardList = new ArrayList<>(); private static final ArrayList districtList = new ArrayList<>(); String address, ward, district; + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -76,6 +100,10 @@ public class AddressManagerActivity extends AppCompatActivity { progressLayout = findViewById(R.id.progress_layout); edit_btn = findViewById(R.id.edit_button); + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } + //Set layout recyclerview LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); recycler_view_address.setLayoutManager(linearLayoutManager); @@ -184,7 +212,7 @@ public class AddressManagerActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(AddressManagerActivity.this, "Đã có lỗi từ hệ thống, vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } @@ -201,7 +229,7 @@ public class AddressManagerActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(AddressManagerActivity.this, "Đã có lỗi từ hệ thống! Vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } @@ -221,7 +249,7 @@ public class AddressManagerActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(AddressManagerActivity.this, "Đã có lỗi khi thay đổi địa chỉ mặc định, vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } @@ -249,6 +277,7 @@ public class AddressManagerActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { + Log.e(TAG, t.toString()); } }); } @@ -318,7 +347,7 @@ public class AddressManagerActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - + Log.e(TAG, t.toString()); } }); } @@ -327,14 +356,7 @@ public class AddressManagerActivity extends AppCompatActivity { View view = LayoutInflater.from(this).inflate(R.layout.add_address_dialog,null); //Init component - textInput_address = view.findViewById(R.id.textInput_address); - wardSpinner = view.findViewById(R.id.ward); - districtSpinner = view.findViewById(R.id.district); - edt_address = view.findViewById(R.id.edt_address); - errorTextDistrictWard = view.findViewById(R.id.errorTextDistrictWard); - progressLayoutDialog = view.findViewById(R.id.progress_layout); - default_address_checkbox = view.findViewById(R.id.checkbox_default_address); - + initComponent(view); //Set font textInput_address.setTypeface(Common.setFontOpenSans(getAssets())); @@ -463,6 +485,16 @@ public class AddressManagerActivity extends AppCompatActivity { customViewDialog.show(); } + private void initComponent(View view) { + textInput_address = view.findViewById(R.id.textInput_address); + wardSpinner = view.findViewById(R.id.ward); + districtSpinner = view.findViewById(R.id.district); + edt_address = view.findViewById(R.id.edt_address); + errorTextDistrictWard = view.findViewById(R.id.errorTextDistrictWard); + progressLayoutDialog = view.findViewById(R.id.progress_layout); + default_address_checkbox = view.findViewById(R.id.checkbox_default_address); + } + private boolean validData(String address, String ward, String district){ //Valid data boolean dataHasValidate = true; @@ -511,7 +543,7 @@ public class AddressManagerActivity extends AppCompatActivity { @Override public void onFailure(Call> call, Throwable t) { - Toast.makeText(AddressManagerActivity.this, "Đã xảy ra lỗi hệ thống. Vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } @@ -548,7 +580,7 @@ public class AddressManagerActivity extends AppCompatActivity { @Override public void onFailure(Call> call, Throwable t) { - Toast.makeText(AddressManagerActivity.this, "Đã xảy ra lỗi hệ thống. Vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } else { diff --git a/app/src/main/java/com/capstone/foodify/Activity/ChangePasswordActivity.java b/app/src/main/java/com/capstone/foodify/Activity/ChangePasswordActivity.java index c25d6df..d82be37 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/ChangePasswordActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/ChangePasswordActivity.java @@ -1,10 +1,14 @@ package com.capstone.foodify.Activity; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; +import android.content.Context; import android.graphics.Typeface; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; @@ -33,13 +37,32 @@ import java.util.regex.Pattern; public class ChangePasswordActivity extends AppCompatActivity { - TextInputLayout textInput_old_password, textInput_password, textInput_password_confirm; - EditText edtOldPassword, edtPassword, edtPasswordConfirm; - ImageView back_image; - ConstraintLayout progressLayout; + private TextInputLayout textInput_old_password, textInput_password, textInput_password_confirm; + private EditText edtOldPassword, edtPassword, edtPasswordConfirm; + private ImageView back_image; + private ConstraintLayout progressLayout; Button changePasswordButton; + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -48,6 +71,10 @@ public class ChangePasswordActivity extends AppCompatActivity { initComponent(); setFontUI(); + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } + //Handle event when back image on click back_image.setOnClickListener(new View.OnClickListener() { @Override diff --git a/app/src/main/java/com/capstone/foodify/Activity/FavoriteFoodActivity.java b/app/src/main/java/com/capstone/foodify/Activity/FavoriteFoodActivity.java index 01601cf..1e45368 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/FavoriteFoodActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/FavoriteFoodActivity.java @@ -1,8 +1,12 @@ package com.capstone.foodify.Activity; +import android.content.Context; import android.content.Intent; import android.graphics.Color; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.os.Bundle; +import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; @@ -10,6 +14,7 @@ import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; @@ -38,6 +43,7 @@ import retrofit2.Callback; import retrofit2.Response; public class FavoriteFoodActivity extends AppCompatActivity implements ItemTouchHelperListener { + private static final String TAG = "FavoriteFoodActivity"; private static int CURRENT_PAGE = 0; private static final int PAGE_SIZE = 8; private static final String SORT_BY = "name"; @@ -52,18 +58,37 @@ public class FavoriteFoodActivity extends AppCompatActivity implements ItemTouch private ProgressBar progressBar; private TextView endOfListText; private LinearLayout no_food_favorite_layout; + + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_favorite_food); //Init component - back_image = findViewById(R.id.back_image); - nestedScrollView = findViewById(R.id.nestedScrollView); - progressBar = findViewById(R.id.progress_bar); - endOfListText = findViewById(R.id.end_of_list_text); - no_food_favorite_layout = findViewById(R.id.no_food_favorite_layout); - listFavoriteFoodLayout = findViewById(R.id.list_favorite_food_layout); + initComponent(); + + //Check internet connection + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } //Set event when user scroll down if (nestedScrollView != null) { @@ -109,6 +134,15 @@ public class FavoriteFoodActivity extends AppCompatActivity implements ItemTouch new ItemTouchHelper(simpleCallback).attachToRecyclerView(recyclerView_favorite_food); } + private void initComponent() { + back_image = findViewById(R.id.back_image); + nestedScrollView = findViewById(R.id.nestedScrollView); + progressBar = findViewById(R.id.progress_bar); + endOfListText = findViewById(R.id.end_of_list_text); + no_food_favorite_layout = findViewById(R.id.no_food_favorite_layout); + listFavoriteFoodLayout = findViewById(R.id.list_favorite_food_layout); + } + private void dataLoadMore() { if(!LAST_PAGE){ getListFavoriteFood(++CURRENT_PAGE); @@ -153,7 +187,7 @@ public class FavoriteFoodActivity extends AppCompatActivity implements ItemTouch @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(FavoriteFoodActivity.this, "Đã có lỗi từ hệ thống! Vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); 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 0a60d5f..29631a3 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/FoodDetailActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/FoodDetailActivity.java @@ -3,10 +3,14 @@ package com.capstone.foodify.Activity; import android.annotation.SuppressLint; import android.app.Activity; import android.app.Dialog; +import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.os.Bundle; +import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; @@ -19,6 +23,7 @@ import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.cardview.widget.CardView; @@ -66,6 +71,7 @@ import retrofit2.Callback; import retrofit2.Response; public class FoodDetailActivity extends AppCompatActivity { + private static final String TAG = "FoodDetailActivity"; ArrayList listComment = new ArrayList<>(); private static final int CREATE_COMMENT = 1; private static final int EDIT_COMMENT = 2; @@ -96,6 +102,25 @@ public class FoodDetailActivity extends AppCompatActivity { private ChipGroup list_category; private SwipeRefreshLayout swipeRefreshLayout; + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } + private void initComponent() { horizontalQuantitizer = findViewById(R.id.quantity_option); imageSlider = findViewById(R.id.slider); @@ -136,6 +161,11 @@ public class FoodDetailActivity extends AppCompatActivity { initComponent(); + //Check internet connection + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } + commentAdapter = new CommentAdapter(this); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false); @@ -308,7 +338,7 @@ public class FoodDetailActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(FoodDetailActivity.this, "Đã xảy ra lỗi kết nối đến hệ thống!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } @@ -334,7 +364,7 @@ public class FoodDetailActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(FoodDetailActivity.this, "Oops! Đã có lỗi, vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } @@ -349,7 +379,7 @@ public class FoodDetailActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(FoodDetailActivity.this, "Oops! Đã có lỗi, vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } @@ -440,7 +470,7 @@ public class FoodDetailActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { showUI(); - Common.showErrorServerNotification(FoodDetailActivity.this, "Lỗi kết nối!"); + Log.e(TAG, t.toString()); } }); } @@ -487,7 +517,7 @@ public class FoodDetailActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(FoodDetailActivity.this, "Đã có lỗi từ hệ thống!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); @@ -586,7 +616,7 @@ public class FoodDetailActivity extends AppCompatActivity { @Override public void onFailure(Call 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(); + Log.e(TAG, t.toString()); } }); } @@ -610,7 +640,7 @@ public class FoodDetailActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Common.showNotificationError(getBaseContext(), FoodDetailActivity.this); + Log.e(TAG, t.toString()); } }); } @@ -719,7 +749,7 @@ public class FoodDetailActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(FoodDetailActivity.this, "Đã có lỗi kết nối đến hệ thống!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } @@ -750,7 +780,7 @@ public class FoodDetailActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(FoodDetailActivity.this, "Đã xuất hiện lỗi hệ thống!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } @@ -783,7 +813,7 @@ public class FoodDetailActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(FoodDetailActivity.this, "Đã có lỗi kết nối tới hệ thống!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } diff --git a/app/src/main/java/com/capstone/foodify/Activity/ForgotPasswordActivity.java b/app/src/main/java/com/capstone/foodify/Activity/ForgotPasswordActivity.java index 1c03635..e75db84 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/ForgotPasswordActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/ForgotPasswordActivity.java @@ -1,10 +1,14 @@ package com.capstone.foodify.Activity; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; +import android.content.Context; import android.content.Intent; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.os.Bundle; import android.view.View; import android.widget.EditText; @@ -41,11 +45,30 @@ import retrofit2.Response; public class ForgotPasswordActivity extends AppCompatActivity { private FirebaseAuth mAuth; - TextInputLayout textInput_email; - EditText edt_email; - MaterialButton send_code_button; - ConstraintLayout progress_layout; - ImageView back_image; + private TextInputLayout textInput_email; + private EditText edt_email; + private MaterialButton send_code_button; + private ConstraintLayout progress_layout; + private ImageView back_image; + + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -53,6 +76,11 @@ public class ForgotPasswordActivity extends AppCompatActivity { initComponent(); + //Check internet connection + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } + mAuth = FirebaseAuth.getInstance(); //Back button diff --git a/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java b/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java index 37ac8fe..4483ee4 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java @@ -78,13 +78,13 @@ import retrofit2.Response; public class MainActivity extends AppCompatActivity { - FirebaseAppDistribution firebaseAppDistribution = FirebaseAppDistribution.getInstance(); - ViewPager2 viewPager2; - ViewPagerAdapter viewPagerAdapter; - BottomNavigationView bottomNavigationView; + public static boolean slider, shop, recommendFood, recentFood, loadUser; + private final FirebaseAppDistribution firebaseAppDistribution = FirebaseAppDistribution.getInstance(); + private ViewPager2 viewPager2; + private BottomNavigationView bottomNavigationView; private FirebaseAuth mAuth; private FirebaseUser user; - private ConstraintLayout progressLayout; + private static ConstraintLayout progressLayout; //Location private static final int REQUEST_CHECK_SETTINGS = 100; @@ -112,6 +112,7 @@ public class MainActivity extends AppCompatActivity { user = mAuth.getCurrentUser(); if (user != null && Common.CURRENT_USER == null) { + progressLayout.setVisibility(View.VISIBLE); user.getIdToken(true) .addOnCompleteListener(new OnCompleteListener() { @@ -130,6 +131,9 @@ public class MainActivity extends AppCompatActivity { HomeFragment.setNameUser(); getTokenFCM(); + + loadUser = true; + hideProgressbar(); } } @@ -142,6 +146,16 @@ public class MainActivity extends AppCompatActivity { } } }); + } else { + //No account login + loadUser = true; + hideProgressbar(); + } + } + + public static void hideProgressbar(){ + if(slider && shop && recentFood && recommendFood && loadUser){ + progressLayout.setVisibility(View.GONE); } } @@ -210,7 +224,6 @@ public class MainActivity extends AppCompatActivity { stopLocationUpdates(); } - progressLayout.setVisibility(View.GONE); } }, 4000); @@ -237,7 +250,6 @@ public class MainActivity extends AppCompatActivity { if(response.code() != 200) Toast.makeText(MainActivity.this, "Không thể cập nhật FCM Token. Mã lỗi: " + response.code(), Toast.LENGTH_SHORT).show(); - progressLayout.setVisibility(View.GONE); } @Override @@ -257,7 +269,7 @@ public class MainActivity extends AppCompatActivity { } private void bottomNavigation() { - viewPagerAdapter = new ViewPagerAdapter(this); + ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(this); viewPager2.setAdapter(viewPagerAdapter); viewPager2.setUserInputEnabled(false); diff --git a/app/src/main/java/com/capstone/foodify/Activity/OrderActivity.java b/app/src/main/java/com/capstone/foodify/Activity/OrderActivity.java index 12c0c55..936ffc0 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/OrderActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/OrderActivity.java @@ -1,26 +1,50 @@ package com.capstone.foodify.Activity; +import androidx.annotation.IntRange; import androidx.appcompat.app.AppCompatActivity; import androidx.viewpager2.widget.ViewPager2; import android.app.Activity; +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.os.Bundle; import android.view.View; import android.widget.ImageView; +import com.capstone.foodify.Common; import com.capstone.foodify.Fragment.Order.ViewPagerAdapter; import com.capstone.foodify.R; import com.google.android.material.tabs.TabLayout; public class OrderActivity extends AppCompatActivity { - TabLayout tabLayout; - ViewPager2 viewPager2; - ViewPagerAdapter viewPagerAdapter; - ImageView back_image; + private TabLayout tabLayout; + private ViewPager2 viewPager2; + private ViewPagerAdapter viewPagerAdapter; + private ImageView back_image; public static Activity orderActivity; + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -31,6 +55,11 @@ public class OrderActivity extends AppCompatActivity { viewPager2 = findViewById(R.id.view_pager); back_image = findViewById(R.id.back_image); + //Check internet connection + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } + viewPagerAdapter = new ViewPagerAdapter(this); viewPager2.setAdapter(viewPagerAdapter); @@ -39,7 +68,7 @@ public class OrderActivity extends AppCompatActivity { tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { - viewPager2.setCurrentItem(tab.getPosition()); + viewPager2.setCurrentItem(tab.getPosition(), false); } @Override diff --git a/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java b/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java index d92c590..c33564f 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java @@ -6,9 +6,12 @@ import android.content.Context; import android.content.Intent; import android.graphics.Typeface; import android.location.Geocoder; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.os.Build; import android.os.Bundle; import android.os.StrictMode; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; @@ -22,6 +25,7 @@ import android.widget.Spinner; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; @@ -71,6 +75,7 @@ import vn.zalopay.sdk.ZaloPaySDK; import vn.zalopay.sdk.listeners.PayOrderListener; public class OrderCheckOutActivity extends AppCompatActivity { + private static final String TAG = "OrderCheckOutActivity"; private static final String TAKE_FOOD_FROM_SHOP = "Đến shop lấy"; private static final String ZALO_PAYMENT_METHOD = "Zalo Pay"; private static final String CASH_PAYMENT = "CASH"; @@ -78,19 +83,19 @@ public class OrderCheckOutActivity extends AppCompatActivity { private static Double LNG_SHOP = 0.0; private static String finalAddress, tempAddress = null; private static double finalLat, finalLng = 0; - ImageView back_image; - OrderDetailAdapter adapter; - RecyclerView recyclerView; - TextView txt_userName, txt_phone, edt_address_detect, errorTextDistrictWard, txt_total, txt_distance, txt_ship_cost; - TextInputLayout textInput_address; - EditText edt_address; - Spinner spn_list_address, spn_district, spn_ward; - ConstraintLayout manual_input_address_layout; - Button change_address_button, confirm_address_button, btn_ZaloPay, btn_Pay; - RadioButton list_address_input, auto_detect_location, manual_input_address, radio_button_selected, take_food_from_shop; - RadioGroup address_option; - ConstraintLayout progress_layout; - float total, totalProduct, shipCost; + private ImageView back_image; + private OrderDetailAdapter adapter; + private RecyclerView recyclerView; + private TextView txt_userName, txt_phone, edt_address_detect, errorTextDistrictWard, txt_total, txt_distance, txt_ship_cost; + private TextInputLayout textInput_address; + private EditText edt_address; + private Spinner spn_list_address, spn_district, spn_ward; + private ConstraintLayout manual_input_address_layout; + private Button change_address_button, confirm_address_button, btn_ZaloPay, btn_Pay; + private RadioButton list_address_input, auto_detect_location, manual_input_address, radio_button_selected, take_food_from_shop; + private RadioGroup address_option; + private ConstraintLayout progress_layout; + private float total, totalProduct, shipCost; private static final ArrayList wardList = new ArrayList<>(); private static final ArrayList districtList = new ArrayList<>(); @@ -123,6 +128,25 @@ public class OrderCheckOutActivity extends AppCompatActivity { btn_Pay = findViewById(R.id.btnPay); } + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -132,7 +156,10 @@ public class OrderCheckOutActivity extends AppCompatActivity { if(Common.CURRENT_USER == null) startActivity(new Intent(this, SignInActivity.class)); - + //Check internet connection + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } //Init Component @@ -337,7 +364,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(OrderCheckOutActivity.this, "Lỗi kết nối!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } else { @@ -471,7 +498,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(OrderCheckOutActivity.this, "Đã xảy ra lỗi kết nối hệ thống!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } @@ -501,7 +528,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { //Calculate ship cost if(distance <= 3){ shipCost = 15000; - } else if(distance > 3 && distance <= 10){ + } else if(distance <= 10){ shipCost = 5000 * (float) distance; } else { shipCost = 3000 * (float) distance; @@ -518,7 +545,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(OrderCheckOutActivity.this, "Error: " + t, Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } else { @@ -543,7 +570,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(OrderCheckOutActivity.this, "Đã có lỗi kết nối đến hệ thống!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); @@ -563,10 +590,9 @@ public class OrderCheckOutActivity extends AppCompatActivity { * Math.sin(dLon / 2); double c = 2 * Math.asin(Math.sqrt(a)); double valueResult = Radius * c; - double km = valueResult / 1; DecimalFormat newFormat = new DecimalFormat("####"); - return Integer.valueOf(newFormat.format(km)); + return Integer.valueOf(newFormat.format(valueResult)); } private boolean validForm(){ @@ -759,7 +785,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { @Override public void onFailure(Call> call, Throwable t) { - Toast.makeText(OrderCheckOutActivity.this, "Đã xảy ra lỗi hệ thống. Vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } @@ -797,7 +823,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { @Override public void onFailure(Call> call, Throwable t) { - Toast.makeText(OrderCheckOutActivity.this, "Đã xảy ra lỗi hệ thống. Vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } else { diff --git a/app/src/main/java/com/capstone/foodify/Activity/OrderDetailActivity.java b/app/src/main/java/com/capstone/foodify/Activity/OrderDetailActivity.java index 6c44fb8..c44d724 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/OrderDetailActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/OrderDetailActivity.java @@ -1,12 +1,17 @@ package com.capstone.foodify.Activity; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import android.content.Context; import android.content.Intent; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.os.Bundle; +import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageView; @@ -39,17 +44,36 @@ import retrofit2.Callback; import retrofit2.Response; public class OrderDetailActivity extends AppCompatActivity { + private static final String TAG = "OrderDetailActivity"; private static final String AWAITING = "AWAITING"; private static final String SHIPPING = "SHIPPING"; private TextView order_tracking_number, user_name, phone, address, orderTime, total, status; private ImageView back_image; private List listOrderDetails = new ArrayList<>(); - OrderDetailAdapter adapter; - RecyclerView recyclerView; + private OrderDetailAdapter adapter; + private RecyclerView recyclerView; private Order order; private Button btn_cancel_order, btn_tracking_location_shipper; private View line_cancel_order, line_tracking_order; + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -58,6 +82,11 @@ public class OrderDetailActivity extends AppCompatActivity { //Init Component initComponent(); + //Check internet connection + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } + //Get data from previous fragment if(getIntent() != null) order = (Order) getIntent().getSerializableExtra("order"); @@ -179,7 +208,7 @@ public class OrderDetailActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(OrderDetailActivity.this, "Đã có lỗi kết nối đến hệ thống! Vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } diff --git a/app/src/main/java/com/capstone/foodify/Activity/ShopDetailActivity.java b/app/src/main/java/com/capstone/foodify/Activity/ShopDetailActivity.java index 5d9e127..608f6e1 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/ShopDetailActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/ShopDetailActivity.java @@ -1,11 +1,17 @@ package com.capstone.foodify.Activity; +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.os.Bundle; +import android.util.Log; import android.view.View; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; @@ -13,6 +19,7 @@ import androidx.core.widget.NestedScrollView; import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.capstone.foodify.API.FoodApi; import com.capstone.foodify.Adapter.FoodShopAdapter; @@ -32,7 +39,7 @@ import retrofit2.Callback; import retrofit2.Response; public class ShopDetailActivity extends AppCompatActivity { - + private static final String TAG = "ShopDetailActivity"; private static int CURRENT_PAGE; private static int PAGE_SIZE = 8; private static String SORT_BY = "name"; @@ -40,14 +47,35 @@ public class ShopDetailActivity extends AppCompatActivity { private static boolean LAST_PAGE = false; private int shopId; private List listFood = new ArrayList<>(); - TextView content_description_text_view, student_shop_text_view, end_of_list_text_view, txt_shop_name; - ImageView imageShop, back_image; - RecyclerView recycler_view_food_shop; - FoodShopAdapter adapter; + private TextView content_description_text_view, student_shop_text_view, end_of_list_text_view, txt_shop_name; + private ImageView imageShop, back_image; + private RecyclerView recycler_view_food_shop; + private FoodShopAdapter adapter; + private LinearLayout empty_layout; private NestedScrollView nestedScrollView; private ProgressBar progressBar; private Shop shop; private ConstraintLayout progressLayout; + private SwipeRefreshLayout swipeRefreshLayout; + + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } @Override protected void onCreate(Bundle savedInstanceState) { @@ -55,17 +83,12 @@ public class ShopDetailActivity extends AppCompatActivity { setContentView(R.layout.activity_shop_detail); //Init Component - imageShop = findViewById(R.id.image_shop); - recycler_view_food_shop = findViewById(R.id.recycler_view_food_shop); - back_image = findViewById(R.id.back_image); - adapter = new FoodShopAdapter(this); - content_description_text_view = findViewById(R.id.content_description_text_view); - student_shop_text_view = findViewById(R.id.student_shop_text_view); - nestedScrollView = findViewById(R.id.food_detail); - progressBar = findViewById(R.id.progress_bar); - end_of_list_text_view = findViewById(R.id.end_of_list_text); - progressLayout = findViewById(R.id.progress_layout); - txt_shop_name = findViewById(R.id.txt_shop_name); + initComponent(); + + //Check internet connection + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } //Get data if (getIntent() != null) @@ -101,6 +124,42 @@ public class ShopDetailActivity extends AppCompatActivity { }); } + swipeRefreshLayout.setColorSchemeColors(getResources().getColor(R.color.primaryColor, null)); + + swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + CURRENT_PAGE = 0; + getDetailShop(shopId); + nestedScrollView.setVisibility(View.GONE); + progressLayout.setVisibility(View.VISIBLE); + + recycler_view_food_shop.setVisibility(View.VISIBLE); + progressBar.setVisibility(View.VISIBLE); + end_of_list_text_view.setVisibility(View.GONE); + + empty_layout.setVisibility(View.GONE); + + swipeRefreshLayout.setRefreshing(false); + } + }); + + } + + private void initComponent() { + imageShop = findViewById(R.id.image_shop); + recycler_view_food_shop = findViewById(R.id.recycler_view_food_shop); + back_image = findViewById(R.id.back_image); + adapter = new FoodShopAdapter(this); + content_description_text_view = findViewById(R.id.content_description_text_view); + student_shop_text_view = findViewById(R.id.student_shop_text_view); + nestedScrollView = findViewById(R.id.food_detail); + progressBar = findViewById(R.id.progress_bar); + end_of_list_text_view = findViewById(R.id.end_of_list_text); + progressLayout = findViewById(R.id.progress_layout); + txt_shop_name = findViewById(R.id.txt_shop_name); + empty_layout = findViewById(R.id.empty_layout); + swipeRefreshLayout = findViewById(R.id.swipe_refresh); } private void getListFood(int shopId){ @@ -122,21 +181,33 @@ public class ShopDetailActivity extends AppCompatActivity { recycler_view_food_shop.setAdapter(adapter); initData(shop); - progressLayout.setVisibility(View.GONE); + + if(listFood.size() == 0){ + progressBar.setVisibility(View.GONE); + end_of_list_text_view.setVisibility(View.GONE); + + empty_layout.setVisibility(View.VISIBLE); + return; + } + + + if(LAST_PAGE){ + progressBar.setVisibility(View.GONE); + end_of_list_text_view.setVisibility(View.VISIBLE); + } } @Override public void onFailure(Call call, Throwable t) { - //Check internet connection - Common.showNotificationError(getBaseContext(), ShopDetailActivity.this); + Log.e(TAG, t.toString()); progressLayout.setVisibility(View.GONE); } }); } private void getDetailShop(int shopId) { - FoodApi.apiService.detailShop(shopId).enqueue(new Callback() { + FoodApi.apiService.getShopById(shopId).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { Shop tempShop = response.body(); @@ -150,7 +221,7 @@ public class ShopDetailActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - Common.showNotificationError(getBaseContext(), ShopDetailActivity.this); + Log.e(TAG, t.toString()); } }); } diff --git a/app/src/main/java/com/capstone/foodify/Activity/SignInActivity.java b/app/src/main/java/com/capstone/foodify/Activity/SignInActivity.java index c8a3a90..635aa3f 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/SignInActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/SignInActivity.java @@ -1,25 +1,28 @@ package com.capstone.foodify.Activity; +import android.content.Context; import android.content.Intent; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; +import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; 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.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.Task; import com.google.android.material.button.MaterialButton; import com.google.android.material.textfield.TextInputEditText; @@ -40,19 +43,43 @@ import retrofit2.Callback; import retrofit2.Response; public class SignInActivity extends AppCompatActivity { - + private static final String TAG = "SignInActivity"; private FirebaseAuth mAuth; - TextView signUp_textView, forgotPassword_textView; - TextInputLayout textInput_email, textInput_password; - TextInputEditText edt_email, edt_password; - MaterialButton signInButton; - ImageView back_image; - ConstraintLayout progressLayout; - String email, password = null; + private TextView signUp_textView, forgotPassword_textView; + private TextInputLayout textInput_email, textInput_password; + private TextInputEditText edt_email, edt_password; + private MaterialButton signInButton; + private ImageView back_image; + private ConstraintLayout progressLayout; + private String email, password = null; + + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + //Check internet connection + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } + //Init firebase app FirebaseApp.initializeApp(SignInActivity.this); setContentView(R.layout.activity_sign_in); @@ -247,8 +274,7 @@ public class SignInActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - System.out.println("ERROR: " + t); - Common.showErrorServerNotification(SignInActivity.this, "Không thể đăng nhập tài khoản! Vui lòng thử lại sau!"); + Log.e(TAG, t.toString()); } }); } else { diff --git a/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java b/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java index 57d5cb6..988d6cf 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java @@ -1,5 +1,6 @@ package com.capstone.foodify.Activity; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; @@ -8,9 +9,12 @@ import android.app.DatePickerDialog; import android.content.Context; import android.content.Intent; import android.graphics.Typeface; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; @@ -58,6 +62,7 @@ import retrofit2.Callback; import retrofit2.Response; public class SignUpActivity extends AppCompatActivity { + private static final String TAG = "SignUpActivity"; TextInputLayout textInput_password, textInput_phone, textInput_email, textInput_id_card, textInput_address, textInput_confirmPassword, textInput_fullName, textInput_birthDay; final Calendar myCalendar= Calendar.getInstance(); @@ -106,6 +111,24 @@ public class SignUpActivity extends AppCompatActivity { } + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -113,9 +136,15 @@ public class SignUpActivity extends AppCompatActivity { initComponent(); + //Check internet connection + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } + setFontUI(); chooseDateOfBirth(); + //Get list district if(districtList.size() == 0){ getListDistrict(); @@ -248,7 +277,7 @@ public class SignUpActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - + Log.e(TAG, t.toString()); } }); } @@ -276,7 +305,7 @@ public class SignUpActivity extends AppCompatActivity { @Override public void onFailure(Call call, Throwable t) { - + Log.e(TAG, t.toString()); } }); } @@ -485,7 +514,7 @@ public class SignUpActivity extends AppCompatActivity { @Override public void onFailure(Call> call, Throwable t) { - Toast.makeText(SignUpActivity.this, "Đã xảy ra lỗi hệ thống. Vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } @@ -523,7 +552,7 @@ public class SignUpActivity extends AppCompatActivity { @Override public void onFailure(Call> call, Throwable t) { - Toast.makeText(SignUpActivity.this, "Đã xảy ra lỗi hệ thống. Vui lòng thử lại sau!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } else { diff --git a/app/src/main/java/com/capstone/foodify/Activity/TrackingOrderActivity.java b/app/src/main/java/com/capstone/foodify/Activity/TrackingOrderActivity.java index 10f685c..da073de 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/TrackingOrderActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/TrackingOrderActivity.java @@ -7,12 +7,16 @@ import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.drawable.Drawable; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.os.AsyncTask; import android.os.Bundle; +import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.Toast; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; import androidx.fragment.app.FragmentActivity; @@ -53,7 +57,7 @@ import retrofit2.Callback; import retrofit2.Response; public class TrackingOrderActivity extends FragmentActivity implements OnMapReadyCallback, ValueEventListener { - + private static final String TAG = "TrackingOrderActivity"; private GoogleMap mMap; private ActivityTrackingOrderBinding binding; private String trackingOrderNumber, latOrder, lngOrder = null; @@ -62,12 +66,35 @@ public class TrackingOrderActivity extends FragmentActivity implements OnMapRead private DatabaseReference orderDatabase; private Marker shippingMarker; private Polyline polyline; - private static final String TAG = "TrackingOrderActivity"; + + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + //Check internet connection + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } + //Get tracking number order if(getIntent() != null){ trackingOrderNumber = getIntent().getStringExtra("trackingOrderNumber"); @@ -175,7 +202,7 @@ public class TrackingOrderActivity extends FragmentActivity implements OnMapRead @Override public void onFailure(Call call, Throwable t) { - Toast.makeText(TrackingOrderActivity.this, "Có lỗi kết nối!", Toast.LENGTH_SHORT).show(); + Log.e(TAG, t.toString()); } }); } diff --git a/app/src/main/java/com/capstone/foodify/Activity/VerifyAccountActivity.java b/app/src/main/java/com/capstone/foodify/Activity/VerifyAccountActivity.java index 211caac..840baa5 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/VerifyAccountActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/VerifyAccountActivity.java @@ -2,13 +2,17 @@ package com.capstone.foodify.Activity; import android.Manifest; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.net.ConnectivityManager; +import android.net.NetworkCapabilities; import android.os.Bundle; import android.os.CountDownTimer; import android.text.Editable; import android.text.TextWatcher; +import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.widget.EditText; @@ -20,6 +24,7 @@ import androidx.activity.result.ActivityResult; import androidx.activity.result.ActivityResultCallback; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.IntRange; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; @@ -52,17 +57,37 @@ import retrofit2.Callback; import retrofit2.Response; public class VerifyAccountActivity extends AppCompatActivity { + private static final String TAG = "VerifyAccountActivity"; private static final String PHONE_CODE = "+84"; - ActivityResultLauncher activityResultLauncher; - SmsBroadcastReceiver smsBroadcastReceiver; + private ActivityResultLauncher activityResultLauncher; + private SmsBroadcastReceiver smsBroadcastReceiver; private EditText inputCode1, inputCode2, inputCode3, inputCode4, inputCode5, inputCode6; - ImageView close_image; - MaterialButton confirm_code; - String verificationId, phone, password = null; - ConstraintLayout progressLayout; - TextView resendCodeText, resendCodeTextButton, countDown, errorText; - User user; - FirebaseAuth mAuth; + private ImageView close_image; + private MaterialButton confirm_code; + private String verificationId, phone, password = null; + private ConstraintLayout progressLayout; + private TextView resendCodeText, resendCodeTextButton, countDown, errorText; + private User user; + private FirebaseAuth mAuth; + + @IntRange(from = 0, to = 3) + public int getConnectionType() { + int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi + ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; + } + } + } + return result; + } @Override protected void onCreate(Bundle savedInstanceState) { @@ -71,6 +96,11 @@ public class VerifyAccountActivity extends AppCompatActivity { initComponent(); + //Check internet connection + if(getConnectionType() == 0){ + Common.showErrorInternetConnectionNotification(this); + } + //Auto fill OTP Code requestSMSPermission(); startSmartUserContent(); @@ -263,7 +293,7 @@ public class VerifyAccountActivity extends AppCompatActivity { public void onFailure(Call call, Throwable t) { progressLayout.setVisibility(View.GONE); showErrorText(t.toString()); - Common.showErrorServerNotification(VerifyAccountActivity.this, "Không thể tạo tài khoản! Vui lòng thử lại sau!"); + Log.e(TAG, t.toString()); } }); } else { @@ -429,7 +459,6 @@ public class VerifyAccountActivity extends AppCompatActivity { @Override public void onFailure() { - } }; diff --git a/app/src/main/java/com/capstone/foodify/Common.java b/app/src/main/java/com/capstone/foodify/Common.java index 3e6e10b..43eab78 100644 --- a/app/src/main/java/com/capstone/foodify/Common.java +++ b/app/src/main/java/com/capstone/foodify/Common.java @@ -41,7 +41,7 @@ import retrofit2.Response; public class Common { //https://foodify-backend-production.up.railway.app/ - public static final String BASE_URL = "https://foodify-backend-production.up.railway.app/api/"; + public static final String BASE_URL = "http://192.168.1.183:8080/api/"; public static String FCM_TOKEN = null; public static Location CURRENT_LOCATION = null; public static final String MAP_API = "AIzaSyAY14Ic32UP26Hg6GILznOfbBihiY5BUxw"; @@ -94,31 +94,15 @@ public class Common { public static int getConnectionType(Context context) { int result = 0; // Returns connection type. 0: none; 1: mobile data; 2: wifi ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (cm != null) { - NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); - if (capabilities != null) { - if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { - result = 2; - } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { - result = 1; - } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { - result = 3; - } - } - } - } else { - if (cm != null) { - NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); - if (activeNetwork != null) { - // connected to the internet - if (activeNetwork.getType() == ConnectivityManager.TYPE_WIFI) { - result = 2; - } else if (activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE) { - result = 1; - } else if (activeNetwork.getType() == ConnectivityManager.TYPE_VPN) { - result = 3; - } + if (cm != null) { + NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); + if (capabilities != null) { + if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { + result = 2; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) { + result = 1; + } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) { + result = 3; } } } diff --git a/app/src/main/java/com/capstone/foodify/Fragment/BasketFragment.java b/app/src/main/java/com/capstone/foodify/Fragment/BasketFragment.java index 3b01169..300c17f 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/BasketFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/BasketFragment.java @@ -61,6 +61,11 @@ public class BasketFragment extends Fragment implements ItemTouchHelperListener btnCheckOut = view.findViewById(R.id.btnCheckOut); listBasketFoodLayout = view.findViewById(R.id.list_basket_food_layout); + //Check status internet + if(Common.getConnectionType(requireContext()) == 0){ + Common.showErrorInternetConnectionNotification(getActivity()); + } + //Check list basket is null or not! checkListBasket(); 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 ae58f46..cc2086f 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/HomeFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/HomeFragment.java @@ -1,17 +1,19 @@ package com.capstone.foodify.Fragment; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import android.widget.Toast; -import androidx.constraintlayout.widget.ConstraintLayout; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.capstone.foodify.API.FoodApi; +import com.capstone.foodify.Activity.MainActivity; import com.capstone.foodify.Adapter.MenuAdapter; import com.capstone.foodify.Adapter.ShopAdapter; import com.capstone.foodify.Common; @@ -28,6 +30,7 @@ import com.denzcoskun.imageslider.models.SlideModel; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import retrofit2.Call; import retrofit2.Callback; @@ -35,6 +38,7 @@ import retrofit2.Response; public class HomeFragment extends Fragment { + private static final String TAG = "HomeFragment"; public static List listFood = new ArrayList<>(); private static List recentFood = new ArrayList<>(); @@ -61,9 +65,16 @@ public class HomeFragment extends Fragment { shopAdapter = new ShopAdapter(getContext()); welcomeText = view.findViewById(R.id.welcome_text); + //Check status internet + if(Common.getConnectionType(requireContext()) == 0){ + Common.showErrorInternetConnectionNotification(getActivity()); + } + if(listFood.isEmpty() || recentFood.isEmpty()){ + //Get food getListFood(); + recentFood(); } else { menuAdapter.setData(getListMenu()); rcvMenu.setAdapter(menuAdapter); @@ -75,7 +86,8 @@ public class HomeFragment extends Fragment { LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false); rcvMenu.setLayoutManager(linearLayoutManager); - showSlider(); + //Get slider + getSlider(); //Get list shop getListShop(); @@ -100,7 +112,7 @@ public class HomeFragment extends Fragment { welcomeText.setText("Xin chào, khách!"); } - private void showSlider(){ + private void getSlider(){ FoodApi.apiService.listSlider().enqueue(new Callback>() { @Override @@ -114,10 +126,13 @@ public class HomeFragment extends Fragment { imageSlider.setImageList(slideModels, ScaleTypes.FIT); + MainActivity.slider = true; + MainActivity.hideProgressbar(); } @Override public void onFailure(Call> call, Throwable t) { + Log.e(TAG, t.toString()); } }); } @@ -140,17 +155,17 @@ public class HomeFragment extends Fragment { //Check null data if(foodResponse == null) return; - listFood = foodResponse.getProducts(); - recentFood(); + + menuAdapter.setData(getListMenu()); + + MainActivity.recommendFood = true; + MainActivity.hideProgressbar(); } @Override public void onFailure(Call call, Throwable t) { - //Check internet connection - if(getActivity() != null) - Common.showNotificationError(getContext(), getActivity()); - + Log.e(TAG, t.toString()); } }); } @@ -169,10 +184,14 @@ public class HomeFragment extends Fragment { menuAdapter.setData(getListMenu()); rcvMenu.setAdapter(menuAdapter); + + MainActivity.recentFood = true; + MainActivity.hideProgressbar(); } @Override public void onFailure(Call call, Throwable t) { + Log.e(TAG, t.toString()); } }); } @@ -190,10 +209,14 @@ public class HomeFragment extends Fragment { shopAdapter.setData(shopList); recyclerView_restaurant.setAdapter(shopAdapter); + + MainActivity.shop = true; + MainActivity.hideProgressbar(); } @Override public void onFailure(Call call, Throwable t) { + Log.e(TAG, t.toString()); } }); } diff --git a/app/src/main/java/com/capstone/foodify/Fragment/Order/CancelOrderFragment.java b/app/src/main/java/com/capstone/foodify/Fragment/Order/CancelOrderFragment.java index aa8194e..756377c 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/Order/CancelOrderFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/Order/CancelOrderFragment.java @@ -52,6 +52,11 @@ public class CancelOrderFragment extends Fragment { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_cancel_order, container, false); + //Check status internet + if(Common.getConnectionType(requireContext()) == 0){ + Common.showErrorInternetConnectionNotification(getActivity()); + } + //Init Component initComponent(view); diff --git a/app/src/main/java/com/capstone/foodify/Fragment/ProfileFragment.java b/app/src/main/java/com/capstone/foodify/Fragment/ProfileFragment.java index 012e397..559f115 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/ProfileFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/ProfileFragment.java @@ -28,6 +28,7 @@ import com.squareup.picasso.Picasso; import io.paperdb.Paper; public class ProfileFragment extends Fragment { + private static final String TAG = "ProfileFragment"; LinearLayout account_and_profile, manage_address, favorite_food, order_history, log_out; PopupDialog popupDialog; TextView user_name; @@ -49,6 +50,11 @@ public class ProfileFragment extends Fragment { popupDialog = PopupDialog.getInstance(getContext()); + //Check status internet + if(Common.getConnectionType(requireContext()) == 0){ + Common.showErrorInternetConnectionNotification(getActivity()); + } + //Set image for user if(Common.CURRENT_USER.getImageUrl().isEmpty()){ profile_avatar.setImageResource(R.drawable.profile_avatar); 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 3b4a8ea..a0dc1a3 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java @@ -1,6 +1,7 @@ package com.capstone.foodify.Fragment; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -38,6 +39,7 @@ import retrofit2.http.GET; public class SearchFragment extends Fragment { + private static final String TAG = "SearchFragment"; private static int CURRENT_PAGE = 0; private static final int LIMIT = 8; private static boolean LAST_PAGE; @@ -73,6 +75,11 @@ public class SearchFragment extends Fragment { end_of_list_text_view = view.findViewById(R.id.end_of_list_text); searchNotFound = view.findViewById(R.id.search_not_found); + //Check status internet + if(Common.getConnectionType(requireContext()) == 0){ + Common.showErrorInternetConnectionNotification(getActivity()); + } + getListCategory(); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext()); @@ -161,8 +168,7 @@ public class SearchFragment extends Fragment { @Override public void onFailure(Call call, Throwable t) { - //Check internet connection - Common.showNotificationError(getContext(), getActivity()); + Log.e(TAG, t.toString()); } }); } @@ -262,8 +268,7 @@ public class SearchFragment extends Fragment { @Override public void onFailure(Call call, Throwable t) { - //Check internet connection - Common.showNotificationError(getContext(), getActivity()); + Log.e(TAG, t.toString()); } }); } @@ -283,7 +288,7 @@ public class SearchFragment extends Fragment { @Override public void onFailure(Call call, Throwable t) { - + Log.e(TAG, t.toString()); } }); } @@ -303,8 +308,7 @@ public class SearchFragment extends Fragment { @Override public void onFailure(Call call, Throwable t) { - //Check internet connection - Common.showNotificationError(getContext(), getActivity()); + Log.e(TAG, t.toString()); } }); } @@ -319,8 +323,7 @@ public class SearchFragment extends Fragment { @Override public void onFailure(Call call, Throwable t) { - //Check internet connection - Common.showNotificationError(getContext(), getActivity()); + Log.e(TAG, t.toString()); } }); } diff --git a/app/src/main/res/drawable/no_food.png b/app/src/main/res/drawable/no_food.png new file mode 100644 index 0000000..9c06687 Binary files /dev/null and b/app/src/main/res/drawable/no_food.png differ diff --git a/app/src/main/res/layout/activity_shop_detail.xml b/app/src/main/res/layout/activity_shop_detail.xml index c691c2f..8a71dc0 100644 --- a/app/src/main/res/layout/activity_shop_detail.xml +++ b/app/src/main/res/layout/activity_shop_detail.xml @@ -7,160 +7,201 @@ tools:context=".Activity.ShopDetailActivity" > - - - - - - - - - - - - - - - - - - - + app:layout_constraintTop_toBottomOf="@id/image_shop" + android:id="@+id/information_shop" + > - + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + - - diff --git a/app/src/test/java/com/capstone/foodify/ExampleUnitTest.java b/app/src/test/java/com/capstone/foodify/ExampleUnitTest.java deleted file mode 100644 index 139b612..0000000 --- a/app/src/test/java/com/capstone/foodify/ExampleUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.capstone.foodify; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - @Test - public void addition_isCorrect() { - assertEquals(4, 2 + 2); - } -} \ No newline at end of file diff --git a/app/src/test/java/com/capstone/foodify/UnitTest.java b/app/src/test/java/com/capstone/foodify/UnitTest.java new file mode 100644 index 0000000..fdf1126 --- /dev/null +++ b/app/src/test/java/com/capstone/foodify/UnitTest.java @@ -0,0 +1,324 @@ +package com.capstone.foodify; + +import org.junit.Test; + +import static org.junit.Assert.*; + +import com.capstone.foodify.API.FoodApi; +import com.capstone.foodify.Model.Address; +import com.capstone.foodify.Model.Comment; +import com.capstone.foodify.Model.DistrictWardResponse; +import com.capstone.foodify.Model.Food; +import com.capstone.foodify.Model.Response.Categories; +import com.capstone.foodify.Model.Response.Comments; +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; +import com.capstone.foodify.Model.Slider; +import com.capstone.foodify.Model.User; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import retrofit2.Response; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class UnitTest { + @Test + public void testGetDistrict() { + try { + Response> response = FoodApi.apiService.districtResponse().execute(); + + List listDistrict = response.body(); + + + assertTrue(response.code() == 200 && Objects.requireNonNull(listDistrict).size() > 0); + } catch (IOException e) { + fail(); + } + } + + @Test + public void testGetWard() { + try { + Response> response = FoodApi.apiService.wardResponse(1).execute(); + + List listWard = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(listWard).size() > 0); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void testGetFoodRecommend() { + try { + Response response = FoodApi.apiService.recommendFood().execute(); + + Foods listFood = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(listFood).getProducts().size() > 0); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void testGetFoodRecent() { + try { + Response response = FoodApi.apiService.recentFood().execute(); + + Foods listFood = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(listFood).getProducts().size() > 0); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void testGetAllShop() { + try { + Response response = FoodApi.apiService.allShops().execute(); + + Shops listFood = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(listFood).getShops().size() > 0); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void testSearchFoodByName() { + try { + Response response = FoodApi.apiService.searchFoodByName("a", 0, 8, "id", "asc").execute(); + + Foods listFood = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(listFood).getProducts().size() > 0); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void testGetListFood() { + try { + Response response = FoodApi.apiService.listFood(0, 8, "id", "asc").execute(); + + Foods listFood = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(listFood).getProducts().size() > 0); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void testGetListCategory() { + try { + Response response = FoodApi.apiService.listCategory().execute(); + + Categories listFood = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(listFood).getCategories().size() > 0); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void testGetListFoodByCategory() { + + List statusCategoryChecked = new ArrayList<>(); + statusCategoryChecked.add(1); + statusCategoryChecked.add(2); + + try { + Response response = FoodApi.apiService.listFoodByCategory(statusCategoryChecked, 0, 8, "id", "asc").execute(); + + Foods listFood = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(listFood).getProducts().size() > 0); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void testGetListFoodByCategoryAndName() { + + List statusCategoryChecked = new ArrayList<>(); + statusCategoryChecked.add(1); + statusCategoryChecked.add(2); + + try { + Response response = FoodApi.apiService.listFoodByCategoriesAndName(statusCategoryChecked, "a",0, 8, "id", "asc").execute(); + + Foods listFood = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(listFood).getProducts().size() > 0); + + } catch (IOException e) { + fail(); + } + } + + + @Test + public void getDetailFood() { + + try { + Response response = FoodApi.apiService.detailFood("10").execute(); + + Food food = null; + + food = response.body(); + + assertTrue(response.code() == 200 && food != null); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void getDetailShop() { + + try { + Response response = FoodApi.apiService.getShopById(1).execute(); + + Shop shop = null; + + shop = response.body(); + + assertTrue(response.code() == 200 && shop != null); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void testGetListFoodByShopId() { + + + try { + Response response = FoodApi.apiService.listFoodByShopId(1, 0, 8, "name", "asc").execute(); + + Foods listFood = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(listFood).getProducts().size() > 0); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void testGetListSlider() { + + + try { + Response> response = FoodApi.apiService.listSlider().execute(); + + List listSlider = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(listSlider).size() > 0); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void checkPhoneExist() { + User user = new User(new Address(), "", "", "", "", "0987654321"); + + try { + Response response = FoodApi.apiService.checkEmailOrPhoneExist(user).execute(); + + CustomResponse customResponse = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(customResponse).isTrue()); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void getCommentByProductId() { + try { + Response response = FoodApi.apiService.getCommentByProductId(13, 0, 8, "id", "asc").execute(); + + Comments listComment = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(listComment).getComments().size() > 0); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void getUserComment() { + try { + Response response = FoodApi.apiService.getUserComment(13, 17).execute(); + + Comment comment = response.body(); + + assertTrue(response.code() == 200 && comment != null); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void getShopById() { + + try { + Response response = FoodApi.apiService.checkUserBuyProduct(13, 17).execute(); + + CustomResponse customResponse = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(customResponse).isTrue()); + + } catch (IOException e) { + fail(); + } + } + + @Test + public void checkIdentifiedCode() { + + try { + Response response = FoodApi.apiService.checkIdentifiedCode("0987654321").execute(); + + CustomResponse customResponse = response.body(); + + assertTrue(response.code() == 200 && Objects.requireNonNull(customResponse).isTrue()); + + } catch (IOException e) { + fail(); + } + } +} \ No newline at end of file