This change adds a new developer option switch called "Enable ANGLE". It defaults to off. User can choose to toggle it on and off, and the value of the system property "persist.graphics.egl" is changed accordingly: switch off: persist.graphics.egl="" switch on: persist.graphics.egl="angle" When user toggles the switch, a reboot window is popped up asking user to reboot now to make the change takes effect. If user chooses to cancel the reboot, the switch is toggled back. This enforces that a reboot is required whenever the "persis.graphics.egl" value changes. Upon reboot, we will load either ANGLE or native GLES driver as the system driver, based on the value of "persist.graphics.egl". The switch is disabled if ANGLE is not installed in /vendor partition. We use the system property "ro.gfx.angle.supported" as an indicator. We set the two conditions together in angle.mk file. Any device mk file that inherits angle.mk file will result in ANGLE libs installed in /vendor and "ro.gfx.angle.supported" set to true. Bug: b/270994705 Test: m; flash and check Pixel 7 boots fine atest SettingsRoboTests:GraphicsDriverEnableAngleAsSystemDriverControllerTest Change-Id: I565eff614472bb6ba50742e7dfa49b50dca2809f
790 lines
37 KiB
Java
790 lines
37 KiB
Java
/*
|
|
* Copyright (C) 2017 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.settings.development;
|
|
|
|
import static android.provider.Settings.Global.DEVELOPMENT_SETTINGS_ENABLED;
|
|
import static android.service.quicksettings.TileService.ACTION_QS_TILE_PREFERENCES;
|
|
|
|
import android.app.Activity;
|
|
import android.app.UiModeManager;
|
|
import android.app.settings.SettingsEnums;
|
|
import android.bluetooth.BluetoothA2dp;
|
|
import android.bluetooth.BluetoothAdapter;
|
|
import android.bluetooth.BluetoothCodecStatus;
|
|
import android.bluetooth.BluetoothProfile;
|
|
import android.content.BroadcastReceiver;
|
|
import android.content.ComponentName;
|
|
import android.content.ContentResolver;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.IntentFilter;
|
|
import android.database.ContentObserver;
|
|
import android.net.Uri;
|
|
import android.os.Bundle;
|
|
import android.os.Handler;
|
|
import android.os.Looper;
|
|
import android.os.SystemProperties;
|
|
import android.os.UserManager;
|
|
import android.provider.Settings;
|
|
import android.text.TextUtils;
|
|
import android.util.Log;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.Switch;
|
|
|
|
import androidx.annotation.VisibleForTesting;
|
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
|
|
|
import com.android.settings.R;
|
|
import com.android.settings.SettingsActivity;
|
|
import com.android.settings.Utils;
|
|
import com.android.settings.core.SubSettingLauncher;
|
|
import com.android.settings.dashboard.RestrictedDashboardFragment;
|
|
import com.android.settings.development.autofill.AutofillCategoryController;
|
|
import com.android.settings.development.autofill.AutofillLoggingLevelPreferenceController;
|
|
import com.android.settings.development.autofill.AutofillResetOptionsPreferenceController;
|
|
import com.android.settings.development.bluetooth.AbstractBluetoothDialogPreferenceController;
|
|
import com.android.settings.development.bluetooth.AbstractBluetoothPreferenceController;
|
|
import com.android.settings.development.bluetooth.BluetoothBitPerSampleDialogPreferenceController;
|
|
import com.android.settings.development.bluetooth.BluetoothChannelModeDialogPreferenceController;
|
|
import com.android.settings.development.bluetooth.BluetoothCodecDialogPreferenceController;
|
|
import com.android.settings.development.bluetooth.BluetoothHDAudioPreferenceController;
|
|
import com.android.settings.development.bluetooth.BluetoothQualityDialogPreferenceController;
|
|
import com.android.settings.development.bluetooth.BluetoothSampleRateDialogPreferenceController;
|
|
import com.android.settings.development.graphicsdriver.GraphicsDriverEnableAngleAsSystemDriverController;
|
|
import com.android.settings.development.qstile.DevelopmentTiles;
|
|
import com.android.settings.development.storage.SharedDataPreferenceController;
|
|
import com.android.settings.overlay.FeatureFactory;
|
|
import com.android.settings.search.BaseSearchIndexProvider;
|
|
import com.android.settings.search.actionbar.SearchMenuController;
|
|
import com.android.settings.theme.ContrastPreferenceController;
|
|
import com.android.settings.widget.SettingsMainSwitchBar;
|
|
import com.android.settingslib.core.AbstractPreferenceController;
|
|
import com.android.settingslib.core.lifecycle.Lifecycle;
|
|
import com.android.settingslib.development.DeveloperOptionsPreferenceController;
|
|
import com.android.settingslib.development.DevelopmentSettingsEnabler;
|
|
import com.android.settingslib.development.SystemPropPoker;
|
|
import com.android.settingslib.search.SearchIndexable;
|
|
import com.android.settingslib.widget.OnMainSwitchChangeListener;
|
|
|
|
import com.google.android.setupcompat.util.WizardManagerHelper;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
|
|
public class DevelopmentSettingsDashboardFragment extends RestrictedDashboardFragment
|
|
implements OnMainSwitchChangeListener, OemUnlockDialogHost, AdbDialogHost,
|
|
AdbClearKeysDialogHost, LogPersistDialogHost,
|
|
BluetoothRebootDialog.OnRebootDialogListener,
|
|
AbstractBluetoothPreferenceController.Callback,
|
|
NfcRebootDialog.OnNfcRebootDialogConfirmedListener, BluetoothSnoopLogHost {
|
|
|
|
private static final String TAG = "DevSettingsDashboard";
|
|
|
|
private final BluetoothA2dpConfigStore mBluetoothA2dpConfigStore =
|
|
new BluetoothA2dpConfigStore();
|
|
|
|
private boolean mIsAvailable = true;
|
|
private SettingsMainSwitchBar mSwitchBar;
|
|
private DevelopmentSwitchBarController mSwitchBarController;
|
|
private List<AbstractPreferenceController> mPreferenceControllers = new ArrayList<>();
|
|
private BluetoothA2dp mBluetoothA2dp;
|
|
|
|
private final BroadcastReceiver mEnableAdbReceiver = new BroadcastReceiver() {
|
|
@Override
|
|
public void onReceive(Context context, Intent intent) {
|
|
for (AbstractPreferenceController controller : mPreferenceControllers) {
|
|
if (controller instanceof AdbOnChangeListener) {
|
|
((AdbOnChangeListener) controller).onAdbSettingChanged();
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
private final BroadcastReceiver mBluetoothA2dpReceiver = new BroadcastReceiver() {
|
|
@Override
|
|
public void onReceive(Context context, Intent intent) {
|
|
Log.d(TAG, "mBluetoothA2dpReceiver.onReceive intent=" + intent);
|
|
String action = intent.getAction();
|
|
|
|
if (BluetoothA2dp.ACTION_CODEC_CONFIG_CHANGED.equals(action)) {
|
|
BluetoothCodecStatus codecStatus = intent.getParcelableExtra(
|
|
BluetoothCodecStatus.EXTRA_CODEC_STATUS);
|
|
Log.d(TAG, "Received BluetoothCodecStatus=" + codecStatus);
|
|
for (AbstractPreferenceController controller : mPreferenceControllers) {
|
|
if (controller instanceof BluetoothServiceConnectionListener) {
|
|
((BluetoothServiceConnectionListener) controller).onBluetoothCodecUpdated();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
private final BluetoothProfile.ServiceListener mBluetoothA2dpServiceListener =
|
|
new BluetoothProfile.ServiceListener() {
|
|
@Override
|
|
public void onServiceConnected(int profile,
|
|
BluetoothProfile proxy) {
|
|
synchronized (mBluetoothA2dpConfigStore) {
|
|
mBluetoothA2dp = (BluetoothA2dp) proxy;
|
|
}
|
|
for (AbstractPreferenceController controller : mPreferenceControllers) {
|
|
if (controller instanceof BluetoothServiceConnectionListener) {
|
|
((BluetoothServiceConnectionListener) controller)
|
|
.onBluetoothServiceConnected(mBluetoothA2dp);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onServiceDisconnected(int profile) {
|
|
synchronized (mBluetoothA2dpConfigStore) {
|
|
mBluetoothA2dp = null;
|
|
}
|
|
for (AbstractPreferenceController controller : mPreferenceControllers) {
|
|
if (controller instanceof BluetoothServiceConnectionListener) {
|
|
((BluetoothServiceConnectionListener) controller)
|
|
.onBluetoothServiceDisconnected();
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
private final Runnable mSystemPropertiesChanged = new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
synchronized (this) {
|
|
Activity activity = getActivity();
|
|
if (activity != null) {
|
|
activity.runOnUiThread(() -> {
|
|
updatePreferenceStates();
|
|
});
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
private final Uri mDevelopEnabled = Settings.Global.getUriFor(DEVELOPMENT_SETTINGS_ENABLED);
|
|
private final ContentObserver mDeveloperSettingsObserver = new ContentObserver(new Handler(
|
|
Looper.getMainLooper())) {
|
|
|
|
@Override
|
|
public void onChange(boolean selfChange, Uri uri) {
|
|
super.onChange(selfChange, uri);
|
|
final boolean developmentEnabledState =
|
|
DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(getContext());
|
|
final boolean switchState = mSwitchBar.isChecked();
|
|
|
|
// when developer options is enabled, but it is disabled by other privilege apps like:
|
|
// adb command, we should disable all items and finish the activity.
|
|
if (developmentEnabledState != switchState) {
|
|
if (developmentEnabledState) {
|
|
return;
|
|
}
|
|
disableDeveloperOptions();
|
|
getActivity().runOnUiThread(() -> finishFragment());
|
|
}
|
|
}
|
|
};
|
|
|
|
public DevelopmentSettingsDashboardFragment() {
|
|
super(UserManager.DISALLOW_DEBUGGING_FEATURES);
|
|
}
|
|
|
|
@Override
|
|
public void onStart() {
|
|
super.onStart();
|
|
final ContentResolver cr = getContext().getContentResolver();
|
|
cr.registerContentObserver(mDevelopEnabled, false, mDeveloperSettingsObserver);
|
|
}
|
|
|
|
@Override
|
|
public void onStop() {
|
|
super.onStop();
|
|
final ContentResolver cr = getContext().getContentResolver();
|
|
cr.unregisterContentObserver(mDeveloperSettingsObserver);
|
|
}
|
|
|
|
@Override
|
|
public void onCreate(Bundle icicle) {
|
|
super.onCreate(icicle);
|
|
SearchMenuController.init(this);
|
|
if (Utils.isMonkeyRunning()) {
|
|
getActivity().finish();
|
|
return;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onActivityCreated(Bundle icicle) {
|
|
super.onActivityCreated(icicle);
|
|
// Apply page-level restrictions
|
|
setIfOnlyAvailableForAdmins(true);
|
|
if (isUiRestricted() || !WizardManagerHelper.isDeviceProvisioned(getActivity())) {
|
|
// Block access to developer options if the user is not the owner, if user policy
|
|
// restricts it, or if the device has not been provisioned
|
|
mIsAvailable = false;
|
|
// Show error message
|
|
if (!isUiRestrictedByOnlyAdmin()) {
|
|
getEmptyTextView().setText(R.string.development_settings_not_available);
|
|
}
|
|
getPreferenceScreen().removeAll();
|
|
return;
|
|
}
|
|
// Set up primary switch
|
|
mSwitchBar = ((SettingsActivity) getActivity()).getSwitchBar();
|
|
mSwitchBar.setTitle(getContext().getString(R.string.developer_options_main_switch_title));
|
|
mSwitchBar.show();
|
|
mSwitchBarController = new DevelopmentSwitchBarController(
|
|
this /* DevelopmentSettings */, mSwitchBar, mIsAvailable,
|
|
getSettingsLifecycle());
|
|
|
|
// Restore UI state based on whether developer options is enabled
|
|
if (DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(getContext())) {
|
|
enableDeveloperOptions();
|
|
handleQsTileLongPressActionIfAny();
|
|
} else {
|
|
disableDeveloperOptions();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected boolean shouldSkipForInitialSUW() {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Long-pressing a developer options quick settings tile will by default (see
|
|
* QS_TILE_PREFERENCES in the manifest) take you to the developer options page.
|
|
* Some tiles may want to go into their own page within the developer options.
|
|
*/
|
|
private void handleQsTileLongPressActionIfAny() {
|
|
Intent intent = getActivity().getIntent();
|
|
if (intent == null || !TextUtils.equals(ACTION_QS_TILE_PREFERENCES, intent.getAction())) {
|
|
return;
|
|
}
|
|
|
|
Log.d(TAG, "Developer options started from qstile long-press");
|
|
final ComponentName componentName = (ComponentName) intent.getParcelableExtra(
|
|
Intent.EXTRA_COMPONENT_NAME);
|
|
if (componentName == null) {
|
|
return;
|
|
}
|
|
|
|
if (DevelopmentTiles.WirelessDebugging.class.getName().equals(
|
|
componentName.getClassName()) && getDevelopmentOptionsController(
|
|
WirelessDebuggingPreferenceController.class).isAvailable()) {
|
|
Log.d(TAG, "Long press from wireless debugging qstile");
|
|
new SubSettingLauncher(getContext())
|
|
.setDestination(WirelessDebuggingFragment.class.getName())
|
|
.setSourceMetricsCategory(SettingsEnums.SETTINGS_ADB_WIRELESS)
|
|
.launch();
|
|
}
|
|
// Add other qstiles here
|
|
}
|
|
|
|
@Override
|
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
|
Bundle savedInstanceState) {
|
|
registerReceivers();
|
|
SystemProperties.addChangeCallback(mSystemPropertiesChanged);
|
|
final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
|
|
if (adapter != null) {
|
|
adapter.getProfileProxy(getActivity(), mBluetoothA2dpServiceListener,
|
|
BluetoothProfile.A2DP);
|
|
}
|
|
return super.onCreateView(inflater, container, savedInstanceState);
|
|
}
|
|
|
|
@Override
|
|
public void onDestroyView() {
|
|
super.onDestroyView();
|
|
unregisterReceivers();
|
|
|
|
final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
|
|
if (adapter != null) {
|
|
adapter.closeProfileProxy(BluetoothProfile.A2DP, mBluetoothA2dp);
|
|
mBluetoothA2dp = null;
|
|
}
|
|
SystemProperties.removeChangeCallback(mSystemPropertiesChanged);
|
|
}
|
|
|
|
@Override
|
|
public int getMetricsCategory() {
|
|
return SettingsEnums.DEVELOPMENT;
|
|
}
|
|
|
|
@Override
|
|
public void onSwitchChanged(Switch switchView, boolean isChecked) {
|
|
if (switchView != mSwitchBar.getSwitch()) {
|
|
return;
|
|
}
|
|
final boolean developmentEnabledState =
|
|
DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(getContext());
|
|
if (isChecked != developmentEnabledState) {
|
|
if (isChecked) {
|
|
EnableDevelopmentSettingWarningDialog.show(this /* host */);
|
|
} else {
|
|
final BluetoothA2dpHwOffloadPreferenceController a2dpController =
|
|
getDevelopmentOptionsController(
|
|
BluetoothA2dpHwOffloadPreferenceController.class);
|
|
final BluetoothLeAudioHwOffloadPreferenceController leAudioController =
|
|
getDevelopmentOptionsController(
|
|
BluetoothLeAudioHwOffloadPreferenceController.class);
|
|
final NfcSnoopLogPreferenceController nfcSnoopLogController =
|
|
getDevelopmentOptionsController(
|
|
NfcSnoopLogPreferenceController.class);
|
|
final NfcVerboseVendorLogPreferenceController nfcVerboseLogController =
|
|
getDevelopmentOptionsController(
|
|
NfcVerboseVendorLogPreferenceController.class);
|
|
// If hardware offload isn't default value, we must reboot after disable
|
|
// developer options. Show a dialog for the user to confirm.
|
|
if ((a2dpController == null || a2dpController.isDefaultValue())
|
|
&& (leAudioController == null || leAudioController.isDefaultValue())
|
|
&& (nfcSnoopLogController == null || nfcSnoopLogController.isDefaultValue())
|
|
&& (nfcVerboseLogController == null
|
|
|| nfcVerboseLogController.isDefaultValue())) {
|
|
disableDeveloperOptions();
|
|
} else {
|
|
DisableDevSettingsDialogFragment.show(this /* host */);
|
|
}
|
|
}
|
|
FeatureFactory.getFactory(
|
|
getContext()).getSearchFeatureProvider().sendPreIndexIntent(getContext());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onOemUnlockDialogConfirmed() {
|
|
final OemUnlockPreferenceController controller = getDevelopmentOptionsController(
|
|
OemUnlockPreferenceController.class);
|
|
controller.onOemUnlockConfirmed();
|
|
}
|
|
|
|
@Override
|
|
public void onOemUnlockDialogDismissed() {
|
|
final OemUnlockPreferenceController controller = getDevelopmentOptionsController(
|
|
OemUnlockPreferenceController.class);
|
|
controller.onOemUnlockDismissed();
|
|
}
|
|
|
|
@Override
|
|
public void onEnableAdbDialogConfirmed() {
|
|
final AdbPreferenceController controller = getDevelopmentOptionsController(
|
|
AdbPreferenceController.class);
|
|
controller.onAdbDialogConfirmed();
|
|
|
|
}
|
|
|
|
@Override
|
|
public void onEnableAdbDialogDismissed() {
|
|
final AdbPreferenceController controller = getDevelopmentOptionsController(
|
|
AdbPreferenceController.class);
|
|
controller.onAdbDialogDismissed();
|
|
}
|
|
|
|
@Override
|
|
public void onAdbClearKeysDialogConfirmed() {
|
|
final ClearAdbKeysPreferenceController controller = getDevelopmentOptionsController(
|
|
ClearAdbKeysPreferenceController.class);
|
|
controller.onClearAdbKeysConfirmed();
|
|
}
|
|
|
|
@Override
|
|
public void onDisableLogPersistDialogConfirmed() {
|
|
final LogPersistPreferenceController controller = getDevelopmentOptionsController(
|
|
LogPersistPreferenceController.class);
|
|
controller.onDisableLogPersistDialogConfirmed();
|
|
}
|
|
|
|
@Override
|
|
public void onDisableLogPersistDialogRejected() {
|
|
final LogPersistPreferenceController controller = getDevelopmentOptionsController(
|
|
LogPersistPreferenceController.class);
|
|
controller.onDisableLogPersistDialogRejected();
|
|
}
|
|
|
|
@Override
|
|
public void onRebootDialogConfirmed() {
|
|
final BluetoothA2dpHwOffloadPreferenceController a2dpController =
|
|
getDevelopmentOptionsController(BluetoothA2dpHwOffloadPreferenceController.class);
|
|
a2dpController.onRebootDialogConfirmed();
|
|
|
|
final BluetoothLeAudioHwOffloadPreferenceController leAudioController =
|
|
getDevelopmentOptionsController(
|
|
BluetoothLeAudioHwOffloadPreferenceController.class);
|
|
leAudioController.onRebootDialogConfirmed();
|
|
|
|
final BluetoothLeAudioPreferenceController leAudioFeatureController =
|
|
getDevelopmentOptionsController(
|
|
BluetoothLeAudioPreferenceController.class);
|
|
leAudioFeatureController.onRebootDialogConfirmed();
|
|
|
|
final BluetoothLeAudioAllowListPreferenceController leAudioAllowListController =
|
|
getDevelopmentOptionsController(
|
|
BluetoothLeAudioAllowListPreferenceController.class);
|
|
leAudioAllowListController.onRebootDialogConfirmed();
|
|
}
|
|
|
|
@Override
|
|
public void onRebootDialogCanceled() {
|
|
final BluetoothA2dpHwOffloadPreferenceController a2dpController =
|
|
getDevelopmentOptionsController(BluetoothA2dpHwOffloadPreferenceController.class);
|
|
a2dpController.onRebootDialogCanceled();
|
|
|
|
final BluetoothLeAudioHwOffloadPreferenceController leAudioController =
|
|
getDevelopmentOptionsController(
|
|
BluetoothLeAudioHwOffloadPreferenceController.class);
|
|
leAudioController.onRebootDialogCanceled();
|
|
|
|
final BluetoothLeAudioPreferenceController leAudioFeatureController =
|
|
getDevelopmentOptionsController(
|
|
BluetoothLeAudioPreferenceController.class);
|
|
leAudioFeatureController.onRebootDialogCanceled();
|
|
|
|
final BluetoothLeAudioAllowListPreferenceController leAudioAllowListController =
|
|
getDevelopmentOptionsController(
|
|
BluetoothLeAudioAllowListPreferenceController.class);
|
|
leAudioAllowListController.onRebootDialogCanceled();
|
|
}
|
|
|
|
@Override
|
|
public void onNfcRebootDialogConfirmed() {
|
|
final NfcSnoopLogPreferenceController controller =
|
|
getDevelopmentOptionsController(NfcSnoopLogPreferenceController.class);
|
|
controller.onNfcRebootDialogConfirmed();
|
|
|
|
final NfcVerboseVendorLogPreferenceController vendorLogController =
|
|
getDevelopmentOptionsController(NfcVerboseVendorLogPreferenceController.class);
|
|
vendorLogController.onNfcRebootDialogConfirmed();
|
|
}
|
|
|
|
@Override
|
|
public void onNfcRebootDialogCanceled() {
|
|
final NfcSnoopLogPreferenceController controller =
|
|
getDevelopmentOptionsController(NfcSnoopLogPreferenceController.class);
|
|
controller.onNfcRebootDialogCanceled();
|
|
|
|
final NfcVerboseVendorLogPreferenceController vendorLogController =
|
|
getDevelopmentOptionsController(NfcVerboseVendorLogPreferenceController.class);
|
|
vendorLogController.onNfcRebootDialogCanceled();
|
|
}
|
|
|
|
@Override
|
|
public void onSettingChanged() {
|
|
final BluetoothSnoopLogFilterProfileMapPreferenceController controllerMap =
|
|
getDevelopmentOptionsController(
|
|
BluetoothSnoopLogFilterProfileMapPreferenceController.class);
|
|
final BluetoothSnoopLogFilterProfilePbapPreferenceController controllerPbap =
|
|
getDevelopmentOptionsController(
|
|
BluetoothSnoopLogFilterProfilePbapPreferenceController.class);
|
|
controllerMap.onSettingChanged();
|
|
controllerPbap.onSettingChanged();
|
|
}
|
|
|
|
@Override
|
|
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
|
boolean handledResult = false;
|
|
for (AbstractPreferenceController controller : mPreferenceControllers) {
|
|
if (controller instanceof OnActivityResultListener) {
|
|
// We do not break early because it is possible for multiple controllers to
|
|
// handle the same result code.
|
|
handledResult |=
|
|
((OnActivityResultListener) controller).onActivityResult(
|
|
requestCode, resultCode, data);
|
|
}
|
|
}
|
|
if (!handledResult) {
|
|
super.onActivityResult(requestCode, resultCode, data);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected String getLogTag() {
|
|
return TAG;
|
|
}
|
|
|
|
@Override
|
|
public int getHelpResource() {
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
protected int getPreferenceScreenResId() {
|
|
return Utils.isMonkeyRunning() ? R.xml.placeholder_prefs : R.xml.development_settings;
|
|
}
|
|
|
|
@Override
|
|
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
|
if (Utils.isMonkeyRunning()) {
|
|
mPreferenceControllers = new ArrayList<>();
|
|
return null;
|
|
}
|
|
mPreferenceControllers = buildPreferenceControllers(context, getActivity(),
|
|
getSettingsLifecycle(), this /* devOptionsDashboardFragment */,
|
|
new BluetoothA2dpConfigStore());
|
|
return mPreferenceControllers;
|
|
}
|
|
|
|
private void registerReceivers() {
|
|
LocalBroadcastManager.getInstance(getContext())
|
|
.registerReceiver(mEnableAdbReceiver, new IntentFilter(
|
|
AdbPreferenceController.ACTION_ENABLE_ADB_STATE_CHANGED));
|
|
|
|
final IntentFilter filter = new IntentFilter();
|
|
filter.addAction(BluetoothA2dp.ACTION_CODEC_CONFIG_CHANGED);
|
|
getActivity().registerReceiver(mBluetoothA2dpReceiver, filter);
|
|
}
|
|
|
|
private void unregisterReceivers() {
|
|
LocalBroadcastManager.getInstance(getContext()).unregisterReceiver(mEnableAdbReceiver);
|
|
getActivity().unregisterReceiver(mBluetoothA2dpReceiver);
|
|
}
|
|
|
|
private void enableDeveloperOptions() {
|
|
if (Utils.isMonkeyRunning()) {
|
|
return;
|
|
}
|
|
DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(getContext(), true);
|
|
for (AbstractPreferenceController controller : mPreferenceControllers) {
|
|
if (controller instanceof DeveloperOptionsPreferenceController) {
|
|
((DeveloperOptionsPreferenceController) controller).onDeveloperOptionsEnabled();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void disableDeveloperOptions() {
|
|
if (Utils.isMonkeyRunning()) {
|
|
return;
|
|
}
|
|
DevelopmentSettingsEnabler.setDevelopmentSettingsEnabled(getContext(), false);
|
|
final SystemPropPoker poker = SystemPropPoker.getInstance();
|
|
poker.blockPokes();
|
|
for (AbstractPreferenceController controller : mPreferenceControllers) {
|
|
if (controller instanceof DeveloperOptionsPreferenceController) {
|
|
((DeveloperOptionsPreferenceController) controller)
|
|
.onDeveloperOptionsDisabled();
|
|
}
|
|
}
|
|
poker.unblockPokes();
|
|
poker.poke();
|
|
}
|
|
|
|
void onEnableDevelopmentOptionsConfirmed() {
|
|
enableDeveloperOptions();
|
|
}
|
|
|
|
void onEnableDevelopmentOptionsRejected() {
|
|
// Reset the toggle
|
|
mSwitchBar.setChecked(false);
|
|
}
|
|
|
|
void onDisableDevelopmentOptionsConfirmed() {
|
|
disableDeveloperOptions();
|
|
}
|
|
|
|
void onDisableDevelopmentOptionsRejected() {
|
|
// Reset the toggle
|
|
mSwitchBar.setChecked(true);
|
|
}
|
|
|
|
private static List<AbstractPreferenceController> buildPreferenceControllers(Context context,
|
|
Activity activity, Lifecycle lifecycle, DevelopmentSettingsDashboardFragment fragment,
|
|
BluetoothA2dpConfigStore bluetoothA2dpConfigStore) {
|
|
final List<AbstractPreferenceController> controllers = new ArrayList<>();
|
|
controllers.add(new MemoryUsagePreferenceController(context));
|
|
controllers.add(new BugReportPreferenceController(context));
|
|
controllers.add(new BugReportHandlerPreferenceController(context));
|
|
controllers.add(new SystemServerHeapDumpPreferenceController(context));
|
|
controllers.add(new DevelopmentMemtagPagePreferenceController(context, fragment));
|
|
controllers.add(new LocalBackupPasswordPreferenceController(context));
|
|
controllers.add(new StayAwakePreferenceController(context, lifecycle));
|
|
controllers.add(new HdcpCheckingPreferenceController(context));
|
|
controllers.add(new BluetoothSnoopLogPreferenceController(context, fragment));
|
|
controllers.add(new DefaultLaunchPreferenceController(context,
|
|
"snoop_logger_filters_dashboard"));
|
|
controllers.add(new BluetoothSnoopLogFilterProfilePbapPreferenceController(context));
|
|
controllers.add(new BluetoothSnoopLogFilterProfileMapPreferenceController(context));
|
|
controllers.add(new OemUnlockPreferenceController(context, activity, fragment));
|
|
controllers.add(new PictureColorModePreferenceController(context, lifecycle));
|
|
controllers.add(new WebViewAppPreferenceController(context));
|
|
controllers.add(new CoolColorTemperaturePreferenceController(context));
|
|
controllers.add(new DisableAutomaticUpdatesPreferenceController(context));
|
|
controllers.add(new SelectDSUPreferenceController(context));
|
|
controllers.add(new AdbPreferenceController(context, fragment));
|
|
controllers.add(new ClearAdbKeysPreferenceController(context, fragment));
|
|
controllers.add(new WirelessDebuggingPreferenceController(context, lifecycle));
|
|
controllers.add(new AdbAuthorizationTimeoutPreferenceController(context));
|
|
controllers.add(new LocalTerminalPreferenceController(context));
|
|
controllers.add(new BugReportInPowerPreferenceController(context));
|
|
controllers.add(new AutomaticSystemServerHeapDumpPreferenceController(context));
|
|
controllers.add(new MockLocationAppPreferenceController(context, fragment));
|
|
controllers.add(new MockModemPreferenceController(context));
|
|
controllers.add(new DebugViewAttributesPreferenceController(context));
|
|
controllers.add(new SelectDebugAppPreferenceController(context, fragment));
|
|
controllers.add(new WaitForDebuggerPreferenceController(context));
|
|
controllers.add(new EnableGpuDebugLayersPreferenceController(context));
|
|
controllers.add(new GraphicsDriverEnableAngleAsSystemDriverController(context, fragment));
|
|
controllers.add(new ForcePeakRefreshRatePreferenceController(context));
|
|
controllers.add(new EnableVerboseVendorLoggingPreferenceController(context));
|
|
controllers.add(new VerifyAppsOverUsbPreferenceController(context));
|
|
controllers.add(new ArtVerifierPreferenceController(context));
|
|
controllers.add(new LogdSizePreferenceController(context));
|
|
controllers.add(new LogPersistPreferenceController(context, fragment, lifecycle));
|
|
controllers.add(new CameraLaserSensorPreferenceController(context));
|
|
controllers.add(new WifiDisplayCertificationPreferenceController(context));
|
|
controllers.add(new WifiVerboseLoggingPreferenceController(context));
|
|
controllers.add(new WifiScanThrottlingPreferenceController(context));
|
|
controllers.add(new WifiNonPersistentMacRandomizationPreferenceController(context));
|
|
controllers.add(new MobileDataAlwaysOnPreferenceController(context));
|
|
controllers.add(new TetheringHardwareAccelPreferenceController(context));
|
|
controllers.add(new BluetoothDeviceNoNamePreferenceController(context));
|
|
controllers.add(new BluetoothAbsoluteVolumePreferenceController(context));
|
|
controllers.add(new BluetoothAvrcpVersionPreferenceController(context));
|
|
controllers.add(new BluetoothMapVersionPreferenceController(context));
|
|
controllers.add(new BluetoothLeAudioPreferenceController(context, fragment));
|
|
controllers.add(new BluetoothLeAudioAllowListPreferenceController(context, fragment));
|
|
controllers.add(new BluetoothA2dpHwOffloadPreferenceController(context, fragment));
|
|
controllers.add(new BluetoothLeAudioHwOffloadPreferenceController(context, fragment));
|
|
controllers.add(new BluetoothMaxConnectedAudioDevicesPreferenceController(context));
|
|
controllers.add(new NfcStackDebugLogPreferenceController(context));
|
|
controllers.add(new NfcSnoopLogPreferenceController(context, fragment));
|
|
controllers.add(new NfcVerboseVendorLogPreferenceController(context, fragment));
|
|
controllers.add(new ShowTapsPreferenceController(context));
|
|
controllers.add(new PointerLocationPreferenceController(context));
|
|
controllers.add(new ShowSurfaceUpdatesPreferenceController(context));
|
|
controllers.add(new ShowLayoutBoundsPreferenceController(context));
|
|
controllers.add(new ShowRefreshRatePreferenceController(context));
|
|
controllers.add(new RtlLayoutPreferenceController(context));
|
|
controllers.add(new WindowAnimationScalePreferenceController(context));
|
|
controllers.add(new EmulateDisplayCutoutPreferenceController(context));
|
|
controllers.add(new TransparentNavigationBarPreferenceController(context));
|
|
controllers.add(new TransitionAnimationScalePreferenceController(context));
|
|
controllers.add(new AnimatorDurationScalePreferenceController(context));
|
|
controllers.add(new SecondaryDisplayPreferenceController(context));
|
|
controllers.add(new GpuViewUpdatesPreferenceController(context));
|
|
controllers.add(new HardwareLayersUpdatesPreferenceController(context));
|
|
controllers.add(new DebugGpuOverdrawPreferenceController(context));
|
|
controllers.add(new DebugNonRectClipOperationsPreferenceController(context));
|
|
controllers.add(new ForceDarkPreferenceController(context));
|
|
controllers.add(new EnableBlursPreferenceController(context));
|
|
controllers.add(new ForceMSAAPreferenceController(context));
|
|
controllers.add(new HardwareOverlaysPreferenceController(context));
|
|
controllers.add(new SimulateColorSpacePreferenceController(context));
|
|
controllers.add(new UsbAudioRoutingPreferenceController(context));
|
|
controllers.add(new StrictModePreferenceController(context));
|
|
controllers.add(new ProfileGpuRenderingPreferenceController(context));
|
|
controllers.add(new KeepActivitiesPreferenceController(context));
|
|
controllers.add(new BackgroundProcessLimitPreferenceController(context));
|
|
controllers.add(new CachedAppsFreezerPreferenceController(context));
|
|
controllers.add(new ShowFirstCrashDialogPreferenceController(context));
|
|
controllers.add(new AppsNotRespondingPreferenceController(context));
|
|
controllers.add(new NotificationChannelWarningsPreferenceController(context));
|
|
controllers.add(new AllowAppsOnExternalPreferenceController(context));
|
|
controllers.add(new ResizableActivityPreferenceController(context));
|
|
controllers.add(new FreeformWindowsPreferenceController(context, fragment));
|
|
controllers.add(new DesktopModePreferenceController(context, fragment));
|
|
controllers.add(new NonResizableMultiWindowPreferenceController(context));
|
|
controllers.add(new ShortcutManagerThrottlingPreferenceController(context));
|
|
controllers.add(new EnableGnssRawMeasFullTrackingPreferenceController(context));
|
|
controllers.add(new DefaultLaunchPreferenceController(context, "running_apps"));
|
|
controllers.add(new DefaultLaunchPreferenceController(context, "demo_mode"));
|
|
controllers.add(new DefaultLaunchPreferenceController(context, "quick_settings_tiles"));
|
|
controllers.add(new DefaultLaunchPreferenceController(context, "feature_flags_dashboard"));
|
|
controllers.add(new DefaultUsbConfigurationPreferenceController(context));
|
|
controllers.add(new DefaultLaunchPreferenceController(context, "density"));
|
|
controllers.add(new DefaultLaunchPreferenceController(context, "background_check"));
|
|
controllers.add(new DefaultLaunchPreferenceController(context, "inactive_apps"));
|
|
controllers.add(new TarePreferenceController(context));
|
|
controllers.add(new AutofillCategoryController(context, lifecycle));
|
|
controllers.add(new AutofillLoggingLevelPreferenceController(context, lifecycle));
|
|
controllers.add(new AutofillResetOptionsPreferenceController(context));
|
|
controllers.add(new BluetoothCodecDialogPreferenceController(context, lifecycle,
|
|
bluetoothA2dpConfigStore, fragment));
|
|
controllers.add(new BluetoothSampleRateDialogPreferenceController(context, lifecycle,
|
|
bluetoothA2dpConfigStore));
|
|
controllers.add(new BluetoothBitPerSampleDialogPreferenceController(context, lifecycle,
|
|
bluetoothA2dpConfigStore));
|
|
controllers.add(new BluetoothQualityDialogPreferenceController(context, lifecycle,
|
|
bluetoothA2dpConfigStore));
|
|
controllers.add(new BluetoothChannelModeDialogPreferenceController(context, lifecycle,
|
|
bluetoothA2dpConfigStore));
|
|
controllers.add(new BluetoothHDAudioPreferenceController(context, lifecycle,
|
|
bluetoothA2dpConfigStore, fragment));
|
|
controllers.add(new SharedDataPreferenceController(context));
|
|
controllers.add(new OverlaySettingsPreferenceController(context));
|
|
controllers.add(new StylusHandwritingPreferenceController(context));
|
|
controllers.add(new IngressRateLimitPreferenceController((context)));
|
|
controllers.add(new BackAnimationPreferenceController(context, fragment));
|
|
controllers.add(new PhantomProcessPreferenceController(context));
|
|
controllers.add(new ContrastPreferenceController(
|
|
context, context.getSystemService(UiModeManager.class)));
|
|
controllers.add(new ForceEnableNotesRolePreferenceController(context));
|
|
|
|
return controllers;
|
|
}
|
|
|
|
@VisibleForTesting
|
|
<T extends AbstractPreferenceController> T getDevelopmentOptionsController(Class<T> clazz) {
|
|
return use(clazz);
|
|
}
|
|
|
|
@Override
|
|
public void onBluetoothCodecChanged() {
|
|
for (AbstractPreferenceController controller : mPreferenceControllers) {
|
|
if (controller instanceof AbstractBluetoothDialogPreferenceController
|
|
&& !(controller instanceof BluetoothCodecDialogPreferenceController)) {
|
|
((AbstractBluetoothDialogPreferenceController) controller)
|
|
.onBluetoothCodecUpdated();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onBluetoothHDAudioEnabled(boolean enabled) {
|
|
for (AbstractPreferenceController controller : mPreferenceControllers) {
|
|
if (controller instanceof AbstractBluetoothDialogPreferenceController) {
|
|
((AbstractBluetoothDialogPreferenceController) controller).onHDAudioEnabled(
|
|
enabled);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* For Search.
|
|
*/
|
|
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
|
new BaseSearchIndexProvider(R.xml.development_settings) {
|
|
|
|
@Override
|
|
protected boolean isPageSearchEnabled(Context context) {
|
|
return DevelopmentSettingsEnabler.isDevelopmentSettingsEnabled(context);
|
|
}
|
|
|
|
@Override
|
|
public List<AbstractPreferenceController> createPreferenceControllers(Context
|
|
context) {
|
|
return buildPreferenceControllers(context, null /* activity */,
|
|
null /* lifecycle */, null /* devOptionsDashboardFragment */,
|
|
null /* bluetoothA2dpConfigStore */);
|
|
}
|
|
};
|
|
}
|