Get location realtime

This commit is contained in:
Nezumi2711
2022-06-23 11:21:59 +07:00
parent 505f6630f5
commit e67c18492a
7 changed files with 214 additions and 5 deletions
+2
View File
@@ -52,12 +52,14 @@ dependencies {
implementation 'com.google.firebase:firebase-core: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-database:11.8.0'
implementation 'com.google.firebase:firebase-auth: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.github.jd-alexander:android-flat-button:v1.1'
implementation 'com.rengwuxian.materialedittext:library:2.1.4' implementation 'com.rengwuxian.materialedittext:library:2.1.4'
implementation 'com.stepstone.apprating:app-rating:2.0.0' implementation 'com.stepstone.apprating:app-rating:2.0.0'
implementation 'com.squareup.retrofit2:retrofit:2.7.1' implementation 'com.squareup.retrofit2:retrofit:2.7.1'
implementation 'com.squareup.retrofit2:converter-gson: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.github.d-max:spots-dialog:0.7@aar'
implementation 'com.squareup.picasso:picasso:2.5.2' implementation 'com.squareup.picasso:picasso:2.5.2'
+2
View File
@@ -3,6 +3,8 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
package="com.waterbase.foodify"> package="com.waterbase.foodify">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
@@ -1,22 +1,35 @@
package com.waterbase.foodify; package com.waterbase.foodify;
import android.Manifest;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.CompoundButton;
import android.widget.RadioButton;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView; 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.DataSnapshot;
import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference; 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.Sender;
import com.waterbase.foodify.Model.Token; import com.waterbase.foodify.Model.Token;
import com.waterbase.foodify.Remote.APIService; import com.waterbase.foodify.Remote.APIService;
import com.waterbase.foodify.Remote.IGoogleService;
import com.waterbase.foodify.ViewHolder.CartAdapter; import com.waterbase.foodify.ViewHolder.CartAdapter;
import java.text.NumberFormat; import java.text.NumberFormat;
@@ -49,7 +63,8 @@ import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Response; import retrofit2.Response;
public class Cart extends AppCompatActivity { public class Cart extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,
LocationListener {
RecyclerView recyclerView; RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager; RecyclerView.LayoutManager layoutManager;
@@ -65,6 +80,21 @@ public class Cart extends AppCompatActivity {
APIService mService; 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 @Override
protected void attachBaseContext(Context newBase) { protected void attachBaseContext(Context newBase) {
super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase)); super.attachBaseContext(ViewPumpContextWrapper.wrap(newBase));
@@ -84,8 +114,25 @@ public class Cart extends AppCompatActivity {
setContentView(R.layout.activity_cart); 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 //Init
mService = Common.getFCMService(); mService = Common.getFCMService();
mGoogleMapService = Common.getGoogleMapAPI();
//Firebase //Firebase
database = FirebaseDatabase.getInstance(); database = FirebaseDatabase.getInstance();
@@ -120,6 +167,55 @@ public class Cart extends AppCompatActivity {
actionBar.setDisplayHomeAsUpEnabled(true); 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() { private void showAlertDialog() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(Cart.this); AlertDialog.Builder alertDialog = new AlertDialog.Builder(Cart.this);
alertDialog.setTitle("Còn 1 bước nữa!"); 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); 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.setView(order_address_comment);
alertDialog.setIcon(R.drawable.ic_baseline_shopping_cart_24); alertDialog.setIcon(R.drawable.ic_baseline_shopping_cart_24);
@@ -156,10 +269,6 @@ public class Cart extends AppCompatActivity {
sendNotificationOrder(order_number); 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 //Refresh
loadListFood(); 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();
}
} }
@@ -6,17 +6,23 @@ import android.net.NetworkInfo;
import com.waterbase.foodify.Model.User; import com.waterbase.foodify.Model.User;
import com.waterbase.foodify.Remote.APIService; import com.waterbase.foodify.Remote.APIService;
import com.waterbase.foodify.Remote.IGoogleService;
import com.waterbase.foodify.Remote.RetrofitClient; import com.waterbase.foodify.Remote.RetrofitClient;
public class Common { public class Common {
public static User currentUser; public static User currentUser;
private static final String BASE_URL = "https://fcm.googleapis.com/"; 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(){ public static APIService getFCMService(){
return RetrofitClient.getClient(BASE_URL).create(APIService.class); 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 DELETE = "Xoá";
public static final String USER_KEY = "User"; public static final String USER_KEY = "User";
public static final String PWD_KEY = "Password"; public static final String PWD_KEY = "Password";
@@ -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<String> getAddressName(@Url String url);
}
@@ -17,4 +17,15 @@ public class RetrofitClient {
} }
return retrofit; return retrofit;
} }
public static Retrofit getGoogleClient(String baseURL)
{
if(retrofit == null) {
retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
} }
@@ -47,6 +47,28 @@
app:met_primaryColor="@color/colorPrimary" app:met_primaryColor="@color/colorPrimary"
app:met_singleLineEllipsis="true" app:met_singleLineEllipsis="true"
/> />
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<RadioButton
android:id="@+id/rdiShipToAddress"
android:text="Giao hàng đến vị trí của bạn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<RadioButton
android:id="@+id/rdiHomeAddress"
android:text="Giao hàng đến địa chỉ trên"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</RadioGroup>
</LinearLayout> </LinearLayout>
</com.google.android.material.card.MaterialCardView> </com.google.android.material.card.MaterialCardView>