Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.example.surajnath.taproute;
- import android.Manifest;
- import android.content.pm.PackageManager;
- import android.location.Location;
- import android.location.LocationListener;
- import android.os.Handler;
- import android.os.SystemClock;
- import android.support.annotation.NonNull;
- import android.support.annotation.Nullable;
- import android.support.design.widget.Snackbar;
- import android.support.v4.app.ActivityCompat;
- import android.support.v4.app.FragmentActivity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.animation.Interpolator;
- import android.view.animation.LinearInterpolator;
- import android.widget.Toast;
- import com.firebase.geofire.GeoFire;
- import com.firebase.geofire.GeoLocation;
- import com.github.glomadrian.materialanimatedswitch.MaterialAnimatedSwitch;
- 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.LocationRequest;
- 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.LatLng;
- import com.google.android.gms.maps.model.Marker;
- import com.google.android.gms.maps.model.MarkerOptions;
- import com.google.firebase.auth.FirebaseAuth;
- import com.google.firebase.database.DatabaseError;
- import com.google.firebase.database.DatabaseReference;
- import com.google.firebase.database.FirebaseDatabase;
- public class UserLocation extends FragmentActivity implements OnMapReadyCallback ,
- GoogleApiClient.ConnectionCallbacks,
- GoogleApiClient.OnConnectionFailedListener,
- LocationListener{
- private GoogleMap mMap;
- private static final int MY_PERMISSION_REQUEST_CODE= 7000;
- private static final int PLAY_SERVICE_RES_REQUEST= 7001;
- private LocationRequest mlocationRequest;
- private GoogleApiClient mGoogleAPiClient;
- private Location mLastLocation;
- private static int UPDATE_INTERVAL = 5000;
- private static int LATEST_INTERVAL = 3000;
- private static int DISPLACEMENT = 10;
- DatabaseReference drivers;
- GeoFire geoFire;
- Marker mCurrentUser;
- MaterialAnimatedSwitch location_switch;
- SupportMapFragment mapFragment;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_user_location);
- // Obtain the SupportMapFragment and get notified when the map is ready to be used.
- mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
- mapFragment.getMapAsync(this);
- location_switch = findViewById(R.id.location_switch);
- location_switch.setOnCheckedChangeListener(new MaterialAnimatedSwitch.OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(boolean isOnline) {
- if(isOnline){
- startLocationUpdate();
- displayLocaion();
- Snackbar.make(mapFragment.getView(),"You are online", Snackbar.LENGTH_SHORT).show();
- }else
- {
- stopLocationUpdates();
- mCurrentUser.remove();
- Snackbar.make(mapFragment.getView(),"You are offline", Snackbar.LENGTH_SHORT).show();
- }
- }
- });
- drivers = FirebaseDatabase.getInstance().getReference("Drivers");
- geoFire = new GeoFire(drivers);
- setUpLocation();
- }
- private void setUpLocation() {
- if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED &&
- ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED )
- {
- ActivityCompat.requestPermissions(this , new String[]{
- Manifest.permission.ACCESS_COARSE_LOCATION,
- Manifest.permission.ACCESS_FINE_LOCATION
- },MY_PERMISSION_REQUEST_CODE);
- }
- else
- {
- if(checkPlayServices()){
- buildGoogleApiCLient();
- createLocationRequest();
- if(location_switch.isChecked())
- displayLocaion();
- }
- }
- }
- private void createLocationRequest() {
- mlocationRequest = new LocationRequest();
- mlocationRequest.setInterval(UPDATE_INTERVAL);
- mlocationRequest.setFastestInterval(LATEST_INTERVAL);
- mlocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
- mlocationRequest.setSmallestDisplacement(DISPLACEMENT);
- }
- private 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_SERVICE_RES_REQUEST).show();
- }else
- {
- Toast.makeText(this,"The device is not supported",Toast.LENGTH_LONG).show();
- finish();
- }
- return false;
- }
- return true;
- }
- private void stopLocationUpdates() {
- if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED &&
- ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED )
- {
- return;
- }
- LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleAPiClient, (com.google.android.gms.location.LocationListener) this);
- }
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- switch (requestCode) {
- case MY_PERMISSION_REQUEST_CODE :
- if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
- if (checkPlayServices()) {
- buildGoogleApiCLient();
- createLocationRequest();
- if (location_switch.isChecked())
- displayLocaion();
- }
- }
- }
- }
- private void displayLocaion() {
- if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED &&
- ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED )
- {
- return;
- }
- mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleAPiClient);
- if(mLastLocation !=null){
- if(location_switch.isChecked()){
- final double latitude = (double) mLastLocation.getLatitude();
- final double longitude = (double) mLastLocation.getLongitude();
- geoFire.setLocation(FirebaseAuth.getInstance().getCurrentUser().getUid(), new GeoLocation(latitude, longitude), new GeoFire.CompletionListener() {
- @Override
- public void onComplete(String key, DatabaseError error) {
- if(mCurrentUser != null)
- mCurrentUser.remove();
- mCurrentUser = mMap.addMarker(new MarkerOptions()
- .icon(BitmapDescriptorFactory.fromResource(R.drawable.car))
- .position(new LatLng(latitude,longitude)).title("You"));
- mMap.animateCamera(CameraUpdateFactory.newLatLngZoom (new LatLng(latitude, longitude),15.0f));
- rotateMarker(mCurrentUser,-360,mMap);
- }
- });
- }else
- {
- Log.d("ERROR","Cannot get your Location");
- }
- }
- }
- private void rotateMarker(final Marker mCurrentUser, final float i, GoogleMap mMap) {
- final Handler handler = new Handler();
- final long start = SystemClock.uptimeMillis();
- final float startRotation =mCurrentUser.getRotation();
- final long duration =1500;
- final Interpolator interpolator = new LinearInterpolator();
- handler.post(new Runnable() {
- @Override
- public void run() {
- long elapsed =SystemClock.uptimeMillis() - start;
- float t = interpolator.getInterpolation((float)elapsed/duration);
- float rot = t*i+(1-t)*startRotation;
- mCurrentUser.setRotation(-rot >180?rot/2:rot);
- if(t<1.0){
- handler.postDelayed(this,16);
- }
- }
- });
- }
- private void startLocationUpdate() {
- if(ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)!= PackageManager.PERMISSION_GRANTED &&
- ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED )
- {
- return;
- }
- LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleAPiClient, mlocationRequest , (com.google.android.gms.location.LocationListener) this);
- }
- @Override
- public void onMapReady(GoogleMap googleMap) {
- mMap = googleMap;
- }
- @Override
- public void onLocationChanged(Location location) {
- mLastLocation = location;
- displayLocaion();
- }
- @Override
- public void onStatusChanged(String provider, int status, Bundle extras) {
- }
- @Override
- public void onProviderEnabled(String provider) {
- }
- @Override
- public void onProviderDisabled(String provider) {
- }
- @Override
- public void onConnected(@Nullable Bundle bundle) {
- displayLocaion();
- startLocationUpdate();
- }
- @Override
- public void onConnectionSuspended(int i) {
- mGoogleAPiClient.connect();
- }
- @Override
- public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
- }
- }
Add Comment
Please, Sign In to add comment