summaryrefslogtreecommitdiffstats
path: root/src/com/android/packageinstaller/permission
diff options
context:
space:
mode:
authorJason Monk <jmonk@google.com>2015-06-17 13:51:52 -0400
committerJason Monk <jmonk@google.com>2015-06-17 14:45:32 -0400
commit6dc9e5007de25dd9dd8fd6ebc42d9322069a9a38 (patch)
tree6ed8d6a43de21013569796b9f8c898c0bdd6c4d5 /src/com/android/packageinstaller/permission
parent6e5d5f06c14acb48baf97e46aa63bf84cc04c2c1 (diff)
downloadandroid_packages_apps_PackageInstaller-6dc9e5007de25dd9dd8fd6ebc42d9322069a9a38.tar.gz
android_packages_apps_PackageInstaller-6dc9e5007de25dd9dd8fd6ebc42d9322069a9a38.tar.bz2
android_packages_apps_PackageInstaller-6dc9e5007de25dd9dd8fd6ebc42d9322069a9a38.zip
Link from location permission to settings for loc providers
Bug: 21805447 Change-Id: I27aed860b73d99976479793076852aecbf0be5a2
Diffstat (limited to 'src/com/android/packageinstaller/permission')
-rw-r--r--src/com/android/packageinstaller/permission/model/AppPermissionGroup.java4
-rw-r--r--src/com/android/packageinstaller/permission/model/PermissionApps.java4
-rw-r--r--src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java5
-rw-r--r--src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java7
-rw-r--r--src/com/android/packageinstaller/permission/utils/LocationUtils.java87
5 files changed, 106 insertions, 1 deletions
diff --git a/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java b/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java
index 37db59aa..c3fd86db 100644
--- a/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java
+++ b/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java
@@ -29,6 +29,7 @@ import android.os.UserHandle;
import android.util.ArrayMap;
import com.android.packageinstaller.R;
+import com.android.packageinstaller.permission.utils.LocationUtils;
import java.util.ArrayList;
import java.util.List;
@@ -248,6 +249,9 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
}
public boolean areRuntimePermissionsGranted() {
+ if (LocationUtils.isLocked(mName, mPackageInfo.packageName)) {
+ return LocationUtils.isLocationEnabled(mContext);
+ }
final int permissionCount = mPermissions.size();
for (int i = 0; i < permissionCount; i++) {
Permission permission = mPermissions.valueAt(i);
diff --git a/src/com/android/packageinstaller/permission/model/PermissionApps.java b/src/com/android/packageinstaller/permission/model/PermissionApps.java
index 1aadeb2c..f4246112 100644
--- a/src/com/android/packageinstaller/permission/model/PermissionApps.java
+++ b/src/com/android/packageinstaller/permission/model/PermissionApps.java
@@ -69,6 +69,10 @@ public class PermissionApps {
loadGroupInfo();
}
+ public String getGroupName() {
+ return mGroupName;
+ }
+
public void loadNowWithoutUi() {
mSkipUi = true;
createMap(loadPermissionApps());
diff --git a/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java b/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java
index e83641f1..b08e8f98 100644
--- a/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java
+++ b/src/com/android/packageinstaller/permission/ui/AppPermissionsFragment.java
@@ -51,6 +51,7 @@ import android.widget.Toast;
import com.android.packageinstaller.R;
import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.AppPermissions;
+import com.android.packageinstaller.permission.utils.LocationUtils;
import com.android.packageinstaller.permission.utils.SafetyNetLogger;
import com.android.packageinstaller.permission.utils.Utils;
@@ -278,6 +279,10 @@ public final class AppPermissionsFragment extends SettingsWithHeader
addToggledGroup(group);
+ if (LocationUtils.isLocked(group.getName(), group.getApp().packageName)) {
+ LocationUtils.showLocationDialog(getContext(), group.getLabel());
+ return false;
+ }
if (newValue == Boolean.TRUE) {
group.grantRuntimePermissions(false);
} else {
diff --git a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java
index 3c05c463..3ddf9ee5 100644
--- a/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java
+++ b/src/com/android/packageinstaller/permission/ui/PermissionAppsFragment.java
@@ -45,6 +45,7 @@ import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.PermissionApps;
import com.android.packageinstaller.permission.model.PermissionApps.Callback;
import com.android.packageinstaller.permission.model.PermissionApps.PermissionApp;
+import com.android.packageinstaller.permission.utils.LocationUtils;
import com.android.packageinstaller.permission.utils.SafetyNetLogger;
import com.android.packageinstaller.permission.utils.Utils;
@@ -213,9 +214,13 @@ public final class PermissionAppsFragment extends PreferenceFragment implements
String pkg = preference.getKey();
final PermissionApp app = mPermissionApps.getApp(pkg);
+ if (app == null) {
+ return false;
+ }
addToggledGroup(app.getPackageName(), app.getPermissionGroup());
- if (app == null) {
+ if (LocationUtils.isLocked(mPermissionApps.getGroupName(), app.getPackageName())) {
+ LocationUtils.showLocationDialog(getContext(), app.getLabel());
return false;
}
if (newValue == Boolean.TRUE) {
diff --git a/src/com/android/packageinstaller/permission/utils/LocationUtils.java b/src/com/android/packageinstaller/permission/utils/LocationUtils.java
new file mode 100644
index 00000000..4c4ea6e3
--- /dev/null
+++ b/src/com/android/packageinstaller/permission/utils/LocationUtils.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.packageinstaller.permission.utils;
+
+import android.Manifest;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.location.ILocationManager;
+import android.location.LocationManager;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.provider.Settings;
+
+import com.android.packageinstaller.R;
+
+import java.util.ArrayList;
+
+public class LocationUtils {
+
+ public static final String LOCATION_PERMISSION = Manifest.permission_group.LOCATION;
+
+ public static ArrayList<String> getLocationProviders() {
+ ArrayList<String> providers = new ArrayList<>();
+ Resources res = Resources.getSystem();
+ providers.add(res.getString(
+ com.android.internal.R.string.config_networkLocationProviderPackageName));
+
+ for (String provider :
+ res.getStringArray(com.android.internal.R.array.config_locationProviderPackageNames)) {
+ providers.add(provider);
+ }
+
+ return providers;
+ }
+
+ public static void showLocationDialog(final Context context, CharSequence label) {
+ new AlertDialog.Builder(context)
+ .setIcon(com.android.internal.R.drawable.ic_dialog_alert_material)
+ .setTitle(android.R.string.dialog_alert_title)
+ .setMessage(context.getString(R.string.location_warning, label))
+ .setNegativeButton(R.string.ok, null)
+ .setPositiveButton(R.string.location_settings, new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));
+ }
+ })
+ .show();
+ }
+
+ public static boolean isLocationEnabled(Context context) {
+ return Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE,
+ Settings.Secure.LOCATION_MODE_OFF) != Settings.Secure.LOCATION_MODE_OFF;
+ }
+
+ public static boolean isLocked(String groupName, String packageName) {
+ return LOCATION_PERMISSION.equals(groupName) && isNetworkLocationProvider(packageName);
+ }
+
+ private static boolean isNetworkLocationProvider(String packageName) {
+ ILocationManager locationService = ILocationManager.Stub.asInterface(
+ ServiceManager.getService(Context.LOCATION_SERVICE));
+ try {
+ return packageName.equals(locationService.getNetworkProviderPackage());
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+}