From 8ca050b01bd14849212aa4e6dce7ea89fdb830bd Mon Sep 17 00:00:00 2001 From: GaidamakUA Date: Fri, 4 Dec 2015 11:26:41 +0200 Subject: [PATCH] Android 6.0 permissions handling for location and Audio-Video notes plugin --- OsmAnd/no_translate.xml | 4 +- .../osmand/plus/OsmAndLocationProvider.java | 128 ++++++++++-------- OsmAnd/src/net/osmand/plus/OsmandPlugin.java | 12 +- .../osmand/plus/activities/MapActivity.java | 15 +- .../audionotes/AudioVideoNotesPlugin.java | 106 ++++++++++++--- .../osmand/plus/views/MapControlsLayer.java | 15 +- 6 files changed, 196 insertions(+), 84 deletions(-) diff --git a/OsmAnd/no_translate.xml b/OsmAnd/no_translate.xml index b07558b6c5..b969de3bf3 100644 --- a/OsmAnd/no_translate.xml +++ b/OsmAnd/no_translate.xml @@ -25,5 +25,7 @@ name Tag Value - + App have no permission to access location data. + App have no permission to access camera. + App have no permission to access microphone. diff --git a/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java b/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java index bceb894695..c7f8b0d9c8 100644 --- a/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java +++ b/OsmAnd/src/net/osmand/plus/OsmAndLocationProvider.java @@ -1,8 +1,10 @@ package net.osmand.plus; +import android.Manifest; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.pm.PackageManager; import android.hardware.GeomagneticField; import android.hardware.Sensor; import android.hardware.SensorEvent; @@ -17,8 +19,11 @@ import android.location.LocationManager; import android.os.Build; import android.os.Bundle; import android.provider.Settings; +import android.support.v4.app.ActivityCompat; import android.support.v7.app.AlertDialog; import android.util.Log; +import android.widget.Toast; + import net.osmand.GeoidAltitudeCorrection; import net.osmand.PlatformUtil; import net.osmand.ResultMatcher; @@ -40,7 +45,9 @@ import java.util.LinkedList; import java.util.List; public class OsmAndLocationProvider implements SensorEventListener { - + + public static final int REQUEST_LOCATION_PERMISSION = 100; + private static final String SIMULATED_PROVIDER = "OsmAnd"; @@ -76,7 +83,7 @@ public class OsmAndLocationProvider implements SensorEventListener { private static final boolean USE_KALMAN_FILTER = true; private static final float KALMAN_COEFFICIENT = 0.04f; - + float avgValSin = 0; float avgValCos = 0; float lastValSin = 0; @@ -86,7 +93,7 @@ public class OsmAndLocationProvider implements SensorEventListener { private int previousCompassIndA = 0; private int previousCompassIndB = 0; private boolean inUpdateValue = false; - + private Float heading = null; // Current screen orientation @@ -94,22 +101,22 @@ public class OsmAndLocationProvider implements SensorEventListener { private OsmandApplication app; private OsmandSettings settings; - + private NavigationInfo navigationInfo; private CurrentPositionHelper currentPositionHelper; private OsmAndLocationSimulation locationSimulation; private net.osmand.Location location = null; - - private GPSInfo gpsInfo = new GPSInfo(); + + private GPSInfo gpsInfo = new GPSInfo(); private List locationListeners = new ArrayList(); private List compassListeners = new ArrayList(); private Listener gpsStatusListener; - private float[] mRotationM = new float[9]; + private float[] mRotationM = new float[9]; private OsmandPreference USE_MAGNETIC_FIELD_SENSOR_COMPASS; private OsmandPreference USE_FILTER_FOR_COMPASS; - private static final long AGPS_TO_REDOWNLOAD = 16 * 60 * 60 * 1000; // 16 hours + private static final long AGPS_TO_REDOWNLOAD = 16 * 60 * 60 * 1000; // 16 hours public class SimulationProvider { @@ -118,14 +125,14 @@ public class OsmAndLocationProvider implements SensorEventListener { private QuadPoint currentPoint; private net.osmand.Location startLocation; private List roads; - - - public void startSimulation(List roads, - net.osmand.Location currentLocation) { + + + public void startSimulation(List roads, + net.osmand.Location currentLocation) { this.roads = roads; startLocation = new net.osmand.Location(currentLocation); long ms = System.currentTimeMillis(); - if(ms - startLocation.getTime() > 5000 || + if (ms - startLocation.getTime() > 5000 || ms < startLocation.getTime()) { startLocation.setTime(ms); } @@ -133,14 +140,14 @@ public class OsmAndLocationProvider implements SensorEventListener { int px = MapUtils.get31TileNumberX(currentLocation.getLongitude()); int py = MapUtils.get31TileNumberY(currentLocation.getLatitude()); double dist = 1000; - for(int i = 0; i < roads.size(); i++) { + for (int i = 0; i < roads.size(); i++) { RouteSegmentResult road = roads.get(i); boolean plus = road.getStartPointIndex() < road.getEndPointIndex(); - for(int j = road.getStartPointIndex() + 1; j <= road.getEndPointIndex(); ) { + for (int j = road.getStartPointIndex() + 1; j <= road.getEndPointIndex(); ) { RouteDataObject obj = road.getObject(); - QuadPoint proj = MapUtils.getProjectionPoint31(px, py, obj.getPoint31XTile(j-1), obj.getPoint31YTile(j-1), + QuadPoint proj = MapUtils.getProjectionPoint31(px, py, obj.getPoint31XTile(j - 1), obj.getPoint31YTile(j - 1), obj.getPoint31XTile(j), obj.getPoint31YTile(j)); - double dd = MapUtils.squareRootDist31((int)proj.x, (int)proj.y, px, py); + double dd = MapUtils.squareRootDist31((int) proj.x, (int) proj.y, px, py); if (dd < dist) { dist = dd; currentRoad = i; @@ -151,26 +158,26 @@ public class OsmAndLocationProvider implements SensorEventListener { } } } - + private float proceedMeters(float meters, net.osmand.Location l) { - for(int i = currentRoad; i < roads.size(); i++) { + for (int i = currentRoad; i < roads.size(); i++) { RouteSegmentResult road = roads.get(i); boolean firstRoad = i == currentRoad; boolean plus = road.getStartPointIndex() < road.getEndPointIndex(); - for(int j = firstRoad ? currentSegment : road.getStartPointIndex() + 1; j <= road.getEndPointIndex(); ) { + for (int j = firstRoad ? currentSegment : road.getStartPointIndex() + 1; j <= road.getEndPointIndex(); ) { RouteDataObject obj = road.getObject(); - int st31x = obj.getPoint31XTile(j-1); - int st31y = obj.getPoint31YTile(j-1); + int st31x = obj.getPoint31XTile(j - 1); + int st31y = obj.getPoint31YTile(j - 1); int end31x = obj.getPoint31XTile(j); int end31y = obj.getPoint31YTile(j); boolean last = i == roads.size() - 1 && j == road.getEndPointIndex(); boolean first = firstRoad && j == currentSegment; - if(first) { + if (first) { st31x = (int) currentPoint.x; st31y = (int) currentPoint.y; } double dd = MapUtils.measuredDist31(st31x, st31y, end31x, end31y); - if(meters > dd && !last){ + if (meters > dd && !last) { meters -= dd; } else { int prx = (int) (st31x + (end31x - st31x) * (meters / dd)); @@ -184,32 +191,32 @@ public class OsmAndLocationProvider implements SensorEventListener { } return -1; } - + /** * @return null if it is not available of far from boundaries */ public net.osmand.Location getSimulatedLocation() { - if(!isSimulatedDataAvailable()) { + if (!isSimulatedDataAvailable()) { return null; } - + net.osmand.Location loc = new net.osmand.Location(SIMULATED_PROVIDER); loc.setSpeed(startLocation.getSpeed()); loc.setAltitude(startLocation.getAltitude()); loc.setTime(System.currentTimeMillis()); float meters = startLocation.getSpeed() * ((System.currentTimeMillis() - startLocation.getTime()) / 1000); float proc = proceedMeters(meters, loc); - if(proc < 0 || proc >= 100){ + if (proc < 0 || proc >= 100) { return null; } return loc; } - + public boolean isSimulatedDataAvailable() { return startLocation != null && startLocation.getSpeed() > 0 && currentRoad >= 0; } } - + public OsmAndLocationProvider(OsmandApplication app) { this.app = app; navigationInfo = new NavigationInfo(app); @@ -219,39 +226,41 @@ public class OsmAndLocationProvider implements SensorEventListener { currentPositionHelper = new CurrentPositionHelper(app); locationSimulation = new OsmAndLocationSimulation(app, this); } - + public void resumeAllUpdates() { final LocationManager service = (LocationManager) app.getSystemService(Context.LOCATION_SERVICE); - if(app.getSettings().isInternetConnectionAvailable()) { - if(System.currentTimeMillis() - app.getSettings().AGPS_DATA_LAST_TIME_DOWNLOADED.get() > AGPS_TO_REDOWNLOAD) { + if (app.getSettings().isInternetConnectionAvailable()) { + if (System.currentTimeMillis() - app.getSettings().AGPS_DATA_LAST_TIME_DOWNLOADED.get() > AGPS_TO_REDOWNLOAD) { //force an updated check for internet connectivity here before destroying A-GPS-data - if(app.getSettings().isInternetConnectionAvailable(true)) { + if (app.getSettings().isInternetConnectionAvailable(true)) { redownloadAGPS(); } } } - service.addGpsStatusListener(getGpsStatusListener(service)); - try { - service.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_TIMEOUT_REQUEST, GPS_DIST_REQUEST, gpsListener); - } catch (IllegalArgumentException e) { - Log.d(PlatformUtil.TAG, "GPS location provider not available"); //$NON-NLS-1$ - } - // try to always ask for network provide : it is faster way to find location - - List providers = service.getProviders(true); - if(providers == null) { - return; - } - for (String provider : providers) { - if (provider == null || provider.equals(LocationManager.GPS_PROVIDER)) { - continue; - } + if (isLocationPermissionAvailable(app)) { + service.addGpsStatusListener(getGpsStatusListener(service)); try { - NetworkListener networkListener = new NetworkListener(); - service.requestLocationUpdates(provider, GPS_TIMEOUT_REQUEST, GPS_DIST_REQUEST, networkListener); - networkListeners.add(networkListener); + service.requestLocationUpdates(LocationManager.GPS_PROVIDER, GPS_TIMEOUT_REQUEST, GPS_DIST_REQUEST, gpsListener); } catch (IllegalArgumentException e) { - Log.d(PlatformUtil.TAG, provider + " location provider not available"); //$NON-NLS-1$ + Log.d(PlatformUtil.TAG, "GPS location provider not available"); //$NON-NLS-1$ + } + // try to always ask for network provide : it is faster way to find location + + List providers = service.getProviders(true); + if (providers == null) { + return; + } + for (String provider : providers) { + if (provider == null || provider.equals(LocationManager.GPS_PROVIDER)) { + continue; + } + try { + NetworkListener networkListener = new NetworkListener(); + service.requestLocationUpdates(provider, GPS_TIMEOUT_REQUEST, GPS_DIST_REQUEST, networkListener); + networkListeners.add(networkListener); + } catch (IllegalArgumentException e) { + Log.d(PlatformUtil.TAG, provider + " location provider not available"); //$NON-NLS-1$ + } } } } @@ -332,6 +341,9 @@ public class OsmAndLocationProvider implements SensorEventListener { } public net.osmand.Location getFirstTimeRunDefaultLocation() { + if (!isLocationPermissionAvailable(app)) { + return null; + } LocationManager service = (LocationManager) app.getSystemService(Context.LOCATION_SERVICE); List ps = service.getProviders(true); if(ps == null) { @@ -914,4 +926,12 @@ public class OsmAndLocationProvider implements SensorEventListener { return true; } + public static boolean isLocationPermissionAvailable(Context context) { + if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) + != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(context, R.string.no_location_permission, Toast.LENGTH_LONG).show(); + return false; + } + return true; + } } diff --git a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java index 2073b38d30..503667df3e 100644 --- a/OsmAnd/src/net/osmand/plus/OsmandPlugin.java +++ b/OsmAnd/src/net/osmand/plus/OsmandPlugin.java @@ -211,6 +211,17 @@ public abstract class OsmandPlugin { public void mapActivityScreenOff(MapActivity activity) { } + public void handleRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults, MapActivity activity) { + } + + public static final void onRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults, MapActivity activity) { + for (OsmandPlugin plugin : getAvailablePlugins()) { + plugin.handleRequestPermissionsResult(requestCode, permissions, grantResults, activity); + } + } + public boolean destinationReached() { return true; } @@ -443,5 +454,4 @@ public abstract class OsmandPlugin { p.addMyPlacesTab(favoritesActivity, mTabs, intent); } } - } diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java index 090b69c20d..e766efa4df 100644 --- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java +++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java @@ -16,6 +16,7 @@ import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; +import android.support.v4.app.ActivityCompat; import android.support.v4.app.NotificationCompat.Builder; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.NotificationCompat; @@ -95,7 +96,8 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class MapActivity extends AccessibleActivity implements DownloadEvents { +public class MapActivity extends AccessibleActivity implements DownloadEvents, + ActivityCompat.OnRequestPermissionsResultCallback { private static final int SHOW_POSITION_MSG_ID = OsmAndConstants.UI_HANDLER_MAP_VIEW + 1; private static final int LONG_KEYPRESS_MSG_ID = OsmAndConstants.UI_HANDLER_MAP_VIEW + 2; private static final int LONG_KEYPRESS_DELAY = 500; @@ -176,7 +178,7 @@ public class MapActivity extends AccessibleActivity implements DownloadEvents { mapView = new OsmandMapTileView(this, getWindow().getDecorView().getWidth(), getWindow().getDecorView().getHeight()); - if(app.getAppInitializer().checkAppVersionChanged(this)) { + if (app.getAppInitializer().checkAppVersionChanged(this)) { new WhatsNewDialogFragment().show(getSupportFragmentManager(), null); } mapActions = new MapActivityActions(this); @@ -668,7 +670,7 @@ public class MapActivity extends AccessibleActivity implements DownloadEvents { } } wakeLockHelper.onStop(this); - if(getMyApplication().getNavigationService() == null) { + if (getMyApplication().getNavigationService() == null) { getMyApplication().getNotificationHelper().removeServiceNotificationCompletely(); } super.onStop(); @@ -687,7 +689,6 @@ public class MapActivity extends AccessibleActivity implements DownloadEvents { if (atlasMapRendererView != null) { atlasMapRendererView.handleOnDestroy(); } - } private void cancelNotification() { @@ -1054,6 +1055,12 @@ public class MapActivity extends AccessibleActivity implements DownloadEvents { } } + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + OsmandPlugin.onRequestPermissionsResult(requestCode, permissions, grantResults, this); + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + private class ScreenOffReceiver extends BroadcastReceiver { @Override diff --git a/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java b/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java index 688f3d9427..6fb2723b80 100644 --- a/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java +++ b/OsmAnd/src/net/osmand/plus/audionotes/AudioVideoNotesPlugin.java @@ -1,5 +1,6 @@ package net.osmand.plus.audionotes; +import android.Manifest; import android.app.Activity; import android.app.Dialog; import android.content.ComponentName; @@ -7,6 +8,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; +import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; @@ -23,6 +25,7 @@ import android.media.SoundPool; import android.net.Uri; import android.os.Build; import android.provider.MediaStore; +import android.support.v4.app.ActivityCompat; import android.view.Display; import android.view.KeyEvent; import android.view.Surface; @@ -93,6 +96,9 @@ public class AudioVideoNotesPlugin extends OsmandPlugin { public static final String MPEG4_EXTENSION = "mp4"; public static final String IMG_EXTENSION = "jpg"; private static final Log log = PlatformUtil.getLog(AudioVideoNotesPlugin.class); + public static final int CAMERA_FOR_VIDEO_REQUEST_CODE = 101; + public static final int CAMERA_FOR_PHOTO_REQUEST_CODE = 102; + public static final int AUDIO_REQUEST_CODE = 103; private static Method mRegisterMediaButtonEventReceiver; private static Method mUnregisterMediaButtonEventReceiver; private OsmandApplication app; @@ -140,6 +146,8 @@ public class AudioVideoNotesPlugin extends OsmandPlugin { private File lastTakingPhoto; private final static char SPLIT_DESC = ' '; + private double tempLat; + private double tempLon; public static class Recording { public Recording(File f) { @@ -463,6 +471,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin { public String getHelpFileName() { return "feature_articles/audio-video-notes-plugin.html"; } + @Override public boolean init(final OsmandApplication app, Activity activity) { initializeRemoteControlRegistrationMethods(); @@ -722,7 +731,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin { ((AudioManager) activity.getSystemService(Context.AUDIO_SERVICE)).registerMediaButtonEventReceiver( new ComponentName(activity, MediaRemoteControlReceiver.class)); } - + @Override public void mapActivityPause(MapActivity activity) { this.mapActivity = null; @@ -733,7 +742,18 @@ public class AudioVideoNotesPlugin extends OsmandPlugin { if (AV_EXTERNAL_RECORDER.get()) { captureVideoExternal(lat, lon, mapActivity); } else { - recordVideoCamera(lat, lon, mapActivity); + if (ActivityCompat.checkSelfPermission(mapActivity, Manifest.permission.CAMERA) + == PackageManager.PERMISSION_GRANTED + && ActivityCompat.checkSelfPermission(mapActivity, Manifest.permission.RECORD_AUDIO) + == PackageManager.PERMISSION_GRANTED) { + recordVideoCamera(lat, lon, mapActivity); + } else { + tempLat = lat; + tempLon = lon; + ActivityCompat.requestPermissions(mapActivity, + new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO}, + CAMERA_FOR_VIDEO_REQUEST_CODE); + } } } @@ -830,34 +850,55 @@ public class AudioVideoNotesPlugin extends OsmandPlugin { } public void recordAudio(double lat, double lon, final MapActivity mapActivity) { - MediaRecorder mr = new MediaRecorder(); - final File f = getBaseFileName(lat, lon, app, THREEGP_EXTENSION); - mr.setAudioSource(MediaRecorder.AudioSource.MIC); - mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); - mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); - mr.setOutputFile(f.getAbsolutePath()); - try { - runMediaRecorder(mapActivity, mr, f); - } catch (Exception e) { - log.error("Error starting audio recorder ", e); - AccessibleToast.makeText(app, app.getString(R.string.recording_error) + " : " + e.getMessage(), Toast.LENGTH_LONG).show(); + if (ActivityCompat.checkSelfPermission(mapActivity, Manifest.permission.RECORD_AUDIO) + == PackageManager.PERMISSION_GRANTED) { + MediaRecorder mr = new MediaRecorder(); + final File f = getBaseFileName(lat, lon, app, THREEGP_EXTENSION); + mr.setAudioSource(MediaRecorder.AudioSource.MIC); + mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); + mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); + mr.setOutputFile(f.getAbsolutePath()); + try { + runMediaRecorder(mapActivity, mr, f); + } catch (Exception e) { + log.error("Error starting audio recorder ", e); + AccessibleToast.makeText(app, app.getString(R.string.recording_error) + " : " + e.getMessage(), Toast.LENGTH_LONG).show(); + } + } else { + tempLat = lat; + tempLon = lon; + ActivityCompat.requestPermissions(mapActivity, + new String[]{Manifest.permission.RECORD_AUDIO}, + AUDIO_REQUEST_CODE); } - } public void takePhoto(final double lat, final double lon, final MapActivity mapActivity) { if (AV_EXTERNAL_PHOTO_CAM.get()) { - takeIntentPhoto(lat, lon, mapActivity); + takePhotoExternal(lat, lon, mapActivity); } else { - final Camera cam = openCamera(); - if (cam != null) { - takePhotoWithCamera(lat, lon, mapActivity, cam); + if (ActivityCompat.checkSelfPermission(mapActivity, Manifest.permission.CAMERA) + == PackageManager.PERMISSION_GRANTED) { + takePhotoInternalOrExternal(lat, lon, mapActivity); } else { - takeIntentPhoto(lat, lon, mapActivity); + tempLat = lat; + tempLon = lon; + ActivityCompat.requestPermissions(mapActivity, + new String[]{Manifest.permission.CAMERA}, + CAMERA_FOR_PHOTO_REQUEST_CODE); } } } + private void takePhotoInternalOrExternal(double lat, double lon, MapActivity mapActivity) { + final Camera cam = openCamera(); + if (cam != null) { + takePhotoWithCamera(lat, lon, mapActivity, cam); + } else { + takePhotoExternal(lat, lon, mapActivity); + } + } + private void takePhotoWithCamera(final double lat, final double lon, final MapActivity mapActivity, final Camera cam) { try { final Dialog dlg = new Dialog(mapActivity); @@ -1012,7 +1053,7 @@ public class AudioVideoNotesPlugin extends OsmandPlugin { } } - private void takeIntentPhoto(double lat, double lon, final MapActivity mapActivity) { + private void takePhotoExternal(double lat, double lon, final MapActivity mapActivity) { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); final File f = getBaseFileName(lat, lon, app, IMG_EXTENSION); lastTakingPhoto = f; @@ -1327,6 +1368,31 @@ public class AudioVideoNotesPlugin extends OsmandPlugin { return false; } + @Override + public void handleRequestPermissionsResult(int requestCode, String[] permissions, + int[] grantResults, MapActivity activity) { + if (requestCode == CAMERA_FOR_VIDEO_REQUEST_CODE) { + if (grantResults[0] == PackageManager.PERMISSION_GRANTED + && grantResults[1] == PackageManager.PERMISSION_GRANTED) { + recordVideoCamera(tempLat, tempLon, activity); + } else { + app.showToastMessage(R.string.no_camera_permission); + } + } else if (requestCode == CAMERA_FOR_PHOTO_REQUEST_CODE) { + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + takePhotoInternalOrExternal(tempLat, tempLon, activity); + } else { + app.showToastMessage(R.string.no_camera_permission); + } + } else if (requestCode == AUDIO_REQUEST_CODE) { + if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { + recordAudio(tempLat, tempLon, activity); + } else { + app.showToastMessage(R.string.no_microphone_permission); + } + } + } + public class AudioVideoPhotoHandler implements PictureCallback { private File pictureFile; private Dialog dlg; diff --git a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java index 65f04081fe..a252f9e310 100644 --- a/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java +++ b/OsmAnd/src/net/osmand/plus/views/MapControlsLayer.java @@ -1,5 +1,6 @@ package net.osmand.plus.views; +import android.Manifest; import android.annotation.SuppressLint; import android.content.DialogInterface; import android.content.Intent; @@ -11,6 +12,7 @@ import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Handler; import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; import android.support.v7.app.AlertDialog; import android.view.MotionEvent; import android.view.View; @@ -28,6 +30,7 @@ import net.osmand.core.android.MapRendererContext; import net.osmand.data.LatLon; import net.osmand.data.RotatedTileBox; import net.osmand.plus.ApplicationMode; +import net.osmand.plus.OsmAndLocationProvider; import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandPlugin; import net.osmand.plus.OsmandSettings; @@ -406,7 +409,13 @@ public class MapControlsLayer extends OsmandMapLayer { backToLocation.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - mapActivity.getMapViewTrackingUtilities().backToLocationImpl(); + if(OsmAndLocationProvider.isLocationPermissionAvailable(mapActivity)) { + mapActivity.getMapViewTrackingUtilities().backToLocationImpl(); + } else { + ActivityCompat.requestPermissions(mapActivity, + new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, + OsmAndLocationProvider.REQUEST_LOCATION_PERMISSION); + } } }); controls.add(createHudButton(mapActivity.findViewById(R.id.map_app_mode_shadow), 0).setBg( @@ -444,7 +453,7 @@ public class MapControlsLayer extends OsmandMapLayer { zoomText = (TextView) mapActivity.findViewById(R.id.map_app_mode_text); View routePlanButton = mapActivity.findViewById(R.id.map_route_info_button); - routePlanningBtn = createHudButton((ImageView) routePlanButton, R.drawable.map_directions).setBg( + routePlanningBtn = createHudButton(routePlanButton, R.drawable.map_directions).setBg( R.drawable.btn_round, R.drawable.btn_round_night); controls.add(routePlanningBtn); routePlanButton.setOnClickListener(new View.OnClickListener() { @@ -1021,6 +1030,4 @@ public class MapControlsLayer extends OsmandMapLayer { } } } - - }