Facebook
From Putrid Baboon, 6 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 329
  1. package com.example.garella.kchfoodtrucktrackingapps;
  2.  
  3.  
  4. import android.*;
  5. import android.Manifest;
  6. import android.content.pm.PackageManager;
  7. import android.location.Location;
  8. import android.os.Handler;
  9. import android.os.SystemClock;
  10. import android.support.annotation.NonNull;
  11. import android.support.annotation.Nullable;
  12. import android.support.design.widget.Snackbar;
  13. import android.support.v4.app.ActivityCompat;
  14. import android.support.v4.app.FragmentActivity;
  15. import android.os.Bundle;
  16. import android.util.Log;
  17. import android.view.animation.Interpolator;
  18. import android.view.animation.LinearInterpolator;
  19. import android.widget.Toast;
  20.  
  21. import com.firebase.geofire.GeoFire;
  22. import com.firebase.geofire.GeoLocation;
  23. import com.github.glomadrian.materialanimatedswitch.MaterialAnimatedSwitch;
  24. import com.google.android.gms.common.ConnectionResult;
  25. import com.google.android.gms.common.GooglePlayServicesUtil;
  26. import com.google.android.gms.location.LocationListener;
  27. import com.google.android.gms.common.api.GoogleApiClient;
  28. import com.google.android.gms.location.LocationRequest;
  29. import com.google.android.gms.location.LocationServices;
  30. import com.google.android.gms.maps.CameraUpdateFactory;
  31. import com.google.android.gms.maps.GoogleMap;
  32. import com.google.android.gms.maps.OnMapReadyCallback;
  33. import com.google.android.gms.maps.SupportMapFragment;
  34. import com.google.android.gms.maps.model.BitmapDescriptorFactory;
  35. import com.google.android.gms.maps.model.LatLng;
  36. import com.google.android.gms.maps.model.Marker;
  37. import com.google.android.gms.maps.model.MarkerOptions;
  38. import com.google.firebase.auth.FirebaseAuth;
  39. import com.google.firebase.database.DatabaseError;
  40. import com.google.firebase.database.DatabaseReference;
  41. import com.google.firebase.database.FirebaseDatabase;
  42.  
  43. public class Welcome_ extends FragmentActivity implements OnMapReadyCallback,
  44.         GoogleApiClient.ConnectionCallbacks,
  45.         GoogleApiClient.OnConnectionFailedListener,
  46.         LocationListener
  47. {
  48.  
  49.     private GoogleMap mMap;
  50.  
  51.     //Play Services
  52.     private static final int MY_PERMISSION_REQUEST_CODE = 7000;
  53.     private static final int PLAY_SERVICE_RES_REQUEST = 70001;
  54.  
  55.     private LocationRequest mLocationRequest;
  56.     private GoogleApiClient mGoogleApiClient;
  57.     private Location mLastLocation;
  58.  
  59.     private static int UPDATE_INTERVAL = 5000;
  60.     private static int FASTEST_INTERVAL = 3000;
  61.     private static int DISPLACEMENT = 10;
  62.  
  63.     DatabaseReference owner;
  64.     GeoFire geoFire;
  65.  
  66.     Marker mCurrent;
  67.  
  68.     MaterialAnimatedSwitch location_switch;
  69.     SupportMapFragment mapFragment;
  70.  
  71.     @Override
  72.     protected void onCreate(Bundle savedInstanceState) {
  73.         super.onCreate (savedInstanceState);
  74.         setContentView (R.layout.activity_welcome_);
  75.         // Obtain the SupportMapFragment and get notified when the map is ready to be used.
  76.         mapFragment = (SupportMapFragment) getSupportFragmentManager ()
  77.                 .findFragmentById (R.id.map);
  78.         mapFragment.getMapAsync (this);
  79.  
  80.         //Init View
  81.         location_switch = (MaterialAnimatedSwitch)findViewById (R.id.location_switch);
  82.         location_switch.setOnCheckedChangeListener (new MaterialAnimatedSwitch.OnCheckedChangeListener () {
  83.             @Override
  84.             public void onCheckedChanged(boolean isOnline) {
  85.  
  86.                 if(isOnline)
  87.                 {
  88.                     startLocationUpdates();
  89.                     displayLocation();
  90.                     mCurrent.remove ();
  91.                     Snackbar.make (mapFragment.getView (),"You Are Online",Snackbar.LENGTH_SHORT)
  92.                             .show ();
  93.                 }
  94.                 else
  95.                 {
  96.                     stopLocationUpdates();
  97.                     Snackbar.make (mapFragment.getView (),"You Are Offline",Snackbar.LENGTH_SHORT)
  98.                             .show ();
  99.                 }
  100.  
  101.             }
  102.         });
  103.  
  104.         //Geo Fire
  105.         owner = FirebaseDatabase.getInstance ().getReference ("Owner");
  106.         geoFire = new GeoFire (owner);
  107.  
  108.         setUpLocation();
  109.     }
  110.  
  111.     @Override
  112.     public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
  113.         switch (requestCode)
  114.         {
  115.             case MY_PERMISSION_REQUEST_CODE:
  116.                 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)
  117.                 {
  118.                     if(checkPlayServices())
  119.                     {
  120.                         buildGoogleApiClient();
  121.                         createLocationRequest();
  122.                         if(location_switch.isChecked ())
  123.                             displayLocation ();
  124.                     }
  125.                 }
  126.                 }
  127.         }
  128.  
  129.     private void setUpLocation() {
  130.         if (ActivityCompat.checkSelfPermission (this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
  131.                 ActivityCompat.checkSelfPermission (this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)
  132.         {
  133.             //Request runtime permission
  134.             ActivityCompat.requestPermissions (this, new String[]{
  135.                     Manifest.permission.ACCESS_COARSE_LOCATION,
  136.                     Manifest.permission.ACCESS_FINE_LOCATION
  137.             },MY_PERMISSION_REQUEST_CODE);
  138.         }
  139.         else
  140.         {
  141.             if(checkPlayServices())
  142.             {
  143.                 buildGoogleApiClient();
  144.                 createLocationRequest();
  145.                 if(location_switch.isChecked ())
  146.                     displayLocation ();
  147.             }
  148.         }
  149.     }
  150.  
  151.     private void createLocationRequest() {
  152.         mLocationRequest = new LocationRequest ();
  153.         mLocationRequest.setInterval (UPDATE_INTERVAL);
  154.         mLocationRequest.setFastestInterval (FASTEST_INTERVAL);
  155.         mLocationRequest.setPriority (LocationRequest.PRIORITY_HIGH_ACCURACY);
  156.         mLocationRequest.setSmallestDisplacement (DISPLACEMENT);
  157.     }
  158.  
  159.     private void buildGoogleApiClient() {
  160.         mGoogleApiClient = new GoogleApiClient.Builder (this)
  161.                 .addConnectionCallbacks (this)
  162.                 .addOnConnectionFailedListener (this)
  163.                 .addApi (LocationServices.API)
  164.                 .build ();
  165.         mGoogleApiClient.connect ();
  166.     }
  167.  
  168.     private boolean checkPlayServices() {
  169.         int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable (this);
  170.         if(resultCode != ConnectionResult.SUCCESS)
  171.         {
  172.             if(GooglePlayServicesUtil.isUserRecoverableError (resultCode))
  173.                 GooglePlayServicesUtil.getErrorDialog (resultCode,this,PLAY_SERVICE_RES_REQUEST).show();
  174.             else {
  175.                 Toast.makeText (this, "This device is not supported", Toast.LENGTH_SHORT).show ();
  176.                 finish ();
  177.             }
  178.             return false;
  179.  
  180.         }
  181.         return true;
  182.     }
  183.  
  184.     private void stopLocationUpdates() {
  185.         if (ActivityCompat.checkSelfPermission (this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
  186.                 ActivityCompat.checkSelfPermission (this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  187.             return;
  188.         }
  189.         LocationServices.FusedLocationApi.removeLocationUpdates (mGoogleApiClient,this);
  190.     }
  191.  
  192.     private void displayLocation() {
  193.         if (ActivityCompat.checkSelfPermission (this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
  194.                 ActivityCompat.checkSelfPermission (this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  195.             return;
  196.         }
  197.         mLastLocation = LocationServices.FusedLocationApi.getLastLocation (mGoogleApiClient);
  198.         if(mLastLocation != null)
  199.         {
  200.             if(location_switch.isChecked ())
  201.             {
  202.                 final double latitude = mLastLocation.getLatitude ();
  203.                 final double longitude = mLastLocation.getLongitude ();
  204.  
  205.                 //Update To Firebase
  206.                 geoFire.setLocation (FirebaseAuth.getInstance ().getCurrentUser ().getUid (), new GeoLocation (latitude, longitude), new GeoFire.CompletionListener () {
  207.                     @Override
  208.                     public void onComplete(String key, DatabaseError error) {
  209.                         //Add Marker
  210.                         if(mCurrent != null)
  211.                             mCurrent.remove ();
  212.                         mCurrent = mMap.addMarker (new MarkerOptions ()
  213.                                                                         .icon (BitmapDescriptorFactory.fromResource (R.drawable.truck_icon))
  214.                                                                         .position (new LatLng (latitude,longitude))
  215.                                                                         .title ("You"));
  216.  
  217.                         //Move camera to this position
  218.                         mMap.animateCamera (CameraUpdateFactory.newLatLngZoom (new LatLng (latitude,longitude),15.0f));
  219.  
  220.                         //Draw animation rotate marker
  221.                         rotateMarker(mCurrent,-360,mMap);
  222.                     }
  223.                 });
  224.             }
  225.         }
  226.         else
  227.         {
  228.             Log.d("ERROR","Cannot get your location");
  229.         }
  230.     }
  231.  
  232.     private void rotateMarker(final Marker mCurrent, final float i, GoogleMap mMap) {
  233.         final Handler handler = new Handler ();
  234.         final long start = SystemClock.uptimeMillis ();
  235.         final float startRotation = mCurrent.getRotation ();
  236.         final long duration = 1500;
  237.  
  238.         final Interpolator interpolator = new LinearInterpolator ();
  239.  
  240.         handler.post (new Runnable () {
  241.             @Override
  242.             public void run() {
  243.                 long elapsed = SystemClock.uptimeMillis () - start;
  244.                 float t = interpolator.getInterpolation ((float)elapsed/duration);
  245.                 float rot = t*i+(91-t)*startRotation;
  246.                 mCurrent.setRotation (-rot > 180?rot/2:rot);
  247.                 if(t<1.0)
  248.                 {
  249.                     handler.postDelayed (this,16);
  250.                 }
  251.  
  252.             }
  253.         });
  254.     }
  255.  
  256.     private void startLocationUpdates() {
  257.         if (ActivityCompat.checkSelfPermission (this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
  258.                 ActivityCompat.checkSelfPermission (this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
  259.             return;
  260.         }
  261.         LocationServices.FusedLocationApi.requestLocationUpdates (mGoogleApiClient,mLocationRequest,this);
  262.     }
  263.  
  264.  
  265.  
  266.     @Override
  267.     public void onMapReady(GoogleMap googleMap) {
  268.         mMap = googleMap;
  269.  
  270.  
  271.     }
  272.  
  273.     @Override
  274.     public void onConnected(@Nullable Bundle bundle) {
  275.         displayLocation ();
  276.         startLocationUpdates ();
  277.  
  278.     }
  279.  
  280.     @Override
  281.     public void onConnectionSuspended(int i) {
  282.         mGoogleApiClient.connect ();
  283.  
  284.     }
  285.  
  286.     @Override
  287.     public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
  288.  
  289.     }
  290.  
  291.     @Override
  292.     public void onLocationChanged(Location location) {
  293.         mLastLocation = location;
  294.         displayLocation ();
  295.  
  296.     }
  297. }
  298.