mirror of
https://github.com/Nezumi-2711/PRM392.git
synced 2026-09-22 13:48:29 +00:00
Update version Firebase, fix layout!
This commit is contained in:
@@ -9,7 +9,7 @@ android {
|
||||
applicationId "com.waterbase.foodify"
|
||||
minSdk 23
|
||||
targetSdk 30
|
||||
versionCode 1
|
||||
versionCode 2
|
||||
versionName "1.0"
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
@@ -50,11 +50,15 @@ dependencies {
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
|
||||
//Add library
|
||||
implementation 'com.google.firebase:firebase-messaging:11.8.0'
|
||||
implementation 'com.google.firebase:firebase-core:11.8.0'
|
||||
implementation 'com.google.firebase:firebase-database:11.8.0'
|
||||
implementation 'com.google.firebase:firebase-auth:11.8.0'
|
||||
implementation 'com.google.android.gms:play-services:11.8.0'
|
||||
implementation 'com.google.firebase:firebase-messaging:20.0.0'
|
||||
implementation 'com.google.firebase:firebase-core:20.0.0'
|
||||
implementation 'com.google.firebase:firebase-database:20.0.0'
|
||||
implementation 'com.google.firebase:firebase-auth:20.0.0'
|
||||
// implementation 'com.google.android.gms:play-services:12.0.1'
|
||||
implementation 'com.google.android.gms:play-services-maps:18.0.2'
|
||||
implementation 'com.google.android.gms:play-services-location:20.0.0'
|
||||
|
||||
implementation 'com.google.android.gms:play-services-auth:20.0.0'
|
||||
|
||||
implementation 'com.github.jd-alexander:android-flat-button:v1.1'
|
||||
implementation 'com.rengwuxian.materialedittext:library:2.1.4'
|
||||
@@ -76,12 +80,15 @@ dependencies {
|
||||
implementation 'io.github.inflationx:calligraphy3:3.1.1'
|
||||
implementation 'io.github.inflationx:viewpump:2.0.3'
|
||||
|
||||
implementation 'com.karumi:dexter:6.2.3'
|
||||
|
||||
//CounterFAB
|
||||
implementation 'com.github.andremion:counterfab:1.2.2'
|
||||
|
||||
//Slider
|
||||
implementation 'com.nineoldandroids:library:2.4.0'
|
||||
implementation 'com.daimajia.slider:library:1.1.5@aar'
|
||||
|
||||
}
|
||||
|
||||
apply plugin: 'com.google.gms.google-services'
|
||||
@@ -3,10 +3,10 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
package="com.waterbase.foodify">
|
||||
|
||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
|
||||
@@ -1,13 +1,18 @@
|
||||
package com.waterbase.foodify;
|
||||
|
||||
import android.Manifest;
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentSender;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.Color;
|
||||
import android.location.Location;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.os.Looper;
|
||||
import android.provider.Settings;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
import android.view.LayoutInflater;
|
||||
@@ -20,24 +25,39 @@ import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.recyclerview.widget.ItemTouchHelper;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.gms.common.ConnectionResult;
|
||||
import com.google.android.gms.common.GooglePlayServicesUtil;
|
||||
import com.google.android.gms.common.api.GoogleApiClient;
|
||||
import com.google.android.gms.common.api.ApiException;
|
||||
import com.google.android.gms.common.api.ResolvableApiException;
|
||||
import com.google.android.gms.location.FusedLocationProviderClient;
|
||||
import com.google.android.gms.location.LocationCallback;
|
||||
import com.google.android.gms.location.LocationListener;
|
||||
import com.google.android.gms.location.LocationRequest;
|
||||
import com.google.android.gms.location.LocationResult;
|
||||
import com.google.android.gms.location.LocationServices;
|
||||
import com.google.android.gms.location.LocationSettingsRequest;
|
||||
import com.google.android.gms.location.LocationSettingsResponse;
|
||||
import com.google.android.gms.location.LocationSettingsStatusCodes;
|
||||
import com.google.android.gms.location.Priority;
|
||||
import com.google.android.gms.location.SettingsClient;
|
||||
import com.google.android.gms.tasks.OnFailureListener;
|
||||
import com.google.android.gms.tasks.OnSuccessListener;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import com.google.firebase.database.DatabaseReference;
|
||||
import com.google.firebase.database.FirebaseDatabase;
|
||||
import com.karumi.dexter.Dexter;
|
||||
import com.karumi.dexter.PermissionToken;
|
||||
import com.karumi.dexter.listener.PermissionDeniedResponse;
|
||||
import com.karumi.dexter.listener.PermissionGrantedResponse;
|
||||
import com.karumi.dexter.listener.PermissionRequest;
|
||||
import com.karumi.dexter.listener.single.PermissionListener;
|
||||
import com.rengwuxian.materialedittext.MaterialEditText;
|
||||
import com.waterbase.foodify.Common.Common;
|
||||
import com.waterbase.foodify.Database.Database;
|
||||
@@ -58,18 +78,14 @@ import java.text.NumberFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import info.hoang8f.widget.FButton;
|
||||
import io.github.inflationx.calligraphy3.CalligraphyConfig;
|
||||
import io.github.inflationx.calligraphy3.CalligraphyInterceptor;
|
||||
import io.github.inflationx.viewpump.ViewPump;
|
||||
import io.github.inflationx.viewpump.ViewPumpContextWrapper;
|
||||
import retrofit2.Call;
|
||||
import retrofit2.Callback;
|
||||
import retrofit2.Response;
|
||||
|
||||
public class Cart extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,
|
||||
LocationListener, RecyclerItemTouchHelperListener {
|
||||
public class Cart extends AppCompatActivity implements RecyclerItemTouchHelperListener {
|
||||
|
||||
String address = null;
|
||||
|
||||
@@ -79,7 +95,7 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
FirebaseDatabase database;
|
||||
DatabaseReference requests;
|
||||
|
||||
public TextView txtTotalPrice;
|
||||
public TextView txtTotalPrice, txtEmptyCart;
|
||||
FButton btnPlace;
|
||||
|
||||
List<Order> cart = new ArrayList<>();
|
||||
@@ -90,16 +106,19 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
RelativeLayout rootLayout;
|
||||
|
||||
//Location
|
||||
private static final int REQUEST_CHECK_SETTINGS = 100;
|
||||
private static final long UPDATE_INTERVAL_IN_MILLISECONDS = 10000;
|
||||
private static final long FASTEST_UPDATE_IN_MILLISECONDS = 1000;
|
||||
private static final String TAG = Cart.class.getSimpleName();
|
||||
|
||||
private FusedLocationProviderClient mFusedLocationClient;
|
||||
private SettingsClient mSettingsClient;
|
||||
private LocationRequest mLocationRequest;
|
||||
private GoogleApiClient mGoogleApiClient;
|
||||
private Location mLastLocation;
|
||||
private LocationSettingsRequest mLocationSettingsRequest;
|
||||
private LocationCallback mLocationCallBack;
|
||||
private Location mCurrentLocation;
|
||||
private boolean mRequestingLocationUpdates = false;
|
||||
|
||||
private static int UPDATE_INTERVAL = 5000;
|
||||
private static int FATEST_INTERVAL = 3000;
|
||||
private static int DISPLACEMENT = 10;
|
||||
|
||||
private static final int LOCATION_REQUEST_CODE = 9999;
|
||||
private static final int PLAY_SERVICES_REQUEST = 9997;
|
||||
|
||||
//Declare Google Map API Retrofit
|
||||
IGoogleService mGoogleMapService;
|
||||
@@ -110,21 +129,6 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
|
||||
setContentView(R.layout.activity_cart);
|
||||
|
||||
//Runtime permission
|
||||
if (checkLocatePermission()) {
|
||||
ActivityCompat.requestPermissions(this, new String[]
|
||||
{
|
||||
Manifest.permission.ACCESS_COARSE_LOCATION,
|
||||
Manifest.permission.ACCESS_FINE_LOCATION
|
||||
}, LOCATION_REQUEST_CODE
|
||||
);
|
||||
} else {
|
||||
if (checkPlayServices()) {
|
||||
buildGoogleApiClient();
|
||||
createLocationRequest();
|
||||
}
|
||||
}
|
||||
|
||||
//Init
|
||||
mService = Common.getFCMService();
|
||||
mGoogleMapService = Common.getGoogleMapAPI();
|
||||
@@ -139,6 +143,9 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
layoutManager = new LinearLayoutManager(this);
|
||||
recyclerView.setLayoutManager(layoutManager);
|
||||
rootLayout = findViewById(R.id.rootLayout);
|
||||
txtEmptyCart = findViewById(R.id.textEmptyCart);
|
||||
|
||||
visibilityTextEmpty();
|
||||
|
||||
//Swipe to delete
|
||||
ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new RecyclerItemTouchHelper(0, ItemTouchHelper.LEFT, this);
|
||||
@@ -150,8 +157,9 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
btnPlace.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (cart.size() > 0)
|
||||
if (cart.size() > 0){
|
||||
showAlertDialog();
|
||||
}
|
||||
else
|
||||
Toast.makeText(Cart.this, "Giỏ hàng của bạn đang trống!!!", Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
@@ -159,6 +167,48 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
|
||||
loadListFood();
|
||||
|
||||
//Location
|
||||
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
|
||||
mSettingsClient = LocationServices.getSettingsClient(this);
|
||||
|
||||
mLocationCallBack = new LocationCallback() {
|
||||
@Override
|
||||
public void onLocationResult(@NonNull LocationResult locationResult) {
|
||||
super.onLocationResult(locationResult);
|
||||
mCurrentLocation = locationResult.getLastLocation();
|
||||
}
|
||||
};
|
||||
|
||||
mLocationRequest = LocationRequest.create()
|
||||
.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS)
|
||||
.setFastestInterval(FASTEST_UPDATE_IN_MILLISECONDS)
|
||||
.setPriority(Priority.PRIORITY_HIGH_ACCURACY);
|
||||
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
|
||||
builder.addLocationRequest(mLocationRequest);
|
||||
mLocationSettingsRequest = builder.build();
|
||||
|
||||
Dexter.withContext(this)
|
||||
.withPermission(Manifest.permission.ACCESS_FINE_LOCATION)
|
||||
.withListener(new PermissionListener() {
|
||||
@Override
|
||||
public void onPermissionGranted(PermissionGrantedResponse permissionGrantedResponse) {
|
||||
mRequestingLocationUpdates = true;
|
||||
startLocationUpdates();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPermissionDenied(PermissionDeniedResponse response) {
|
||||
if(response.isPermanentlyDenied()){
|
||||
openSettings();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
|
||||
token.continuePermissionRequest();
|
||||
}
|
||||
}).check();
|
||||
|
||||
setTitle("Giỏ hàng");
|
||||
// calling the action bar
|
||||
ActionBar actionBar = getSupportActionBar();
|
||||
@@ -167,53 +217,6 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
actionBar.setDisplayHomeAsUpEnabled(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
|
||||
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
|
||||
switch (requestCode) {
|
||||
case LOCATION_REQUEST_CODE: {
|
||||
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||
if (checkPlayServices()) {
|
||||
buildGoogleApiClient();
|
||||
createLocationRequest();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void createLocationRequest() {
|
||||
mLocationRequest = new LocationRequest();
|
||||
mLocationRequest.setInterval(UPDATE_INTERVAL);
|
||||
mLocationRequest.setFastestInterval(FATEST_INTERVAL);
|
||||
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
|
||||
mLocationRequest.setSmallestDisplacement(DISPLACEMENT);
|
||||
}
|
||||
|
||||
private synchronized void buildGoogleApiClient() {
|
||||
|
||||
mGoogleApiClient = new GoogleApiClient.Builder(this)
|
||||
.addConnectionCallbacks(this)
|
||||
.addOnConnectionFailedListener(this)
|
||||
.addApi(LocationServices.API).build();
|
||||
|
||||
mGoogleApiClient.connect();
|
||||
}
|
||||
|
||||
private boolean checkPlayServices() {
|
||||
int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
|
||||
if (resultCode != ConnectionResult.SUCCESS) {
|
||||
if (GooglePlayServicesUtil.isUserRecoverableError(resultCode))
|
||||
GooglePlayServicesUtil.getErrorDialog(resultCode, this, PLAY_SERVICES_REQUEST).show();
|
||||
else {
|
||||
Toast.makeText(this, "Thiết bị này chưa được hỗ trợ!", Toast.LENGTH_SHORT).show();
|
||||
finish();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void showAlertDialog() {
|
||||
AlertDialog.Builder alertDialog = new AlertDialog.Builder(Cart.this);
|
||||
alertDialog.setTitle("Còn 1 bước nữa!");
|
||||
@@ -234,8 +237,8 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
rdiHomeAddress.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if(isChecked){
|
||||
if(!TextUtils.isEmpty(Common.currentUser.getHomeAddress()) || Common.currentUser.getHomeAddress() != null) {
|
||||
if (isChecked) {
|
||||
if (!TextUtils.isEmpty(Common.currentUser.getHomeAddress()) || Common.currentUser.getHomeAddress() != null) {
|
||||
edtAddress.setText(Common.currentUser.getHomeAddress());
|
||||
} else
|
||||
Toast.makeText(Cart.this, "Vui lòng điền địa chỉ mặc định của bạn!", Toast.LENGTH_SHORT).show();
|
||||
@@ -247,8 +250,8 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
rdiAddress.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
||||
@Override
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if(isChecked)
|
||||
edtAddress.setText("");
|
||||
if (isChecked)
|
||||
edtAddress.setText("");
|
||||
}
|
||||
});
|
||||
|
||||
@@ -258,8 +261,8 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
||||
if (isChecked) {
|
||||
mGoogleMapService.getAddressName(String.format("https://maps.googleapis.com/maps/api/geocode/json?latlng=%f,%f&key=AIzaSyCqmoLlawoQzmwjZI2_Yo_V33An_nNZADs",
|
||||
mLastLocation.getLatitude(),
|
||||
mLastLocation.getLongitude()))
|
||||
mCurrentLocation.getLatitude(),
|
||||
mCurrentLocation.getLongitude()))
|
||||
.enqueue(new Callback<String>() {
|
||||
@Override
|
||||
public void onResponse(Call<String> call, Response<String> response) {
|
||||
@@ -331,7 +334,6 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void loadListFood() {
|
||||
cart = new Database(this).getCarts(Common.currentUser.getPhone());
|
||||
adapter = new CartAdapter(cart, this);
|
||||
@@ -341,7 +343,8 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
//Calculate total price
|
||||
float total = 0;
|
||||
for (Order order : cart)
|
||||
total += (Float.parseFloat(order.getPrice())) * (Float.parseFloat(order.getQuantity())) * (100 - Long.parseLong(order.getDiscount()))/100;;
|
||||
total += (Float.parseFloat(order.getPrice())) * (Float.parseFloat(order.getQuantity())) * (100 - Long.parseLong(order.getDiscount())) / 100;
|
||||
;
|
||||
Locale locale = new Locale("vi", "VN");
|
||||
NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
|
||||
|
||||
@@ -377,58 +380,12 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
loadListFood();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConnected(@Nullable Bundle bundle) {
|
||||
displayLocation();
|
||||
startLocationUpdates();
|
||||
}
|
||||
|
||||
private void startLocationUpdates() {
|
||||
if (checkLocatePermission()) {
|
||||
return;
|
||||
}
|
||||
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
|
||||
}
|
||||
|
||||
private void displayLocation() {
|
||||
if (checkLocatePermission())
|
||||
return;
|
||||
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
|
||||
if (mLastLocation != null) {
|
||||
Log.d("LOCATION", "Your location: " + mLastLocation.getLatitude() + ", " + mLastLocation.getLongitude());
|
||||
} else {
|
||||
Log.d("LOCATION", "Could not get your location!");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConnectionSuspended(int i) {
|
||||
mGoogleApiClient.connect();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
|
||||
|
||||
}
|
||||
|
||||
private boolean checkLocatePermission() {
|
||||
return ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
|
||||
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLocationChanged(Location location) {
|
||||
mLastLocation = location;
|
||||
displayLocation();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction, int position) {
|
||||
if(viewHolder instanceof CartViewHolder)
|
||||
{
|
||||
String name = ((CartAdapter)recyclerView.getAdapter()).getItem(viewHolder.getAdapterPosition()).getProductName();
|
||||
if (viewHolder instanceof CartViewHolder) {
|
||||
String name = ((CartAdapter) recyclerView.getAdapter()).getItem(viewHolder.getAdapterPosition()).getProductName();
|
||||
|
||||
Order deleteItem = ((CartAdapter)recyclerView.getAdapter()).getItem(viewHolder.getAdapterPosition());
|
||||
Order deleteItem = ((CartAdapter) recyclerView.getAdapter()).getItem(viewHolder.getAdapterPosition());
|
||||
int deleteIndex = viewHolder.getAdapterPosition();
|
||||
|
||||
adapter.removeItem(deleteIndex);
|
||||
@@ -444,23 +401,103 @@ public class Cart extends AppCompatActivity implements GoogleApiClient.Connectio
|
||||
adapter.restoreItem(deleteItem, deleteIndex);
|
||||
new Database(getBaseContext()).addToCart(deleteItem);
|
||||
updateTotalPrice();
|
||||
|
||||
visibilityTextEmpty();
|
||||
}
|
||||
});
|
||||
|
||||
visibilityTextEmpty();
|
||||
snackbar.setActionTextColor(Color.YELLOW);
|
||||
snackbar.show();
|
||||
}
|
||||
}
|
||||
|
||||
public void updateTotalPrice()
|
||||
{
|
||||
public void updateTotalPrice() {
|
||||
//Calculate total price
|
||||
float total = 0;
|
||||
List<Order> orders = new Database(getBaseContext()).getCarts(Common.currentUser.getPhone());
|
||||
for (Order item : orders)
|
||||
total += (Float.parseFloat(item.getPrice())) * (Float.parseFloat(item.getQuantity())) * (100 - Long.parseLong(item.getDiscount()))/100;
|
||||
total += (Float.parseFloat(item.getPrice())) * (Float.parseFloat(item.getQuantity())) * (100 - Long.parseLong(item.getDiscount())) / 100;
|
||||
Locale locale = new Locale("vi", "VN");
|
||||
NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
|
||||
txtTotalPrice.setText(fmt.format(total));
|
||||
}
|
||||
|
||||
//Location
|
||||
|
||||
private void openSettings(){
|
||||
Intent intent = new Intent();
|
||||
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
|
||||
Uri uri = Uri.fromParts("package", BuildConfig.APPLICATION_ID, null);
|
||||
intent.setData(uri);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
private void startLocationUpdates(){
|
||||
mSettingsClient.checkLocationSettings(mLocationSettingsRequest).addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
|
||||
@SuppressLint("MissingPermission")
|
||||
@Override
|
||||
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
|
||||
mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallBack, Looper.myLooper());
|
||||
|
||||
}
|
||||
}).addOnFailureListener(this, new OnFailureListener() {
|
||||
@Override
|
||||
public void onFailure(@NonNull Exception e) {
|
||||
int statusCode = ((ApiException) e).getStatusCode();
|
||||
switch (statusCode){
|
||||
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
|
||||
Log.i(TAG, "Location settings are not satisfied. Attempting to upgrade location settings");
|
||||
|
||||
try {
|
||||
ResolvableApiException rae = (ResolvableApiException) e;
|
||||
rae.startResolutionForResult(Cart.this, REQUEST_CHECK_SETTINGS);
|
||||
}catch (IntentSender.SendIntentException sie){
|
||||
Log.i(TAG, "PendingIntent unable to execute request");
|
||||
}
|
||||
break;
|
||||
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
|
||||
String errorMessage = "Location settings are inadequate, and cannot be fixed here. Fix in Settings";
|
||||
Log.e(TAG, errorMessage);
|
||||
|
||||
Toast.makeText(Cart.this, errorMessage, Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void stopLocationUpdates(){
|
||||
mFusedLocationClient.removeLocationUpdates(mLocationCallBack).addOnCompleteListener(this, task -> Log.d(TAG, "Location updates stopped!"));
|
||||
}
|
||||
|
||||
private boolean checkPermission(){
|
||||
int permissionState = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
|
||||
return permissionState == PackageManager.PERMISSION_GRANTED;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
if(mRequestingLocationUpdates && checkPermission()){
|
||||
startLocationUpdates();
|
||||
}
|
||||
visibilityTextEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
super.onPause();
|
||||
if(mRequestingLocationUpdates){
|
||||
stopLocationUpdates();
|
||||
}
|
||||
}
|
||||
|
||||
private void visibilityTextEmpty(){
|
||||
if(cart.size() > 0){
|
||||
txtEmptyCart.setVisibility(View.GONE);
|
||||
} else {
|
||||
txtEmptyCart.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import android.os.Bundle;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
@@ -23,6 +24,8 @@ import com.waterbase.foodify.Model.Favorites;
|
||||
import com.waterbase.foodify.ViewHolder.FavoritesAdapter;
|
||||
import com.waterbase.foodify.ViewHolder.FavoritesViewHolder;
|
||||
|
||||
import org.w3c.dom.Text;
|
||||
|
||||
import io.github.inflationx.calligraphy3.CalligraphyConfig;
|
||||
import io.github.inflationx.calligraphy3.CalligraphyInterceptor;
|
||||
import io.github.inflationx.viewpump.ViewPump;
|
||||
@@ -30,6 +33,7 @@ import io.github.inflationx.viewpump.ViewPumpContextWrapper;
|
||||
|
||||
public class FavoritesActivity extends AppCompatActivity implements RecyclerItemTouchHelperListener {
|
||||
|
||||
TextView txtEmptyList;
|
||||
RecyclerView recyclerView;
|
||||
RecyclerView.LayoutManager layoutManager;
|
||||
|
||||
@@ -47,10 +51,13 @@ public class FavoritesActivity extends AppCompatActivity implements RecyclerItem
|
||||
|
||||
rootLayout = findViewById(R.id.rootLayout);
|
||||
|
||||
txtEmptyList = findViewById(R.id.txtEmptyList);
|
||||
|
||||
setVisibilityText();
|
||||
|
||||
recyclerView = findViewById(R.id.recycler_fav);
|
||||
layoutManager = new LinearLayoutManager(this);
|
||||
recyclerView.setLayoutManager(layoutManager);
|
||||
|
||||
//Swipe to delete
|
||||
ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new RecyclerItemTouchHelper(0, ItemTouchHelper.LEFT, this);
|
||||
new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);
|
||||
@@ -88,9 +95,10 @@ public class FavoritesActivity extends AppCompatActivity implements RecyclerItem
|
||||
public void onClick(View v) {
|
||||
adapter.restoreItem(deleteItem, deleteIndex);
|
||||
new Database(getBaseContext()).addToFavorites(deleteItem);
|
||||
|
||||
setVisibilityText();
|
||||
}
|
||||
});
|
||||
|
||||
snackbar.setActionTextColor(Color.YELLOW);
|
||||
snackbar.show();
|
||||
}
|
||||
@@ -105,4 +113,12 @@ public class FavoritesActivity extends AppCompatActivity implements RecyclerItem
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
private void setVisibilityText() {
|
||||
if(new Database(this).getAllFavorites(Common.currentUser.getPhone()).size() > 0) {
|
||||
txtEmptyList.setVisibility(View.GONE);
|
||||
} else {
|
||||
txtEmptyList.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.view.MenuItem;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.RatingBar;
|
||||
@@ -49,7 +50,6 @@ public class FoodDetail extends AppCompatActivity implements RatingDialogListene
|
||||
TextView food_name, food_price, food_description;
|
||||
ImageView food_image;
|
||||
CollapsingToolbarLayout collapsingToolbarLayout;
|
||||
FloatingActionButton btnRating;
|
||||
CounterFab btnCart;
|
||||
ElegantNumberButton numberButton;
|
||||
RatingBar ratingBar;
|
||||
@@ -88,16 +88,19 @@ public class FoodDetail extends AppCompatActivity implements RatingDialogListene
|
||||
//Init view
|
||||
numberButton = (ElegantNumberButton) findViewById(R.id.number_button);
|
||||
btnCart = findViewById(R.id.btnCart);
|
||||
btnRating = (FloatingActionButton) findViewById(R.id.btnRating);
|
||||
ratingBar = (RatingBar) findViewById(R.id.ratingBar);
|
||||
|
||||
btnRating.setOnClickListener(new View.OnClickListener() {
|
||||
ratingBar.setOnTouchListener(new View.OnTouchListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
showRatingDialog();
|
||||
public boolean onTouch(View v, MotionEvent event) {
|
||||
if (event.getAction() == MotionEvent.ACTION_UP) {
|
||||
showRatingDialog();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
btnCart.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
package com.waterbase.foodify.Service;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import com.google.firebase.database.DatabaseReference;
|
||||
import com.google.firebase.database.FirebaseDatabase;
|
||||
import com.google.firebase.iid.FirebaseInstanceId;
|
||||
import com.google.firebase.iid.FirebaseInstanceIdService;
|
||||
import com.google.firebase.messaging.FirebaseMessagingService;
|
||||
import com.waterbase.foodify.Common.Common;
|
||||
import com.waterbase.foodify.Model.Token;
|
||||
|
||||
public class MyFirebaseIdService extends FirebaseInstanceIdService {
|
||||
public class MyFirebaseIdService extends FirebaseMessagingService {
|
||||
|
||||
@Override
|
||||
public void onTokenRefresh() {
|
||||
super.onTokenRefresh();
|
||||
String tokenRefreshed = FirebaseInstanceId.getInstance().getToken();
|
||||
updateTokenToFirebase(tokenRefreshed);
|
||||
public void onNewToken(@NonNull String token) {
|
||||
super.onNewToken(token);
|
||||
updateTokenToFirebase(token);
|
||||
}
|
||||
|
||||
private void updateTokenToFirebase(String tokenRefreshed) {
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
package com.waterbase.foodify;
|
||||
|
||||
import android.app.ProgressDialog;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Typeface;
|
||||
import android.os.Bundle;
|
||||
import android.view.View;
|
||||
import android.widget.Button;
|
||||
@@ -13,6 +11,7 @@ import android.widget.Toast;
|
||||
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
|
||||
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
|
||||
import com.google.firebase.database.DataSnapshot;
|
||||
import com.google.firebase.database.DatabaseError;
|
||||
import com.google.firebase.database.DatabaseReference;
|
||||
@@ -22,16 +21,12 @@ import com.rey.material.widget.CheckBox;
|
||||
import com.waterbase.foodify.Common.Common;
|
||||
import com.waterbase.foodify.Model.User;
|
||||
|
||||
import io.github.inflationx.calligraphy3.CalligraphyConfig;
|
||||
import io.github.inflationx.calligraphy3.CalligraphyInterceptor;
|
||||
import io.github.inflationx.viewpump.ViewPump;
|
||||
import io.github.inflationx.viewpump.ViewPumpContextWrapper;
|
||||
import io.paperdb.Paper;
|
||||
|
||||
public class SignIn extends AppCompatActivity {
|
||||
|
||||
EditText edtPhone, edtPassword;
|
||||
Button btnSignIn;
|
||||
Button btnSignIn, btnGoogle;
|
||||
TextView txtAppName, edtForgotPassword;
|
||||
CheckBox ckbRemember;
|
||||
|
||||
@@ -45,7 +40,6 @@ public class SignIn extends AppCompatActivity {
|
||||
btnSignIn = (Button) findViewById(R.id.btnSignIn);
|
||||
ckbRemember = (CheckBox)findViewById(R.id.ckbRemember);
|
||||
edtForgotPassword = findViewById(R.id.forgotPassword);
|
||||
|
||||
//Init Paper
|
||||
Paper.init(this);
|
||||
|
||||
@@ -115,6 +109,9 @@ public class SignIn extends AppCompatActivity {
|
||||
}
|
||||
});
|
||||
|
||||
//Google SignIn Button
|
||||
GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail().build();
|
||||
|
||||
//Set on click Forgot Password
|
||||
edtForgotPassword.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
|
||||
@@ -25,6 +25,18 @@
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/textEmptyCart"
|
||||
android:text="Giỏ hàng của bạn đang trống!"
|
||||
android:textSize="18sp"
|
||||
android:layout_centerInParent="true"
|
||||
android:fontFamily="@font/italic"
|
||||
android:textColor="#8AECECEC"
|
||||
android:layout_width="wrap_content"
|
||||
android:visibility="gone"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
|
||||
|
||||
<androidx.cardview.widget.CardView
|
||||
android:id="@+id/cardView"
|
||||
|
||||
@@ -14,4 +14,17 @@
|
||||
android:layout_height="match_parent"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/txtEmptyList"
|
||||
android:text="Danh sách yêu thích của bạn đang trống!"
|
||||
android:textAlignment="center"
|
||||
android:textSize="20sp"
|
||||
android:layout_centerInParent="true"
|
||||
android:fontFamily="@font/italic"
|
||||
android:textColor="#E1676767"
|
||||
android:layout_width="wrap_content"
|
||||
android:visibility="gone"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
|
||||
</RelativeLayout>
|
||||
@@ -51,20 +51,6 @@
|
||||
|
||||
/>
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/btnRating"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:backgroundTint="@color/white"
|
||||
app:elevation="6dp"
|
||||
android:src="@drawable/ic_baseline_star_24"
|
||||
app:layout_anchor="@id/app_bar_layout"
|
||||
app:layout_anchorGravity="bottom|right|start"
|
||||
app:pressedTranslationZ="12dp"
|
||||
app:useCompatPadding="true"
|
||||
|
||||
/>
|
||||
|
||||
<androidx.core.widget.NestedScrollView
|
||||
android:id="@+id/nestedScrollView"
|
||||
android:layout_width="match_parent"
|
||||
@@ -109,6 +95,7 @@
|
||||
android:id="@+id/food_price"
|
||||
android:layout_marginLeft="12dp"
|
||||
android:text="1,000"
|
||||
android:layout_marginTop="10dp"
|
||||
android:fontFamily="@font/regular"
|
||||
android:textColor="@color/black"
|
||||
android:textSize="18sp"
|
||||
@@ -116,21 +103,20 @@
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="wrap_content" />
|
||||
|
||||
|
||||
<com.cepheuen.elegantnumberbutton.view.ElegantNumberButton
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/number_button"
|
||||
android:layout_marginRight="12dp"
|
||||
android:layout_marginBottom="18dp"
|
||||
app:textSize="8sp"
|
||||
app:backGroundColor="@color/purple_500"
|
||||
app:initialNumber="1"
|
||||
app:finalNumber="20"
|
||||
/>
|
||||
</LinearLayout>
|
||||
|
||||
<com.cepheuen.elegantnumberbutton.view.ElegantNumberButton
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:id="@+id/number_button"
|
||||
android:layout_marginTop="8dp"
|
||||
android:layout_marginLeft="8dp"
|
||||
android:layout_marginBottom="18dp"
|
||||
app:textSize="8sp"
|
||||
app:backGroundColor="@color/purple_500"
|
||||
app:initialNumber="1"
|
||||
app:finalNumber="20"
|
||||
/>
|
||||
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -153,7 +139,9 @@
|
||||
android:layout_height="wrap_content"
|
||||
android:isIndicator="true"
|
||||
android:max="5"
|
||||
android:rating="0" />
|
||||
android:rating="0"
|
||||
android:layout_gravity="center"
|
||||
/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/food_description"
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
android:layout_height="wrap_content"
|
||||
app:cardElevation="10dp"
|
||||
app:cardCornerRadius="0dp"
|
||||
android:layout_margin="8dp"
|
||||
android:layout_marginBottom="8dp"
|
||||
>
|
||||
|
||||
@@ -59,6 +60,8 @@
|
||||
android:weightSum="10"
|
||||
android:orientation="horizontal"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_marginLeft="5dp"
|
||||
android:layout_marginRight="5dp"
|
||||
android:gravity="center_vertical"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
@@ -77,6 +80,8 @@
|
||||
</LinearLayout>
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_marginLeft="5dp"
|
||||
android:layout_marginRight="5dp"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
|
||||
@@ -25,18 +25,19 @@
|
||||
android:text="User Phone"
|
||||
android:fontFamily="@font/bold"
|
||||
android:textSize="20sp"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_width="0dp"
|
||||
android:layout_weight="9"
|
||||
android:layout_height="wrap_content"
|
||||
/>
|
||||
|
||||
<RatingBar
|
||||
android:id="@+id/ratingBar"
|
||||
style="?android:attr/ratingBarStyleSmall"
|
||||
android:layout_marginLeft="140dp"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:rating="3"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginRight="10dp"
|
||||
/>
|
||||
</LinearLayout>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user