Advertisement
Damian96

MapClientActivity

Aug 16th, 2020
397
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 18.74 KB | None | 0 0
  1. package com.daperrazo.entregas.activities.client;
  2.  
  3. import androidx.annotation.NonNull;
  4. import androidx.annotation.Nullable;
  5. import androidx.appcompat.app.AlertDialog;
  6. import androidx.appcompat.app.AppCompatActivity;
  7. import androidx.core.app.ActivityCompat;
  8. import androidx.core.content.ContextCompat;
  9.  
  10. import android.Manifest;
  11. import android.content.Context;
  12. import android.content.DialogInterface;
  13. import android.content.Intent;
  14. import android.content.pm.PackageManager;
  15. import android.location.Address;
  16. import android.location.Geocoder;
  17. import android.location.Location;
  18. import android.location.LocationManager;
  19. import android.os.Build;
  20. import android.os.Bundle;
  21. import android.os.Looper;
  22. import android.provider.Settings;
  23. import android.util.Log;
  24. import android.view.Menu;
  25. import android.view.MenuItem;
  26. import android.view.View;
  27. import android.widget.Button;
  28. import android.widget.Toast;
  29.  
  30. import com.daperrazo.entregas.R;
  31. import com.firebase.geofire.GeoLocation;
  32. import com.firebase.geofire.GeoQueryEventListener;
  33. import com.google.android.gms.common.api.Status;
  34. import com.google.android.gms.location.FusedLocationProviderClient;
  35. import com.google.android.gms.location.LocationCallback;
  36. import com.google.android.gms.location.LocationRequest;
  37. import com.google.android.gms.location.LocationResult;
  38. import com.google.android.gms.location.LocationServices;
  39. import com.google.android.gms.maps.CameraUpdateFactory;
  40. import com.google.android.gms.maps.GoogleMap;
  41. import com.google.android.gms.maps.OnMapReadyCallback;
  42. import com.google.android.gms.maps.SupportMapFragment;
  43. import com.google.android.gms.maps.model.BitmapDescriptorFactory;
  44. import com.google.android.gms.maps.model.CameraPosition;
  45. import com.google.android.gms.maps.model.LatLng;
  46. import com.google.android.gms.maps.model.Marker;
  47. import com.google.android.gms.maps.model.MarkerOptions;
  48. import com.google.android.libraries.places.api.Places;
  49. import com.google.android.libraries.places.api.model.Place;
  50. import com.google.android.libraries.places.api.model.RectangularBounds;
  51. import com.google.android.libraries.places.api.net.PlacesClient;
  52. import com.google.android.libraries.places.widget.AutocompleteSupportFragment;
  53. import com.google.android.libraries.places.widget.listener.PlaceSelectionListener;
  54. import com.google.firebase.database.DatabaseError;
  55. import com.google.maps.android.SphericalUtil;
  56.  
  57. import com.daperrazo.entregas.activities.MainActivity;
  58. import com.daperrazo.entregas.activities.driver.MapDriverActivity;
  59. import com.daperrazo.entregas.includes.MyToolbar;
  60. import com.daperrazo.entregas.providers.AuthProvider;
  61. import com.daperrazo.entregas.providers.GeofireProvider;
  62. import com.daperrazo.entregas.providers.TokenProvider;
  63.  
  64.  
  65. import java.util.ArrayList;
  66. import java.util.Arrays;
  67. import java.util.List;
  68.  
  69. public class MapClientActivity extends AppCompatActivity implements OnMapReadyCallback {
  70.  
  71.     private GoogleMap mMap;
  72.     private SupportMapFragment mMapFragment;
  73.     private AuthProvider mAuthProvider;
  74.  
  75.     private LocationRequest mLocationRequest;
  76.     private FusedLocationProviderClient mFusedLocation;
  77.  
  78.     private GeofireProvider mGeofireProvider;
  79.     private TokenProvider mTokenProvider;
  80.  
  81.     private final static int LOCATION_REQUEST_CODE = 1;
  82.     private final static int SETTINGS_REQUEST_CODE = 2;
  83.  
  84.     private Marker mMarker;
  85.  
  86.     private LatLng mCurrentLatLng;
  87.  
  88.     private List<Marker> mDriversMarkers = new ArrayList<>();
  89.  
  90.     private boolean mIsFirstTime = true;
  91.  
  92.     private PlacesClient mPlaces;
  93.     private AutocompleteSupportFragment mAutocomplete;
  94.     private AutocompleteSupportFragment mAutocompleteDestination;
  95.  
  96.     private String mOrigin;
  97.     private LatLng mOriginLatLng;
  98.  
  99.     private String mDestination;
  100.     private LatLng mDestinationLatLng;
  101.  
  102.     private GoogleMap.OnCameraIdleListener mCameraListener;
  103.  
  104.     private Button mButtonRequestDriver;
  105.  
  106.     LocationCallback mLocationCallback = new LocationCallback() {
  107.         @Override
  108.         public void onLocationResult(LocationResult locationResult) {
  109.             for(Location location: locationResult.getLocations()) {
  110.                 if (getApplicationContext() != null) {
  111.  
  112.                     mCurrentLatLng = new LatLng(location.getLatitude(), location.getLongitude());
  113.  
  114.                     // OBTENER LA LOCALIZACION DEL USUARIO EN TIEMPO REAL
  115.                     mMap.moveCamera(CameraUpdateFactory.newCameraPosition(
  116.                             new CameraPosition.Builder()
  117.                                     .target(new LatLng(location.getLatitude(), location.getLongitude()))
  118.                                     .zoom(15f)
  119.                                     .build()
  120.                     ));
  121.  
  122.                     if (mIsFirstTime) {
  123.                         mIsFirstTime = false;
  124.                         getActiveDrivers();
  125.                         limitSearch();
  126.                     }
  127.                 }
  128.             }
  129.         }
  130.     };
  131.  
  132.     @Override
  133.     protected void onCreate(Bundle savedInstanceState) {
  134.         super.onCreate(savedInstanceState);
  135.         setContentView(R.layout.activity_map_client);
  136.         MyToolbar.show(this, "Cliente", false);
  137.  
  138.         mAuthProvider = new AuthProvider();
  139.         mGeofireProvider = new GeofireProvider("active_drivers");
  140.         mTokenProvider = new TokenProvider();
  141.         mFusedLocation = LocationServices.getFusedLocationProviderClient(this);
  142.  
  143.         mMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
  144.         mMapFragment.getMapAsync(this);
  145.         mButtonRequestDriver = findViewById(R.id.btnRequestDriver);
  146.  
  147.         if (!Places.isInitialized()) {
  148.             Places.initialize(getApplicationContext(), getResources().getString(R.string.google_maps_key));
  149.         }
  150.  
  151.         mPlaces = Places.createClient(this);
  152.         instanceAutocompleteOrigin();
  153.         instanceAutocompleteDestination();
  154.         onCameraMove();
  155.  
  156.         mButtonRequestDriver.setOnClickListener(new View.OnClickListener() {
  157.             @Override
  158.             public void onClick(View view) {
  159.                 requestDriver();
  160.             }
  161.         });
  162.  
  163.         generateToken();
  164.     }
  165.  
  166.     private void requestDriver() {
  167.  
  168.         if (mOriginLatLng != null && mDestinationLatLng != null) {
  169.             Intent intent = new Intent(MapClientActivity.this, DetailRequestActivity.class);
  170.             intent.putExtra("origin_lat", mOriginLatLng.latitude);
  171.             intent.putExtra("origin_lng", mOriginLatLng.longitude);
  172.             intent.putExtra("destination_lat", mDestinationLatLng.latitude);
  173.             intent.putExtra("destination_lng", mDestinationLatLng.longitude);
  174.             intent.putExtra("origin", mOrigin);
  175.             intent.putExtra("destination", mDestination);
  176.             startActivity(intent);
  177.         }
  178.         else {
  179.             Toast.makeText(this, "Debe seleccionar el lugar de recogida y el destino", Toast.LENGTH_SHORT).show();
  180.         }
  181.  
  182.     }
  183.  
  184.     private void limitSearch() {
  185.         LatLng northSide = SphericalUtil.computeOffset(mCurrentLatLng, 5000, 0);
  186.         LatLng southSide = SphericalUtil.computeOffset(mCurrentLatLng, 5000, 180);
  187.         mAutocomplete.setCountry("ECU");
  188.         mAutocomplete.setLocationBias(RectangularBounds.newInstance(southSide, northSide));
  189.         mAutocompleteDestination.setCountry("ECU");
  190.         mAutocompleteDestination.setLocationBias(RectangularBounds.newInstance(southSide, northSide));
  191.     }
  192.  
  193.     private void onCameraMove(){
  194.         mCameraListener = new GoogleMap.OnCameraIdleListener() {
  195.             @Override
  196.             public void onCameraIdle() {
  197.                 try {
  198.                     Geocoder geocoder = new Geocoder(MapClientActivity.this);
  199.                     mOriginLatLng = mMap.getCameraPosition().target;
  200.                     List<Address> addressList = geocoder.getFromLocation(mOriginLatLng.latitude, mOriginLatLng.longitude, 1);
  201.                     String city = addressList.get(0).getLocality();
  202.                     String country = addressList.get(0).getCountryName();
  203.                     String address = addressList.get(0).getAddressLine(0);
  204.                     mOrigin = address + " " + city;
  205.                     mAutocomplete.setText(address + " " + city);
  206.                 } catch (Exception e) {
  207.                     Log.d("Error: ", "Mensaje error: " + e.getMessage());
  208.                 }
  209.             }
  210.         };
  211.     }
  212.  
  213.     private void instanceAutocompleteOrigin() {
  214.         mAutocomplete = (AutocompleteSupportFragment) getSupportFragmentManager().findFragmentById(R.id.placeAutocompleteOrigin);
  215.         mAutocomplete.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.LAT_LNG, Place.Field.NAME));
  216.         mAutocomplete.setHint("Lugar de recogida");
  217.         mAutocomplete.setOnPlaceSelectedListener(new PlaceSelectionListener() {
  218.             @Override
  219.             public void onPlaceSelected(@NonNull Place place) {
  220.                 mOrigin = place.getName();
  221.                 mOriginLatLng = place.getLatLng();
  222.                 Log.d("PLACE", "Name: " + mOrigin);
  223.                 Log.d("PLACE", "Lat: " + mOriginLatLng.latitude);
  224.                 Log.d("PLACE", "Lng: " + mOriginLatLng.longitude);
  225.             }
  226.  
  227.             @Override
  228.             public void onError(@NonNull Status status) {
  229.  
  230.             }
  231.         });
  232.     }
  233.  
  234.     private void instanceAutocompleteDestination() {
  235.         mAutocompleteDestination = (AutocompleteSupportFragment) getSupportFragmentManager().findFragmentById(R.id.placeAutocompleteDestination);
  236.         mAutocompleteDestination.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.LAT_LNG, Place.Field.NAME));
  237.         mAutocompleteDestination.setHint("Destino");
  238.         mAutocompleteDestination.setOnPlaceSelectedListener(new PlaceSelectionListener() {
  239.             @Override
  240.             public void onPlaceSelected(@NonNull Place place) {
  241.                 mDestination = place.getName();
  242.                 mDestinationLatLng = place.getLatLng();
  243.                 Log.d("PLACE", "Name: " + mDestination);
  244.                 Log.d("PLACE", "Lat: " + mDestinationLatLng.latitude);
  245.                 Log.d("PLACE", "Lng: " + mDestinationLatLng.longitude);
  246.             }
  247.  
  248.             @Override
  249.             public void onError(@NonNull Status status) {
  250.  
  251.             }
  252.         });
  253.     }
  254.  
  255.     private void getActiveDrivers() {
  256.         mGeofireProvider.getActiveDrivers(mCurrentLatLng, 10).addGeoQueryEventListener(new GeoQueryEventListener() {
  257.             @Override
  258.             public void onKeyEntered(String key, GeoLocation location) {
  259.                 // AÑADIREMOS LOS MARCADORES DE LOS CONDUCTORES QUE SE CONECTEN EN LA APLICACION
  260.  
  261.                 for (Marker marker: mDriversMarkers) {
  262.                     if (marker.getTag() != null) {
  263.                         if (marker.getTag().equals(key)) {
  264.                             return;
  265.                         }
  266.                     }
  267.                 }
  268.  
  269.                 LatLng driverLatLng = new LatLng(location.latitude, location.longitude);
  270.                 Marker marker = mMap.addMarker(new MarkerOptions().position(driverLatLng).title("Conductor disponible").icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_car)));
  271.                 marker.setTag(key);
  272.                 mDriversMarkers.add(marker);
  273.             }
  274.  
  275.             @Override
  276.             public void onKeyExited(String key) {
  277.                 for (Marker marker: mDriversMarkers) {
  278.                     if (marker.getTag() != null) {
  279.                         if (marker.getTag().equals(key)) {
  280.                             marker.remove();
  281.                             mDriversMarkers.remove(marker);
  282.                             return;
  283.                         }
  284.                     }
  285.                 }
  286.             }
  287.  
  288.             @Override
  289.             public void onKeyMoved(String key, GeoLocation location) {
  290.                 // ACTUALIZAR LA POSICION DE CADA CONDUCTOR
  291.                 for (Marker marker: mDriversMarkers) {
  292.                     if (marker.getTag() != null) {
  293.                         if (marker.getTag().equals(key)) {
  294.                             marker.setPosition(new LatLng(location.latitude, location.longitude));
  295.                         }
  296.                     }
  297.                 }
  298.             }
  299.  
  300.             @Override
  301.             public void onGeoQueryReady() {
  302.  
  303.             }
  304.  
  305.             @Override
  306.             public void onGeoQueryError(DatabaseError error) {
  307.  
  308.             }
  309.         });
  310.     }
  311.  
  312.     @Override
  313.     public void onMapReady(GoogleMap googleMap) {
  314.         mMap = googleMap;
  315.         mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
  316.         //mMap.getUiSettings().setZoomControlsEnabled(true);
  317.         mMap.setOnCameraIdleListener(mCameraListener);
  318.  
  319.         mLocationRequest = new LocationRequest();
  320.         mLocationRequest.setInterval(1000);
  321.         mLocationRequest.setFastestInterval(1000);
  322.         mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
  323.         mLocationRequest.setSmallestDisplacement(5);
  324.  
  325.         startLocation();
  326.     }
  327.  
  328.     @Override
  329.     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  330.         super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  331.         if (requestCode == LOCATION_REQUEST_CODE) {
  332.             if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  333.                 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
  334.                     if (gpsActived()) {
  335.                         mFusedLocation.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
  336.                         mMap.setMyLocationEnabled(true);
  337.                     }
  338.                     else {
  339.                         showAlertDialogNOGPS();
  340.                     }
  341.                 }
  342.                 else {
  343.                     checkLocationPermissions();
  344.                 }
  345.             }
  346.             else {
  347.                 checkLocationPermissions();
  348.             }
  349.         }
  350.     }
  351.  
  352.     @Override
  353.     protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
  354.         super.onActivityResult(requestCode, resultCode, data);
  355.         if (requestCode == SETTINGS_REQUEST_CODE && gpsActived())  {
  356.             mFusedLocation.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
  357.             mMap.setMyLocationEnabled(true);
  358.         }
  359.         else if (requestCode == SETTINGS_REQUEST_CODE && !gpsActived()){
  360.             showAlertDialogNOGPS();
  361.         }
  362.     }
  363.  
  364.     private void showAlertDialogNOGPS() {
  365.         AlertDialog.Builder builder = new AlertDialog.Builder(this);
  366.         builder.setMessage("Por favor activa tu ubicacion para continuar")
  367.                 .setPositiveButton("Configuraciones", new DialogInterface.OnClickListener() {
  368.                     @Override
  369.                     public void onClick(DialogInterface dialogInterface, int i) {
  370.                         startActivityForResult(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS), SETTINGS_REQUEST_CODE);
  371.                     }
  372.                 }).create().show();
  373.     }
  374.  
  375.     private boolean gpsActived() {
  376.         boolean isActive = false;
  377.         LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
  378.  
  379.         if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
  380.             isActive = true;
  381.         }
  382.         return isActive;
  383.     }
  384.  
  385.     private void startLocation() {
  386.         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  387.             if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
  388.                 if (gpsActived()) {
  389.                     mFusedLocation.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
  390.                     mMap.setMyLocationEnabled(true);
  391.                 }
  392.                 else {
  393.                     showAlertDialogNOGPS();
  394.                 }
  395.             }
  396.             else {
  397.                 checkLocationPermissions();
  398.             }
  399.         } else {
  400.             if (gpsActived()) {
  401.                 mFusedLocation.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
  402.                 mMap.setMyLocationEnabled(true);
  403.             }
  404.             else {
  405.                 showAlertDialogNOGPS();
  406.             }
  407.         }
  408.     }
  409.  
  410.     private void checkLocationPermissions() {
  411.         if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  412.             if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
  413.                 new AlertDialog.Builder(this)
  414.                         .setTitle("Proporciona los permisos para continuar")
  415.                         .setMessage("Esta aplicacion requiere de los permisos de ubicacion para poder utilizarse")
  416.                         .setPositiveButton("OK", new DialogInterface.OnClickListener() {
  417.                             @Override
  418.                             public void onClick(DialogInterface dialogInterface, int i) {
  419.                                 ActivityCompat.requestPermissions(MapClientActivity.this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE);
  420.                             }
  421.                         })
  422.                         .create()
  423.                         .show();
  424.             }
  425.             else {
  426.                 ActivityCompat.requestPermissions(MapClientActivity.this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE);
  427.             }
  428.         }
  429.     }
  430.  
  431.     @Override
  432.     public boolean onCreateOptionsMenu(Menu menu) {
  433.         getMenuInflater().inflate(R.menu.client_menu, menu);
  434.  
  435.         return super.onCreateOptionsMenu(menu);
  436.     }
  437.  
  438.     @Override
  439.     public boolean onOptionsItemSelected(@NonNull MenuItem item) {
  440.         if (item.getItemId() == R.id.action_logout) {
  441.             logout();
  442.         }
  443.         if (item.getItemId() == R.id.action_update) {
  444.             Intent intent = new Intent(MapClientActivity.this, UpdateProfileActivity.class);
  445.             startActivity(intent);
  446.         }
  447.         if (item.getItemId() == R.id.action_history) {
  448.             Intent intent = new Intent(MapClientActivity.this, HistoryBookingClientActivity.class);
  449.             startActivity(intent);
  450.         }
  451.         return super.onOptionsItemSelected(item);
  452.     }
  453.  
  454.     void logout() {
  455.         mAuthProvider.logout();
  456.         Intent intent = new Intent(MapClientActivity.this, MainActivity.class);
  457.         startActivity(intent);
  458.         finish();
  459.     }
  460.  
  461.     void generateToken() {
  462.         mTokenProvider.create(mAuthProvider.getId());
  463.     }
  464. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement