DevelopmentSettings.java revision c8272b075275f81ddfb9cef2f92514b7ce3365de
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * you may not use this file except in compliance with the License.
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * You may obtain a copy of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * See the License for the specific language governing permissions and
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * limitations under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
19caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkeyimport static android.Manifest.permission.READ_EXTERNAL_STORAGE;
2014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn
2114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackbornimport android.app.ActionBar;
2214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackbornimport android.app.Activity;
23eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackbornimport android.app.ActivityManagerNative;
24caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkeyimport android.app.ActivityThread;
25b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwoodimport android.app.AlertDialog;
2624bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasaniimport android.app.Dialog;
27caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkeyimport android.app.DialogFragment;
28f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackbornimport android.app.admin.DevicePolicyManager;
29fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tateimport android.app.backup.IBackupManager;
30ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.content.ContentResolver;
31fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tateimport android.content.Context;
32b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwoodimport android.content.DialogInterface;
33caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkeyimport android.content.DialogInterface.OnClickListener;
34eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackbornimport android.content.Intent;
359244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackbornimport android.content.pm.ApplicationInfo;
36498fbe470e8201ed6d4a1677025b274d9ca65e0bKenny Rootimport android.content.pm.PackageManager;
3787ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackbornimport android.os.AsyncTask;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.BatteryManager;
39f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasaniimport android.os.Build;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
41eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackbornimport android.os.IBinder;
42eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackbornimport android.os.Parcel;
43eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackbornimport android.os.RemoteException;
44eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackbornimport android.os.ServiceManager;
45eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackbornimport android.os.StrictMode;
46f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasaniimport android.os.SystemProperties;
4734481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackbornimport android.os.Trace;
48f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasaniimport android.preference.CheckBoxPreference;
49f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasaniimport android.preference.ListPreference;
5034481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackbornimport android.preference.MultiCheckPreference;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.Preference;
52caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkeyimport android.preference.Preference.OnPreferenceChangeListener;
53ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornimport android.preference.PreferenceFragment;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.preference.PreferenceScreen;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.provider.Settings;
56eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackbornimport android.text.TextUtils;
5714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackbornimport android.view.Gravity;
58c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guyimport android.view.HardwareRenderer;
59eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackbornimport android.view.IWindowManager;
60c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guyimport android.view.View;
6114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackbornimport android.widget.CompoundButton;
6214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackbornimport android.widget.Switch;
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
64caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkeyimport java.util.ArrayList;
65f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackbornimport java.util.HashSet;
66caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/*
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Displays preferences for application developers.
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
70ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackbornpublic class DevelopmentSettings extends PreferenceFragment
71f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener,
7214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                OnPreferenceChangeListener, CompoundButton.OnCheckedChangeListener {
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String ENABLE_ADB = "enable_adb";
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String KEEP_SCREEN_ON = "keep_screen_on";
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String ALLOW_MOCK_LOCATION = "allow_mock_location";
77f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    private static final String HDCP_CHECKING_KEY = "hdcp_checking";
78f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    private static final String HDCP_CHECKING_PROPERTY = "persist.sys.hdcp_checking";
79caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey    private static final String ENFORCE_READ_EXTERNAL = "enforce_read_external";
80fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate    private static final String LOCAL_BACKUP_PASSWORD = "local_backup_password";
810c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy    private static final String HARDWARE_UI_PROPERTY = "persist.sys.ui.hw";
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
839244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    private static final String DEBUG_APP_KEY = "debug_app";
849244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    private static final String WAIT_FOR_DEBUGGER_KEY = "wait_for_debugger";
85eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private static final String STRICT_MODE_KEY = "strict_mode";
86eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private static final String POINTER_LOCATION_KEY = "pointer_location";
87f40770096fe75180fba679ed349a63d195729c0cJeff Brown    private static final String SHOW_TOUCHES_KEY = "show_touches";
88eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private static final String SHOW_SCREEN_UPDATES_KEY = "show_screen_updates";
89e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn    private static final String DISABLE_OVERLAYS_KEY = "disable_overlays";
90eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private static final String SHOW_CPU_USAGE_KEY = "show_cpu_usage";
910c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy    private static final String FORCE_HARDWARE_UI_KEY = "force_hw_ui";
92c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private static final String TRACK_FRAME_TIME_KEY = "track_frame_time";
93c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private static final String SHOW_HW_SCREEN_UPDATES_KEY = "show_hw_screen_udpates";
94c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private static final String DEBUG_LAYOUT_KEY = "debug_layout";
95eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private static final String WINDOW_ANIMATION_SCALE_KEY = "window_animation_scale";
96eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private static final String TRANSITION_ANIMATION_SCALE_KEY = "transition_animation_scale";
97b29e7870de4238cbfa8eb7f3709bed7b49eeacdbChet Haase    private static final String ANIMATOR_DURATION_SCALE_KEY = "animator_duration_scale";
98eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
9934481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn    private static final String ENABLE_TRACES_KEY = "enable_traces";
10034481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn
101eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private static final String IMMEDIATELY_DESTROY_ACTIVITIES_KEY
102eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            = "immediately_destroy_activities";
103eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private static final String APP_PROCESS_LIMIT_KEY = "app_process_limit";
104eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
105d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn    private static final String SHOW_ALL_ANRS_KEY = "show_all_anrs";
106d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn
107caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey    private static final String TAG_CONFIRM_ENFORCE = "confirm_enforce";
108caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey
1099244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    private static final int RESULT_DEBUG_APP = 1000;
1109244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn
111eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private IWindowManager mWindowManager;
112fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate    private IBackupManager mBackupManager;
113f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn    private DevicePolicyManager mDpm;
114eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
11514dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    private Switch mEnabledSwitch;
11614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    private boolean mLastEnabledState;
11734481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn    private boolean mHaveDebugSettings;
11887ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn    private boolean mDontPokeProperties;
11914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mEnableAdb;
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mKeepScreenOn;
122caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey    private CheckBoxPreference mEnforceReadExternal;
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CheckBoxPreference mAllowMockLocation;
124fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate    private PreferenceScreen mPassword;
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1269244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    private String mDebugApp;
1279244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    private Preference mDebugAppPref;
1289244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    private CheckBoxPreference mWaitForDebugger;
1299244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn
130eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private CheckBoxPreference mStrictMode;
131eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private CheckBoxPreference mPointerLocation;
132f40770096fe75180fba679ed349a63d195729c0cJeff Brown    private CheckBoxPreference mShowTouches;
133eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private CheckBoxPreference mShowScreenUpdates;
134e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn    private CheckBoxPreference mDisableOverlays;
135eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private CheckBoxPreference mShowCpuUsage;
1360c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy    private CheckBoxPreference mForceHardwareUi;
137c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private CheckBoxPreference mTrackFrameTime;
138c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private CheckBoxPreference mShowHwScreenUpdates;
139c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private CheckBoxPreference mDebugLayout;
140eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private ListPreference mWindowAnimationScale;
141eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private ListPreference mTransitionAnimationScale;
142b29e7870de4238cbfa8eb7f3709bed7b49eeacdbChet Haase    private ListPreference mAnimatorDurationScale;
14334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn    private MultiCheckPreference mEnableTracesPref;
144eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
145eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private CheckBoxPreference mImmediatelyDestroyActivities;
146eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private ListPreference mAppProcessLimit;
147eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
148d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn    private CheckBoxPreference mShowAllANRs;
149d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn
15014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    private final ArrayList<Preference> mAllPrefs = new ArrayList<Preference>();
15114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    private final ArrayList<CheckBoxPreference> mResetCbPrefs
15214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            = new ArrayList<CheckBoxPreference>();
153b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood
154f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn    private final HashSet<Preference> mDisabledPrefs = new HashSet<Preference>();
155f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn
15614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    // To track whether a confirmation dialog was clicked.
15714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    private boolean mDialogClicked;
15814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    private Dialog mEnableDialog;
15914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    private Dialog mAdbDialog;
16024bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
162ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onCreate(Bundle icicle) {
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
165eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
166fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate        mBackupManager = IBackupManager.Stub.asInterface(
167fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate                ServiceManager.getService(Context.BACKUP_SERVICE));
168f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn        mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
169eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        addPreferencesFromResource(R.xml.development_prefs);
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
172c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mEnableAdb = findAndInitCheckboxPref(ENABLE_ADB);
173c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mKeepScreenOn = findAndInitCheckboxPref(KEEP_SCREEN_ON);
174caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        mEnforceReadExternal = findAndInitCheckboxPref(ENFORCE_READ_EXTERNAL);
175c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mAllowMockLocation = findAndInitCheckboxPref(ALLOW_MOCK_LOCATION);
176fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate        mPassword = (PreferenceScreen) findPreference(LOCAL_BACKUP_PASSWORD);
17714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mAllPrefs.add(mPassword);
178f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani
1799244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        mDebugAppPref = findPreference(DEBUG_APP_KEY);
1809244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        mAllPrefs.add(mDebugAppPref);
181c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mWaitForDebugger = findAndInitCheckboxPref(WAIT_FOR_DEBUGGER_KEY);
182c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mStrictMode = findAndInitCheckboxPref(STRICT_MODE_KEY);
183c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mPointerLocation = findAndInitCheckboxPref(POINTER_LOCATION_KEY);
184c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mShowTouches = findAndInitCheckboxPref(SHOW_TOUCHES_KEY);
185c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mShowScreenUpdates = findAndInitCheckboxPref(SHOW_SCREEN_UPDATES_KEY);
186c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mDisableOverlays = findAndInitCheckboxPref(DISABLE_OVERLAYS_KEY);
187c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mShowCpuUsage = findAndInitCheckboxPref(SHOW_CPU_USAGE_KEY);
188c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mForceHardwareUi = findAndInitCheckboxPref(FORCE_HARDWARE_UI_KEY);
189c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mTrackFrameTime = findAndInitCheckboxPref(TRACK_FRAME_TIME_KEY);
190c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mShowHwScreenUpdates = findAndInitCheckboxPref(SHOW_HW_SCREEN_UPDATES_KEY);
191c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mDebugLayout = findAndInitCheckboxPref(DEBUG_LAYOUT_KEY);
192eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        mWindowAnimationScale = (ListPreference) findPreference(WINDOW_ANIMATION_SCALE_KEY);
19314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mAllPrefs.add(mWindowAnimationScale);
19483b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn        mWindowAnimationScale.setOnPreferenceChangeListener(this);
195eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        mTransitionAnimationScale = (ListPreference) findPreference(TRANSITION_ANIMATION_SCALE_KEY);
19614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mAllPrefs.add(mTransitionAnimationScale);
19783b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn        mTransitionAnimationScale.setOnPreferenceChangeListener(this);
198b29e7870de4238cbfa8eb7f3709bed7b49eeacdbChet Haase        mAnimatorDurationScale = (ListPreference) findPreference(ANIMATOR_DURATION_SCALE_KEY);
19914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mAllPrefs.add(mAnimatorDurationScale);
200b29e7870de4238cbfa8eb7f3709bed7b49eeacdbChet Haase        mAnimatorDurationScale.setOnPreferenceChangeListener(this);
20134481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        mEnableTracesPref = (MultiCheckPreference)findPreference(ENABLE_TRACES_KEY);
20234481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        String[] traceValues = new String[Trace.TRACE_TAGS.length];
20334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        for (int i=Trace.TRACE_FLAGS_START_BIT; i<traceValues.length; i++) {
20434481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            traceValues[i] = Integer.toString(1<<i);
20534481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        }
20634481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        mEnableTracesPref.setEntries(Trace.TRACE_TAGS);
20734481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        mEnableTracesPref.setEntryValues(traceValues);
20834481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        mAllPrefs.add(mEnableTracesPref);
20934481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        mEnableTracesPref.setOnPreferenceChangeListener(this);
210eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
211eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        mImmediatelyDestroyActivities = (CheckBoxPreference) findPreference(
212eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                IMMEDIATELY_DESTROY_ACTIVITIES_KEY);
21314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mAllPrefs.add(mImmediatelyDestroyActivities);
21414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mResetCbPrefs.add(mImmediatelyDestroyActivities);
215eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        mAppProcessLimit = (ListPreference) findPreference(APP_PROCESS_LIMIT_KEY);
21614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mAllPrefs.add(mAppProcessLimit);
21783b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn        mAppProcessLimit.setOnPreferenceChangeListener(this);
218eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
219d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn        mShowAllANRs = (CheckBoxPreference) findPreference(
220d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn                SHOW_ALL_ANRS_KEY);
22114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mAllPrefs.add(mShowAllANRs);
22214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mResetCbPrefs.add(mShowAllANRs);
223d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn
22414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        Preference hdcpChecking = findPreference(HDCP_CHECKING_KEY);
22514dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        if (hdcpChecking != null) {
22614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            mAllPrefs.add(hdcpChecking);
22714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        }
2284f4ddaa823bfa7bd2fdff97338ff1839739925ddGlenn Kasten        removeHdcpOptionsForProduction();
229f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    }
230f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani
231c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private CheckBoxPreference findAndInitCheckboxPref(String key) {
232c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        CheckBoxPreference pref = (CheckBoxPreference) findPreference(key);
233c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        if (pref == null) {
234c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy            throw new IllegalArgumentException("Cannot find preference with key = " + key);
235c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        }
236c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mAllPrefs.add(pref);
237c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        mResetCbPrefs.add(pref);
238c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        return pref;
239c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    }
240c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy
24114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    @Override
24214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    public void onActivityCreated(Bundle savedInstanceState) {
24314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        super.onActivityCreated(savedInstanceState);
24414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn
24514dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        final Activity activity = getActivity();
24614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mEnabledSwitch = new Switch(activity);
24714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn
24814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        final int padding = activity.getResources().getDimensionPixelSize(
24914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                R.dimen.action_bar_switch_padding);
25014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mEnabledSwitch.setPadding(0, 0, padding, 0);
25114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mEnabledSwitch.setOnCheckedChangeListener(this);
25214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    }
25314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn
25414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    @Override
25514dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    public void onStart() {
25614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        super.onStart();
25714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        final Activity activity = getActivity();
25814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
25914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                ActionBar.DISPLAY_SHOW_CUSTOM);
26014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        activity.getActionBar().setCustomView(mEnabledSwitch, new ActionBar.LayoutParams(
26114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                ActionBar.LayoutParams.WRAP_CONTENT,
26214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                ActionBar.LayoutParams.WRAP_CONTENT,
26314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                Gravity.CENTER_VERTICAL | Gravity.RIGHT));
26414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    }
26514dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn
26614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    @Override
26714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    public void onStop() {
26814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        super.onStop();
26914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        final Activity activity = getActivity();
27014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        activity.getActionBar().setDisplayOptions(0, ActionBar.DISPLAY_SHOW_CUSTOM);
27114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        activity.getActionBar().setCustomView(null);
27214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    }
27314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn
274f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    private void removeHdcpOptionsForProduction() {
275f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        if ("user".equals(Build.TYPE)) {
276f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            Preference hdcpChecking = findPreference(HDCP_CHECKING_KEY);
277f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            if (hdcpChecking != null) {
278f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani                // Remove the preference
279f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani                getPreferenceScreen().removePreference(hdcpChecking);
28014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                mAllPrefs.remove(hdcpChecking);
281f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            }
282f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        }
283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
28514dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    private void setPrefsEnabledState(boolean enabled) {
286c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        for (int i = 0; i < mAllPrefs.size(); i++) {
287f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn            Preference pref = mAllPrefs.get(i);
288f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn            pref.setEnabled(enabled && !mDisabledPrefs.contains(pref));
28914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        }
2909244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        updateAllOptions();
29114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    }
29214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn
293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
294ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn    public void onResume() {
295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onResume();
29650cb76f58554dbccc51a754a73abef2debd8b721Ying Wang
297f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn        if (mDpm.getMaximumTimeToLock(null) > 0) {
298f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn            // A DeviceAdmin has specified a maximum time until the device
299f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn            // will lock...  in this case we can't allow the user to turn
300f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn            // on "stay awake when plugged in" because that would defeat the
301f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn            // restriction.
302f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn            mDisabledPrefs.add(mKeepScreenOn);
303f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn        } else {
304f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn            mDisabledPrefs.remove(mKeepScreenOn);
305f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn        }
306f34a8d75177f52bffeceaf308b65860015b45d5eDianne Hackborn
307ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn        final ContentResolver cr = getActivity().getContentResolver();
30814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mLastEnabledState = Settings.Secure.getInt(cr,
30914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                Settings.Secure.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
31014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        mEnabledSwitch.setChecked(mLastEnabledState);
31114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        setPrefsEnabledState(mLastEnabledState);
31234481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn
31334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        if (mHaveDebugSettings && !mLastEnabledState) {
31434481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            // Overall debugging is disabled, but there are some debug
31534481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            // settings that are enabled.  This is an invalid state.  Switch
31634481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            // to debug settings being enabled, so the user knows there is
31734481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            // stuff enabled and can turn it all off if they want.
31834481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            Settings.Secure.putInt(getActivity().getContentResolver(),
31934481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn                    Settings.Secure.DEVELOPMENT_SETTINGS_ENABLED, 1);
32034481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            mLastEnabledState = true;
32134481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            setPrefsEnabledState(mLastEnabledState);
32234481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        }
32334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn    }
32434481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn
32534481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn    void updateCheckBox(CheckBoxPreference checkBox, boolean value) {
32634481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        checkBox.setChecked(value);
32734481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        mHaveDebugSettings |= value;
32814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    }
32914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn
33014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    private void updateAllOptions() {
331caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        final Context context = getActivity();
332caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        final ContentResolver cr = context.getContentResolver();
33334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        mHaveDebugSettings = false;
33434481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mEnableAdb, Settings.Secure.getInt(cr,
335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.Secure.ADB_ENABLED, 0) != 0);
33634481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mKeepScreenOn, Settings.System.getInt(cr,
337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0) != 0);
338caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        updateCheckBox(mEnforceReadExternal, isPermissionEnforced(context, READ_EXTERNAL_STORAGE));
33934481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mAllowMockLocation, Settings.Secure.getInt(cr,
340afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0);
341f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        updateHdcpValues();
342fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate        updatePasswordSummary();
3439244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        updateDebuggerOptions();
344eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        updateStrictModeVisualOptions();
345eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        updatePointerLocationOptions();
346f40770096fe75180fba679ed349a63d195729c0cJeff Brown        updateShowTouchesOptions();
347eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        updateFlingerOptions();
348eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        updateCpuUsageOptions();
3490c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy        updateHardwareUiOptions();
350c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        updateTrackFrameTimeOptions();
351c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        updateShowHwScreenUpdatesOptions();
352c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        updateDebugLayoutOptions();
353eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        updateAnimationScaleOptions();
35434481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateEnableTracesOptions();
355eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        updateImmediatelyDestroyActivitiesOptions();
356eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        updateAppProcessLimitOptions();
357d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn        updateShowAllANRsOptions();
358f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    }
359f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani
36014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    private void resetDangerousOptions() {
36187ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn        mDontPokeProperties = true;
36214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        for (int i=0; i<mResetCbPrefs.size(); i++) {
36314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            CheckBoxPreference cb = mResetCbPrefs.get(i);
36414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            if (cb.isChecked()) {
36514dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                cb.setChecked(false);
36614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                onPreferenceTreeClick(null, cb);
36714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            }
36814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        }
3699244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        resetDebuggerOptions();
37014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        writeAnimationScaleOption(0, mWindowAnimationScale, null);
37114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        writeAnimationScaleOption(1, mTransitionAnimationScale, null);
37214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        writeAnimationScaleOption(2, mAnimatorDurationScale, null);
37334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        writeEnableTracesOptions(0);
37414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        writeAppProcessLimitOptions(null);
37534481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        mHaveDebugSettings = false;
37614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        updateAllOptions();
37787ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn        mDontPokeProperties = false;
37887ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn        pokeSystemProperties();
37914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    }
38014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn
381f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani    private void updateHdcpValues() {
382f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        int index = 1; // Defaults to drm-only. Needs to match with R.array.hdcp_checking_values
383f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        ListPreference hdcpChecking = (ListPreference) findPreference(HDCP_CHECKING_KEY);
384f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        if (hdcpChecking != null) {
385f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            String currentValue = SystemProperties.get(HDCP_CHECKING_PROPERTY);
386f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            String[] values = getResources().getStringArray(R.array.hdcp_checking_values);
387f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            String[] summaries = getResources().getStringArray(R.array.hdcp_checking_summaries);
388f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            for (int i = 0; i < values.length; i++) {
389f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani                if (currentValue.equals(values[i])) {
390f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani                    index = i;
391f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani                    break;
392f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani                }
393f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            }
394f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            hdcpChecking.setValue(values[index]);
395f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            hdcpChecking.setSummary(summaries[index]);
396f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani            hdcpChecking.setOnPreferenceChangeListener(this);
397f3b325f54dadb482d73111ab17cf6a51784de11aAmith Yamasani        }
398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
400fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate    private void updatePasswordSummary() {
401fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate        try {
402fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate            if (mBackupManager.hasBackupPassword()) {
403fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate                mPassword.setSummary(R.string.local_backup_password_summary_change);
404fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate            } else {
405fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate                mPassword.setSummary(R.string.local_backup_password_summary_none);
406fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate            }
407fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate        } catch (RemoteException e) {
408fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate            // Not much we can do here
409fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate        }
410fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate    }
411fac0ea781f0c99a446ab6588006b2ac0330cb774Christopher Tate
4129244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    private void writeDebuggerOptions() {
4139244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        try {
4149244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            ActivityManagerNative.getDefault().setDebugApp(
4159244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn                mDebugApp, mWaitForDebugger.isChecked(), true);
4169244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        } catch (RemoteException ex) {
4179244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        }
4189244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    }
4199244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn
420c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private static void resetDebuggerOptions() {
4219244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        try {
4229244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            ActivityManagerNative.getDefault().setDebugApp(
4239244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn                    null, false, true);
4249244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        } catch (RemoteException ex) {
4259244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        }
4269244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    }
4279244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn
4289244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    private void updateDebuggerOptions() {
4299244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        mDebugApp = Settings.System.getString(
4309244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn                getActivity().getContentResolver(), Settings.System.DEBUG_APP);
43134481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mWaitForDebugger, Settings.System.getInt(
4329244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn                getActivity().getContentResolver(), Settings.System.WAIT_FOR_DEBUGGER, 0) != 0);
4339244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        if (mDebugApp != null && mDebugApp.length() > 0) {
4349244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            String label;
4359244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            try {
4369244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn                ApplicationInfo ai = getActivity().getPackageManager().getApplicationInfo(mDebugApp,
4379244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn                        PackageManager.GET_DISABLED_COMPONENTS);
4389244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn                CharSequence lab = getActivity().getPackageManager().getApplicationLabel(ai);
4399244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn                label = lab != null ? lab.toString() : mDebugApp;
4409244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            } catch (PackageManager.NameNotFoundException e) {
4419244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn                label = mDebugApp;
4429244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            }
4439244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            mDebugAppPref.setSummary(getResources().getString(R.string.debug_app_set, label));
4449244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            mWaitForDebugger.setEnabled(true);
44534481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            mHaveDebugSettings = true;
4469244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        } else {
4479244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            mDebugAppPref.setSummary(getResources().getString(R.string.debug_app_not_set));
4489244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            mWaitForDebugger.setEnabled(false);
4499244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        }
4509244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    }
4519244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn
452eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    // Returns the current state of the system property that controls
453eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    // strictmode flashes.  One of:
454eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    //    0: not explicitly set one way or another
455eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    //    1: on
456eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    //    2: off
457c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private static int currentStrictModeActiveIndex() {
458eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        if (TextUtils.isEmpty(SystemProperties.get(StrictMode.VISUAL_PROPERTY))) {
459eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            return 0;
460eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        }
461eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        boolean enabled = SystemProperties.getBoolean(StrictMode.VISUAL_PROPERTY, false);
462eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        return enabled ? 1 : 2;
463eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
464eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
465eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private void writeStrictModeVisualOptions() {
466eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        try {
467eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            mWindowManager.setStrictModeVisualIndicatorPreference(mStrictMode.isChecked()
468eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                    ? "1" : "");
469eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } catch (RemoteException e) {
470eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        }
471eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
472eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
473eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private void updateStrictModeVisualOptions() {
47434481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mStrictMode, currentStrictModeActiveIndex() == 1);
475eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
476eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
477eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private void writePointerLocationOptions() {
478eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        Settings.System.putInt(getActivity().getContentResolver(),
479eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                Settings.System.POINTER_LOCATION, mPointerLocation.isChecked() ? 1 : 0);
480eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
481eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
482eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private void updatePointerLocationOptions() {
48334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mPointerLocation, Settings.System.getInt(getActivity().getContentResolver(),
484eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                Settings.System.POINTER_LOCATION, 0) != 0);
485eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
486eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
487f40770096fe75180fba679ed349a63d195729c0cJeff Brown    private void writeShowTouchesOptions() {
488f40770096fe75180fba679ed349a63d195729c0cJeff Brown        Settings.System.putInt(getActivity().getContentResolver(),
489f40770096fe75180fba679ed349a63d195729c0cJeff Brown                Settings.System.SHOW_TOUCHES, mShowTouches.isChecked() ? 1 : 0);
490f40770096fe75180fba679ed349a63d195729c0cJeff Brown    }
491f40770096fe75180fba679ed349a63d195729c0cJeff Brown
492f40770096fe75180fba679ed349a63d195729c0cJeff Brown    private void updateShowTouchesOptions() {
49334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mShowTouches, Settings.System.getInt(getActivity().getContentResolver(),
494f40770096fe75180fba679ed349a63d195729c0cJeff Brown                Settings.System.SHOW_TOUCHES, 0) != 0);
495f40770096fe75180fba679ed349a63d195729c0cJeff Brown    }
496f40770096fe75180fba679ed349a63d195729c0cJeff Brown
497eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private void updateFlingerOptions() {
498eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        // magic communication with surface flinger.
499eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        try {
500eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            IBinder flinger = ServiceManager.getService("SurfaceFlinger");
501eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            if (flinger != null) {
502eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                Parcel data = Parcel.obtain();
503eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                Parcel reply = Parcel.obtain();
504eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                data.writeInterfaceToken("android.ui.ISurfaceComposer");
505eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                flinger.transact(1010, data, reply, 0);
506eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                @SuppressWarnings("unused")
507eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                int showCpu = reply.readInt();
508eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                @SuppressWarnings("unused")
509eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                int enableGL = reply.readInt();
510eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                int showUpdates = reply.readInt();
51134481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn                updateCheckBox(mShowScreenUpdates, showUpdates != 0);
512eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                @SuppressWarnings("unused")
513eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                int showBackground = reply.readInt();
514e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn                int disableOverlays = reply.readInt();
51534481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn                updateCheckBox(mDisableOverlays, disableOverlays != 0);
516eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                reply.recycle();
517eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                data.recycle();
518eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            }
519eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } catch (RemoteException ex) {
520eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        }
521eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
522eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
523e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn    private void writeShowUpdatesOption() {
524eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        try {
525eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            IBinder flinger = ServiceManager.getService("SurfaceFlinger");
526eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            if (flinger != null) {
527eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                Parcel data = Parcel.obtain();
528eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                data.writeInterfaceToken("android.ui.ISurfaceComposer");
529e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn                final int showUpdates = mShowScreenUpdates.isChecked() ? 1 : 0;
530e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn                data.writeInt(showUpdates);
531eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                flinger.transact(1002, data, null, 0);
532eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                data.recycle();
533eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
534eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                updateFlingerOptions();
535eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            }
536eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } catch (RemoteException ex) {
537eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        }
538eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
539eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
540e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn    private void writeDisableOverlaysOption() {
541e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn        try {
542e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn            IBinder flinger = ServiceManager.getService("SurfaceFlinger");
543e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn            if (flinger != null) {
544e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn                Parcel data = Parcel.obtain();
545e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn                data.writeInterfaceToken("android.ui.ISurfaceComposer");
546e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn                final int disableOverlays = mDisableOverlays.isChecked() ? 1 : 0;
547e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn                data.writeInt(disableOverlays);
548e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn                flinger.transact(1008, data, null, 0);
549e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn                data.recycle();
550e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn
551e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn                updateFlingerOptions();
552e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn            }
553e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn        } catch (RemoteException ex) {
554e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn        }
555e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn    }
556e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn
5570c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy    private void updateHardwareUiOptions() {
55834481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mForceHardwareUi, SystemProperties.getBoolean(HARDWARE_UI_PROPERTY, false));
5590c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy    }
5600c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy
5610c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy    private void writeHardwareUiOptions() {
5620c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy        SystemProperties.set(HARDWARE_UI_PROPERTY, mForceHardwareUi.isChecked() ? "true" : "false");
56387ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn        pokeSystemProperties();
5640c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy    }
5650c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy
566c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private void updateTrackFrameTimeOptions() {
56734481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mTrackFrameTime,
568c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy                SystemProperties.getBoolean(HardwareRenderer.PROFILE_PROPERTY, false));
569c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    }
570c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy
571c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private void writeTrackFrameTimeOptions() {
572c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        SystemProperties.set(HardwareRenderer.PROFILE_PROPERTY,
573c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy                mTrackFrameTime.isChecked() ? "true" : "false");
57487ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn        pokeSystemProperties();
575c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    }
576c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy
577c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private void updateShowHwScreenUpdatesOptions() {
57834481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mShowHwScreenUpdates,
579c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy                SystemProperties.getBoolean(HardwareRenderer.DEBUG_DIRTY_REGIONS_PROPERTY, false));
580c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    }
581c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy
582c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private void writeShowHwScreenUpdatesOptions() {
583c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        SystemProperties.set(HardwareRenderer.DEBUG_DIRTY_REGIONS_PROPERTY,
584c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy                mShowHwScreenUpdates.isChecked() ? "true" : "false");
58587ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn        pokeSystemProperties();
586c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    }
587c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy
588c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private void updateDebugLayoutOptions() {
58934481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mDebugLayout,
590c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy                SystemProperties.getBoolean(View.DEBUG_LAYOUT_PROPERTY, false));
591c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    }
592c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy
593c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    private void writeDebugLayoutOptions() {
594c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        SystemProperties.set(View.DEBUG_LAYOUT_PROPERTY,
595c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy                mDebugLayout.isChecked() ? "true" : "false");
59687ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn        pokeSystemProperties();
597c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy    }
598c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy
599eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private void updateCpuUsageOptions() {
60034481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mShowCpuUsage, Settings.System.getInt(getActivity().getContentResolver(),
601eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                Settings.System.SHOW_PROCESSES, 0) != 0);
602eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
6030c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy
604eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private void writeCpuUsageOptions() {
605eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        boolean value = mShowCpuUsage.isChecked();
606eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        Settings.System.putInt(getActivity().getContentResolver(),
607eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                Settings.System.SHOW_PROCESSES, value ? 1 : 0);
608eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        Intent service = (new Intent())
609c5ec5be6e4e796bd44475c63d43d8806e522aaf1Dianne Hackborn                .setClassName("com.android.systemui", "com.android.systemui.LoadAverageService");
610eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        if (value) {
611eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            getActivity().startService(service);
612eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } else {
613eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            getActivity().stopService(service);
614eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        }
615eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
616eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
617eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private void writeImmediatelyDestroyActivitiesOptions() {
618eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        try {
619eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            ActivityManagerNative.getDefault().setAlwaysFinish(
620eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                    mImmediatelyDestroyActivities.isChecked());
621eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } catch (RemoteException ex) {
622eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        }
623eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
624eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
625eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private void updateImmediatelyDestroyActivitiesOptions() {
62634481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mImmediatelyDestroyActivities, Settings.System.getInt(
627eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            getActivity().getContentResolver(), Settings.System.ALWAYS_FINISH_ACTIVITIES, 0) != 0);
628eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
629eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
630eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private void updateAnimationScaleValue(int which, ListPreference pref) {
631eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        try {
632eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            float scale = mWindowManager.getAnimationScale(which);
63334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            if (scale != 1) {
63434481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn                mHaveDebugSettings = true;
63534481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            }
636eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            CharSequence[] values = pref.getEntryValues();
637eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            for (int i=0; i<values.length; i++) {
638eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                float val = Float.parseFloat(values[i].toString());
639eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                if (scale <= val) {
640eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                    pref.setValueIndex(i);
64183b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn                    pref.setSummary(pref.getEntries()[i]);
642eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                    return;
643eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                }
644eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            }
645eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            pref.setValueIndex(values.length-1);
64683b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn            pref.setSummary(pref.getEntries()[0]);
647eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } catch (RemoteException e) {
648eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        }
649eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
650eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
651eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private void updateAnimationScaleOptions() {
652eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        updateAnimationScaleValue(0, mWindowAnimationScale);
653eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        updateAnimationScaleValue(1, mTransitionAnimationScale);
654b29e7870de4238cbfa8eb7f3709bed7b49eeacdbChet Haase        updateAnimationScaleValue(2, mAnimatorDurationScale);
655eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
656eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
65783b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn    private void writeAnimationScaleOption(int which, ListPreference pref, Object newValue) {
658eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        try {
65914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            float scale = newValue != null ? Float.parseFloat(newValue.toString()) : 1;
660eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            mWindowManager.setAnimationScale(which, scale);
661c5ec5be6e4e796bd44475c63d43d8806e522aaf1Dianne Hackborn            updateAnimationScaleValue(which, pref);
662eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } catch (RemoteException e) {
663eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        }
664eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
665eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
666eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    private void updateAppProcessLimitOptions() {
667eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        try {
668eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            int limit = ActivityManagerNative.getDefault().getProcessLimit();
669eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            CharSequence[] values = mAppProcessLimit.getEntryValues();
670eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            for (int i=0; i<values.length; i++) {
671eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                int val = Integer.parseInt(values[i].toString());
672eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                if (val >= limit) {
67334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn                    if (i != 0) {
67434481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn                        mHaveDebugSettings = true;
67534481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn                    }
676eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                    mAppProcessLimit.setValueIndex(i);
67783b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn                    mAppProcessLimit.setSummary(mAppProcessLimit.getEntries()[i]);
678eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                    return;
679eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn                }
680eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            }
681eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            mAppProcessLimit.setValueIndex(0);
68283b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn            mAppProcessLimit.setSummary(mAppProcessLimit.getEntries()[0]);
683eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } catch (RemoteException e) {
684eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        }
685eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
686eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
68783b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn    private void writeAppProcessLimitOptions(Object newValue) {
688eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        try {
68914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            int limit = newValue != null ? Integer.parseInt(newValue.toString()) : -1;
690eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            ActivityManagerNative.getDefault().setProcessLimit(limit);
691c5ec5be6e4e796bd44475c63d43d8806e522aaf1Dianne Hackborn            updateAppProcessLimitOptions();
692eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } catch (RemoteException e) {
693eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        }
694eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn    }
695eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn
696d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn    private void writeShowAllANRsOptions() {
697d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn        Settings.Secure.putInt(getActivity().getContentResolver(),
698d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn                Settings.Secure.ANR_SHOW_BACKGROUND,
699d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn                mShowAllANRs.isChecked() ? 1 : 0);
700d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn    }
701d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn
702d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn    private void updateShowAllANRsOptions() {
70334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateCheckBox(mShowAllANRs, Settings.Secure.getInt(
704d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn            getActivity().getContentResolver(), Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0);
705d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn    }
706d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn
70734481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn    private void updateEnableTracesOptions() {
70834481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        String strValue = SystemProperties.get(Trace.PROPERTY_TRACE_TAG_ENABLEFLAGS);
70934481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        long flags = SystemProperties.getLong(Trace.PROPERTY_TRACE_TAG_ENABLEFLAGS, 0);
71034481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        String[] values = mEnableTracesPref.getEntryValues();
71134481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        int numSet = 0;
71234481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        for (int i=Trace.TRACE_FLAGS_START_BIT; i<values.length; i++) {
71334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            boolean set = (flags&(1<<i)) != 0;
71434481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            mEnableTracesPref.setValue(i-Trace.TRACE_FLAGS_START_BIT, set);
71534481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            if (set) {
71634481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn                numSet++;
71734481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            }
71834481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        }
71934481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        if (numSet == 0) {
72034481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            mEnableTracesPref.setSummary(R.string.enable_traces_summary_none);
72134481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        } else if (numSet == values.length) {
72234481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            mHaveDebugSettings = true;
72334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            mEnableTracesPref.setSummary(R.string.enable_traces_summary_all);
72434481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        } else {
72534481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            mHaveDebugSettings = true;
72634481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            mEnableTracesPref.setSummary(getString(R.string.enable_traces_summary_num, numSet));
72734481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        }
72834481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn    }
72934481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn
73034481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn    private void writeEnableTracesOptions() {
73134481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        long value = 0;
73234481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        String[] values = mEnableTracesPref.getEntryValues();
73334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        for (int i=Trace.TRACE_FLAGS_START_BIT; i<values.length; i++) {
73434481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            if (mEnableTracesPref.getValue(i-Trace.TRACE_FLAGS_START_BIT)) {
73534481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn                value |= 1<<i;
73634481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            }
73734481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        }
73834481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        writeEnableTracesOptions(value);
73934481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        // Make sure summary is updated.
74034481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        updateEnableTracesOptions();
74134481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn    }
74234481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn
74334481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn    private void writeEnableTracesOptions(long value) {
74434481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        SystemProperties.set(Trace.PROPERTY_TRACE_TAG_ENABLEFLAGS,
74534481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn                "0x" + Long.toString(value, 16));
74687ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn        pokeSystemProperties();
74734481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn    }
74834481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn
749afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
75014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
75114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        if (buttonView == mEnabledSwitch) {
75214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            if (isChecked != mLastEnabledState) {
75314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                if (isChecked) {
75414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                    mDialogClicked = false;
75514dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                    if (mEnableDialog != null) dismissDialogs();
75614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                    mEnableDialog = new AlertDialog.Builder(getActivity()).setMessage(
75714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                            getActivity().getResources().getString(
75814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                                    R.string.dev_settings_warning_message))
75914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                            .setTitle(R.string.dev_settings_warning_title)
760c8272b075275f81ddfb9cef2f92514b7ce3365deBjörn Lundén                            .setIconAttribute(android.R.attr.alertDialogIcon)
76114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                            .setPositiveButton(android.R.string.yes, this)
76214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                            .setNegativeButton(android.R.string.no, this)
76314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                            .show();
76414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                    mEnableDialog.setOnDismissListener(this);
76514dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                } else {
76614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                    resetDangerousOptions();
76714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                    Settings.Secure.putInt(getActivity().getContentResolver(),
76814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                            Settings.Secure.DEVELOPMENT_SETTINGS_ENABLED, 0);
76914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                    mLastEnabledState = isChecked;
77014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                    setPrefsEnabledState(mLastEnabledState);
77114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                }
77214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            }
77314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        }
77414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    }
77514dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn
77614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    @Override
7779244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    public void onActivityResult(int requestCode, int resultCode, Intent data) {
7789244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        if (requestCode == RESULT_DEBUG_APP) {
7799244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            if (resultCode == Activity.RESULT_OK) {
7809244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn                mDebugApp = data.getAction();
7819244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn                writeDebuggerOptions();
7829244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn                updateDebuggerOptions();
7839244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            }
7849244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        } else {
7859244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            super.onActivityResult(requestCode, resultCode, data);
7869244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        }
7879244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    }
7889244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn
7899244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn    @Override
790afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
791afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
792a718832e28095219a897c6e95e903c1a3fe57c12Ying Wang        if (Utils.isMonkeyRunning()) {
793afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return false;
794afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
795afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
796afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (preference == mEnableAdb) {
797b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood            if (mEnableAdb.isChecked()) {
79814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                mDialogClicked = false;
79914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                if (mAdbDialog != null) dismissDialogs();
80014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                mAdbDialog = new AlertDialog.Builder(getActivity()).setMessage(
801ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                        getActivity().getResources().getString(R.string.adb_warning_message))
802b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood                        .setTitle(R.string.adb_warning_title)
803e7c53b1c9e48c6f997c47a0ca9a2f190ecbbf586Björn Lundén                        .setIconAttribute(android.R.attr.alertDialogIcon)
804b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood                        .setPositiveButton(android.R.string.yes, this)
805b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood                        .setNegativeButton(android.R.string.no, this)
80624bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani                        .show();
80714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                mAdbDialog.setOnDismissListener(this);
808b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood            } else {
809ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                Settings.Secure.putInt(getActivity().getContentResolver(),
810ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                        Settings.Secure.ADB_ENABLED, 0);
811b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood            }
812afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mKeepScreenOn) {
813ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            Settings.System.putInt(getActivity().getContentResolver(),
814ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    Settings.System.STAY_ON_WHILE_PLUGGED_IN,
815afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mKeepScreenOn.isChecked() ?
816afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    (BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB) : 0);
817caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        } else if (preference == mEnforceReadExternal) {
818caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            if (mEnforceReadExternal.isChecked()) {
819caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey                ConfirmEnforceFragment.show(this);
820caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            } else {
821caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey                setPermissionEnforced(getActivity(), READ_EXTERNAL_STORAGE, false);
822caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            }
823afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (preference == mAllowMockLocation) {
824ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn            Settings.Secure.putInt(getActivity().getContentResolver(),
825ee2937941d4e9a4d2cd94d504ddaa9685bcca090Dianne Hackborn                    Settings.Secure.ALLOW_MOCK_LOCATION,
826afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mAllowMockLocation.isChecked() ? 1 : 0);
8279244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        } else if (preference == mDebugAppPref) {
8289244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            startActivityForResult(new Intent(getActivity(), AppPicker.class), RESULT_DEBUG_APP);
8299244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn        } else if (preference == mWaitForDebugger) {
8309244df4c6422931697a0cf6e327b15cd71b6d8c4Dianne Hackborn            writeDebuggerOptions();
831eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } else if (preference == mStrictMode) {
832eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            writeStrictModeVisualOptions();
833eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } else if (preference == mPointerLocation) {
834eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            writePointerLocationOptions();
835f40770096fe75180fba679ed349a63d195729c0cJeff Brown        } else if (preference == mShowTouches) {
836f40770096fe75180fba679ed349a63d195729c0cJeff Brown            writeShowTouchesOptions();
837eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } else if (preference == mShowScreenUpdates) {
838e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn            writeShowUpdatesOption();
839e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn        } else if (preference == mDisableOverlays) {
840e44f44d67913ae74900656ee2ef1d2f690c63d1cDianne Hackborn            writeDisableOverlaysOption();
841eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } else if (preference == mShowCpuUsage) {
842eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            writeCpuUsageOptions();
843eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn        } else if (preference == mImmediatelyDestroyActivities) {
844eddc4fe89c020cbfedd5531cc2c13782034a8158Dianne Hackborn            writeImmediatelyDestroyActivitiesOptions();
845d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn        } else if (preference == mShowAllANRs) {
846d5119bd39738853dc96156d93c3dfbd65dd601e7Dianne Hackborn            writeShowAllANRsOptions();
8470c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy        } else if (preference == mForceHardwareUi) {
8480c9c14b7864fddc7d5822d5db866ef0cc7a6d08aRomain Guy            writeHardwareUiOptions();
849c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        } else if (preference == mTrackFrameTime) {
850c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy            writeTrackFrameTimeOptions();
851c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        } else if (preference == mShowHwScreenUpdates) {
852c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy            writeShowHwScreenUpdatesOptions();
853c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy        } else if (preference == mDebugLayout) {
854c1fa3e64b88ab81cf1faeaccb40cbc73e9f1f829Romain Guy            writeDebugLayoutOptions();
855afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
85624bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani
857afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return false;
858afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
859b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood
86083b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn    @Override
86183b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn    public boolean onPreferenceChange(Preference preference, Object newValue) {
86283b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn        if (HDCP_CHECKING_KEY.equals(preference.getKey())) {
86383b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn            SystemProperties.set(HDCP_CHECKING_PROPERTY, newValue.toString());
86483b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn            updateHdcpValues();
86587ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn            pokeSystemProperties();
86683b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn            return true;
86783b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn        } else if (preference == mWindowAnimationScale) {
86883b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn            writeAnimationScaleOption(0, mWindowAnimationScale, newValue);
86983b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn            return true;
87083b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn        } else if (preference == mTransitionAnimationScale) {
87183b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn            writeAnimationScaleOption(1, mTransitionAnimationScale, newValue);
872b29e7870de4238cbfa8eb7f3709bed7b49eeacdbChet Haase            return true;
873b29e7870de4238cbfa8eb7f3709bed7b49eeacdbChet Haase        } else if (preference == mAnimatorDurationScale) {
874b29e7870de4238cbfa8eb7f3709bed7b49eeacdbChet Haase            writeAnimationScaleOption(2, mAnimatorDurationScale, newValue);
87583b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn            return true;
87634481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn        } else if (preference == mEnableTracesPref) {
87734481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            writeEnableTracesOptions();
87834481b9cd4a589d35f59b1e504cf02f4595f0d92Dianne Hackborn            return true;
87983b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn        } else if (preference == mAppProcessLimit) {
88083b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn            writeAppProcessLimitOptions(newValue);
88183b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn            return true;
88283b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn        }
88383b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn        return false;
88483b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn    }
88583b09a57e158f3050c7feb5ea75e8dd2d626697eDianne Hackborn
88614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn    private void dismissDialogs() {
88714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        if (mAdbDialog != null) {
88814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            mAdbDialog.dismiss();
88914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            mAdbDialog = null;
89014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        }
89114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        if (mEnableDialog != null) {
89214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            mEnableDialog.dismiss();
89314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            mEnableDialog = null;
89414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        }
89524bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani    }
89624bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani
897b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood    public void onClick(DialogInterface dialog, int which) {
89814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        if (dialog == mAdbDialog) {
89914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            if (which == DialogInterface.BUTTON_POSITIVE) {
90014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                mDialogClicked = true;
90114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                Settings.Secure.putInt(getActivity().getContentResolver(),
90214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                        Settings.Secure.ADB_ENABLED, 1);
90314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            } else {
90414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                // Reset the toggle
90514dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                mEnableAdb.setChecked(false);
90614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            }
90714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        } else if (dialog == mEnableDialog) {
90814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            if (which == DialogInterface.BUTTON_POSITIVE) {
90914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                mDialogClicked = true;
91014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                Settings.Secure.putInt(getActivity().getContentResolver(),
91114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                        Settings.Secure.DEVELOPMENT_SETTINGS_ENABLED, 1);
91214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                mLastEnabledState = true;
91314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                setPrefsEnabledState(mLastEnabledState);
91414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            } else {
91514dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                // Reset the toggle
91614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                mEnabledSwitch.setChecked(false);
91714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            }
918b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood        }
919b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood    }
920b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood
921b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood    public void onDismiss(DialogInterface dialog) {
922b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood        // Assuming that onClick gets called first
92314dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        if (dialog == mAdbDialog) {
92414dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            if (!mDialogClicked) {
92514dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                mEnableAdb.setChecked(false);
92614dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            }
92714dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            mAdbDialog = null;
92814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        } else if (dialog == mEnableDialog) {
92914dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            if (!mDialogClicked) {
93014dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn                mEnabledSwitch.setChecked(false);
93114dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            }
93214dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn            mEnableDialog = null;
933b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood        }
934b7e46e89d77574dbb51855144ea3d46fcf220bbbMike Lockwood    }
93524bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani
93624bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani    @Override
93724bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani    public void onDestroy() {
93814dc2d4b84f544c4006646615d8d352f6346111aDianne Hackborn        dismissDialogs();
93924bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani        super.onDestroy();
94024bd892bdeced9cadd0ee60bbd6a9dd9c035d54bAmith Yamasani    }
94187ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn
94287ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn    void pokeSystemProperties() {
94387ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn        if (!mDontPokeProperties) {
94487ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn            (new SystemPropPoker()).execute();
94587ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn        }
94687ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn    }
94787ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn
94887ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn    static class SystemPropPoker extends AsyncTask<Void, Void, Void> {
94987ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn        @Override
95087ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn        protected Void doInBackground(Void... params) {
95187ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn            String[] services;
95287ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn            try {
95387ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn                services = ServiceManager.listServices();
95487ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn            } catch (RemoteException e) {
95587ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn                return null;
95687ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn            }
95787ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn            for (String service : services) {
95887ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn                IBinder obj = ServiceManager.checkService(service);
95987ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn                if (obj != null) {
96087ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn                    Parcel data = Parcel.obtain();
96187ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn                    try {
96287ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn                        obj.transact(IBinder.SYSPROPS_TRANSACTION, data, null, 0);
96387ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn                    } catch (RemoteException e) {
96487ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn                    }
96587ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn                    data.recycle();
96687ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn                }
96787ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn            }
96887ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn            return null;
96987ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn        }
97087ca70172cc25ed2195d310b71d9c652a0757b88Dianne Hackborn    }
971caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey
972caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey    /**
973caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey     * Dialog to confirm enforcement of {@link #READ_EXTERNAL_STORAGE}.
974caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey     */
975caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey    public static class ConfirmEnforceFragment extends DialogFragment {
976caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        public static void show(DevelopmentSettings parent) {
977caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            final ConfirmEnforceFragment dialog = new ConfirmEnforceFragment();
978caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            dialog.setTargetFragment(parent, 0);
979caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            dialog.show(parent.getFragmentManager(), TAG_CONFIRM_ENFORCE);
980caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        }
981caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey
982caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        @Override
983caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        public Dialog onCreateDialog(Bundle savedInstanceState) {
984caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            final Context context = getActivity();
985caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey
986caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            final AlertDialog.Builder builder = new AlertDialog.Builder(context);
987caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            builder.setTitle(R.string.enforce_read_external_confirm_title);
988caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            builder.setMessage(R.string.enforce_read_external_confirm_message);
989caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey
990caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            builder.setPositiveButton(android.R.string.ok, new OnClickListener() {
991caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey                @Override
992caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey                public void onClick(DialogInterface dialog, int which) {
993caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey                    setPermissionEnforced(context, READ_EXTERNAL_STORAGE, true);
994caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey                    ((DevelopmentSettings) getTargetFragment()).updateAllOptions();
995caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey                }
996caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            });
997caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            builder.setNegativeButton(android.R.string.cancel, new OnClickListener() {
998caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey                @Override
999caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey                public void onClick(DialogInterface dialog, int which) {
1000caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey                    ((DevelopmentSettings) getTargetFragment()).updateAllOptions();
1001caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey                }
1002caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            });
1003caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey
1004caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            return builder.create();
1005caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        }
1006caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey    }
1007caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey
1008caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey    private static boolean isPermissionEnforced(Context context, String permission) {
1009caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        try {
1010caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            return ActivityThread.getPackageManager().isPermissionEnforced(READ_EXTERNAL_STORAGE);
1011caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        } catch (RemoteException e) {
1012caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            throw new RuntimeException("Problem talking with PackageManager", e);
1013caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        }
1014caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey    }
1015caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey
1016caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey    private static void setPermissionEnforced(
1017caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            Context context, String permission, boolean enforced) {
1018caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        try {
1019caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            // TODO: offload to background thread
1020caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            ActivityThread.getPackageManager()
1021caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey                    .setPermissionEnforced(READ_EXTERNAL_STORAGE, enforced);
1022caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        } catch (RemoteException e) {
1023caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey            throw new RuntimeException("Problem talking with PackageManager", e);
1024caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey        }
1025caf15613c29870850da952e51aaebb8b84867c49Jeff Sharkey    }
1026afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
1027