1 /* 2 * Copyright (C) 2014 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.tv.settings.system; 18 19 import com.android.tv.settings.ActionBehavior; 20 import com.android.tv.settings.ActionKey; 21 import com.android.tv.settings.BaseSettingsActivity; 22 import com.android.tv.settings.R; 23 import com.android.tv.settings.util.SettingsHelper; 24 import com.android.tv.settings.dialog.old.Action; 25 import com.android.tv.settings.dialog.old.ActionAdapter; 26 import com.android.tv.settings.dialog.old.ActionFragment; 27 import com.android.tv.settings.dialog.old.ContentFragment; 28 import com.android.tv.settings.dialog.old.EditTextFragment; 29 30 import android.app.ActivityManagerNative; 31 import android.app.ActivityThread; 32 import android.bluetooth.BluetoothAdapter; 33 import android.content.ContentResolver; 34 import android.content.Context; 35 import android.content.Intent; 36 import android.content.pm.ApplicationInfo; 37 import android.net.wifi.WifiManager; 38 import android.os.Build; 39 import android.os.Bundle; 40 import android.os.IBinder; 41 import android.os.Parcel; 42 import android.os.PowerManager; 43 import android.os.Process; 44 import android.os.RemoteException; 45 import android.os.ServiceManager; 46 import android.os.StrictMode; 47 import android.os.SystemProperties; 48 import android.provider.Settings; 49 import android.util.Log; 50 import android.view.HardwareRenderer; 51 import android.view.IWindowManager; 52 import android.view.View; 53 54 import java.io.BufferedWriter; 55 import java.io.File; 56 import java.io.FileWriter; 57 import java.io.IOException; 58 import java.text.Collator; 59 import java.util.ArrayList; 60 import java.util.Collections; 61 import java.util.Comparator; 62 import java.util.List; 63 64 public class DeveloperOptionsActivity extends BaseSettingsActivity 65 implements ActionAdapter.Listener { 66 67 private static final String TAG = "DeveloperOptionsActivity"; 68 private static final boolean DEBUG = false; 69 70 private static final int INDEX_WINDOW_ANIMATION_SCALE = 0; 71 private static final int INDEX_TRANSITION_ANIMATION_SCALE = 1; 72 private static final int INDEX_ANIMATOR_DURATION_SCALE = 2; 73 private static final String KEY_SCALE = "scale_value"; 74 private static final String OPENGL_TRACES_PROPERTY = "debug.egl.trace"; 75 private static final String HDCP_CHECKING_PROPERTY = "persist.sys.hdcp_checking"; 76 77 private static final String HDMI_OPTIMIZATION_PROPERTY = "persist.sys.hdmi.resolution"; 78 79 private static SettingsHelper mHelper; 80 private ContentResolver mContentResolver; 81 private IWindowManager mWindowManager; 82 private final List<MyApplicationInfo> mPackageInfoList = new ArrayList<MyApplicationInfo>(); 83 private WifiManager mWifiManager; 84 85 @Override 86 public void onCreate(Bundle savedInstanceState) { 87 mHelper = new SettingsHelper(this); 88 mContentResolver = getContentResolver(); 89 mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); 90 91 mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 92 93 94 super.onCreate(savedInstanceState); 95 } 96 97 @Override 98 protected void refreshActionList() { 99 mActions.clear(); 100 switch ((ActionType) mState) { 101 case DEVELOPER_OVERVIEW: 102 mActions.add(ActionType.DEVELOPER_GENERAL.toAction(mResources)); 103 mActions.add(ActionType.DEVELOPER_DEBUGGING.toAction(mResources)); 104 mActions.add(ActionType.DEVELOPER_INPUT.toAction(mResources)); 105 mActions.add(ActionType.DEVELOPER_DRAWING.toAction(mResources)); 106 mActions.add(ActionType.DEVELOPER_MONITORING.toAction(mResources)); 107 mActions.add(ActionType.DEVELOPER_APPS.toAction(mResources)); 108 break; 109 case DEVELOPER_GENERAL: 110 mActions.add(ActionType.DEVELOPER_GENERAL_STAY_AWAKE.toAction(mResources, 111 mHelper.getGlobalIntSetting(Settings.Global.STAY_ON_WHILE_PLUGGED_IN))); 112 if (!"user".equals(Build.TYPE)) { 113 mActions.add(ActionType.DEVELOPER_GENERAL_HDCP_CHECKING.toAction(mResources, 114 getHdcpStatus(mHelper.getSystemProperties(HDCP_CHECKING_PROPERTY)))); 115 } 116 mActions.add(ActionType.DEVELOPER_GENERAL_HDMI_OPTIMIZATION.toAction(mResources, 117 getHdmiOptimizationStatus(mHelper.getSystemProperties( 118 HDMI_OPTIMIZATION_PROPERTY)))); 119 mActions.add(ActionType.DEVELOPER_GENERAL_BT_HCI_LOG.toAction(mResources, 120 mHelper.getStatusStringFromBoolean( 121 mHelper.getSecureIntValueSettingToBoolean( 122 Settings.Secure.BLUETOOTH_HCI_LOG)))); 123 break; 124 case EMAIL_ADDRESS: 125 break; 126 case DEVELOPER_DEBUGGING: 127 mActions.add(ActionType.DEVELOPER_DEBUGGING_USB_DEBUGGING.toAction( 128 mResources, mHelper.getGlobalIntSetting(Settings.Global.ADB_ENABLED))); 129 mActions.add(ActionType.DEVELOPER_DEBUGGING_ALLOW_MOCK_LOCATIONS.toAction( 130 mResources, 131 mHelper.getSecureStatusIntSetting(Settings.Secure.ALLOW_MOCK_LOCATION))); 132 mActions.add(ActionType.DEVELOPER_DEBUGGING_SELECT_DEBUG_APP.toAction( 133 mResources, getDebugApp())); 134 mActions.add(ActionType.DEVELOPER_DEBUGGING_WAIT_FOR_DEBUGGER.toAction( 135 mResources, 136 mHelper.getGlobalIntSetting(Settings.Global.WAIT_FOR_DEBUGGER))); 137 mActions.add( 138 ActionType.DEVELOPER_DEBUGGING_VERIFY_APPS_OVER_USB.toAction(mResources, 139 mHelper.getGlobalIntSetting( 140 Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB))); 141 mActions.add( 142 ActionType.DEVELOPER_DEBUGGING_WIFI_VERBOSE_LOGGING.toAction(mResources, 143 mWifiManager.getVerboseLoggingLevel() > 0 ? "On" : "Off")); 144 break; 145 case DEVELOPER_INPUT: 146 mActions.add(ActionType.DEVELOPER_INPUT_SHOW_TOUCHES.toAction( 147 mResources, mHelper.getSystemIntSetting(Settings.System.SHOW_TOUCHES))); 148 mActions.add(ActionType.DEVELOPER_INPUT_POINTER_LOCATION.toAction( 149 mResources, mHelper.getSystemIntSetting(Settings.System.POINTER_LOCATION))); 150 break; 151 case DEVELOPER_GENERAL_REBOOT: 152 mActions.add(ActionType.OK.toAction(mResources)); 153 mActions.add(ActionType.CANCEL.toAction(mResources)); 154 break; 155 case DEVELOPER_GENERAL_STAY_AWAKE: 156 case DEVELOPER_DEBUGGING_USB_DEBUGGING: 157 case DEVELOPER_GENERAL_BT_HCI_LOG: 158 case DEVELOPER_DEBUGGING_VERIFY_APPS_OVER_USB: 159 case DEVELOPER_DEBUGGING_WIFI_VERBOSE_LOGGING: 160 case DEVELOPER_DEBUGGING_ALLOW_MOCK_LOCATIONS: 161 case DEVELOPER_DEBUGGING_WAIT_FOR_DEBUGGER: 162 case DEVELOPER_INPUT_SHOW_TOUCHES: 163 case DEVELOPER_INPUT_POINTER_LOCATION: 164 case DEVELOPER_DRAWING_SHOW_GPU_VIEW_UPDATES: 165 case DEVELOPER_DRAWING_SHOW_HARDWARE_LAYER: 166 case DEVELOPER_DRAWING_SHOW_LAYOUT_BOUNDS: 167 case DEVELOPER_DRAWING_SHOW_SURFACE_UPDATES: 168 case DEVELOPER_APPS_DONT_KEEP_ACTIVITIES: 169 case DEVELOPER_APPS_SHOW_ALL_ANRS: 170 case DEVELOPER_MONITORING_SHOW_CPU_USAGE: 171 case DEVELOPER_MONITORING_STRICT_MODE_ENABLED: 172 mActions = getEnableActions(((ActionType) mState).name(), getProperty()); 173 break; 174 case DEVELOPER_DRAWING: 175 mActions.add(ActionType.DEVELOPER_DRAWING_SHOW_LAYOUT_BOUNDS.toAction( 176 mResources, 177 mHelper.getSystemBooleanProperties(View.DEBUG_LAYOUT_PROPERTY))); 178 mActions.add( 179 ActionType.DEVELOPER_DRAWING_SHOW_GPU_VIEW_UPDATES.toAction( 180 mResources, mHelper.getSystemBooleanProperties( 181 HardwareRenderer.DEBUG_DIRTY_REGIONS_PROPERTY))); 182 mActions.add(ActionType.DEVELOPER_DRAWING_SHOW_GPU_OVERDRAW.toAction( 183 mResources, getGpuOverdrawLabel())); 184 mActions.add(ActionType.DEVELOPER_DRAWING_SHOW_HARDWARE_LAYER.toAction( 185 mResources, mHelper.getSystemBooleanProperties( 186 HardwareRenderer.DEBUG_SHOW_LAYERS_UPDATES_PROPERTY))); 187 mActions.add( 188 ActionType.DEVELOPER_DRAWING_SHOW_SURFACE_UPDATES.toAction( 189 mResources, mHelper.getStatusStringFromBoolean( 190 getShowUpdatesOption()))); 191 mActions.add( 192 ActionType.DEVELOPER_DRAWING_WINDOW_ANIMATION_SCALE.toAction(mResources, 193 getAnimationScaleValue(INDEX_WINDOW_ANIMATION_SCALE) + "")); 194 mActions.add(ActionType.DEVELOPER_DRAWING_TRANSITION_ANIMATION_SCALE.toAction( 195 mResources, getAnimationScaleValue(INDEX_TRANSITION_ANIMATION_SCALE) + "")); 196 mActions.add( 197 ActionType.DEVELOPER_DRAWING_ANIMATOR_DURATION_SCALE.toAction(mResources, 198 getAnimationScaleValue(INDEX_ANIMATOR_DURATION_SCALE) + "")); 199 break; 200 case DEVELOPER_DEBUGGING_SELECT_DEBUG_APP: 201 mActions = getApps(); 202 break; 203 case DEVELOPER_GENERAL_HDCP_CHECKING: 204 mActions = Action.createActionsFromArrays( 205 mResources.getStringArray(R.array.hdcp_checking_values), 206 mResources.getStringArray(R.array.hdcp_checking_summaries), 207 1 /* non zero check set ID */, 208 mHelper.getSystemProperties(HDCP_CHECKING_PROPERTY)); 209 break; 210 case DEVELOPER_GENERAL_HDMI_OPTIMIZATION: 211 mActions = Action.createActionsFromArrays( 212 mResources.getStringArray(R.array.hdmi_optimization_values), 213 mResources.getStringArray(R.array.hdmi_optimization_entries), 214 1 /* non zero check set ID */, 215 mHelper.getSystemProperties(HDMI_OPTIMIZATION_PROPERTY)); 216 break; 217 case DEVELOPER_DRAWING_ANIMATOR_DURATION_SCALE: 218 mActions = getAnimationScaleActions(INDEX_ANIMATOR_DURATION_SCALE); 219 break; 220 case DEVELOPER_DRAWING_TRANSITION_ANIMATION_SCALE: 221 mActions = getAnimationScaleActions(INDEX_TRANSITION_ANIMATION_SCALE); 222 break; 223 case DEVELOPER_DRAWING_WINDOW_ANIMATION_SCALE: 224 mActions = getAnimationScaleActions(INDEX_WINDOW_ANIMATION_SCALE); 225 break; 226 case DEVELOPER_MONITORING_PROFILE_GPU_RENDERING: 227 mActions = Action.createActionsFromArrays( 228 mResources.getStringArray(R.array.track_frame_time_values), 229 mResources.getStringArray(R.array.track_frame_time_entries)); 230 break; 231 case DEVELOPER_DRAWING_SHOW_GPU_OVERDRAW: 232 mActions = Action.createActionsFromArrays( 233 mResources.getStringArray(R.array.debug_hw_overdraw_values), 234 mResources.getStringArray(R.array.debug_hw_overdraw_entries), 1, 235 getGpuOverdrawValue()); 236 break; 237 case DEVELOPER_MONITORING_ENABLE_TRACES: 238 mActions = Action.createActionsFromArrays( 239 mResources.getStringArray(R.array.enable_opengl_traces_values), 240 mResources.getStringArray(R.array.enable_opengl_traces_entries)); 241 break; 242 case DEVELOPER_APPS_BACKGROUND_PROCESS_LIMIT: 243 mActions = Action.createActionsFromArrays( 244 mResources.getStringArray(R.array.app_process_limit_values), 245 mResources.getStringArray(R.array.app_process_limit_entries)); 246 break; 247 case DEVELOPER_MONITORING: 248 mActions.add( 249 ActionType.DEVELOPER_MONITORING_STRICT_MODE_ENABLED.toAction( 250 mResources, mHelper.getStatusStringFromBoolean( 251 SystemProperties.getBoolean(StrictMode.VISUAL_PROPERTY, 252 false)))); 253 mActions.add(ActionType.DEVELOPER_MONITORING_SHOW_CPU_USAGE.toAction( 254 mResources, mHelper.getGlobalIntSetting(Settings.Global.SHOW_PROCESSES))); 255 mActions.add( 256 ActionType.DEVELOPER_MONITORING_PROFILE_GPU_RENDERING.toAction(mResources, 257 SystemProperties.get(HardwareRenderer.PROFILE_PROPERTY))); 258 mActions.add(ActionType.DEVELOPER_MONITORING_ENABLE_TRACES.toAction( 259 mResources, SystemProperties.get(OPENGL_TRACES_PROPERTY))); 260 break; 261 case DEVELOPER_APPS: 262 mActions.add(ActionType.DEVELOPER_APPS_DONT_KEEP_ACTIVITIES.toAction( 263 mResources, mHelper.getGlobalIntSetting( 264 Settings.Global.ALWAYS_FINISH_ACTIVITIES))); 265 mActions.add( 266 ActionType.DEVELOPER_APPS_BACKGROUND_PROCESS_LIMIT.toAction( 267 mResources, getAppProcessLimit() + "")); 268 mActions.add(ActionType.DEVELOPER_APPS_SHOW_ALL_ANRS.toAction( 269 mResources, 270 mHelper.getSecureStatusIntSetting(Settings.Secure.ANR_SHOW_BACKGROUND))); 271 break; 272 default: 273 break; 274 } 275 } 276 277 @Override 278 protected void updateView() { 279 refreshActionList(); 280 281 switch ((ActionType) mState) { 282 case DEVELOPER_OVERVIEW: 283 setView(R.string.system_developer_options, R.string.settings_app_name, 0, 284 R.drawable.ic_settings_developeroptions); 285 break; 286 case DEVELOPER_GENERAL: 287 setView(R.string.system_general, R.string.system_developer_options, 0, 0); 288 break; 289 case EMAIL_ADDRESS: 290 mContentFragment = EditTextFragment.newInstance( 291 mResources.getString(R.string.system_email_address)); 292 mActionFragment = ActionFragment.newInstance(mActions); 293 setContentAndActionFragments(mContentFragment, mActionFragment); 294 break; 295 case DEVELOPER_DEBUGGING: 296 setView(R.string.system_debugging, R.string.system_developer_options, 0, 0); 297 break; 298 case DEVELOPER_INPUT: 299 setView(R.string.system_input, R.string.system_developer_options, 0, 0); 300 break; 301 case DEVELOPER_GENERAL_STAY_AWAKE: 302 case DEVELOPER_GENERAL_REBOOT: 303 case DEVELOPER_DEBUGGING_USB_DEBUGGING: 304 case DEVELOPER_GENERAL_BT_HCI_LOG: 305 case DEVELOPER_DEBUGGING_VERIFY_APPS_OVER_USB: 306 case DEVELOPER_DEBUGGING_WIFI_VERBOSE_LOGGING: 307 case DEVELOPER_DEBUGGING_ALLOW_MOCK_LOCATIONS: 308 case DEVELOPER_DEBUGGING_WAIT_FOR_DEBUGGER: 309 case DEVELOPER_INPUT_SHOW_TOUCHES: 310 case DEVELOPER_INPUT_POINTER_LOCATION: 311 case DEVELOPER_DRAWING_SHOW_GPU_VIEW_UPDATES: 312 case DEVELOPER_DRAWING_SHOW_GPU_OVERDRAW: 313 case DEVELOPER_DRAWING_SHOW_HARDWARE_LAYER: 314 case DEVELOPER_DRAWING_SHOW_LAYOUT_BOUNDS: 315 case DEVELOPER_DRAWING_SHOW_SURFACE_UPDATES: 316 case DEVELOPER_APPS_DONT_KEEP_ACTIVITIES: 317 case DEVELOPER_APPS_SHOW_ALL_ANRS: 318 case DEVELOPER_MONITORING_SHOW_CPU_USAGE: 319 case DEVELOPER_MONITORING_STRICT_MODE_ENABLED: 320 setView(((ActionType) mState).getTitle(mResources), getPrevState() != null ? 321 ((ActionType) getPrevState()).getTitle(mResources) : null, 322 ((ActionType) mState).getDescription(mResources), 0); 323 break; 324 case DEVELOPER_DRAWING: 325 setView(R.string.system_drawing, R.string.system_developer_options, 0, 0); 326 break; 327 case DEVELOPER_DEBUGGING_SELECT_DEBUG_APP: 328 setView(R.string.system_select_debug_app, R.string.system_debugging, 0, 0); 329 break; 330 case DEVELOPER_GENERAL_HDCP_CHECKING: 331 setView(R.string.system_hdcp_checking, R.string.system_general, 0, 0); 332 break; 333 case DEVELOPER_GENERAL_HDMI_OPTIMIZATION: 334 setView(R.string.system_hdmi_optimization, R.string.system_general, 335 R.string.system_desc_hdmi_optimization, 0); 336 break; 337 case DEVELOPER_DRAWING_ANIMATOR_DURATION_SCALE: 338 setView(R.string.system_animator_duration_scale, R.string.system_drawing, 0, 0); 339 break; 340 case DEVELOPER_DRAWING_TRANSITION_ANIMATION_SCALE: 341 setView(R.string.system_transition_animation_scale, R.string.system_drawing, 0, 0); 342 break; 343 case DEVELOPER_DRAWING_WINDOW_ANIMATION_SCALE: 344 setView(R.string.system_window_animation_scale, R.string.system_drawing, 0, 0); 345 break; 346 case DEVELOPER_MONITORING_PROFILE_GPU_RENDERING: 347 setView(R.string.system_profile_gpu_rendering, R.string.system_monitoring, 0, 0); 348 break; 349 case DEVELOPER_MONITORING_ENABLE_TRACES: 350 setView(R.string.system_enable_traces, R.string.system_developer_options, 0, 0); 351 break; 352 case DEVELOPER_APPS_BACKGROUND_PROCESS_LIMIT: 353 setView(R.string.system_background_process_limit, R.string.system_apps, 0, 0); 354 break; 355 case DEVELOPER_MONITORING: 356 setView(R.string.system_monitoring, R.string.system_developer_options, 0, 0); 357 break; 358 case DEVELOPER_APPS: 359 setView(R.string.system_apps, R.string.system_developer_options, 0, 0); 360 break; 361 default: 362 break; 363 } 364 } 365 366 367 @Override 368 public void onActionClicked(Action action) { 369 /* 370 * For list preferences 371 */ 372 final String key = action.getKey(); 373 switch ((ActionType) mState) { 374 case DEVELOPER_DEBUGGING_SELECT_DEBUG_APP: 375 setDebugApp(key); 376 goBack(); 377 return; 378 case DEVELOPER_GENERAL_HDCP_CHECKING: 379 mHelper.setSystemProperties(HDCP_CHECKING_PROPERTY, key); 380 goBack(); 381 return; 382 case DEVELOPER_GENERAL_HDMI_OPTIMIZATION: 383 String currentValue = mHelper.getSystemProperties(HDMI_OPTIMIZATION_PROPERTY); 384 if (!key.equals(currentValue)) { 385 mHelper.setSystemProperties(HDMI_OPTIMIZATION_PROPERTY, key); 386 setState(ActionType.DEVELOPER_GENERAL_REBOOT, true); 387 } else { 388 goBack(); 389 } 390 return; 391 case DEVELOPER_DRAWING_ANIMATOR_DURATION_SCALE: 392 setAnimationScaleOption(INDEX_ANIMATOR_DURATION_SCALE, action); 393 goBack(); 394 return; 395 case DEVELOPER_DRAWING_TRANSITION_ANIMATION_SCALE: 396 setAnimationScaleOption(INDEX_TRANSITION_ANIMATION_SCALE, action); 397 goBack(); 398 return; 399 case DEVELOPER_DRAWING_WINDOW_ANIMATION_SCALE: 400 setAnimationScaleOption(INDEX_WINDOW_ANIMATION_SCALE, action); 401 goBack(); 402 return; 403 case DEVELOPER_DRAWING_SHOW_GPU_OVERDRAW: 404 mHelper.setSystemProperties(HardwareRenderer.DEBUG_OVERDRAW_PROPERTY, 405 action.getKey()); 406 goBack(); 407 return; 408 case DEVELOPER_MONITORING_PROFILE_GPU_RENDERING: 409 mHelper.setSystemProperties(HardwareRenderer.PROFILE_PROPERTY, key); 410 goBack(); 411 return; 412 case DEVELOPER_MONITORING_ENABLE_TRACES: 413 mHelper.setSystemProperties(OPENGL_TRACES_PROPERTY, key); 414 goBack(); 415 return; 416 case DEVELOPER_APPS_BACKGROUND_PROCESS_LIMIT: 417 setAppProcessLimit(key); 418 goBack(); 419 return; 420 case DEVELOPER_GENERAL_REBOOT: 421 if (ActionType.OK.toAction(mResources).getKey().equals(action.getKey())) { 422 PowerManager manager = (PowerManager) getSystemService(POWER_SERVICE); 423 manager.reboot(null); 424 } else { 425 goBack(); 426 } 427 return; 428 default: 429 break; 430 } 431 432 /* 433 * For regular states 434 */ 435 ActionKey<ActionType, ActionBehavior> actionKey = new ActionKey<ActionType, ActionBehavior>( 436 ActionType.class, ActionBehavior.class, action.getKey()); 437 final ActionType type = actionKey.getType(); 438 final ActionBehavior behavior = actionKey.getBehavior(); 439 if (behavior == null) { 440 Log.w(TAG, "Could not find behavior for " + action.getKey()); 441 return; 442 } 443 switch (behavior) { 444 case ON: 445 setProperty(true); 446 break; 447 case OFF: 448 setProperty(false); 449 break; 450 case INIT: 451 setState(type, true); 452 break; 453 default: 454 } 455 } 456 457 @Override 458 protected void setProperty(boolean enable) { 459 switch ((ActionType) mState) { 460 case DEVELOPER_GENERAL_STAY_AWAKE: 461 mHelper.setGlobalIntSetting(Settings.Global.STAY_ON_WHILE_PLUGGED_IN, enable); 462 break; 463 case DEVELOPER_GENERAL_BT_HCI_LOG: 464 mHelper.setSecureIntSetting(Settings.Secure.BLUETOOTH_HCI_LOG, enable); 465 BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 466 adapter.configHciSnoopLog(enable); 467 break; 468 case DEVELOPER_DEBUGGING_USB_DEBUGGING: 469 mHelper.setGlobalIntSetting(Settings.Global.ADB_ENABLED, enable); 470 break; 471 case DEVELOPER_DEBUGGING_ALLOW_MOCK_LOCATIONS: 472 mHelper.setSecureIntSetting(Settings.Secure.ALLOW_MOCK_LOCATION, enable); 473 break; 474 case DEVELOPER_DEBUGGING_WAIT_FOR_DEBUGGER: 475 mHelper.setGlobalIntSetting(Settings.Global.WAIT_FOR_DEBUGGER, enable); 476 break; 477 case DEVELOPER_DEBUGGING_VERIFY_APPS_OVER_USB: 478 mHelper.setGlobalIntSetting(Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB, enable); 479 break; 480 case DEVELOPER_DEBUGGING_WIFI_VERBOSE_LOGGING: 481 mWifiManager.enableVerboseLogging(enable ? 1 : 0); 482 break; 483 case DEVELOPER_INPUT_SHOW_TOUCHES: 484 mHelper.setSystemIntSetting(Settings.System.SHOW_TOUCHES, enable); 485 break; 486 case DEVELOPER_INPUT_POINTER_LOCATION: 487 mHelper.setSystemIntSetting(Settings.System.POINTER_LOCATION, enable); 488 break; 489 case DEVELOPER_DRAWING_SHOW_HARDWARE_LAYER: 490 mHelper.setSystemProperties(HardwareRenderer.DEBUG_SHOW_LAYERS_UPDATES_PROPERTY, 491 Boolean.toString(enable)); 492 break; 493 case DEVELOPER_DRAWING_SHOW_LAYOUT_BOUNDS: 494 mHelper.setSystemProperties(View.DEBUG_LAYOUT_PROPERTY, Boolean.toString(enable)); 495 break; 496 case DEVELOPER_DRAWING_SHOW_SURFACE_UPDATES: 497 setShowUpdatesOption(enable); 498 break; 499 case DEVELOPER_DRAWING_SHOW_GPU_VIEW_UPDATES: 500 mHelper.setSystemProperties( 501 HardwareRenderer.DEBUG_DIRTY_REGIONS_PROPERTY, Boolean.toString(enable)); 502 break; 503 case DEVELOPER_MONITORING_SHOW_CPU_USAGE: 504 mHelper.setGlobalIntSetting(Settings.Global.SHOW_PROCESSES, enable); 505 Intent service = (new Intent()).setClassName("com.android.systemui", 506 "com.android.systemui.LoadAverageService"); 507 if (enable) { 508 startService(service); 509 } else { 510 stopService(service); 511 } 512 break; 513 case DEVELOPER_MONITORING_STRICT_MODE_ENABLED: 514 setStrictModeVisualOptions(enable); 515 break; 516 case DEVELOPER_APPS_DONT_KEEP_ACTIVITIES: 517 try { 518 ActivityManagerNative.getDefault().setAlwaysFinish(enable); 519 } catch (RemoteException ex) { 520 } 521 break; 522 case DEVELOPER_APPS_SHOW_ALL_ANRS: 523 mHelper.setSecureIntSetting(Settings.Secure.ANR_SHOW_BACKGROUND, enable); 524 break; 525 default: 526 break; 527 } 528 goBack(); 529 } 530 531 private boolean getProperty() { 532 switch ((ActionType) mState) { 533 case DEVELOPER_GENERAL_STAY_AWAKE: 534 return mHelper.getGlobalIntSettingToInt(Settings.Global.STAY_ON_WHILE_PLUGGED_IN) == 535 1; 536 case DEVELOPER_GENERAL_BT_HCI_LOG: 537 return mHelper.getSecureIntValueSettingToBoolean(Settings.Secure.BLUETOOTH_HCI_LOG); 538 case DEVELOPER_DEBUGGING_USB_DEBUGGING: 539 return mHelper.getGlobalIntSettingToInt(Settings.Global.ADB_ENABLED) == 1; 540 case DEVELOPER_DEBUGGING_ALLOW_MOCK_LOCATIONS: 541 return mHelper.getSecureIntValueSettingToBoolean( 542 Settings.Secure.ALLOW_MOCK_LOCATION); 543 case DEVELOPER_DEBUGGING_WAIT_FOR_DEBUGGER: 544 return mHelper.getGlobalIntSettingToInt(Settings.Global.WAIT_FOR_DEBUGGER) == 1; 545 case DEVELOPER_DEBUGGING_VERIFY_APPS_OVER_USB: 546 return mHelper.getGlobalIntSettingToInt( 547 Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB) == 1; 548 case DEVELOPER_DEBUGGING_WIFI_VERBOSE_LOGGING: 549 return mWifiManager.getVerboseLoggingLevel() > 0; 550 case DEVELOPER_INPUT_SHOW_TOUCHES: 551 return mHelper.getSystemIntSettingToBoolean(Settings.System.SHOW_TOUCHES); 552 case DEVELOPER_INPUT_POINTER_LOCATION: 553 return mHelper.getSystemIntSettingToBoolean(Settings.System.POINTER_LOCATION); 554 case DEVELOPER_DRAWING_SHOW_HARDWARE_LAYER: 555 return SystemProperties.getBoolean( 556 HardwareRenderer.DEBUG_SHOW_LAYERS_UPDATES_PROPERTY, false); 557 case DEVELOPER_DRAWING_SHOW_LAYOUT_BOUNDS: 558 return SystemProperties.getBoolean(View.DEBUG_LAYOUT_PROPERTY, false); 559 case DEVELOPER_DRAWING_SHOW_SURFACE_UPDATES: 560 return getShowUpdatesOption(); 561 case DEVELOPER_DRAWING_SHOW_GPU_VIEW_UPDATES: 562 return SystemProperties.getBoolean( 563 HardwareRenderer.DEBUG_DIRTY_REGIONS_PROPERTY, false); 564 case DEVELOPER_MONITORING_SHOW_CPU_USAGE: 565 return mHelper.getGlobalIntSettingToInt(Settings.Global.SHOW_PROCESSES) == 1; 566 case DEVELOPER_MONITORING_STRICT_MODE_ENABLED: 567 return SystemProperties.getBoolean(StrictMode.VISUAL_PROPERTY, false); 568 case DEVELOPER_APPS_DONT_KEEP_ACTIVITIES: 569 return mHelper.getGlobalIntSettingToInt(Settings.Global.ALWAYS_FINISH_ACTIVITIES) == 570 1; 571 case DEVELOPER_APPS_SHOW_ALL_ANRS: 572 return mHelper.getSecureIntValueSettingToBoolean( 573 Settings.Secure.ANR_SHOW_BACKGROUND); 574 default: 575 } 576 return false; 577 } 578 579 private ArrayList<Action> getEnableActions(String type, boolean enabled) { 580 ArrayList<Action> actions = new ArrayList<Action>(); 581 actions.add(ActionBehavior.ON.toAction(ActionBehavior.getOnKey(type), mResources, enabled)); 582 actions.add(ActionBehavior.OFF.toAction(ActionBehavior.getOffKey(type), mResources, 583 !enabled)); 584 return actions; 585 } 586 587 class MyApplicationInfo { 588 ApplicationInfo info; 589 CharSequence label; 590 } 591 592 private ArrayList<Action> getApps() { 593 mPackageInfoList.clear(); 594 List<ApplicationInfo> pkgs = getPackageManager().getInstalledApplications(0); 595 for (int i = 0; i < pkgs.size(); i++) { 596 ApplicationInfo ai = pkgs.get(i); 597 if (ai.uid == Process.SYSTEM_UID) { 598 continue; 599 } 600 // On a user build, we only allow debugging of apps that 601 // are marked as debuggable. Otherwise (for platform development) 602 // we allow all apps. 603 if ((ai.flags & ApplicationInfo.FLAG_DEBUGGABLE) == 0 604 && "user".equals(Build.TYPE)) { 605 continue; 606 } 607 MyApplicationInfo info = new MyApplicationInfo(); 608 info.info = ai; 609 info.label = info.info.loadLabel(getPackageManager()).toString(); 610 mPackageInfoList.add(info); 611 } 612 Collections.sort(mPackageInfoList, sDisplayNameComparator); 613 MyApplicationInfo info = new MyApplicationInfo(); 614 info.label = mResources.getString(R.string.no_application); 615 mPackageInfoList.add(0, info); 616 617 ArrayList<Action> actions = new ArrayList<Action>(); 618 int totalApps = mPackageInfoList.size(); 619 for (int i = 0; i < totalApps; i++) { 620 MyApplicationInfo app = mPackageInfoList.get(i); 621 if (app.info != null) { 622 actions.add(new Action.Builder() 623 .key(app.info.packageName) 624 .title(app.label.toString()) 625 .description(app.info.packageName) 626 .build()); 627 } else { 628 actions.add(new Action.Builder() 629 .key("") 630 .title(app.label.toString()) 631 .description("") 632 .build()); 633 } 634 } 635 636 return actions; 637 } 638 639 private final static Comparator<MyApplicationInfo> sDisplayNameComparator 640 = new Comparator<MyApplicationInfo>() { 641 @Override 642 public final int 643 compare(MyApplicationInfo a, MyApplicationInfo b) { 644 return collator.compare(a.label, b.label); 645 } 646 647 private final Collator collator = Collator.getInstance(); 648 }; 649 650 651 652 private String getDebugApp() { 653 return Settings.Global.getString(mContentResolver, Settings.Global.DEBUG_APP); 654 } 655 656 private void setDebugApp(String debugApp){ 657 boolean waitForDebugger = 658 mHelper.getGlobalIntSettingToInt(Settings.Global.WAIT_FOR_DEBUGGER) > 0 ? true 659 : false; 660 try { 661 ActivityManagerNative.getDefault().setDebugApp(debugApp, waitForDebugger, true); 662 } catch (RemoteException e) { 663 e.printStackTrace(); 664 } 665 } 666 667 private void setShowUpdatesOption(boolean enable) { 668 try { 669 IBinder flinger = ServiceManager.getService("SurfaceFlinger"); 670 if (flinger != null) { 671 Parcel data = Parcel.obtain(); 672 data.writeInterfaceToken("android.ui.ISurfaceComposer"); 673 final int showUpdates = enable ? 1 : 0; 674 data.writeInt(showUpdates); 675 flinger.transact(1002, data, null, 0); 676 data.recycle(); 677 } 678 } catch (RemoteException ex) { 679 } 680 } 681 682 private boolean getShowUpdatesOption() { 683 // magic communication with surface flinger. 684 int showUpdates = 0; 685 try { 686 IBinder flinger = ServiceManager.getService("SurfaceFlinger"); 687 if (flinger != null) { 688 Parcel data = Parcel.obtain(); 689 Parcel reply = Parcel.obtain(); 690 data.writeInterfaceToken("android.ui.ISurfaceComposer"); 691 flinger.transact(1010, data, reply, 0); 692 @SuppressWarnings("unused") 693 int showCpu = reply.readInt(); 694 @SuppressWarnings("unused") 695 int enableGL = reply.readInt(); 696 showUpdates = reply.readInt(); 697 reply.recycle(); 698 data.recycle(); 699 } 700 } catch (RemoteException ex) { 701 } 702 return showUpdates > 0; 703 } 704 705 private void setStrictModeVisualOptions(boolean enable) { 706 try { 707 mWindowManager.setStrictModeVisualIndicatorPreference(enable 708 ? "1" : ""); 709 } catch (RemoteException e) { 710 } 711 } 712 713 private ArrayList<Action> getAnimationScaleActions(int index) { 714 String[] keys = null; 715 String[] titles = null; 716 float scaleValue = getAnimationScaleValue(index); 717 switch (index) { 718 case INDEX_ANIMATOR_DURATION_SCALE: 719 keys = getResources().getStringArray(R.array.animator_duration_scale_values); 720 titles = getResources().getStringArray(R.array.animator_duration_scale_entries); 721 break; 722 case INDEX_TRANSITION_ANIMATION_SCALE: 723 keys = getResources().getStringArray(R.array.transition_animation_scale_values); 724 titles = getResources().getStringArray(R.array.transition_animation_scale_entries); 725 break; 726 case INDEX_WINDOW_ANIMATION_SCALE: 727 keys = getResources().getStringArray(R.array.window_animation_scale_values); 728 titles = getResources().getStringArray(R.array.window_animation_scale_entries); 729 break; 730 default: 731 return null; 732 } 733 734 ArrayList<Action> actions = new ArrayList<Action>(); 735 for (int i = 0; i < keys.length; i++) { 736 Action.Builder builder = new Action.Builder(); 737 float keyScaleValue = Float.parseFloat(keys[i]); 738 builder.key(keys[i]) 739 .title(titles[i]) 740 .checkSetId(1) 741 .intent(new Intent().putExtra(KEY_SCALE, keyScaleValue)) 742 .checked(keyScaleValue == scaleValue); 743 actions.add(builder.build()); 744 } 745 return actions; 746 } 747 748 private void setAnimationScaleOption(int which, Action action) { 749 try { 750 float scale = action != null ? action.getIntent().getFloatExtra(KEY_SCALE, 1.0f) : 1; 751 mWindowManager.setAnimationScale(which, scale); 752 } catch (RemoteException e) { 753 } 754 } 755 756 private float getAnimationScaleValue(int which) { 757 float scale = 0; 758 try { 759 scale = mWindowManager.getAnimationScale(which); 760 } catch (RemoteException e) { 761 } 762 return scale; 763 } 764 765 private String getGpuOverdrawValue() { 766 String value = SystemProperties.get(HardwareRenderer.DEBUG_OVERDRAW_PROPERTY); 767 if (value == null) { 768 value = "false"; // default value. 769 } 770 return value; 771 } 772 773 private String getGpuOverdrawLabel() { 774 // This is a little ugly, but this shouldn't be called much. 775 ArrayList<Action> actions = Action.createActionsFromArrays( 776 mResources.getStringArray(R.array.debug_hw_overdraw_values), 777 mResources.getStringArray(R.array.debug_hw_overdraw_entries), 1, 778 getGpuOverdrawValue()); 779 780 for (Action action : actions) { 781 if (action.isChecked()) { 782 return action.getTitle(); 783 } 784 } 785 return actions.get(0).getTitle(); 786 } 787 788 private int getAppProcessLimit() { 789 try { 790 return ActivityManagerNative.getDefault().getProcessLimit(); 791 } catch (RemoteException e) { 792 } 793 return 0; 794 } 795 796 private void setAppProcessLimit(Object newValue) { 797 try { 798 int limit = newValue != null ? Integer.parseInt(newValue.toString()) : -1; 799 ActivityManagerNative.getDefault().setProcessLimit(limit); 800 } catch (RemoteException e) { 801 } 802 } 803 804 @Override 805 protected Object getInitialState() { 806 return ActionType.DEVELOPER_OVERVIEW; 807 } 808 809 /** 810 * Gets the HDCP status based on string value. 811 */ 812 private String getHdcpStatus(String value) { 813 // Defaults to drm-only. Needs to match with R.array.hdcp_checking_values 814 // This is matches phone DevelopmentSettings. 815 int index = 1; 816 String[] keys = getResources().getStringArray(R.array.hdcp_checking_values); 817 String[] summaries = getResources().getStringArray(R.array.hdcp_checking_summaries); 818 for (int keyIndex = 0; keyIndex < keys.length; ++keyIndex) { 819 if (keys[keyIndex].equals(value)) { 820 index = keyIndex; 821 break; 822 } 823 } 824 return summaries[index]; 825 } 826 827 /** 828 * Gets HDMI optimization status based on string value. 829 */ 830 private String getHdmiOptimizationStatus(String value) { 831 int index = 0; 832 String[] keys = getResources().getStringArray(R.array.hdmi_optimization_values); 833 String[] summaries = getResources().getStringArray(R.array.hdmi_optimization_entries); 834 for (int keyIndex = 0; keyIndex < keys.length; ++keyIndex) { 835 if (keys[keyIndex].equals(value)) { 836 index = keyIndex; 837 break; 838 } 839 } 840 return summaries[index]; 841 } 842 } 843