Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.daperrazo.entregas.activities.client;
- import androidx.annotation.NonNull;
- import androidx.annotation.Nullable;
- import androidx.appcompat.app.AlertDialog;
- import androidx.appcompat.app.AppCompatActivity;
- import androidx.core.app.ActivityCompat;
- import androidx.core.content.ContextCompat;
- import android.Manifest;
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.Intent;
- import android.content.pm.PackageManager;
- import android.location.Address;
- import android.location.Geocoder;
- import android.location.Location;
- import android.location.LocationManager;
- import android.os.Build;
- import android.os.Bundle;
- import android.os.Looper;
- import android.provider.Settings;
- import android.util.Log;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.Button;
- import android.widget.Toast;
- import com.daperrazo.entregas.R;
- import com.firebase.geofire.GeoLocation;
- import com.firebase.geofire.GeoQueryEventListener;
- import com.google.android.gms.common.api.Status;
- import com.google.android.gms.location.FusedLocationProviderClient;
- import com.google.android.gms.location.LocationCallback;
- 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.maps.CameraUpdateFactory;
- import com.google.android.gms.maps.GoogleMap;
- import com.google.android.gms.maps.OnMapReadyCallback;
- import com.google.android.gms.maps.SupportMapFragment;
- import com.google.android.gms.maps.model.BitmapDescriptorFactory;
- import com.google.android.gms.maps.model.CameraPosition;
- import com.google.android.gms.maps.model.LatLng;
- import com.google.android.gms.maps.model.Marker;
- import com.google.android.gms.maps.model.MarkerOptions;
- import com.google.android.libraries.places.api.Places;
- import com.google.android.libraries.places.api.model.Place;
- import com.google.android.libraries.places.api.model.RectangularBounds;
- import com.google.android.libraries.places.api.net.PlacesClient;
- import com.google.android.libraries.places.widget.AutocompleteSupportFragment;
- import com.google.android.libraries.places.widget.listener.PlaceSelectionListener;
- import com.google.firebase.database.DatabaseError;
- import com.google.maps.android.SphericalUtil;
- import com.daperrazo.entregas.activities.MainActivity;
- import com.daperrazo.entregas.activities.driver.MapDriverActivity;
- import com.daperrazo.entregas.includes.MyToolbar;
- import com.daperrazo.entregas.providers.AuthProvider;
- import com.daperrazo.entregas.providers.GeofireProvider;
- import com.daperrazo.entregas.providers.TokenProvider;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.List;
- public class MapClientActivity extends AppCompatActivity implements OnMapReadyCallback {
- private GoogleMap mMap;
- private SupportMapFragment mMapFragment;
- private AuthProvider mAuthProvider;
- private LocationRequest mLocationRequest;
- private FusedLocationProviderClient mFusedLocation;
- private GeofireProvider mGeofireProvider;
- private TokenProvider mTokenProvider;
- private final static int LOCATION_REQUEST_CODE = 1;
- private final static int SETTINGS_REQUEST_CODE = 2;
- private Marker mMarker;
- private LatLng mCurrentLatLng;
- private List<Marker> mDriversMarkers = new ArrayList<>();
- private boolean mIsFirstTime = true;
- private PlacesClient mPlaces;
- private AutocompleteSupportFragment mAutocomplete;
- private AutocompleteSupportFragment mAutocompleteDestination;
- private String mOrigin;
- private LatLng mOriginLatLng;
- private String mDestination;
- private LatLng mDestinationLatLng;
- private GoogleMap.OnCameraIdleListener mCameraListener;
- private Button mButtonRequestDriver;
- LocationCallback mLocationCallback = new LocationCallback() {
- @Override
- public void onLocationResult(LocationResult locationResult) {
- for(Location location: locationResult.getLocations()) {
- if (getApplicationContext() != null) {
- mCurrentLatLng = new LatLng(location.getLatitude(), location.getLongitude());
- // OBTENER LA LOCALIZACION DEL USUARIO EN TIEMPO REAL
- mMap.moveCamera(CameraUpdateFactory.newCameraPosition(
- new CameraPosition.Builder()
- .target(new LatLng(location.getLatitude(), location.getLongitude()))
- .zoom(15f)
- .build()
- ));
- if (mIsFirstTime) {
- mIsFirstTime = false;
- getActiveDrivers();
- limitSearch();
- }
- }
- }
- }
- };
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_map_client);
- MyToolbar.show(this, "Cliente", false);
- mAuthProvider = new AuthProvider();
- mGeofireProvider = new GeofireProvider("active_drivers");
- mTokenProvider = new TokenProvider();
- mFusedLocation = LocationServices.getFusedLocationProviderClient(this);
- mMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
- mMapFragment.getMapAsync(this);
- mButtonRequestDriver = findViewById(R.id.btnRequestDriver);
- if (!Places.isInitialized()) {
- Places.initialize(getApplicationContext(), getResources().getString(R.string.google_maps_key));
- }
- mPlaces = Places.createClient(this);
- instanceAutocompleteOrigin();
- instanceAutocompleteDestination();
- onCameraMove();
- mButtonRequestDriver.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- requestDriver();
- }
- });
- generateToken();
- }
- private void requestDriver() {
- if (mOriginLatLng != null && mDestinationLatLng != null) {
- Intent intent = new Intent(MapClientActivity.this, DetailRequestActivity.class);
- intent.putExtra("origin_lat", mOriginLatLng.latitude);
- intent.putExtra("origin_lng", mOriginLatLng.longitude);
- intent.putExtra("destination_lat", mDestinationLatLng.latitude);
- intent.putExtra("destination_lng", mDestinationLatLng.longitude);
- intent.putExtra("origin", mOrigin);
- intent.putExtra("destination", mDestination);
- startActivity(intent);
- }
- else {
- Toast.makeText(this, "Debe seleccionar el lugar de recogida y el destino", Toast.LENGTH_SHORT).show();
- }
- }
- private void limitSearch() {
- LatLng northSide = SphericalUtil.computeOffset(mCurrentLatLng, 5000, 0);
- LatLng southSide = SphericalUtil.computeOffset(mCurrentLatLng, 5000, 180);
- mAutocomplete.setCountry("ECU");
- mAutocomplete.setLocationBias(RectangularBounds.newInstance(southSide, northSide));
- mAutocompleteDestination.setCountry("ECU");
- mAutocompleteDestination.setLocationBias(RectangularBounds.newInstance(southSide, northSide));
- }
- private void onCameraMove(){
- mCameraListener = new GoogleMap.OnCameraIdleListener() {
- @Override
- public void onCameraIdle() {
- try {
- Geocoder geocoder = new Geocoder(MapClientActivity.this);
- mOriginLatLng = mMap.getCameraPosition().target;
- List<Address> addressList = geocoder.getFromLocation(mOriginLatLng.latitude, mOriginLatLng.longitude, 1);
- String city = addressList.get(0).getLocality();
- String country = addressList.get(0).getCountryName();
- String address = addressList.get(0).getAddressLine(0);
- mOrigin = address + " " + city;
- mAutocomplete.setText(address + " " + city);
- } catch (Exception e) {
- Log.d("Error: ", "Mensaje error: " + e.getMessage());
- }
- }
- };
- }
- private void instanceAutocompleteOrigin() {
- mAutocomplete = (AutocompleteSupportFragment) getSupportFragmentManager().findFragmentById(R.id.placeAutocompleteOrigin);
- mAutocomplete.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.LAT_LNG, Place.Field.NAME));
- mAutocomplete.setHint("Lugar de recogida");
- mAutocomplete.setOnPlaceSelectedListener(new PlaceSelectionListener() {
- @Override
- public void onPlaceSelected(@NonNull Place place) {
- mOrigin = place.getName();
- mOriginLatLng = place.getLatLng();
- Log.d("PLACE", "Name: " + mOrigin);
- Log.d("PLACE", "Lat: " + mOriginLatLng.latitude);
- Log.d("PLACE", "Lng: " + mOriginLatLng.longitude);
- }
- @Override
- public void onError(@NonNull Status status) {
- }
- });
- }
- private void instanceAutocompleteDestination() {
- mAutocompleteDestination = (AutocompleteSupportFragment) getSupportFragmentManager().findFragmentById(R.id.placeAutocompleteDestination);
- mAutocompleteDestination.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.LAT_LNG, Place.Field.NAME));
- mAutocompleteDestination.setHint("Destino");
- mAutocompleteDestination.setOnPlaceSelectedListener(new PlaceSelectionListener() {
- @Override
- public void onPlaceSelected(@NonNull Place place) {
- mDestination = place.getName();
- mDestinationLatLng = place.getLatLng();
- Log.d("PLACE", "Name: " + mDestination);
- Log.d("PLACE", "Lat: " + mDestinationLatLng.latitude);
- Log.d("PLACE", "Lng: " + mDestinationLatLng.longitude);
- }
- @Override
- public void onError(@NonNull Status status) {
- }
- });
- }
- private void getActiveDrivers() {
- mGeofireProvider.getActiveDrivers(mCurrentLatLng, 10).addGeoQueryEventListener(new GeoQueryEventListener() {
- @Override
- public void onKeyEntered(String key, GeoLocation location) {
- // AÑADIREMOS LOS MARCADORES DE LOS CONDUCTORES QUE SE CONECTEN EN LA APLICACION
- for (Marker marker: mDriversMarkers) {
- if (marker.getTag() != null) {
- if (marker.getTag().equals(key)) {
- return;
- }
- }
- }
- LatLng driverLatLng = new LatLng(location.latitude, location.longitude);
- Marker marker = mMap.addMarker(new MarkerOptions().position(driverLatLng).title("Conductor disponible").icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_car)));
- marker.setTag(key);
- mDriversMarkers.add(marker);
- }
- @Override
- public void onKeyExited(String key) {
- for (Marker marker: mDriversMarkers) {
- if (marker.getTag() != null) {
- if (marker.getTag().equals(key)) {
- marker.remove();
- mDriversMarkers.remove(marker);
- return;
- }
- }
- }
- }
- @Override
- public void onKeyMoved(String key, GeoLocation location) {
- // ACTUALIZAR LA POSICION DE CADA CONDUCTOR
- for (Marker marker: mDriversMarkers) {
- if (marker.getTag() != null) {
- if (marker.getTag().equals(key)) {
- marker.setPosition(new LatLng(location.latitude, location.longitude));
- }
- }
- }
- }
- @Override
- public void onGeoQueryReady() {
- }
- @Override
- public void onGeoQueryError(DatabaseError error) {
- }
- });
- }
- @Override
- public void onMapReady(GoogleMap googleMap) {
- mMap = googleMap;
- mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
- //mMap.getUiSettings().setZoomControlsEnabled(true);
- mMap.setOnCameraIdleListener(mCameraListener);
- mLocationRequest = new LocationRequest();
- mLocationRequest.setInterval(1000);
- mLocationRequest.setFastestInterval(1000);
- mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
- mLocationRequest.setSmallestDisplacement(5);
- startLocation();
- }
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- if (requestCode == LOCATION_REQUEST_CODE) {
- if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
- if (gpsActived()) {
- mFusedLocation.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
- mMap.setMyLocationEnabled(true);
- }
- else {
- showAlertDialogNOGPS();
- }
- }
- else {
- checkLocationPermissions();
- }
- }
- else {
- checkLocationPermissions();
- }
- }
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (requestCode == SETTINGS_REQUEST_CODE && gpsActived()) {
- mFusedLocation.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
- mMap.setMyLocationEnabled(true);
- }
- else if (requestCode == SETTINGS_REQUEST_CODE && !gpsActived()){
- showAlertDialogNOGPS();
- }
- }
- private void showAlertDialogNOGPS() {
- AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setMessage("Por favor activa tu ubicacion para continuar")
- .setPositiveButton("Configuraciones", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- startActivityForResult(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS), SETTINGS_REQUEST_CODE);
- }
- }).create().show();
- }
- private boolean gpsActived() {
- boolean isActive = false;
- LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
- if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
- isActive = true;
- }
- return isActive;
- }
- private void startLocation() {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
- if (gpsActived()) {
- mFusedLocation.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
- mMap.setMyLocationEnabled(true);
- }
- else {
- showAlertDialogNOGPS();
- }
- }
- else {
- checkLocationPermissions();
- }
- } else {
- if (gpsActived()) {
- mFusedLocation.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
- mMap.setMyLocationEnabled(true);
- }
- else {
- showAlertDialogNOGPS();
- }
- }
- }
- private void checkLocationPermissions() {
- if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
- if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
- new AlertDialog.Builder(this)
- .setTitle("Proporciona los permisos para continuar")
- .setMessage("Esta aplicacion requiere de los permisos de ubicacion para poder utilizarse")
- .setPositiveButton("OK", new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- ActivityCompat.requestPermissions(MapClientActivity.this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE);
- }
- })
- .create()
- .show();
- }
- else {
- ActivityCompat.requestPermissions(MapClientActivity.this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_REQUEST_CODE);
- }
- }
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.client_menu, menu);
- return super.onCreateOptionsMenu(menu);
- }
- @Override
- public boolean onOptionsItemSelected(@NonNull MenuItem item) {
- if (item.getItemId() == R.id.action_logout) {
- logout();
- }
- if (item.getItemId() == R.id.action_update) {
- Intent intent = new Intent(MapClientActivity.this, UpdateProfileActivity.class);
- startActivity(intent);
- }
- if (item.getItemId() == R.id.action_history) {
- Intent intent = new Intent(MapClientActivity.this, HistoryBookingClientActivity.class);
- startActivity(intent);
- }
- return super.onOptionsItemSelected(item);
- }
- void logout() {
- mAuthProvider.logout();
- Intent intent = new Intent(MapClientActivity.this, MainActivity.class);
- startActivity(intent);
- finish();
- }
- void generateToken() {
- mTokenProvider.create(mAuthProvider.getId());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement