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 static android.Manifest.permission.READ_EXTERNAL_STORAGE; 20 21 import android.app.ActionBar; 22 import android.app.Activity; 23 import android.app.ActivityManagerNative; 24 import android.app.ActivityThread; 25 import android.app.AlertDialog; 26 import android.app.Dialog; 27 import android.app.DialogFragment; 28 import android.app.admin.DevicePolicyManager; 29 import android.app.backup.IBackupManager; 30 import android.content.ContentResolver; 31 import android.content.Context; 32 import android.content.DialogInterface; 33 import android.content.DialogInterface.OnClickListener; 34 import android.content.Intent; 35 import android.content.pm.ApplicationInfo; 36 import android.content.pm.PackageManager; 37 import android.content.pm.ResolveInfo; 38 import android.hardware.usb.IUsbManager; 39 import android.os.AsyncTask; 40 import android.os.BatteryManager; 41 import android.os.Build; 42 import android.os.Bundle; 43 import android.os.IBinder; 44 import android.os.Parcel; 45 import android.os.RemoteException; 46 import android.os.ServiceManager; 47 import android.os.StrictMode; 48 import android.os.SystemProperties; 49 import android.os.UserHandle; 50 import android.os.UserManager; 51 import android.preference.CheckBoxPreference; 52 import android.preference.ListPreference; 53 import android.preference.Preference; 54 import android.preference.Preference.OnPreferenceChangeListener; 55 import android.preference.PreferenceFragment; 56 import android.preference.PreferenceGroup; 57 import android.preference.PreferenceScreen; 58 import android.provider.Settings; 59 import android.text.TextUtils; 60 import android.util.Log; 61 import android.webkit.WebViewFactory; 62 import android.view.Gravity; 63 import android.view.HardwareRenderer; 64 import android.view.IWindowManager; 65 import android.view.View; 66 import android.widget.CompoundButton; 67 import android.widget.Switch; 68 import android.widget.TextView; 69 70 import java.util.ArrayList; 71 import java.util.HashSet; 72 import java.util.List; 73 74 /* 75 * Displays preferences for application developers. 76 */ 77 public class DevelopmentSettings extends PreferenceFragment 78 implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener, 79 OnPreferenceChangeListener, CompoundButton.OnCheckedChangeListener { 80 private static final String TAG = "DevelopmentSettings"; 81 82 /** 83 * Preference file were development settings prefs are stored. 84 */ 85 public static final String PREF_FILE = "development"; 86 87 /** 88 * Whether to show the development settings to the user. Default is false. 89 */ 90 public static final String PREF_SHOW = "show"; 91 92 private static final String ENABLE_ADB = "enable_adb"; 93 private static final String CLEAR_ADB_KEYS = "clear_adb_keys"; 94 private static final String KEEP_SCREEN_ON = "keep_screen_on"; 95 private static final String ALLOW_MOCK_LOCATION = "allow_mock_location"; 96 private static final String HDCP_CHECKING_KEY = "hdcp_checking"; 97 private static final String HDCP_CHECKING_PROPERTY = "persist.sys.hdcp_checking"; 98 private static final String ENFORCE_READ_EXTERNAL = "enforce_read_external"; 99 private static final String LOCAL_BACKUP_PASSWORD = "local_backup_password"; 100 private static final String HARDWARE_UI_PROPERTY = "persist.sys.ui.hw"; 101 private static final String MSAA_PROPERTY = "debug.egl.force_msaa"; 102 private static final String BUGREPORT = "bugreport"; 103 private static final String BUGREPORT_IN_POWER_KEY = "bugreport_in_power"; 104 private static final String OPENGL_TRACES_PROPERTY = "debug.egl.trace"; 105 106 private static final String DEBUG_APP_KEY = "debug_app"; 107 private static final String WAIT_FOR_DEBUGGER_KEY = "wait_for_debugger"; 108 private static final String VERIFY_APPS_OVER_USB_KEY = "verify_apps_over_usb"; 109 private static final String STRICT_MODE_KEY = "strict_mode"; 110 private static final String POINTER_LOCATION_KEY = "pointer_location"; 111 private static final String SHOW_TOUCHES_KEY = "show_touches"; 112 private static final String SHOW_SCREEN_UPDATES_KEY = "show_screen_updates"; 113 private static final String DISABLE_OVERLAYS_KEY = "disable_overlays"; 114 private static final String SHOW_CPU_USAGE_KEY = "show_cpu_usage"; 115 private static final String FORCE_HARDWARE_UI_KEY = "force_hw_ui"; 116 private static final String FORCE_MSAA_KEY = "force_msaa"; 117 private static final String TRACK_FRAME_TIME_KEY = "track_frame_time"; 118 private static final String SHOW_NON_RECTANGULAR_CLIP_KEY = "show_non_rect_clip"; 119 private static final String SHOW_HW_SCREEN_UPDATES_KEY = "show_hw_screen_udpates"; 120 private static final String SHOW_HW_LAYERS_UPDATES_KEY = "show_hw_layers_udpates"; 121 private static final String SHOW_HW_OVERDRAW_KEY = "show_hw_overdraw"; 122 private static final String DEBUG_LAYOUT_KEY = "debug_layout"; 123 private static final String WINDOW_ANIMATION_SCALE_KEY = "window_animation_scale"; 124 private static final String TRANSITION_ANIMATION_SCALE_KEY = "transition_animation_scale"; 125 private static final String ANIMATOR_DURATION_SCALE_KEY = "animator_duration_scale"; 126 private static final String OVERLAY_DISPLAY_DEVICES_KEY = "overlay_display_devices"; 127 private static final String DEBUG_DEBUGGING_CATEGORY_KEY = "debug_debugging_category"; 128 private static final String DEBUG_APPLICATIONS_CATEGORY_KEY = "debug_applications_category"; 129 130 private static final String OPENGL_TRACES_KEY = "enable_opengl_traces"; 131 132 private static final String IMMEDIATELY_DESTROY_ACTIVITIES_KEY 133 = "immediately_destroy_activities"; 134 private static final String APP_PROCESS_LIMIT_KEY = "app_process_limit"; 135 136 private static final String SHOW_ALL_ANRS_KEY = "show_all_anrs"; 137 138 private static final String WEBVIEW_EXPERIMENTAL_KEY = "experimental_webview"; 139 140 private static final String TAG_CONFIRM_ENFORCE = "confirm_enforce"; 141 142 private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive"; 143 144 private static final int RESULT_DEBUG_APP = 1000; 145 146 private IWindowManager mWindowManager; 147 private IBackupManager mBackupManager; 148 private DevicePolicyManager mDpm; 149 150 private Switch mEnabledSwitch; 151 private boolean mLastEnabledState; 152 private boolean mHaveDebugSettings; 153 private boolean mDontPokeProperties; 154 155 private CheckBoxPreference mEnableAdb; 156 private Preference mClearAdbKeys; 157 private Preference mBugreport; 158 private CheckBoxPreference mBugreportInPower; 159 private CheckBoxPreference mKeepScreenOn; 160 private CheckBoxPreference mEnforceReadExternal; 161 private CheckBoxPreference mAllowMockLocation; 162 private PreferenceScreen mPassword; 163 164 private String mDebugApp; 165 private Preference mDebugAppPref; 166 private CheckBoxPreference mWaitForDebugger; 167 private CheckBoxPreference mVerifyAppsOverUsb; 168 169 private CheckBoxPreference mStrictMode; 170 private CheckBoxPreference mPointerLocation; 171 private CheckBoxPreference mShowTouches; 172 private CheckBoxPreference mShowScreenUpdates; 173 private CheckBoxPreference mDisableOverlays; 174 private CheckBoxPreference mShowCpuUsage; 175 private CheckBoxPreference mForceHardwareUi; 176 private CheckBoxPreference mForceMsaa; 177 private CheckBoxPreference mShowHwScreenUpdates; 178 private CheckBoxPreference mShowHwLayersUpdates; 179 private CheckBoxPreference mShowHwOverdraw; 180 private CheckBoxPreference mDebugLayout; 181 private ListPreference mTrackFrameTime; 182 private ListPreference mShowNonRectClip; 183 private ListPreference mWindowAnimationScale; 184 private ListPreference mTransitionAnimationScale; 185 private ListPreference mAnimatorDurationScale; 186 private ListPreference mOverlayDisplayDevices; 187 private ListPreference mOpenGLTraces; 188 189 private CheckBoxPreference mImmediatelyDestroyActivities; 190 private ListPreference mAppProcessLimit; 191 192 private CheckBoxPreference mShowAllANRs; 193 private CheckBoxPreference mExperimentalWebView; 194 195 private final ArrayList<Preference> mAllPrefs = new ArrayList<Preference>(); 196 private final ArrayList<CheckBoxPreference> mResetCbPrefs 197 = new ArrayList<CheckBoxPreference>(); 198 199 private final HashSet<Preference> mDisabledPrefs = new HashSet<Preference>(); 200 201 // To track whether a confirmation dialog was clicked. 202 private boolean mDialogClicked; 203 private Dialog mEnableDialog; 204 private Dialog mAdbDialog; 205 private Dialog mAdbKeysDialog; 206 207 private boolean mUnavailable; 208 209 @Override onCreate(Bundle icicle)210 public void onCreate(Bundle icicle) { 211 super.onCreate(icicle); 212 213 mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); 214 mBackupManager = IBackupManager.Stub.asInterface( 215 ServiceManager.getService(Context.BACKUP_SERVICE)); 216 mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE); 217 218 if (android.os.Process.myUserHandle().getIdentifier() != UserHandle.USER_OWNER) { 219 mUnavailable = true; 220 setPreferenceScreen(new PreferenceScreen(getActivity(), null)); 221 return; 222 } 223 224 addPreferencesFromResource(R.xml.development_prefs); 225 226 mEnableAdb = findAndInitCheckboxPref(ENABLE_ADB); 227 mClearAdbKeys = findPreference(CLEAR_ADB_KEYS); 228 if (!SystemProperties.getBoolean("ro.adb.secure", false)) { 229 PreferenceGroup debugDebuggingCategory = (PreferenceGroup) 230 findPreference(DEBUG_DEBUGGING_CATEGORY_KEY); 231 if (debugDebuggingCategory != null) { 232 debugDebuggingCategory.removePreference(mClearAdbKeys); 233 } 234 } 235 236 mBugreport = findPreference(BUGREPORT); 237 mBugreportInPower = findAndInitCheckboxPref(BUGREPORT_IN_POWER_KEY); 238 mKeepScreenOn = findAndInitCheckboxPref(KEEP_SCREEN_ON); 239 mEnforceReadExternal = findAndInitCheckboxPref(ENFORCE_READ_EXTERNAL); 240 mAllowMockLocation = findAndInitCheckboxPref(ALLOW_MOCK_LOCATION); 241 mPassword = (PreferenceScreen) findPreference(LOCAL_BACKUP_PASSWORD); 242 mAllPrefs.add(mPassword); 243 244 if (!android.os.Process.myUserHandle().equals(UserHandle.OWNER)) { 245 disableForUser(mEnableAdb); 246 disableForUser(mClearAdbKeys); 247 disableForUser(mPassword); 248 } 249 250 mDebugAppPref = findPreference(DEBUG_APP_KEY); 251 mAllPrefs.add(mDebugAppPref); 252 mWaitForDebugger = findAndInitCheckboxPref(WAIT_FOR_DEBUGGER_KEY); 253 mVerifyAppsOverUsb = findAndInitCheckboxPref(VERIFY_APPS_OVER_USB_KEY); 254 if (!showVerifierSetting()) { 255 PreferenceGroup debugDebuggingCategory = (PreferenceGroup) 256 findPreference(DEBUG_DEBUGGING_CATEGORY_KEY); 257 if (debugDebuggingCategory != null) { 258 debugDebuggingCategory.removePreference(mVerifyAppsOverUsb); 259 } else { 260 mVerifyAppsOverUsb.setEnabled(false); 261 } 262 } 263 mStrictMode = findAndInitCheckboxPref(STRICT_MODE_KEY); 264 mPointerLocation = findAndInitCheckboxPref(POINTER_LOCATION_KEY); 265 mShowTouches = findAndInitCheckboxPref(SHOW_TOUCHES_KEY); 266 mShowScreenUpdates = findAndInitCheckboxPref(SHOW_SCREEN_UPDATES_KEY); 267 mDisableOverlays = findAndInitCheckboxPref(DISABLE_OVERLAYS_KEY); 268 mShowCpuUsage = findAndInitCheckboxPref(SHOW_CPU_USAGE_KEY); 269 mForceHardwareUi = findAndInitCheckboxPref(FORCE_HARDWARE_UI_KEY); 270 mForceMsaa = findAndInitCheckboxPref(FORCE_MSAA_KEY); 271 mTrackFrameTime = addListPreference(TRACK_FRAME_TIME_KEY); 272 mShowNonRectClip = addListPreference(SHOW_NON_RECTANGULAR_CLIP_KEY); 273 mShowHwScreenUpdates = findAndInitCheckboxPref(SHOW_HW_SCREEN_UPDATES_KEY); 274 mShowHwLayersUpdates = findAndInitCheckboxPref(SHOW_HW_LAYERS_UPDATES_KEY); 275 mShowHwOverdraw = findAndInitCheckboxPref(SHOW_HW_OVERDRAW_KEY); 276 mDebugLayout = findAndInitCheckboxPref(DEBUG_LAYOUT_KEY); 277 mWindowAnimationScale = addListPreference(WINDOW_ANIMATION_SCALE_KEY); 278 mTransitionAnimationScale = addListPreference(TRANSITION_ANIMATION_SCALE_KEY); 279 mAnimatorDurationScale = addListPreference(ANIMATOR_DURATION_SCALE_KEY); 280 mOverlayDisplayDevices = addListPreference(OVERLAY_DISPLAY_DEVICES_KEY); 281 mOpenGLTraces = addListPreference(OPENGL_TRACES_KEY); 282 283 mImmediatelyDestroyActivities = (CheckBoxPreference) findPreference( 284 IMMEDIATELY_DESTROY_ACTIVITIES_KEY); 285 mAllPrefs.add(mImmediatelyDestroyActivities); 286 mResetCbPrefs.add(mImmediatelyDestroyActivities); 287 mAppProcessLimit = addListPreference(APP_PROCESS_LIMIT_KEY); 288 289 mShowAllANRs = (CheckBoxPreference) findPreference( 290 SHOW_ALL_ANRS_KEY); 291 mAllPrefs.add(mShowAllANRs); 292 mResetCbPrefs.add(mShowAllANRs); 293 294 if (WebViewFactory.isExperimentalWebViewAvailable()) { 295 mExperimentalWebView = findAndInitCheckboxPref(WEBVIEW_EXPERIMENTAL_KEY); 296 } else { 297 Preference experimentalWebView = findPreference(WEBVIEW_EXPERIMENTAL_KEY); 298 PreferenceGroup debugApplicationsCategory = (PreferenceGroup) 299 findPreference(DEBUG_APPLICATIONS_CATEGORY_KEY); 300 if (debugApplicationsCategory != null) { 301 debugApplicationsCategory.removePreference(experimentalWebView); 302 } 303 } 304 305 Preference hdcpChecking = findPreference(HDCP_CHECKING_KEY); 306 if (hdcpChecking != null) { 307 mAllPrefs.add(hdcpChecking); 308 } 309 removeHdcpOptionsForProduction(); 310 } 311 addListPreference(String prefKey)312 private ListPreference addListPreference(String prefKey) { 313 ListPreference pref = (ListPreference) findPreference(prefKey); 314 mAllPrefs.add(pref); 315 pref.setOnPreferenceChangeListener(this); 316 return pref; 317 } 318 disableForUser(Preference pref)319 private void disableForUser(Preference pref) { 320 if (pref != null) { 321 pref.setEnabled(false); 322 mDisabledPrefs.add(pref); 323 } 324 } 325 findAndInitCheckboxPref(String key)326 private CheckBoxPreference findAndInitCheckboxPref(String key) { 327 CheckBoxPreference pref = (CheckBoxPreference) findPreference(key); 328 if (pref == null) { 329 throw new IllegalArgumentException("Cannot find preference with key = " + key); 330 } 331 mAllPrefs.add(pref); 332 mResetCbPrefs.add(pref); 333 return pref; 334 } 335 336 @Override onActivityCreated(Bundle savedInstanceState)337 public void onActivityCreated(Bundle savedInstanceState) { 338 super.onActivityCreated(savedInstanceState); 339 340 final Activity activity = getActivity(); 341 mEnabledSwitch = new Switch(activity); 342 343 final int padding = activity.getResources().getDimensionPixelSize( 344 R.dimen.action_bar_switch_padding); 345 mEnabledSwitch.setPaddingRelative(0, 0, padding, 0); 346 if (mUnavailable) { 347 mEnabledSwitch.setEnabled(false); 348 return; 349 } 350 mEnabledSwitch.setOnCheckedChangeListener(this); 351 } 352 353 @Override onStart()354 public void onStart() { 355 super.onStart(); 356 final Activity activity = getActivity(); 357 activity.getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM, 358 ActionBar.DISPLAY_SHOW_CUSTOM); 359 activity.getActionBar().setCustomView(mEnabledSwitch, new ActionBar.LayoutParams( 360 ActionBar.LayoutParams.WRAP_CONTENT, 361 ActionBar.LayoutParams.WRAP_CONTENT, 362 Gravity.CENTER_VERTICAL | Gravity.END)); 363 } 364 365 @Override onStop()366 public void onStop() { 367 super.onStop(); 368 final Activity activity = getActivity(); 369 activity.getActionBar().setDisplayOptions(0, ActionBar.DISPLAY_SHOW_CUSTOM); 370 activity.getActionBar().setCustomView(null); 371 } 372 removeHdcpOptionsForProduction()373 private void removeHdcpOptionsForProduction() { 374 if ("user".equals(Build.TYPE)) { 375 Preference hdcpChecking = findPreference(HDCP_CHECKING_KEY); 376 if (hdcpChecking != null) { 377 // Remove the preference 378 getPreferenceScreen().removePreference(hdcpChecking); 379 mAllPrefs.remove(hdcpChecking); 380 } 381 } 382 } 383 setPrefsEnabledState(boolean enabled)384 private void setPrefsEnabledState(boolean enabled) { 385 for (int i = 0; i < mAllPrefs.size(); i++) { 386 Preference pref = mAllPrefs.get(i); 387 pref.setEnabled(enabled && !mDisabledPrefs.contains(pref)); 388 } 389 updateAllOptions(); 390 } 391 392 @Override onResume()393 public void onResume() { 394 super.onResume(); 395 396 if (mUnavailable) { 397 // Show error message 398 TextView emptyView = (TextView) getView().findViewById(android.R.id.empty); 399 getListView().setEmptyView(emptyView); 400 if (emptyView != null) { 401 emptyView.setText(R.string.development_settings_not_available); 402 } 403 return; 404 } 405 406 if (mDpm.getMaximumTimeToLock(null) > 0) { 407 // A DeviceAdmin has specified a maximum time until the device 408 // will lock... in this case we can't allow the user to turn 409 // on "stay awake when plugged in" because that would defeat the 410 // restriction. 411 mDisabledPrefs.add(mKeepScreenOn); 412 } else { 413 mDisabledPrefs.remove(mKeepScreenOn); 414 } 415 416 final ContentResolver cr = getActivity().getContentResolver(); 417 mLastEnabledState = Settings.Global.getInt(cr, 418 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0; 419 mEnabledSwitch.setChecked(mLastEnabledState); 420 setPrefsEnabledState(mLastEnabledState); 421 422 if (mHaveDebugSettings && !mLastEnabledState) { 423 // Overall debugging is disabled, but there are some debug 424 // settings that are enabled. This is an invalid state. Switch 425 // to debug settings being enabled, so the user knows there is 426 // stuff enabled and can turn it all off if they want. 427 Settings.Global.putInt(getActivity().getContentResolver(), 428 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1); 429 mLastEnabledState = true; 430 mEnabledSwitch.setChecked(mLastEnabledState); 431 setPrefsEnabledState(mLastEnabledState); 432 } 433 } 434 updateCheckBox(CheckBoxPreference checkBox, boolean value)435 void updateCheckBox(CheckBoxPreference checkBox, boolean value) { 436 checkBox.setChecked(value); 437 mHaveDebugSettings |= value; 438 } 439 updateAllOptions()440 private void updateAllOptions() { 441 final Context context = getActivity(); 442 final ContentResolver cr = context.getContentResolver(); 443 mHaveDebugSettings = false; 444 updateCheckBox(mEnableAdb, Settings.Global.getInt(cr, 445 Settings.Global.ADB_ENABLED, 0) != 0); 446 updateCheckBox(mBugreportInPower, Settings.Secure.getInt(cr, 447 Settings.Secure.BUGREPORT_IN_POWER_MENU, 0) != 0); 448 updateCheckBox(mKeepScreenOn, Settings.Global.getInt(cr, 449 Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0) != 0); 450 updateCheckBox(mEnforceReadExternal, isPermissionEnforced(READ_EXTERNAL_STORAGE)); 451 updateCheckBox(mAllowMockLocation, Settings.Secure.getInt(cr, 452 Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0); 453 updateHdcpValues(); 454 updatePasswordSummary(); 455 updateDebuggerOptions(); 456 updateStrictModeVisualOptions(); 457 updatePointerLocationOptions(); 458 updateShowTouchesOptions(); 459 updateFlingerOptions(); 460 updateCpuUsageOptions(); 461 updateHardwareUiOptions(); 462 updateMsaaOptions(); 463 updateTrackFrameTimeOptions(); 464 updateShowNonRectClipOptions(); 465 updateShowHwScreenUpdatesOptions(); 466 updateShowHwLayersUpdatesOptions(); 467 updateShowHwOverdrawOptions(); 468 updateDebugLayoutOptions(); 469 updateAnimationScaleOptions(); 470 updateOverlayDisplayDevicesOptions(); 471 updateOpenGLTracesOptions(); 472 updateImmediatelyDestroyActivitiesOptions(); 473 updateAppProcessLimitOptions(); 474 updateShowAllANRsOptions(); 475 updateExperimentalWebViewOptions(); 476 updateVerifyAppsOverUsbOptions(); 477 updateBugreportOptions(); 478 } 479 resetDangerousOptions()480 private void resetDangerousOptions() { 481 mDontPokeProperties = true; 482 for (int i=0; i<mResetCbPrefs.size(); i++) { 483 CheckBoxPreference cb = mResetCbPrefs.get(i); 484 if (cb.isChecked()) { 485 cb.setChecked(false); 486 onPreferenceTreeClick(null, cb); 487 } 488 } 489 resetDebuggerOptions(); 490 writeAnimationScaleOption(0, mWindowAnimationScale, null); 491 writeAnimationScaleOption(1, mTransitionAnimationScale, null); 492 writeAnimationScaleOption(2, mAnimatorDurationScale, null); 493 writeOverlayDisplayDevicesOptions(null); 494 writeAppProcessLimitOptions(null); 495 mHaveDebugSettings = false; 496 updateAllOptions(); 497 mDontPokeProperties = false; 498 pokeSystemProperties(); 499 } 500 updateHdcpValues()501 private void updateHdcpValues() { 502 int index = 1; // Defaults to drm-only. Needs to match with R.array.hdcp_checking_values 503 ListPreference hdcpChecking = (ListPreference) findPreference(HDCP_CHECKING_KEY); 504 if (hdcpChecking != null) { 505 String currentValue = SystemProperties.get(HDCP_CHECKING_PROPERTY); 506 String[] values = getResources().getStringArray(R.array.hdcp_checking_values); 507 String[] summaries = getResources().getStringArray(R.array.hdcp_checking_summaries); 508 for (int i = 0; i < values.length; i++) { 509 if (currentValue.equals(values[i])) { 510 index = i; 511 break; 512 } 513 } 514 hdcpChecking.setValue(values[index]); 515 hdcpChecking.setSummary(summaries[index]); 516 hdcpChecking.setOnPreferenceChangeListener(this); 517 } 518 } 519 updatePasswordSummary()520 private void updatePasswordSummary() { 521 try { 522 if (mBackupManager.hasBackupPassword()) { 523 mPassword.setSummary(R.string.local_backup_password_summary_change); 524 } else { 525 mPassword.setSummary(R.string.local_backup_password_summary_none); 526 } 527 } catch (RemoteException e) { 528 // Not much we can do here 529 } 530 } 531 writeDebuggerOptions()532 private void writeDebuggerOptions() { 533 try { 534 ActivityManagerNative.getDefault().setDebugApp( 535 mDebugApp, mWaitForDebugger.isChecked(), true); 536 } catch (RemoteException ex) { 537 } 538 } 539 resetDebuggerOptions()540 private static void resetDebuggerOptions() { 541 try { 542 ActivityManagerNative.getDefault().setDebugApp( 543 null, false, true); 544 } catch (RemoteException ex) { 545 } 546 } 547 updateDebuggerOptions()548 private void updateDebuggerOptions() { 549 mDebugApp = Settings.Global.getString( 550 getActivity().getContentResolver(), Settings.Global.DEBUG_APP); 551 updateCheckBox(mWaitForDebugger, Settings.Global.getInt( 552 getActivity().getContentResolver(), Settings.Global.WAIT_FOR_DEBUGGER, 0) != 0); 553 if (mDebugApp != null && mDebugApp.length() > 0) { 554 String label; 555 try { 556 ApplicationInfo ai = getActivity().getPackageManager().getApplicationInfo(mDebugApp, 557 PackageManager.GET_DISABLED_COMPONENTS); 558 CharSequence lab = getActivity().getPackageManager().getApplicationLabel(ai); 559 label = lab != null ? lab.toString() : mDebugApp; 560 } catch (PackageManager.NameNotFoundException e) { 561 label = mDebugApp; 562 } 563 mDebugAppPref.setSummary(getResources().getString(R.string.debug_app_set, label)); 564 mWaitForDebugger.setEnabled(true); 565 mHaveDebugSettings = true; 566 } else { 567 mDebugAppPref.setSummary(getResources().getString(R.string.debug_app_not_set)); 568 mWaitForDebugger.setEnabled(false); 569 } 570 } 571 updateVerifyAppsOverUsbOptions()572 private void updateVerifyAppsOverUsbOptions() { 573 updateCheckBox(mVerifyAppsOverUsb, Settings.Global.getInt(getActivity().getContentResolver(), 574 Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB, 1) != 0); 575 mVerifyAppsOverUsb.setEnabled(enableVerifierSetting()); 576 } 577 writeVerifyAppsOverUsbOptions()578 private void writeVerifyAppsOverUsbOptions() { 579 Settings.Global.putInt(getActivity().getContentResolver(), 580 Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB, mVerifyAppsOverUsb.isChecked() ? 1 : 0); 581 } 582 enableVerifierSetting()583 private boolean enableVerifierSetting() { 584 final ContentResolver cr = getActivity().getContentResolver(); 585 if (Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) == 0) { 586 return false; 587 } 588 if (Settings.Global.getInt(cr, Settings.Global.PACKAGE_VERIFIER_ENABLE, 1) == 0) { 589 return false; 590 } else { 591 final PackageManager pm = getActivity().getPackageManager(); 592 final Intent verification = new Intent(Intent.ACTION_PACKAGE_NEEDS_VERIFICATION); 593 verification.setType(PACKAGE_MIME_TYPE); 594 verification.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 595 final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(verification, 0); 596 if (receivers.size() == 0) { 597 return false; 598 } 599 } 600 return true; 601 } 602 showVerifierSetting()603 private boolean showVerifierSetting() { 604 return Settings.Global.getInt(getActivity().getContentResolver(), 605 Settings.Global.PACKAGE_VERIFIER_SETTING_VISIBLE, 1) > 0; 606 } 607 updateBugreportOptions()608 private void updateBugreportOptions() { 609 if ("user".equals(Build.TYPE)) { 610 final ContentResolver resolver = getActivity().getContentResolver(); 611 final boolean adbEnabled = Settings.Global.getInt( 612 resolver, Settings.Global.ADB_ENABLED, 0) != 0; 613 if (adbEnabled) { 614 mBugreport.setEnabled(true); 615 mBugreportInPower.setEnabled(true); 616 } else { 617 mBugreport.setEnabled(false); 618 mBugreportInPower.setEnabled(false); 619 mBugreportInPower.setChecked(false); 620 Settings.Secure.putInt(resolver, Settings.Secure.BUGREPORT_IN_POWER_MENU, 0); 621 } 622 } else { 623 mBugreportInPower.setEnabled(true); 624 } 625 } 626 627 // Returns the current state of the system property that controls 628 // strictmode flashes. One of: 629 // 0: not explicitly set one way or another 630 // 1: on 631 // 2: off currentStrictModeActiveIndex()632 private static int currentStrictModeActiveIndex() { 633 if (TextUtils.isEmpty(SystemProperties.get(StrictMode.VISUAL_PROPERTY))) { 634 return 0; 635 } 636 boolean enabled = SystemProperties.getBoolean(StrictMode.VISUAL_PROPERTY, false); 637 return enabled ? 1 : 2; 638 } 639 writeStrictModeVisualOptions()640 private void writeStrictModeVisualOptions() { 641 try { 642 mWindowManager.setStrictModeVisualIndicatorPreference(mStrictMode.isChecked() 643 ? "1" : ""); 644 } catch (RemoteException e) { 645 } 646 } 647 updateStrictModeVisualOptions()648 private void updateStrictModeVisualOptions() { 649 updateCheckBox(mStrictMode, currentStrictModeActiveIndex() == 1); 650 } 651 writePointerLocationOptions()652 private void writePointerLocationOptions() { 653 Settings.System.putInt(getActivity().getContentResolver(), 654 Settings.System.POINTER_LOCATION, mPointerLocation.isChecked() ? 1 : 0); 655 } 656 updatePointerLocationOptions()657 private void updatePointerLocationOptions() { 658 updateCheckBox(mPointerLocation, Settings.System.getInt(getActivity().getContentResolver(), 659 Settings.System.POINTER_LOCATION, 0) != 0); 660 } 661 writeShowTouchesOptions()662 private void writeShowTouchesOptions() { 663 Settings.System.putInt(getActivity().getContentResolver(), 664 Settings.System.SHOW_TOUCHES, mShowTouches.isChecked() ? 1 : 0); 665 } 666 updateShowTouchesOptions()667 private void updateShowTouchesOptions() { 668 updateCheckBox(mShowTouches, Settings.System.getInt(getActivity().getContentResolver(), 669 Settings.System.SHOW_TOUCHES, 0) != 0); 670 } 671 updateFlingerOptions()672 private void updateFlingerOptions() { 673 // magic communication with surface flinger. 674 try { 675 IBinder flinger = ServiceManager.getService("SurfaceFlinger"); 676 if (flinger != null) { 677 Parcel data = Parcel.obtain(); 678 Parcel reply = Parcel.obtain(); 679 data.writeInterfaceToken("android.ui.ISurfaceComposer"); 680 flinger.transact(1010, data, reply, 0); 681 @SuppressWarnings("unused") 682 int showCpu = reply.readInt(); 683 @SuppressWarnings("unused") 684 int enableGL = reply.readInt(); 685 int showUpdates = reply.readInt(); 686 updateCheckBox(mShowScreenUpdates, showUpdates != 0); 687 @SuppressWarnings("unused") 688 int showBackground = reply.readInt(); 689 int disableOverlays = reply.readInt(); 690 updateCheckBox(mDisableOverlays, disableOverlays != 0); 691 reply.recycle(); 692 data.recycle(); 693 } 694 } catch (RemoteException ex) { 695 } 696 } 697 writeShowUpdatesOption()698 private void writeShowUpdatesOption() { 699 try { 700 IBinder flinger = ServiceManager.getService("SurfaceFlinger"); 701 if (flinger != null) { 702 Parcel data = Parcel.obtain(); 703 data.writeInterfaceToken("android.ui.ISurfaceComposer"); 704 final int showUpdates = mShowScreenUpdates.isChecked() ? 1 : 0; 705 data.writeInt(showUpdates); 706 flinger.transact(1002, data, null, 0); 707 data.recycle(); 708 709 updateFlingerOptions(); 710 } 711 } catch (RemoteException ex) { 712 } 713 } 714 writeDisableOverlaysOption()715 private void writeDisableOverlaysOption() { 716 try { 717 IBinder flinger = ServiceManager.getService("SurfaceFlinger"); 718 if (flinger != null) { 719 Parcel data = Parcel.obtain(); 720 data.writeInterfaceToken("android.ui.ISurfaceComposer"); 721 final int disableOverlays = mDisableOverlays.isChecked() ? 1 : 0; 722 data.writeInt(disableOverlays); 723 flinger.transact(1008, data, null, 0); 724 data.recycle(); 725 726 updateFlingerOptions(); 727 } 728 } catch (RemoteException ex) { 729 } 730 } 731 updateHardwareUiOptions()732 private void updateHardwareUiOptions() { 733 updateCheckBox(mForceHardwareUi, SystemProperties.getBoolean(HARDWARE_UI_PROPERTY, false)); 734 } 735 writeHardwareUiOptions()736 private void writeHardwareUiOptions() { 737 SystemProperties.set(HARDWARE_UI_PROPERTY, mForceHardwareUi.isChecked() ? "true" : "false"); 738 pokeSystemProperties(); 739 } 740 updateMsaaOptions()741 private void updateMsaaOptions() { 742 updateCheckBox(mForceMsaa, SystemProperties.getBoolean(MSAA_PROPERTY, false)); 743 } 744 writeMsaaOptions()745 private void writeMsaaOptions() { 746 SystemProperties.set(MSAA_PROPERTY, mForceMsaa.isChecked() ? "true" : "false"); 747 pokeSystemProperties(); 748 } 749 updateTrackFrameTimeOptions()750 private void updateTrackFrameTimeOptions() { 751 String value = SystemProperties.get(HardwareRenderer.PROFILE_PROPERTY); 752 if (value == null) { 753 value = ""; 754 } 755 756 CharSequence[] values = mTrackFrameTime.getEntryValues(); 757 for (int i = 0; i < values.length; i++) { 758 if (value.contentEquals(values[i])) { 759 mTrackFrameTime.setValueIndex(i); 760 mTrackFrameTime.setSummary(mTrackFrameTime.getEntries()[i]); 761 return; 762 } 763 } 764 mTrackFrameTime.setValueIndex(0); 765 mTrackFrameTime.setSummary(mTrackFrameTime.getEntries()[0]); 766 } 767 writeTrackFrameTimeOptions(Object newValue)768 private void writeTrackFrameTimeOptions(Object newValue) { 769 SystemProperties.set(HardwareRenderer.PROFILE_PROPERTY, 770 newValue == null ? "" : newValue.toString()); 771 pokeSystemProperties(); 772 updateTrackFrameTimeOptions(); 773 } 774 updateShowNonRectClipOptions()775 private void updateShowNonRectClipOptions() { 776 String value = SystemProperties.get( 777 HardwareRenderer.DEBUG_SHOW_NON_RECTANGULAR_CLIP_PROPERTY); 778 if (value == null) { 779 value = "hide"; 780 } 781 782 CharSequence[] values = mShowNonRectClip.getEntryValues(); 783 for (int i = 0; i < values.length; i++) { 784 if (value.contentEquals(values[i])) { 785 mShowNonRectClip.setValueIndex(i); 786 mShowNonRectClip.setSummary(mShowNonRectClip.getEntries()[i]); 787 return; 788 } 789 } 790 mShowNonRectClip.setValueIndex(0); 791 mShowNonRectClip.setSummary(mShowNonRectClip.getEntries()[0]); 792 } 793 writeShowNonRectClipOptions(Object newValue)794 private void writeShowNonRectClipOptions(Object newValue) { 795 SystemProperties.set(HardwareRenderer.DEBUG_SHOW_NON_RECTANGULAR_CLIP_PROPERTY, 796 newValue == null ? "" : newValue.toString()); 797 pokeSystemProperties(); 798 updateShowNonRectClipOptions(); 799 } 800 updateShowHwScreenUpdatesOptions()801 private void updateShowHwScreenUpdatesOptions() { 802 updateCheckBox(mShowHwScreenUpdates, 803 SystemProperties.getBoolean(HardwareRenderer.DEBUG_DIRTY_REGIONS_PROPERTY, false)); 804 } 805 writeShowHwScreenUpdatesOptions()806 private void writeShowHwScreenUpdatesOptions() { 807 SystemProperties.set(HardwareRenderer.DEBUG_DIRTY_REGIONS_PROPERTY, 808 mShowHwScreenUpdates.isChecked() ? "true" : null); 809 pokeSystemProperties(); 810 } 811 updateShowHwLayersUpdatesOptions()812 private void updateShowHwLayersUpdatesOptions() { 813 updateCheckBox(mShowHwLayersUpdates, SystemProperties.getBoolean( 814 HardwareRenderer.DEBUG_SHOW_LAYERS_UPDATES_PROPERTY, false)); 815 } 816 writeShowHwLayersUpdatesOptions()817 private void writeShowHwLayersUpdatesOptions() { 818 SystemProperties.set(HardwareRenderer.DEBUG_SHOW_LAYERS_UPDATES_PROPERTY, 819 mShowHwLayersUpdates.isChecked() ? "true" : null); 820 pokeSystemProperties(); 821 } 822 updateShowHwOverdrawOptions()823 private void updateShowHwOverdrawOptions() { 824 updateCheckBox(mShowHwOverdraw, SystemProperties.getBoolean( 825 HardwareRenderer.DEBUG_SHOW_OVERDRAW_PROPERTY, false)); 826 } 827 writeShowHwOverdrawOptions()828 private void writeShowHwOverdrawOptions() { 829 SystemProperties.set(HardwareRenderer.DEBUG_SHOW_OVERDRAW_PROPERTY, 830 mShowHwOverdraw.isChecked() ? "true" : null); 831 pokeSystemProperties(); 832 } 833 updateDebugLayoutOptions()834 private void updateDebugLayoutOptions() { 835 updateCheckBox(mDebugLayout, 836 SystemProperties.getBoolean(View.DEBUG_LAYOUT_PROPERTY, false)); 837 } 838 writeDebugLayoutOptions()839 private void writeDebugLayoutOptions() { 840 SystemProperties.set(View.DEBUG_LAYOUT_PROPERTY, 841 mDebugLayout.isChecked() ? "true" : "false"); 842 pokeSystemProperties(); 843 } 844 updateCpuUsageOptions()845 private void updateCpuUsageOptions() { 846 updateCheckBox(mShowCpuUsage, Settings.Global.getInt(getActivity().getContentResolver(), 847 Settings.Global.SHOW_PROCESSES, 0) != 0); 848 } 849 writeCpuUsageOptions()850 private void writeCpuUsageOptions() { 851 boolean value = mShowCpuUsage.isChecked(); 852 Settings.Global.putInt(getActivity().getContentResolver(), 853 Settings.Global.SHOW_PROCESSES, value ? 1 : 0); 854 Intent service = (new Intent()) 855 .setClassName("com.android.systemui", "com.android.systemui.LoadAverageService"); 856 if (value) { 857 getActivity().startService(service); 858 } else { 859 getActivity().stopService(service); 860 } 861 } 862 writeImmediatelyDestroyActivitiesOptions()863 private void writeImmediatelyDestroyActivitiesOptions() { 864 try { 865 ActivityManagerNative.getDefault().setAlwaysFinish( 866 mImmediatelyDestroyActivities.isChecked()); 867 } catch (RemoteException ex) { 868 } 869 } 870 updateImmediatelyDestroyActivitiesOptions()871 private void updateImmediatelyDestroyActivitiesOptions() { 872 updateCheckBox(mImmediatelyDestroyActivities, Settings.Global.getInt( 873 getActivity().getContentResolver(), Settings.Global.ALWAYS_FINISH_ACTIVITIES, 0) != 0); 874 } 875 updateAnimationScaleValue(int which, ListPreference pref)876 private void updateAnimationScaleValue(int which, ListPreference pref) { 877 try { 878 float scale = mWindowManager.getAnimationScale(which); 879 if (scale != 1) { 880 mHaveDebugSettings = true; 881 } 882 CharSequence[] values = pref.getEntryValues(); 883 for (int i=0; i<values.length; i++) { 884 float val = Float.parseFloat(values[i].toString()); 885 if (scale <= val) { 886 pref.setValueIndex(i); 887 pref.setSummary(pref.getEntries()[i]); 888 return; 889 } 890 } 891 pref.setValueIndex(values.length-1); 892 pref.setSummary(pref.getEntries()[0]); 893 } catch (RemoteException e) { 894 } 895 } 896 updateAnimationScaleOptions()897 private void updateAnimationScaleOptions() { 898 updateAnimationScaleValue(0, mWindowAnimationScale); 899 updateAnimationScaleValue(1, mTransitionAnimationScale); 900 updateAnimationScaleValue(2, mAnimatorDurationScale); 901 } 902 writeAnimationScaleOption(int which, ListPreference pref, Object newValue)903 private void writeAnimationScaleOption(int which, ListPreference pref, Object newValue) { 904 try { 905 float scale = newValue != null ? Float.parseFloat(newValue.toString()) : 1; 906 mWindowManager.setAnimationScale(which, scale); 907 updateAnimationScaleValue(which, pref); 908 } catch (RemoteException e) { 909 } 910 } 911 updateOverlayDisplayDevicesOptions()912 private void updateOverlayDisplayDevicesOptions() { 913 String value = Settings.Global.getString(getActivity().getContentResolver(), 914 Settings.Global.OVERLAY_DISPLAY_DEVICES); 915 if (value == null) { 916 value = ""; 917 } 918 919 CharSequence[] values = mOverlayDisplayDevices.getEntryValues(); 920 for (int i = 0; i < values.length; i++) { 921 if (value.contentEquals(values[i])) { 922 mOverlayDisplayDevices.setValueIndex(i); 923 mOverlayDisplayDevices.setSummary(mOverlayDisplayDevices.getEntries()[i]); 924 return; 925 } 926 } 927 mOverlayDisplayDevices.setValueIndex(0); 928 mOverlayDisplayDevices.setSummary(mOverlayDisplayDevices.getEntries()[0]); 929 } 930 writeOverlayDisplayDevicesOptions(Object newValue)931 private void writeOverlayDisplayDevicesOptions(Object newValue) { 932 Settings.Global.putString(getActivity().getContentResolver(), 933 Settings.Global.OVERLAY_DISPLAY_DEVICES, (String)newValue); 934 updateOverlayDisplayDevicesOptions(); 935 } 936 updateOpenGLTracesOptions()937 private void updateOpenGLTracesOptions() { 938 String value = SystemProperties.get(OPENGL_TRACES_PROPERTY); 939 if (value == null) { 940 value = ""; 941 } 942 943 CharSequence[] values = mOpenGLTraces.getEntryValues(); 944 for (int i = 0; i < values.length; i++) { 945 if (value.contentEquals(values[i])) { 946 mOpenGLTraces.setValueIndex(i); 947 mOpenGLTraces.setSummary(mOpenGLTraces.getEntries()[i]); 948 return; 949 } 950 } 951 mOpenGLTraces.setValueIndex(0); 952 mOpenGLTraces.setSummary(mOpenGLTraces.getEntries()[0]); 953 } 954 writeOpenGLTracesOptions(Object newValue)955 private void writeOpenGLTracesOptions(Object newValue) { 956 SystemProperties.set(OPENGL_TRACES_PROPERTY, newValue == null ? "" : newValue.toString()); 957 pokeSystemProperties(); 958 updateOpenGLTracesOptions(); 959 } 960 updateAppProcessLimitOptions()961 private void updateAppProcessLimitOptions() { 962 try { 963 int limit = ActivityManagerNative.getDefault().getProcessLimit(); 964 CharSequence[] values = mAppProcessLimit.getEntryValues(); 965 for (int i=0; i<values.length; i++) { 966 int val = Integer.parseInt(values[i].toString()); 967 if (val >= limit) { 968 if (i != 0) { 969 mHaveDebugSettings = true; 970 } 971 mAppProcessLimit.setValueIndex(i); 972 mAppProcessLimit.setSummary(mAppProcessLimit.getEntries()[i]); 973 return; 974 } 975 } 976 mAppProcessLimit.setValueIndex(0); 977 mAppProcessLimit.setSummary(mAppProcessLimit.getEntries()[0]); 978 } catch (RemoteException e) { 979 } 980 } 981 writeAppProcessLimitOptions(Object newValue)982 private void writeAppProcessLimitOptions(Object newValue) { 983 try { 984 int limit = newValue != null ? Integer.parseInt(newValue.toString()) : -1; 985 ActivityManagerNative.getDefault().setProcessLimit(limit); 986 updateAppProcessLimitOptions(); 987 } catch (RemoteException e) { 988 } 989 } 990 writeShowAllANRsOptions()991 private void writeShowAllANRsOptions() { 992 Settings.Secure.putInt(getActivity().getContentResolver(), 993 Settings.Secure.ANR_SHOW_BACKGROUND, 994 mShowAllANRs.isChecked() ? 1 : 0); 995 } 996 updateShowAllANRsOptions()997 private void updateShowAllANRsOptions() { 998 updateCheckBox(mShowAllANRs, Settings.Secure.getInt( 999 getActivity().getContentResolver(), Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0); 1000 } 1001 writeExperimentalWebViewOptions()1002 private void writeExperimentalWebViewOptions() { 1003 if (mExperimentalWebView != null) { 1004 SystemProperties.set(WebViewFactory.WEBVIEW_EXPERIMENTAL_PROPERTY, 1005 mExperimentalWebView.isChecked() ? "true" : null); 1006 pokeSystemProperties(); 1007 } 1008 } 1009 updateExperimentalWebViewOptions()1010 private void updateExperimentalWebViewOptions() { 1011 if (mExperimentalWebView != null) { 1012 updateCheckBox(mExperimentalWebView, SystemProperties.getBoolean( 1013 WebViewFactory.WEBVIEW_EXPERIMENTAL_PROPERTY, false)); 1014 } 1015 } 1016 1017 @Override onCheckedChanged(CompoundButton buttonView, boolean isChecked)1018 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 1019 if (buttonView == mEnabledSwitch) { 1020 if (isChecked != mLastEnabledState) { 1021 if (isChecked) { 1022 mDialogClicked = false; 1023 if (mEnableDialog != null) dismissDialogs(); 1024 mEnableDialog = new AlertDialog.Builder(getActivity()).setMessage( 1025 getActivity().getResources().getString( 1026 R.string.dev_settings_warning_message)) 1027 .setTitle(R.string.dev_settings_warning_title) 1028 .setIconAttribute(android.R.attr.alertDialogIcon) 1029 .setPositiveButton(android.R.string.yes, this) 1030 .setNegativeButton(android.R.string.no, this) 1031 .show(); 1032 mEnableDialog.setOnDismissListener(this); 1033 } else { 1034 resetDangerousOptions(); 1035 Settings.Global.putInt(getActivity().getContentResolver(), 1036 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0); 1037 mLastEnabledState = isChecked; 1038 setPrefsEnabledState(mLastEnabledState); 1039 } 1040 } 1041 } 1042 } 1043 1044 @Override onActivityResult(int requestCode, int resultCode, Intent data)1045 public void onActivityResult(int requestCode, int resultCode, Intent data) { 1046 if (requestCode == RESULT_DEBUG_APP) { 1047 if (resultCode == Activity.RESULT_OK) { 1048 mDebugApp = data.getAction(); 1049 writeDebuggerOptions(); 1050 updateDebuggerOptions(); 1051 } 1052 } else { 1053 super.onActivityResult(requestCode, resultCode, data); 1054 } 1055 } 1056 1057 @Override onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)1058 public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { 1059 1060 if (Utils.isMonkeyRunning()) { 1061 return false; 1062 } 1063 1064 if (preference == mEnableAdb) { 1065 if (mEnableAdb.isChecked()) { 1066 mDialogClicked = false; 1067 if (mAdbDialog != null) dismissDialogs(); 1068 mAdbDialog = new AlertDialog.Builder(getActivity()).setMessage( 1069 getActivity().getResources().getString(R.string.adb_warning_message)) 1070 .setTitle(R.string.adb_warning_title) 1071 .setIconAttribute(android.R.attr.alertDialogIcon) 1072 .setPositiveButton(android.R.string.yes, this) 1073 .setNegativeButton(android.R.string.no, this) 1074 .show(); 1075 mAdbDialog.setOnDismissListener(this); 1076 } else { 1077 Settings.Global.putInt(getActivity().getContentResolver(), 1078 Settings.Global.ADB_ENABLED, 0); 1079 mVerifyAppsOverUsb.setEnabled(false); 1080 mVerifyAppsOverUsb.setChecked(false); 1081 updateBugreportOptions(); 1082 } 1083 } else if (preference == mClearAdbKeys) { 1084 if (mAdbKeysDialog != null) dismissDialogs(); 1085 mAdbKeysDialog = new AlertDialog.Builder(getActivity()) 1086 .setMessage(R.string.adb_keys_warning_message) 1087 .setPositiveButton(android.R.string.ok, this) 1088 .setNegativeButton(android.R.string.cancel, null) 1089 .show(); 1090 } else if (preference == mBugreportInPower) { 1091 Settings.Secure.putInt(getActivity().getContentResolver(), 1092 Settings.Secure.BUGREPORT_IN_POWER_MENU, 1093 mBugreportInPower.isChecked() ? 1 : 0); 1094 } else if (preference == mKeepScreenOn) { 1095 Settings.Global.putInt(getActivity().getContentResolver(), 1096 Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 1097 mKeepScreenOn.isChecked() ? 1098 (BatteryManager.BATTERY_PLUGGED_AC | BatteryManager.BATTERY_PLUGGED_USB) : 0); 1099 } else if (preference == mEnforceReadExternal) { 1100 if (mEnforceReadExternal.isChecked()) { 1101 ConfirmEnforceFragment.show(this); 1102 } else { 1103 setPermissionEnforced(getActivity(), READ_EXTERNAL_STORAGE, false); 1104 } 1105 } else if (preference == mAllowMockLocation) { 1106 Settings.Secure.putInt(getActivity().getContentResolver(), 1107 Settings.Secure.ALLOW_MOCK_LOCATION, 1108 mAllowMockLocation.isChecked() ? 1 : 0); 1109 } else if (preference == mDebugAppPref) { 1110 startActivityForResult(new Intent(getActivity(), AppPicker.class), RESULT_DEBUG_APP); 1111 } else if (preference == mWaitForDebugger) { 1112 writeDebuggerOptions(); 1113 } else if (preference == mVerifyAppsOverUsb) { 1114 writeVerifyAppsOverUsbOptions(); 1115 } else if (preference == mStrictMode) { 1116 writeStrictModeVisualOptions(); 1117 } else if (preference == mPointerLocation) { 1118 writePointerLocationOptions(); 1119 } else if (preference == mShowTouches) { 1120 writeShowTouchesOptions(); 1121 } else if (preference == mShowScreenUpdates) { 1122 writeShowUpdatesOption(); 1123 } else if (preference == mDisableOverlays) { 1124 writeDisableOverlaysOption(); 1125 } else if (preference == mShowCpuUsage) { 1126 writeCpuUsageOptions(); 1127 } else if (preference == mImmediatelyDestroyActivities) { 1128 writeImmediatelyDestroyActivitiesOptions(); 1129 } else if (preference == mShowAllANRs) { 1130 writeShowAllANRsOptions(); 1131 } else if (preference == mExperimentalWebView) { 1132 writeExperimentalWebViewOptions(); 1133 } else if (preference == mForceHardwareUi) { 1134 writeHardwareUiOptions(); 1135 } else if (preference == mForceMsaa) { 1136 writeMsaaOptions(); 1137 } else if (preference == mShowHwScreenUpdates) { 1138 writeShowHwScreenUpdatesOptions(); 1139 } else if (preference == mShowHwLayersUpdates) { 1140 writeShowHwLayersUpdatesOptions(); 1141 } else if (preference == mShowHwOverdraw) { 1142 writeShowHwOverdrawOptions(); 1143 } else if (preference == mDebugLayout) { 1144 writeDebugLayoutOptions(); 1145 } 1146 1147 return false; 1148 } 1149 1150 @Override onPreferenceChange(Preference preference, Object newValue)1151 public boolean onPreferenceChange(Preference preference, Object newValue) { 1152 if (HDCP_CHECKING_KEY.equals(preference.getKey())) { 1153 SystemProperties.set(HDCP_CHECKING_PROPERTY, newValue.toString()); 1154 updateHdcpValues(); 1155 pokeSystemProperties(); 1156 return true; 1157 } else if (preference == mWindowAnimationScale) { 1158 writeAnimationScaleOption(0, mWindowAnimationScale, newValue); 1159 return true; 1160 } else if (preference == mTransitionAnimationScale) { 1161 writeAnimationScaleOption(1, mTransitionAnimationScale, newValue); 1162 return true; 1163 } else if (preference == mAnimatorDurationScale) { 1164 writeAnimationScaleOption(2, mAnimatorDurationScale, newValue); 1165 return true; 1166 } else if (preference == mOverlayDisplayDevices) { 1167 writeOverlayDisplayDevicesOptions(newValue); 1168 return true; 1169 } else if (preference == mOpenGLTraces) { 1170 writeOpenGLTracesOptions(newValue); 1171 return true; 1172 } else if (preference == mTrackFrameTime) { 1173 writeTrackFrameTimeOptions(newValue); 1174 return true; 1175 } else if (preference == mShowNonRectClip) { 1176 writeShowNonRectClipOptions(newValue); 1177 return true; 1178 } else if (preference == mAppProcessLimit) { 1179 writeAppProcessLimitOptions(newValue); 1180 return true; 1181 } 1182 return false; 1183 } 1184 dismissDialogs()1185 private void dismissDialogs() { 1186 if (mAdbDialog != null) { 1187 mAdbDialog.dismiss(); 1188 mAdbDialog = null; 1189 } 1190 if (mAdbKeysDialog != null) { 1191 mAdbKeysDialog.dismiss(); 1192 mAdbKeysDialog = null; 1193 } 1194 if (mEnableDialog != null) { 1195 mEnableDialog.dismiss(); 1196 mEnableDialog = null; 1197 } 1198 } 1199 onClick(DialogInterface dialog, int which)1200 public void onClick(DialogInterface dialog, int which) { 1201 if (dialog == mAdbDialog) { 1202 if (which == DialogInterface.BUTTON_POSITIVE) { 1203 mDialogClicked = true; 1204 Settings.Global.putInt(getActivity().getContentResolver(), 1205 Settings.Global.ADB_ENABLED, 1); 1206 mVerifyAppsOverUsb.setEnabled(true); 1207 updateVerifyAppsOverUsbOptions(); 1208 updateBugreportOptions(); 1209 } else { 1210 // Reset the toggle 1211 mEnableAdb.setChecked(false); 1212 } 1213 } else if (dialog == mAdbKeysDialog) { 1214 if (which == DialogInterface.BUTTON_POSITIVE) { 1215 try { 1216 IBinder b = ServiceManager.getService(Context.USB_SERVICE); 1217 IUsbManager service = IUsbManager.Stub.asInterface(b); 1218 service.clearUsbDebuggingKeys(); 1219 } catch (RemoteException e) { 1220 Log.e(TAG, "Unable to clear adb keys", e); 1221 } 1222 } 1223 } else if (dialog == mEnableDialog) { 1224 if (which == DialogInterface.BUTTON_POSITIVE) { 1225 mDialogClicked = true; 1226 Settings.Global.putInt(getActivity().getContentResolver(), 1227 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1); 1228 mLastEnabledState = true; 1229 setPrefsEnabledState(mLastEnabledState); 1230 } else { 1231 // Reset the toggle 1232 mEnabledSwitch.setChecked(false); 1233 } 1234 } 1235 } 1236 onDismiss(DialogInterface dialog)1237 public void onDismiss(DialogInterface dialog) { 1238 // Assuming that onClick gets called first 1239 if (dialog == mAdbDialog) { 1240 if (!mDialogClicked) { 1241 mEnableAdb.setChecked(false); 1242 } 1243 mAdbDialog = null; 1244 } else if (dialog == mEnableDialog) { 1245 if (!mDialogClicked) { 1246 mEnabledSwitch.setChecked(false); 1247 } 1248 mEnableDialog = null; 1249 } 1250 } 1251 1252 @Override onDestroy()1253 public void onDestroy() { 1254 dismissDialogs(); 1255 super.onDestroy(); 1256 } 1257 pokeSystemProperties()1258 void pokeSystemProperties() { 1259 if (!mDontPokeProperties) { 1260 //noinspection unchecked 1261 (new SystemPropPoker()).execute(); 1262 } 1263 } 1264 1265 static class SystemPropPoker extends AsyncTask<Void, Void, Void> { 1266 @Override doInBackground(Void... params)1267 protected Void doInBackground(Void... params) { 1268 String[] services; 1269 try { 1270 services = ServiceManager.listServices(); 1271 } catch (RemoteException e) { 1272 return null; 1273 } 1274 for (String service : services) { 1275 IBinder obj = ServiceManager.checkService(service); 1276 if (obj != null) { 1277 Parcel data = Parcel.obtain(); 1278 try { 1279 obj.transact(IBinder.SYSPROPS_TRANSACTION, data, null, 0); 1280 } catch (RemoteException e) { 1281 } catch (Exception e) { 1282 Log.i(TAG, "Somone wrote a bad service '" + service 1283 + "' that doesn't like to be poked: " + e); 1284 } 1285 data.recycle(); 1286 } 1287 } 1288 return null; 1289 } 1290 } 1291 1292 /** 1293 * Dialog to confirm enforcement of {@link android.Manifest.permission#READ_EXTERNAL_STORAGE}. 1294 */ 1295 public static class ConfirmEnforceFragment extends DialogFragment { show(DevelopmentSettings parent)1296 public static void show(DevelopmentSettings parent) { 1297 final ConfirmEnforceFragment dialog = new ConfirmEnforceFragment(); 1298 dialog.setTargetFragment(parent, 0); 1299 dialog.show(parent.getFragmentManager(), TAG_CONFIRM_ENFORCE); 1300 } 1301 1302 @Override onCreateDialog(Bundle savedInstanceState)1303 public Dialog onCreateDialog(Bundle savedInstanceState) { 1304 final Context context = getActivity(); 1305 1306 final AlertDialog.Builder builder = new AlertDialog.Builder(context); 1307 builder.setTitle(R.string.enforce_read_external_confirm_title); 1308 builder.setMessage(R.string.enforce_read_external_confirm_message); 1309 1310 builder.setPositiveButton(android.R.string.ok, new OnClickListener() { 1311 @Override 1312 public void onClick(DialogInterface dialog, int which) { 1313 setPermissionEnforced(context, READ_EXTERNAL_STORAGE, true); 1314 ((DevelopmentSettings) getTargetFragment()).updateAllOptions(); 1315 } 1316 }); 1317 builder.setNegativeButton(android.R.string.cancel, new OnClickListener() { 1318 @Override 1319 public void onClick(DialogInterface dialog, int which) { 1320 ((DevelopmentSettings) getTargetFragment()).updateAllOptions(); 1321 } 1322 }); 1323 1324 return builder.create(); 1325 } 1326 } 1327 isPermissionEnforced(String permission)1328 private static boolean isPermissionEnforced(String permission) { 1329 try { 1330 return ActivityThread.getPackageManager().isPermissionEnforced(permission); 1331 } catch (RemoteException e) { 1332 throw new RuntimeException("Problem talking with PackageManager", e); 1333 } 1334 } 1335 setPermissionEnforced( Context context, String permission, boolean enforced)1336 private static void setPermissionEnforced( 1337 Context context, String permission, boolean enforced) { 1338 try { 1339 // TODO: offload to background thread 1340 ActivityThread.getPackageManager() 1341 .setPermissionEnforced(READ_EXTERNAL_STORAGE, enforced); 1342 } catch (RemoteException e) { 1343 throw new RuntimeException("Problem talking with PackageManager", e); 1344 } 1345 } 1346 } 1347