diff --git a/app/build.gradle b/app/build.gradle index 15d6f24..a52bcb5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -26,7 +26,7 @@ android { minSdk 26 targetSdk 32 versionCode 1 - versionName "0.3.2" + versionName "0.4.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" signingConfig signingConfigs.release diff --git a/app/release/app-release.apk b/app/release/app-release.apk index 50909c4..5f2b1e9 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 9a655b0..86510ca 100644 --- a/app/release/output-metadata.json +++ b/app/release/output-metadata.json @@ -12,7 +12,7 @@ "filters": [], "attributes": [], "versionCode": 1, - "versionName": "0.3.2", + "versionName": "0.3.4", "outputFile": "app-release.apk" } ], diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cc7bec3..6dff26a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -49,6 +49,10 @@ + + { // Initialise custom font, for example: Typeface font = Typeface.createFromAsset(getContext().getAssets(), - "font/bebas.ttf"); + "font/koho_bold.ttf"); // (In reality I used a manager which caches the Typeface objects) // Typeface font = FontManager.getInstance().getFont(getContext(), BLAMBOT); 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 d82be37..b559ef5 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/ChangePasswordActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/ChangePasswordActivity.java @@ -6,7 +6,6 @@ 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; @@ -27,10 +26,8 @@ import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.EmailAuthProvider; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; -import com.thecode.aestheticdialogs.AestheticDialog; import com.thecode.aestheticdialogs.DialogStyle; import com.thecode.aestheticdialogs.DialogType; -import com.thecode.aestheticdialogs.OnDialogClickListener; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -217,8 +214,8 @@ public class ChangePasswordActivity extends AppCompatActivity { } private void setFontUI() { - textInput_password.setTypeface(Common.setFontBebas(getAssets())); - textInput_old_password.setTypeface(Common.setFontBebas(getAssets())); - textInput_password_confirm.setTypeface(Common.setFontBebas(getAssets())); + textInput_password.setTypeface(Common.setFontKohoBold(getAssets())); + textInput_old_password.setTypeface(Common.setFontKohoBold(getAssets())); + textInput_password_confirm.setTypeface(Common.setFontKohoBold(getAssets())); } } \ No newline at end of file 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 e75db84..c44277e 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/ForgotPasswordActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/ForgotPasswordActivity.java @@ -6,43 +6,27 @@ 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; import android.widget.ImageView; -import android.widget.Toast; -import com.capstone.foodify.API.FoodApi; import com.capstone.foodify.Common; -import com.capstone.foodify.Model.Response.CustomResponse; -import com.capstone.foodify.Model.User; import com.capstone.foodify.R; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.android.material.button.MaterialButton; import com.google.android.material.textfield.TextInputLayout; -import com.google.firebase.FirebaseException; import com.google.firebase.auth.FirebaseAuth; -import com.google.firebase.auth.PhoneAuthCredential; -import com.google.firebase.auth.PhoneAuthOptions; -import com.google.firebase.auth.PhoneAuthProvider; import com.google.firebase.auth.SignInMethodQueryResult; -import com.thecode.aestheticdialogs.AestheticDialog; import com.thecode.aestheticdialogs.DialogStyle; import com.thecode.aestheticdialogs.DialogType; -import com.thecode.aestheticdialogs.OnDialogClickListener; -import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; - public class ForgotPasswordActivity extends AppCompatActivity { private FirebaseAuth mAuth; private TextInputLayout textInput_email; @@ -165,7 +149,7 @@ public class ForgotPasswordActivity extends AppCompatActivity { } private void setFontUI() { - textInput_email.setTypeface(Common.setFontBebas(getAssets())); + textInput_email.setTypeface(Common.setFontKohoBold(getAssets())); } private void initComponent() { 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 08185cc..57ee42f 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/MainActivity.java @@ -2,6 +2,8 @@ package com.capstone.foodify.Activity; import android.Manifest; import android.annotation.SuppressLint; +import android.app.job.JobInfo; +import android.app.job.JobScheduler; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; @@ -42,6 +44,7 @@ import com.capstone.foodify.Fragment.HomeFragment; import com.capstone.foodify.Model.Response.CustomResponse; import com.capstone.foodify.Model.User; import com.capstone.foodify.R; +import com.capstone.foodify.RefreshTokenService; import com.capstone.foodify.ViewPagerAdapter; import com.google.android.gms.common.api.ApiException; import com.google.android.gms.common.api.ResolvableApiException; @@ -92,7 +95,7 @@ public class MainActivity extends AppCompatActivity { private static final long MAX_WAIT_TIME_IN_MILLISECONDS = 1000; private static final int LOCATION_REQUEST_CODE = 100; private static final String TAG = "MainActivity"; - + private static final int JOB_ID = 123; private FusedLocationProviderClient mFusedLocationClient; private SettingsClient mSettingsClient; private LocationRequest mLocationRequest; @@ -113,6 +116,8 @@ public class MainActivity extends AppCompatActivity { if (user != null && Common.CURRENT_USER == null) { + Common.FIREBASE_USER = user; + progressLayout.setVisibility(View.VISIBLE); user.getIdToken(true) .addOnCompleteListener(new OnCompleteListener() { @@ -228,12 +233,28 @@ public class MainActivity extends AppCompatActivity { startPowerSaverIntent(this); checkNotificationPermission(); - + startRefreshTokenService(); getLocation(); } + private void startRefreshTokenService() { + ComponentName componentName = new ComponentName(this, RefreshTokenService.class); + + JobInfo jobInfo = new JobInfo.Builder(JOB_ID, componentName) + .setPeriodic(59 * 60 * 1000) + .build(); + + JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE); + jobScheduler.schedule(jobInfo); + } + + private void stopRefreshTokenService() { + JobScheduler jobScheduler = (JobScheduler) getSystemService(JOB_SCHEDULER_SERVICE); + jobScheduler.cancel(JOB_ID); + } + private void getLocation() { if (Common.CURRENT_LOCATION == null) { mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); @@ -320,6 +341,7 @@ public class MainActivity extends AppCompatActivity { viewPager2.setAdapter(viewPagerAdapter); viewPager2.setUserInputEnabled(false); + bottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() { @SuppressLint("NonConstantResourceId") @Override @@ -509,6 +531,13 @@ public class MainActivity extends AppCompatActivity { } } + @Override + protected void onDestroy() { + super.onDestroy(); + + stopRefreshTokenService(); + } + //Check auto start permission public static List POWER_MANAGER_INTENTS = Arrays.asList( new Intent().setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")), @@ -558,8 +587,6 @@ public class MainActivity extends AppCompatActivity { } } } - - private static boolean isCallable(Context context, Intent intent) { List list = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 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 bbcc0d4..66b2f5c 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/OrderCheckOutActivity.java @@ -77,7 +77,7 @@ 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 ZALO_PAYMENT_METHOD = "ZALO PAY"; private static final String CASH_PAYMENT = "CASH"; private static Double LAT_SHOP = 0.0; private static Double LNG_SHOP = 0.0; @@ -840,7 +840,7 @@ public class OrderCheckOutActivity extends AppCompatActivity { private static class MySpinnerAdapter extends ArrayAdapter { // Initialise custom font, for example: Typeface font = Typeface.createFromAsset(getContext().getAssets(), - "font/bebas.ttf"); + "font/koho_bold.ttf"); // (In reality I used a manager which caches the Typeface objects) // Typeface font = FontManager.getInstance().getFont(getContext(), BLAMBOT); 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 58f55bf..81c9883 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/SignInActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/SignInActivity.java @@ -15,11 +15,9 @@ 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; @@ -283,8 +281,8 @@ public class SignInActivity extends AppCompatActivity { } private void setFontUI() { - textInput_email.setTypeface(Common.setFontBebas(getAssets())); - textInput_password.setTypeface(Common.setFontBebas(getAssets())); + textInput_email.setTypeface(Common.setFontKohoBold(getAssets())); + textInput_password.setTypeface(Common.setFontKohoBold(getAssets())); } // this event will enable the back 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 988d6cf..448801c 100644 --- a/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java +++ b/app/src/main/java/com/capstone/foodify/Activity/SignUpActivity.java @@ -24,7 +24,6 @@ import android.widget.EditText; import android.widget.ImageView; import android.widget.Spinner; import android.widget.TextView; -import android.widget.Toast; import com.capstone.foodify.API.FoodApi; import com.capstone.foodify.Common; @@ -569,7 +568,7 @@ public class SignUpActivity extends AppCompatActivity { private static class MySpinnerAdapter extends ArrayAdapter { // Initialise custom font, for example: Typeface font = Typeface.createFromAsset(getContext().getAssets(), - "font/bebas.ttf"); + "font/koho_bold.ttf"); // (In reality I used a manager which caches the Typeface objects) // Typeface font = FontManager.getInstance().getFont(getContext(), BLAMBOT); @@ -620,13 +619,13 @@ public class SignUpActivity extends AppCompatActivity { } private void setFontUI() { - textInput_password.setTypeface(Common.setFontBebas(getAssets())); - textInput_phone.setTypeface(Common.setFontBebas(getAssets())); - textInput_address.setTypeface(Common.setFontBebas(getAssets())); - textInput_confirmPassword.setTypeface(Common.setFontBebas(getAssets())); - textInput_fullName.setTypeface(Common.setFontBebas(getAssets())); - textInput_birthDay.setTypeface(Common.setFontBebas(getAssets())); - textInput_email.setTypeface(Common.setFontBebas(getAssets())); - textInput_id_card.setTypeface(Common.setFontBebas(getAssets())); + textInput_password.setTypeface(Common.setFontKohoBold(getAssets())); + textInput_phone.setTypeface(Common.setFontKohoBold(getAssets())); + textInput_address.setTypeface(Common.setFontKohoBold(getAssets())); + textInput_confirmPassword.setTypeface(Common.setFontKohoBold(getAssets())); + textInput_fullName.setTypeface(Common.setFontKohoBold(getAssets())); + textInput_birthDay.setTypeface(Common.setFontKohoBold(getAssets())); + textInput_email.setTypeface(Common.setFontKohoBold(getAssets())); + textInput_id_card.setTypeface(Common.setFontKohoBold(getAssets())); } } \ No newline at end of file diff --git a/app/src/main/java/com/capstone/foodify/Common.java b/app/src/main/java/com/capstone/foodify/Common.java index 984cede..6cabb27 100644 --- a/app/src/main/java/com/capstone/foodify/Common.java +++ b/app/src/main/java/com/capstone/foodify/Common.java @@ -2,29 +2,20 @@ package com.capstone.foodify; import android.app.Activity; import android.content.Context; -import android.content.Intent; import android.content.res.AssetManager; import android.graphics.Typeface; import android.location.Location; import android.net.ConnectivityManager; import android.net.NetworkCapabilities; -import android.net.NetworkInfo; -import android.os.Build; -import android.view.View; -import android.widget.Toast; import androidx.annotation.IntRange; import androidx.annotation.NonNull; import com.capstone.foodify.API.FoodApiToken; -import com.capstone.foodify.Activity.MainActivity; -import com.capstone.foodify.Activity.SignInActivity; -import com.capstone.foodify.Fragment.HomeFragment; import com.capstone.foodify.Model.Basket; import com.capstone.foodify.Model.Food; import com.capstone.foodify.Model.User; import com.google.firebase.appdistribution.FirebaseAppDistribution; -import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.thecode.aestheticdialogs.AestheticDialog; import com.thecode.aestheticdialogs.DialogStyle; @@ -45,6 +36,7 @@ public class Common { public static final String BASE_URL = "https://foodify-backend-production.up.railway.app/api/"; public static String FCM_TOKEN = null; public static Location CURRENT_LOCATION = null; + public static FirebaseUser FIREBASE_USER = null; public static final String MAP_API = "AIzaSyAY14Ic32UP26Hg6GILznOfbBihiY5BUxw"; public static final String FORMAT_DATE="dd-MM-yyyy"; public static final String VALID_EMAIL_ADDRESS_REGEX = "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$"; @@ -64,12 +56,12 @@ public class Common { return fmt.format(price); } - public static Typeface setFontBebas(AssetManager assetManager){ - return Typeface.createFromAsset(assetManager, "font/bebas.ttf"); + public static Typeface setFontKohoBold(AssetManager assetManager){ + return Typeface.createFromAsset(assetManager, "font/koho_bold.ttf"); } - public static Typeface setFontOpenSans(AssetManager assetManager){ - return Typeface.createFromAsset(assetManager, "font/opensans.ttf"); + public static Typeface setFontKoho(AssetManager assetManager){ + return Typeface.createFromAsset(assetManager, "font/koho.ttf"); } public static void reloadUser(Activity activity){ @@ -81,6 +73,10 @@ public class Common { if(userData != null){ Common.CURRENT_USER = userData; } + } else if(response.code() == 401){ + //Unauthorized + + } } 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 a0dc1a3..096036c 100644 --- a/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java +++ b/app/src/main/java/com/capstone/foodify/Fragment/SearchFragment.java @@ -1,5 +1,7 @@ package com.capstone.foodify.Fragment; +import android.content.Context; +import android.graphics.Typeface; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; diff --git a/app/src/main/java/com/capstone/foodify/RefreshTokenService.java b/app/src/main/java/com/capstone/foodify/RefreshTokenService.java new file mode 100644 index 0000000..11d37f8 --- /dev/null +++ b/app/src/main/java/com/capstone/foodify/RefreshTokenService.java @@ -0,0 +1,55 @@ +package com.capstone.foodify; + +import android.app.job.JobParameters; +import android.app.job.JobService; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.google.android.gms.tasks.OnCompleteListener; +import com.google.android.gms.tasks.Task; +import com.google.firebase.auth.GetTokenResult; + +public class RefreshTokenService extends JobService { + + private static final String TAG = "RefreshTokenService"; + + @Override + public boolean onStartJob(JobParameters params) { + + Log.d(TAG, "Refresh token service started!"); + + refreshToken(params); + + return true; + } + + private void refreshToken(JobParameters params) { + + if(Common.FIREBASE_USER != null){ + Common.FIREBASE_USER.getIdToken(true).addOnCompleteListener(new OnCompleteListener() { + @Override + public void onComplete(@NonNull Task task) { + if(task.isSuccessful()){ + Common.TOKEN = task.getResult().getToken(); + + Log.i(TAG, "Refresh token completed!"); + } else { + Log.e(TAG, "Error when refresh token!"); + } + + jobFinished(params, false); + } + }); + } + + } + + @Override + public boolean onStopJob(JobParameters params) { + + Log.d(TAG, "Stop serviced!"); + + return true; + } +} diff --git a/app/src/main/res/font/bebas.ttf b/app/src/main/res/font/bebas.ttf deleted file mode 100644 index ead2c4d..0000000 Binary files a/app/src/main/res/font/bebas.ttf and /dev/null differ diff --git a/app/src/main/res/font/koho.ttf b/app/src/main/res/font/koho.ttf new file mode 100644 index 0000000..78e04aa Binary files /dev/null and b/app/src/main/res/font/koho.ttf differ diff --git a/app/src/main/res/font/koho_bold.ttf b/app/src/main/res/font/koho_bold.ttf new file mode 100644 index 0000000..a0123f5 Binary files /dev/null and b/app/src/main/res/font/koho_bold.ttf differ diff --git a/app/src/main/res/font/koho_italic.ttf b/app/src/main/res/font/koho_italic.ttf new file mode 100644 index 0000000..e6cf346 Binary files /dev/null and b/app/src/main/res/font/koho_italic.ttf differ diff --git a/app/src/main/res/layout/activity_account_and_profile.xml b/app/src/main/res/layout/activity_account_and_profile.xml index 6a4f999..8982712 100644 --- a/app/src/main/res/layout/activity_account_and_profile.xml +++ b/app/src/main/res/layout/activity_account_and_profile.xml @@ -27,10 +27,10 @@ android:layout_height="wrap_content" android:layout_marginStart="20dp" android:layout_marginTop="35dp" - android:fontFamily="@font/bebas" + android:fontFamily="@font/koho_bold" android:text="@string/account_and_profile" android:textColor="@color/black" - android:textSize="40sp" + android:textSize="30sp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/back_image" /> @@ -50,8 +50,9 @@