import android.os.ServiceManager;
import android.os.StrictMode;
import android.os.SystemProperties;
+import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.IMountService;
import android.provider.SearchIndexableResource;
import android.webkit.IWebViewUpdateService;
import android.webkit.WebViewProviderInfo;
import android.widget.Switch;
-import android.widget.TextView;
import android.widget.Toast;
import com.android.internal.app.LocalePicker;
/*
* Displays preferences for application developers.
*/
-public class DevelopmentSettings extends SettingsPreferenceFragment
+public class DevelopmentSettings extends RestrictedSettingsFragment
implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener,
OnPreferenceChangeListener, SwitchBar.OnSwitchChangeListener, Indexable {
private static final String TAG = "DevelopmentSettings";
private static final String KEEP_SCREEN_ON = "keep_screen_on";
private static final String BT_HCI_SNOOP_LOG = "bt_hci_snoop_log";
private static final String WEBVIEW_PROVIDER_KEY = "select_webview_provider";
+ private static final String WEBVIEW_MULTIPROCESS_KEY = "enable_webview_multiprocess";
private static final String ENABLE_OEM_UNLOCK = "oem_unlock_enable";
private static final String HDCP_CHECKING_KEY = "hdcp_checking";
private static final String HDCP_CHECKING_PROPERTY = "persist.sys.hdcp_checking";
private static final String WIFI_AGGRESSIVE_HANDOVER_KEY = "wifi_aggressive_handover";
private static final String WIFI_ALLOW_SCAN_WITH_TRAFFIC_KEY = "wifi_allow_scan_with_traffic";
private static final String USB_CONFIGURATION_KEY = "select_usb_configuration";
- private static final String WIFI_LEGACY_DHCP_CLIENT_KEY = "legacy_dhcp_client";
private static final String MOBILE_DATA_ALWAYS_ON = "mobile_data_always_on";
private static final String KEY_COLOR_MODE = "color_mode";
private static final String FORCE_RESIZABLE_KEY = "force_resizable_activities";
- private static final String ENABLE_FREEFORM_SUPPORT_KEY = "enable_freeform_support";
private static final String COLOR_TEMPERATURE_KEY = "color_temperature";
private static final String BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_KEY =
private static final String TERMINAL_APP_PACKAGE = "com.android.terminal";
- private static final String KEY_NIGHT_MODE = "night_mode";
private static final String KEY_CONVERT_FBE = "convert_to_file_encryption";
+ private static final String OTA_DISABLE_AUTOMATIC_UPDATE_KEY = "ota_disable_automatic_update";
+
private static final int RESULT_DEBUG_APP = 1000;
private static final int RESULT_MOCK_LOCATION_APP = 1001;
private IWindowManager mWindowManager;
private IBackupManager mBackupManager;
+ private IWebViewUpdateService mWebViewUpdateService;
private DevicePolicyManager mDpm;
private UserManager mUm;
private WifiManager mWifiManager;
private SwitchPreference mWifiDisplayCertification;
private SwitchPreference mWifiVerboseLogging;
private SwitchPreference mWifiAggressiveHandover;
- private SwitchPreference mLegacyDhcpClient;
private SwitchPreference mMobileDataAlwaysOn;
private SwitchPreference mBluetoothDisableAbsVolume;
+ private SwitchPreference mOtaDisableAutomaticUpdate;
private SwitchPreference mWifiAllowScansWithTraffic;
private SwitchPreference mStrictMode;
private ListPreference mAnimatorDurationScale;
private ListPreference mOverlayDisplayDevices;
private ListPreference mOpenGLTraces;
+
+ private SwitchPreference mWebViewMultiprocess;
private ListPreference mWebViewProvider;
private ListPreference mSimulateColorSpace;
private SwitchPreference mShowAllANRs;
- private DropDownPreference mNightModePreference;
-
private ColorModePreference mColorModePreference;
private SwitchPreference mForceResizable;
- private SwitchPreference mEnableFreeformSupport;
-
private SwitchPreference mColorTemperaturePreference;
private final ArrayList<Preference> mAllPrefs = new ArrayList<Preference>();
private Dialog mAdbKeysDialog;
private boolean mUnavailable;
+ public DevelopmentSettings() {
+ super(UserManager.DISALLOW_DEBUGGING_FEATURES);
+ }
+
@Override
protected int getMetricsCategory() {
return MetricsEvent.DEVELOPMENT;
mWindowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
mBackupManager = IBackupManager.Stub.asInterface(
ServiceManager.getService(Context.BACKUP_SERVICE));
+ mWebViewUpdateService =
+ IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));
+
mDpm = (DevicePolicyManager)getActivity().getSystemService(Context.DEVICE_POLICY_SERVICE);
mUm = (UserManager) getSystemService(Context.USER_SERVICE);
mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
- if (!mUm.isAdminUser()
- || mUm.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)
+ setIfOnlyAvailableForAdmins(true);
+ if (isUiRestricted()
|| Settings.Global.getInt(getActivity().getContentResolver(),
Settings.Global.DEVICE_PROVISIONED, 0) == 0) {
// Block access to developer options if the user is not the owner, if user policy
mWifiVerboseLogging = findAndInitSwitchPref(WIFI_VERBOSE_LOGGING_KEY);
mWifiAggressiveHandover = findAndInitSwitchPref(WIFI_AGGRESSIVE_HANDOVER_KEY);
mWifiAllowScansWithTraffic = findAndInitSwitchPref(WIFI_ALLOW_SCAN_WITH_TRAFFIC_KEY);
- mLegacyDhcpClient = findAndInitSwitchPref(WIFI_LEGACY_DHCP_CLIENT_KEY);
mMobileDataAlwaysOn = findAndInitSwitchPref(MOBILE_DATA_ALWAYS_ON);
mLogdSize = addListPreference(SELECT_LOGD_SIZE_KEY);
mUsbConfiguration = addListPreference(USB_CONFIGURATION_KEY);
mWebViewProvider = addListPreference(WEBVIEW_PROVIDER_KEY);
+ mWebViewMultiprocess = findAndInitSwitchPref(WEBVIEW_MULTIPROCESS_KEY);
mBluetoothDisableAbsVolume = findAndInitSwitchPref(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_KEY);
mWindowAnimationScale = addListPreference(WINDOW_ANIMATION_SCALE_KEY);
mSimulateColorSpace = addListPreference(SIMULATE_COLOR_SPACE);
mUSBAudio = findAndInitSwitchPref(USB_AUDIO_KEY);
mForceResizable = findAndInitSwitchPref(FORCE_RESIZABLE_KEY);
- mEnableFreeformSupport = findAndInitSwitchPref(ENABLE_FREEFORM_SUPPORT_KEY);
mImmediatelyDestroyActivities = (SwitchPreference) findPreference(
IMMEDIATELY_DESTROY_ACTIVITIES_KEY);
removePreference(KEY_CONVERT_FBE);
}
- mNightModePreference = (DropDownPreference) findPreference(KEY_NIGHT_MODE);
- final UiModeManager uiManager = (UiModeManager) getSystemService(
- Context.UI_MODE_SERVICE);
- final int currentNightMode = uiManager.getNightMode();
- mNightModePreference.setValue(String.valueOf(currentNightMode));
- mNightModePreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
- @Override
- public boolean onPreferenceChange(Preference preference, Object newValue) {
- try {
- final int value = Integer.parseInt((String) newValue);
- final UiModeManager uiManager = (UiModeManager) getSystemService(
- Context.UI_MODE_SERVICE);
- uiManager.setNightMode(value);
- return true;
- } catch (NumberFormatException e) {
- Log.e(TAG, "could not persist night mode setting", e);
- return false;
- }
- }
- });
+ mOtaDisableAutomaticUpdate = findAndInitSwitchPref(OTA_DISABLE_AUTOMATIC_UPDATE_KEY);
mColorModePreference = (ColorModePreference) findPreference(KEY_COLOR_MODE);
mColorModePreference.updateCurrentAndSupported();
if (mUnavailable) {
// Show error message
- TextView emptyView = (TextView) getView().findViewById(android.R.id.empty);
- setEmptyView(emptyView);
- if (emptyView != null) {
- emptyView.setText(R.string.development_settings_not_available);
+ if (!isUiRestrictedByOnlyAdmin()) {
+ getEmptyTextView().setText(R.string.development_settings_not_available);
}
+ getPreferenceScreen().removeAll();
return;
}
updateAppProcessLimitOptions();
updateShowAllANRsOptions();
updateVerifyAppsOverUsbOptions();
+ updateOtaDisableAutomaticUpdateOptions();
updateBugreportOptions();
updateForceRtlOptions();
updateLogdSizeValues();
updateWifiVerboseLoggingOptions();
updateWifiAggressiveHandoverOptions();
updateWifiAllowScansWithTrafficOptions();
- updateLegacyDhcpClientOptions();
updateMobileDataAlwaysOnOptions();
updateSimulateColorSpace();
updateUSBAudioOptions();
updateForceResizableOptions();
- updateEnableFreeformWindowsSupportOptions();
+ updateWebViewMultiprocessOptions();
updateWebViewProviderOptions();
updateOemUnlockOptions();
if (mColorTemperaturePreference != null) {
}
private void updateWebViewProviderOptions() {
- IWebViewUpdateService webViewUpdateService =
- IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));
try {
- WebViewProviderInfo[] providers = webViewUpdateService.getValidWebViewPackages();
+ WebViewProviderInfo[] providers = mWebViewUpdateService.getValidWebViewPackages();
if (providers == null) {
Log.e(TAG, "No WebView providers available");
return;
}
- String[] options = new String[providers.length];
- String[] values = new String[providers.length];
+ ArrayList<String> options = new ArrayList<String>();
+ ArrayList<String> values = new ArrayList<String>();
for(int n = 0; n < providers.length; n++) {
- options[n] = providers[n].description;
- values[n] = providers[n].packageName;
+ if (isPackageEnabled(providers[n].packageName)) {
+ options.add(providers[n].description);
+ values.add(providers[n].packageName);
+ }
}
- mWebViewProvider.setEntries(options);
- mWebViewProvider.setEntryValues(values);
+ mWebViewProvider.setEntries(options.toArray(new String[options.size()]));
+ mWebViewProvider.setEntryValues(values.toArray(new String[values.size()]));
- String value = webViewUpdateService.getCurrentWebViewPackageName();
+ String value = mWebViewUpdateService.getCurrentWebViewPackageName();
if (value == null) {
value = "";
}
- for (int i = 0; i < values.length; i++) {
- if (value.contentEquals(values[i])) {
+ for (int i = 0; i < values.size(); i++) {
+ if (value.contentEquals(values.get(i))) {
mWebViewProvider.setValueIndex(i);
return;
}
}
}
+ private void updateWebViewMultiprocessOptions() {
+ updateSwitchPreference(mWebViewMultiprocess,
+ Settings.Global.getInt(getActivity().getContentResolver(),
+ Settings.Global.WEBVIEW_MULTIPROCESS, 0) != 0);
+ }
+
+ private void writeWebViewMultiprocessOptions() {
+ boolean value = mWebViewMultiprocess.isChecked();
+ Settings.Global.putInt(getActivity().getContentResolver(),
+ Settings.Global.WEBVIEW_MULTIPROCESS, value ? 1 : 0);
+
+ try {
+ String wv_package = mWebViewUpdateService.getCurrentWebViewPackageName();
+ ActivityManagerNative.getDefault().killPackageDependents(
+ wv_package, UserHandle.USER_ALL);
+ } catch(RemoteException e) {
+ }
+ }
+
private void updateHdcpValues() {
ListPreference hdcpChecking = (ListPreference) findPreference(HDCP_CHECKING_KEY);
if (hdcpChecking != null) {
}
private void writeWebViewProviderOptions(Object newValue) {
- IWebViewUpdateService webViewUpdateService =
- IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));
-
try {
- webViewUpdateService.changeProviderAndSetting(
+ mWebViewUpdateService.changeProviderAndSetting(
newValue == null ? "" : newValue.toString());
updateWebViewProviderOptions();
} catch(RemoteException e) {
mVerifyAppsOverUsb.isChecked() ? 1 : 0);
}
+ private void updateOtaDisableAutomaticUpdateOptions() {
+ // We use the "disabled status" in code, but show the opposite text
+ // "Automatic system updates" on screen. So a value 0 indicates the
+ // automatic update is enabled.
+ updateSwitchPreference(mOtaDisableAutomaticUpdate, Settings.Global.getInt(
+ getActivity().getContentResolver(),
+ Settings.Global.OTA_DISABLE_AUTOMATIC_UPDATE, 0) != 1);
+ }
+
+ private void writeOtaDisableAutomaticUpdateOptions() {
+ // We use the "disabled status" in code, but show the opposite text
+ // "Automatic system updates" on screen. So a value 0 indicates the
+ // automatic update is enabled.
+ Settings.Global.putInt(getActivity().getContentResolver(),
+ Settings.Global.OTA_DISABLE_AUTOMATIC_UPDATE,
+ mOtaDisableAutomaticUpdate.isChecked() ? 0 : 1);
+ }
+
private boolean enableVerifierSetting() {
final ContentResolver cr = getActivity().getContentResolver();
if (Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) == 0) {
mForceResizable.isChecked() ? 1 : 0);
}
- private void updateEnableFreeformWindowsSupportOptions() {
- updateSwitchPreference(mEnableFreeformSupport, Settings.Global.getInt(getContentResolver(),
- Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0);
- }
-
- private void writeEnableFreeformWindowsSupportOptions() {
- Settings.Global.putInt(getContentResolver(),
- Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT,
- mEnableFreeformSupport.isChecked() ? 1 : 0);
- }
-
private void updateForceRtlOptions() {
updateSwitchPreference(mForceRtlLayout,
Settings.Global.getInt(getActivity().getContentResolver(),
mWifiManager.setAllowScansWithTraffic(mWifiAllowScansWithTraffic.isChecked() ? 1 : 0);
}
- private void updateLegacyDhcpClientOptions() {
- updateSwitchPreference(mLegacyDhcpClient, Settings.Global.getInt(
- getActivity().getContentResolver(),
- Settings.Global.LEGACY_DHCP_CLIENT, 0) != 0);
- }
-
- private void writeLegacyDhcpClientOptions() {
- Settings.Global.putInt(getActivity().getContentResolver(),
- Settings.Global.LEGACY_DHCP_CLIENT,
- mLegacyDhcpClient.isChecked() ? 1 : 0);
- }
-
private void updateBluetoothDisableAbsVolumeOptions() {
updateSwitchPreference(mBluetoothDisableAbsVolume,
SystemProperties.getBoolean(BLUETOOTH_DISABLE_ABSOLUTE_VOLUME_PROPERTY, false));
}
private void confirmEnableOemUnlock() {
- DialogInterface.OnClickListener onConfirmListener = new DialogInterface.OnClickListener() {
+ DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- Utils.setOemUnlockEnabled(getActivity(), true);
+ if (which == DialogInterface.BUTTON_POSITIVE) {
+ Utils.setOemUnlockEnabled(getActivity(), true);
+ }
+ }
+ };
+
+ DialogInterface.OnDismissListener onDismissListener = new DialogInterface.OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
updateAllOptions();
}
};
new AlertDialog.Builder(getActivity())
.setTitle(R.string.confirm_enable_oem_unlock_title)
.setMessage(R.string.confirm_enable_oem_unlock_text)
- .setPositiveButton(R.string.enable_text, onConfirmListener)
+ .setPositiveButton(R.string.enable_text, onClickListener)
.setNegativeButton(android.R.string.cancel, null)
+ .setOnDismissListener(onDismissListener)
.create()
.show();
}
writeDebuggerOptions();
} else if (preference == mVerifyAppsOverUsb) {
writeVerifyAppsOverUsbOptions();
+ } else if (preference == mOtaDisableAutomaticUpdate) {
+ writeOtaDisableAutomaticUpdateOptions();
} else if (preference == mStrictMode) {
writeStrictModeVisualOptions();
} else if (preference == mPointerLocation) {
writeWifiAggressiveHandoverOptions();
} else if (preference == mWifiAllowScansWithTraffic) {
writeWifiAllowScansWithTrafficOptions();
- } else if (preference == mLegacyDhcpClient) {
- writeLegacyDhcpClientOptions();
} else if (preference == mMobileDataAlwaysOn) {
writeMobileDataAlwaysOnOptions();
} else if (preference == mColorTemperaturePreference) {
writeUSBAudioOptions();
} else if (preference == mForceResizable) {
writeForceResizableOptions();
- } else if (preference == mEnableFreeformSupport){
- writeEnableFreeformWindowsSupportOptions();
} else if (INACTIVE_APPS_KEY.equals(preference.getKey())) {
startInactiveAppsFragment();
} else if (BACKGROUND_CHECK_KEY.equals(preference.getKey())) {
startBackgroundCheckFragment();
} else if (preference == mBluetoothDisableAbsVolume) {
writeBluetoothDisableAbsVolumeOptions();
+ } else if (preference == mWebViewMultiprocess) {
+ writeWebViewMultiprocessOptions();
} else {
return super.onPreferenceTreeClick(preference);
}
private boolean isPackageEnabled(String packageName) {
try {
- PackageManager pm = getActivity().getPackageManager();
- int enabled_state = pm.getApplicationEnabledSetting(packageName);
- switch (enabled_state) {
- case PackageManager.COMPONENT_ENABLED_STATE_ENABLED:
- return true;
- case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT:
- return pm.getPackageInfo(packageName, 0).applicationInfo.enabled;
- default:
- return false;
- }
+ return getActivity().getPackageManager().getApplicationInfo(packageName, 0).enabled;
} catch (NameNotFoundException e) {
- // Thrown by PackageManager.getPackageInfo if the package does not exist
- } catch (IllegalArgumentException e) {
- // Thrown by PackageManager.getApplicationEnabledSetting if the package does not exist
+ // Thrown by PackageManager.getApplicationInfo if the package does not exist
}
return false;
}