- package com.example.garella.kchfoodtrucktrackingapps;
- import android.*;
- import android.Manifest;
- import android.content.pm.PackageManager;
- import android.location.Location;
- 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.location.LocationListener;
- 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 Welcome_ extends FragmentActivity implements OnMapReadyCallback,
- GoogleApiClient.ConnectionCallbacks,
- GoogleApiClient.OnConnectionFailedListener,
- LocationListener
- {
- private GoogleMap mMap;
- //Play Services
- private static final int MY_PERMISSION_REQUEST_CODE = 7000;
- private static final int PLAY_SERVICE_RES_REQUEST = 70001;
- private LocationRequest mLocationRequest;
- private GoogleApiClient mGoogleApiClient;
- private Location mLastLocation;
- private static int UPDATE_INTERVAL = 5000;
- private static int FASTEST_INTERVAL = 3000;
- private static int DISPLACEMENT = 10;
- DatabaseReference owner;
- GeoFire geoFire;
- Marker mCurrent;
- MaterialAnimatedSwitch location_switch;
- SupportMapFragment mapFragment;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate (savedInstanceState);
- setContentView (R.layout.activity_welcome_);
- // Obtain the SupportMapFragment and get notified when the map is ready to be used.
- mapFragment = (SupportMapFragment) getSupportFragmentManager ()
- .findFragmentById (R.id.map);
- mapFragment.getMapAsync (this);
- //Init View
- location_switch = (MaterialAnimatedSwitch)findViewById (R.id.location_switch);
- location_switch.setOnCheckedChangeListener (new MaterialAnimatedSwitch.OnCheckedChangeListener () {
- @Override
- public void onCheckedChanged(boolean isOnline) {
- if(isOnline)
- {
- startLocationUpdates();
- displayLocation();
- mCurrent.remove ();
- Snackbar.make (mapFragment.getView (),"You Are Online",Snackbar.LENGTH_SHORT)
- .show ();
- }
- else
- {
- stopLocationUpdates();
- Snackbar.make (mapFragment.getView (),"You Are Offline",Snackbar.LENGTH_SHORT)
- .show ();
- }
- }
- });
- //Geo Fire
- owner = FirebaseDatabase.getInstance ().getReference ("Owner");
- geoFire = new GeoFire (owner);
- setUpLocation();
- }
- @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 ())
- displayLocation ();
- }
- }
- }
- }
- 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)
- {
- //Request runtime permission
- 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 ())
- displayLocation ();
- }
- }
- }
- private void createLocationRequest() {
- mLocationRequest = new LocationRequest ();
- mLocationRequest.setInterval (UPDATE_INTERVAL);
- mLocationRequest.setFastestInterval (FASTEST_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, "This device is not supported", Toast.LENGTH_SHORT).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,this);
- }
- private void displayLocation() {
- 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 = mLastLocation.getLatitude ();
- final double longitude = mLastLocation.getLongitude ();
- //Update To Firebase
- geoFire.setLocation (FirebaseAuth.getInstance ().getCurrentUser ().getUid (), new GeoLocation (latitude, longitude), new GeoFire.CompletionListener () {
- @Override
- public void onComplete(String key, DatabaseError error) {
- //Add Marker
- if(mCurrent != null)
- mCurrent.remove ();
- mCurrent = mMap.addMarker (new MarkerOptions ()
- .icon (BitmapDescriptorFactory.fromResource (R.drawable.truck_icon))
- .position (new LatLng (latitude,longitude))
- .title ("You"));
- //Move camera to this position
- mMap.animateCamera (CameraUpdateFactory.newLatLngZoom (new LatLng (latitude,longitude),15.0f));
- //Draw animation rotate marker
- rotateMarker(mCurrent,-360,mMap);
- }
- });
- }
- }
- else
- {
- Log.d("ERROR","Cannot get your location");
- }
- }
- private void rotateMarker(final Marker mCurrent, final float i, GoogleMap mMap) {
- final Handler handler = new Handler ();
- final long start = SystemClock.uptimeMillis ();
- final float startRotation = mCurrent.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+(91-t)*startRotation;
- mCurrent.setRotation (-rot > 180?rot/2:rot);
- if(t<1.0)
- {
- handler.postDelayed (this,16);
- }
- }
- });
- }
- private void startLocationUpdates() {
- 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,this);
- }
- @Override
- public void onMapReady(GoogleMap googleMap) {
- mMap = googleMap;
- }
- @Override
- public void onConnected(@Nullable Bundle bundle) {
- displayLocation ();
- startLocationUpdates ();
- }
- @Override
- public void onConnectionSuspended(int i) {
- mGoogleApiClient.connect ();
- }
- @Override
- public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
- }
- @Override
- public void onLocationChanged(Location location) {
- mLastLocation = location;
- displayLocation ();
- }
- }