summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Mortimer <sam@mortimer.me.uk>2017-01-30 17:22:19 -0800
committerZhao Wei Liew <zhaoweiliew@gmail.com>2017-02-03 12:16:54 +0000
commitec7e4e6c392eba0bea336fc3526bf2791097e459 (patch)
treec9880cf5a7436dba51722dd427ef1b3df1802904
parentc9dbf418db5c26938e24db3ab7b6af6cf5097611 (diff)
downloadandroid_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-xAndroidManifest.xml2
-rw-r--r--src/com/android/gallery3d/app/GalleryActivity.java28
-rw-r--r--src/com/android/gallery3d/util/ReverseGeocoder.java36
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();