diff --git a/OSMBonusPackTuto/src/main/java/com/example/osmbonuspacktuto/MainActivity.java b/OSMBonusPackTuto/src/main/java/com/example/osmbonuspacktuto/MainActivity.java index 1116db30..e0bcfed9 100644 --- a/OSMBonusPackTuto/src/main/java/com/example/osmbonuspacktuto/MainActivity.java +++ b/OSMBonusPackTuto/src/main/java/com/example/osmbonuspacktuto/MainActivity.java @@ -1,8 +1,10 @@ package com.example.osmbonuspacktuto; +import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; @@ -10,8 +12,11 @@ import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.StrictMode; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; import android.view.View; import android.widget.Button; import android.widget.ImageView; @@ -51,7 +56,13 @@ import org.osmdroid.views.MapView; import org.osmdroid.views.overlay.Overlay; +import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; /** * This is the implementation of OSMBonusPack tutorials. @@ -64,8 +75,9 @@ public class MainActivity extends Activity implements MapEventsReceiver { MapView map; KmlDocument mKmlDocument; + final int STORAGE=1; - @Override protected void onCreate(Bundle savedInstanceState) { + @Override protected void onCreate(Bundle savedInstanceState) { //Disable StrictMode.ThreadPolicy to perform network calls in the UI thread. //Yes, it's not the good practice, but this is just a tutorial! @@ -230,6 +242,49 @@ public class MainActivity extends Activity implements MapEventsReceiver { //16. Handling Map events MapEventsOverlay mapEventsOverlay = new MapEventsOverlay(this, this); map.getOverlays().add(0, mapEventsOverlay); //inserted at the "bottom" of all overlays + + // Request permissions to support Android Marshmallow and above devices + if (Build.VERSION.SDK_INT >= 23) { + checkPermission(); + } + } + + private void checkPermission() { + List permissions = new ArrayList<>(); + if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(this, "Storage permission is required to store map tiles to reduce data usage and for offline usage.", Toast.LENGTH_LONG).show(); + permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + if (!permissions.isEmpty()) { + String[] params = permissions.toArray(new String[permissions.size()]); + ActivityCompat.requestPermissions(this, params, STORAGE); + } // else // We already have permissions, so handle as normal + } + + @Override + public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { + switch (requestCode) { + case STORAGE:{ + Map perms = new HashMap<>(); + // Initial + perms.put(Manifest.permission.WRITE_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED); + // Fill with results + for (int i = 0; i < permissions.length; i++) + perms.put(permissions[i], grantResults[i]); + // Check for WRITE_EXTERNAL_STORAGE + Boolean storage = perms.get(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; + if (!storage) { + // Permission Denied + Toast.makeText(this, "Storage permission is required to store map tiles to reduce data usage and for offline usage.", Toast.LENGTH_LONG).show(); + } // else // permission was granted, yay! + } + } + } + + public String dateToString(Date date, String format) { + SimpleDateFormat df = new SimpleDateFormat(format, Locale.getDefault()); + + return df.format(date); } //0. Using the Marker and Polyline overlays - advanced options diff --git a/OSMNavigator/src/main/java/com/osmnavigator/MapActivity.java b/OSMNavigator/src/main/java/com/osmnavigator/MapActivity.java index 6119d192..a335be03 100644 --- a/OSMNavigator/src/main/java/com/osmnavigator/MapActivity.java +++ b/OSMNavigator/src/main/java/com/osmnavigator/MapActivity.java @@ -1,5 +1,6 @@ package com.osmnavigator; +import android.Manifest; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; @@ -7,6 +8,7 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -27,6 +29,7 @@ import android.os.Environment; import android.os.Handler; import android.provider.Settings; +import android.support.v4.content.ContextCompat; import android.text.InputType; import android.util.Log; import android.view.ContextMenu; @@ -228,9 +231,13 @@ public class MapActivity extends Activity implements MapEventsReceiver, Location map.getOverlays().add(myLocationOverlay); if (savedInstanceState == null){ - Location location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); - if (location == null) - location = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); + // TODO: Revisit. Abstract code to initialize location. When requesting location, also request storage. + Location location = null; + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + location = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); + if (location == null) + location = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); + } if (location != null) { //location known: onLocationChanged(location); @@ -510,7 +517,9 @@ else if (locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) boolean startLocationUpdates(){ boolean result = false; for (final String provider : mLocationManager.getProviders(true)) { - mLocationManager.requestLocationUpdates(provider, 2*1000, 0.0f, this); + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + mLocationManager.requestLocationUpdates(provider, 2 * 1000, 0.0f, this); + } result = true; } return result; @@ -529,7 +538,9 @@ boolean startLocationUpdates(){ @Override protected void onPause() { super.onPause(); - mLocationManager.removeUpdates(this); + if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + mLocationManager.removeUpdates(this); + } //TODO: mSensorManager.unregisterListener(this); stopSharingTimer(); savePrefs();