diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b5a061b..6ec7431 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -55,9 +55,7 @@ android:enabled="true" /> - - diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java index db50b0d..4492708 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/BaseActivity.java @@ -3,9 +3,13 @@ package com.uam.wmi.findmytutor.activity; import android.app.Fragment; import android.app.FragmentTransaction; import android.content.Intent; +import android.content.pm.PackageManager; import android.content.res.Configuration; +import android.os.Build; import android.support.annotation.NonNull; import android.support.design.widget.BottomNavigationView; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarDrawerToggle; @@ -14,6 +18,7 @@ import android.os.Bundle; import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; import android.text.TextUtils; +import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -24,6 +29,8 @@ import android.widget.Toast; import com.uam.wmi.findmytutor.ListViewAdapter; import com.uam.wmi.findmytutor.R; +import com.uam.wmi.findmytutor.service.BackgroundLocalizationService; +import com.uam.wmi.findmytutor.utils.PrefUtils; import java.util.ArrayList; @@ -43,6 +50,12 @@ public abstract class BaseActivity private ListViewAdapter adapter; private SharingFragment sharingFragment; + private static final int REQUEST_PERMISSIONS = 100; + boolean boolean_permission; + private boolean isTutor; + + + @Override protected void onCreate(Bundle savedInstanceState) { @@ -53,6 +66,10 @@ public abstract class BaseActivity navigationView.setOnNavigationItemSelectedListener(this); sharingFragment = new SharingFragment(); + isTutor = PrefUtils.getIsTutor(getApplicationContext()); + if (!isTutor) { + navigationView.findViewById(R.id.nav_profile).setVisibility(View.GONE); + } } @@ -111,6 +128,41 @@ public abstract class BaseActivity setUpNav(); actionBarDrawerToggle.syncState(); + Log.e("erororr", "guewa!" + isTutor); + +// if (isTutor && getContentViewId() == R.layout.activity_map) { + if (isTutor) { + Log.e("erororr", "taaaaaak!"); + fn_permission(); + } + } + + private void fn_permission() { + if ((ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED)) { + + if ((ActivityCompat.shouldShowRequestPermissionRationale(BaseActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION))) { + + } else { + ActivityCompat.requestPermissions(BaseActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION + + }, + REQUEST_PERMISSIONS); + } + } else { + + if (isTutor) { + Intent intent = new Intent(getApplicationContext(), BackgroundLocalizationService.class); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(intent); + } else { + startService(intent); + } + + } else { + Toast.makeText(getApplicationContext(), "Please enable the gps", Toast.LENGTH_SHORT).show(); + } + } } @Override @@ -154,6 +206,21 @@ public abstract class BaseActivity return super.onOptionsItemSelected(item); } + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + switch (requestCode) { + case REQUEST_PERMISSIONS: { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + boolean_permission = true; + } else { + Toast.makeText(getApplicationContext(), "Please allow the permission", Toast.LENGTH_LONG).show(); + } + } + } + } + @Override protected void onStart() { super.onStart(); @@ -181,6 +248,8 @@ public abstract class BaseActivity @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { + + navigationView.postDelayed(() -> { int itemId = item.getItemId(); if (itemId == R.id.nav_map) { diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java index 67dfc45..4dced04 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/MapActivity.java @@ -1,32 +1,199 @@ package com.uam.wmi.findmytutor.activity; +import android.animation.ObjectAnimator; +import android.animation.TypeEvaluator; +import android.animation.ValueAnimator; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; import android.os.Bundle; +import android.os.Handler; +import android.support.design.widget.FloatingActionButton; +import android.util.Log; import com.mapbox.mapboxsdk.Mapbox; +import com.mapbox.mapboxsdk.annotations.Marker; +import com.mapbox.mapboxsdk.annotations.MarkerOptions; +import com.mapbox.mapboxsdk.annotations.MarkerViewOptions; +import com.mapbox.mapboxsdk.geometry.LatLng; import com.mapbox.mapboxsdk.maps.MapView; import com.mapbox.mapboxsdk.maps.MapboxMap; import com.mapbox.mapboxsdk.maps.OnMapReadyCallback; import com.uam.wmi.findmytutor.R; +import com.uam.wmi.findmytutor.model.Coordinate; +import com.uam.wmi.findmytutor.network.RetrofitClientInstance; +import com.uam.wmi.findmytutor.service.CoordinateService; +import com.uam.wmi.findmytutor.utils.PrefUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.annotations.NonNull; +import io.reactivex.disposables.CompositeDisposable; +import io.reactivex.observers.DisposableSingleObserver; +import io.reactivex.schedulers.Schedulers; + + +public class MapActivity extends BaseActivity + implements OnMapReadyCallback { -public class MapActivity extends BaseActivity { - private MapView mapView; String tag = "LifeCycleEvents"; + + private MapView mapView; + private MapboxMap mapboxMap; + private int mInterval = 10000; + private Handler mHandler; + + private Map coordsMap = new HashMap<>(); + + private CoordinateService coordinateService; + private CompositeDisposable disposable = new CompositeDisposable(); + + private Runnable mStatusChecker; + + + + + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - Mapbox.getInstance(this, getString(R.string.access_token)); - mapView = findViewById(R.id.mapView); - mapView.onCreate(savedInstanceState); + configureLogoutButton(); - mapView.getMapAsync(new OnMapReadyCallback() { + final SharedPreferences sharedPref = getSharedPreferences("fmtPrefs", Context.MODE_PRIVATE); + final String authToken = sharedPref.getString("authToken",null); + + mStatusChecker = new Runnable() { @Override - public void onMapReady(MapboxMap mapboxMap) { - - // Customize map with markers, polylines, etc. - + public void run() { + try{ + fetchTopCoords(); + } finally { + mHandler.postDelayed(mStatusChecker, mInterval); + } } + }; + + coordinateService = RetrofitClientInstance.createService(CoordinateService.class,"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1laWQiOiJhM2MxMDU1YS1kZDM0LTQ5ZWItYTFkNS0xY2E5YTE2YzY0ODgiLCJzdWIiOiJzdHJpbmciLCJqdGkiOiI4NTA0NDA5NS00NjBkLTQzZDgtYjMxMC0xYmNiNWMxNGExZjQiLCJleHAiOjE1NDMzNTAzMzQsImlzcyI6Imh0dHA6Ly9maW5kbXl0dXRvci5jb20iLCJhdWQiOiJodHRwOi8vZmluZG15dHV0b3IuY29tIn0.xGyu6iBeq9xF0ufBd01jNzILLq1NeYa-5MeVOiPahD8"); + + mHandler = new Handler(); + Bundle extras = getIntent().getExtras(); + + Mapbox.getInstance(this, getString(R.string.access_token)); + + mapView = (MapView) findViewById(R.id.mapView); + mapView.onCreate(savedInstanceState); + mapView.getMapAsync(this); + } + + @Override + public void onMapReady(MapboxMap map) { + mapboxMap = map; + final Marker marker = mapboxMap.addMarker(new MarkerViewOptions() + .position(new LatLng(52.466782,16.927549))); + mStatusChecker.run(); + + mapboxMap.addOnMapClickListener(new MapboxMap.OnMapClickListener() { + @Override + public void onMapClick(@NonNull LatLng point) { + + // When the user clicks on the map, we want to animate the marker to that + // location. + ValueAnimator markerAnimator = ObjectAnimator.ofObject(marker, "position", + new LatLngEvaluator(), marker.getPosition(), point); + markerAnimator.setDuration(2000); + markerAnimator.start(); + } + }); + } + + private static class LatLngEvaluator implements TypeEvaluator { + // Method is used to interpolate the marker animation. + + private LatLng latLng = new LatLng(); + + @Override + public LatLng evaluate(float fraction, LatLng startValue, LatLng endValue) { + latLng.setLatitude(startValue.getLatitude() + + ((endValue.getLatitude() - startValue.getLatitude()) * fraction)); + latLng.setLongitude(startValue.getLongitude() + + ((endValue.getLongitude() - startValue.getLongitude()) * fraction)); + return latLng; + } + } + + private void fetchTopCoords() { + disposable.add( + // coordinateService.getTopCoordinates() + coordinateService.getOnlineCoordinates() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeWith(new DisposableSingleObserver>() { + @Override + public void onSuccess(List coordsList) { + + + for (Coordinate element : coordsList) { + String id = element.getUserId(); + Coordinate cord = coordsMap.get(id); + + + Log.d("mapper", "a " + mapboxMap.getMarkerViewManager()); + Log.d("mapper", "b " + coordsMap.size()); + if (cord != null) { + if (!cord.getLongitude().equals(element.getLongitude()) + ) { + Log.d("mapper", " cos sie zienilo "); + Marker marker = mapboxMap.addMarker(new MarkerViewOptions() + .title(cord.getUserId()) + .position(new LatLng(cord.getLatitude(),cord.getLongitude()))); + + ValueAnimator markerAnimator = ObjectAnimator.ofObject(marker, "position", + new LatLngEvaluator(), marker.getPosition(), new LatLng(element.getLatitude(),element.getLongitude())); + markerAnimator.setDuration(2000); + markerAnimator.start(); + + coordsMap.replace(id,element); + } else if (!cord.getTimeStamp().equals(element.getTimeStamp())){ + Log.d("mapper", "update"); + Log.d("mapper", " "+cord.getTimeStamp()); + Log.d("mapper", " "+element.getTimeStamp()); + coordsMap.replace(id,element); + } + } else { + coordsMap.put(id,element); + mapboxMap.addMarker(new MarkerOptions().position(new LatLng(element.getLatitude(), element.getLongitude()))); + } + } + } + + @Override + public void onError(Throwable e) { + Log.e("Error",e.toString()); + } + }) + ); + + } + + private void configureLogoutButton(){ + // Logout button + final FloatingActionButton button = findViewById(R.id.logoutButton); + + button.setOnClickListener(view -> { + PrefUtils.cleanUserLocalStorage(getApplicationContext()); + + Intent i = getBaseContext().getPackageManager() + .getLaunchIntentForPackage(getBaseContext().getPackageName()); + if (i != null) { + i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + } + startActivity(i); + finish(); }); } @@ -67,6 +234,8 @@ public class MapActivity extends BaseActivity { protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); + mHandler.removeCallbacks(mStatusChecker); + disposable.dispose(); } @Override diff --git a/app/src/main/java/com/uam/wmi/findmytutor/activity/SettingsActivity.java b/app/src/main/java/com/uam/wmi/findmytutor/activity/SettingsActivity.java index 13b75a1..c20fb4c 100644 --- a/app/src/main/java/com/uam/wmi/findmytutor/activity/SettingsActivity.java +++ b/app/src/main/java/com/uam/wmi/findmytutor/activity/SettingsActivity.java @@ -31,7 +31,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity { @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); - addPreferencesFromResource(R.xml.pref_main); + addPreferencesFromResource(R.layout.pref_main); //TODO add on change listeners for preferences diff --git a/app/src/main/res/layout/activity_map.xml b/app/src/main/res/layout/activity_map.xml index c34a574..282f395 100644 --- a/app/src/main/res/layout/activity_map.xml +++ b/app/src/main/res/layout/activity_map.xml @@ -18,5 +18,14 @@ mapbox:mapbox_styleUrl="mapbox://styles/domagalsky/cjiyzrqjp05l72rmj6ntvv2n8"> - + \ No newline at end of file