diff --git a/Foodify/app/build.gradle b/Foodify/app/build.gradle index e3e95e6..d9918db 100644 --- a/Foodify/app/build.gradle +++ b/Foodify/app/build.gradle @@ -52,12 +52,14 @@ dependencies { 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.github.jd-alexander:android-flat-button:v1.1' implementation 'com.rengwuxian.materialedittext:library:2.1.4' implementation 'com.stepstone.apprating:app-rating:2.0.0' implementation 'com.squareup.retrofit2:retrofit:2.7.1' implementation 'com.squareup.retrofit2:converter-gson:2.7.1' + implementation 'com.squareup.retrofit2:converter-scalars:2.7.1' implementation 'com.github.d-max:spots-dialog:0.7@aar' implementation 'com.squareup.picasso:picasso:2.5.2' diff --git a/Foodify/app/src/main/AndroidManifest.xml b/Foodify/app/src/main/AndroidManifest.xml index a7cb7cf..ba34269 100644 --- a/Foodify/app/src/main/AndroidManifest.xml +++ b/Foodify/app/src/main/AndroidManifest.xml @@ -3,6 +3,8 @@ xmlns:tools="http://schemas.android.com/tools" package="com.waterbase.foodify"> + + diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/Cart.java b/Foodify/app/src/main/java/com/waterbase/foodify/Cart.java index e486a0a..1d1d68c 100644 --- a/Foodify/app/src/main/java/com/waterbase/foodify/Cart.java +++ b/Foodify/app/src/main/java/com/waterbase/foodify/Cart.java @@ -1,22 +1,35 @@ package com.waterbase.foodify; +import android.Manifest; import android.content.Context; import android.content.DialogInterface; +import android.content.pm.PackageManager; +import android.location.Location; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; +import android.widget.CompoundButton; +import android.widget.RadioButton; 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.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.location.LocationListener; +import com.google.android.gms.location.LocationRequest; +import com.google.android.gms.location.LocationServices; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; @@ -33,6 +46,7 @@ import com.waterbase.foodify.Model.Request; import com.waterbase.foodify.Model.Sender; import com.waterbase.foodify.Model.Token; import com.waterbase.foodify.Remote.APIService; +import com.waterbase.foodify.Remote.IGoogleService; import com.waterbase.foodify.ViewHolder.CartAdapter; import java.text.NumberFormat; @@ -49,7 +63,8 @@ import retrofit2.Call; import retrofit2.Callback; import retrofit2.Response; -public class Cart extends AppCompatActivity { +public class Cart extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, + LocationListener { RecyclerView recyclerView; RecyclerView.LayoutManager layoutManager; @@ -65,6 +80,21 @@ public class Cart extends AppCompatActivity { APIService mService; + //Location + private LocationRequest mLocationRequest; + private GoogleApiClient mGoogleApiClient; + private Location mLastLocation; + + 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; + @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase)); @@ -84,8 +114,25 @@ public class Cart extends AppCompatActivity { 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(); //Firebase database = FirebaseDatabase.getInstance(); @@ -120,6 +167,55 @@ public class Cart extends AppCompatActivity { 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!"); @@ -132,6 +228,23 @@ public class Cart extends AppCompatActivity { MaterialEditText edtComment = (MaterialEditText) order_address_comment.findViewById(R.id.edtComment); + //Radio + RadioButton rdiShipToAddress = (RadioButton) order_address_comment.findViewById(R.id.rdiShipToAddress); + RadioButton rdiHomeAddress = (RadioButton) order_address_comment.findViewById(R.id.rdiHomeAddress); + + //Add event + rdiShipToAddress.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if(isChecked) { + if(isChecked){ + + } + } + } + }); + + alertDialog.setView(order_address_comment); alertDialog.setIcon(R.drawable.ic_baseline_shopping_cart_24); @@ -156,10 +269,6 @@ public class Cart extends AppCompatActivity { sendNotificationOrder(order_number); - //Delete Cart -// new Database(getBaseContext()).cleanCart(); -// Toast.makeText(Cart.this, "Đặt hàng thành công!", Toast.LENGTH_SHORT).show(); -// finish(); } }); @@ -263,4 +372,50 @@ public class Cart extends AppCompatActivity { //Refresh 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(); + } } \ No newline at end of file diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/Common/Common.java b/Foodify/app/src/main/java/com/waterbase/foodify/Common/Common.java index f858c5e..a8457b9 100644 --- a/Foodify/app/src/main/java/com/waterbase/foodify/Common/Common.java +++ b/Foodify/app/src/main/java/com/waterbase/foodify/Common/Common.java @@ -6,17 +6,23 @@ import android.net.NetworkInfo; import com.waterbase.foodify.Model.User; import com.waterbase.foodify.Remote.APIService; +import com.waterbase.foodify.Remote.IGoogleService; import com.waterbase.foodify.Remote.RetrofitClient; public class Common { public static User currentUser; private static final String BASE_URL = "https://fcm.googleapis.com/"; + private static final String GOOGLE_API_URL = "https://maps.googleapis.com/"; public static APIService getFCMService(){ return RetrofitClient.getClient(BASE_URL).create(APIService.class); } + public static IGoogleService getGoogleMapAPI(){ + return RetrofitClient.getGoogleClient(GOOGLE_API_URL).create(IGoogleService.class); + } + public static final String DELETE = "Xoá"; public static final String USER_KEY = "User"; public static final String PWD_KEY = "Password"; diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/Remote/IGoogleService.java b/Foodify/app/src/main/java/com/waterbase/foodify/Remote/IGoogleService.java new file mode 100644 index 0000000..908c5b6 --- /dev/null +++ b/Foodify/app/src/main/java/com/waterbase/foodify/Remote/IGoogleService.java @@ -0,0 +1,11 @@ +package com.waterbase.foodify.Remote; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Url; + +public interface IGoogleService { + + @GET + Call getAddressName(@Url String url); +} diff --git a/Foodify/app/src/main/java/com/waterbase/foodify/Remote/RetrofitClient.java b/Foodify/app/src/main/java/com/waterbase/foodify/Remote/RetrofitClient.java index 77b9351..a2fda3f 100644 --- a/Foodify/app/src/main/java/com/waterbase/foodify/Remote/RetrofitClient.java +++ b/Foodify/app/src/main/java/com/waterbase/foodify/Remote/RetrofitClient.java @@ -17,4 +17,15 @@ public class RetrofitClient { } return retrofit; } + + public static Retrofit getGoogleClient(String baseURL) + { + if(retrofit == null) { + retrofit = new Retrofit.Builder() + .baseUrl(baseURL) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + } + return retrofit; + } } diff --git a/Foodify/app/src/main/res/layout/order_address_comment.xml b/Foodify/app/src/main/res/layout/order_address_comment.xml index 61c7454..acc2323 100644 --- a/Foodify/app/src/main/res/layout/order_address_comment.xml +++ b/Foodify/app/src/main/res/layout/order_address_comment.xml @@ -47,6 +47,28 @@ app:met_primaryColor="@color/colorPrimary" app:met_singleLineEllipsis="true" /> + + + + + + + + + \ No newline at end of file