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.app.Activity; 20 import android.app.ActivityManagerNative; 21 import android.app.AlertDialog; 22 import android.app.Dialog; 23 import android.app.admin.DevicePolicyManager; 24 import android.app.backup.IBackupManager; 25 import android.bluetooth.BluetoothAdapter; 26 import android.content.ContentResolver; 27 import android.content.Context; 28 import android.content.DialogInterface; 29 import android.content.Intent; 30 import android.content.pm.ApplicationInfo; 31 import android.content.pm.PackageManager; 32 import android.content.pm.PackageManager.NameNotFoundException; 33 import android.content.pm.ResolveInfo; 34 import android.content.res.Resources; 35 import android.hardware.usb.IUsbManager; 36 import android.net.wifi.WifiManager; 37 import android.os.AsyncTask; 38 import android.os.BatteryManager; 39 import android.os.Build; 40 import android.os.Bundle; 41 import android.os.IBinder; 42 import android.os.Parcel; 43 import android.os.RemoteException; 44 import android.os.ServiceManager; 45 import android.os.StrictMode; 46 import android.os.SystemProperties; 47 import android.os.UserHandle; 48 import android.os.UserManager; 49 import android.preference.ListPreference; 50 import android.preference.Preference; 51 import android.preference.Preference.OnPreferenceChangeListener; 52 import android.preference.PreferenceGroup; 53 import android.preference.PreferenceScreen; 54 import android.preference.SwitchPreference; 55 import android.provider.SearchIndexableResource; 56 import android.provider.Settings; 57 import android.text.TextUtils; 58 import android.util.Log; 59 import android.view.HardwareRenderer; 60 import android.view.IWindowManager; 61 import android.view.View; 62 import android.view.accessibility.AccessibilityManager; 63 import android.widget.Switch; 64 import android.widget.TextView; 65 66 import com.android.settings.search.BaseSearchIndexProvider; 67 import com.android.settings.search.Indexable; 68 import com.android.settings.widget.SwitchBar; 69 70 import java.util.ArrayList; 71 import java.util.Arrays; 72 import java.util.HashSet; 73 import java.util.List; 74 75 /* 76 * Displays preferences for application developers. 77 */ 78 public class DevelopmentSettings extends SettingsPreferenceFragment 79 implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener, 80 OnPreferenceChangeListener, SwitchBar.OnSwitchChangeListener, Indexable { 81 private static final String TAG = "DevelopmentSettings"; 82 83 /** 84 * Preference file were development settings prefs are stored. 85 */ 86 public static final String PREF_FILE = "development"; 87 88 /** 89 * Whether to show the development settings to the user. Default is false. 90 */ 91 public static final String PREF_SHOW = "show"; 92 93 private static final String ENABLE_ADB = "enable_adb"; 94 private static final String CLEAR_ADB_KEYS = "clear_adb_keys"; 95 private static final String ENABLE_TERMINAL = "enable_terminal"; 96 private static final String KEEP_SCREEN_ON = "keep_screen_on"; 97 private static final String BT_HCI_SNOOP_LOG = "bt_hci_snoop_log"; 98 private static final String ENABLE_OEM_UNLOCK = "oem_unlock_enable"; 99 private static final String ALLOW_MOCK_LOCATION = "allow_mock_location"; 100 private static final String HDCP_CHECKING_KEY = "hdcp_checking"; 101 private static final String HDCP_CHECKING_PROPERTY = "persist.sys.hdcp_checking"; 102 private static final String LOCAL_BACKUP_PASSWORD = "local_backup_password"; 103 private static final String HARDWARE_UI_PROPERTY = "persist.sys.ui.hw"; 104 private static final String MSAA_PROPERTY = "debug.egl.force_msaa"; 105 private static final String BUGREPORT = "bugreport"; 106 private static final String BUGREPORT_IN_POWER_KEY = "bugreport_in_power"; 107 private static final String OPENGL_TRACES_PROPERTY = "debug.egl.trace"; 108 109 private static final String DEBUG_APP_KEY = "debug_app"; 110 private static final String WAIT_FOR_DEBUGGER_KEY = "wait_for_debugger"; 111 private static final String VERIFY_APPS_OVER_USB_KEY = "verify_apps_over_usb"; 112 private static final String DEBUG_VIEW_ATTRIBUTES = "debug_view_attributes"; 113 private static final String STRICT_MODE_KEY = "strict_mode"; 114 private static final String POINTER_LOCATION_KEY = "pointer_location"; 115 private static final String SHOW_TOUCHES_KEY = "show_touches"; 116 private static final String SHOW_SCREEN_UPDATES_KEY = "show_screen_updates"; 117 private static final String DISABLE_OVERLAYS_KEY = "disable_overlays"; 118 private static final String SIMULATE_COLOR_SPACE = "simulate_color_space"; 119 private static final String USE_AWESOMEPLAYER_KEY = "use_awesomeplayer"; 120 private static final String USB_AUDIO_KEY = "usb_audio"; 121 private static final String USE_AWESOMEPLAYER_PROPERTY = "persist.sys.media.use-awesome"; 122 private static final String SHOW_CPU_USAGE_KEY = "show_cpu_usage"; 123 private static final String FORCE_HARDWARE_UI_KEY = "force_hw_ui"; 124 private static final String FORCE_MSAA_KEY = "force_msaa"; 125 private static final String TRACK_FRAME_TIME_KEY = "track_frame_time"; 126 private static final String SHOW_NON_RECTANGULAR_CLIP_KEY = "show_non_rect_clip"; 127 private static final String SHOW_HW_SCREEN_UPDATES_KEY = "show_hw_screen_udpates"; 128 private static final String SHOW_HW_LAYERS_UPDATES_KEY = "show_hw_layers_udpates"; 129 private static final String DEBUG_HW_OVERDRAW_KEY = "debug_hw_overdraw"; 130 private static final String DEBUG_LAYOUT_KEY = "debug_layout"; 131 private static final String FORCE_RTL_LAYOUT_KEY = "force_rtl_layout_all_locales"; 132 private static final String WINDOW_ANIMATION_SCALE_KEY = "window_animation_scale"; 133 private static final String TRANSITION_ANIMATION_SCALE_KEY = "transition_animation_scale"; 134 private static final String ANIMATOR_DURATION_SCALE_KEY = "animator_duration_scale"; 135 private static final String OVERLAY_DISPLAY_DEVICES_KEY = "overlay_display_devices"; 136 private static final String DEBUG_DEBUGGING_CATEGORY_KEY = "debug_debugging_category"; 137 private static final String DEBUG_APPLICATIONS_CATEGORY_KEY = "debug_applications_category"; 138 private static final String WIFI_DISPLAY_CERTIFICATION_KEY = "wifi_display_certification"; 139 private static final String WIFI_VERBOSE_LOGGING_KEY = "wifi_verbose_logging"; 140 private static final String WIFI_AGGRESSIVE_HANDOVER_KEY = "wifi_aggressive_handover"; 141 private static final String WIFI_ALLOW_SCAN_WITH_TRAFFIC_KEY = "wifi_allow_scan_with_traffic"; 142 private static final String SELECT_LOGD_SIZE_KEY = "select_logd_size"; 143 private static final String SELECT_LOGD_SIZE_PROPERTY = "persist.logd.size"; 144 private static final String SELECT_LOGD_DEFAULT_SIZE_PROPERTY = "ro.logd.size"; 145 146 private static final String OPENGL_TRACES_KEY = "enable_opengl_traces"; 147 148 private static final String IMMEDIATELY_DESTROY_ACTIVITIES_KEY 149 = "immediately_destroy_activities"; 150 private static final String APP_PROCESS_LIMIT_KEY = "app_process_limit"; 151 152 private static final String SHOW_ALL_ANRS_KEY = "show_all_anrs"; 153 154 private static final String PROCESS_STATS = "proc_stats"; 155 156 private static final String TAG_CONFIRM_ENFORCE = "confirm_enforce"; 157 158 private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive"; 159 160 private static final String TERMINAL_APP_PACKAGE = "com.android.terminal"; 161 162 private static final int RESULT_DEBUG_APP = 1000; 163 164 private static final String PERSISTENT_DATA_BLOCK_PROP = "ro.frp.pst"; 165 166 private static final int REQUEST_CODE_ENABLE_OEM_UNLOCK = 0; 167 168 private static String DEFAULT_LOG_RING_BUFFER_SIZE_IN_BYTES = "262144"; // 256K 169 170 private IWindowManager mWindowManager; 171 private IBackupManager mBackupManager; 172 private DevicePolicyManager mDpm; 173 private UserManager mUm; 174 private WifiManager mWifiManager; 175 176 private SwitchBar mSwitchBar; 177 private boolean mLastEnabledState; 178 private boolean mHaveDebugSettings; 179 private boolean mDontPokeProperties; 180 181 private SwitchPreference mEnableAdb; 182 private Preference mClearAdbKeys; 183 private SwitchPreference mEnableTerminal; 184 private Preference mBugreport; 185 private SwitchPreference mBugreportInPower; 186 private SwitchPreference mKeepScreenOn; 187 private SwitchPreference mBtHciSnoopLog; 188 private SwitchPreference mEnableOemUnlock; 189 private SwitchPreference mAllowMockLocation; 190 private SwitchPreference mDebugViewAttributes; 191 192 private PreferenceScreen mPassword; 193 private String mDebugApp; 194 private Preference mDebugAppPref; 195 private SwitchPreference mWaitForDebugger; 196 private SwitchPreference mVerifyAppsOverUsb; 197 private SwitchPreference mWifiDisplayCertification; 198 private SwitchPreference mWifiVerboseLogging; 199 private SwitchPreference mWifiAggressiveHandover; 200 201 private SwitchPreference mWifiAllowScansWithTraffic; 202 private SwitchPreference mStrictMode; 203 private SwitchPreference mPointerLocation; 204 private SwitchPreference mShowTouches; 205 private SwitchPreference mShowScreenUpdates; 206 private SwitchPreference mDisableOverlays; 207 private SwitchPreference mShowCpuUsage; 208 private SwitchPreference mForceHardwareUi; 209 private SwitchPreference mForceMsaa; 210 private SwitchPreference mShowHwScreenUpdates; 211 private SwitchPreference mShowHwLayersUpdates; 212 private SwitchPreference mDebugLayout; 213 private SwitchPreference mForceRtlLayout; 214 private ListPreference mDebugHwOverdraw; 215 private ListPreference mLogdSize; 216 private ListPreference mTrackFrameTime; 217 private ListPreference mShowNonRectClip; 218 private ListPreference mWindowAnimationScale; 219 private ListPreference mTransitionAnimationScale; 220 private ListPreference mAnimatorDurationScale; 221 private ListPreference mOverlayDisplayDevices; 222 private ListPreference mOpenGLTraces; 223 224 private ListPreference mSimulateColorSpace; 225 226 private SwitchPreference mUseAwesomePlayer; 227 private SwitchPreference mUSBAudio; 228 private SwitchPreference mImmediatelyDestroyActivities; 229 230 private ListPreference mAppProcessLimit; 231 232 private SwitchPreference mShowAllANRs; 233 234 private PreferenceScreen mProcessStats; 235 private final ArrayList<Preference> mAllPrefs = new ArrayList<Preference>(); 236 237 private final ArrayList<SwitchPreference> mResetSwitchPrefs 238 = new ArrayList<SwitchPreference>(); 239 240 private final HashSet<Preference> mDisabledPrefs = new HashSet<Preference>(); 241 // To track whether a confirmation dialog was clicked. 242 private boolean mDialogClicked; 243 private Dialog mEnableDialog; 244 private Dialog mAdbDialog; 245 246 private Dialog mAdbKeysDialog; 247 private boolean mUnavailable; 248 249 @Override onCreate(Bundle icicle)250 public void onCreate(Bundle icicle) { 251 super.onCreate(icicle); 252 253 mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); 254 mBackupManager = IBackupManager.Stub.asInterface( 255 ServiceManager.getService(Context.BACKUP_SERVICE)); 256 mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE); 257 mUm = (UserManager) getSystemService(Context.USER_SERVICE); 258 259 mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 260 261 if (android.os.Process.myUserHandle().getIdentifier() != UserHandle.USER_OWNER 262 || mUm.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) { 263 mUnavailable = true; 264 setPreferenceScreen(new PreferenceScreen(getActivity(), null)); 265 return; 266 } 267 268 addPreferencesFromResource(R.xml.development_prefs); 269 270 final PreferenceGroup debugDebuggingCategory = (PreferenceGroup) 271 findPreference(DEBUG_DEBUGGING_CATEGORY_KEY); 272 273 mEnableAdb = findAndInitSwitchPref(ENABLE_ADB); 274 mClearAdbKeys = findPreference(CLEAR_ADB_KEYS); 275 if (!SystemProperties.getBoolean("ro.adb.secure", false)) { 276 if (debugDebuggingCategory != null) { 277 debugDebuggingCategory.removePreference(mClearAdbKeys); 278 } 279 } 280 mAllPrefs.add(mClearAdbKeys); 281 mEnableTerminal = findAndInitSwitchPref(ENABLE_TERMINAL); 282 if (!isPackageInstalled(getActivity(), TERMINAL_APP_PACKAGE)) { 283 debugDebuggingCategory.removePreference(mEnableTerminal); 284 mEnableTerminal = null; 285 } 286 287 mBugreport = findPreference(BUGREPORT); 288 mBugreportInPower = findAndInitSwitchPref(BUGREPORT_IN_POWER_KEY); 289 mKeepScreenOn = findAndInitSwitchPref(KEEP_SCREEN_ON); 290 mBtHciSnoopLog = findAndInitSwitchPref(BT_HCI_SNOOP_LOG); 291 mEnableOemUnlock = findAndInitSwitchPref(ENABLE_OEM_UNLOCK); 292 if (!showEnableOemUnlockPreference()) { 293 removePreference(mEnableOemUnlock); 294 mEnableOemUnlock = null; 295 } 296 mAllowMockLocation = findAndInitSwitchPref(ALLOW_MOCK_LOCATION); 297 mDebugViewAttributes = findAndInitSwitchPref(DEBUG_VIEW_ATTRIBUTES); 298 mPassword = (PreferenceScreen) findPreference(LOCAL_BACKUP_PASSWORD); 299 mAllPrefs.add(mPassword); 300 301 302 if (!android.os.Process.myUserHandle().equals(UserHandle.OWNER)) { 303 disableForUser(mEnableAdb); 304 disableForUser(mClearAdbKeys); 305 disableForUser(mEnableTerminal); 306 disableForUser(mPassword); 307 } 308 309 mDebugAppPref = findPreference(DEBUG_APP_KEY); 310 mAllPrefs.add(mDebugAppPref); 311 mWaitForDebugger = findAndInitSwitchPref(WAIT_FOR_DEBUGGER_KEY); 312 mVerifyAppsOverUsb = findAndInitSwitchPref(VERIFY_APPS_OVER_USB_KEY); 313 if (!showVerifierSetting()) { 314 if (debugDebuggingCategory != null) { 315 debugDebuggingCategory.removePreference(mVerifyAppsOverUsb); 316 } else { 317 mVerifyAppsOverUsb.setEnabled(false); 318 } 319 } 320 mStrictMode = findAndInitSwitchPref(STRICT_MODE_KEY); 321 mPointerLocation = findAndInitSwitchPref(POINTER_LOCATION_KEY); 322 mShowTouches = findAndInitSwitchPref(SHOW_TOUCHES_KEY); 323 mShowScreenUpdates = findAndInitSwitchPref(SHOW_SCREEN_UPDATES_KEY); 324 mDisableOverlays = findAndInitSwitchPref(DISABLE_OVERLAYS_KEY); 325 mShowCpuUsage = findAndInitSwitchPref(SHOW_CPU_USAGE_KEY); 326 mForceHardwareUi = findAndInitSwitchPref(FORCE_HARDWARE_UI_KEY); 327 mForceMsaa = findAndInitSwitchPref(FORCE_MSAA_KEY); 328 mTrackFrameTime = addListPreference(TRACK_FRAME_TIME_KEY); 329 mShowNonRectClip = addListPreference(SHOW_NON_RECTANGULAR_CLIP_KEY); 330 mShowHwScreenUpdates = findAndInitSwitchPref(SHOW_HW_SCREEN_UPDATES_KEY); 331 mShowHwLayersUpdates = findAndInitSwitchPref(SHOW_HW_LAYERS_UPDATES_KEY); 332 mDebugLayout = findAndInitSwitchPref(DEBUG_LAYOUT_KEY); 333 mForceRtlLayout = findAndInitSwitchPref(FORCE_RTL_LAYOUT_KEY); 334 mDebugHwOverdraw = addListPreference(DEBUG_HW_OVERDRAW_KEY); 335 mWifiDisplayCertification = findAndInitSwitchPref(WIFI_DISPLAY_CERTIFICATION_KEY); 336 mWifiVerboseLogging = findAndInitSwitchPref(WIFI_VERBOSE_LOGGING_KEY); 337 mWifiAggressiveHandover = findAndInitSwitchPref(WIFI_AGGRESSIVE_HANDOVER_KEY); 338 mWifiAllowScansWithTraffic = findAndInitSwitchPref(WIFI_ALLOW_SCAN_WITH_TRAFFIC_KEY); 339 mLogdSize = addListPreference(SELECT_LOGD_SIZE_KEY); 340 341 mWindowAnimationScale = addListPreference(WINDOW_ANIMATION_SCALE_KEY); 342 mTransitionAnimationScale = addListPreference(TRANSITION_ANIMATION_SCALE_KEY); 343 mAnimatorDurationScale = addListPreference(ANIMATOR_DURATION_SCALE_KEY); 344 mOverlayDisplayDevices = addListPreference(OVERLAY_DISPLAY_DEVICES_KEY); 345 mOpenGLTraces = addListPreference(OPENGL_TRACES_KEY); 346 mSimulateColorSpace = addListPreference(SIMULATE_COLOR_SPACE); 347 mUseAwesomePlayer = findAndInitSwitchPref(USE_AWESOMEPLAYER_KEY); 348 mUSBAudio = findAndInitSwitchPref(USB_AUDIO_KEY); 349 350 mImmediatelyDestroyActivities = (SwitchPreference) findPreference( 351 IMMEDIATELY_DESTROY_ACTIVITIES_KEY); 352 mAllPrefs.add(mImmediatelyDestroyActivities); 353 mResetSwitchPrefs.add(mImmediatelyDestroyActivities); 354 355 mAppProcessLimit = addListPreference(APP_PROCESS_LIMIT_KEY); 356 357 mShowAllANRs = (SwitchPreference) findPreference( 358 SHOW_ALL_ANRS_KEY); 359 mAllPrefs.add(mShowAllANRs); 360 mResetSwitchPrefs.add(mShowAllANRs); 361 362 Preference hdcpChecking = findPreference(HDCP_CHECKING_KEY); 363 if (hdcpChecking != null) { 364 mAllPrefs.add(hdcpChecking); 365 removePreferenceForProduction(hdcpChecking); 366 } 367 368 mProcessStats = (PreferenceScreen) findPreference(PROCESS_STATS); 369 mAllPrefs.add(mProcessStats); 370 } 371 addListPreference(String prefKey)372 private ListPreference addListPreference(String prefKey) { 373 ListPreference pref = (ListPreference) findPreference(prefKey); 374 mAllPrefs.add(pref); 375 pref.setOnPreferenceChangeListener(this); 376 return pref; 377 } 378 disableForUser(Preference pref)379 private void disableForUser(Preference pref) { 380 if (pref != null) { 381 pref.setEnabled(false); 382 mDisabledPrefs.add(pref); 383 } 384 } 385 findAndInitSwitchPref(String key)386 private SwitchPreference findAndInitSwitchPref(String key) { 387 SwitchPreference pref = (SwitchPreference) findPreference(key); 388 if (pref == null) { 389 throw new IllegalArgumentException("Cannot find preference with key = " + key); 390 } 391 mAllPrefs.add(pref); 392 mResetSwitchPrefs.add(pref); 393 return pref; 394 } 395 396 @Override onActivityCreated(Bundle savedInstanceState)397 public void onActivityCreated(Bundle savedInstanceState) { 398 super.onActivityCreated(savedInstanceState); 399 400 final SettingsActivity activity = (SettingsActivity) getActivity(); 401 402 mSwitchBar = activity.getSwitchBar(); 403 if (mUnavailable) { 404 mSwitchBar.setEnabled(false); 405 return; 406 } 407 408 mSwitchBar.addOnSwitchChangeListener(this); 409 } 410 removePreferenceForProduction(Preference preference)411 private boolean removePreferenceForProduction(Preference preference) { 412 if ("user".equals(Build.TYPE)) { 413 removePreference(preference); 414 return true; 415 } 416 return false; 417 } 418 removePreference(Preference preference)419 private void removePreference(Preference preference) { 420 getPreferenceScreen().removePreference(preference); 421 mAllPrefs.remove(preference); 422 } 423 setPrefsEnabledState(boolean enabled)424 private void setPrefsEnabledState(boolean enabled) { 425 for (int i = 0; i < mAllPrefs.size(); i++) { 426 Preference pref = mAllPrefs.get(i); 427 pref.setEnabled(enabled && !mDisabledPrefs.contains(pref)); 428 } 429 updateAllOptions(); 430 } 431 432 @Override onResume()433 public void onResume() { 434 super.onResume(); 435 436 if (mUnavailable) { 437 // Show error message 438 TextView emptyView = (TextView) getView().findViewById(android.R.id.empty); 439 getListView().setEmptyView(emptyView); 440 if (emptyView != null) { 441 emptyView.setText(R.string.development_settings_not_available); 442 } 443 return; 444 } 445 446 if (mDpm.getMaximumTimeToLock(null) > 0) { 447 // A DeviceAdmin has specified a maximum time until the device 448 // will lock... in this case we can't allow the user to turn 449 // on "stay awake when plugged in" because that would defeat the 450 // restriction. 451 mDisabledPrefs.add(mKeepScreenOn); 452 } else { 453 mDisabledPrefs.remove(mKeepScreenOn); 454 } 455 456 final ContentResolver cr = getActivity().getContentResolver(); 457 mLastEnabledState = Settings.Global.getInt(cr, 458 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; 459 mSwitchBar.setChecked(mLastEnabledState); 460 setPrefsEnabledState(mLastEnabledState); 461 462 if (mHaveDebugSettings && !mLastEnabledState) { 463 // Overall debugging is disabled, but there are some debug 464 // settings that are enabled. This is an invalid state. Switch 465 // to debug settings being enabled, so the user knows there is 466 // stuff enabled and can turn it all off if they want. 467 Settings.Global.putInt(getActivity().getContentResolver(), 468 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1); 469 mLastEnabledState = true; 470 mSwitchBar.setChecked(mLastEnabledState); 471 setPrefsEnabledState(mLastEnabledState); 472 } 473 mSwitchBar.show(); 474 } 475 476 @Override onDestroyView()477 public void onDestroyView() { 478 super.onDestroyView(); 479 480 if (mUnavailable) { 481 return; 482 } 483 mSwitchBar.removeOnSwitchChangeListener(this); 484 mSwitchBar.hide(); 485 } 486 updateSwitchPreference(SwitchPreference switchPreference, boolean value)487 void updateSwitchPreference(SwitchPreference switchPreference, boolean value) { 488 switchPreference.setChecked(value); 489 mHaveDebugSettings |= value; 490 } 491 updateAllOptions()492 private void updateAllOptions() { 493 final Context context = getActivity(); 494 final ContentResolver cr = context.getContentResolver(); 495 mHaveDebugSettings = false; 496 updateSwitchPreference(mEnableAdb, Settings.Global.getInt(cr, 497 Settings.Global.ADB_ENABLED, 0) != 0); 498 if (mEnableTerminal != null) { 499 updateSwitchPreference(mEnableTerminal, 500 context.getPackageManager().getApplicationEnabledSetting(TERMINAL_APP_PACKAGE) 501 == PackageManager.COMPONENT_ENABLED_STATE_ENABLED); 502 } 503 updateSwitchPreference(mBugreportInPower, Settings.Secure.getInt(cr, 504 Settings.Secure.BUGREPORT_IN_POWER_MENU, 0) != 0); 505 updateSwitchPreference(mKeepScreenOn, Settings.Global.getInt(cr, 506 Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0) != 0); 507 updateSwitchPreference(mBtHciSnoopLog, Settings.Secure.getInt(cr, 508 Settings.Secure.BLUETOOTH_HCI_LOG, 0) != 0); 509 if (mEnableOemUnlock != null) { 510 updateSwitchPreference(mEnableOemUnlock, Utils.isOemUnlockEnabled(getActivity())); 511 } 512 updateSwitchPreference(mAllowMockLocation, Settings.Secure.getInt(cr, 513 Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0); 514 updateSwitchPreference(mDebugViewAttributes, Settings.Global.getInt(cr, 515 Settings.Global.DEBUG_VIEW_ATTRIBUTES, 0) != 0); 516 updateHdcpValues(); 517 updatePasswordSummary(); 518 updateDebuggerOptions(); 519 updateStrictModeVisualOptions(); 520 updatePointerLocationOptions(); 521 updateShowTouchesOptions(); 522 updateFlingerOptions(); 523 updateCpuUsageOptions(); 524 updateHardwareUiOptions(); 525 updateMsaaOptions(); 526 updateTrackFrameTimeOptions(); 527 updateShowNonRectClipOptions(); 528 updateShowHwScreenUpdatesOptions(); 529 updateShowHwLayersUpdatesOptions(); 530 updateDebugHwOverdrawOptions(); 531 updateDebugLayoutOptions(); 532 updateAnimationScaleOptions(); 533 updateOverlayDisplayDevicesOptions(); 534 updateOpenGLTracesOptions(); 535 updateImmediatelyDestroyActivitiesOptions(); 536 updateAppProcessLimitOptions(); 537 updateShowAllANRsOptions(); 538 updateVerifyAppsOverUsbOptions(); 539 updateBugreportOptions(); 540 updateForceRtlOptions(); 541 updateLogdSizeValues(); 542 updateWifiDisplayCertificationOptions(); 543 updateWifiVerboseLoggingOptions(); 544 updateWifiAggressiveHandoverOptions(); 545 updateWifiAllowScansWithTrafficOptions(); 546 updateSimulateColorSpace(); 547 updateUseNuplayerOptions(); 548 updateUSBAudioOptions(); 549 } 550 resetDangerousOptions()551 private void resetDangerousOptions() { 552 mDontPokeProperties = true; 553 for (int i=0; i< mResetSwitchPrefs.size(); i++) { 554 SwitchPreference cb = mResetSwitchPrefs.get(i); 555 if (cb.isChecked()) { 556 cb.setChecked(false); 557 onPreferenceTreeClick(null, cb); 558 } 559 } 560 resetDebuggerOptions(); 561 writeLogdSizeOption(null); 562 writeAnimationScaleOption(0, mWindowAnimationScale, null); 563 writeAnimationScaleOption(1, mTransitionAnimationScale, null); 564 writeAnimationScaleOption(2, mAnimatorDurationScale, null); 565 // Only poke the color space setting if we control it. 566 if (usingDevelopmentColorSpace()) { 567 writeSimulateColorSpace(-1); 568 } 569 writeOverlayDisplayDevicesOptions(null); 570 writeAppProcessLimitOptions(null); 571 mHaveDebugSettings = false; 572 updateAllOptions(); 573 mDontPokeProperties = false; 574 pokeSystemProperties(); 575 } 576 updateHdcpValues()577 private void updateHdcpValues() { 578 ListPreference hdcpChecking = (ListPreference) findPreference(HDCP_CHECKING_KEY); 579 if (hdcpChecking != null) { 580 String currentValue = SystemProperties.get(HDCP_CHECKING_PROPERTY); 581 String[] values = getResources().getStringArray(R.array.hdcp_checking_values); 582 String[] summaries = getResources().getStringArray(R.array.hdcp_checking_summaries); 583 int index = 1; // Defaults to drm-only. Needs to match with R.array.hdcp_checking_values 584 for (int i = 0; i < values.length; i++) { 585 if (currentValue.equals(values[i])) { 586 index = i; 587 break; 588 } 589 } 590 hdcpChecking.setValue(values[index]); 591 hdcpChecking.setSummary(summaries[index]); 592 hdcpChecking.setOnPreferenceChangeListener(this); 593 } 594 } 595 updatePasswordSummary()596 private void updatePasswordSummary() { 597 try { 598 if (mBackupManager.hasBackupPassword()) { 599 mPassword.setSummary(R.string.local_backup_password_summary_change); 600 } else { 601 mPassword.setSummary(R.string.local_backup_password_summary_none); 602 } 603 } catch (RemoteException e) { 604 // Not much we can do here 605 } 606 } 607 writeBtHciSnoopLogOptions()608 private void writeBtHciSnoopLogOptions() { 609 BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 610 adapter.configHciSnoopLog(mBtHciSnoopLog.isChecked()); 611 Settings.Secure.putInt(getActivity().getContentResolver(), 612 Settings.Secure.BLUETOOTH_HCI_LOG, 613 mBtHciSnoopLog.isChecked() ? 1 : 0); 614 } 615 writeDebuggerOptions()616 private void writeDebuggerOptions() { 617 try { 618 ActivityManagerNative.getDefault().setDebugApp( 619 mDebugApp, mWaitForDebugger.isChecked(), true); 620 } catch (RemoteException ex) { 621 } 622 } 623 resetDebuggerOptions()624 private static void resetDebuggerOptions() { 625 try { 626 ActivityManagerNative.getDefault().setDebugApp( 627 null, false, true); 628 } catch (RemoteException ex) { 629 } 630 } 631 updateDebuggerOptions()632 private void updateDebuggerOptions() { 633 mDebugApp = Settings.Global.getString( 634 getActivity().getContentResolver(), Settings.Global.DEBUG_APP); 635 updateSwitchPreference(mWaitForDebugger, Settings.Global.getInt( 636 getActivity().getContentResolver(), Settings.Global.WAIT_FOR_DEBUGGER, 0) != 0); 637 if (mDebugApp != null && mDebugApp.length() > 0) { 638 String label; 639 try { 640 ApplicationInfo ai = getActivity().getPackageManager().getApplicationInfo(mDebugApp, 641 PackageManager.GET_DISABLED_COMPONENTS); 642 CharSequence lab = getActivity().getPackageManager().getApplicationLabel(ai); 643 label = lab != null ? lab.toString() : mDebugApp; 644 } catch (PackageManager.NameNotFoundException e) { 645 label = mDebugApp; 646 } 647 mDebugAppPref.setSummary(getResources().getString(R.string.debug_app_set, label)); 648 mWaitForDebugger.setEnabled(true); 649 mHaveDebugSettings = true; 650 } else { 651 mDebugAppPref.setSummary(getResources().getString(R.string.debug_app_not_set)); 652 mWaitForDebugger.setEnabled(false); 653 } 654 } 655 updateVerifyAppsOverUsbOptions()656 private void updateVerifyAppsOverUsbOptions() { 657 updateSwitchPreference(mVerifyAppsOverUsb, Settings.Global.getInt(getActivity().getContentResolver(), 658 Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB, 1) != 0); 659 mVerifyAppsOverUsb.setEnabled(enableVerifierSetting()); 660 } 661 writeVerifyAppsOverUsbOptions()662 private void writeVerifyAppsOverUsbOptions() { 663 Settings.Global.putInt(getActivity().getContentResolver(), 664 Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB, mVerifyAppsOverUsb.isChecked() ? 1 : 0); 665 } 666 enableVerifierSetting()667 private boolean enableVerifierSetting() { 668 final ContentResolver cr = getActivity().getContentResolver(); 669 if (Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) == 0) { 670 return false; 671 } 672 if (Settings.Global.getInt(cr, Settings.Global.PACKAGE_VERIFIER_ENABLE, 1) == 0) { 673 return false; 674 } else { 675 final PackageManager pm = getActivity().getPackageManager(); 676 final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); 677 verification.setType(PACKAGE_MIME_TYPE); 678 verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 679 final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(verification, 0); 680 if (receivers.size() == 0) { 681 return false; 682 } 683 } 684 return true; 685 } 686 showVerifierSetting()687 private boolean showVerifierSetting() { 688 return Settings.Global.getInt(getActivity().getContentResolver(), 689 Settings.Global.PACKAGE_VERIFIER_SETTING_VISIBLE, 1) > 0; 690 } 691 showEnableOemUnlockPreference()692 private static boolean showEnableOemUnlockPreference() { 693 return !SystemProperties.get(PERSISTENT_DATA_BLOCK_PROP).equals(""); 694 } 695 updateBugreportOptions()696 private void updateBugreportOptions() { 697 if ("user".equals(Build.TYPE)) { 698 final ContentResolver resolver = getActivity().getContentResolver(); 699 final boolean adbEnabled = Settings.Global.getInt( 700 resolver, Settings.Global.ADB_ENABLED, 0) != 0; 701 if (adbEnabled) { 702 mBugreport.setEnabled(true); 703 mBugreportInPower.setEnabled(true); 704 } else { 705 mBugreport.setEnabled(false); 706 mBugreportInPower.setEnabled(false); 707 mBugreportInPower.setChecked(false); 708 Settings.Secure.putInt(resolver, Settings.Secure.BUGREPORT_IN_POWER_MENU, 0); 709 } 710 } else { 711 mBugreportInPower.setEnabled(true); 712 } 713 } 714 715 // Returns the current state of the system property that controls 716 // strictmode flashes. One of: 717 // 0: not explicitly set one way or another 718 // 1: on 719 // 2: off currentStrictModeActiveIndex()720 private static int currentStrictModeActiveIndex() { 721 if (TextUtils.isEmpty(SystemProperties.get(StrictMode.VISUAL_PROPERTY))) { 722 return 0; 723 } 724 boolean enabled = SystemProperties.getBoolean(StrictMode.VISUAL_PROPERTY, false); 725 return enabled ? 1 : 2; 726 } 727 writeStrictModeVisualOptions()728 private void writeStrictModeVisualOptions() { 729 try { 730 mWindowManager.setStrictModeVisualIndicatorPreference(mStrictMode.isChecked() 731 ? "1" : ""); 732 } catch (RemoteException e) { 733 } 734 } 735 updateStrictModeVisualOptions()736 private void updateStrictModeVisualOptions() { 737 updateSwitchPreference(mStrictMode, currentStrictModeActiveIndex() == 1); 738 } 739 writePointerLocationOptions()740 private void writePointerLocationOptions() { 741 Settings.System.putInt(getActivity().getContentResolver(), 742 Settings.System.POINTER_LOCATION, mPointerLocation.isChecked() ? 1 : 0); 743 } 744 updatePointerLocationOptions()745 private void updatePointerLocationOptions() { 746 updateSwitchPreference(mPointerLocation, Settings.System.getInt(getActivity().getContentResolver(), 747 Settings.System.POINTER_LOCATION, 0) != 0); 748 } 749 writeShowTouchesOptions()750 private void writeShowTouchesOptions() { 751 Settings.System.putInt(getActivity().getContentResolver(), 752 Settings.System.SHOW_TOUCHES, mShowTouches.isChecked() ? 1 : 0); 753 } 754 updateShowTouchesOptions()755 private void updateShowTouchesOptions() { 756 updateSwitchPreference(mShowTouches, Settings.System.getInt(getActivity().getContentResolver(), 757 Settings.System.SHOW_TOUCHES, 0) != 0); 758 } 759 updateFlingerOptions()760 private void updateFlingerOptions() { 761 // magic communication with surface flinger. 762 try { 763 IBinder flinger = ServiceManager.getService("SurfaceFlinger"); 764 if (flinger != null) { 765 Parcel data = Parcel.obtain(); 766 Parcel reply = Parcel.obtain(); 767 data.writeInterfaceToken("android.ui.ISurfaceComposer"); 768 flinger.transact(1010, data, reply, 0); 769 @SuppressWarnings("unused") 770 int showCpu = reply.readInt(); 771 @SuppressWarnings("unused") 772 int enableGL = reply.readInt(); 773 int showUpdates = reply.readInt(); 774 updateSwitchPreference(mShowScreenUpdates, showUpdates != 0); 775 @SuppressWarnings("unused") 776 int showBackground = reply.readInt(); 777 int disableOverlays = reply.readInt(); 778 updateSwitchPreference(mDisableOverlays, disableOverlays != 0); 779 reply.recycle(); 780 data.recycle(); 781 } 782 } catch (RemoteException ex) { 783 } 784 } 785 writeShowUpdatesOption()786 private void writeShowUpdatesOption() { 787 try { 788 IBinder flinger = ServiceManager.getService("SurfaceFlinger"); 789 if (flinger != null) { 790 Parcel data = Parcel.obtain(); 791 data.writeInterfaceToken("android.ui.ISurfaceComposer"); 792 final int showUpdates = mShowScreenUpdates.isChecked() ? 1 : 0; 793 data.writeInt(showUpdates); 794 flinger.transact(1002, data, null, 0); 795 data.recycle(); 796 797 updateFlingerOptions(); 798 } 799 } catch (RemoteException ex) { 800 } 801 } 802 writeDisableOverlaysOption()803 private void writeDisableOverlaysOption() { 804 try { 805 IBinder flinger = ServiceManager.getService("SurfaceFlinger"); 806 if (flinger != null) { 807 Parcel data = Parcel.obtain(); 808 data.writeInterfaceToken("android.ui.ISurfaceComposer"); 809 final int disableOverlays = mDisableOverlays.isChecked() ? 1 : 0; 810 data.writeInt(disableOverlays); 811 flinger.transact(1008, data, null, 0); 812 data.recycle(); 813 814 updateFlingerOptions(); 815 } 816 } catch (RemoteException ex) { 817 } 818 } 819 updateHardwareUiOptions()820 private void updateHardwareUiOptions() { 821 updateSwitchPreference(mForceHardwareUi, SystemProperties.getBoolean(HARDWARE_UI_PROPERTY, false)); 822 } 823 writeHardwareUiOptions()824 private void writeHardwareUiOptions() { 825 SystemProperties.set(HARDWARE_UI_PROPERTY, mForceHardwareUi.isChecked() ? "true" : "false"); 826 pokeSystemProperties(); 827 } 828 updateMsaaOptions()829 private void updateMsaaOptions() { 830 updateSwitchPreference(mForceMsaa, SystemProperties.getBoolean(MSAA_PROPERTY, false)); 831 } 832 writeMsaaOptions()833 private void writeMsaaOptions() { 834 SystemProperties.set(MSAA_PROPERTY, mForceMsaa.isChecked() ? "true" : "false"); 835 pokeSystemProperties(); 836 } 837 updateTrackFrameTimeOptions()838 private void updateTrackFrameTimeOptions() { 839 String value = SystemProperties.get(HardwareRenderer.PROFILE_PROPERTY); 840 if (value == null) { 841 value = ""; 842 } 843 844 CharSequence[] values = mTrackFrameTime.getEntryValues(); 845 for (int i = 0; i < values.length; i++) { 846 if (value.contentEquals(values[i])) { 847 mTrackFrameTime.setValueIndex(i); 848 mTrackFrameTime.setSummary(mTrackFrameTime.getEntries()[i]); 849 return; 850 } 851 } 852 mTrackFrameTime.setValueIndex(0); 853 mTrackFrameTime.setSummary(mTrackFrameTime.getEntries()[0]); 854 } 855 writeTrackFrameTimeOptions(Object newValue)856 private void writeTrackFrameTimeOptions(Object newValue) { 857 SystemProperties.set(HardwareRenderer.PROFILE_PROPERTY, 858 newValue == null ? "" : newValue.toString()); 859 pokeSystemProperties(); 860 updateTrackFrameTimeOptions(); 861 } 862 updateShowNonRectClipOptions()863 private void updateShowNonRectClipOptions() { 864 String value = SystemProperties.get( 865 HardwareRenderer.DEBUG_SHOW_NON_RECTANGULAR_CLIP_PROPERTY); 866 if (value == null) { 867 value = "hide"; 868 } 869 870 CharSequence[] values = mShowNonRectClip.getEntryValues(); 871 for (int i = 0; i < values.length; i++) { 872 if (value.contentEquals(values[i])) { 873 mShowNonRectClip.setValueIndex(i); 874 mShowNonRectClip.setSummary(mShowNonRectClip.getEntries()[i]); 875 return; 876 } 877 } 878 mShowNonRectClip.setValueIndex(0); 879 mShowNonRectClip.setSummary(mShowNonRectClip.getEntries()[0]); 880 } 881 writeShowNonRectClipOptions(Object newValue)882 private void writeShowNonRectClipOptions(Object newValue) { 883 SystemProperties.set(HardwareRenderer.DEBUG_SHOW_NON_RECTANGULAR_CLIP_PROPERTY, 884 newValue == null ? "" : newValue.toString()); 885 pokeSystemProperties(); 886 updateShowNonRectClipOptions(); 887 } 888 updateShowHwScreenUpdatesOptions()889 private void updateShowHwScreenUpdatesOptions() { 890 updateSwitchPreference(mShowHwScreenUpdates, 891 SystemProperties.getBoolean(HardwareRenderer.DEBUG_DIRTY_REGIONS_PROPERTY, false)); 892 } 893 writeShowHwScreenUpdatesOptions()894 private void writeShowHwScreenUpdatesOptions() { 895 SystemProperties.set(HardwareRenderer.DEBUG_DIRTY_REGIONS_PROPERTY, 896 mShowHwScreenUpdates.isChecked() ? "true" : null); 897 pokeSystemProperties(); 898 } 899 updateShowHwLayersUpdatesOptions()900 private void updateShowHwLayersUpdatesOptions() { 901 updateSwitchPreference(mShowHwLayersUpdates, SystemProperties.getBoolean( 902 HardwareRenderer.DEBUG_SHOW_LAYERS_UPDATES_PROPERTY, false)); 903 } 904 writeShowHwLayersUpdatesOptions()905 private void writeShowHwLayersUpdatesOptions() { 906 SystemProperties.set(HardwareRenderer.DEBUG_SHOW_LAYERS_UPDATES_PROPERTY, 907 mShowHwLayersUpdates.isChecked() ? "true" : null); 908 pokeSystemProperties(); 909 } 910 updateDebugHwOverdrawOptions()911 private void updateDebugHwOverdrawOptions() { 912 String value = SystemProperties.get(HardwareRenderer.DEBUG_OVERDRAW_PROPERTY); 913 if (value == null) { 914 value = ""; 915 } 916 917 CharSequence[] values = mDebugHwOverdraw.getEntryValues(); 918 for (int i = 0; i < values.length; i++) { 919 if (value.contentEquals(values[i])) { 920 mDebugHwOverdraw.setValueIndex(i); 921 mDebugHwOverdraw.setSummary(mDebugHwOverdraw.getEntries()[i]); 922 return; 923 } 924 } 925 mDebugHwOverdraw.setValueIndex(0); 926 mDebugHwOverdraw.setSummary(mDebugHwOverdraw.getEntries()[0]); 927 } 928 writeDebugHwOverdrawOptions(Object newValue)929 private void writeDebugHwOverdrawOptions(Object newValue) { 930 SystemProperties.set(HardwareRenderer.DEBUG_OVERDRAW_PROPERTY, 931 newValue == null ? "" : newValue.toString()); 932 pokeSystemProperties(); 933 updateDebugHwOverdrawOptions(); 934 } 935 updateDebugLayoutOptions()936 private void updateDebugLayoutOptions() { 937 updateSwitchPreference(mDebugLayout, 938 SystemProperties.getBoolean(View.DEBUG_LAYOUT_PROPERTY, false)); 939 } 940 writeDebugLayoutOptions()941 private void writeDebugLayoutOptions() { 942 SystemProperties.set(View.DEBUG_LAYOUT_PROPERTY, 943 mDebugLayout.isChecked() ? "true" : "false"); 944 pokeSystemProperties(); 945 } 946 updateSimulateColorSpace()947 private void updateSimulateColorSpace() { 948 final ContentResolver cr = getContentResolver(); 949 final boolean enabled = Settings.Secure.getInt( 950 cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0) != 0; 951 if (enabled) { 952 final String mode = Integer.toString(Settings.Secure.getInt( 953 cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, 954 AccessibilityManager.DALTONIZER_DISABLED)); 955 mSimulateColorSpace.setValue(mode); 956 final int index = mSimulateColorSpace.findIndexOfValue(mode); 957 if (index < 0) { 958 // We're using a mode controlled by accessibility preferences. 959 mSimulateColorSpace.setSummary(getString(R.string.daltonizer_type_overridden, 960 getString(R.string.accessibility_display_daltonizer_preference_title))); 961 } else { 962 mSimulateColorSpace.setSummary("%s"); 963 } 964 } else { 965 mSimulateColorSpace.setValue( 966 Integer.toString(AccessibilityManager.DALTONIZER_DISABLED)); 967 } 968 } 969 970 /** 971 * @return <code>true</code> if the color space preference is currently 972 * controlled by development settings 973 */ usingDevelopmentColorSpace()974 private boolean usingDevelopmentColorSpace() { 975 final ContentResolver cr = getContentResolver(); 976 final boolean enabled = Settings.Secure.getInt( 977 cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0) != 0; 978 if (enabled) { 979 final String mode = Integer.toString(Settings.Secure.getInt( 980 cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, 981 AccessibilityManager.DALTONIZER_DISABLED)); 982 final int index = mSimulateColorSpace.findIndexOfValue(mode); 983 if (index >= 0) { 984 // We're using a mode controlled by developer preferences. 985 return true; 986 } 987 } 988 return false; 989 } 990 writeSimulateColorSpace(Object value)991 private void writeSimulateColorSpace(Object value) { 992 final ContentResolver cr = getContentResolver(); 993 final int newMode = Integer.parseInt(value.toString()); 994 if (newMode < 0) { 995 Settings.Secure.putInt(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 0); 996 } else { 997 Settings.Secure.putInt(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, 1); 998 Settings.Secure.putInt(cr, Settings.Secure.ACCESSIBILITY_DISPLAY_DALTONIZER, newMode); 999 } 1000 } 1001 updateUseNuplayerOptions()1002 private void updateUseNuplayerOptions() { 1003 updateSwitchPreference( 1004 mUseAwesomePlayer, SystemProperties.getBoolean(USE_AWESOMEPLAYER_PROPERTY, false)); 1005 } 1006 writeUseAwesomePlayerOptions()1007 private void writeUseAwesomePlayerOptions() { 1008 SystemProperties.set( 1009 USE_AWESOMEPLAYER_PROPERTY, mUseAwesomePlayer.isChecked() ? "true" : "false"); 1010 pokeSystemProperties(); 1011 } 1012 updateUSBAudioOptions()1013 private void updateUSBAudioOptions() { 1014 updateSwitchPreference(mUSBAudio, Settings.Secure.getInt(getContentResolver(), 1015 Settings.Secure.USB_AUDIO_AUTOMATIC_ROUTING_DISABLED, 0) != 0); 1016 } 1017 writeUSBAudioOptions()1018 private void writeUSBAudioOptions() { 1019 Settings.Secure.putInt(getContentResolver(), 1020 Settings.Secure.USB_AUDIO_AUTOMATIC_ROUTING_DISABLED, 1021 mUSBAudio.isChecked() ? 1 : 0); 1022 } 1023 updateForceRtlOptions()1024 private void updateForceRtlOptions() { 1025 updateSwitchPreference(mForceRtlLayout, Settings.Global.getInt(getActivity().getContentResolver(), 1026 Settings.Global.DEVELOPMENT_FORCE_RTL, 0) != 0); 1027 } 1028 writeForceRtlOptions()1029 private void writeForceRtlOptions() { 1030 boolean value = mForceRtlLayout.isChecked(); 1031 Settings.Global.putInt(getActivity().getContentResolver(), 1032 Settings.Global.DEVELOPMENT_FORCE_RTL, value ? 1 : 0); 1033 SystemProperties.set(Settings.Global.DEVELOPMENT_FORCE_RTL, value ? "1" : "0"); 1034 LocalePicker.updateLocale(getActivity().getResources().getConfiguration().locale); 1035 } 1036 updateWifiDisplayCertificationOptions()1037 private void updateWifiDisplayCertificationOptions() { 1038 updateSwitchPreference(mWifiDisplayCertification, Settings.Global.getInt( 1039 getActivity().getContentResolver(), 1040 Settings.Global.WIFI_DISPLAY_CERTIFICATION_ON, 0) != 0); 1041 } 1042 writeWifiDisplayCertificationOptions()1043 private void writeWifiDisplayCertificationOptions() { 1044 Settings.Global.putInt(getActivity().getContentResolver(), 1045 Settings.Global.WIFI_DISPLAY_CERTIFICATION_ON, 1046 mWifiDisplayCertification.isChecked() ? 1 : 0); 1047 } 1048 updateWifiVerboseLoggingOptions()1049 private void updateWifiVerboseLoggingOptions() { 1050 boolean enabled = mWifiManager.getVerboseLoggingLevel() > 0; 1051 updateSwitchPreference(mWifiVerboseLogging, enabled); 1052 } 1053 writeWifiVerboseLoggingOptions()1054 private void writeWifiVerboseLoggingOptions() { 1055 mWifiManager.enableVerboseLogging(mWifiVerboseLogging.isChecked() ? 1 : 0); 1056 } 1057 updateWifiAggressiveHandoverOptions()1058 private void updateWifiAggressiveHandoverOptions() { 1059 boolean enabled = mWifiManager.getAggressiveHandover() > 0; 1060 updateSwitchPreference(mWifiAggressiveHandover, enabled); 1061 } 1062 writeWifiAggressiveHandoverOptions()1063 private void writeWifiAggressiveHandoverOptions() { 1064 mWifiManager.enableAggressiveHandover(mWifiAggressiveHandover.isChecked() ? 1 : 0); 1065 } 1066 updateWifiAllowScansWithTrafficOptions()1067 private void updateWifiAllowScansWithTrafficOptions() { 1068 boolean enabled = mWifiManager.getAllowScansWithTraffic() > 0; 1069 updateSwitchPreference(mWifiAllowScansWithTraffic, enabled); 1070 } 1071 writeWifiAllowScansWithTrafficOptions()1072 private void writeWifiAllowScansWithTrafficOptions() { 1073 mWifiManager.setAllowScansWithTraffic(mWifiAllowScansWithTraffic.isChecked() ? 1 : 0); 1074 } 1075 updateLogdSizeValues()1076 private void updateLogdSizeValues() { 1077 if (mLogdSize != null) { 1078 String currentValue = SystemProperties.get(SELECT_LOGD_SIZE_PROPERTY); 1079 if (currentValue == null) { 1080 currentValue = SystemProperties.get(SELECT_LOGD_DEFAULT_SIZE_PROPERTY); 1081 if (currentValue == null) { 1082 currentValue = "256K"; 1083 } 1084 } 1085 String[] values = getResources().getStringArray(R.array.select_logd_size_values); 1086 String[] titles = getResources().getStringArray(R.array.select_logd_size_titles); 1087 if (SystemProperties.get("ro.config.low_ram").equals("true")) { 1088 mLogdSize.setEntries(R.array.select_logd_size_lowram_titles); 1089 titles = getResources().getStringArray(R.array.select_logd_size_lowram_titles); 1090 } 1091 String[] summaries = getResources().getStringArray(R.array.select_logd_size_summaries); 1092 int index = 1; // punt to second entry if not found 1093 for (int i = 0; i < titles.length; i++) { 1094 if (currentValue.equals(values[i]) 1095 || currentValue.equals(titles[i])) { 1096 index = i; 1097 break; 1098 } 1099 } 1100 mLogdSize.setValue(values[index]); 1101 mLogdSize.setSummary(summaries[index]); 1102 mLogdSize.setOnPreferenceChangeListener(this); 1103 } 1104 } 1105 writeLogdSizeOption(Object newValue)1106 private void writeLogdSizeOption(Object newValue) { 1107 String currentValue = SystemProperties.get(SELECT_LOGD_DEFAULT_SIZE_PROPERTY); 1108 if (currentValue != null) { 1109 DEFAULT_LOG_RING_BUFFER_SIZE_IN_BYTES = currentValue; 1110 } 1111 final String size = (newValue != null) ? 1112 newValue.toString() : DEFAULT_LOG_RING_BUFFER_SIZE_IN_BYTES; 1113 SystemProperties.set(SELECT_LOGD_SIZE_PROPERTY, size); 1114 pokeSystemProperties(); 1115 try { 1116 Process p = Runtime.getRuntime().exec("logcat -b all -G " + size); 1117 p.waitFor(); 1118 Log.i(TAG, "Logcat ring buffer sizes set to: " + size); 1119 } catch (Exception e) { 1120 Log.w(TAG, "Cannot set logcat ring buffer sizes", e); 1121 } 1122 updateLogdSizeValues(); 1123 } 1124 updateCpuUsageOptions()1125 private void updateCpuUsageOptions() { 1126 updateSwitchPreference(mShowCpuUsage, Settings.Global.getInt(getActivity().getContentResolver(), 1127 Settings.Global.SHOW_PROCESSES, 0) != 0); 1128 } 1129 writeCpuUsageOptions()1130 private void writeCpuUsageOptions() { 1131 boolean value = mShowCpuUsage.isChecked(); 1132 Settings.Global.putInt(getActivity().getContentResolver(), 1133 Settings.Global.SHOW_PROCESSES, value ? 1 : 0); 1134 Intent service = (new Intent()) 1135 .setClassName("com.android.systemui", "com.android.systemui.LoadAverageService"); 1136 if (value) { 1137 getActivity().startService(service); 1138 } else { 1139 getActivity().stopService(service); 1140 } 1141 } 1142 writeImmediatelyDestroyActivitiesOptions()1143 private void writeImmediatelyDestroyActivitiesOptions() { 1144 try { 1145 ActivityManagerNative.getDefault().setAlwaysFinish( 1146 mImmediatelyDestroyActivities.isChecked()); 1147 } catch (RemoteException ex) { 1148 } 1149 } 1150 updateImmediatelyDestroyActivitiesOptions()1151 private void updateImmediatelyDestroyActivitiesOptions() { 1152 updateSwitchPreference(mImmediatelyDestroyActivities, Settings.Global.getInt( 1153 getActivity().getContentResolver(), Settings.Global.ALWAYS_FINISH_ACTIVITIES, 0) != 0); 1154 } 1155 updateAnimationScaleValue(int which, ListPreference pref)1156 private void updateAnimationScaleValue(int which, ListPreference pref) { 1157 try { 1158 float scale = mWindowManager.getAnimationScale(which); 1159 if (scale != 1) { 1160 mHaveDebugSettings = true; 1161 } 1162 CharSequence[] values = pref.getEntryValues(); 1163 for (int i=0; i<values.length; i++) { 1164 float val = Float.parseFloat(values[i].toString()); 1165 if (scale <= val) { 1166 pref.setValueIndex(i); 1167 pref.setSummary(pref.getEntries()[i]); 1168 return; 1169 } 1170 } 1171 pref.setValueIndex(values.length-1); 1172 pref.setSummary(pref.getEntries()[0]); 1173 } catch (RemoteException e) { 1174 } 1175 } 1176 updateAnimationScaleOptions()1177 private void updateAnimationScaleOptions() { 1178 updateAnimationScaleValue(0, mWindowAnimationScale); 1179 updateAnimationScaleValue(1, mTransitionAnimationScale); 1180 updateAnimationScaleValue(2, mAnimatorDurationScale); 1181 } 1182 writeAnimationScaleOption(int which, ListPreference pref, Object newValue)1183 private void writeAnimationScaleOption(int which, ListPreference pref, Object newValue) { 1184 try { 1185 float scale = newValue != null ? Float.parseFloat(newValue.toString()) : 1; 1186 mWindowManager.setAnimationScale(which, scale); 1187 updateAnimationScaleValue(which, pref); 1188 } catch (RemoteException e) { 1189 } 1190 } 1191 updateOverlayDisplayDevicesOptions()1192 private void updateOverlayDisplayDevicesOptions() { 1193 String value = Settings.Global.getString(getActivity().getContentResolver(), 1194 Settings.Global.OVERLAY_DISPLAY_DEVICES); 1195 if (value == null) { 1196 value = ""; 1197 } 1198 1199 CharSequence[] values = mOverlayDisplayDevices.getEntryValues(); 1200 for (int i = 0; i < values.length; i++) { 1201 if (value.contentEquals(values[i])) { 1202 mOverlayDisplayDevices.setValueIndex(i); 1203 mOverlayDisplayDevices.setSummary(mOverlayDisplayDevices.getEntries()[i]); 1204 return; 1205 } 1206 } 1207 mOverlayDisplayDevices.setValueIndex(0); 1208 mOverlayDisplayDevices.setSummary(mOverlayDisplayDevices.getEntries()[0]); 1209 } 1210 writeOverlayDisplayDevicesOptions(Object newValue)1211 private void writeOverlayDisplayDevicesOptions(Object newValue) { 1212 Settings.Global.putString(getActivity().getContentResolver(), 1213 Settings.Global.OVERLAY_DISPLAY_DEVICES, (String)newValue); 1214 updateOverlayDisplayDevicesOptions(); 1215 } 1216 updateOpenGLTracesOptions()1217 private void updateOpenGLTracesOptions() { 1218 String value = SystemProperties.get(OPENGL_TRACES_PROPERTY); 1219 if (value == null) { 1220 value = ""; 1221 } 1222 1223 CharSequence[] values = mOpenGLTraces.getEntryValues(); 1224 for (int i = 0; i < values.length; i++) { 1225 if (value.contentEquals(values[i])) { 1226 mOpenGLTraces.setValueIndex(i); 1227 mOpenGLTraces.setSummary(mOpenGLTraces.getEntries()[i]); 1228 return; 1229 } 1230 } 1231 mOpenGLTraces.setValueIndex(0); 1232 mOpenGLTraces.setSummary(mOpenGLTraces.getEntries()[0]); 1233 } 1234 writeOpenGLTracesOptions(Object newValue)1235 private void writeOpenGLTracesOptions(Object newValue) { 1236 SystemProperties.set(OPENGL_TRACES_PROPERTY, newValue == null ? "" : newValue.toString()); 1237 pokeSystemProperties(); 1238 updateOpenGLTracesOptions(); 1239 } 1240 updateAppProcessLimitOptions()1241 private void updateAppProcessLimitOptions() { 1242 try { 1243 int limit = ActivityManagerNative.getDefault().getProcessLimit(); 1244 CharSequence[] values = mAppProcessLimit.getEntryValues(); 1245 for (int i=0; i<values.length; i++) { 1246 int val = Integer.parseInt(values[i].toString()); 1247 if (val >= limit) { 1248 if (i != 0) { 1249 mHaveDebugSettings = true; 1250 } 1251 mAppProcessLimit.setValueIndex(i); 1252 mAppProcessLimit.setSummary(mAppProcessLimit.getEntries()[i]); 1253 return; 1254 } 1255 } 1256 mAppProcessLimit.setValueIndex(0); 1257 mAppProcessLimit.setSummary(mAppProcessLimit.getEntries()[0]); 1258 } catch (RemoteException e) { 1259 } 1260 } 1261 writeAppProcessLimitOptions(Object newValue)1262 private void writeAppProcessLimitOptions(Object newValue) { 1263 try { 1264 int limit = newValue != null ? Integer.parseInt(newValue.toString()) : -1; 1265 ActivityManagerNative.getDefault().setProcessLimit(limit); 1266 updateAppProcessLimitOptions(); 1267 } catch (RemoteException e) { 1268 } 1269 } 1270 writeShowAllANRsOptions()1271 private void writeShowAllANRsOptions() { 1272 Settings.Secure.putInt(getActivity().getContentResolver(), 1273 Settings.Secure.ANR_SHOW_BACKGROUND, 1274 mShowAllANRs.isChecked() ? 1 : 0); 1275 } 1276 updateShowAllANRsOptions()1277 private void updateShowAllANRsOptions() { 1278 updateSwitchPreference(mShowAllANRs, Settings.Secure.getInt( 1279 getActivity().getContentResolver(), Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0); 1280 } 1281 confirmEnableOemUnlock()1282 private void confirmEnableOemUnlock() { 1283 DialogInterface.OnClickListener onConfirmListener = new DialogInterface.OnClickListener() { 1284 @Override 1285 public void onClick(DialogInterface dialog, int which) { 1286 Utils.setOemUnlockEnabled(getActivity(), true); 1287 updateAllOptions(); 1288 } 1289 }; 1290 1291 new AlertDialog.Builder(getActivity()) 1292 .setTitle(R.string.confirm_enable_oem_unlock_title) 1293 .setMessage(R.string.confirm_enable_oem_unlock_text) 1294 .setPositiveButton(R.string.enable_text, onConfirmListener) 1295 .setNegativeButton(android.R.string.cancel, null) 1296 .create() 1297 .show(); 1298 } 1299 1300 @Override onSwitchChanged(Switch switchView, boolean isChecked)1301 public void onSwitchChanged(Switch switchView, boolean isChecked) { 1302 if (switchView != mSwitchBar.getSwitch()) { 1303 return; 1304 } 1305 if (isChecked != mLastEnabledState) { 1306 if (isChecked) { 1307 mDialogClicked = false; 1308 if (mEnableDialog != null) dismissDialogs(); 1309 mEnableDialog = new AlertDialog.Builder(getActivity()).setMessage( 1310 getActivity().getResources().getString( 1311 R.string.dev_settings_warning_message)) 1312 .setTitle(R.string.dev_settings_warning_title) 1313 .setPositiveButton(android.R.string.yes, this) 1314 .setNegativeButton(android.R.string.no, this) 1315 .show(); 1316 mEnableDialog.setOnDismissListener(this); 1317 } else { 1318 resetDangerousOptions(); 1319 Settings.Global.putInt(getActivity().getContentResolver(), 1320 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0); 1321 mLastEnabledState = isChecked; 1322 setPrefsEnabledState(mLastEnabledState); 1323 } 1324 } 1325 } 1326 1327 @Override onActivityResult(int requestCode, int resultCode, Intent data)1328 public void onActivityResult(int requestCode, int resultCode, Intent data) { 1329 if (requestCode == RESULT_DEBUG_APP) { 1330 if (resultCode == Activity.RESULT_OK) { 1331 mDebugApp = data.getAction(); 1332 writeDebuggerOptions(); 1333 updateDebuggerOptions(); 1334 } 1335 } else if (requestCode == REQUEST_CODE_ENABLE_OEM_UNLOCK) { 1336 if (resultCode == Activity.RESULT_OK) { 1337 if (mEnableOemUnlock.isChecked()) { 1338 confirmEnableOemUnlock(); 1339 } else { 1340 Utils.setOemUnlockEnabled(getActivity(), false); 1341 } 1342 } 1343 } else { 1344 super.onActivityResult(requestCode, resultCode, data); 1345 } 1346 } 1347 1348 @Override onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)1349 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 1350 if (Utils.isMonkeyRunning()) { 1351 return false; 1352 } 1353 1354 if (preference == mEnableAdb) { 1355 if (mEnableAdb.isChecked()) { 1356 mDialogClicked = false; 1357 if (mAdbDialog != null) dismissDialogs(); 1358 mAdbDialog = new AlertDialog.Builder(getActivity()).setMessage( 1359 getActivity().getResources().getString(R.string.adb_warning_message)) 1360 .setTitle(R.string.adb_warning_title) 1361 .setPositiveButton(android.R.string.yes, this) 1362 .setNegativeButton(android.R.string.no, this) 1363 .show(); 1364 mAdbDialog.setOnDismissListener(this); 1365 } else { 1366 Settings.Global.putInt(getActivity().getContentResolver(), 1367 Settings.Global.ADB_ENABLED, 0); 1368 mVerifyAppsOverUsb.setEnabled(false); 1369 mVerifyAppsOverUsb.setChecked(false); 1370 updateBugreportOptions(); 1371 } 1372 } else if (preference == mClearAdbKeys) { 1373 if (mAdbKeysDialog != null) dismissDialogs(); 1374 mAdbKeysDialog = new AlertDialog.Builder(getActivity()) 1375 .setMessage(R.string.adb_keys_warning_message) 1376 .setPositiveButton(android.R.string.ok, this) 1377 .setNegativeButton(android.R.string.cancel, null) 1378 .show(); 1379 } else if (preference == mEnableTerminal) { 1380 final PackageManager pm = getActivity().getPackageManager(); 1381 pm.setApplicationEnabledSetting(TERMINAL_APP_PACKAGE, 1382 mEnableTerminal.isChecked() ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED 1383 : PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, 0); 1384 } else if (preference == mBugreportInPower) { 1385 Settings.Secure.putInt(getActivity().getContentResolver(), 1386 Settings.Secure.BUGREPORT_IN_POWER_MENU, 1387 mBugreportInPower.isChecked() ? 1 : 0); 1388 } else if (preference == mKeepScreenOn) { 1389 Settings.Global.putInt(getActivity().getContentResolver(), 1390 Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 1391 mKeepScreenOn.isChecked() ? 1392 (BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB) : 0); 1393 } else if (preference == mBtHciSnoopLog) { 1394 writeBtHciSnoopLogOptions(); 1395 } else if (preference == mEnableOemUnlock) { 1396 if (!showKeyguardConfirmation(getResources(), REQUEST_CODE_ENABLE_OEM_UNLOCK)) { 1397 if (mEnableOemUnlock.isChecked()) { 1398 confirmEnableOemUnlock(); 1399 } else { 1400 Utils.setOemUnlockEnabled(getActivity(), false); 1401 } 1402 } 1403 } else if (preference == mAllowMockLocation) { 1404 Settings.Secure.putInt(getActivity().getContentResolver(), 1405 Settings.Secure.ALLOW_MOCK_LOCATION, 1406 mAllowMockLocation.isChecked() ? 1 : 0); 1407 } else if (preference == mDebugViewAttributes) { 1408 Settings.Global.putInt(getActivity().getContentResolver(), 1409 Settings.Global.DEBUG_VIEW_ATTRIBUTES, 1410 mDebugViewAttributes.isChecked() ? 1 : 0); 1411 } else if (preference == mDebugAppPref) { 1412 startActivityForResult(new Intent(getActivity(), AppPicker.class), RESULT_DEBUG_APP); 1413 } else if (preference == mWaitForDebugger) { 1414 writeDebuggerOptions(); 1415 } else if (preference == mVerifyAppsOverUsb) { 1416 writeVerifyAppsOverUsbOptions(); 1417 } else if (preference == mStrictMode) { 1418 writeStrictModeVisualOptions(); 1419 } else if (preference == mPointerLocation) { 1420 writePointerLocationOptions(); 1421 } else if (preference == mShowTouches) { 1422 writeShowTouchesOptions(); 1423 } else if (preference == mShowScreenUpdates) { 1424 writeShowUpdatesOption(); 1425 } else if (preference == mDisableOverlays) { 1426 writeDisableOverlaysOption(); 1427 } else if (preference == mShowCpuUsage) { 1428 writeCpuUsageOptions(); 1429 } else if (preference == mImmediatelyDestroyActivities) { 1430 writeImmediatelyDestroyActivitiesOptions(); 1431 } else if (preference == mShowAllANRs) { 1432 writeShowAllANRsOptions(); 1433 } else if (preference == mForceHardwareUi) { 1434 writeHardwareUiOptions(); 1435 } else if (preference == mForceMsaa) { 1436 writeMsaaOptions(); 1437 } else if (preference == mShowHwScreenUpdates) { 1438 writeShowHwScreenUpdatesOptions(); 1439 } else if (preference == mShowHwLayersUpdates) { 1440 writeShowHwLayersUpdatesOptions(); 1441 } else if (preference == mDebugLayout) { 1442 writeDebugLayoutOptions(); 1443 } else if (preference == mForceRtlLayout) { 1444 writeForceRtlOptions(); 1445 } else if (preference == mWifiDisplayCertification) { 1446 writeWifiDisplayCertificationOptions(); 1447 } else if (preference == mWifiVerboseLogging) { 1448 writeWifiVerboseLoggingOptions(); 1449 } else if (preference == mWifiAggressiveHandover) { 1450 writeWifiAggressiveHandoverOptions(); 1451 } else if (preference == mWifiAllowScansWithTraffic) { 1452 writeWifiAllowScansWithTrafficOptions(); 1453 } else if (preference == mUseAwesomePlayer) { 1454 writeUseAwesomePlayerOptions(); 1455 } else if (preference == mUSBAudio) { 1456 writeUSBAudioOptions(); 1457 } else { 1458 return super.onPreferenceTreeClick(preferenceScreen, preference); 1459 } 1460 1461 return false; 1462 } 1463 showKeyguardConfirmation(Resources resources, int requestCode)1464 private boolean showKeyguardConfirmation(Resources resources, int requestCode) { 1465 return new ChooseLockSettingsHelper(getActivity(), this) 1466 .launchConfirmationActivity(requestCode, 1467 resources.getString(R.string.oem_unlock_enable_pin_prompt), 1468 resources.getString(R.string.oem_unlock_enable_pin_description)); 1469 } 1470 1471 @Override onPreferenceChange(Preference preference, Object newValue)1472 public boolean onPreferenceChange(Preference preference, Object newValue) { 1473 if (HDCP_CHECKING_KEY.equals(preference.getKey())) { 1474 SystemProperties.set(HDCP_CHECKING_PROPERTY, newValue.toString()); 1475 updateHdcpValues(); 1476 pokeSystemProperties(); 1477 return true; 1478 } else if (preference == mLogdSize) { 1479 writeLogdSizeOption(newValue); 1480 return true; 1481 } else if (preference == mWindowAnimationScale) { 1482 writeAnimationScaleOption(0, mWindowAnimationScale, newValue); 1483 return true; 1484 } else if (preference == mTransitionAnimationScale) { 1485 writeAnimationScaleOption(1, mTransitionAnimationScale, newValue); 1486 return true; 1487 } else if (preference == mAnimatorDurationScale) { 1488 writeAnimationScaleOption(2, mAnimatorDurationScale, newValue); 1489 return true; 1490 } else if (preference == mOverlayDisplayDevices) { 1491 writeOverlayDisplayDevicesOptions(newValue); 1492 return true; 1493 } else if (preference == mOpenGLTraces) { 1494 writeOpenGLTracesOptions(newValue); 1495 return true; 1496 } else if (preference == mTrackFrameTime) { 1497 writeTrackFrameTimeOptions(newValue); 1498 return true; 1499 } else if (preference == mDebugHwOverdraw) { 1500 writeDebugHwOverdrawOptions(newValue); 1501 return true; 1502 } else if (preference == mShowNonRectClip) { 1503 writeShowNonRectClipOptions(newValue); 1504 return true; 1505 } else if (preference == mAppProcessLimit) { 1506 writeAppProcessLimitOptions(newValue); 1507 return true; 1508 } else if (preference == mSimulateColorSpace) { 1509 writeSimulateColorSpace(newValue); 1510 return true; 1511 } 1512 return false; 1513 } 1514 dismissDialogs()1515 private void dismissDialogs() { 1516 if (mAdbDialog != null) { 1517 mAdbDialog.dismiss(); 1518 mAdbDialog = null; 1519 } 1520 if (mAdbKeysDialog != null) { 1521 mAdbKeysDialog.dismiss(); 1522 mAdbKeysDialog = null; 1523 } 1524 if (mEnableDialog != null) { 1525 mEnableDialog.dismiss(); 1526 mEnableDialog = null; 1527 } 1528 } 1529 onClick(DialogInterface dialog, int which)1530 public void onClick(DialogInterface dialog, int which) { 1531 if (dialog == mAdbDialog) { 1532 if (which == DialogInterface.BUTTON_POSITIVE) { 1533 mDialogClicked = true; 1534 Settings.Global.putInt(getActivity().getContentResolver(), 1535 Settings.Global.ADB_ENABLED, 1); 1536 mVerifyAppsOverUsb.setEnabled(true); 1537 updateVerifyAppsOverUsbOptions(); 1538 updateBugreportOptions(); 1539 } else { 1540 // Reset the toggle 1541 mEnableAdb.setChecked(false); 1542 } 1543 } else if (dialog == mAdbKeysDialog) { 1544 if (which == DialogInterface.BUTTON_POSITIVE) { 1545 try { 1546 IBinder b = ServiceManager.getService(Context.USB_SERVICE); 1547 IUsbManager service = IUsbManager.Stub.asInterface(b); 1548 service.clearUsbDebuggingKeys(); 1549 } catch (RemoteException e) { 1550 Log.e(TAG, "Unable to clear adb keys", e); 1551 } 1552 } 1553 } else if (dialog == mEnableDialog) { 1554 if (which == DialogInterface.BUTTON_POSITIVE) { 1555 mDialogClicked = true; 1556 Settings.Global.putInt(getActivity().getContentResolver(), 1557 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1); 1558 mLastEnabledState = true; 1559 setPrefsEnabledState(mLastEnabledState); 1560 } else { 1561 // Reset the toggle 1562 mSwitchBar.setChecked(false); 1563 } 1564 } 1565 } 1566 onDismiss(DialogInterface dialog)1567 public void onDismiss(DialogInterface dialog) { 1568 // Assuming that onClick gets called first 1569 if (dialog == mAdbDialog) { 1570 if (!mDialogClicked) { 1571 mEnableAdb.setChecked(false); 1572 } 1573 mAdbDialog = null; 1574 } else if (dialog == mEnableDialog) { 1575 if (!mDialogClicked) { 1576 mSwitchBar.setChecked(false); 1577 } 1578 mEnableDialog = null; 1579 } 1580 } 1581 1582 @Override onDestroy()1583 public void onDestroy() { 1584 dismissDialogs(); 1585 super.onDestroy(); 1586 } 1587 pokeSystemProperties()1588 void pokeSystemProperties() { 1589 if (!mDontPokeProperties) { 1590 //noinspection unchecked 1591 (new SystemPropPoker()).execute(); 1592 } 1593 } 1594 1595 static class SystemPropPoker extends AsyncTask<Void, Void, Void> { 1596 @Override doInBackground(Void... params)1597 protected Void doInBackground(Void... params) { 1598 String[] services; 1599 try { 1600 services = ServiceManager.listServices(); 1601 } catch (RemoteException e) { 1602 return null; 1603 } 1604 for (String service : services) { 1605 IBinder obj = ServiceManager.checkService(service); 1606 if (obj != null) { 1607 Parcel data = Parcel.obtain(); 1608 try { 1609 obj.transact(IBinder.SYSPROPS_TRANSACTION, data, null, 0); 1610 } catch (RemoteException e) { 1611 } catch (Exception e) { 1612 Log.i(TAG, "Someone wrote a bad service '" + service 1613 + "' that doesn't like to be poked: " + e); 1614 } 1615 data.recycle(); 1616 } 1617 } 1618 return null; 1619 } 1620 } 1621 isPackageInstalled(Context context, String packageName)1622 private static boolean isPackageInstalled(Context context, String packageName) { 1623 try { 1624 return context.getPackageManager().getPackageInfo(packageName, 0) != null; 1625 } catch (NameNotFoundException e) { 1626 return false; 1627 } 1628 } 1629 1630 /** 1631 * For Search. 1632 */ 1633 public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 1634 new BaseSearchIndexProvider() { 1635 1636 private boolean isShowingDeveloperOptions(Context context) { 1637 return context.getSharedPreferences(DevelopmentSettings.PREF_FILE, 1638 Context.MODE_PRIVATE).getBoolean( 1639 DevelopmentSettings.PREF_SHOW, 1640 android.os.Build.TYPE.equals("eng")); 1641 } 1642 1643 @Override 1644 public List<SearchIndexableResource> getXmlResourcesToIndex( 1645 Context context, boolean enabled) { 1646 1647 if (!isShowingDeveloperOptions(context)) { 1648 return null; 1649 } 1650 1651 final SearchIndexableResource sir = new SearchIndexableResource(context); 1652 sir.xmlResId = R.xml.development_prefs; 1653 return Arrays.asList(sir); 1654 } 1655 1656 @Override 1657 public List<String> getNonIndexableKeys(Context context) { 1658 if (!isShowingDeveloperOptions(context)) { 1659 return null; 1660 } 1661 1662 final List<String> keys = new ArrayList<String>(); 1663 if (!showEnableOemUnlockPreference()) { 1664 keys.add(ENABLE_OEM_UNLOCK); 1665 } 1666 return keys; 1667 } 1668 }; 1669 } 1670