diff --git a/.github/workflows/generate-apk-aab-debug-release.yml b/.github/workflows/generate-apk-aab-debug-release.yml deleted file mode 100644 index 6a966ec..0000000 --- a/.github/workflows/generate-apk-aab-debug-release.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: Android CI - -env: - # The name of the main module repository - main_project_module: app - -on: - # Triggers the workflow on push or pull request events but only for default and protected branches - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v1 - - # Set Current Date As Env Variable - - name: Set current date as env variable - run: echo "date_today=$(date +'%Y-%m-%d')" >> $GITHUB_ENV - - # Set Repository Name As Env Variable - - name: Set repository name as env variable - run: echo "repository_name=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')" >> $GITHUB_ENV - - - name: Set Up JDK - uses: actions/setup-java@v1 - with: - java-version: 11 - - - name: Change wrapper permissions - run: chmod +x ./gradlew - - # Run Build Project - - name: Build gradle project - run: ./gradlew build - - # Create APK Debug - - name: Build apk debug project (APK) - ${{ env.main_project_module }} module - run: ./gradlew assembleDebug - - # Upload Artifact Build - # Noted For Output [main_project_module]/build/outputs/apk/debug/ - - name: Upload APK Debug - ${{ env.repository_name }} - uses: actions/upload-artifact@v2 - with: - name: ${{ env.date_today }} - ${{ env.playstore_name }} - ${{ env.repository_name }} - APK(s) debug generated - path: ${{ env.main_project_module }}/build/outputs/apk/debug/ 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 af4c6c3..98dbdeb 100644 --- a/app/src/main/java/com/capstone/foodify/API/FoodApi.java +++ b/app/src/main/java/com/capstone/foodify/API/FoodApi.java @@ -31,11 +31,11 @@ public interface FoodApi { Gson gson = new GsonBuilder().setDateFormat("HH:mm:ss dd-MM-yyyy").setLenient().create(); FoodApi apiService = new Retrofit.Builder() - .baseUrl("http://192.168.1.183:8080/api/").addConverterFactory(GsonConverterFactory.create(gson)) + .baseUrl("https://foodify-backend-production.up.railway.app/api/").addConverterFactory(GsonConverterFactory.create(gson)) .build() .create(FoodApi.class); - @GET("products/enable?pageNo=0&pageSize=10&sortBy=id&sortDir=asc") + @GET("products/random?pageSize=10") Call recommendFood(); @GET("products/enable?pageNo=0&pageSize=10&sortBy=createdTime&sortDir=desc") diff --git a/app/src/main/java/com/capstone/foodify/API/FoodApiToken.java b/app/src/main/java/com/capstone/foodify/API/FoodApiToken.java index 8f0ff5f..a2348b8 100644 --- a/app/src/main/java/com/capstone/foodify/API/FoodApiToken.java +++ b/app/src/main/java/com/capstone/foodify/API/FoodApiToken.java @@ -50,7 +50,7 @@ public interface FoodApiToken { FoodApiToken apiService = new Retrofit.Builder() .client(client) - .baseUrl("http://192.168.1.183:8080/api/").addConverterFactory(GsonConverterFactory.create(gson)) + .baseUrl("https://foodify-backend-production.up.railway.app/api/").addConverterFactory(GsonConverterFactory.create(gson)) .build() .create(FoodApiToken.class); 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 bc062fd..1c45491 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/ChangePasswordActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/ChangePasswordActivity.java @@ -6,6 +6,8 @@ import androidx.constraintlayout.widget.ConstraintLayout; import android.graphics.Typeface; import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; import android.view.View; import android.widget.Button; import android.widget.EditText; @@ -74,6 +76,40 @@ public class ChangePasswordActivity extends AppCompatActivity { textInput_password.setErrorEnabled(false); } }); + + edtPassword.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + textInput_password.setErrorEnabled(false); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + + edtPasswordConfirm.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + textInput_password_confirm.setErrorEnabled(false); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); } private boolean validateData(){ 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 32ab673..0d782af 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/FoodDetailActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/FoodDetailActivity.java @@ -208,7 +208,9 @@ public class FoodDetailActivity extends AppCompatActivity { shopName_txt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - startActivity(new Intent(FoodDetailActivity.this, ShopDetailActivity.class)); + Intent intent = new Intent(FoodDetailActivity.this, ShopDetailActivity.class); + intent.putExtra("ShopId", food.getShop().getId()); + startActivity(intent); } }); 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 057711f..6e844ba 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java @@ -95,7 +95,7 @@ public class MainActivity extends AppCompatActivity { super.onStart(); //Get user from Paper - user = Paper.book().read("user"); +// user = Paper.book().read("user"); // Check if user is signed in (non-null) and update UI accordingly. user = mAuth.getCurrentUser(); @@ -117,6 +117,8 @@ public class MainActivity extends AppCompatActivity { if (userData != null) { Common.CURRENT_USER = userData; HomeFragment.setNameUser(); + + progressLayout.setVisibility(View.GONE); } } 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 3f9fe38..cf7c3c8 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/OrderActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/OrderActivity.java @@ -3,6 +3,7 @@ package com.capstone.foodify.Activity; import androidx.appcompat.app.AppCompatActivity; import androidx.viewpager2.widget.ViewPager2; +import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.ImageView; @@ -17,12 +18,15 @@ public class OrderActivity extends AppCompatActivity { ViewPager2 viewPager2; ViewPagerAdapter viewPagerAdapter; ImageView back_image; + public static Activity orderActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_order); + orderActivity = this; + //Init Component tabLayout = findViewById(R.id.tab_layout); viewPager2 = findViewById(R.id.view_pager); 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 79683cb..1703833 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java @@ -388,7 +388,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { @Override public void onClick(@NonNull AestheticDialog.Builder builder) { Common.LIST_BASKET_FOOD.clear(); - startActivity(new Intent(OrderCheckOutActivity.this, OrderActivity.class)); + startActivity(new Intent(OrderCheckOutActivity.this, MainActivity.class)); builder.dismiss(); finish(); } 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 b91e4f0..bfb07b8 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/OrderDetailActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/OrderDetailActivity.java @@ -138,6 +138,9 @@ public class OrderDetailActivity extends AppCompatActivity { .setOnClickListener(new OnDialogClickListener() { @Override public void onClick(@NonNull AestheticDialog.Builder builder) { + + OrderActivity.orderActivity.finish(); + startActivity(new Intent(OrderDetailActivity.this, OrderActivity.class)); builder.dismiss(); finish(); 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 ad723f0..5d9e127 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/ShopDetailActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/ShopDetailActivity.java @@ -40,11 +40,10 @@ 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; + 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 CollapsingToolbarLayout collapsingToolbarLayout; private NestedScrollView nestedScrollView; private ProgressBar progressBar; private Shop shop; @@ -60,13 +59,13 @@ public class ShopDetailActivity extends AppCompatActivity { recycler_view_food_shop = findViewById(R.id.recycler_view_food_shop); back_image = findViewById(R.id.back_image); adapter = new FoodShopAdapter(this); - collapsingToolbarLayout = findViewById(R.id.collapsing); 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); //Get data if (getIntent() != null) @@ -159,7 +158,7 @@ public class ShopDetailActivity extends AppCompatActivity { private void initData(Shop shop) { //Init data Picasso.get().load(shop.getImageUrl()).into(imageShop); - collapsingToolbarLayout.setTitle(shop.getName()); + txt_shop_name.setText(shop.getName()); content_description_text_view.setText(shop.getDescription()); //If shop is studentShop, enable tag student shop 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 bf8238c..d4905b7 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/SignInActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/SignInActivity.java @@ -2,6 +2,8 @@ package com.capstone.foodify.Activity; import android.content.Intent; import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; import android.view.View; import android.widget.ImageView; import android.widget.TextView; @@ -17,6 +19,7 @@ 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; @@ -26,6 +29,7 @@ import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.GetTokenResult; +import com.google.firebase.auth.SignInMethodQueryResult; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -99,6 +103,24 @@ public class SignInActivity extends AppCompatActivity { } } }); + + edt_password.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + textInput_password.setErrorEnabled(false); + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); + } private void initData(){ @@ -146,7 +168,26 @@ public class SignInActivity extends AppCompatActivity { mAuth.setLanguageCode("vi"); - mAuth.signInWithEmailAndPassword(edt_email.getText().toString(), edt_password.getText().toString()) + mAuth.fetchSignInMethodsForEmail(email) + .addOnCompleteListener(new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + + boolean isNewUser = task.getResult().getSignInMethods().isEmpty(); + + if (isNewUser) { + Toast.makeText(SignInActivity.this, "Tài khoản chưa được đăng ký! Vui lòng đăng ký để tiếp tục sử dụng!", Toast.LENGTH_SHORT).show(); + progressLayout.setVisibility(View.GONE); + } else { + signInMethod(); + } + + } + }); + } + + private void signInMethod(){ + mAuth.signInWithEmailAndPassword(email, password) .addOnCompleteListener(SignInActivity.this, new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { @@ -155,7 +196,7 @@ public class SignInActivity extends AppCompatActivity { FirebaseUser user = mAuth.getCurrentUser(); //Save user - Paper.book().write("user", user); +// Paper.book().write("user", user); user.getIdToken(true) .addOnCompleteListener(new OnCompleteListener() { 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 cf422ae..b3f17a8 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/VerifyAccountActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/VerifyAccountActivity.java @@ -9,6 +9,7 @@ import android.os.Bundle; import android.os.CountDownTimer; import android.text.Editable; import android.text.TextWatcher; +import android.view.KeyEvent; import android.view.View; import android.widget.EditText; import android.widget.ImageView; @@ -103,6 +104,7 @@ public class VerifyAccountActivity extends AppCompatActivity { //Init text changedListener textChangedListenerEditTextOTP(); + //Add event to confirm button confirm_code.setOnClickListener(new View.OnClickListener() { @Override @@ -283,104 +285,119 @@ public class VerifyAccountActivity extends AppCompatActivity { inputCode1.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { - if(inputCode1.getText().toString().length()== 0) //size as per your requirement - { - inputCode2.requestFocus(); - } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - // Nothing to do + if (s.length() == 1) { + inputCode2.requestFocus(View.FOCUS_DOWN); + } } @Override public void afterTextChanged(Editable s) { - // Nothing to do } }); inputCode2.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { - if(inputCode2.getText().toString().length()== 0) //size as per your requirement - { - inputCode3.requestFocus(); - } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - // Nothing to do + if(count == 0) { + inputCode1.requestFocus(View.FOCUS_DOWN); + } else { + if (s.length() == 1) { + inputCode3.requestFocus(View.FOCUS_DOWN); + } + } } @Override public void afterTextChanged(Editable s) { - // Nothing to do } }); inputCode3.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { - if(inputCode3.getText().toString().length()== 0) //size as per your requirement - { - inputCode4.requestFocus(); - } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - // Nothing to do + if(count == 0) { + inputCode2.requestFocus(View.FOCUS_DOWN); + } else { + if (s.length() == 1) { + inputCode4.requestFocus(View.FOCUS_DOWN); + } + } } @Override public void afterTextChanged(Editable s) { - // Nothing to do } }); - inputCode4.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { - if(inputCode4.getText().toString().length()== 0) //size as per your requirement - { - inputCode5.requestFocus(); - } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - // Nothing to do + if(count == 0) { + inputCode3.requestFocus(View.FOCUS_DOWN); + } else { + if (s.length() == 1) { + inputCode5.requestFocus(View.FOCUS_DOWN); + } + } } @Override public void afterTextChanged(Editable s) { - // Nothing to do } }); - inputCode5.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { - if(inputCode5.getText().toString().length()== 0) //size as per your requirement - { - inputCode6.requestFocus(); - } } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - // Nothing to do + if(count == 0) { + inputCode4.requestFocus(View.FOCUS_DOWN); + } else { + if (s.length() == 1) { + inputCode6.requestFocus(View.FOCUS_DOWN); + } + } + } + + @Override + public void afterTextChanged(Editable s) { + } + }); + + inputCode6.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + if(count == 0) { + inputCode5.requestFocus(View.FOCUS_DOWN); + } } @Override public void afterTextChanged(Editable s) { - // Nothing to do } }); } - private void requestSMSPermission() { String permission = Manifest.permission.RECEIVE_SMS; diff --git a/app/src/main/java/com/capstone/foodify/Adapter/FoodAdapter.java b/app/src/main/java/com/capstone/foodify/Adapter/FoodAdapter.java index e4a41b5..8a6b3cd 100644 --- a/app/src/main/java/com/capstone/foodify/Adapter/FoodAdapter.java +++ b/app/src/main/java/com/capstone/foodify/Adapter/FoodAdapter.java @@ -51,9 +51,9 @@ public class FoodAdapter extends RecyclerView.Adapter= 30){ + if(foodName.length() >= 24){ StringBuilder stringBuilder = new StringBuilder(food.getName()); - stringBuilder.replace(30, food.getName().length(), "..." ); + stringBuilder.replace(24, food.getName().length(), "..." ); holder.name.setText(stringBuilder); } else { holder.name.setText(foodName); diff --git a/app/src/main/java/com/capstone/foodify/Adapter/ShopAdapter.java b/app/src/main/java/com/capstone/foodify/Adapter/ShopAdapter.java index 111c94a..0e343a0 100644 --- a/app/src/main/java/com/capstone/foodify/Adapter/ShopAdapter.java +++ b/app/src/main/java/com/capstone/foodify/Adapter/ShopAdapter.java @@ -49,7 +49,16 @@ public class ShopAdapter extends RecyclerView.Adapter= 24){ + StringBuilder stringBuilder = new StringBuilder(shop.getName()); + stringBuilder.replace(24, shop.getName().length(), "..." ); + holder.shopName.setText(stringBuilder); + } else { + holder.shopName.setText(shopName); + } holder.itemView.setOnClickListener(new View.OnClickListener() { @Override 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 3699d72..6ce0df5 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/HomeFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/HomeFragment.java @@ -128,7 +128,7 @@ public class HomeFragment extends Fragment { List listMenu = new ArrayList<>(); listMenu.add(new Menu("Món ăn khuyến nghị", listFood)); - listMenu.add(new Menu("Món ăn phổ biến", recentFood)); + listMenu.add(new Menu("Món ăn được thêm gần đây", recentFood)); return listMenu; } 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 a6552da..4071209 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/ProfileFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/ProfileFragment.java @@ -104,7 +104,7 @@ public class ProfileFragment extends Fragment { FirebaseAuth.getInstance().signOut(); //Delete user from local storage - Paper.book().delete("user"); +// Paper.book().delete("user"); Common.TOKEN = null; Common.CURRENT_USER = null; diff --git a/app/src/main/res/layout/activity_favorite_food.xml b/app/src/main/res/layout/activity_favorite_food.xml index 201c5b8..c54b655 100644 --- a/app/src/main/res/layout/activity_favorite_food.xml +++ b/app/src/main/res/layout/activity_favorite_food.xml @@ -72,7 +72,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + app:layout_constraintTop_toBottomOf="@id/image_shop" + > - + + + + + + + + + + + + + + + + + + @@ -182,4 +184,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_sign_in.xml b/app/src/main/res/layout/activity_sign_in.xml index 97bcb12..0795bbb 100644 --- a/app/src/main/res/layout/activity_sign_in.xml +++ b/app/src/main/res/layout/activity_sign_in.xml @@ -105,7 +105,9 @@ android:textSize="15sp" android:textStyle="bold" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@+id/textInput_password" /> + app:layout_constraintTop_toBottomOf="@+id/textInput_password" + android:visibility="gone" + />