From eddc4fe89c020cbfedd5531cc2c13782034a8158 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Fri, 1 Jul 2011 18:56:09 -0700 Subject: [PATCH] Move the main interesting DevTools settings into the main settings app. These are in the "development" section of the settings app, expanding on ADB and other stuff that is already there. Change-Id: I61a4955df0c548dcf1f39be46d21e8b8d02e454a --- res/values/arrays.xml | 60 +++++ res/values/strings.xml | 42 ++++ res/xml/development_prefs.xml | 57 +++++ .../android/settings/DevelopmentSettings.java | 227 ++++++++++++++++++ 4 files changed, 386 insertions(+) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index c0578fa1fc0..8a7d9a3e8c0 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -613,6 +613,66 @@ Always use HDCP checking + + + Animation off + Animation scale .5x + Animation scale 1x + Animation scale 1.5x + Animation scale 2x + Animation scale 5x + Animation scale 10x + + + + + 0 + .5 + 1 + 1.5 + 2 + 5 + 10 + + + + + Animation off + Animation scale .5x + Animation scale 1x + Animation scale 1.5x + Animation scale 2x + Animation scale 5x + Animation scale 10x + + + + + 0 + .5 + 1 + 1.5 + 2 + 5 + 10 + + + + + No app process limit + Max 1 app process + Max 2 app processes + Max 3 app processes + + + + + 0 + 1 + 2 + 3 + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 93a7720d861..95b6f69fcc8 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3408,6 +3408,48 @@ found in the list of installed applications. Set HDCP checking behavior + + User interface + + + Strict mode enabled + + Flash screen when apps do long operations + on main thread + + + Pointer location + + Screen overlay showing current touch data + + + Show screen updates + + Flash areas of screen when they update + + + Show CPU usage + + Screen overlay showing current CPU usage + + + Window animation scale + + + Transition animation scale + + + Applications + + + Immediately destroy activities + + Destroy every activity as soon as + the user leaves it + + + Application process limit + Data usage diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml index 292206aa2b4..a73e7d1f4cb 100644 --- a/res/xml/development_prefs.xml +++ b/res/xml/development_prefs.xml @@ -38,4 +38,61 @@ android:dialogTitle="@string/hdcp_checking_dialog_title" android:entries="@array/hdcp_checking_titles" android:entryValues="@array/hdcp_checking_values" /> + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java index 250845464f0..9692dd5801e 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,33 @@ 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 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; + // To track whether Yes was clicked in the adb warning dialog private boolean mOkClicked; @@ -58,12 +90,25 @@ 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); + mTransitionAnimationScale = (ListPreference) findPreference(TRANSITION_ANIMATION_SCALE_KEY); + + mImmediatelyDestroyActivities = (CheckBoxPreference) findPreference( + IMMEDIATELY_DESTROY_ACTIVITIES_KEY); + mAppProcessLimit = (ListPreference) findPreference(APP_PROCESS_LIMIT_KEY); + removeHdcpOptionsForProduction(); } @@ -89,6 +134,13 @@ 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(); } private void updateHdcpValues() { @@ -110,6 +162,165 @@ 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("android", "com.android.server.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= limit) { + mAppProcessLimit.setValueIndex(i); + return; + } + } + mAppProcessLimit.setValueIndex(0); + } catch (RemoteException e) { + } + } + + private void writeAppProcessLimitOptions() { + try { + int limit = Integer.parseInt(mAppProcessLimit.getValue().toString()); + ActivityManagerNative.getDefault().setProcessLimit(limit); + } catch (RemoteException e) { + } + } + @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { @@ -142,6 +353,22 @@ 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 == mWindowAnimationScale) { + writeAnimationScaleOption(0, mWindowAnimationScale); + } else if (preference == mTransitionAnimationScale) { + writeAnimationScaleOption(1, mTransitionAnimationScale); + } else if (preference == mImmediatelyDestroyActivities) { + writeImmediatelyDestroyActivitiesOptions(); + } else if (preference == mAppProcessLimit) { + writeAppProcessLimitOptions(); } return false;