diff options
Diffstat (limited to 'src/com/android/settings/UsageAccessSettings.java')
-rw-r--r-- | src/com/android/settings/UsageAccessSettings.java | 71 |
1 files changed, 61 insertions, 10 deletions
diff --git a/src/com/android/settings/UsageAccessSettings.java b/src/com/android/settings/UsageAccessSettings.java index 8ae277d..8d0650b 100644 --- a/src/com/android/settings/UsageAccessSettings.java +++ b/src/com/android/settings/UsageAccessSettings.java @@ -20,8 +20,12 @@ import com.android.internal.content.PackageMonitor; import android.Manifest; import android.app.ActivityThread; +import android.app.AlertDialog; import android.app.AppOpsManager; +import android.app.Dialog; +import android.app.DialogFragment; import android.content.Context; +import android.content.DialogInterface; import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; @@ -30,6 +34,7 @@ import android.os.Bundle; import android.os.Looper; import android.os.RemoteException; import android.preference.Preference; +import android.preference.PreferenceScreen; import android.preference.SwitchPreference; import android.util.ArrayMap; import android.util.Log; @@ -176,7 +181,7 @@ public class UsageAccessSettings extends SettingsPreferenceFragment implements if (newEntries == null) { mPackageEntryMap.clear(); - getPreferenceScreen().removeAll(); + mPreferenceScreen.removeAll(); return; } @@ -187,7 +192,7 @@ public class UsageAccessSettings extends SettingsPreferenceFragment implements final PackageEntry newPackageEntry = newEntries.get(oldPackageEntry.packageName); if (newPackageEntry == null) { // This package has been removed. - getPreferenceScreen().removePreference(oldPackageEntry.preference); + mPreferenceScreen.removePreference(oldPackageEntry.preference); } else { // This package already exists in the preference hierarchy, so reuse that // Preference. @@ -203,7 +208,7 @@ public class UsageAccessSettings extends SettingsPreferenceFragment implements packageEntry.preference = new SwitchPreference(mContext); packageEntry.preference.setPersistent(false); packageEntry.preference.setOnPreferenceChangeListener(UsageAccessSettings.this); - getPreferenceScreen().addPreference(packageEntry.preference); + mPreferenceScreen.addPreference(packageEntry.preference); } updatePreference(packageEntry); } @@ -232,20 +237,22 @@ public class UsageAccessSettings extends SettingsPreferenceFragment implements } } - private static boolean shouldIgnorePackage(String packageName) { + static boolean shouldIgnorePackage(String packageName) { return packageName.equals("android") || packageName.equals("com.android.settings"); } - private ArrayMap<String, PackageEntry> mPackageEntryMap = new ArrayMap<>(); - private AppOpsManager mAppOpsManager; private AppsRequestingAccessFetcher mLastFetcherTask; + ArrayMap<String, PackageEntry> mPackageEntryMap = new ArrayMap<>(); + AppOpsManager mAppOpsManager; + PreferenceScreen mPreferenceScreen; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); addPreferencesFromResource(R.xml.usage_access_settings); - getPreferenceScreen().setOrderingAsAdded(false); + mPreferenceScreen = getPreferenceScreen(); + mPreferenceScreen.setOrderingAsAdded(false); mAppOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE); } @@ -302,13 +309,27 @@ public class UsageAccessSettings extends SettingsPreferenceFragment implements // Check if we need to do any work. if (pe.appOpMode != newMode) { - mAppOpsManager.setMode(AppOpsManager.OP_GET_USAGE_STATS, - pe.packageInfo.applicationInfo.uid, packageName, newMode); - pe.appOpMode = newMode; + if (newMode != AppOpsManager.MODE_ALLOWED) { + // Turning off the setting has no warning. + setNewMode(pe, newMode); + return true; + } + + // Turning on the setting has a Warning. + getFragmentManager().beginTransaction() + .add(new WarningDialog(pe), "warning") + .commit(); + return false; } return true; } + void setNewMode(PackageEntry pe, int newMode) { + mAppOpsManager.setMode(AppOpsManager.OP_GET_USAGE_STATS, + pe.packageInfo.applicationInfo.uid, pe.packageName, newMode); + pe.appOpMode = newMode; + } + private final PackageMonitor mPackageMonitor = new PackageMonitor() { @Override public void onPackageAdded(String packageName, int uid) { @@ -320,4 +341,34 @@ public class UsageAccessSettings extends SettingsPreferenceFragment implements updateInterestedApps(); } }; + + private class WarningDialog extends DialogFragment + implements DialogInterface.OnClickListener { + private final PackageEntry mEntry; + + public WarningDialog(PackageEntry pe) { + mEntry = pe; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + return new AlertDialog.Builder(getActivity()) + .setTitle(R.string.allow_usage_access_title) + .setMessage(R.string.allow_usage_access_message) + .setIconAttribute(android.R.attr.alertDialogIcon) + .setNegativeButton(R.string.cancel, this) + .setPositiveButton(android.R.string.ok, this) + .create(); + } + + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == DialogInterface.BUTTON_POSITIVE) { + setNewMode(mEntry, AppOpsManager.MODE_ALLOWED); + mEntry.preference.setChecked(true); + } else { + dialog.cancel(); + } + } + } } |