diff options
author | Jeff Sharkey <jsharkey@android.com> | 2012-05-15 11:39:17 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-05-15 11:39:17 -0700 |
commit | cda0663eb9c3a324c543c504647c7661f2ac7b35 (patch) | |
tree | b70b25f3804e6cba6c0a5d9a7e976fd9b91ecd36 /src | |
parent | 53fa78fcb237e52733d00a93a29485c4b3d7d290 (diff) | |
parent | caf15613c29870850da952e51aaebb8b84867c49 (diff) | |
download | packages_apps_settings-cda0663eb9c3a324c543c504647c7661f2ac7b35.zip packages_apps_settings-cda0663eb9c3a324c543c504647c7661f2ac7b35.tar.gz packages_apps_settings-cda0663eb9c3a324c543c504647c7661f2ac7b35.tar.bz2 |
Merge "Enforce READ_EXTERNAL in Developer Options." into jb-dev
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/settings/DevelopmentSettings.java | 80 | ||||
-rw-r--r-- | src/com/android/settings/deviceinfo/Memory.java | 29 |
2 files changed, 76 insertions, 33 deletions
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java index e5fea54..29c58ab 100644 --- a/src/com/android/settings/DevelopmentSettings.java +++ b/src/com/android/settings/DevelopmentSettings.java @@ -16,17 +16,20 @@ package com.android.settings; -import java.util.ArrayList; +import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import android.app.ActionBar; import android.app.Activity; import android.app.ActivityManagerNative; +import android.app.ActivityThread; import android.app.AlertDialog; import android.app.Dialog; +import android.app.DialogFragment; import android.app.backup.IBackupManager; import android.content.ContentResolver; import android.content.Context; import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; @@ -45,12 +48,11 @@ import android.preference.CheckBoxPreference; import android.preference.ListPreference; import android.preference.MultiCheckPreference; import android.preference.Preference; +import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; -import android.preference.Preference.OnPreferenceChangeListener; import android.provider.Settings; import android.text.TextUtils; -import android.util.Log; import android.view.Gravity; import android.view.HardwareRenderer; import android.view.IWindowManager; @@ -58,6 +60,8 @@ import android.view.View; import android.widget.CompoundButton; import android.widget.Switch; +import java.util.ArrayList; + /* * Displays preferences for application developers. */ @@ -70,6 +74,7 @@ public class DevelopmentSettings extends PreferenceFragment private static final String ALLOW_MOCK_LOCATION = "allow_mock_location"; private static final String HDCP_CHECKING_KEY = "hdcp_checking"; private static final String HDCP_CHECKING_PROPERTY = "persist.sys.hdcp_checking"; + private static final String ENFORCE_READ_EXTERNAL = "enforce_read_external"; private static final String LOCAL_BACKUP_PASSWORD = "local_backup_password"; private static final String HARDWARE_UI_PROPERTY = "persist.sys.ui.hw"; @@ -97,6 +102,8 @@ public class DevelopmentSettings extends PreferenceFragment private static final String SHOW_ALL_ANRS_KEY = "show_all_anrs"; + private static final String TAG_CONFIRM_ENFORCE = "confirm_enforce"; + private static final int RESULT_DEBUG_APP = 1000; private IWindowManager mWindowManager; @@ -109,6 +116,7 @@ public class DevelopmentSettings extends PreferenceFragment private CheckBoxPreference mEnableAdb; private CheckBoxPreference mKeepScreenOn; + private CheckBoxPreference mEnforceReadExternal; private CheckBoxPreference mAllowMockLocation; private PreferenceScreen mPassword; @@ -157,6 +165,7 @@ public class DevelopmentSettings extends PreferenceFragment mEnableAdb = findAndInitCheckboxPref(ENABLE_ADB); mKeepScreenOn = findAndInitCheckboxPref(KEEP_SCREEN_ON); + mEnforceReadExternal = findAndInitCheckboxPref(ENFORCE_READ_EXTERNAL); mAllowMockLocation = findAndInitCheckboxPref(ALLOW_MOCK_LOCATION); mPassword = (PreferenceScreen) findPreference(LOCAL_BACKUP_PASSWORD); mAllPrefs.add(mPassword); @@ -302,12 +311,14 @@ public class DevelopmentSettings extends PreferenceFragment } private void updateAllOptions() { - final ContentResolver cr = getActivity().getContentResolver(); + final Context context = getActivity(); + final ContentResolver cr = context.getContentResolver(); mHaveDebugSettings = false; updateCheckBox(mEnableAdb, Settings.Secure.getInt(cr, Settings.Secure.ADB_ENABLED, 0) != 0); updateCheckBox(mKeepScreenOn, Settings.System.getInt(cr, Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0) != 0); + updateCheckBox(mEnforceReadExternal, isPermissionEnforced(context, READ_EXTERNAL_STORAGE)); updateCheckBox(mAllowMockLocation, Settings.Secure.getInt(cr, Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0); updateHdcpValues(); @@ -786,6 +797,12 @@ public class DevelopmentSettings extends PreferenceFragment Settings.System.STAY_ON_WHILE_PLUGGED_IN, mKeepScreenOn.isChecked() ? (BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB) : 0); + } else if (preference == mEnforceReadExternal) { + if (mEnforceReadExternal.isChecked()) { + ConfirmEnforceFragment.show(this); + } else { + setPermissionEnforced(getActivity(), READ_EXTERNAL_STORAGE, false); + } } else if (preference == mAllowMockLocation) { Settings.Secure.putInt(getActivity().getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, @@ -934,4 +951,59 @@ public class DevelopmentSettings extends PreferenceFragment return null; } } + + /** + * Dialog to confirm enforcement of {@link #READ_EXTERNAL_STORAGE}. + */ + public static class ConfirmEnforceFragment extends DialogFragment { + public static void show(DevelopmentSettings parent) { + final ConfirmEnforceFragment dialog = new ConfirmEnforceFragment(); + dialog.setTargetFragment(parent, 0); + dialog.show(parent.getFragmentManager(), TAG_CONFIRM_ENFORCE); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Context context = getActivity(); + + final AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(R.string.enforce_read_external_confirm_title); + builder.setMessage(R.string.enforce_read_external_confirm_message); + + builder.setPositiveButton(android.R.string.ok, new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + setPermissionEnforced(context, READ_EXTERNAL_STORAGE, true); + ((DevelopmentSettings) getTargetFragment()).updateAllOptions(); + } + }); + builder.setNegativeButton(android.R.string.cancel, new OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + ((DevelopmentSettings) getTargetFragment()).updateAllOptions(); + } + }); + + return builder.create(); + } + } + + private static boolean isPermissionEnforced(Context context, String permission) { + try { + return ActivityThread.getPackageManager().isPermissionEnforced(READ_EXTERNAL_STORAGE); + } catch (RemoteException e) { + throw new RuntimeException("Problem talking with PackageManager", e); + } + } + + private static void setPermissionEnforced( + Context context, String permission, boolean enforced) { + try { + // TODO: offload to background thread + ActivityThread.getPackageManager() + .setPermissionEnforced(READ_EXTERNAL_STORAGE, enforced); + } catch (RemoteException e) { + throw new RuntimeException("Problem talking with PackageManager", e); + } + } } diff --git a/src/com/android/settings/deviceinfo/Memory.java b/src/com/android/settings/deviceinfo/Memory.java index b9ea432..cb344bf 100644 --- a/src/com/android/settings/deviceinfo/Memory.java +++ b/src/com/android/settings/deviceinfo/Memory.java @@ -16,9 +16,6 @@ package com.android.settings.deviceinfo; -import static android.Manifest.permission.READ_EXTERNAL_STORAGE; - -import android.app.ActivityThread; import android.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; @@ -26,7 +23,6 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; -import android.content.pm.IPackageManager; import android.content.res.Resources; import android.os.Bundle; import android.os.Environment; @@ -68,7 +64,6 @@ public class Memory extends SettingsPreferenceFragment { private IMountService mMountService = null; private StorageManager mStorageManager = null; - private IPackageManager mPackageService; private StorageVolumePreferenceCategory mInternalStorageVolumePreferenceCategory; private StorageVolumePreferenceCategory[] mStorageVolumePreferenceCategories; @@ -82,8 +77,6 @@ public class Memory extends SettingsPreferenceFragment { mStorageManager.registerListener(mStorageListener); } - mPackageService = ActivityThread.getPackageManager(); - addPreferencesFromResource(R.xml.device_info_memory); mResources = getResources(); @@ -178,16 +171,6 @@ public class Memory extends SettingsPreferenceFragment { public void onPrepareOptionsMenu(Menu menu) { final MenuItem usb = menu.findItem(R.id.storage_usb); usb.setVisible(!isMassStorageEnabled()); - - final boolean enforced; - try { - enforced = mPackageService.isPermissionEnforced(READ_EXTERNAL_STORAGE); - } catch (RemoteException e) { - throw new RuntimeException("Problem talking with PackageManager", e); - } - - final MenuItem enforceReadExternal = menu.findItem(R.id.storage_enforce_read_external); - enforceReadExternal.setChecked(enforced); } @Override @@ -204,18 +187,6 @@ public class Memory extends SettingsPreferenceFragment { startFragment(this, UsbSettings.class.getCanonicalName(), -1, null); } return true; - case R.id.storage_enforce_read_external: { - final boolean checked = !item.isChecked(); - item.setChecked(checked); - - try { - // TODO: offload to background thread - mPackageService.setPermissionEnforced(READ_EXTERNAL_STORAGE, checked); - } catch (RemoteException e) { - throw new RuntimeException("Problem talking with PackageManager", e); - } - return true; - } } return super.onOptionsItemSelected(item); } |