Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e457e7e7 authored by Sam Mortimer's avatar Sam Mortimer
Browse files

Gallery2: Fix crash when using locations view

https://jira.lineageos.org/browse/BUGBASH-9

AndroidRuntime: java.lang.SecurityException: "passive" location
provider requires ACCESS_FINE_LOCATION permission

Change-Id: Idde0dab8fbea16c1980816c3b21061e98ba51fe6
parent 581c0bd6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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" />
+24 −4
Original line number Diff line number Diff line
@@ -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);
            }
        }

+26 −10
Original line number Diff line number Diff line
@@ -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();