diff options
author | Sam Mortimer <sam@mortimer.me.uk> | 2017-01-30 17:22:19 -0800 |
---|---|---|
committer | Zhao Wei Liew <zhaoweiliew@gmail.com> | 2017-02-03 12:16:54 +0000 |
commit | ec7e4e6c392eba0bea336fc3526bf2791097e459 (patch) | |
tree | c9880cf5a7436dba51722dd427ef1b3df1802904 | |
parent | c9dbf418db5c26938e24db3ab7b6af6cf5097611 (diff) | |
download | android_packages_apps_Gallery2-staging/cm-14.1-cafrebase.tar.gz android_packages_apps_Gallery2-staging/cm-14.1-cafrebase.tar.bz2 android_packages_apps_Gallery2-staging/cm-14.1-cafrebase.zip |
Gallery2: Fix crash when using locations viewstaging/cm-14.1-cafrebase
https://jira.lineageos.org/browse/BUGBASH-9
AndroidRuntime: java.lang.SecurityException: "passive" location
provider requires ACCESS_FINE_LOCATION permission
Change-Id: Idde0dab8fbea16c1980816c3b21061e98ba51fe6
(cherry picked from commit e457e7e7523126e71df4c3767081967ed1500feb)
-rwxr-xr-x | AndroidManifest.xml | 2 | ||||
-rw-r--r-- | src/com/android/gallery3d/app/GalleryActivity.java | 28 | ||||
-rw-r--r-- | src/com/android/gallery3d/util/ReverseGeocoder.java | 36 |
3 files changed, 52 insertions, 14 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 5f8fa4fa4..86c507a82 100755 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -32,6 +32,8 @@ <permission android:name="com.android.gallery3d.permission.STORAGE_CHANGE" android:protectionLevel="signatureOrSystem" /> + <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> + <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> diff --git a/src/com/android/gallery3d/app/GalleryActivity.java b/src/com/android/gallery3d/app/GalleryActivity.java index 456122154..fa191b165 100644 --- a/src/com/android/gallery3d/app/GalleryActivity.java +++ b/src/com/android/gallery3d/app/GalleryActivity.java @@ -63,6 +63,7 @@ public final class GalleryActivity extends AbstractGalleryActivity implements On private Dialog mVersionCheckDialog; private static final int PERMISSION_REQUEST_STORAGE = 1; + private static final int PERMISSION_REQUEST_LOCATION = 2; private Bundle mSavedInstanceState; @@ -81,6 +82,10 @@ public final class GalleryActivity extends AbstractGalleryActivity implements On mSavedInstanceState = savedInstanceState; + /* Note: location permissions aren't required + */ + needRequestLocationPermission(); + if (!needRequestStoragePermission()) { init(); } @@ -98,22 +103,37 @@ public final class GalleryActivity extends AbstractGalleryActivity implements On public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { - case PERMISSION_REQUEST_STORAGE: { + case PERMISSION_REQUEST_STORAGE: if (checkPermissionGrantResults(grantResults)) { init(); } else { finish(); } - } + break; + case PERMISSION_REQUEST_LOCATION: + /* We check permissions during data adapter load */ + break; } } + private boolean needRequestLocationPermission() { + String[] permissions = { + Manifest.permission.ACCESS_COARSE_LOCATION, + Manifest.permission.ACCESS_FINE_LOCATION + }; + return needRequestPermission(PERMISSION_REQUEST_LOCATION, permissions); + } + private boolean needRequestStoragePermission() { - boolean needRequest = false; String[] permissions = { Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE }; + return needRequestPermission(PERMISSION_REQUEST_STORAGE, permissions); + } + + private boolean needRequestPermission(int request_code, String[] permissions) { + boolean needRequest = false; ArrayList<String> permissionList = new ArrayList<String>(); for (String permission : permissions) { if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { @@ -130,7 +150,7 @@ public final class GalleryActivity extends AbstractGalleryActivity implements On permissionArray[i] = permissionList.get(i); } - requestPermissions(permissionArray, PERMISSION_REQUEST_STORAGE); + requestPermissions(permissionArray, request_code); } } diff --git a/src/com/android/gallery3d/util/ReverseGeocoder.java b/src/com/android/gallery3d/util/ReverseGeocoder.java index a8b26d9b5..a620dcfc8 100644 --- a/src/com/android/gallery3d/util/ReverseGeocoder.java +++ b/src/com/android/gallery3d/util/ReverseGeocoder.java @@ -17,10 +17,12 @@ package com.android.gallery3d.util; import android.content.Context; +import android.content.pm.PackageManager; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.location.LocationManager; +import android.Manifest; import android.net.ConnectivityManager; import android.net.NetworkInfo; @@ -85,6 +87,28 @@ public class ReverseGeocoder { context.getSystemService(Context.CONNECTIVITY_SERVICE); } + private Location getCurrentLocation() { + if (mContext.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) + != PackageManager.PERMISSION_GRANTED + && mContext.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) + != PackageManager.PERMISSION_GRANTED) { + return null; + } + + LocationManager locationManager = + (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); + Location location = null; + List<String> providers = locationManager.getAllProviders(); + for (int i = 0; i < providers.size(); ++i) { + String provider = providers.get(i); + location = (provider != null) ? locationManager.getLastKnownLocation(provider) : null; + if (location != null) + break; + } + + return location; + } + public String computeAddress(SetLatLong set) { // The overall min and max latitudes and longitudes of the set. double setMinLatitude = set.mMinLatLatitude; @@ -110,16 +134,8 @@ public class ReverseGeocoder { // Get current location, we decide the granularity of the string based // on this. - LocationManager locationManager = - (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); - Location location = null; - List<String> providers = locationManager.getAllProviders(); - for (int i = 0; i < providers.size(); ++i) { - String provider = providers.get(i); - location = (provider != null) ? locationManager.getLastKnownLocation(provider) : null; - if (location != null) - break; - } + Location location = getCurrentLocation(); + String currentCity = ""; String currentAdminArea = ""; String currentCountry = Locale.getDefault().getCountry(); |