diff options
Diffstat (limited to 'src/com/android/settings/DevelopmentSettings.java')
-rw-r--r-- | src/com/android/settings/DevelopmentSettings.java | 280 |
1 files changed, 270 insertions, 10 deletions
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java index 2508454..2ca28e9 100644 --- a/src/com/android/settings/DevelopmentSettings.java +++ b/src/com/android/settings/DevelopmentSettings.java @@ -16,13 +16,20 @@ package com.android.settings; +import android.app.ActivityManagerNative; import android.app.AlertDialog; import android.app.Dialog; import android.content.ContentResolver; import android.content.DialogInterface; +import android.content.Intent; import android.os.BatteryManager; import android.os.Build; import android.os.Bundle; +import android.os.IBinder; +import android.os.Parcel; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.StrictMode; import android.os.SystemProperties; import android.preference.CheckBoxPreference; import android.preference.ListPreference; @@ -31,6 +38,8 @@ import android.preference.PreferenceFragment; import android.preference.PreferenceScreen; import android.preference.Preference.OnPreferenceChangeListener; import android.provider.Settings; +import android.text.TextUtils; +import android.view.IWindowManager; /* * Displays preferences for application developers. @@ -45,10 +54,37 @@ public class DevelopmentSettings extends PreferenceFragment private static final String HDCP_CHECKING_KEY = "hdcp_checking"; private static final String HDCP_CHECKING_PROPERTY = "persist.sys.hdcp_checking"; + private static final String STRICT_MODE_KEY = "strict_mode"; + private static final String POINTER_LOCATION_KEY = "pointer_location"; + private static final String SHOW_SCREEN_UPDATES_KEY = "show_screen_updates"; + private static final String SHOW_CPU_USAGE_KEY = "show_cpu_usage"; + private static final String WINDOW_ANIMATION_SCALE_KEY = "window_animation_scale"; + private static final String TRANSITION_ANIMATION_SCALE_KEY = "transition_animation_scale"; + + private static final String IMMEDIATELY_DESTROY_ACTIVITIES_KEY + = "immediately_destroy_activities"; + private static final String APP_PROCESS_LIMIT_KEY = "app_process_limit"; + + private static final String SHOW_ALL_ANRS_KEY = "show_all_anrs"; + + private IWindowManager mWindowManager; + private CheckBoxPreference mEnableAdb; private CheckBoxPreference mKeepScreenOn; private CheckBoxPreference mAllowMockLocation; + private CheckBoxPreference mStrictMode; + private CheckBoxPreference mPointerLocation; + private CheckBoxPreference mShowScreenUpdates; + private CheckBoxPreference mShowCpuUsage; + private ListPreference mWindowAnimationScale; + private ListPreference mTransitionAnimationScale; + + private CheckBoxPreference mImmediatelyDestroyActivities; + private ListPreference mAppProcessLimit; + + private CheckBoxPreference mShowAllANRs; + // To track whether Yes was clicked in the adb warning dialog private boolean mOkClicked; @@ -58,12 +94,31 @@ public class DevelopmentSettings extends PreferenceFragment public void onCreate(Bundle icicle) { super.onCreate(icicle); + mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); + addPreferencesFromResource(R.xml.development_prefs); mEnableAdb = (CheckBoxPreference) findPreference(ENABLE_ADB); mKeepScreenOn = (CheckBoxPreference) findPreference(KEEP_SCREEN_ON); mAllowMockLocation = (CheckBoxPreference) findPreference(ALLOW_MOCK_LOCATION); + mStrictMode = (CheckBoxPreference) findPreference(STRICT_MODE_KEY); + mPointerLocation = (CheckBoxPreference) findPreference(POINTER_LOCATION_KEY); + mShowScreenUpdates = (CheckBoxPreference) findPreference(SHOW_SCREEN_UPDATES_KEY); + mShowCpuUsage = (CheckBoxPreference) findPreference(SHOW_CPU_USAGE_KEY); + mWindowAnimationScale = (ListPreference) findPreference(WINDOW_ANIMATION_SCALE_KEY); + mWindowAnimationScale.setOnPreferenceChangeListener(this); + mTransitionAnimationScale = (ListPreference) findPreference(TRANSITION_ANIMATION_SCALE_KEY); + mTransitionAnimationScale.setOnPreferenceChangeListener(this); + + mImmediatelyDestroyActivities = (CheckBoxPreference) findPreference( + IMMEDIATELY_DESTROY_ACTIVITIES_KEY); + mAppProcessLimit = (ListPreference) findPreference(APP_PROCESS_LIMIT_KEY); + mAppProcessLimit.setOnPreferenceChangeListener(this); + + mShowAllANRs = (CheckBoxPreference) findPreference( + SHOW_ALL_ANRS_KEY); + removeHdcpOptionsForProduction(); } @@ -89,6 +144,14 @@ public class DevelopmentSettings extends PreferenceFragment mAllowMockLocation.setChecked(Settings.Secure.getInt(cr, Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0); updateHdcpValues(); + updateStrictModeVisualOptions(); + updatePointerLocationOptions(); + updateFlingerOptions(); + updateCpuUsageOptions(); + updateAnimationScaleOptions(); + updateImmediatelyDestroyActivitiesOptions(); + updateAppProcessLimitOptions(); + updateShowAllANRsOptions(); } private void updateHdcpValues() { @@ -110,6 +173,182 @@ public class DevelopmentSettings extends PreferenceFragment } } + // Returns the current state of the system property that controls + // strictmode flashes. One of: + // 0: not explicitly set one way or another + // 1: on + // 2: off + private int currentStrictModeActiveIndex() { + if (TextUtils.isEmpty(SystemProperties.get(StrictMode.VISUAL_PROPERTY))) { + return 0; + } + boolean enabled = SystemProperties.getBoolean(StrictMode.VISUAL_PROPERTY, false); + return enabled ? 1 : 2; + } + + private void writeStrictModeVisualOptions() { + try { + mWindowManager.setStrictModeVisualIndicatorPreference(mStrictMode.isChecked() + ? "1" : ""); + } catch (RemoteException e) { + } + } + + private void updateStrictModeVisualOptions() { + mStrictMode.setChecked(currentStrictModeActiveIndex() == 1); + } + + private void writePointerLocationOptions() { + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.POINTER_LOCATION, mPointerLocation.isChecked() ? 1 : 0); + } + + private void updatePointerLocationOptions() { + mPointerLocation.setChecked(Settings.System.getInt(getActivity().getContentResolver(), + Settings.System.POINTER_LOCATION, 0) != 0); + } + + private void updateFlingerOptions() { + // magic communication with surface flinger. + try { + IBinder flinger = ServiceManager.getService("SurfaceFlinger"); + if (flinger != null) { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken("android.ui.ISurfaceComposer"); + flinger.transact(1010, data, reply, 0); + @SuppressWarnings("unused") + int showCpu = reply.readInt(); + @SuppressWarnings("unused") + int enableGL = reply.readInt(); + int showUpdates = reply.readInt(); + mShowScreenUpdates.setChecked(showUpdates != 0); + @SuppressWarnings("unused") + int showBackground = reply.readInt(); + reply.recycle(); + data.recycle(); + } + } catch (RemoteException ex) { + } + } + + private void writeFlingerOptions() { + try { + IBinder flinger = ServiceManager.getService("SurfaceFlinger"); + if (flinger != null) { + Parcel data = Parcel.obtain(); + data.writeInterfaceToken("android.ui.ISurfaceComposer"); + data.writeInt(mShowScreenUpdates.isChecked() ? 1 : 0); + flinger.transact(1002, data, null, 0); + data.recycle(); + + updateFlingerOptions(); + } + } catch (RemoteException ex) { + } + } + + private void updateCpuUsageOptions() { + mShowCpuUsage.setChecked(Settings.System.getInt(getActivity().getContentResolver(), + Settings.System.SHOW_PROCESSES, 0) != 0); + } + + private void writeCpuUsageOptions() { + boolean value = mShowCpuUsage.isChecked(); + Settings.System.putInt(getActivity().getContentResolver(), + Settings.System.SHOW_PROCESSES, value ? 1 : 0); + Intent service = (new Intent()) + .setClassName("com.android.systemui", "com.android.systemui.LoadAverageService"); + if (value) { + getActivity().startService(service); + } else { + getActivity().stopService(service); + } + } + + private void writeImmediatelyDestroyActivitiesOptions() { + try { + ActivityManagerNative.getDefault().setAlwaysFinish( + mImmediatelyDestroyActivities.isChecked()); + } catch (RemoteException ex) { + } + } + + private void updateImmediatelyDestroyActivitiesOptions() { + mImmediatelyDestroyActivities.setChecked(Settings.System.getInt( + getActivity().getContentResolver(), Settings.System.ALWAYS_FINISH_ACTIVITIES, 0) != 0); + } + + private void updateAnimationScaleValue(int which, ListPreference pref) { + try { + float scale = mWindowManager.getAnimationScale(which); + CharSequence[] values = pref.getEntryValues(); + for (int i=0; i<values.length; i++) { + float val = Float.parseFloat(values[i].toString()); + if (scale <= val) { + pref.setValueIndex(i); + pref.setSummary(pref.getEntries()[i]); + return; + } + } + pref.setValueIndex(values.length-1); + pref.setSummary(pref.getEntries()[0]); + } catch (RemoteException e) { + } + } + + private void updateAnimationScaleOptions() { + updateAnimationScaleValue(0, mWindowAnimationScale); + updateAnimationScaleValue(1, mTransitionAnimationScale); + } + + private void writeAnimationScaleOption(int which, ListPreference pref, Object newValue) { + try { + float scale = Float.parseFloat(newValue.toString()); + mWindowManager.setAnimationScale(which, scale); + updateAnimationScaleValue(which, pref); + } catch (RemoteException e) { + } + } + + private void updateAppProcessLimitOptions() { + try { + int limit = ActivityManagerNative.getDefault().getProcessLimit(); + CharSequence[] values = mAppProcessLimit.getEntryValues(); + for (int i=0; i<values.length; i++) { + int val = Integer.parseInt(values[i].toString()); + if (val >= limit) { + mAppProcessLimit.setValueIndex(i); + mAppProcessLimit.setSummary(mAppProcessLimit.getEntries()[i]); + return; + } + } + mAppProcessLimit.setValueIndex(0); + mAppProcessLimit.setSummary(mAppProcessLimit.getEntries()[0]); + } catch (RemoteException e) { + } + } + + private void writeAppProcessLimitOptions(Object newValue) { + try { + int limit = Integer.parseInt(newValue.toString()); + ActivityManagerNative.getDefault().setProcessLimit(limit); + updateAppProcessLimitOptions(); + } catch (RemoteException e) { + } + } + + private void writeShowAllANRsOptions() { + Settings.Secure.putInt(getActivity().getContentResolver(), + Settings.Secure.ANR_SHOW_BACKGROUND, + mShowAllANRs.isChecked() ? 1 : 0); + } + + private void updateShowAllANRsOptions() { + mShowAllANRs.setChecked(Settings.Secure.getInt( + getActivity().getContentResolver(), Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0); + } + @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { @@ -142,11 +381,42 @@ public class DevelopmentSettings extends PreferenceFragment Settings.Secure.putInt(getActivity().getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION, mAllowMockLocation.isChecked() ? 1 : 0); + } else if (preference == mStrictMode) { + writeStrictModeVisualOptions(); + } else if (preference == mPointerLocation) { + writePointerLocationOptions(); + } else if (preference == mShowScreenUpdates) { + writeFlingerOptions(); + } else if (preference == mShowCpuUsage) { + writeCpuUsageOptions(); + } else if (preference == mImmediatelyDestroyActivities) { + writeImmediatelyDestroyActivitiesOptions(); + } else if (preference == mShowAllANRs) { + writeShowAllANRsOptions(); } return false; } + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + if (HDCP_CHECKING_KEY.equals(preference.getKey())) { + SystemProperties.set(HDCP_CHECKING_PROPERTY, newValue.toString()); + updateHdcpValues(); + return true; + } else if (preference == mWindowAnimationScale) { + writeAnimationScaleOption(0, mWindowAnimationScale, newValue); + return true; + } else if (preference == mTransitionAnimationScale) { + writeAnimationScaleOption(1, mTransitionAnimationScale, newValue); + return true; + } else if (preference == mAppProcessLimit) { + writeAppProcessLimitOptions(newValue); + return true; + } + return false; + } + private void dismissDialog() { if (mOkDialog == null) return; mOkDialog.dismiss(); @@ -176,14 +446,4 @@ public class DevelopmentSettings extends PreferenceFragment dismissDialog(); super.onDestroy(); } - - @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (HDCP_CHECKING_KEY.equals(preference.getKey())) { - SystemProperties.set(HDCP_CHECKING_PROPERTY, newValue.toString()); - updateHdcpValues(); - return true; - } - return false; - } } |