OSDN Git Service

Import translations. DO NOT MERGE
[android-x86/packages-apps-Settings.git] / src / com / android / settings / DevelopmentSettings.java
1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.android.settings;
18
19 import android.Manifest;
20 import android.app.Activity;
21 import android.app.ActivityManagerNative;
22 import android.app.AlertDialog;
23 import android.app.AppOpsManager;
24 import android.app.AppOpsManager.PackageOps;
25 import android.app.Dialog;
26 import android.app.admin.DevicePolicyManager;
27 import android.app.backup.IBackupManager;
28 import android.bluetooth.BluetoothAdapter;
29 import android.content.BroadcastReceiver;
30 import android.content.ComponentName;
31 import android.content.ContentResolver;
32 import android.content.Context;
33 import android.content.DialogInterface;
34 import android.content.Intent;
35 import android.content.IntentFilter;
36 import android.content.pm.ApplicationInfo;
37 import android.content.pm.IShortcutService;
38 import android.content.pm.PackageManager;
39 import android.content.pm.PackageManager.NameNotFoundException;
40 import android.content.pm.ResolveInfo;
41 import android.content.res.Resources;
42 import android.hardware.usb.IUsbManager;
43 import android.hardware.usb.UsbManager;
44 import android.net.wifi.WifiManager;
45 import android.os.AsyncTask;
46 import android.os.BatteryManager;
47 import android.os.Build;
48 import android.os.Bundle;
49 import android.os.IBinder;
50 import android.os.Parcel;
51 import android.os.RemoteException;
52 import android.os.ServiceManager;
53 import android.os.StrictMode;
54 import android.os.SystemProperties;
55 import android.os.UserHandle;
56 import android.os.UserManager;
57 import android.os.storage.IMountService;
58 import android.provider.SearchIndexableResource;
59 import android.provider.Settings;
60 import android.service.persistentdata.PersistentDataBlockManager;
61 import android.support.v14.preference.SwitchPreference;
62 import android.support.v7.preference.ListPreference;
63 import android.support.v7.preference.Preference;
64 import android.support.v7.preference.Preference.OnPreferenceChangeListener;
65 import android.support.v7.preference.PreferenceGroup;
66 import android.support.v7.preference.PreferenceScreen;
67 import android.telephony.TelephonyManager;
68 import android.text.TextUtils;
69 import android.util.Log;
70 import android.view.IWindowManager;
71 import android.view.LayoutInflater;
72 import android.view.ThreadedRenderer;
73 import android.view.View;
74 import android.view.ViewGroup;
75 import android.view.accessibility.AccessibilityManager;
76 import android.webkit.IWebViewUpdateService;
77 import android.webkit.WebViewProviderInfo;
78 import android.widget.Switch;
79 import android.widget.Toast;
80
81 import com.android.internal.app.LocalePicker;
82 import com.android.internal.logging.MetricsProto.MetricsEvent;
83 import com.android.settings.applications.BackgroundCheckSummary;
84 import com.android.settings.fuelgauge.InactiveApps;
85 import com.android.settings.search.BaseSearchIndexProvider;
86 import com.android.settings.search.Indexable;
87 import com.android.settings.widget.SwitchBar;
88 import com.android.settingslib.RestrictedLockUtils;
89 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
90 import com.android.settingslib.RestrictedSwitchPreference;
91
92 import java.util.ArrayList;
93 import java.util.Arrays;
94 import java.util.HashSet;
95 import java.util.List;
96
97 /*
98  * Displays preferences for application developers.
99  */
100 public class DevelopmentSettings extends RestrictedSettingsFragment
101         implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener,
102                 OnPreferenceChangeListener, SwitchBar.OnSwitchChangeListener, Indexable {
103     private static final String TAG = "DevelopmentSettings";
104
105     /**
106      * Preference file were development settings prefs are stored.
107      */
108     public static final String PREF_FILE = "development";
109
110     /**
111      * Whether to show the development settings to the user.  Default is false.
112      */
113     public static final String PREF_SHOW = "show";
114
115     private static final String ENABLE_ADB = "enable_adb";
116     private static final String CLEAR_ADB_KEYS = "clear_adb_keys";
117     private static final String ENABLE_TERMINAL = "enable_terminal";
118     private static final String KEEP_SCREEN_ON = "keep_screen_on";
119     private static final String BT_HCI_SNOOP_LOG = "bt_hci_snoop_log";
120     private static final String WEBVIEW_PROVIDER_KEY = "select_webview_provider";
121     private static final String WEBVIEW_MULTIPROCESS_KEY = "enable_webview_multiprocess";
122     private static final String ENABLE_OEM_UNLOCK = "oem_unlock_enable";
123     private static final String HDCP_CHECKING_KEY = "hdcp_checking";
124     private static final String HDCP_CHECKING_PROPERTY = "persist.sys.hdcp_checking";
125     private static final String LOCAL_BACKUP_PASSWORD = "local_backup_password";
126     private static final String HARDWARE_UI_PROPERTY = "persist.sys.ui.hw";
127     private static final String MSAA_PROPERTY = "debug.egl.force_msaa";
128     private static final String BUGREPORT = "bugreport";
129     private static final String BUGREPORT_IN_POWER_KEY = "bugreport_in_power";
130     private static final String OPENGL_TRACES_PROPERTY = "debug.egl.trace";
131     private static final String TUNER_UI_KEY = "tuner_ui";
132     private static final String COLOR_TEMPERATURE_PROPERTY = "persist.sys.debug.color_temp";
133
134     private static final String DEBUG_APP_KEY = "debug_app";
135     private static final String WAIT_FOR_DEBUGGER_KEY = "wait_for_debugger";
136     private static final String MOCK_LOCATION_APP_KEY = "mock_location_app";
137     private static final String VERIFY_APPS_OVER_USB_KEY = "verify_apps_over_usb";
138     private static final String DEBUG_VIEW_ATTRIBUTES =  "debug_view_attributes";
139     private static final String FORCE_ALLOW_ON_EXTERNAL_KEY = "force_allow_on_external";
140     private static final String STRICT_MODE_KEY = "strict_mode";
141     private static final String POINTER_LOCATION_KEY = "pointer_location";
142     private static final String SHOW_TOUCHES_KEY = "show_touches";
143     private static final String SHOW_SCREEN_UPDATES_KEY = "show_screen_updates";
144     private static final String DISABLE_OVERLAYS_KEY = "disable_overlays";
145     private static final String SIMULATE_COLOR_SPACE = "simulate_color_space";
146     private static final String USB_AUDIO_KEY = "usb_audio";
147     private static final String FORCE_HARDWARE_UI_KEY = "force_hw_ui";
148     private static final String FORCE_MSAA_KEY = "force_msaa";
149     private static final String TRACK_FRAME_TIME_KEY = "track_frame_time";
150     private static final String SHOW_NON_RECTANGULAR_CLIP_KEY = "show_non_rect_clip";
151     private static final String SHOW_HW_SCREEN_UPDATES_KEY = "show_hw_screen_udpates";
152     private static final String SHOW_HW_LAYERS_UPDATES_KEY = "show_hw_layers_udpates";
153     private static final String DEBUG_HW_OVERDRAW_KEY = "debug_hw_overdraw";
154     private static final String DEBUG_LAYOUT_KEY = "debug_layout";
155     private static final String FORCE_RTL_LAYOUT_KEY = "force_rtl_layout_all_locales";
156     private static final String WINDOW_ANIMATION_SCALE_KEY = "window_animation_scale";
157     private static final String TRANSITION_ANIMATION_SCALE_KEY = "transition_animation_scale";
158     private static final String ANIMATOR_DURATION_SCALE_KEY = "animator_duration_scale";
159     private static final String OVERLAY_DISPLAY_DEVICES_KEY = "overlay_display_devices";
160     private static final String DEBUG_DEBUGGING_CATEGORY_KEY = "debug_debugging_category";
161     private static final String SELECT_LOGD_SIZE_KEY = "select_logd_size";
162     private static final String SELECT_LOGD_SIZE_PROPERTY = "persist.logd.size";
163     private static final String SELECT_LOGD_TAG_PROPERTY = "persist.log.tag";
164     // Tricky, isLoggable only checks for first character, assumes silence
165     private static final String SELECT_LOGD_TAG_SILENCE = "Settings";
166     private static final String SELECT_LOGD_SNET_TAG_PROPERTY = "persist.log.tag.snet_event_log";
167     private static final String SELECT_LOGD_RUNTIME_SNET_TAG_PROPERTY = "log.tag.snet_event_log";
168     private static final String SELECT_LOGD_DEFAULT_SIZE_PROPERTY = "ro.logd.size";
169     private static final String SELECT_LOGD_DEFAULT_SIZE_VALUE = "262144";
170     private static final String SELECT_LOGD_SVELTE_DEFAULT_SIZE_VALUE = "65536";
171     // 32768 is merely a menu marker, 64K is our lowest log buffer size we replace it with.
172     private static final String SELECT_LOGD_MINIMUM_SIZE_VALUE = "65536";
173     private static final String SELECT_LOGD_OFF_SIZE_MARKER_VALUE = "32768";
174     private static final String SELECT_LOGPERSIST_KEY = "select_logpersist";
175     private static final String SELECT_LOGPERSIST_PROPERTY = "persist.logd.logpersistd";
176     private static final String ACTUAL_LOGPERSIST_PROPERTY = "logd.logpersistd";
177     private static final String SELECT_LOGPERSIST_PROPERTY_SERVICE = "logcatd";
178     private static final String SELECT_LOGPERSIST_PROPERTY_CLEAR = "clear";
179     private static final String SELECT_LOGPERSIST_PROPERTY_STOP = "stop";
180     private static final String SELECT_LOGPERSIST_PROPERTY_BUFFER = "persist.logd.logpersistd.buffer";
181     private static final String ACTUAL_LOGPERSIST_PROPERTY_BUFFER = "logd.logpersistd.buffer";
182     private static final String ACTUAL_LOGPERSIST_PROPERTY_ENABLE = "logd.logpersistd.enable";
183
184     private static final String WIFI_DISPLAY_CERTIFICATION_KEY = "wifi_display_certification";
185     private static final String WIFI_VERBOSE_LOGGING_KEY = "wifi_verbose_logging";
186     private static final String WIFI_AGGRESSIVE_HANDOVER_KEY = "wifi_aggressive_handover";
187     private static final String WIFI_ALLOW_SCAN_WITH_TRAFFIC_KEY = "wifi_allow_scan_with_traffic";
188     private static final String USB_CONFIGURATION_KEY = "select_usb_configuration";
189     private static final String MOBILE_DATA_ALWAYS_ON = "mobile_data_always_on";
190     private static final String KEY_COLOR_MODE = "color_mode";
191     private static final String FORCE_RESIZABLE_KEY = "force_resizable_activities";
192     private static final String COLOR_TEMPERATURE_KEY = "color_temperature";
193
194     private static final String BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_KEY =
195                                     "bluetooth_disable_absolute_volume";
196     private static final String BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_PROPERTY =
197                                     "persist.bluetooth.disableabsvol";
198
199     private static final String INACTIVE_APPS_KEY = "inactive_apps";
200
201     private static final String IMMEDIATELY_DESTROY_ACTIVITIES_KEY
202             = "immediately_destroy_activities";
203     private static final String APP_PROCESS_LIMIT_KEY = "app_process_limit";
204
205     private static final String BACKGROUND_CHECK_KEY = "background_check";
206
207     private static final String SHOW_ALL_ANRS_KEY = "show_all_anrs";
208
209     private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive";
210
211     private static final String TERMINAL_APP_PACKAGE = "com.android.terminal";
212
213     private static final String KEY_CONVERT_FBE = "convert_to_file_encryption";
214
215     private static final String OTA_DISABLE_AUTOMATIC_UPDATE_KEY = "ota_disable_automatic_update";
216
217     private static final int RESULT_DEBUG_APP = 1000;
218     private static final int RESULT_MOCK_LOCATION_APP = 1001;
219
220     private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst";
221     private static final String FLASH_LOCKED_PROP = "ro.boot.flash.locked";
222
223     private static final String SHORTCUT_MANAGER_RESET_KEY = "reset_shortcut_manager_throttling";
224
225     private static final int REQUEST_CODE_ENABLE_OEM_UNLOCK = 0;
226
227     private static final int[] MOCK_LOCATION_APP_OPS = new int[] {AppOpsManager.OP_MOCK_LOCATION};
228
229     private IWindowManager mWindowManager;
230     private IBackupManager mBackupManager;
231     private IWebViewUpdateService mWebViewUpdateService;
232     private DevicePolicyManager mDpm;
233     private UserManager mUm;
234     private WifiManager mWifiManager;
235     private PersistentDataBlockManager mOemUnlockManager;
236     private TelephonyManager mTelephonyManager;
237
238     private SwitchBar mSwitchBar;
239     private boolean mLastEnabledState;
240     private boolean mHaveDebugSettings;
241     private boolean mDontPokeProperties;
242
243     private SwitchPreference mEnableAdb;
244     private Preference mClearAdbKeys;
245     private SwitchPreference mEnableTerminal;
246     private Preference mBugreport;
247     private SwitchPreference mBugreportInPower;
248     private RestrictedSwitchPreference mKeepScreenOn;
249     private SwitchPreference mBtHciSnoopLog;
250     private RestrictedSwitchPreference mEnableOemUnlock;
251     private SwitchPreference mDebugViewAttributes;
252     private SwitchPreference mForceAllowOnExternal;
253
254     private PreferenceScreen mPassword;
255     private String mDebugApp;
256     private Preference mDebugAppPref;
257
258     private String mMockLocationApp;
259     private Preference mMockLocationAppPref;
260
261     private SwitchPreference mWaitForDebugger;
262     private SwitchPreference mVerifyAppsOverUsb;
263     private SwitchPreference mWifiDisplayCertification;
264     private SwitchPreference mWifiVerboseLogging;
265     private SwitchPreference mWifiAggressiveHandover;
266     private SwitchPreference mMobileDataAlwaysOn;
267     private SwitchPreference mBluetoothDisableAbsVolume;
268     private SwitchPreference mOtaDisableAutomaticUpdate;
269
270     private SwitchPreference mWifiAllowScansWithTraffic;
271     private SwitchPreference mStrictMode;
272     private SwitchPreference mPointerLocation;
273     private SwitchPreference mShowTouches;
274     private SwitchPreference mShowScreenUpdates;
275     private SwitchPreference mDisableOverlays;
276     private SwitchPreference mForceHardwareUi;
277     private SwitchPreference mForceMsaa;
278     private SwitchPreference mShowHwScreenUpdates;
279     private SwitchPreference mShowHwLayersUpdates;
280     private SwitchPreference mDebugLayout;
281     private SwitchPreference mForceRtlLayout;
282     private ListPreference mDebugHwOverdraw;
283     private ListPreference mLogdSize;
284     private ListPreference mLogpersist;
285     private ListPreference mUsbConfiguration;
286     private ListPreference mTrackFrameTime;
287     private ListPreference mShowNonRectClip;
288     private ListPreference mWindowAnimationScale;
289     private ListPreference mTransitionAnimationScale;
290     private ListPreference mAnimatorDurationScale;
291     private ListPreference mOverlayDisplayDevices;
292
293     private SwitchPreference mWebViewMultiprocess;
294     private ListPreference mWebViewProvider;
295
296     private ListPreference mSimulateColorSpace;
297
298     private SwitchPreference mUSBAudio;
299     private SwitchPreference mImmediatelyDestroyActivities;
300
301     private ListPreference mAppProcessLimit;
302
303     private SwitchPreference mShowAllANRs;
304
305     private ColorModePreference mColorModePreference;
306
307     private SwitchPreference mForceResizable;
308
309     private SwitchPreference mColorTemperaturePreference;
310
311     private final ArrayList<Preference> mAllPrefs = new ArrayList<Preference>();
312
313     private final ArrayList<SwitchPreference> mResetSwitchPrefs
314             = new ArrayList<SwitchPreference>();
315
316     private final HashSet<Preference> mDisabledPrefs = new HashSet<Preference>();
317     // To track whether a confirmation dialog was clicked.
318     private boolean mDialogClicked;
319     private Dialog mEnableDialog;
320     private Dialog mAdbDialog;
321
322     private Dialog mAdbKeysDialog;
323     private boolean mUnavailable;
324
325     private boolean mLogpersistCleared;
326     private Dialog mLogpersistClearDialog;
327
328     public DevelopmentSettings() {
329         super(UserManager.DISALLOW_DEBUGGING_FEATURES);
330     }
331
332     @Override
333     protected int getMetricsCategory() {
334         return MetricsEvent.DEVELOPMENT;
335     }
336
337     @Override
338     public void onCreate(Bundle icicle) {
339         super.onCreate(icicle);
340
341         mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
342         mBackupManager = IBackupManager.Stub.asInterface(
343                 ServiceManager.getService(Context.BACKUP_SERVICE));
344         mWebViewUpdateService  =
345             IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));
346         mOemUnlockManager = (PersistentDataBlockManager)getActivity()
347                 .getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE);
348         mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
349
350         mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
351         mUm = (UserManager) getSystemService(Context.USER_SERVICE);
352
353         mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
354
355         setIfOnlyAvailableForAdmins(true);
356         if (isUiRestricted() || !Utils.isDeviceProvisioned(getActivity())) {
357             // Block access to developer options if the user is not the owner, if user policy
358             // restricts it, or if the device has not been provisioned
359             mUnavailable = true;
360             setPreferenceScreen(new PreferenceScreen(getPrefContext(), null));
361             return;
362         }
363
364         addPreferencesFromResource(R.xml.development_prefs);
365
366         final PreferenceGroup debugDebuggingCategory = (PreferenceGroup)
367                 findPreference(DEBUG_DEBUGGING_CATEGORY_KEY);
368         mEnableAdb = findAndInitSwitchPref(ENABLE_ADB);
369         mClearAdbKeys = findPreference(CLEAR_ADB_KEYS);
370         if (!SystemProperties.getBoolean("ro.adb.secure", false)) {
371             if (debugDebuggingCategory != null) {
372                 debugDebuggingCategory.removePreference(mClearAdbKeys);
373             }
374         }
375         mAllPrefs.add(mClearAdbKeys);
376         mEnableTerminal = findAndInitSwitchPref(ENABLE_TERMINAL);
377         if (!isPackageInstalled(getActivity(), TERMINAL_APP_PACKAGE)) {
378             debugDebuggingCategory.removePreference(mEnableTerminal);
379             mEnableTerminal = null;
380         }
381
382         mBugreport = findPreference(BUGREPORT);
383         mBugreportInPower = findAndInitSwitchPref(BUGREPORT_IN_POWER_KEY);
384         mKeepScreenOn = (RestrictedSwitchPreference) findAndInitSwitchPref(KEEP_SCREEN_ON);
385         mBtHciSnoopLog = findAndInitSwitchPref(BT_HCI_SNOOP_LOG);
386         mEnableOemUnlock = (RestrictedSwitchPreference) findAndInitSwitchPref(ENABLE_OEM_UNLOCK);
387         if (!showEnableOemUnlockPreference()) {
388             removePreference(mEnableOemUnlock);
389             mEnableOemUnlock = null;
390         }
391
392         mDebugViewAttributes = findAndInitSwitchPref(DEBUG_VIEW_ATTRIBUTES);
393         mForceAllowOnExternal = findAndInitSwitchPref(FORCE_ALLOW_ON_EXTERNAL_KEY);
394         mPassword = (PreferenceScreen) findPreference(LOCAL_BACKUP_PASSWORD);
395         mAllPrefs.add(mPassword);
396
397         if (!mUm.isAdminUser()) {
398             disableForUser(mEnableAdb);
399             disableForUser(mClearAdbKeys);
400             disableForUser(mEnableTerminal);
401             disableForUser(mPassword);
402         }
403
404         mDebugAppPref = findPreference(DEBUG_APP_KEY);
405         mAllPrefs.add(mDebugAppPref);
406         mWaitForDebugger = findAndInitSwitchPref(WAIT_FOR_DEBUGGER_KEY);
407
408         mMockLocationAppPref = findPreference(MOCK_LOCATION_APP_KEY);
409         mAllPrefs.add(mMockLocationAppPref);
410
411         mVerifyAppsOverUsb = findAndInitSwitchPref(VERIFY_APPS_OVER_USB_KEY);
412         if (!showVerifierSetting()) {
413             if (debugDebuggingCategory != null) {
414                 debugDebuggingCategory.removePreference(mVerifyAppsOverUsb);
415             } else {
416                 mVerifyAppsOverUsb.setEnabled(false);
417             }
418         }
419         mStrictMode = findAndInitSwitchPref(STRICT_MODE_KEY);
420         mPointerLocation = findAndInitSwitchPref(POINTER_LOCATION_KEY);
421         mShowTouches = findAndInitSwitchPref(SHOW_TOUCHES_KEY);
422         mShowScreenUpdates = findAndInitSwitchPref(SHOW_SCREEN_UPDATES_KEY);
423         mDisableOverlays = findAndInitSwitchPref(DISABLE_OVERLAYS_KEY);
424         mForceHardwareUi = findAndInitSwitchPref(FORCE_HARDWARE_UI_KEY);
425         mForceMsaa = findAndInitSwitchPref(FORCE_MSAA_KEY);
426         mTrackFrameTime = addListPreference(TRACK_FRAME_TIME_KEY);
427         mShowNonRectClip = addListPreference(SHOW_NON_RECTANGULAR_CLIP_KEY);
428         mShowHwScreenUpdates = findAndInitSwitchPref(SHOW_HW_SCREEN_UPDATES_KEY);
429         mShowHwLayersUpdates = findAndInitSwitchPref(SHOW_HW_LAYERS_UPDATES_KEY);
430         mDebugLayout = findAndInitSwitchPref(DEBUG_LAYOUT_KEY);
431         mForceRtlLayout = findAndInitSwitchPref(FORCE_RTL_LAYOUT_KEY);
432         mDebugHwOverdraw = addListPreference(DEBUG_HW_OVERDRAW_KEY);
433         mWifiDisplayCertification = findAndInitSwitchPref(WIFI_DISPLAY_CERTIFICATION_KEY);
434         mWifiVerboseLogging = findAndInitSwitchPref(WIFI_VERBOSE_LOGGING_KEY);
435         mWifiAggressiveHandover = findAndInitSwitchPref(WIFI_AGGRESSIVE_HANDOVER_KEY);
436         mWifiAllowScansWithTraffic = findAndInitSwitchPref(WIFI_ALLOW_SCAN_WITH_TRAFFIC_KEY);
437         mMobileDataAlwaysOn = findAndInitSwitchPref(MOBILE_DATA_ALWAYS_ON);
438         mLogdSize = addListPreference(SELECT_LOGD_SIZE_KEY);
439         if ("1".equals(SystemProperties.get("ro.debuggable", "0"))) {
440             mLogpersist = addListPreference(SELECT_LOGPERSIST_KEY);
441         } else {
442             mLogpersist = (ListPreference) findPreference(SELECT_LOGPERSIST_KEY);
443             if (mLogpersist != null) {
444                 mLogpersist.setEnabled(false);
445                 if (debugDebuggingCategory != null) {
446                     debugDebuggingCategory.removePreference(mLogpersist);
447                 }
448             }
449             mLogpersist = null;
450         }
451         mUsbConfiguration = addListPreference(USB_CONFIGURATION_KEY);
452         mWebViewProvider = addListPreference(WEBVIEW_PROVIDER_KEY);
453         mWebViewMultiprocess = findAndInitSwitchPref(WEBVIEW_MULTIPROCESS_KEY);
454         mBluetoothDisableAbsVolume = findAndInitSwitchPref(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_KEY);
455
456         mWindowAnimationScale = addListPreference(WINDOW_ANIMATION_SCALE_KEY);
457         mTransitionAnimationScale = addListPreference(TRANSITION_ANIMATION_SCALE_KEY);
458         mAnimatorDurationScale = addListPreference(ANIMATOR_DURATION_SCALE_KEY);
459         mOverlayDisplayDevices = addListPreference(OVERLAY_DISPLAY_DEVICES_KEY);
460         mSimulateColorSpace = addListPreference(SIMULATE_COLOR_SPACE);
461         mUSBAudio = findAndInitSwitchPref(USB_AUDIO_KEY);
462         mForceResizable = findAndInitSwitchPref(FORCE_RESIZABLE_KEY);
463
464         mImmediatelyDestroyActivities = (SwitchPreference) findPreference(
465                 IMMEDIATELY_DESTROY_ACTIVITIES_KEY);
466         mAllPrefs.add(mImmediatelyDestroyActivities);
467         mResetSwitchPrefs.add(mImmediatelyDestroyActivities);
468
469         mAppProcessLimit = addListPreference(APP_PROCESS_LIMIT_KEY);
470
471         mShowAllANRs = (SwitchPreference) findPreference(
472                 SHOW_ALL_ANRS_KEY);
473         mAllPrefs.add(mShowAllANRs);
474         mResetSwitchPrefs.add(mShowAllANRs);
475
476         Preference hdcpChecking = findPreference(HDCP_CHECKING_KEY);
477         if (hdcpChecking != null) {
478             mAllPrefs.add(hdcpChecking);
479             removePreferenceForProduction(hdcpChecking);
480         }
481
482         PreferenceScreen convertFbePreference =
483             (PreferenceScreen) findPreference(KEY_CONVERT_FBE);
484
485         try {
486             IBinder service = ServiceManager.getService("mount");
487             IMountService mountService = IMountService.Stub.asInterface(service);
488             if (!mountService.isConvertibleToFBE()) {
489                 removePreference(KEY_CONVERT_FBE);
490             } else if ("file".equals(SystemProperties.get("ro.crypto.type", "none"))) {
491                 convertFbePreference.setEnabled(false);
492                 convertFbePreference.setSummary(getResources()
493                                    .getString(R.string.convert_to_file_encryption_done));
494             }
495         } catch(RemoteException e) {
496             removePreference(KEY_CONVERT_FBE);
497         }
498
499         mOtaDisableAutomaticUpdate = findAndInitSwitchPref(OTA_DISABLE_AUTOMATIC_UPDATE_KEY);
500
501         mColorModePreference = (ColorModePreference) findPreference(KEY_COLOR_MODE);
502         mColorModePreference.updateCurrentAndSupported();
503         if (mColorModePreference.getColorModeCount() < 2) {
504             removePreference(KEY_COLOR_MODE);
505             mColorModePreference = null;
506         }
507         updateWebViewProviderOptions();
508
509         mColorTemperaturePreference = (SwitchPreference) findPreference(COLOR_TEMPERATURE_KEY);
510         if (getResources().getBoolean(R.bool.config_enableColorTemperature)) {
511             mAllPrefs.add(mColorTemperaturePreference);
512             mResetSwitchPrefs.add(mColorTemperaturePreference);
513         } else {
514             removePreference(COLOR_TEMPERATURE_KEY);
515             mColorTemperaturePreference = null;
516         }
517     }
518
519     private ListPreference addListPreference(String prefKey) {
520         ListPreference pref = (ListPreference) findPreference(prefKey);
521         mAllPrefs.add(pref);
522         pref.setOnPreferenceChangeListener(this);
523         return pref;
524     }
525
526     private void disableForUser(Preference pref) {
527         if (pref != null) {
528             pref.setEnabled(false);
529             mDisabledPrefs.add(pref);
530         }
531     }
532
533     private SwitchPreference findAndInitSwitchPref(String key) {
534         SwitchPreference pref = (SwitchPreference) findPreference(key);
535         if (pref == null) {
536             throw new IllegalArgumentException("Cannot find preference with key = " + key);
537         }
538         mAllPrefs.add(pref);
539         mResetSwitchPrefs.add(pref);
540         return pref;
541     }
542
543     @Override
544     public void onActivityCreated(Bundle savedInstanceState) {
545         super.onActivityCreated(savedInstanceState);
546
547         final SettingsActivity activity = (SettingsActivity) getActivity();
548
549         mSwitchBar = activity.getSwitchBar();
550        if (mUnavailable) {
551             mSwitchBar.setEnabled(false);
552             return;
553         }
554
555         mSwitchBar.addOnSwitchChangeListener(this);
556     }
557
558     private boolean removePreferenceForProduction(Preference preference) {
559         if ("user".equals(Build.TYPE)) {
560             removePreference(preference);
561             return true;
562         }
563         return false;
564     }
565
566     private void removePreference(Preference preference) {
567         getPreferenceScreen().removePreference(preference);
568         mAllPrefs.remove(preference);
569         mResetSwitchPrefs.remove(preference);
570     }
571
572     private void setPrefsEnabledState(boolean enabled) {
573         for (int i = 0; i < mAllPrefs.size(); i++) {
574             Preference pref = mAllPrefs.get(i);
575             pref.setEnabled(enabled && !mDisabledPrefs.contains(pref));
576         }
577         updateAllOptions();
578     }
579
580     @Override
581     public void onResume() {
582         super.onResume();
583
584         if (mUnavailable) {
585             // Show error message
586             if (!isUiRestrictedByOnlyAdmin()) {
587                 getEmptyTextView().setText(R.string.development_settings_not_available);
588             }
589             getPreferenceScreen().removeAll();
590             return;
591         }
592
593         // A DeviceAdmin has specified a maximum time until the device
594         // will lock...  in this case we can't allow the user to turn
595         // on "stay awake when plugged in" because that would defeat the
596         // restriction.
597         final EnforcedAdmin admin = RestrictedLockUtils.checkIfMaximumTimeToLockIsSet(
598                 getActivity());
599         mKeepScreenOn.setDisabledByAdmin(admin);
600         if (admin == null) {
601             mDisabledPrefs.remove(mKeepScreenOn);
602         } else {
603             mDisabledPrefs.add(mKeepScreenOn);
604         }
605
606         final ContentResolver cr = getActivity().getContentResolver();
607         mLastEnabledState = Settings.Global.getInt(cr,
608                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
609         mSwitchBar.setChecked(mLastEnabledState);
610         setPrefsEnabledState(mLastEnabledState);
611
612         if (mHaveDebugSettings && !mLastEnabledState) {
613             // Overall debugging is disabled, but there are some debug
614             // settings that are enabled.  This is an invalid state.  Switch
615             // to debug settings being enabled, so the user knows there is
616             // stuff enabled and can turn it all off if they want.
617             Settings.Global.putInt(getActivity().getContentResolver(),
618                     Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
619             mLastEnabledState = true;
620             mSwitchBar.setChecked(mLastEnabledState);
621             setPrefsEnabledState(mLastEnabledState);
622         }
623         mSwitchBar.show();
624
625         if (mColorModePreference != null) {
626             mColorModePreference.startListening();
627             mColorModePreference.updateCurrentAndSupported();
628         }
629     }
630
631     @Override
632     public void onPause() {
633         super.onPause();
634         if (mColorModePreference != null) {
635             mColorModePreference.stopListening();
636         }
637     }
638
639     @Override
640     public View onCreateView(LayoutInflater inflater, ViewGroup container,
641             Bundle savedInstanceState) {
642         IntentFilter filter = new IntentFilter();
643         filter.addAction(UsbManager.ACTION_USB_STATE);
644         if (getActivity().registerReceiver(mUsbReceiver, filter) == null) {
645             updateUsbConfigurationValues();
646         }
647         return super.onCreateView(inflater, container, savedInstanceState);
648     }
649
650     @Override
651     public void onDestroyView() {
652         super.onDestroyView();
653
654         if (mUnavailable) {
655             return;
656         }
657         mSwitchBar.removeOnSwitchChangeListener(this);
658         mSwitchBar.hide();
659         getActivity().unregisterReceiver(mUsbReceiver);
660     }
661
662     void updateSwitchPreference(SwitchPreference switchPreference, boolean value) {
663         switchPreference.setChecked(value);
664         mHaveDebugSettings |= value;
665     }
666
667     private void updateAllOptions() {
668         final Context context = getActivity();
669         final ContentResolver cr = context.getContentResolver();
670         mHaveDebugSettings = false;
671         updateSwitchPreference(mEnableAdb, Settings.Global.getInt(cr,
672                 Settings.Global.ADB_ENABLED, 0) != 0);
673         if (mEnableTerminal != null) {
674             updateSwitchPreference(mEnableTerminal,
675                     context.getPackageManager().getApplicationEnabledSetting(TERMINAL_APP_PACKAGE)
676                             == PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
677         }
678         updateSwitchPreference(mBugreportInPower, Settings.Secure.getInt(cr,
679                 Settings.Global.BUGREPORT_IN_POWER_MENU, 0) != 0);
680         updateSwitchPreference(mKeepScreenOn, Settings.Global.getInt(cr,
681                 Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0) != 0);
682         updateSwitchPreference(mBtHciSnoopLog, Settings.Secure.getInt(cr,
683                 Settings.Secure.BLUETOOTH_HCI_LOG, 0) != 0);
684         updateSwitchPreference(mDebugViewAttributes, Settings.Global.getInt(cr,
685                 Settings.Global.DEBUG_VIEW_ATTRIBUTES, 0) != 0);
686         updateSwitchPreference(mForceAllowOnExternal, Settings.Global.getInt(cr,
687                 Settings.Global.FORCE_ALLOW_ON_EXTERNAL, 0) != 0);
688         updateHdcpValues();
689         updatePasswordSummary();
690         updateDebuggerOptions();
691         updateMockLocation();
692         updateStrictModeVisualOptions();
693         updatePointerLocationOptions();
694         updateShowTouchesOptions();
695         updateFlingerOptions();
696         updateHardwareUiOptions();
697         updateMsaaOptions();
698         updateTrackFrameTimeOptions();
699         updateShowNonRectClipOptions();
700         updateShowHwScreenUpdatesOptions();
701         updateShowHwLayersUpdatesOptions();
702         updateDebugHwOverdrawOptions();
703         updateDebugLayoutOptions();
704         updateAnimationScaleOptions();
705         updateOverlayDisplayDevicesOptions();
706         updateImmediatelyDestroyActivitiesOptions();
707         updateAppProcessLimitOptions();
708         updateShowAllANRsOptions();
709         updateVerifyAppsOverUsbOptions();
710         updateOtaDisableAutomaticUpdateOptions();
711         updateBugreportOptions();
712         updateForceRtlOptions();
713         updateLogdSizeValues();
714         updateLogpersistValues();
715         updateWifiDisplayCertificationOptions();
716         updateWifiVerboseLoggingOptions();
717         updateWifiAggressiveHandoverOptions();
718         updateWifiAllowScansWithTrafficOptions();
719         updateMobileDataAlwaysOnOptions();
720         updateSimulateColorSpace();
721         updateUSBAudioOptions();
722         updateForceResizableOptions();
723         updateWebViewMultiprocessOptions();
724         updateWebViewProviderOptions();
725         updateOemUnlockOptions();
726         if (mColorTemperaturePreference != null) {
727             updateColorTemperature();
728         }
729         updateBluetoothDisableAbsVolumeOptions();
730     }
731
732     private void resetDangerousOptions() {
733         mDontPokeProperties = true;
734         for (int i=0; i< mResetSwitchPrefs.size(); i++) {
735             SwitchPreference cb = mResetSwitchPrefs.get(i);
736             if (cb.isChecked()) {
737                 cb.setChecked(false);
738                 onPreferenceTreeClick(cb);
739             }
740         }
741         resetDebuggerOptions();
742         writeLogpersistOption(null, true);
743         writeLogdSizeOption(null);
744         writeAnimationScaleOption(0, mWindowAnimationScale, null);
745         writeAnimationScaleOption(1, mTransitionAnimationScale, null);
746         writeAnimationScaleOption(2, mAnimatorDurationScale, null);
747         // Only poke the color space setting if we control it.
748         if (usingDevelopmentColorSpace()) {
749             writeSimulateColorSpace(-1);
750         }
751         writeOverlayDisplayDevicesOptions(null);
752         writeAppProcessLimitOptions(null);
753         mHaveDebugSettings = false;
754         updateAllOptions();
755         mDontPokeProperties = false;
756         pokeSystemProperties();
757     }
758
759     private void updateWebViewProviderOptions() {
760         try {
761             WebViewProviderInfo[] providers = mWebViewUpdateService.getValidWebViewPackages();
762             if (providers == null) {
763                 Log.e(TAG, "No WebView providers available");
764                 return;
765             }
766             ArrayList<String> options = new ArrayList<String>();
767             ArrayList<String> values = new ArrayList<String>();
768             for(int n = 0; n < providers.length; n++) {
769                 if (Utils.isPackageEnabled(getActivity(), providers[n].packageName)) {
770                     options.add(providers[n].description);
771                     values.add(providers[n].packageName);
772                 }
773             }
774             mWebViewProvider.setEntries(options.toArray(new String[options.size()]));
775             mWebViewProvider.setEntryValues(values.toArray(new String[values.size()]));
776
777             String value = mWebViewUpdateService.getCurrentWebViewPackageName();
778             if (value == null) {
779                 value = "";
780             }
781
782             for (int i = 0; i < values.size(); i++) {
783                 if (value.contentEquals(values.get(i))) {
784                     mWebViewProvider.setValueIndex(i);
785                     return;
786                 }
787             }
788         } catch(RemoteException e) {
789         }
790     }
791
792     private void updateWebViewMultiprocessOptions() {
793         updateSwitchPreference(mWebViewMultiprocess,
794                 Settings.Global.getInt(getActivity().getContentResolver(),
795                         Settings.Global.WEBVIEW_MULTIPROCESS, 0) != 0);
796     }
797
798     private void writeWebViewMultiprocessOptions() {
799         boolean value = mWebViewMultiprocess.isChecked();
800         Settings.Global.putInt(getActivity().getContentResolver(),
801                 Settings.Global.WEBVIEW_MULTIPROCESS, value ? 1 : 0);
802
803         try {
804             String wv_package = mWebViewUpdateService.getCurrentWebViewPackageName();
805             ActivityManagerNative.getDefault().killPackageDependents(
806                     wv_package, UserHandle.USER_ALL);
807         } catch(RemoteException e) {
808         }
809     }
810
811     private void updateHdcpValues() {
812         ListPreference hdcpChecking = (ListPreference) findPreference(HDCP_CHECKING_KEY);
813         if (hdcpChecking != null) {
814             String currentValue = SystemProperties.get(HDCP_CHECKING_PROPERTY);
815             String[] values = getResources().getStringArray(R.array.hdcp_checking_values);
816             String[] summaries = getResources().getStringArray(R.array.hdcp_checking_summaries);
817             int index = 1; // Defaults to drm-only. Needs to match with R.array.hdcp_checking_values
818             for (int i = 0; i < values.length; i++) {
819                 if (currentValue.equals(values[i])) {
820                     index = i;
821                     break;
822                 }
823             }
824             hdcpChecking.setValue(values[index]);
825             hdcpChecking.setSummary(summaries[index]);
826             hdcpChecking.setOnPreferenceChangeListener(this);
827         }
828     }
829
830     private void updatePasswordSummary() {
831         try {
832             if (mBackupManager.hasBackupPassword()) {
833                 mPassword.setSummary(R.string.local_backup_password_summary_change);
834             } else {
835                 mPassword.setSummary(R.string.local_backup_password_summary_none);
836             }
837         } catch (RemoteException e) {
838             // Not much we can do here
839         }
840     }
841
842     private void writeBtHciSnoopLogOptions() {
843         BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
844         adapter.configHciSnoopLog(mBtHciSnoopLog.isChecked());
845         Settings.Secure.putInt(getActivity().getContentResolver(),
846                 Settings.Secure.BLUETOOTH_HCI_LOG,
847                 mBtHciSnoopLog.isChecked() ? 1 : 0);
848     }
849
850     private boolean writeWebViewProviderOptions(Object newValue) {
851         try {
852             String updatedProvider = mWebViewUpdateService.changeProviderAndSetting(
853                     newValue == null ? "" : newValue.toString());
854             updateWebViewProviderOptions();
855             return newValue != null && newValue.equals(updatedProvider);
856         } catch(RemoteException e) {
857         }
858         return false;
859     }
860
861     private void writeDebuggerOptions() {
862         try {
863             ActivityManagerNative.getDefault().setDebugApp(
864                 mDebugApp, mWaitForDebugger.isChecked(), true);
865         } catch (RemoteException ex) {
866         }
867     }
868
869     private void writeMockLocation() {
870         AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
871
872         // Disable the app op of the previous mock location app if such.
873         List<PackageOps> packageOps = appOpsManager.getPackagesForOps(MOCK_LOCATION_APP_OPS);
874         if (packageOps != null) {
875             // Should be one but in case we are in a bad state due to use of command line tools.
876             for (PackageOps packageOp : packageOps) {
877                 if (packageOp.getOps().get(0).getMode() != AppOpsManager.MODE_ERRORED) {
878                     String oldMockLocationApp = packageOp.getPackageName();
879                     try {
880                         ApplicationInfo ai = getActivity().getPackageManager().getApplicationInfo(
881                                 oldMockLocationApp, PackageManager.GET_DISABLED_COMPONENTS);
882                         appOpsManager.setMode(AppOpsManager.OP_MOCK_LOCATION, ai.uid,
883                                 oldMockLocationApp, AppOpsManager.MODE_ERRORED);
884                     } catch (NameNotFoundException e) {
885                         /* ignore */
886                     }
887                 }
888             }
889         }
890
891         // Enable the app op of the new mock location app if such.
892         if (!TextUtils.isEmpty(mMockLocationApp)) {
893             try {
894                 ApplicationInfo ai = getActivity().getPackageManager().getApplicationInfo(
895                         mMockLocationApp, PackageManager.GET_DISABLED_COMPONENTS);
896                 appOpsManager.setMode(AppOpsManager.OP_MOCK_LOCATION, ai.uid,
897                         mMockLocationApp, AppOpsManager.MODE_ALLOWED);
898             } catch (NameNotFoundException e) {
899                 /* ignore */
900             }
901         }
902     }
903
904     private static void resetDebuggerOptions() {
905         try {
906             ActivityManagerNative.getDefault().setDebugApp(
907                     null, false, true);
908         } catch (RemoteException ex) {
909         }
910     }
911
912     private void updateDebuggerOptions() {
913         mDebugApp = Settings.Global.getString(
914                 getActivity().getContentResolver(), Settings.Global.DEBUG_APP);
915         updateSwitchPreference(mWaitForDebugger, Settings.Global.getInt(
916                 getActivity().getContentResolver(), Settings.Global.WAIT_FOR_DEBUGGER, 0) != 0);
917         if (mDebugApp != null && mDebugApp.length() > 0) {
918             String label;
919             try {
920                 ApplicationInfo ai = getActivity().getPackageManager().getApplicationInfo(mDebugApp,
921                         PackageManager.GET_DISABLED_COMPONENTS);
922                 CharSequence lab = getActivity().getPackageManager().getApplicationLabel(ai);
923                 label = lab != null ? lab.toString() : mDebugApp;
924             } catch (PackageManager.NameNotFoundException e) {
925                 label = mDebugApp;
926             }
927             mDebugAppPref.setSummary(getResources().getString(R.string.debug_app_set, label));
928             mWaitForDebugger.setEnabled(true);
929             mHaveDebugSettings = true;
930         } else {
931             mDebugAppPref.setSummary(getResources().getString(R.string.debug_app_not_set));
932             mWaitForDebugger.setEnabled(false);
933         }
934     }
935
936     private void updateMockLocation() {
937         AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
938
939         List<PackageOps> packageOps = appOpsManager.getPackagesForOps(MOCK_LOCATION_APP_OPS);
940         if (packageOps != null) {
941             for (PackageOps packageOp : packageOps) {
942                 if (packageOp.getOps().get(0).getMode() == AppOpsManager.MODE_ALLOWED) {
943                     mMockLocationApp = packageOps.get(0).getPackageName();
944                     break;
945                 }
946             }
947         }
948
949         if (!TextUtils.isEmpty(mMockLocationApp)) {
950             String label = mMockLocationApp;
951             try {
952                 ApplicationInfo ai = getActivity().getPackageManager().getApplicationInfo(
953                         mMockLocationApp, PackageManager.GET_DISABLED_COMPONENTS);
954                 CharSequence appLabel = getPackageManager().getApplicationLabel(ai);
955                 if (appLabel != null) {
956                     label = appLabel.toString();
957                 }
958             } catch (PackageManager.NameNotFoundException e) {
959                 /* ignore */
960             }
961
962             mMockLocationAppPref.setSummary(getString(R.string.mock_location_app_set, label));
963             mHaveDebugSettings = true;
964         } else {
965             mMockLocationAppPref.setSummary(getString(R.string.mock_location_app_not_set));
966         }
967     }
968
969     private void updateVerifyAppsOverUsbOptions() {
970         updateSwitchPreference(mVerifyAppsOverUsb, Settings.Global.getInt(getActivity().getContentResolver(),
971                 Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB, 1) != 0);
972         mVerifyAppsOverUsb.setEnabled(enableVerifierSetting());
973     }
974
975     private void writeVerifyAppsOverUsbOptions() {
976         Settings.Global.putInt(getActivity().getContentResolver(),
977                 Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB,
978                 mVerifyAppsOverUsb.isChecked() ? 1 : 0);
979     }
980
981     private void updateOtaDisableAutomaticUpdateOptions() {
982         // We use the "disabled status" in code, but show the opposite text
983         // "Automatic system updates" on screen. So a value 0 indicates the
984         // automatic update is enabled.
985         updateSwitchPreference(mOtaDisableAutomaticUpdate, Settings.Global.getInt(
986                 getActivity().getContentResolver(),
987                 Settings.Global.OTA_DISABLE_AUTOMATIC_UPDATE, 0) != 1);
988     }
989
990     private void writeOtaDisableAutomaticUpdateOptions() {
991         // We use the "disabled status" in code, but show the opposite text
992         // "Automatic system updates" on screen. So a value 0 indicates the
993         // automatic update is enabled.
994         Settings.Global.putInt(getActivity().getContentResolver(),
995                 Settings.Global.OTA_DISABLE_AUTOMATIC_UPDATE,
996                 mOtaDisableAutomaticUpdate.isChecked() ? 0 : 1);
997     }
998
999     private boolean enableVerifierSetting() {
1000         final ContentResolver cr = getActivity().getContentResolver();
1001         if (Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) == 0) {
1002             return false;
1003         }
1004         if (Settings.Global.getInt(cr, Settings.Global.PACKAGE_VERIFIER_ENABLE, 1) == 0) {
1005             return false;
1006         } else {
1007             final PackageManager pm = getActivity().getPackageManager();
1008             final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION);
1009             verification.setType(PACKAGE_MIME_TYPE);
1010             verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
1011             final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(verification, 0);
1012             if (receivers.size() == 0) {
1013                 return false;
1014             }
1015         }
1016         return true;
1017     }
1018
1019     private boolean showVerifierSetting() {
1020         return Settings.Global.getInt(getActivity().getContentResolver(),
1021                 Settings.Global.PACKAGE_VERIFIER_SETTING_VISIBLE, 1) > 0;
1022     }
1023
1024     private static boolean showEnableOemUnlockPreference() {
1025         return !SystemProperties.get(PERSISTENT_DATA_BLOCK_PROP).equals("");
1026     }
1027
1028     private boolean enableOemUnlockPreference() {
1029         return !isBootloaderUnlocked() && isOemUnlockAllowed();
1030     }
1031
1032     private void updateOemUnlockOptions() {
1033         if (mEnableOemUnlock != null) {
1034             updateSwitchPreference(mEnableOemUnlock, Utils.isOemUnlockEnabled(getActivity()));
1035             updateOemUnlockSettingDescription();
1036             // Showing mEnableOemUnlock preference as device has persistent data block.
1037             mEnableOemUnlock.setDisabledByAdmin(null);
1038             mEnableOemUnlock.setEnabled(enableOemUnlockPreference());
1039             if (mEnableOemUnlock.isEnabled()) {
1040                 // Check restriction, disable mEnableOemUnlock and apply policy transparency.
1041                 mEnableOemUnlock.checkRestrictionAndSetDisabled(UserManager.DISALLOW_FACTORY_RESET);
1042             }
1043             if (mEnableOemUnlock.isEnabled()) {
1044                 // Check restriction, disable mEnableOemUnlock and apply policy transparency.
1045                 mEnableOemUnlock.checkRestrictionAndSetDisabled(UserManager.DISALLOW_OEM_UNLOCK);
1046             }
1047         }
1048     }
1049
1050     private void updateBugreportOptions() {
1051         mBugreport.setEnabled(true);
1052         mBugreportInPower.setEnabled(true);
1053         setBugreportStorageProviderStatus();
1054     }
1055
1056     private void setBugreportStorageProviderStatus() {
1057         final ComponentName componentName = new ComponentName("com.android.shell",
1058                 "com.android.shell.BugreportStorageProvider");
1059         final boolean enabled = mBugreportInPower.isChecked();
1060         getPackageManager().setComponentEnabledSetting(componentName,
1061                 enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
1062                         : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
1063                 0);
1064     }
1065
1066     // Returns the current state of the system property that controls
1067     // strictmode flashes.  One of:
1068     //    0: not explicitly set one way or another
1069     //    1: on
1070     //    2: off
1071     private static int currentStrictModeActiveIndex() {
1072         if (TextUtils.isEmpty(SystemProperties.get(StrictMode.VISUAL_PROPERTY))) {
1073             return 0;
1074         }
1075         boolean enabled = SystemProperties.getBoolean(StrictMode.VISUAL_PROPERTY, false);
1076         return enabled ? 1 : 2;
1077     }
1078
1079     private void writeStrictModeVisualOptions() {
1080         try {
1081             mWindowManager.setStrictModeVisualIndicatorPreference(mStrictMode.isChecked()
1082                     ? "1" : "");
1083         } catch (RemoteException e) {
1084         }
1085     }
1086
1087     private void updateStrictModeVisualOptions() {
1088         updateSwitchPreference(mStrictMode, currentStrictModeActiveIndex() == 1);
1089     }
1090
1091     private void writePointerLocationOptions() {
1092         Settings.System.putInt(getActivity().getContentResolver(),
1093                 Settings.System.POINTER_LOCATION, mPointerLocation.isChecked() ? 1 : 0);
1094     }
1095
1096     private void updatePointerLocationOptions() {
1097         updateSwitchPreference(mPointerLocation,
1098                 Settings.System.getInt(getActivity().getContentResolver(),
1099                         Settings.System.POINTER_LOCATION, 0) != 0);
1100     }
1101
1102     private void writeShowTouchesOptions() {
1103         Settings.System.putInt(getActivity().getContentResolver(),
1104                 Settings.System.SHOW_TOUCHES, mShowTouches.isChecked() ? 1 : 0);
1105     }
1106
1107     private void updateShowTouchesOptions() {
1108         updateSwitchPreference(mShowTouches,
1109                 Settings.System.getInt(getActivity().getContentResolver(),
1110                         Settings.System.SHOW_TOUCHES, 0) != 0);
1111     }
1112
1113     private void updateFlingerOptions() {
1114         // magic communication with surface flinger.
1115         try {
1116             IBinder flinger = ServiceManager.getService("SurfaceFlinger");
1117             if (flinger != null) {
1118                 Parcel data = Parcel.obtain();
1119                 Parcel reply = Parcel.obtain();
1120                 data.writeInterfaceToken("android.ui.ISurfaceComposer");
1121                 flinger.transact(1010, data, reply, 0);
1122                 @SuppressWarnings("unused")
1123                 int showCpu = reply.readInt();
1124                 @SuppressWarnings("unused")
1125                 int enableGL = reply.readInt();
1126                 int showUpdates = reply.readInt();
1127                 updateSwitchPreference(mShowScreenUpdates, showUpdates != 0);
1128                 @SuppressWarnings("unused")
1129                 int showBackground = reply.readInt();
1130                 int disableOverlays = reply.readInt();
1131                 updateSwitchPreference(mDisableOverlays, disableOverlays != 0);
1132                 reply.recycle();
1133                 data.recycle();
1134             }
1135         } catch (RemoteException ex) {
1136         }
1137     }
1138
1139     private void writeShowUpdatesOption() {
1140         try {
1141             IBinder flinger = ServiceManager.getService("SurfaceFlinger");
1142             if (flinger != null) {
1143                 Parcel data = Parcel.obtain();
1144                 data.writeInterfaceToken("android.ui.ISurfaceComposer");
1145                 final int showUpdates = mShowScreenUpdates.isChecked() ? 1 : 0;
1146                 data.writeInt(showUpdates);
1147                 flinger.transact(1002, data, null, 0);
1148                 data.recycle();
1149
1150                 updateFlingerOptions();
1151             }
1152         } catch (RemoteException ex) {
1153         }
1154     }
1155
1156     private void writeDisableOverlaysOption() {
1157         try {
1158             IBinder flinger = ServiceManager.getService("SurfaceFlinger");
1159             if (flinger != null) {
1160                 Parcel data = Parcel.obtain();
1161                 data.writeInterfaceToken("android.ui.ISurfaceComposer");
1162                 final int disableOverlays = mDisableOverlays.isChecked() ? 1 : 0;
1163                 data.writeInt(disableOverlays);
1164                 flinger.transact(1008, data, null, 0);
1165                 data.recycle();
1166
1167                 updateFlingerOptions();
1168             }
1169         } catch (RemoteException ex) {
1170         }
1171     }
1172
1173     private void updateHardwareUiOptions() {
1174         updateSwitchPreference(mForceHardwareUi,
1175                 SystemProperties.getBoolean(HARDWARE_UI_PROPERTY, false));
1176     }
1177
1178     private void writeHardwareUiOptions() {
1179         SystemProperties.set(HARDWARE_UI_PROPERTY, mForceHardwareUi.isChecked() ? "true" : "false");
1180         pokeSystemProperties();
1181     }
1182
1183     private void updateMsaaOptions() {
1184         updateSwitchPreference(mForceMsaa, SystemProperties.getBoolean(MSAA_PROPERTY, false));
1185     }
1186
1187     private void writeMsaaOptions() {
1188         SystemProperties.set(MSAA_PROPERTY, mForceMsaa.isChecked() ? "true" : "false");
1189         pokeSystemProperties();
1190     }
1191
1192     private void updateTrackFrameTimeOptions() {
1193         String value = SystemProperties.get(ThreadedRenderer.PROFILE_PROPERTY);
1194         if (value == null) {
1195             value = "";
1196         }
1197
1198         CharSequence[] values = mTrackFrameTime.getEntryValues();
1199         for (int i = 0; i < values.length; i++) {
1200             if (value.contentEquals(values[i])) {
1201                 mTrackFrameTime.setValueIndex(i);
1202                 mTrackFrameTime.setSummary(mTrackFrameTime.getEntries()[i]);
1203                 return;
1204             }
1205         }
1206         mTrackFrameTime.setValueIndex(0);
1207         mTrackFrameTime.setSummary(mTrackFrameTime.getEntries()[0]);
1208     }
1209
1210     private void writeTrackFrameTimeOptions(Object newValue) {
1211         SystemProperties.set(ThreadedRenderer.PROFILE_PROPERTY,
1212                 newValue == null ? "" : newValue.toString());
1213         pokeSystemProperties();
1214         updateTrackFrameTimeOptions();
1215     }
1216
1217     private void updateShowNonRectClipOptions() {
1218         String value = SystemProperties.get(
1219                 ThreadedRenderer.DEBUG_SHOW_NON_RECTANGULAR_CLIP_PROPERTY);
1220         if (value == null) {
1221             value = "hide";
1222         }
1223
1224         CharSequence[] values = mShowNonRectClip.getEntryValues();
1225         for (int i = 0; i < values.length; i++) {
1226             if (value.contentEquals(values[i])) {
1227                 mShowNonRectClip.setValueIndex(i);
1228                 mShowNonRectClip.setSummary(mShowNonRectClip.getEntries()[i]);
1229                 return;
1230             }
1231         }
1232         mShowNonRectClip.setValueIndex(0);
1233         mShowNonRectClip.setSummary(mShowNonRectClip.getEntries()[0]);
1234     }
1235
1236     private void writeShowNonRectClipOptions(Object newValue) {
1237         SystemProperties.set(ThreadedRenderer.DEBUG_SHOW_NON_RECTANGULAR_CLIP_PROPERTY,
1238                 newValue == null ? "" : newValue.toString());
1239         pokeSystemProperties();
1240         updateShowNonRectClipOptions();
1241     }
1242
1243     private void updateShowHwScreenUpdatesOptions() {
1244         updateSwitchPreference(mShowHwScreenUpdates,
1245                 SystemProperties.getBoolean(ThreadedRenderer.DEBUG_DIRTY_REGIONS_PROPERTY, false));
1246     }
1247
1248     private void writeShowHwScreenUpdatesOptions() {
1249         SystemProperties.set(ThreadedRenderer.DEBUG_DIRTY_REGIONS_PROPERTY,
1250                 mShowHwScreenUpdates.isChecked() ? "true" : null);
1251         pokeSystemProperties();
1252     }
1253
1254     private void updateShowHwLayersUpdatesOptions() {
1255         updateSwitchPreference(mShowHwLayersUpdates, SystemProperties.getBoolean(
1256                 ThreadedRenderer.DEBUG_SHOW_LAYERS_UPDATES_PROPERTY, false));
1257     }
1258
1259     private void writeShowHwLayersUpdatesOptions() {
1260         SystemProperties.set(ThreadedRenderer.DEBUG_SHOW_LAYERS_UPDATES_PROPERTY,
1261                 mShowHwLayersUpdates.isChecked() ? "true" : null);
1262         pokeSystemProperties();
1263     }
1264
1265     private void updateDebugHwOverdrawOptions() {
1266         String value = SystemProperties.get(ThreadedRenderer.DEBUG_OVERDRAW_PROPERTY);
1267         if (value == null) {
1268             value = "";
1269         }
1270
1271         CharSequence[] values = mDebugHwOverdraw.getEntryValues();
1272         for (int i = 0; i < values.length; i++) {
1273             if (value.contentEquals(values[i])) {
1274                 mDebugHwOverdraw.setValueIndex(i);
1275                 mDebugHwOverdraw.setSummary(mDebugHwOverdraw.getEntries()[i]);
1276                 return;
1277             }
1278         }
1279         mDebugHwOverdraw.setValueIndex(0);
1280         mDebugHwOverdraw.setSummary(mDebugHwOverdraw.getEntries()[0]);
1281     }
1282
1283     private void writeDebugHwOverdrawOptions(Object newValue) {
1284         SystemProperties.set(ThreadedRenderer.DEBUG_OVERDRAW_PROPERTY,
1285                 newValue == null ? "" : newValue.toString());
1286         pokeSystemProperties();
1287         updateDebugHwOverdrawOptions();
1288     }
1289
1290     private void updateDebugLayoutOptions() {
1291         updateSwitchPreference(mDebugLayout,
1292                 SystemProperties.getBoolean(View.DEBUG_LAYOUT_PROPERTY, false));
1293     }
1294
1295     private void writeDebugLayoutOptions() {
1296         SystemProperties.set(View.DEBUG_LAYOUT_PROPERTY,
1297                 mDebugLayout.isChecked() ? "true" : "false");
1298         pokeSystemProperties();
1299     }
1300
1301     private void updateSimulateColorSpace() {
1302         final ContentResolver cr = getContentResolver();
1303         final boolean enabled = Settings.Secure.getInt(
1304                 cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0) != 0;
1305         if (enabled) {
1306             final String mode = Integer.toString(Settings.Secure.getInt(
1307                     cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER,
1308                     AccessibilityManager.DALTONIZER_DISABLED));
1309             mSimulateColorSpace.setValue(mode);
1310             final int index = mSimulateColorSpace.findIndexOfValue(mode);
1311             if (index < 0) {
1312                 // We're using a mode controlled by accessibility preferences.
1313                 mSimulateColorSpace.setSummary(getString(R.string.daltonizer_type_overridden,
1314                         getString(R.string.accessibility_display_daltonizer_preference_title)));
1315             } else {
1316                 mSimulateColorSpace.setSummary("%s");
1317             }
1318         } else {
1319             mSimulateColorSpace.setValue(
1320                     Integer.toString(AccessibilityManager.DALTONIZER_DISABLED));
1321         }
1322     }
1323
1324     /**
1325      * @return <code>true</code> if the color space preference is currently
1326      *         controlled by development settings
1327      */
1328     private boolean usingDevelopmentColorSpace() {
1329         final ContentResolver cr = getContentResolver();
1330         final boolean enabled = Settings.Secure.getInt(
1331                 cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0) != 0;
1332         if (enabled) {
1333             final String mode = Integer.toString(Settings.Secure.getInt(
1334                     cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER,
1335                     AccessibilityManager.DALTONIZER_DISABLED));
1336             final int index = mSimulateColorSpace.findIndexOfValue(mode);
1337             if (index >= 0) {
1338                 // We're using a mode controlled by developer preferences.
1339                 return true;
1340             }
1341         }
1342         return false;
1343     }
1344
1345     private void writeSimulateColorSpace(Object value) {
1346         final ContentResolver cr = getContentResolver();
1347         final int newMode = Integer.parseInt(value.toString());
1348         if (newMode < 0) {
1349             Settings.Secure.putInt(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0);
1350         } else {
1351             Settings.Secure.putInt(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 1);
1352             Settings.Secure.putInt(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, newMode);
1353         }
1354     }
1355
1356     private void updateColorTemperature() {
1357         updateSwitchPreference(mColorTemperaturePreference,
1358                 SystemProperties.getBoolean(COLOR_TEMPERATURE_PROPERTY, false));
1359     }
1360
1361     private void writeColorTemperature() {
1362         SystemProperties.set(COLOR_TEMPERATURE_PROPERTY,
1363                 mColorTemperaturePreference.isChecked() ? "1" : "0");
1364         pokeSystemProperties();
1365         Toast.makeText(getActivity(), R.string.color_temperature_toast, Toast.LENGTH_LONG).show();
1366     }
1367
1368     private void updateUSBAudioOptions() {
1369         updateSwitchPreference(mUSBAudio, Settings.Secure.getInt(getContentResolver(),
1370                 Settings.Secure.USB_AUDIO_AUTOMATIC_ROUTING_DISABLED, 0) != 0);
1371     }
1372
1373     private void writeUSBAudioOptions() {
1374         Settings.Secure.putInt(getContentResolver(),
1375                 Settings.Secure.USB_AUDIO_AUTOMATIC_ROUTING_DISABLED,
1376                 mUSBAudio.isChecked() ? 1 : 0);
1377     }
1378
1379     private void updateForceResizableOptions() {
1380         updateSwitchPreference(mForceResizable, Settings.Global.getInt(getContentResolver(),
1381                 Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES, 0) != 0);
1382     }
1383
1384     private void writeForceResizableOptions() {
1385         Settings.Global.putInt(getContentResolver(),
1386                 Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES,
1387                 mForceResizable.isChecked() ? 1 : 0);
1388     }
1389
1390     private void updateForceRtlOptions() {
1391         updateSwitchPreference(mForceRtlLayout,
1392                 Settings.Global.getInt(getActivity().getContentResolver(),
1393                         Settings.Global.DEVELOPMENT_FORCE_RTL, 0) != 0);
1394     }
1395
1396     private void writeForceRtlOptions() {
1397         boolean value = mForceRtlLayout.isChecked();
1398         Settings.Global.putInt(getActivity().getContentResolver(),
1399                 Settings.Global.DEVELOPMENT_FORCE_RTL, value ? 1 : 0);
1400         SystemProperties.set(Settings.Global.DEVELOPMENT_FORCE_RTL, value ? "1" : "0");
1401         LocalePicker.updateLocale(getActivity().getResources().getConfiguration().locale);
1402     }
1403
1404     private void updateWifiDisplayCertificationOptions() {
1405         updateSwitchPreference(mWifiDisplayCertification, Settings.Global.getInt(
1406                 getActivity().getContentResolver(),
1407                 Settings.Global.WIFI_DISPLAY_CERTIFICATION_ON, 0) != 0);
1408     }
1409
1410     private void writeWifiDisplayCertificationOptions() {
1411         Settings.Global.putInt(getActivity().getContentResolver(),
1412                 Settings.Global.WIFI_DISPLAY_CERTIFICATION_ON,
1413                 mWifiDisplayCertification.isChecked() ? 1 : 0);
1414     }
1415
1416     private void updateWifiVerboseLoggingOptions() {
1417         boolean enabled = mWifiManager.getVerboseLoggingLevel() > 0;
1418         updateSwitchPreference(mWifiVerboseLogging, enabled);
1419     }
1420
1421     private void writeWifiVerboseLoggingOptions() {
1422         mWifiManager.enableVerboseLogging(mWifiVerboseLogging.isChecked() ? 1 : 0);
1423     }
1424
1425     private void updateWifiAggressiveHandoverOptions() {
1426         boolean enabled = mWifiManager.getAggressiveHandover() > 0;
1427         updateSwitchPreference(mWifiAggressiveHandover, enabled);
1428     }
1429
1430     private void writeWifiAggressiveHandoverOptions() {
1431         mWifiManager.enableAggressiveHandover(mWifiAggressiveHandover.isChecked() ? 1 : 0);
1432     }
1433
1434     private void updateWifiAllowScansWithTrafficOptions() {
1435         boolean enabled = mWifiManager.getAllowScansWithTraffic() > 0;
1436         updateSwitchPreference(mWifiAllowScansWithTraffic, enabled);
1437     }
1438
1439     private void writeWifiAllowScansWithTrafficOptions() {
1440         mWifiManager.setAllowScansWithTraffic(mWifiAllowScansWithTraffic.isChecked() ? 1 : 0);
1441     }
1442
1443     private void updateBluetoothDisableAbsVolumeOptions() {
1444         updateSwitchPreference(mBluetoothDisableAbsVolume,
1445                 SystemProperties.getBoolean(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_PROPERTY, false));
1446     }
1447
1448     private void writeBluetoothDisableAbsVolumeOptions() {
1449         SystemProperties.set(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_PROPERTY,
1450                 mBluetoothDisableAbsVolume.isChecked() ? "true" : "false");
1451     }
1452
1453     private void updateMobileDataAlwaysOnOptions() {
1454         updateSwitchPreference(mMobileDataAlwaysOn, Settings.Global.getInt(
1455                 getActivity().getContentResolver(),
1456                 Settings.Global.MOBILE_DATA_ALWAYS_ON, 0) != 0);
1457     }
1458
1459     private void writeMobileDataAlwaysOnOptions() {
1460         Settings.Global.putInt(getActivity().getContentResolver(),
1461                 Settings.Global.MOBILE_DATA_ALWAYS_ON,
1462                 mMobileDataAlwaysOn.isChecked() ? 1 : 0);
1463     }
1464
1465     private String defaultLogdSizeValue() {
1466         String defaultValue = SystemProperties.get(SELECT_LOGD_DEFAULT_SIZE_PROPERTY);
1467         if ((defaultValue == null) || (defaultValue.length() == 0)) {
1468             if (SystemProperties.get("ro.config.low_ram").equals("true")) {
1469                 defaultValue = SELECT_LOGD_SVELTE_DEFAULT_SIZE_VALUE;
1470             } else {
1471                 defaultValue = SELECT_LOGD_DEFAULT_SIZE_VALUE;
1472             }
1473         }
1474         return defaultValue;
1475     }
1476
1477     private void updateLogdSizeValues() {
1478         if (mLogdSize != null) {
1479             String currentTag = SystemProperties.get(SELECT_LOGD_TAG_PROPERTY);
1480             String currentValue = SystemProperties.get(SELECT_LOGD_SIZE_PROPERTY);
1481             if ((currentTag != null) && currentTag.startsWith(SELECT_LOGD_TAG_SILENCE)) {
1482                 currentValue = SELECT_LOGD_OFF_SIZE_MARKER_VALUE;
1483             }
1484             if (mLogpersist != null) {
1485                 String currentLogpersistEnable
1486                     = SystemProperties.get(ACTUAL_LOGPERSIST_PROPERTY_ENABLE);
1487                 if ((currentLogpersistEnable == null)
1488                         || !currentLogpersistEnable.equals("true")
1489                         || currentValue.equals(SELECT_LOGD_OFF_SIZE_MARKER_VALUE)) {
1490                     writeLogpersistOption(null, true);
1491                     mLogpersist.setEnabled(false);
1492                 } else if (mLastEnabledState) {
1493                     mLogpersist.setEnabled(true);
1494                 }
1495             }
1496             if ((currentValue == null) || (currentValue.length() == 0)) {
1497                 currentValue = defaultLogdSizeValue();
1498             }
1499             String[] values = getResources().getStringArray(R.array.select_logd_size_values);
1500             String[] titles = getResources().getStringArray(R.array.select_logd_size_titles);
1501             int index = 2; // punt to second entry if not found
1502             if (SystemProperties.get("ro.config.low_ram").equals("true")) {
1503                 mLogdSize.setEntries(R.array.select_logd_size_lowram_titles);
1504                 titles = getResources().getStringArray(R.array.select_logd_size_lowram_titles);
1505                 index = 1;
1506             }
1507             String[] summaries = getResources().getStringArray(R.array.select_logd_size_summaries);
1508             for (int i = 0; i < titles.length; i++) {
1509                 if (currentValue.equals(values[i])
1510                         || currentValue.equals(titles[i])) {
1511                     index = i;
1512                     break;
1513                 }
1514             }
1515             mLogdSize.setValue(values[index]);
1516             mLogdSize.setSummary(summaries[index]);
1517             mLogdSize.setOnPreferenceChangeListener(this);
1518         }
1519     }
1520
1521     private void writeLogdSizeOption(Object newValue) {
1522         boolean disable = (newValue != null) &&
1523             (newValue.toString().equals(SELECT_LOGD_OFF_SIZE_MARKER_VALUE));
1524         String currentTag = SystemProperties.get(SELECT_LOGD_TAG_PROPERTY);
1525         if (currentTag == null) {
1526             currentTag = "";
1527         }
1528         // filter clean and unstack all references to our setting
1529         String newTag = currentTag.replaceAll(
1530                 ",+" + SELECT_LOGD_TAG_SILENCE, "").replaceFirst(
1531                 "^" + SELECT_LOGD_TAG_SILENCE + ",*", "").replaceAll(
1532                 ",+", ",").replaceFirst(
1533                 ",+$", "");
1534         if (disable) {
1535             newValue = SELECT_LOGD_MINIMUM_SIZE_VALUE;
1536             // Make sure snet_event_log get through first, but do not override
1537             String snetValue = SystemProperties.get(SELECT_LOGD_SNET_TAG_PROPERTY);
1538             if ((snetValue == null) || (snetValue.length() == 0)) {
1539                 snetValue = SystemProperties.get(SELECT_LOGD_RUNTIME_SNET_TAG_PROPERTY);
1540                 if ((snetValue == null) || (snetValue.length() == 0)) {
1541                     SystemProperties.set(SELECT_LOGD_SNET_TAG_PROPERTY, "I");
1542                 }
1543             }
1544             // Silence all log sources, security logs notwithstanding
1545             if (newTag.length() != 0) {
1546                 newTag = "," + newTag;
1547             }
1548             // Stack settings, stack to help preserve original value
1549             newTag = SELECT_LOGD_TAG_SILENCE + newTag;
1550         }
1551         if (!newTag.equals(currentTag)) {
1552             SystemProperties.set(SELECT_LOGD_TAG_PROPERTY, newTag);
1553         }
1554         String defaultValue = defaultLogdSizeValue();
1555         final String size = ((newValue != null) && (newValue.toString().length() != 0)) ?
1556             newValue.toString() : defaultValue;
1557         SystemProperties.set(SELECT_LOGD_SIZE_PROPERTY, defaultValue.equals(size) ? "" : size);
1558         SystemProperties.set("ctl.start", "logd-reinit");
1559         pokeSystemProperties();
1560         updateLogdSizeValues();
1561     }
1562
1563     private void updateLogpersistValues() {
1564         if (mLogpersist == null) {
1565             return;
1566         }
1567         String currentValue = SystemProperties.get(ACTUAL_LOGPERSIST_PROPERTY);
1568         if (currentValue == null) {
1569             currentValue = "";
1570         }
1571         String currentBuffers = SystemProperties.get(ACTUAL_LOGPERSIST_PROPERTY_BUFFER);
1572         if ((currentBuffers == null) || (currentBuffers.length() == 0)) {
1573             currentBuffers = "all";
1574         }
1575         int index = 0;
1576         if (currentValue.equals(SELECT_LOGPERSIST_PROPERTY_SERVICE)) {
1577             index = 1;
1578             if (currentBuffers.equals("kernel")) {
1579                 index = 3;
1580             } else if (!currentBuffers.equals("all") &&
1581                     !currentBuffers.contains("radio") &&
1582                     currentBuffers.contains("security") &&
1583                     currentBuffers.contains("kernel")) {
1584                 index = 2;
1585                 if (!currentBuffers.contains("default")) {
1586                     String[] contains = { "main", "events", "system", "crash" };
1587                     for (int i = 0; i < contains.length; i++) {
1588                         if (!currentBuffers.contains(contains[i])) {
1589                             index = 1;
1590                             break;
1591                         }
1592                     }
1593                 }
1594             }
1595         }
1596         mLogpersist.setValue(getResources().getStringArray(R.array.select_logpersist_values)[index]);
1597         mLogpersist.setSummary(getResources().getStringArray(R.array.select_logpersist_summaries)[index]);
1598         mLogpersist.setOnPreferenceChangeListener(this);
1599         if (index != 0) {
1600             mLogpersistCleared = false;
1601         } else if (!mLogpersistCleared) {
1602             // would File.delete() directly but need to switch uid/gid to access
1603             SystemProperties.set(ACTUAL_LOGPERSIST_PROPERTY, SELECT_LOGPERSIST_PROPERTY_CLEAR);
1604             pokeSystemProperties();
1605             mLogpersistCleared = true;
1606         }
1607     }
1608
1609     private void setLogpersistOff(boolean update) {
1610         SystemProperties.set(SELECT_LOGPERSIST_PROPERTY_BUFFER, "");
1611         // deal with trampoline of empty properties
1612         SystemProperties.set(ACTUAL_LOGPERSIST_PROPERTY_BUFFER, "");
1613         SystemProperties.set(SELECT_LOGPERSIST_PROPERTY, "");
1614         SystemProperties.set(ACTUAL_LOGPERSIST_PROPERTY,
1615             update ? "" : SELECT_LOGPERSIST_PROPERTY_STOP);
1616         pokeSystemProperties();
1617         if (update) {
1618             updateLogpersistValues();
1619         } else {
1620             for (int i = 0; i < 3; i++) {
1621                 String currentValue = SystemProperties.get(ACTUAL_LOGPERSIST_PROPERTY);
1622                 if ((currentValue == null) || currentValue.equals("")) {
1623                     break;
1624                 }
1625                 try {
1626                     Thread.sleep(100);
1627                 } catch (InterruptedException e) {
1628                 }
1629             }
1630         }
1631     }
1632
1633     private void writeLogpersistOption(Object newValue, boolean skipWarning) {
1634         if (mLogpersist == null) {
1635             return;
1636         }
1637         String currentTag = SystemProperties.get(SELECT_LOGD_TAG_PROPERTY);
1638         if ((currentTag != null) && currentTag.startsWith(SELECT_LOGD_TAG_SILENCE)) {
1639             newValue = null;
1640             skipWarning = true;
1641         }
1642
1643         if ((newValue == null) || newValue.toString().equals("")) {
1644             if (skipWarning) {
1645                 mLogpersistCleared = false;
1646             } else if (!mLogpersistCleared) {
1647                 // if transitioning from on to off, pop up an are you sure?
1648                 String currentValue = SystemProperties.get(ACTUAL_LOGPERSIST_PROPERTY);
1649                 if ((currentValue != null) &&
1650                         currentValue.equals(SELECT_LOGPERSIST_PROPERTY_SERVICE)) {
1651                     if (mLogpersistClearDialog != null) dismissDialogs();
1652                     mLogpersistClearDialog = new AlertDialog.Builder(getActivity()).setMessage(
1653                             getActivity().getResources().getString(
1654                                     R.string.dev_logpersist_clear_warning_message))
1655                             .setTitle(R.string.dev_logpersist_clear_warning_title)
1656                             .setPositiveButton(android.R.string.yes, this)
1657                             .setNegativeButton(android.R.string.no, this)
1658                             .show();
1659                     mLogpersistClearDialog.setOnDismissListener(this);
1660                     return;
1661                 }
1662             }
1663             setLogpersistOff(true);
1664             return;
1665         }
1666
1667         String currentBuffer = SystemProperties.get(ACTUAL_LOGPERSIST_PROPERTY_BUFFER);
1668         if ((currentBuffer != null) && !currentBuffer.equals(newValue.toString())) {
1669             setLogpersistOff(false);
1670         }
1671         SystemProperties.set(SELECT_LOGPERSIST_PROPERTY_BUFFER, newValue.toString());
1672         SystemProperties.set(SELECT_LOGPERSIST_PROPERTY, SELECT_LOGPERSIST_PROPERTY_SERVICE);
1673         pokeSystemProperties();
1674         for (int i = 0; i < 3; i++) {
1675             String currentValue = SystemProperties.get(ACTUAL_LOGPERSIST_PROPERTY);
1676             if ((currentValue != null)
1677                     && currentValue.equals(SELECT_LOGPERSIST_PROPERTY_SERVICE)) {
1678                 break;
1679             }
1680             try {
1681                 Thread.sleep(100);
1682             } catch (InterruptedException e) {
1683             }
1684         }
1685         updateLogpersistValues();
1686     }
1687
1688     private void updateUsbConfigurationValues() {
1689         if (mUsbConfiguration != null) {
1690             UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
1691
1692             String[] values = getResources().getStringArray(R.array.usb_configuration_values);
1693             String[] titles = getResources().getStringArray(R.array.usb_configuration_titles);
1694             int index = 0;
1695             for (int i = 0; i < titles.length; i++) {
1696                 if (manager.isFunctionEnabled(values[i])) {
1697                     index = i;
1698                     break;
1699                 }
1700             }
1701             mUsbConfiguration.setValue(values[index]);
1702             mUsbConfiguration.setSummary(titles[index]);
1703             mUsbConfiguration.setOnPreferenceChangeListener(this);
1704         }
1705     }
1706
1707     private void writeUsbConfigurationOption(Object newValue) {
1708         UsbManager manager = (UsbManager)getActivity().getSystemService(Context.USB_SERVICE);
1709         String function = newValue.toString();
1710         manager.setCurrentFunction(function);
1711         if (function.equals("none")) {
1712             manager.setUsbDataUnlocked(false);
1713         } else {
1714             manager.setUsbDataUnlocked(true);
1715         }
1716     }
1717
1718     private void writeImmediatelyDestroyActivitiesOptions() {
1719         try {
1720             ActivityManagerNative.getDefault().setAlwaysFinish(
1721                     mImmediatelyDestroyActivities.isChecked());
1722         } catch (RemoteException ex) {
1723         }
1724     }
1725
1726     private void updateImmediatelyDestroyActivitiesOptions() {
1727         updateSwitchPreference(mImmediatelyDestroyActivities, Settings.Global.getInt(
1728                 getActivity().getContentResolver(), Settings.Global.ALWAYS_FINISH_ACTIVITIES, 0) != 0);
1729     }
1730
1731     private void updateAnimationScaleValue(int which, ListPreference pref) {
1732         try {
1733             float scale = mWindowManager.getAnimationScale(which);
1734             if (scale != 1) {
1735                 mHaveDebugSettings = true;
1736             }
1737             CharSequence[] values = pref.getEntryValues();
1738             for (int i=0; i<values.length; i++) {
1739                 float val = Float.parseFloat(values[i].toString());
1740                 if (scale <= val) {
1741                     pref.setValueIndex(i);
1742                     pref.setSummary(pref.getEntries()[i]);
1743                     return;
1744                 }
1745             }
1746             pref.setValueIndex(values.length-1);
1747             pref.setSummary(pref.getEntries()[0]);
1748         } catch (RemoteException e) {
1749         }
1750     }
1751
1752     private void updateAnimationScaleOptions() {
1753         updateAnimationScaleValue(0, mWindowAnimationScale);
1754         updateAnimationScaleValue(1, mTransitionAnimationScale);
1755         updateAnimationScaleValue(2, mAnimatorDurationScale);
1756     }
1757
1758     private void writeAnimationScaleOption(int which, ListPreference pref, Object newValue) {
1759         try {
1760             float scale = newValue != null ? Float.parseFloat(newValue.toString()) : 1;
1761             mWindowManager.setAnimationScale(which, scale);
1762             updateAnimationScaleValue(which, pref);
1763         } catch (RemoteException e) {
1764         }
1765     }
1766
1767     private void updateOverlayDisplayDevicesOptions() {
1768         String value = Settings.Global.getString(getActivity().getContentResolver(),
1769                 Settings.Global.OVERLAY_DISPLAY_DEVICES);
1770         if (value == null) {
1771             value = "";
1772         }
1773
1774         CharSequence[] values = mOverlayDisplayDevices.getEntryValues();
1775         for (int i = 0; i < values.length; i++) {
1776             if (value.contentEquals(values[i])) {
1777                 mOverlayDisplayDevices.setValueIndex(i);
1778                 mOverlayDisplayDevices.setSummary(mOverlayDisplayDevices.getEntries()[i]);
1779                 return;
1780             }
1781         }
1782         mOverlayDisplayDevices.setValueIndex(0);
1783         mOverlayDisplayDevices.setSummary(mOverlayDisplayDevices.getEntries()[0]);
1784     }
1785
1786     private void writeOverlayDisplayDevicesOptions(Object newValue) {
1787         Settings.Global.putString(getActivity().getContentResolver(),
1788                 Settings.Global.OVERLAY_DISPLAY_DEVICES, (String) newValue);
1789         updateOverlayDisplayDevicesOptions();
1790     }
1791
1792     private void updateAppProcessLimitOptions() {
1793         try {
1794             int limit = ActivityManagerNative.getDefault().getProcessLimit();
1795             CharSequence[] values = mAppProcessLimit.getEntryValues();
1796             for (int i=0; i<values.length; i++) {
1797                 int val = Integer.parseInt(values[i].toString());
1798                 if (val >= limit) {
1799                     if (i != 0) {
1800                         mHaveDebugSettings = true;
1801                     }
1802                     mAppProcessLimit.setValueIndex(i);
1803                     mAppProcessLimit.setSummary(mAppProcessLimit.getEntries()[i]);
1804                     return;
1805                 }
1806             }
1807             mAppProcessLimit.setValueIndex(0);
1808             mAppProcessLimit.setSummary(mAppProcessLimit.getEntries()[0]);
1809         } catch (RemoteException e) {
1810         }
1811     }
1812
1813     private void writeAppProcessLimitOptions(Object newValue) {
1814         try {
1815             int limit = newValue != null ? Integer.parseInt(newValue.toString()) : -1;
1816             ActivityManagerNative.getDefault().setProcessLimit(limit);
1817             updateAppProcessLimitOptions();
1818         } catch (RemoteException e) {
1819         }
1820     }
1821
1822     private void writeShowAllANRsOptions() {
1823         Settings.Secure.putInt(getActivity().getContentResolver(),
1824                 Settings.Secure.ANR_SHOW_BACKGROUND,
1825                 mShowAllANRs.isChecked() ? 1 : 0);
1826     }
1827
1828     private void updateShowAllANRsOptions() {
1829         updateSwitchPreference(mShowAllANRs, Settings.Secure.getInt(
1830                 getActivity().getContentResolver(), Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0);
1831     }
1832
1833     private void confirmEnableOemUnlock() {
1834         DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
1835             @Override
1836             public void onClick(DialogInterface dialog, int which) {
1837                 if (which == DialogInterface.BUTTON_POSITIVE) {
1838                     Utils.setOemUnlockEnabled(getActivity(), true);
1839                 }
1840             }
1841         };
1842
1843         DialogInterface.OnDismissListener onDismissListener = new DialogInterface.OnDismissListener() {
1844             @Override
1845             public void onDismiss(DialogInterface dialog) {
1846                 if (getActivity() == null) {
1847                     return;
1848                 }
1849                 updateAllOptions();
1850             }
1851         };
1852
1853         new AlertDialog.Builder(getActivity())
1854                 .setTitle(R.string.confirm_enable_oem_unlock_title)
1855                 .setMessage(R.string.confirm_enable_oem_unlock_text)
1856                 .setPositiveButton(R.string.enable_text, onClickListener)
1857                 .setNegativeButton(android.R.string.cancel, null)
1858                 .setOnDismissListener(onDismissListener)
1859                 .create()
1860                 .show();
1861     }
1862
1863     @Override
1864     public void onSwitchChanged(Switch switchView, boolean isChecked) {
1865         if (switchView != mSwitchBar.getSwitch()) {
1866             return;
1867         }
1868         if (isChecked != mLastEnabledState) {
1869             if (isChecked) {
1870                 mDialogClicked = false;
1871                 if (mEnableDialog != null) dismissDialogs();
1872                 mEnableDialog = new AlertDialog.Builder(getActivity()).setMessage(
1873                         getActivity().getResources().getString(
1874                                 R.string.dev_settings_warning_message))
1875                         .setTitle(R.string.dev_settings_warning_title)
1876                         .setPositiveButton(android.R.string.yes, this)
1877                         .setNegativeButton(android.R.string.no, this)
1878                         .show();
1879                 mEnableDialog.setOnDismissListener(this);
1880             } else {
1881                 resetDangerousOptions();
1882                 Settings.Global.putInt(getActivity().getContentResolver(),
1883                         Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
1884                 mLastEnabledState = isChecked;
1885                 setPrefsEnabledState(mLastEnabledState);
1886             }
1887         }
1888     }
1889
1890     @Override
1891     public void onActivityResult(int requestCode, int resultCode, Intent data) {
1892         if (requestCode == RESULT_DEBUG_APP) {
1893             if (resultCode == Activity.RESULT_OK) {
1894                 mDebugApp = data.getAction();
1895                 writeDebuggerOptions();
1896                 updateDebuggerOptions();
1897             }
1898         } else if (requestCode == RESULT_MOCK_LOCATION_APP) {
1899             if (resultCode == Activity.RESULT_OK) {
1900                 mMockLocationApp = data.getAction();
1901                 writeMockLocation();
1902                 updateMockLocation();
1903             }
1904         } else if (requestCode == REQUEST_CODE_ENABLE_OEM_UNLOCK) {
1905             if (resultCode == Activity.RESULT_OK) {
1906                 if (mEnableOemUnlock.isChecked()) {
1907                     confirmEnableOemUnlock();
1908                 } else {
1909                     Utils.setOemUnlockEnabled(getActivity(), false);
1910                 }
1911             }
1912         } else {
1913             super.onActivityResult(requestCode, resultCode, data);
1914         }
1915     }
1916
1917     @Override
1918     public boolean onPreferenceTreeClick(Preference preference) {
1919         if (Utils.isMonkeyRunning()) {
1920             return false;
1921         }
1922
1923         if (preference == mEnableAdb) {
1924             if (mEnableAdb.isChecked()) {
1925                 mDialogClicked = false;
1926                 if (mAdbDialog != null) dismissDialogs();
1927                 mAdbDialog = new AlertDialog.Builder(getActivity()).setMessage(
1928                         getActivity().getResources().getString(R.string.adb_warning_message))
1929                         .setTitle(R.string.adb_warning_title)
1930                         .setPositiveButton(android.R.string.yes, this)
1931                         .setNegativeButton(android.R.string.no, this)
1932                         .show();
1933                 mAdbDialog.setOnDismissListener(this);
1934             } else {
1935                 Settings.Global.putInt(getActivity().getContentResolver(),
1936                         Settings.Global.ADB_ENABLED, 0);
1937                 mVerifyAppsOverUsb.setEnabled(false);
1938                 mVerifyAppsOverUsb.setChecked(false);
1939                 updateBugreportOptions();
1940             }
1941         } else if (preference == mClearAdbKeys) {
1942             if (mAdbKeysDialog != null) dismissDialogs();
1943             mAdbKeysDialog = new AlertDialog.Builder(getActivity())
1944                         .setMessage(R.string.adb_keys_warning_message)
1945                         .setPositiveButton(android.R.string.ok, this)
1946                         .setNegativeButton(android.R.string.cancel, null)
1947                         .show();
1948         } else if (preference == mEnableTerminal) {
1949             final PackageManager pm = getActivity().getPackageManager();
1950             pm.setApplicationEnabledSetting(TERMINAL_APP_PACKAGE,
1951                     mEnableTerminal.isChecked() ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
1952                             : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0);
1953         } else if (preference == mBugreportInPower) {
1954             Settings.Secure.putInt(getActivity().getContentResolver(),
1955                     Settings.Global.BUGREPORT_IN_POWER_MENU,
1956                     mBugreportInPower.isChecked() ? 1 : 0);
1957             setBugreportStorageProviderStatus();
1958         } else if (preference == mKeepScreenOn) {
1959             Settings.Global.putInt(getActivity().getContentResolver(),
1960                     Settings.Global.STAY_ON_WHILE_PLUGGED_IN,
1961                     mKeepScreenOn.isChecked() ?
1962                             (BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB) : 0);
1963         } else if (preference == mBtHciSnoopLog) {
1964             writeBtHciSnoopLogOptions();
1965         } else if (preference == mEnableOemUnlock && mEnableOemUnlock.isEnabled()) {
1966             if (mEnableOemUnlock.isChecked()) {
1967                 if (!showKeyguardConfirmation(getResources(), REQUEST_CODE_ENABLE_OEM_UNLOCK)) {
1968                     confirmEnableOemUnlock();
1969                 }
1970             } else {
1971                 Utils.setOemUnlockEnabled(getActivity(), false);
1972             }
1973         } else if (preference == mMockLocationAppPref) {
1974             Intent intent = new Intent(getActivity(), AppPicker.class);
1975             intent.putExtra(AppPicker.EXTRA_REQUESTIING_PERMISSION,
1976                     Manifest.permission.ACCESS_MOCK_LOCATION);
1977             startActivityForResult(intent, RESULT_MOCK_LOCATION_APP);
1978         } else if (preference == mDebugViewAttributes) {
1979             Settings.Global.putInt(getActivity().getContentResolver(),
1980                     Settings.Global.DEBUG_VIEW_ATTRIBUTES,
1981                     mDebugViewAttributes.isChecked() ? 1 : 0);
1982         } else if (preference == mForceAllowOnExternal) {
1983             Settings.Global.putInt(getActivity().getContentResolver(),
1984                     Settings.Global.FORCE_ALLOW_ON_EXTERNAL,
1985                     mForceAllowOnExternal.isChecked() ? 1 : 0);
1986         } else if (preference == mDebugAppPref) {
1987             Intent intent = new Intent(getActivity(), AppPicker.class);
1988             intent.putExtra(AppPicker.EXTRA_DEBUGGABLE, true);
1989             startActivityForResult(intent, RESULT_DEBUG_APP);
1990         } else if (preference == mWaitForDebugger) {
1991             writeDebuggerOptions();
1992         } else if (preference == mVerifyAppsOverUsb) {
1993             writeVerifyAppsOverUsbOptions();
1994         } else if (preference == mOtaDisableAutomaticUpdate) {
1995             writeOtaDisableAutomaticUpdateOptions();
1996         } else if (preference == mStrictMode) {
1997             writeStrictModeVisualOptions();
1998         } else if (preference == mPointerLocation) {
1999             writePointerLocationOptions();
2000         } else if (preference == mShowTouches) {
2001             writeShowTouchesOptions();
2002         } else if (preference == mShowScreenUpdates) {
2003             writeShowUpdatesOption();
2004         } else if (preference == mDisableOverlays) {
2005             writeDisableOverlaysOption();
2006         } else if (preference == mImmediatelyDestroyActivities) {
2007             writeImmediatelyDestroyActivitiesOptions();
2008         } else if (preference == mShowAllANRs) {
2009             writeShowAllANRsOptions();
2010         } else if (preference == mForceHardwareUi) {
2011             writeHardwareUiOptions();
2012         } else if (preference == mForceMsaa) {
2013             writeMsaaOptions();
2014         } else if (preference == mShowHwScreenUpdates) {
2015             writeShowHwScreenUpdatesOptions();
2016         } else if (preference == mShowHwLayersUpdates) {
2017             writeShowHwLayersUpdatesOptions();
2018         } else if (preference == mDebugLayout) {
2019             writeDebugLayoutOptions();
2020         } else if (preference == mForceRtlLayout) {
2021             writeForceRtlOptions();
2022         } else if (preference == mWifiDisplayCertification) {
2023             writeWifiDisplayCertificationOptions();
2024         } else if (preference == mWifiVerboseLogging) {
2025             writeWifiVerboseLoggingOptions();
2026         } else if (preference == mWifiAggressiveHandover) {
2027             writeWifiAggressiveHandoverOptions();
2028         } else if (preference == mWifiAllowScansWithTraffic) {
2029             writeWifiAllowScansWithTrafficOptions();
2030         } else if (preference == mMobileDataAlwaysOn) {
2031             writeMobileDataAlwaysOnOptions();
2032         } else if (preference == mColorTemperaturePreference) {
2033             writeColorTemperature();
2034         } else if (preference == mUSBAudio) {
2035             writeUSBAudioOptions();
2036         } else if (preference == mForceResizable) {
2037             writeForceResizableOptions();
2038         } else if (INACTIVE_APPS_KEY.equals(preference.getKey())) {
2039             startInactiveAppsFragment();
2040         } else if (BACKGROUND_CHECK_KEY.equals(preference.getKey())) {
2041             startBackgroundCheckFragment();
2042         } else if (preference == mBluetoothDisableAbsVolume) {
2043             writeBluetoothDisableAbsVolumeOptions();
2044         } else if (preference == mWebViewMultiprocess) {
2045             writeWebViewMultiprocessOptions();
2046         } else if (SHORTCUT_MANAGER_RESET_KEY.equals(preference.getKey())) {
2047             resetShortcutManagerThrottling();
2048         } else {
2049             return super.onPreferenceTreeClick(preference);
2050         }
2051
2052         return false;
2053     }
2054
2055     private void startInactiveAppsFragment() {
2056         ((SettingsActivity) getActivity()).startPreferencePanel(
2057                 InactiveApps.class.getName(),
2058                 null, R.string.inactive_apps_title, null, null, 0);
2059     }
2060
2061     private void startBackgroundCheckFragment() {
2062         ((SettingsActivity) getActivity()).startPreferencePanel(
2063                 BackgroundCheckSummary.class.getName(),
2064                 null, R.string.background_check_title, null, null, 0);
2065     }
2066
2067     private boolean showKeyguardConfirmation(Resources resources, int requestCode) {
2068         return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity(
2069                 requestCode, resources.getString(R.string.oem_unlock_enable));
2070     }
2071
2072     @Override
2073     public boolean onPreferenceChange(Preference preference, Object newValue) {
2074         if (HDCP_CHECKING_KEY.equals(preference.getKey())) {
2075             SystemProperties.set(HDCP_CHECKING_PROPERTY, newValue.toString());
2076             updateHdcpValues();
2077             pokeSystemProperties();
2078             return true;
2079         } else if (preference == mWebViewProvider) {
2080             if (newValue == null) {
2081                 Log.e(TAG, "Tried to set a null WebView provider");
2082                 return false;
2083             }
2084             if (writeWebViewProviderOptions(newValue)) {
2085                 return true;
2086             } else {
2087                 // The user chose a package that became invalid since the list was last updated,
2088                 // show a Toast to explain the situation.
2089                 Toast toast = Toast.makeText(getActivity(),
2090                         R.string.select_webview_provider_toast_text, Toast.LENGTH_SHORT);
2091                 toast.show();
2092             }
2093             return false;
2094         } else if (preference == mLogdSize) {
2095             writeLogdSizeOption(newValue);
2096             return true;
2097         } else if (preference == mLogpersist) {
2098             writeLogpersistOption(newValue, false);
2099             return true;
2100         } else if (preference == mUsbConfiguration) {
2101             writeUsbConfigurationOption(newValue);
2102             return true;
2103         } else if (preference == mWindowAnimationScale) {
2104             writeAnimationScaleOption(0, mWindowAnimationScale, newValue);
2105             return true;
2106         } else if (preference == mTransitionAnimationScale) {
2107             writeAnimationScaleOption(1, mTransitionAnimationScale, newValue);
2108             return true;
2109         } else if (preference == mAnimatorDurationScale) {
2110             writeAnimationScaleOption(2, mAnimatorDurationScale, newValue);
2111             return true;
2112         } else if (preference == mOverlayDisplayDevices) {
2113             writeOverlayDisplayDevicesOptions(newValue);
2114             return true;
2115         } else if (preference == mTrackFrameTime) {
2116             writeTrackFrameTimeOptions(newValue);
2117             return true;
2118         } else if (preference == mDebugHwOverdraw) {
2119             writeDebugHwOverdrawOptions(newValue);
2120             return true;
2121         } else if (preference == mShowNonRectClip) {
2122             writeShowNonRectClipOptions(newValue);
2123             return true;
2124         } else if (preference == mAppProcessLimit) {
2125             writeAppProcessLimitOptions(newValue);
2126             return true;
2127         } else if (preference == mSimulateColorSpace) {
2128             writeSimulateColorSpace(newValue);
2129             return true;
2130         }
2131         return false;
2132     }
2133
2134     private void dismissDialogs() {
2135         if (mAdbDialog != null) {
2136             mAdbDialog.dismiss();
2137             mAdbDialog = null;
2138         }
2139         if (mAdbKeysDialog != null) {
2140             mAdbKeysDialog.dismiss();
2141             mAdbKeysDialog = null;
2142         }
2143         if (mEnableDialog != null) {
2144             mEnableDialog.dismiss();
2145             mEnableDialog = null;
2146         }
2147         if (mLogpersistClearDialog != null) {
2148             mLogpersistClearDialog.dismiss();
2149             mLogpersistClearDialog = null;
2150         }
2151     }
2152
2153     public void onClick(DialogInterface dialog, int which) {
2154         if (dialog == mAdbDialog) {
2155             if (which == DialogInterface.BUTTON_POSITIVE) {
2156                 mDialogClicked = true;
2157                 Settings.Global.putInt(getActivity().getContentResolver(),
2158                         Settings.Global.ADB_ENABLED, 1);
2159                 mVerifyAppsOverUsb.setEnabled(true);
2160                 updateVerifyAppsOverUsbOptions();
2161                 updateBugreportOptions();
2162             } else {
2163                 // Reset the toggle
2164                 mEnableAdb.setChecked(false);
2165             }
2166         } else if (dialog == mAdbKeysDialog) {
2167             if (which == DialogInterface.BUTTON_POSITIVE) {
2168                 try {
2169                     IBinder b = ServiceManager.getService(Context.USB_SERVICE);
2170                     IUsbManager service = IUsbManager.Stub.asInterface(b);
2171                     service.clearUsbDebuggingKeys();
2172                 } catch (RemoteException e) {
2173                     Log.e(TAG, "Unable to clear adb keys", e);
2174                 }
2175             }
2176         } else if (dialog == mEnableDialog) {
2177             if (which == DialogInterface.BUTTON_POSITIVE) {
2178                 mDialogClicked = true;
2179                 Settings.Global.putInt(getActivity().getContentResolver(),
2180                         Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
2181                 mLastEnabledState = true;
2182                 setPrefsEnabledState(mLastEnabledState);
2183             } else {
2184                 // Reset the toggle
2185                 mSwitchBar.setChecked(false);
2186             }
2187         } else if (dialog == mLogpersistClearDialog) {
2188             if (which == DialogInterface.BUTTON_POSITIVE) {
2189                 setLogpersistOff(true);
2190             } else {
2191                 updateLogpersistValues();
2192             }
2193         }
2194     }
2195
2196     public void onDismiss(DialogInterface dialog) {
2197         // Assuming that onClick gets called first
2198         if (dialog == mAdbDialog) {
2199             if (!mDialogClicked) {
2200                 mEnableAdb.setChecked(false);
2201             }
2202             mAdbDialog = null;
2203         } else if (dialog == mEnableDialog) {
2204             if (!mDialogClicked) {
2205                 mSwitchBar.setChecked(false);
2206             }
2207             mEnableDialog = null;
2208         } else if (dialog == mLogpersistClearDialog) {
2209             mLogpersistClearDialog = null;
2210         }
2211     }
2212
2213     @Override
2214     public void onDestroy() {
2215         dismissDialogs();
2216         super.onDestroy();
2217     }
2218
2219     void pokeSystemProperties() {
2220         if (!mDontPokeProperties) {
2221             //noinspection unchecked
2222             (new SystemPropPoker()).execute();
2223         }
2224     }
2225
2226     private BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
2227         @Override
2228         public void onReceive(Context context, Intent intent) {
2229             updateUsbConfigurationValues();
2230         }
2231     };
2232
2233     public static class SystemPropPoker extends AsyncTask<Void, Void, Void> {
2234         @Override
2235         protected Void doInBackground(Void... params) {
2236             String[] services = ServiceManager.listServices();
2237             for (String service : services) {
2238                 IBinder obj = ServiceManager.checkService(service);
2239                 if (obj != null) {
2240                     Parcel data = Parcel.obtain();
2241                     try {
2242                         obj.transact(IBinder.SYSPROPS_TRANSACTION, data, null, 0);
2243                     } catch (RemoteException e) {
2244                     } catch (Exception e) {
2245                         Log.i(TAG, "Someone wrote a bad service '" + service
2246                                 + "' that doesn't like to be poked: " + e);
2247                     }
2248                     data.recycle();
2249                 }
2250             }
2251             return null;
2252         }
2253     }
2254
2255     private static boolean isPackageInstalled(Context context, String packageName) {
2256         try {
2257             return context.getPackageManager().getPackageInfo(packageName, 0) != null;
2258         } catch (NameNotFoundException e) {
2259             return false;
2260         }
2261     }
2262
2263
2264     /**
2265      * For Search.
2266      */
2267     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
2268             new BaseSearchIndexProvider() {
2269
2270                 private boolean isShowingDeveloperOptions(Context context) {
2271                     return context.getSharedPreferences(DevelopmentSettings.PREF_FILE,
2272                             Context.MODE_PRIVATE).getBoolean(
2273                                     DevelopmentSettings.PREF_SHOW,
2274                                     android.os.Build.TYPE.equals("eng"));
2275                 }
2276
2277                 @Override
2278                 public List<SearchIndexableResource> getXmlResourcesToIndex(
2279                         Context context, boolean enabled) {
2280
2281                     if (!isShowingDeveloperOptions(context)) {
2282                         return null;
2283                     }
2284
2285                     final SearchIndexableResource sir = new SearchIndexableResource(context);
2286                     sir.xmlResId = R.xml.development_prefs;
2287                     return Arrays.asList(sir);
2288                 }
2289
2290                 @Override
2291                 public List<String> getNonIndexableKeys(Context context) {
2292                     if (!isShowingDeveloperOptions(context)) {
2293                         return null;
2294                     }
2295
2296                     final List<String> keys = new ArrayList<String>();
2297                     if (!showEnableOemUnlockPreference()) {
2298                         keys.add(ENABLE_OEM_UNLOCK);
2299                     }
2300                     return keys;
2301                 }
2302             };
2303
2304     private void resetShortcutManagerThrottling() {
2305         final IShortcutService service = IShortcutService.Stub.asInterface(
2306                 ServiceManager.getService(Context.SHORTCUT_SERVICE));
2307         if (service != null) {
2308             try {
2309                 service.resetThrottling();
2310                 Toast.makeText(getActivity(), R.string.reset_shortcut_manager_throttling_complete,
2311                         Toast.LENGTH_SHORT).show();
2312             } catch (RemoteException e) {
2313                 Log.e(TAG, "Failed to reset rate limiting", e);
2314             }
2315         }
2316     }
2317
2318     private void updateOemUnlockSettingDescription() {
2319         if (mEnableOemUnlock != null) {
2320             int oemUnlockSummary = R.string.oem_unlock_enable_summary;
2321             if (isBootloaderUnlocked()) {
2322                 oemUnlockSummary = R.string.oem_unlock_enable_disabled_summary_bootloader_unlocked;
2323             } else if (isSimLockedDevice()) {
2324                 oemUnlockSummary = R.string.oem_unlock_enable_disabled_summary_sim_locked_device;
2325             } else if (!isOemUnlockAllowed()) {
2326                 // If the device isn't SIM-locked but OEM unlock is disabled by the system via the
2327                 // user restriction, this means either some other carrier restriction is in place or
2328                 // the device hasn't been able to confirm which restrictions (SIM-lock or otherwise)
2329                 // apply.
2330                 oemUnlockSummary =
2331                     R.string.oem_unlock_enable_disabled_summary_connectivity_or_locked;
2332             }
2333             mEnableOemUnlock.setSummary(getString(oemUnlockSummary));
2334         }
2335     }
2336
2337     /** Returns {@code true} if the device is SIM-locked. Otherwise, returns {@code false}. */
2338     private boolean isSimLockedDevice() {
2339         int phoneCount = mTelephonyManager.getPhoneCount();
2340         for (int i = 0; i < phoneCount; i++) {
2341             if (mTelephonyManager.getAllowedCarriers(i).size() > 0) {
2342                 return true;
2343             }
2344         }
2345         return false;
2346     }
2347
2348     /**
2349      * Returns {@code true} if the bootloader has been unlocked. Otherwise, returns {code false}.
2350      */
2351     private boolean isBootloaderUnlocked() {
2352         int flashLockState = PersistentDataBlockManager.FLASH_LOCK_UNKNOWN;
2353         if (mOemUnlockManager != null) {
2354             flashLockState = mOemUnlockManager.getFlashLockState();
2355         }
2356
2357         return flashLockState == PersistentDataBlockManager.FLASH_LOCK_UNLOCKED;
2358     }
2359
2360     /**
2361      * Returns {@code true} if OEM unlock is disallowed by user restriction
2362      * {@link UserManager#DISALLOW_FACTORY_RESET} or {@link UserManager#DISALLOW_OEM_UNLOCK}.
2363      * Otherwise, returns {@code false}.
2364      */
2365     private boolean isOemUnlockAllowed() {
2366         UserHandle userHandle = UserHandle.of(UserHandle.myUserId());
2367         return !(mUm.hasBaseUserRestriction(UserManager.DISALLOW_OEM_UNLOCK, userHandle)
2368                 || mUm.hasBaseUserRestriction(UserManager.DISALLOW_FACTORY_RESET, userHandle));
2369     }
2370 }