From 1b64234f4ff6946c259a90c7cc62c41c1fd03b41 Mon Sep 17 00:00:00 2001 From: William Escande Date: Thu, 3 Nov 2022 12:09:55 -0700 Subject: [PATCH 001/100] Fetch currently loaded bluetooth name Test: m ROBOTEST_FILTER="BluetoothMaxConnectedAudioDevicesPreferenceControllerTest" RunSettingsRoboTests -j40 Test: Open developper settings Bug: 257158801 Change-Id: Ib40a6264d8d6908103d76b6401ddcfd3ffa7dd88 (cherry picked from commit e2c6d1f60dde927daeb84226a1b025a582b2a9be) Merged-In: Ib40a6264d8d6908103d76b6401ddcfd3ffa7dd88 --- .../bluetooth/BluetoothPermissionRequest.java | 10 +++- src/com/android/settings/bluetooth/Utils.java | 51 +++++++++++++++++++ ...ectedAudioDevicesPreferenceController.java | 18 +++---- ...dAudioDevicesPreferenceControllerTest.java | 21 ++++---- 4 files changed, 78 insertions(+), 22 deletions(-) mode change 100755 => 100644 src/com/android/settings/bluetooth/Utils.java diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java index 8542fcd2461..a62bbe10e0c 100644 --- a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java +++ b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java @@ -24,6 +24,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager.NameNotFoundException; import android.os.PowerManager; import android.os.UserManager; import android.util.Log; @@ -125,8 +126,15 @@ public void onReceive(Context context, Intent intent) { // Create an intent triggered by clicking on the // "Clear All Notifications" button + String bluetoothName; + try { + bluetoothName = Utils.findBluetoothPackageName(context); + } catch (NameNotFoundException e) { + e.printStackTrace(); + return; + } Intent deleteIntent = new Intent(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY); - deleteIntent.setPackage("com.android.bluetooth"); + deleteIntent.setPackage(bluetoothName); deleteIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice); deleteIntent.putExtra(BluetoothDevice.EXTRA_CONNECTION_ACCESS_RESULT, BluetoothDevice.CONNECTION_ACCESS_NO); diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java old mode 100755 new mode 100644 index ca8f9d39a8c..24fe4e151ff --- a/src/com/android/settings/bluetooth/Utils.java +++ b/src/com/android/settings/bluetooth/Utils.java @@ -16,11 +16,18 @@ package com.android.settings.bluetooth; +import static android.os.Process.BLUETOOTH_UID; + import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; import android.content.DialogInterface; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.os.UserHandle; import android.provider.DeviceConfig; import android.provider.Settings; import android.text.TextUtils; @@ -189,4 +196,48 @@ public static boolean isAdvancedDetailsHeader(@NonNull BluetoothDevice bluetooth } return false; } + + /** + * Returns the Bluetooth Package name + */ + public static String findBluetoothPackageName(Context context) + throws NameNotFoundException { + // this activity will always be in the package where the rest of Bluetooth lives + String sentinelActivity = "com.android.bluetooth.opp.BluetoothOppLauncherActivity"; + PackageManager packageManager = context.createContextAsUser(UserHandle.SYSTEM, 0) + .getPackageManager(); + String[] allPackages = packageManager.getPackagesForUid(BLUETOOTH_UID); + String matchedPackage = null; + for (String candidatePackage : allPackages) { + PackageInfo packageInfo; + try { + packageInfo = + packageManager.getPackageInfo( + candidatePackage, + PackageManager.GET_ACTIVITIES + | PackageManager.MATCH_ANY_USER + | PackageManager.MATCH_UNINSTALLED_PACKAGES + | PackageManager.MATCH_DISABLED_COMPONENTS); + } catch (NameNotFoundException e) { + // rethrow + throw e; + } + if (packageInfo.activities == null) { + continue; + } + for (ActivityInfo activity : packageInfo.activities) { + if (sentinelActivity.equals(activity.name)) { + if (matchedPackage == null) { + matchedPackage = candidatePackage; + } else { + throw new NameNotFoundException("multiple main bluetooth packages found"); + } + } + } + } + if (matchedPackage != null) { + return matchedPackage; + } + throw new NameNotFoundException("Could not find main bluetooth package"); + } } diff --git a/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java index bd8169a80fe..f1677f29509 100644 --- a/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java +++ b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java @@ -16,9 +16,8 @@ package com.android.settings.development; +import android.bluetooth.BluetoothManager; import android.content.Context; -import android.content.pm.PackageManager; -import android.content.res.Resources; import android.os.SystemProperties; import androidx.annotation.VisibleForTesting; @@ -42,18 +41,15 @@ public class BluetoothMaxConnectedAudioDevicesPreferenceController extends private int mDefaultMaxConnectedAudioDevices = 0; + private final BluetoothManager mBluetoothManager; + public BluetoothMaxConnectedAudioDevicesPreferenceController(Context context) { super(context); - try { - Resources res = context.getPackageManager().getResourcesForApplication( - "com.android.bluetooth"); - mDefaultMaxConnectedAudioDevices = res.getInteger(res.getIdentifier( - "config_bluetooth_max_connected_audio_devices", - "integer", "com.android.bluetooth")); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } + mBluetoothManager = context.getSystemService(BluetoothManager.class); + + mDefaultMaxConnectedAudioDevices = + mBluetoothManager.getAdapter().getMaxConnectedAudioDevices(); } @Override diff --git a/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java index 72477b94585..7ab311fe2ab 100644 --- a/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java @@ -24,9 +24,9 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothManager; import android.content.Context; -import android.content.pm.PackageManager; -import android.content.res.Resources; import android.os.SystemProperties; @@ -54,6 +54,11 @@ public class BluetoothMaxConnectedAudioDevicesPreferenceControllerTest { @Spy private Context mSpyContext = RuntimeEnvironment.application; + @Mock + private BluetoothManager mBluetoothManager; + @Mock + private BluetoothAdapter mBluetoothAdapter; + private ListPreference mPreference; private BluetoothMaxConnectedAudioDevicesPreferenceController mController; @@ -63,19 +68,15 @@ public class BluetoothMaxConnectedAudioDevicesPreferenceControllerTest { @Before public void setup() { MockitoAnnotations.initMocks(this); + doReturn(mBluetoothManager).when(mSpyContext).getSystemService(BluetoothManager.class); + doReturn(mBluetoothAdapter).when(mBluetoothManager).getAdapter(); // Get XML values without mock // Setup test list preference using XML values mPreference = new ListPreference(mSpyContext); mPreference.setEntries(R.array.bluetooth_max_connected_audio_devices); mPreference.setEntryValues(R.array.bluetooth_max_connected_audio_devices_values); - // Retrieve default max connected audio devices to a test controlled value - try { - Resources res = mSpyContext.getPackageManager().getResourcesForApplication("com.android.bluetooth"); - TEST_MAX_CONNECTED_AUDIO_DEVICES = res.getInteger(res.getIdentifier("config_bluetooth_max_connected_audio_devices", "integer", "com.android.bluetooth")); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } - + doReturn(TEST_MAX_CONNECTED_AUDIO_DEVICES).when(mBluetoothAdapter) + .getMaxConnectedAudioDevices(); // Init the actual controller mController = new BluetoothMaxConnectedAudioDevicesPreferenceController(mSpyContext); // Construct preference in the controller via a mocked preference screen object From 2e3e67389239d94acebef7232c0c4216d9f2e58e Mon Sep 17 00:00:00 2001 From: William Escande Date: Thu, 3 Nov 2022 12:09:55 -0700 Subject: [PATCH 002/100] Fetch currently loaded bluetooth name Test: m ROBOTEST_FILTER="BluetoothMaxConnectedAudioDevicesPreferenceControllerTest" RunSettingsRoboTests -j40 Test: Open developper settings Bug: 257158801 Change-Id: Ib40a6264d8d6908103d76b6401ddcfd3ffa7dd88 (cherry picked from commit e2c6d1f60dde927daeb84226a1b025a582b2a9be) Merged-In: Ib40a6264d8d6908103d76b6401ddcfd3ffa7dd88 --- .../bluetooth/BluetoothPermissionRequest.java | 10 +++- src/com/android/settings/bluetooth/Utils.java | 51 +++++++++++++++++++ ...ectedAudioDevicesPreferenceController.java | 18 +++---- ...dAudioDevicesPreferenceControllerTest.java | 21 ++++---- 4 files changed, 78 insertions(+), 22 deletions(-) mode change 100755 => 100644 src/com/android/settings/bluetooth/Utils.java diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java index 8542fcd2461..a62bbe10e0c 100644 --- a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java +++ b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java @@ -24,6 +24,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManager.NameNotFoundException; import android.os.PowerManager; import android.os.UserManager; import android.util.Log; @@ -125,8 +126,15 @@ public void onReceive(Context context, Intent intent) { // Create an intent triggered by clicking on the // "Clear All Notifications" button + String bluetoothName; + try { + bluetoothName = Utils.findBluetoothPackageName(context); + } catch (NameNotFoundException e) { + e.printStackTrace(); + return; + } Intent deleteIntent = new Intent(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY); - deleteIntent.setPackage("com.android.bluetooth"); + deleteIntent.setPackage(bluetoothName); deleteIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice); deleteIntent.putExtra(BluetoothDevice.EXTRA_CONNECTION_ACCESS_RESULT, BluetoothDevice.CONNECTION_ACCESS_NO); diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java old mode 100755 new mode 100644 index ca8f9d39a8c..24fe4e151ff --- a/src/com/android/settings/bluetooth/Utils.java +++ b/src/com/android/settings/bluetooth/Utils.java @@ -16,11 +16,18 @@ package com.android.settings.bluetooth; +import static android.os.Process.BLUETOOTH_UID; + import android.app.settings.SettingsEnums; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.content.Context; import android.content.DialogInterface; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.os.UserHandle; import android.provider.DeviceConfig; import android.provider.Settings; import android.text.TextUtils; @@ -189,4 +196,48 @@ public static boolean isAdvancedDetailsHeader(@NonNull BluetoothDevice bluetooth } return false; } + + /** + * Returns the Bluetooth Package name + */ + public static String findBluetoothPackageName(Context context) + throws NameNotFoundException { + // this activity will always be in the package where the rest of Bluetooth lives + String sentinelActivity = "com.android.bluetooth.opp.BluetoothOppLauncherActivity"; + PackageManager packageManager = context.createContextAsUser(UserHandle.SYSTEM, 0) + .getPackageManager(); + String[] allPackages = packageManager.getPackagesForUid(BLUETOOTH_UID); + String matchedPackage = null; + for (String candidatePackage : allPackages) { + PackageInfo packageInfo; + try { + packageInfo = + packageManager.getPackageInfo( + candidatePackage, + PackageManager.GET_ACTIVITIES + | PackageManager.MATCH_ANY_USER + | PackageManager.MATCH_UNINSTALLED_PACKAGES + | PackageManager.MATCH_DISABLED_COMPONENTS); + } catch (NameNotFoundException e) { + // rethrow + throw e; + } + if (packageInfo.activities == null) { + continue; + } + for (ActivityInfo activity : packageInfo.activities) { + if (sentinelActivity.equals(activity.name)) { + if (matchedPackage == null) { + matchedPackage = candidatePackage; + } else { + throw new NameNotFoundException("multiple main bluetooth packages found"); + } + } + } + } + if (matchedPackage != null) { + return matchedPackage; + } + throw new NameNotFoundException("Could not find main bluetooth package"); + } } diff --git a/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java index bd8169a80fe..f1677f29509 100644 --- a/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java +++ b/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceController.java @@ -16,9 +16,8 @@ package com.android.settings.development; +import android.bluetooth.BluetoothManager; import android.content.Context; -import android.content.pm.PackageManager; -import android.content.res.Resources; import android.os.SystemProperties; import androidx.annotation.VisibleForTesting; @@ -42,18 +41,15 @@ public class BluetoothMaxConnectedAudioDevicesPreferenceController extends private int mDefaultMaxConnectedAudioDevices = 0; + private final BluetoothManager mBluetoothManager; + public BluetoothMaxConnectedAudioDevicesPreferenceController(Context context) { super(context); - try { - Resources res = context.getPackageManager().getResourcesForApplication( - "com.android.bluetooth"); - mDefaultMaxConnectedAudioDevices = res.getInteger(res.getIdentifier( - "config_bluetooth_max_connected_audio_devices", - "integer", "com.android.bluetooth")); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } + mBluetoothManager = context.getSystemService(BluetoothManager.class); + + mDefaultMaxConnectedAudioDevices = + mBluetoothManager.getAdapter().getMaxConnectedAudioDevices(); } @Override diff --git a/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java index 72477b94585..7ab311fe2ab 100644 --- a/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/BluetoothMaxConnectedAudioDevicesPreferenceControllerTest.java @@ -24,9 +24,9 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothManager; import android.content.Context; -import android.content.pm.PackageManager; -import android.content.res.Resources; import android.os.SystemProperties; @@ -54,6 +54,11 @@ public class BluetoothMaxConnectedAudioDevicesPreferenceControllerTest { @Spy private Context mSpyContext = RuntimeEnvironment.application; + @Mock + private BluetoothManager mBluetoothManager; + @Mock + private BluetoothAdapter mBluetoothAdapter; + private ListPreference mPreference; private BluetoothMaxConnectedAudioDevicesPreferenceController mController; @@ -63,19 +68,15 @@ public class BluetoothMaxConnectedAudioDevicesPreferenceControllerTest { @Before public void setup() { MockitoAnnotations.initMocks(this); + doReturn(mBluetoothManager).when(mSpyContext).getSystemService(BluetoothManager.class); + doReturn(mBluetoothAdapter).when(mBluetoothManager).getAdapter(); // Get XML values without mock // Setup test list preference using XML values mPreference = new ListPreference(mSpyContext); mPreference.setEntries(R.array.bluetooth_max_connected_audio_devices); mPreference.setEntryValues(R.array.bluetooth_max_connected_audio_devices_values); - // Retrieve default max connected audio devices to a test controlled value - try { - Resources res = mSpyContext.getPackageManager().getResourcesForApplication("com.android.bluetooth"); - TEST_MAX_CONNECTED_AUDIO_DEVICES = res.getInteger(res.getIdentifier("config_bluetooth_max_connected_audio_devices", "integer", "com.android.bluetooth")); - } catch (PackageManager.NameNotFoundException e) { - e.printStackTrace(); - } - + doReturn(TEST_MAX_CONNECTED_AUDIO_DEVICES).when(mBluetoothAdapter) + .getMaxConnectedAudioDevices(); // Init the actual controller mController = new BluetoothMaxConnectedAudioDevicesPreferenceController(mSpyContext); // Construct preference in the controller via a mocked preference screen object From 5b9653f58100a47130618bcbdb7422b2030fd459 Mon Sep 17 00:00:00 2001 From: Diya Bera Date: Mon, 9 Jan 2023 23:52:34 +0000 Subject: [PATCH 003/100] Fixes background color in SUW fingerprint enrollment Test: Manual (Enroll fingerprint in SUW, background color remains the same) Bug: 246231650 Bug: 250464527 Change-Id: Iffd1543d8b230199c3b925c6538bd418a381c96a (cherry picked from commit 00dfcd83dc9acab5a49d24773bd23d5969257b36) Merged-In: Iffd1543d8b230199c3b925c6538bd418a381c96a --- .../android/settings/biometrics/BiometricUtils.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/biometrics/BiometricUtils.java b/src/com/android/settings/biometrics/BiometricUtils.java index 4cd2f790620..9cc656cda23 100644 --- a/src/com/android/settings/biometrics/BiometricUtils.java +++ b/src/com/android/settings/biometrics/BiometricUtils.java @@ -39,6 +39,7 @@ import com.android.settings.biometrics.face.FaceEnrollIntroduction; import com.android.settings.biometrics.fingerprint.FingerprintEnrollFindSensor; import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction; +import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollFindSensor; import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction; import com.android.settings.password.ChooseLockGeneric; import com.android.settings.password.ChooseLockSettingsHelper; @@ -152,9 +153,13 @@ public static Intent getChooseLockIntent(@NonNull Context context, */ public static Intent getFingerprintFindSensorIntent(@NonNull Context context, @NonNull Intent activityIntent) { - Intent intent = new Intent(context, FingerprintEnrollFindSensor.class); - SetupWizardUtils.copySetupExtras(activityIntent, intent); - return intent; + if (WizardManagerHelper.isAnySetupWizard(activityIntent)) { + Intent intent = new Intent(context, SetupFingerprintEnrollFindSensor.class); + SetupWizardUtils.copySetupExtras(activityIntent, intent); + return intent; + } else { + return new Intent(context, FingerprintEnrollFindSensor.class); + } } /** From a61c636eabe5da66d2acac9c5750d2358dc383a1 Mon Sep 17 00:00:00 2001 From: Behnam Heydarshahi Date: Wed, 25 Jan 2023 20:53:53 +0000 Subject: [PATCH 004/100] DO NOT MERGE ANYWHERE Revert "Read flag to show/hide notification slider" Revert submission 20180104-flag_for_b38477228 Reason for revert: b/261809910 fixing for qpr2 Reverted changes: /q/submissionid:20180104-flag_for_b38477228 Change-Id: Id3ebc6627d6b46172cae1ce9e5c7500a652e719d (cherry picked from commit b1195633da9d203056d29df8f119820425a33254) Merged-In: Id3ebc6627d6b46172cae1ce9e5c7500a652e719d --- ...otificationVolumePreferenceController.java | 69 +++----------- .../RingVolumePreferenceController.java | 93 ++++++------------- .../VolumeSeekBarPreferenceController.java | 12 +-- ...icationVolumePreferenceControllerTest.java | 92 +----------------- .../RingVolumePreferenceControllerTest.java | 29 +++--- 5 files changed, 62 insertions(+), 233 deletions(-) diff --git a/src/com/android/settings/notification/NotificationVolumePreferenceController.java b/src/com/android/settings/notification/NotificationVolumePreferenceController.java index 112debca647..322bb6c229b 100644 --- a/src/com/android/settings/notification/NotificationVolumePreferenceController.java +++ b/src/com/android/settings/notification/NotificationVolumePreferenceController.java @@ -16,7 +16,6 @@ package com.android.settings.notification; -import android.app.ActivityThread; import android.app.INotificationManager; import android.app.NotificationManager; import android.content.BroadcastReceiver; @@ -30,32 +29,26 @@ import android.os.Message; import android.os.ServiceManager; import android.os.Vibrator; -import android.provider.DeviceConfig; import android.service.notification.NotificationListenerService; import android.text.TextUtils; import android.util.Log; import androidx.lifecycle.OnLifecycleEvent; -import androidx.preference.PreferenceScreen; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.settings.R; import com.android.settings.Utils; import com.android.settingslib.core.lifecycle.Lifecycle; import java.util.Objects; -import java.util.Set; /** - * Update notification volume icon in Settings in response to user adjusting volume. + * Update notification volume icon in Settings in response to user adjusting volume */ public class NotificationVolumePreferenceController extends VolumeSeekBarPreferenceController { private static final String TAG = "NotificationVolumePreferenceController"; private static final String KEY_NOTIFICATION_VOLUME = "notification_volume"; - private static final boolean CONFIG_DEFAULT_VAL = false; - private boolean mSeparateNotification; private Vibrator mVibrator; private int mRingerMode = AudioManager.RINGER_MODE_NORMAL; @@ -63,74 +56,39 @@ public class NotificationVolumePreferenceController extends VolumeSeekBarPrefere private final RingReceiver mReceiver = new RingReceiver(); private final H mHandler = new H(); private INotificationManager mNoMan; + + private int mMuteIcon; private final int mNormalIconId = R.drawable.ic_notifications; private final int mVibrateIconId = R.drawable.ic_volume_ringer_vibrate; private final int mSilentIconId = R.drawable.ic_notifications_off_24dp; + private final boolean mRingNotificationAliased; + + public NotificationVolumePreferenceController(Context context) { this(context, KEY_NOTIFICATION_VOLUME); } public NotificationVolumePreferenceController(Context context, String key) { super(context, key); - mVibrator = (Vibrator) mContext.getSystemService(Context.VIBRATOR_SERVICE); if (mVibrator != null && !mVibrator.hasVibrator()) { mVibrator = null; } + mRingNotificationAliased = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_alias_ring_notif_stream_types); updateRingerMode(); } - /** - * Allow for notification slider to be enabled in the scenario where the config switches on - * while settings page is already on the screen by always configuring the preference, even if it - * is currently inactive. - */ - @Override - public void displayPreference(PreferenceScreen screen) { - super.displayPreference(screen); - if (mPreference == null) { - setupVolPreference(screen); - } - mSeparateNotification = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL); - if (mPreference != null) { - mPreference.setVisible(getAvailabilityStatus() == AVAILABLE); - } - updateEffectsSuppressor(); - updatePreferenceIconAndSliderState(); - } - - /** - * Only display the notification slider when the corresponding device config flag is set - */ - private void onDeviceConfigChange(DeviceConfig.Properties properties) { - Set changeSet = properties.getKeyset(); - - if (changeSet.contains(SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION)) { - boolean newVal = properties.getBoolean( - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL); - if (newVal != mSeparateNotification) { - mSeparateNotification = newVal; - // manually hiding the preference because being unavailable does not do the job - if (mPreference != null) { - mPreference.setVisible(getAvailabilityStatus() == AVAILABLE); - } - } - } - } - - @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) @Override public void onResume() { super.onResume(); mReceiver.register(true); - DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI, - ActivityThread.currentApplication().getMainExecutor(), - this::onDeviceConfigChange); + updateEffectsSuppressor(); + updatePreferenceIconAndSliderState(); } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) @@ -138,17 +96,16 @@ public void onResume() { public void onPause() { super.onPause(); mReceiver.register(false); - DeviceConfig.removeOnPropertiesChangedListener(this::onDeviceConfigChange); } @Override public int getAvailabilityStatus() { - boolean separateNotification = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, false); + // Show separate notification slider if ring/notification are not aliased by AudioManager -- + // if they are, notification volume is controlled by RingVolumePreferenceController. return mContext.getResources().getBoolean(R.bool.config_show_notification_volume) + && (!mRingNotificationAliased || !Utils.isVoiceCapable(mContext)) && !mHelper.isSingleVolume() - && (separateNotification || !Utils.isVoiceCapable(mContext)) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; } diff --git a/src/com/android/settings/notification/RingVolumePreferenceController.java b/src/com/android/settings/notification/RingVolumePreferenceController.java index 7fdb1e16141..a78689f5a0a 100644 --- a/src/com/android/settings/notification/RingVolumePreferenceController.java +++ b/src/com/android/settings/notification/RingVolumePreferenceController.java @@ -16,7 +16,6 @@ package com.android.settings.notification; -import android.app.ActivityThread; import android.app.INotificationManager; import android.app.NotificationManager; import android.content.BroadcastReceiver; @@ -30,7 +29,6 @@ import android.os.Message; import android.os.ServiceManager; import android.os.Vibrator; -import android.provider.DeviceConfig; import android.service.notification.NotificationListenerService; import android.text.TextUtils; import android.util.Log; @@ -38,13 +36,11 @@ import androidx.lifecycle.OnLifecycleEvent; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.settings.R; import com.android.settings.Utils; import com.android.settingslib.core.lifecycle.Lifecycle; import java.util.Objects; -import java.util.Set; /** * This slider can represent both ring and notification, if the corresponding streams are aliased, @@ -63,21 +59,24 @@ public class RingVolumePreferenceController extends VolumeSeekBarPreferenceContr private int mMuteIcon; - private int mNormalIconId; + /* + * Whether ring and notification streams are aliased together by AudioManager. + * If they are, we'll present one volume control for both. + * If not, we'll present separate volume controls. + */ + private final boolean mRingAliasNotif; + + private final int mNormalIconId; @VisibleForTesting - int mVibrateIconId; + final int mVibrateIconId; @VisibleForTesting - int mSilentIconId; + final int mSilentIconId; @VisibleForTesting - int mTitleId; - - private boolean mSeparateNotification; + final int mTitleId; private INotificationManager mNoMan; - private static final boolean CONFIG_DEFAULT_VAL = false; - public RingVolumePreferenceController(Context context) { this(context, KEY_RING_VOLUME); } @@ -88,56 +87,29 @@ public RingVolumePreferenceController(Context context, String key) { if (mVibrator != null && !mVibrator.hasVibrator()) { mVibrator = null; } - mSeparateNotification = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL); - loadPreferenceIconResources(mSeparateNotification); - updateRingerMode(); - } - private void loadPreferenceIconResources(boolean separateNotification) { - if (separateNotification) { - mTitleId = R.string.separate_ring_volume_option_title; - mNormalIconId = R.drawable.ic_ring_volume; - mSilentIconId = R.drawable.ic_ring_volume_off; - } else { + mRingAliasNotif = isRingAliasNotification(); + if (mRingAliasNotif) { mTitleId = R.string.ring_volume_option_title; + mNormalIconId = R.drawable.ic_notifications; mSilentIconId = R.drawable.ic_notifications_off_24dp; + } else { + mTitleId = R.string.separate_ring_volume_option_title; + + mNormalIconId = R.drawable.ic_ring_volume; + mSilentIconId = R.drawable.ic_ring_volume_off; } // todo: set a distinct vibrate icon for ring vs notification mVibrateIconId = R.drawable.ic_volume_ringer_vibrate; - } - /** - * As the responsibility of this slider changes, so should its title & icon - */ - public void onDeviceConfigChange(DeviceConfig.Properties properties) { - Set changeSet = properties.getKeyset(); - if (changeSet.contains(SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION)) { - boolean valueUpdated = readSeparateNotificationVolumeConfig(); - if (valueUpdated) { - updateEffectsSuppressor(); - selectPreferenceIconState(); - setPreferenceTitle(); - } - } + updateRingerMode(); } - /** - * side effect: updates the cached value of the config, and also the icon - * @return has the config changed? - */ - private boolean readSeparateNotificationVolumeConfig() { - boolean newVal = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, CONFIG_DEFAULT_VAL); - - boolean valueUpdated = newVal != mSeparateNotification; - if (valueUpdated) { - mSeparateNotification = newVal; - loadPreferenceIconResources(newVal); - } - - return valueUpdated; + @VisibleForTesting + boolean isRingAliasNotification() { + return mContext.getResources().getBoolean( + com.android.internal.R.bool.config_alias_ring_notif_stream_types); } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) @@ -145,11 +117,8 @@ private boolean readSeparateNotificationVolumeConfig() { public void onResume() { super.onResume(); mReceiver.register(true); - readSeparateNotificationVolumeConfig(); - DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_SYSTEMUI, - ActivityThread.currentApplication().getMainExecutor(), this::onDeviceConfigChange); updateEffectsSuppressor(); - selectPreferenceIconState(); + updatePreferenceIcon(); setPreferenceTitle(); } @@ -158,7 +127,6 @@ public void onResume() { public void onPause() { super.onPause(); mReceiver.register(false); - DeviceConfig.removeOnPropertiesChangedListener(this::onDeviceConfigChange); } @Override @@ -202,7 +170,7 @@ void updateRingerMode() { final int ringerMode = mHelper.getRingerModeInternal(); if (mRingerMode == ringerMode) return; mRingerMode = ringerMode; - selectPreferenceIconState(); + updatePreferenceIcon(); } private void updateEffectsSuppressor() { @@ -222,8 +190,7 @@ private void updateEffectsSuppressor() { return; } - if (hintsMatch(hints, DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, false))) { + if (hintsMatch(hints, mRingAliasNotif)) { mSuppressor = suppressor; if (mPreference != null) { final String text = SuppressorHelper.getSuppressionText(mContext, suppressor); @@ -233,11 +200,11 @@ private void updateEffectsSuppressor() { } @VisibleForTesting - boolean hintsMatch(int hints, boolean notificationSeparated) { + boolean hintsMatch(int hints, boolean ringNotificationAliased) { return (hints & NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS) != 0 || (hints & NotificationListenerService.HINT_HOST_DISABLE_EFFECTS) != 0 || ((hints & NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS) - != 0 && !notificationSeparated); + != 0 && ringNotificationAliased); } @VisibleForTesting @@ -250,7 +217,7 @@ void setVibrator(Vibrator vibrator) { mVibrator = vibrator; } - private void selectPreferenceIconState() { + private void updatePreferenceIcon() { if (mPreference != null) { if (mRingerMode == AudioManager.RINGER_MODE_NORMAL) { mPreference.showIcon(mNormalIconId); diff --git a/src/com/android/settings/notification/VolumeSeekBarPreferenceController.java b/src/com/android/settings/notification/VolumeSeekBarPreferenceController.java index 0414565721e..d1701599c34 100644 --- a/src/com/android/settings/notification/VolumeSeekBarPreferenceController.java +++ b/src/com/android/settings/notification/VolumeSeekBarPreferenceController.java @@ -55,17 +55,13 @@ public void setCallback(Callback callback) { public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); if (isAvailable()) { - setupVolPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + mPreference.setCallback(mVolumePreferenceCallback); + mPreference.setStream(getAudioStream()); + mPreference.setMuteIcon(getMuteIcon()); } } - protected void setupVolPreference(PreferenceScreen screen) { - mPreference = screen.findPreference(getPreferenceKey()); - mPreference.setCallback(mVolumePreferenceCallback); - mPreference.setStream(getAudioStream()); - mPreference.setMuteIcon(getMuteIcon()); - } - @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void onResume() { if (mPreference != null) { diff --git a/tests/robotests/src/com/android/settings/notification/NotificationVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/NotificationVolumePreferenceControllerTest.java index 7e7ad10d8c1..96b9e6219c8 100644 --- a/tests/robotests/src/com/android/settings/notification/NotificationVolumePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/NotificationVolumePreferenceControllerTest.java @@ -18,7 +18,6 @@ import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -26,17 +25,10 @@ import android.content.res.Resources; import android.media.AudioManager; import android.os.Vibrator; -import android.provider.DeviceConfig; import android.service.notification.NotificationListenerService; import android.telephony.TelephonyManager; -import androidx.preference.PreferenceManager; -import androidx.preference.PreferenceScreen; -import androidx.test.core.app.ApplicationProvider; - -import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; -import com.android.settings.core.BasePreferenceController; -import com.android.settings.testutils.shadow.ShadowDeviceConfig; +import com.android.internal.R; import org.junit.Before; import org.junit.Test; @@ -45,12 +37,11 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; @RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowDeviceConfig.class}) public class NotificationVolumePreferenceControllerTest { + @Mock private AudioHelper mHelper; @Mock @@ -61,11 +52,6 @@ public class NotificationVolumePreferenceControllerTest { private Vibrator mVibrator; @Mock private Resources mResources; - @Mock - private PreferenceManager mPreferenceManager; - - private static final String READ_DEVICE_CONFIG_PERMISSION = - "android.permission.READ_DEVICE_CONFIG"; private Context mContext; private NotificationVolumePreferenceController mController; @@ -101,9 +87,7 @@ public void isAvailable_singleVolume_shouldReturnFalse() { public void isAvailable_voiceCapable_aliasedWithRing_shouldReturnFalse() { when(mResources.getBoolean( com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true); - - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false); + when(mResources.getBoolean(R.bool.config_alias_ring_notif_stream_types)).thenReturn(true); NotificationVolumePreferenceController controller = new NotificationVolumePreferenceController(mContext); @@ -121,9 +105,7 @@ public void isAvailable_voiceCapable_aliasedWithRing_shouldReturnFalse() { public void isAvailable_voiceCapable_separatedFromRing_shouldReturnTrue() { when(mResources.getBoolean( com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true); - - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false); + when(mResources.getBoolean(R.bool.config_alias_ring_notif_stream_types)).thenReturn(false); NotificationVolumePreferenceController controller = new NotificationVolumePreferenceController(mContext); @@ -188,70 +170,4 @@ public void setHintNotification_Matches() { .isTrue(); } - @Test - public void enableSeparateNotificationConfig_controllerBecomesAvailable() { - PreferenceScreen screen = spy(new PreferenceScreen(mContext, null)); - VolumeSeekBarPreference volumeSeekBarPreference = mock(VolumeSeekBarPreference.class); - when(screen.getPreferenceManager()).thenReturn(mPreferenceManager); - when(screen.getContext()).thenReturn(mContext); - when(mResources.getBoolean( - com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true); - // block the alternative condition to enable controller - when(mTelephonyManager.isVoiceCapable()).thenReturn(true); - - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false); - - NotificationVolumePreferenceController controller = - new NotificationVolumePreferenceController(mContext); - when(screen.findPreference(controller.getPreferenceKey())) - .thenReturn(volumeSeekBarPreference); - - // allow the controller to subscribe - Shadows.shadowOf((android.app.Application) ApplicationProvider.getApplicationContext()) - .grantPermissions(READ_DEVICE_CONFIG_PERMISSION); - controller.onResume(); - controller.displayPreference(screen); - - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, Boolean.toString(true), - false); - - assertThat(controller.getAvailabilityStatus() - == BasePreferenceController.AVAILABLE).isTrue(); - } - - @Test - public void disableSeparateNotificationConfig_controllerBecomesUnavailable() { - PreferenceScreen screen = spy(new PreferenceScreen(mContext, null)); - VolumeSeekBarPreference volumeSeekBarPreference = mock(VolumeSeekBarPreference.class); - when(screen.getPreferenceManager()).thenReturn(mPreferenceManager); - when(screen.getContext()).thenReturn(mContext); - when(mResources.getBoolean( - com.android.settings.R.bool.config_show_notification_volume)).thenReturn(true); - - // block the alternative condition to enable controller - when(mTelephonyManager.isVoiceCapable()).thenReturn(true); - - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false); - - NotificationVolumePreferenceController controller = - new NotificationVolumePreferenceController(mContext); - - when(screen.findPreference(controller.getPreferenceKey())) - .thenReturn(volumeSeekBarPreference); - - Shadows.shadowOf((android.app.Application) ApplicationProvider.getApplicationContext()) - .grantPermissions(READ_DEVICE_CONFIG_PERMISSION); - controller.onResume(); - controller.displayPreference(screen); - - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false); - - assertThat(controller.getAvailabilityStatus() - == BasePreferenceController.UNSUPPORTED_ON_DEVICE).isTrue(); - } - } diff --git a/tests/robotests/src/com/android/settings/notification/RingVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/RingVolumePreferenceControllerTest.java index 1ad26c71546..02757d52874 100644 --- a/tests/robotests/src/com/android/settings/notification/RingVolumePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/RingVolumePreferenceControllerTest.java @@ -27,13 +27,10 @@ import android.content.res.Resources; import android.media.AudioManager; import android.os.Vibrator; -import android.provider.DeviceConfig; import android.service.notification.NotificationListenerService; import android.telephony.TelephonyManager; -import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.settings.R; -import com.android.settings.testutils.shadow.ShadowDeviceConfig; import org.junit.Before; import org.junit.Test; @@ -42,11 +39,9 @@ import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; @RunWith(RobolectricTestRunner.class) -@Config(shadows = {ShadowDeviceConfig.class}) public class RingVolumePreferenceControllerTest { @Mock @@ -129,10 +124,9 @@ public void isPublicSlice_returnTrue() { // todo: verify that the title change is displayed, by examining the underlying preference @Test public void ringNotificationStreamsNotAliased_sliderTitleSetToRingOnly() { - - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "true", false); - + when(mResources.getBoolean( + com.android.internal.R.bool.config_alias_ring_notif_stream_types)) + .thenReturn(false); final RingVolumePreferenceController controller = new RingVolumePreferenceController(mContext); @@ -144,9 +138,8 @@ public void ringNotificationStreamsNotAliased_sliderTitleSetToRingOnly() { @Test public void ringNotificationStreamsAliased_sliderTitleIncludesBothRingNotification() { - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_SYSTEMUI, - SystemUiDeviceConfigFlags.VOLUME_SEPARATE_NOTIFICATION, "false", false); - + when(mResources.getBoolean( + com.android.internal.R.bool.config_alias_ring_notif_stream_types)).thenReturn(true); final RingVolumePreferenceController control = new RingVolumePreferenceController(mContext); int expectedTitleId = R.string.ring_volume_option_title; @@ -157,39 +150,39 @@ public void ringNotificationStreamsAliased_sliderTitleIncludesBothRingNotificati @Test public void setHintsRing_aliased_Matches() { assertThat(mController.hintsMatch( - NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS, false)).isTrue(); + NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS, true)).isTrue(); } @Test public void setHintsRingNotification_aliased_Matches() { assertThat(mController.hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_EFFECTS, - false)).isTrue(); + true)).isTrue(); } @Test public void setHintNotification_aliased_Matches() { assertThat(mController .hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS, - false)).isTrue(); + true)).isTrue(); } @Test public void setHintsRing_unaliased_Matches() { assertThat(mController.hintsMatch( - NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS, true)).isTrue(); + NotificationListenerService.HINT_HOST_DISABLE_CALL_EFFECTS, false)).isTrue(); } @Test public void setHintsRingNotification_unaliased_Matches() { assertThat(mController.hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_EFFECTS, - true)).isTrue(); + false)).isTrue(); } @Test public void setHintNotification_unaliased_doesNotMatch() { assertThat(mController .hintsMatch(NotificationListenerService.HINT_HOST_DISABLE_NOTIFICATION_EFFECTS, - true)).isFalse(); + false)).isFalse(); } @Test From 80069c32fefc376b09d25441a080aa719f251428 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Fri, 14 Oct 2022 21:08:02 -0400 Subject: [PATCH 005/100] set styles/wallpaper picker action name --- res/values/config.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/config.xml b/res/values/config.xml index 4aa41425ce6..70d900ae6ae 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -50,9 +50,9 @@ - + android.intent.action.MAIN - + android.intent.action.MAIN com.android.wallpaper.LAUNCH_SOURCE From 5def7a664ca5d43cc0479f260027a201d3ba447b Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Wed, 10 Mar 2021 00:45:12 -0500 Subject: [PATCH 006/100] add TalkBack accessibility service --- res/values/config.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/res/values/config.xml b/res/values/config.xml index 70d900ae6ae..d6a7f051a78 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -81,6 +81,7 @@ com.example.package.first/com.example.class.FirstService com.example.package.second/com.example.class.SecondService --> + com.google.android.accessibility.talkback/com.google.android.marvin.talkback.TalkBackService From 3f0e7bfb63fb61f618864b2c7322a4a14ffdf535 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sat, 9 Oct 2021 17:11:23 -0400 Subject: [PATCH 007/100] fix TalkBack app id --- res/values/config.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/config.xml b/res/values/config.xml index d6a7f051a78..387074dad33 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -81,7 +81,7 @@ com.example.package.first/com.example.class.FirstService com.example.package.second/com.example.class.SecondService --> - com.google.android.accessibility.talkback/com.google.android.marvin.talkback.TalkBackService + com.android.talkback/com.google.android.marvin.talkback.TalkBackService From 453d0f0944eae6ad09ea9eccb11f3f8ea54f5659 Mon Sep 17 00:00:00 2001 From: Renlord Date: Wed, 15 Jan 2020 11:03:39 +0200 Subject: [PATCH 008/100] add PIN scrambling setting Signed-off-by: anupritaisno1 Change-Id: Ib2f60f6d990fd210cdbb4d109fbe2faa50f9b91d --- res/values/arrays.xml | 10 +++ res/values/strings.xml | 3 + res/xml/security_dashboard_settings.xml | 10 ++- .../PinScramblePreferenceController.java | 79 +++++++++++++++++++ .../settings/security/SecuritySettings.java | 1 + 5 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 src/com/android/settings/security/PinScramblePreferenceController.java diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 42d60eee989..53237bd33e9 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -136,6 +136,16 @@ 30 minutes + + Scramble PIN + No PIN scrambling + + + + true + false + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 28b35b3fcfc..0d0d79855ad 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14457,4 +14457,7 @@ QR code isn\u0027t a valid format + + PIN scrambling + Controls PIN scrambling option when inputting PIN on screen lock. diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index 0550441d3f2..689a99944c0 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -55,6 +55,14 @@ android:summary="@string/summary_placeholder" settings:keywords="@string/keywords_face_settings" /> + + - \ No newline at end of file + diff --git a/src/com/android/settings/security/PinScramblePreferenceController.java b/src/com/android/settings/security/PinScramblePreferenceController.java new file mode 100644 index 00000000000..f4a7ddf8f8c --- /dev/null +++ b/src/com/android/settings/security/PinScramblePreferenceController.java @@ -0,0 +1,79 @@ +package com.android.settings.security; + +import android.content.Context; + +import android.os.UserHandle; +import android.os.UserManager; +import android.os.SystemProperties; + +import android.provider.Settings; + +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceCategory; +import androidx.preference.PreferenceGroup; +import androidx.preference.PreferenceScreen; + +import com.android.internal.widget.LockPatternUtils; +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settingslib.core.AbstractPreferenceController; +import com.android.settingslib.core.lifecycle.events.OnResume; + +public class PinScramblePreferenceController extends AbstractPreferenceController + implements PreferenceControllerMixin, OnResume, Preference.OnPreferenceChangeListener { + + private static final String KEY_SCRAMBLE_PIN_LAYOUT = "scramble_pin_layout"; + private static final String PREF_KEY_SECURITY_CATEGORY = "security_category"; + + private PreferenceCategory mSecurityCategory; + private ListPreference mScramblePin; + + public PinScramblePreferenceController(Context context) { + super(context); + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mSecurityCategory = screen.findPreference(PREF_KEY_SECURITY_CATEGORY); + updatePreferenceState(); + } + + @Override + public boolean isAvailable() { + return true; + } + + @Override + public String getPreferenceKey() { + return KEY_SCRAMBLE_PIN_LAYOUT; + } + + // TODO: should we use onCreatePreferences() instead? + private void updatePreferenceState() { + if (mSecurityCategory == null) { + return; + } + mScramblePin = (ListPreference) mSecurityCategory.findPreference(KEY_SCRAMBLE_PIN_LAYOUT); + mScramblePin.setValue(Boolean.toString(Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.SCRAMBLE_PIN_LAYOUT, 0) != 0)); + } + + @Override + public void onResume() { + updatePreferenceState(); + if (mScramblePin != null) { + boolean mode = Boolean.parseBoolean(mScramblePin.getValue()); + Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.SCRAMBLE_PIN_LAYOUT, (mode) ? 0 : 1); + } + } + + @Override + public boolean onPreferenceChange(Preference preference, Object value) { + final String key = preference.getKey(); + if (KEY_SCRAMBLE_PIN_LAYOUT.equals(key)) { + boolean mode = Boolean.parseBoolean((String) value); + Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.SCRAMBLE_PIN_LAYOUT, (mode) ? 1 : 0); + } + return true; + } +} diff --git a/src/com/android/settings/security/SecuritySettings.java b/src/com/android/settings/security/SecuritySettings.java index b30b54d4d4c..51c5e7d51a1 100644 --- a/src/com/android/settings/security/SecuritySettings.java +++ b/src/com/android/settings/security/SecuritySettings.java @@ -105,6 +105,7 @@ private static List buildPreferenceControllers(Con securityPreferenceControllers.add(new CombinedBiometricStatusPreferenceController( context, lifecycle)); securityPreferenceControllers.add(new ChangeScreenLockPreferenceController(context, host)); + securityPreferenceControllers.add(new PinScramblePreferenceController(context)); controllers.add(new PreferenceCategoryController(context, SECURITY_CATEGORY) .setChildren(securityPreferenceControllers)); controllers.addAll(securityPreferenceControllers); From 86f4b26b218849392a750fa12923d9254f834ffe Mon Sep 17 00:00:00 2001 From: inthewaves Date: Sun, 20 Sep 2020 17:57:30 -0700 Subject: [PATCH 009/100] get outer NFC preference to listen for changes The NFC preference in Settings -> Connected devices -> Connection preferences doesn't listen to changes from the NFC tile. (This wasn't an issue in Android 10, because there used to be a SwitchPreference that listened there.) --- .../NfcAndPaymentFragmentController.java | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/connecteddevice/NfcAndPaymentFragmentController.java b/src/com/android/settings/connecteddevice/NfcAndPaymentFragmentController.java index ee0021ec951..f16dd378db5 100644 --- a/src/com/android/settings/connecteddevice/NfcAndPaymentFragmentController.java +++ b/src/com/android/settings/connecteddevice/NfcAndPaymentFragmentController.java @@ -16,21 +16,47 @@ package com.android.settings.connecteddevice; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; import android.nfc.NfcAdapter; import android.os.UserManager; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + import com.android.settings.R; import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.core.lifecycle.LifecycleObserver; +import com.android.settingslib.core.lifecycle.events.OnResume; +import com.android.settingslib.core.lifecycle.events.OnStop; /** * Controller that used to show NFC and payment features */ -public class NfcAndPaymentFragmentController extends BasePreferenceController { +public class NfcAndPaymentFragmentController extends BasePreferenceController + implements LifecycleObserver, OnResume, OnStop { private final NfcAdapter mNfcAdapter; private final PackageManager mPackageManager; private final UserManager mUserManager; + private final IntentFilter mIntentFilter; + private Preference mPreference; + + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (mPreference == null) { + return; + } + + final String action = intent.getAction(); + if (NfcAdapter.ACTION_ADAPTER_STATE_CHANGED.equals(action)) { + refreshSummary(mPreference); + } + } + }; public NfcAndPaymentFragmentController(Context context, String preferenceKey) { super(context, preferenceKey); @@ -38,6 +64,15 @@ public NfcAndPaymentFragmentController(Context context, String preferenceKey) { mPackageManager = context.getPackageManager(); mUserManager = context.getSystemService(UserManager.class); mNfcAdapter = NfcAdapter.getDefaultAdapter(context); + + mIntentFilter = isNfcAvailable() + ? new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED) : null; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); } @Override @@ -61,4 +96,26 @@ public CharSequence getSummary() { } return null; } + + @Override + public void onStop() { + if (!isNfcAvailable()) { + return; + } + + mContext.unregisterReceiver(mReceiver); + } + + @Override + public void onResume() { + if (!isNfcAvailable()) { + return; + } + + mContext.registerReceiver(mReceiver, mIntentFilter); + } + + private boolean isNfcAvailable() { + return mNfcAdapter != null; + } } From 25dd62be6bedf980738c8cb531d3bc4fbca69f89 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Tue, 8 Oct 2019 08:11:55 -0400 Subject: [PATCH 010/100] disable legacy suggestions --- res/values/config.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/config.xml b/res/values/config.xml index 387074dad33..28528b1a3d6 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -222,7 +222,7 @@ Whether or not the homepage should be powered by legacy suggestion (versus contextual cards) Default to true as not all devices support contextual cards. --> - true + false false From 27e1a302800364c7be05ae6413a7d1276d9921c3 Mon Sep 17 00:00:00 2001 From: Renlord Date: Sat, 11 Apr 2020 20:04:51 +1000 Subject: [PATCH 011/100] add missing android title for top_level_settings --- res/xml/top_level_settings.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/res/xml/top_level_settings.xml b/res/xml/top_level_settings.xml index 8c82b671688..54d8d93b514 100644 --- a/res/xml/top_level_settings.xml +++ b/res/xml/top_level_settings.xml @@ -18,7 +18,8 @@ + android:key="top_level_settings" + android:title="Settings"> Date: Tue, 16 Feb 2021 02:22:41 -0500 Subject: [PATCH 012/100] disable showing wallpaper attribution --- res/values/config.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/config.xml b/res/values/config.xml index 28528b1a3d6..edc81937355 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -432,7 +432,7 @@ true - true + false true From 51c028482ba9cf1690231cf2b526bdccbf11e9af Mon Sep 17 00:00:00 2001 From: flawedworld <38294951+flawedworld@users.noreply.github.com> Date: Sun, 16 May 2021 00:51:15 +0100 Subject: [PATCH 013/100] Remove misleading "Google Play system update" info field --- res/xml/firmware_version.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/res/xml/firmware_version.xml b/res/xml/firmware_version.xml index 41f7733cfb2..edc910b36cf 100644 --- a/res/xml/firmware_version.xml +++ b/res/xml/firmware_version.xml @@ -37,14 +37,6 @@ settings:enableCopying="true" settings:controller="com.android.settings.deviceinfo.firmwareversion.SecurityPatchLevelPreferenceController"/> - - - Date: Thu, 20 Jul 2017 06:40:20 -0400 Subject: [PATCH 014/100] enable gesture settings --- res/values/config.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/config.xml b/res/values/config.xml index edc81937355..58cde4a0e7d 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -67,7 +67,7 @@ - false + true false From 84275f7174b1f0e94cb84612e42662be60f7920e Mon Sep 17 00:00:00 2001 From: Danny Lin Date: Sat, 17 Apr 2021 15:15:51 +0100 Subject: [PATCH 015/100] Settings: Integrate ThemePicker and WallpaperPicker2 This uses the standalone wallpaper picker class from WallpaperPicker2 as seen in the Pixel stock ROM. --- res/values/config.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/res/values/config.xml b/res/values/config.xml index 58cde4a0e7d..dd8b3183ea4 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -45,10 +45,10 @@ com.android.settings.overlay.FeatureFactoryImpl - com.android.settings - com.android.settings.Settings$WallpaperSettingsActivity + com.android.wallpaper + com.android.wallpaper.picker.CategoryPickerActivity - + com.android.customization.picker.CustomizationPickerActivity android.intent.action.MAIN From 20e8cea4060fd2ac9762368e7273633ac75eec27 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sun, 17 Mar 2019 18:55:25 -0400 Subject: [PATCH 016/100] do not allow disabling the default keyboard It's not obvious that disabling it after installing another keyboard is a very bad idea. Other keyboards rarely support Direct Boot and won't work for entering the password, forcing recovery by plugging in a physical keyboard. Even if they do support Direct Boot it's a bad idea to rely on third party apps for basic functionality to keep working. --- .../applications/appinfo/AppButtonsPreferenceController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java index 1b270d63b4d..3b6b048752c 100644 --- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java @@ -587,6 +587,7 @@ boolean handleDisableable() { // by not allowing disabling of apps signed with the // system cert and any launcher app in the system. if (mHomePackages.contains(mAppEntry.info.packageName) + || mAppEntry.info.packageName.equals("com.android.inputmethod.latin") || isSystemPackage(mActivity.getResources(), mPm, mPackageInfo)) { // Disable button for core system applications. mButtonsPref.setButton2Text(R.string.disable_text) From cf05baa3d83638f1084522e9808bf7c1f45f35a9 Mon Sep 17 00:00:00 2001 From: flawedworld <38294951+flawedworld@users.noreply.github.com> Date: Tue, 6 Apr 2021 01:11:39 +0100 Subject: [PATCH 017/100] do not allow disabling vanadium webview Rationale being that it can (and will) break some apps if disabled. --- .../applications/appinfo/AppButtonsPreferenceController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java index 3b6b048752c..51ae93459f7 100644 --- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java @@ -588,6 +588,7 @@ boolean handleDisableable() { // system cert and any launcher app in the system. if (mHomePackages.contains(mAppEntry.info.packageName) || mAppEntry.info.packageName.equals("com.android.inputmethod.latin") + || mAppEntry.info.packageName.equals("app.vanadium.webview") || isSystemPackage(mActivity.getResources(), mPm, mPackageInfo)) { // Disable button for core system applications. mButtonsPref.setButton2Text(R.string.disable_text) From e5a58f2ccaefa906fd634911d798806a4786d75f Mon Sep 17 00:00:00 2001 From: lsfxz Date: Sun, 8 Dec 2019 14:58:24 -0800 Subject: [PATCH 018/100] add deny_new_usb setting Based on original patch by Daniel Micay . --- res/values/arrays.xml | 16 +++ res/values/strings.xml | 2 + res/xml/security_dashboard_settings.xml | 8 ++ .../DenyNewUsbPreferenceController.java | 103 ++++++++++++++++++ .../settings/security/SecuritySettings.java | 1 + 5 files changed, 130 insertions(+) create mode 100644 src/com/android/settings/security/DenyNewUsbPreferenceController.java diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 53237bd33e9..b4db94eb60f 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -146,6 +146,22 @@ false + + Deny new USB peripherals + Allow new USB peripherals when unlocked + Allow new USB peripherals + + + + + + enabled + + dynamic + + disabled + + diff --git a/res/values/strings.xml b/res/values/strings.xml index 0d0d79855ad..be67439aa37 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14460,4 +14460,6 @@ PIN scrambling Controls PIN scrambling option when inputting PIN on screen lock. + USB accessories + Control support for USB peripherals such as input (mice, keyboards, joysticks) and storage devices. diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index 689a99944c0..700c084b73f 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -54,6 +54,14 @@ android:title="@string/security_settings_face_preference_title" android:summary="@string/summary_placeholder" settings:keywords="@string/keywords_face_settings" /> + + buildPreferenceControllers(Con context, lifecycle)); securityPreferenceControllers.add(new ChangeScreenLockPreferenceController(context, host)); securityPreferenceControllers.add(new PinScramblePreferenceController(context)); + securityPreferenceControllers.add(new DenyNewUsbPreferenceController(context)); controllers.add(new PreferenceCategoryController(context, SECURITY_CATEGORY) .setChildren(securityPreferenceControllers)); controllers.addAll(securityPreferenceControllers); From f9cb63e1b52f817258acf003d1c396de09928a80 Mon Sep 17 00:00:00 2001 From: Renlord Date: Tue, 15 Sep 2020 22:40:56 -0700 Subject: [PATCH 019/100] add keyguard camera toggle setting Co-authored-by: inthewaves --- res/values/strings.xml | 2 + res/xml/security_dashboard_settings.xml | 6 ++ .../KeyguardCameraPreferenceController.java | 97 +++++++++++++++++++ .../settings/security/SecuritySettings.java | 1 + 4 files changed, 106 insertions(+) create mode 100644 src/com/android/settings/security/KeyguardCameraPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index be67439aa37..8babfa327e0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14462,4 +14462,6 @@ Controls PIN scrambling option when inputting PIN on screen lock. USB accessories Control support for USB peripherals such as input (mice, keyboards, joysticks) and storage devices. + Screen lock camera access + Allow camera access when the device is locked diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index 700c084b73f..e07c4b3d127 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -71,6 +71,12 @@ android:entries="@array/scramble_pin_entries" android:entryValues="@array/scramble_pin_values" /> + + buildPreferenceControllers(Con securityPreferenceControllers.add(new ChangeScreenLockPreferenceController(context, host)); securityPreferenceControllers.add(new PinScramblePreferenceController(context)); securityPreferenceControllers.add(new DenyNewUsbPreferenceController(context)); + securityPreferenceControllers.add(new KeyguardCameraPreferenceController(context)); controllers.add(new PreferenceCategoryController(context, SECURITY_CATEGORY) .setChildren(securityPreferenceControllers)); controllers.addAll(securityPreferenceControllers); From cdfac5adbbe1ff36198fdd99dd2f6b1fcfab0116 Mon Sep 17 00:00:00 2001 From: flawedworld <38294951+flawedworld@users.noreply.github.com> Date: Tue, 6 Apr 2021 01:15:32 +0100 Subject: [PATCH 020/100] add native debugging setting --- res/values/strings.xml | 2 + res/xml/security_dashboard_settings.xml | 6 + .../NativeDebugPreferenceController.java | 106 ++++++++++++++++++ .../settings/security/SecuritySettings.java | 1 + 4 files changed, 115 insertions(+) create mode 100644 src/com/android/settings/security/NativeDebugPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 8babfa327e0..564fc17e1b7 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14464,4 +14464,6 @@ Control support for USB peripherals such as input (mice, keyboards, joysticks) and storage devices. Screen lock camera access Allow camera access when the device is locked + Enable native code debugging + Generate useful logs / bug reports from crashes and permit debugging native code. diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index e07c4b3d127..edadc9a9f2c 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -63,6 +63,12 @@ android:entries="@array/deny_new_usb_entries" android:entryValues="@array/deny_new_usb_values" /> + + buildPreferenceControllers(Con securityPreferenceControllers.add(new PinScramblePreferenceController(context)); securityPreferenceControllers.add(new DenyNewUsbPreferenceController(context)); securityPreferenceControllers.add(new KeyguardCameraPreferenceController(context)); + securityPreferenceControllers.add(new NativeDebugPreferenceController(context)); controllers.add(new PreferenceCategoryController(context, SECURITY_CATEGORY) .setChildren(securityPreferenceControllers)); controllers.addAll(securityPreferenceControllers); From fa3b411fb0d8322484853d38190198ccb32f924f Mon Sep 17 00:00:00 2001 From: flawedworld <38294951+flawedworld@users.noreply.github.com> Date: Tue, 6 Apr 2021 01:13:36 +0100 Subject: [PATCH 021/100] add device info field with bootloader version --- res/values/strings.xml | 2 ++ res/xml/firmware_version.xml | 9 ++++++ ...BootloaderVersionPreferenceController.java | 28 +++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 src/com/android/settings/deviceinfo/firmwareversion/BootloaderVersionPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 564fc17e1b7..a3decfc821a 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3533,6 +3533,8 @@ Baseband version + Bootloader version + Kernel version Build number diff --git a/res/xml/firmware_version.xml b/res/xml/firmware_version.xml index edc910b36cf..cf9779a6988 100644 --- a/res/xml/firmware_version.xml +++ b/res/xml/firmware_version.xml @@ -46,6 +46,15 @@ settings:enableCopying="true" settings:controller="com.android.settings.deviceinfo.firmwareversion.BasebandVersionPreferenceController"/> + + + Date: Mon, 7 Jun 2021 22:15:59 +0100 Subject: [PATCH 022/100] add auto-reboot setting --- res/values/arrays.xml | 31 +++++++ res/values/strings.xml | 2 + res/xml/security_dashboard_settings.xml | 8 ++ .../AutoRebootPreferenceController.java | 82 +++++++++++++++++++ .../settings/security/SecuritySettings.java | 1 + 5 files changed, 124 insertions(+) create mode 100644 src/com/android/settings/security/AutoRebootPreferenceController.java diff --git a/res/values/arrays.xml b/res/values/arrays.xml index b4db94eb60f..6d0125619b4 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -146,6 +146,37 @@ false + + + Off + 10 minutes + 30 minutes + 1 hour + 2 hours + 4 hours + 8 hours + 12 hours + 24 hours + 36 hours + 48 hours + 72 hours + + + + 0 + 600000 + 1800000 + 3600000 + 7200000 + 14400000 + 28800000 + 43200000 + 86400000 + 129600000 + 172800000 + 259200000 + + Deny new USB peripherals Allow new USB peripherals when unlocked diff --git a/res/values/strings.xml b/res/values/strings.xml index a3decfc821a..237668c4cd3 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14463,6 +14463,8 @@ PIN scrambling Controls PIN scrambling option when inputting PIN on screen lock. USB accessories + Auto reboot + Automatically reboot the device, if the phone hasn\'t been unlocked within the selected number of hours. Control support for USB peripherals such as input (mice, keyboards, joysticks) and storage devices. Screen lock camera access Allow camera access when the device is locked diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index edadc9a9f2c..8a391dc44ec 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -55,6 +55,14 @@ android:summary="@string/summary_placeholder" settings:keywords="@string/keywords_face_settings" /> + + buildPreferenceControllers(Con context, lifecycle)); securityPreferenceControllers.add(new ChangeScreenLockPreferenceController(context, host)); securityPreferenceControllers.add(new PinScramblePreferenceController(context)); + securityPreferenceControllers.add(new AutoRebootPreferenceController(context)); securityPreferenceControllers.add(new DenyNewUsbPreferenceController(context)); securityPreferenceControllers.add(new KeyguardCameraPreferenceController(context)); securityPreferenceControllers.add(new NativeDebugPreferenceController(context)); From 117757a402bc0119d114a6ceb22f7239b2836d74 Mon Sep 17 00:00:00 2001 From: Oliver Scott Date: Fri, 2 Oct 2020 12:37:30 -0400 Subject: [PATCH 023/100] add bluetooth auto-turn-off setting --- res/values/arrays.xml | 44 +++++++ res/values/strings.xml | 19 +++ res/xml/connected_devices.xml | 8 ++ .../BluetoothTimeoutPreferenceController.java | 115 ++++++++++++++++++ 4 files changed, 186 insertions(+) create mode 100644 src/com/android/settings/bluetooth/BluetoothTimeoutPreferenceController.java diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 6d0125619b4..cdb395b27e2 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -39,6 +39,50 @@ All + + + @string/bluetooth_timeout_summary_never + @string/bluetooth_timeout_summary_15secs + @string/bluetooth_timeout_summary_30secs + @string/bluetooth_timeout_summary_1min + @string/bluetooth_timeout_summary_2mins + @string/bluetooth_timeout_summary_5mins + @string/bluetooth_timeout_summary_10mins + @string/bluetooth_timeout_summary_30mins + @string/bluetooth_timeout_summary_1hour + @string/bluetooth_timeout_summary_2hours + @string/bluetooth_timeout_summary_4hours + @string/bluetooth_timeout_summary_8hours + + + + + + 0 + + 15000 + + 30000 + + 60000 + + 120000 + + 300000 + + 600000 + + 1800000 + + 3600000 + + 7200000 + + 14400000 + + 28800000 + + 15 seconds diff --git a/res/values/strings.xml b/res/values/strings.xml index 237668c4cd3..3aa56b9d8bd 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -27,6 +27,25 @@ Turn on + + Bluetooth timeout + + + Bluetooth will turn off after %1$s if no devices connected + Do not automatically turn off Bluetooth + Never + 15 seconds + 30 seconds + 1 minute + 2 minutes + 5 minutes + 10 minutes + 30 minutes + 1 hour + 2 hours + 4 hours + 8 hours + Unknown diff --git a/res/xml/connected_devices.xml b/res/xml/connected_devices.xml index a0e0a1f26d6..ded58ebd419 100644 --- a/res/xml/connected_devices.xml +++ b/res/xml/connected_devices.xml @@ -47,6 +47,14 @@ settings:useAdminDisabledSummary="true" settings:controller="com.android.settings.connecteddevice.AddDevicePreferenceController"/> + + Date: Mon, 19 Jul 2021 01:31:27 +0200 Subject: [PATCH 024/100] hide pattern screenlock option --- .../android/settings/password/ChooseLockGenericController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/password/ChooseLockGenericController.java b/src/com/android/settings/password/ChooseLockGenericController.java index cd9eb2fd44d..48dc2094d50 100644 --- a/src/com/android/settings/password/ChooseLockGenericController.java +++ b/src/com/android/settings/password/ChooseLockGenericController.java @@ -175,8 +175,9 @@ public boolean isScreenLockVisible(ScreenLockType type) { && !managedProfile; // Swipe doesn't make sense for profiles. case MANAGED: return mManagedPasswordProvider.isManagedPasswordChoosable(); - case PIN: case PATTERN: + return false; + case PIN: case PASSWORD: // Hide the secure lock screen options if the device doesn't support the secure lock // screen feature. From 0792e32c4af73ba9765093e97e6de8bf79794fc6 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sun, 25 Jul 2021 14:44:48 -0400 Subject: [PATCH 025/100] drop support for showing nearby devices from Play --- res/values/config.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/values/config.xml b/res/values/config.xml index dd8b3183ea4..59417592b99 100755 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -474,7 +474,7 @@ true - content://com.google.android.gms.nearby.fastpair/device_status_list_item + From cbb6e41fcd26f5ea38fd6226f93301e7e22f9497 Mon Sep 17 00:00:00 2001 From: flawedworld Date: Wed, 1 Sep 2021 23:36:10 +0300 Subject: [PATCH 026/100] UserManager app installation restrictions --- res/values/strings.xml | 2 + res/xml/user_details_settings.xml | 4 ++ .../settings/users/UserDetailsSettings.java | 43 ++++++++++++++++--- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 3aa56b9d8bd..36b3c969317 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7991,6 +7991,8 @@ Turn on phone calls Turn on phone calls & SMS + + Disallow installing apps Delete user diff --git a/res/xml/user_details_settings.xml b/res/xml/user_details_settings.xml index 2301bac1d42..d2766360a0a 100644 --- a/res/xml/user_details_settings.xml +++ b/res/xml/user_details_settings.xml @@ -29,6 +29,10 @@ android:key="app_and_content_access" android:icon="@drawable/ic_lock_closed" android:title="@string/user_restrictions_title" /> + users = mUserManager.getUsers(true); + for (UserInfo user: users) { + if (user.isGuest()) { + UserHandle userHandle = UserHandle.of(user.id); + for (String key : mDefaultGuestRestrictions.keySet()) { + mUserManager.setUserRestriction( + key, mDefaultGuestRestrictions.getBoolean(key), userHandle); + } + } + } + } else { + UserHandle userHandle = UserHandle.of(mUserInfo.id); + mUserManager.setUserRestriction(UserManager.DISALLOW_INSTALL_APPS, (Boolean) newValue, + userHandle); + } } - enableCallsAndSms(false); return true; } @@ -273,6 +300,7 @@ void initialize(Context context, Bundle arguments) { mRemoveUserPref = findPreference(KEY_REMOVE_USER); mAppAndContentAccessPref = findPreference(KEY_APP_AND_CONTENT_ACCESS); mAppCopyingPref = findPreference(KEY_APP_COPYING); + mInstallAppsPref = findPreference(KEY_DISALLOW_INSTALL_APPS); mSwitchUserPref.setTitle( context.getString(com.android.settingslib.R.string.user_switch_to_user, @@ -291,6 +319,7 @@ void initialize(Context context, Bundle arguments) { removePreference(KEY_REMOVE_USER); removePreference(KEY_APP_AND_CONTENT_ACCESS); removePreference(KEY_APP_COPYING); + removePreference(KEY_DISALLOW_INSTALL_APPS); } else { if (!Utils.isVoiceCapable(context)) { // no telephony removePreference(KEY_ENABLE_TELEPHONY); @@ -324,11 +353,14 @@ void initialize(Context context, Bundle arguments) { if (!SHOW_APP_COPYING_PREF) { removePreference(KEY_APP_COPYING); } + removePreference(KEY_DISALLOW_INSTALL_APPS); } else { mPhonePref.setChecked(!mUserManager.hasUserRestriction( UserManager.DISALLOW_OUTGOING_CALLS, new UserHandle(userId))); mRemoveUserPref.setTitle(R.string.user_remove_user); removePreference(KEY_APP_COPYING); + mInstallAppsPref.setChecked(mUserManager.hasUserRestriction( + UserManager.DISALLOW_INSTALL_APPS, new UserHandle(userId))); } if (RestrictedLockUtilsInternal.hasBaseUserRestriction(context, UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId())) { @@ -339,6 +371,7 @@ void initialize(Context context, Bundle arguments) { mPhonePref.setOnPreferenceChangeListener(this); mAppAndContentAccessPref.setOnPreferenceClickListener(this); mAppCopyingPref.setOnPreferenceClickListener(this); + mInstallAppsPref.setOnPreferenceChangeListener(this); } } From 46bc472a4fff2793649c978910e83187b7372145 Mon Sep 17 00:00:00 2001 From: Oliver Scott Date: Thu, 25 Feb 2021 11:31:14 -0500 Subject: [PATCH 027/100] add Wi-Fi timeout feature --- res/values/arrays.xml | 44 +++++++ res/values/strings.xml | 19 +++ res/xml/wifi_configure_settings.xml | 8 ++ .../wifi/WifiTimeoutPreferenceController.java | 115 ++++++++++++++++++ 4 files changed, 186 insertions(+) create mode 100644 src/com/android/settings/wifi/WifiTimeoutPreferenceController.java diff --git a/res/values/arrays.xml b/res/values/arrays.xml index cdb395b27e2..c9c5d1af499 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -83,6 +83,50 @@ 28800000 + + + @string/wifi_timeout_summary_never + @string/wifi_timeout_summary_15secs + @string/wifi_timeout_summary_30secs + @string/wifi_timeout_summary_1min + @string/wifi_timeout_summary_2mins + @string/wifi_timeout_summary_5mins + @string/wifi_timeout_summary_10mins + @string/wifi_timeout_summary_30mins + @string/wifi_timeout_summary_1hour + @string/wifi_timeout_summary_2hours + @string/wifi_timeout_summary_4hours + @string/wifi_timeout_summary_8hours + + + + + + 0 + + 15000 + + 30000 + + 60000 + + 120000 + + 300000 + + 600000 + + 1800000 + + 3600000 + + 7200000 + + 14400000 + + 28800000 + + 15 seconds diff --git a/res/values/strings.xml b/res/values/strings.xml index 36b3c969317..7ed3ae134a7 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -46,6 +46,25 @@ 4 hours 8 hours + + Turn off Wi-Fi automatically + + + Wi-Fi will turn off after %1$s if no network connected + Disabled + Never + 15 seconds + 30 seconds + 1 minute + 2 minutes + 5 minutes + 10 minutes + 30 minutes + 1 hour + 2 hours + 4 hours + 8 hours + Unknown diff --git a/res/xml/wifi_configure_settings.xml b/res/xml/wifi_configure_settings.xml index 2ab7b6a28fe..a682e2db92d 100644 --- a/res/xml/wifi_configure_settings.xml +++ b/res/xml/wifi_configure_settings.xml @@ -26,6 +26,14 @@ android:summary="@string/wifi_wakeup_summary" settings:controller="com.android.settings.wifi.WifiWakeupPreferenceController"/> + + Date: Mon, 18 Oct 2021 23:15:06 +0100 Subject: [PATCH 028/100] add a toggle for disabling fingerprint unlock Ported from 11. In 12 fingerprint is handled by the new biometric API and so technically in 12 this is not just disabling fingerprint unlock but all biometrics. This does not affect the Pixel 4 generation of devices with face scanning however as they were released on Q and so use the legacy face API. No frameworks/base changes are needed for 12 in this case other than migration which can be done in another commit. --- res/values/strings.xml | 2 ++ res/xml/security_settings_fingerprint.xml | 5 +++++ .../fingerprint/FingerprintSettings.java | 22 +++++++++++++++++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 7ed3ae134a7..a8f6ba576d4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14510,4 +14510,6 @@ Allow camera access when the device is locked Enable native code debugging Generate useful logs / bug reports from crashes and permit debugging native code. + Allow fingerprint unlocking + Allow fingerprints to unlock the screen lock. If this is disabled, fingerprints can still be used in apps. diff --git a/res/xml/security_settings_fingerprint.xml b/res/xml/security_settings_fingerprint.xml index a4ce545a7ff..43d00761e3d 100644 --- a/res/xml/security_settings_fingerprint.xml +++ b/res/xml/security_settings_fingerprint.xml @@ -30,6 +30,11 @@ android:summary="@string/security_settings_require_screen_on_to_auth_description" settings:keywords="@string/security_settings_require_screen_on_to_auth_keywords" settings:controller="com.android.settings.biometrics.fingerprint.FingerprintSettingsRequireScreenOnToAuthPreferenceController" /> + + diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index bbb4f45b702..abe32df5774 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -41,6 +41,7 @@ import android.os.UserManager; import android.text.InputFilter; import android.text.Spanned; +import android.provider.Settings; import android.text.TextUtils; import android.util.Log; import android.view.View; @@ -153,7 +154,7 @@ private static class FooterColumn { private static final String KEY_FINGERPRINT_ITEM_PREFIX = "key_fingerprint_item"; private static final String KEY_FINGERPRINT_ADD = "key_fingerprint_add"; private static final String KEY_FINGERPRINT_ENABLE_KEYGUARD_TOGGLE = - "fingerprint_enable_keyguard_toggle"; + "security_settings_fingerprint_keyguard"; private static final String KEY_LAUNCHED_CONFIRM = "launched_confirm"; private static final String KEY_HAS_FIRST_ENROLLED = "has_first_enrolled"; private static final String KEY_IS_ENROLLING = "is_enrolled"; @@ -515,6 +516,20 @@ private PreferenceScreen createPreferenceHierarchy() { setRequireScreenOnToAuthVisibility(); } setPreferenceScreen(root); + + // Don't show keyguard preferences for work profile settings. + if (UserManager.get(getContext()).isManagedProfile(mUserId)) { + removePreference(KEY_FINGERPRINT_ENABLE_KEYGUARD_TOGGLE); + } else { + SwitchPreference lockScreenFingerprintPreference = + (SwitchPreference) findPreference(KEY_FINGERPRINT_ENABLE_KEYGUARD_TOGGLE); + + lockScreenFingerprintPreference.setChecked(Settings.Secure.getInt( + getContext().getContentResolver(), + Settings.Secure.BIOMETRIC_KEYGUARD_ENABLED, 1) == 1); + lockScreenFingerprintPreference.setOnPreferenceChangeListener(this); + } + return root; } @@ -735,7 +750,10 @@ public boolean onPreferenceChange(Preference preference, Object value) { boolean result = true; final String key = preference.getKey(); if (KEY_FINGERPRINT_ENABLE_KEYGUARD_TOGGLE.equals(key)) { - // TODO + boolean enableFingerprintUnlock = (boolean) value; + Settings.Secure.putInt(getContext().getContentResolver(), + Settings.Secure.BIOMETRIC_KEYGUARD_ENABLED, + (enableFingerprintUnlock) ? 1 : 0); } else { Log.v(TAG, "Unknown key:" + key); } From ebe67cba51ddb042d6642ffdc79aa802cc4c655f Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 18 Oct 2021 02:17:56 +0000 Subject: [PATCH 029/100] Dark mode support for app installation restriction icon --- res/drawable/ic_settings_install.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/res/drawable/ic_settings_install.xml b/res/drawable/ic_settings_install.xml index 5bd5e300eae..eefecc242a4 100644 --- a/res/drawable/ic_settings_install.xml +++ b/res/drawable/ic_settings_install.xml @@ -18,7 +18,8 @@ android:width="24dp" android:height="24dp" android:viewportWidth="24" - android:viewportHeight="24"> + android:viewportHeight="24" + android:tint="?android:attr/colorControlNormal"> From a7f3dc63995c6042fd977ff90ce32b09d2a0aedc Mon Sep 17 00:00:00 2001 From: Pratyush Date: Wed, 20 Oct 2021 05:40:11 +0530 Subject: [PATCH 030/100] add toggle to set captiveportal settings Access is disallowed for users that are disallowed from configuring Private DNS settings. This restriction provides administrative control over this feature in a way that's compatible with existing device manager implementations. Private DNS is the closest fit from the existing user management restrictions that are available. Co-authored-by: stuux Co-authored-by: Renlord Co-authored-by: Danny Lin Co-authored-by: anupritaisno1 Signed-off-by: empratyush --- res/values/arrays.xml | 12 ++ res/values/strings.xml | 2 + ...ConnectivityCheckPreferenceController.java | 202 ++++++++++++++++++ .../network/NetworkDashboardFragment.java | 3 + 4 files changed, 219 insertions(+) create mode 100644 src/com/android/settings/network/ConnectivityCheckPreferenceController.java diff --git a/res/values/arrays.xml b/res/values/arrays.xml index c9c5d1af499..262252891ec 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -281,6 +281,18 @@ disabled + + GrapheneOS + Standard (Google) + Disabled + + + + 0 + 1 + 2 + + diff --git a/res/values/strings.xml b/res/values/strings.xml index a8f6ba576d4..e880c769f92 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14512,4 +14512,6 @@ Generate useful logs / bug reports from crashes and permit debugging native code. Allow fingerprint unlocking Allow fingerprints to unlock the screen lock. If this is disabled, fingerprints can still be used in apps. + Internet connectivity check + HTTP endpoints to use for performing internet connectivity checks. diff --git a/src/com/android/settings/network/ConnectivityCheckPreferenceController.java b/src/com/android/settings/network/ConnectivityCheckPreferenceController.java new file mode 100644 index 00000000000..adbe8978772 --- /dev/null +++ b/src/com/android/settings/network/ConnectivityCheckPreferenceController.java @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2020 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.network; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.res.Resources; +import android.database.ContentObserver; +import android.net.LinkProperties; +import android.net.Network; +import android.os.Handler; +import android.os.Looper; +import android.os.UserHandle; +import android.os.UserManager; +import android.provider.Settings; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import com.android.internal.util.ArrayUtils; +import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; +import com.android.settingslib.RestrictedLockUtilsInternal; +import com.android.settingslib.core.lifecycle.events.OnResume; + +public class ConnectivityCheckPreferenceController + extends BasePreferenceController + implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener, + OnResume { + + private static final String GRAPHENEOS_CAPTIVE_PORTAL_HTTPS_URL = + "https://connectivitycheck.grapheneos.network/generate_204"; + private static final String GRAPHENEOS_CAPTIVE_PORTAL_HTTP_URL = + "http://connectivitycheck.grapheneos.network/generate_204"; + private static final String GRAPHENEOS_CAPTIVE_PORTAL_FALLBACK_URL = + "http://grapheneos.online/gen_204"; + private static final String GRAPHENEOS_CAPTIVE_PORTAL_OTHER_FALLBACK_URL = + "http://grapheneos.online/generate_204"; + + // imported defaults from AOSP NetworkStack + private static final String STANDARD_HTTPS_URL = + "https://www.google.com/generate_204"; + private static final String STANDARD_HTTP_URL = + "http://connectivitycheck.gstatic.com/generate_204"; + private static final String STANDARD_FALLBACK_URL = + "http://www.google.com/gen_204"; + private static final String STANDARD_OTHER_FALLBACK_URLS = + "http://play.googleapis.com/generate_204"; + + private static final int GRAPHENEOS_CAPTIVE_PORTAL_HTTP_URL_INTVAL = 0; + private static final int STANDARD_CAPTIVE_PORTAL_HTTP_URL_INTVAL = 1; + private static final int DISABLED_CAPTIVE_PORTAL_INTVAL = 2; + + private static final String KEY_CONNECTIVITY_CHECK_SETTINGS = + "connectivity_check_settings"; + + private ListPreference mConnectivityPreference; + + public ConnectivityCheckPreferenceController(Context context) { + super(context, KEY_CONNECTIVITY_CHECK_SETTINGS); + } + + @Override + public int getAvailabilityStatus() { + if (isDisabledByAdmin()) { + return BasePreferenceController.DISABLED_FOR_USER; + } + return BasePreferenceController.AVAILABLE; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + ListPreference captiveList = new ListPreference(screen.getContext()); + captiveList.setKey(KEY_CONNECTIVITY_CHECK_SETTINGS); + captiveList.setOrder(30); + captiveList.setIcon(R.drawable.ic_settings_language); + captiveList.setTitle(R.string.connectivity_check_title); + captiveList.setSummary(R.string.connectivity_check_summary); + captiveList.setEntries(R.array.connectivity_check_entries); + captiveList.setEntryValues(R.array.connectivity_check_values); + + if (mConnectivityPreference == null) { + screen.addPreference(captiveList); + mConnectivityPreference = captiveList; + } + super.displayPreference(screen); + updatePreferenceState(); + } + + @Override + public String getPreferenceKey() { + return KEY_CONNECTIVITY_CHECK_SETTINGS; + } + + private void updatePreferenceState() { + if (Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.CAPTIVE_PORTAL_MODE, Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT) + == Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE) { + mConnectivityPreference.setValueIndex(DISABLED_CAPTIVE_PORTAL_INTVAL); + return; + } + + String pref = Settings.Global.getString( + mContext.getContentResolver(), Settings.Global.CAPTIVE_PORTAL_HTTP_URL); + if (STANDARD_HTTP_URL.equals(pref)) { + mConnectivityPreference.setValueIndex( + STANDARD_CAPTIVE_PORTAL_HTTP_URL_INTVAL); + } else { + mConnectivityPreference.setValueIndex( + GRAPHENEOS_CAPTIVE_PORTAL_HTTP_URL_INTVAL); + } + } + + @Override + public void onResume() { + updatePreferenceState(); + if (mConnectivityPreference != null) { + setCaptivePortalURLs( + mContext.getContentResolver(), + Integer.parseInt(mConnectivityPreference.getValue())); + } + } + + private void setCaptivePortalURLs(ContentResolver cr, int mode) { + switch (mode) { + case STANDARD_CAPTIVE_PORTAL_HTTP_URL_INTVAL: + Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTP_URL, + STANDARD_HTTP_URL); + Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL, + STANDARD_HTTPS_URL); + Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL, + STANDARD_FALLBACK_URL); + Settings.Global.putString( + cr, Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS, + STANDARD_OTHER_FALLBACK_URLS); + Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE, + Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT); + break; + case GRAPHENEOS_CAPTIVE_PORTAL_HTTP_URL_INTVAL: + Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTP_URL, + GRAPHENEOS_CAPTIVE_PORTAL_HTTP_URL); + Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL, + GRAPHENEOS_CAPTIVE_PORTAL_HTTPS_URL); + Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL, + GRAPHENEOS_CAPTIVE_PORTAL_FALLBACK_URL); + Settings.Global.putString( + cr, Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS, + GRAPHENEOS_CAPTIVE_PORTAL_OTHER_FALLBACK_URL); + Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE, + Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT); + break; + default: + // GrapheneOS URLs as placeholder + Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTP_URL, + GRAPHENEOS_CAPTIVE_PORTAL_HTTP_URL); + Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL, + GRAPHENEOS_CAPTIVE_PORTAL_HTTPS_URL); + Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL, + GRAPHENEOS_CAPTIVE_PORTAL_FALLBACK_URL); + Settings.Global.putString( + cr, Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS, + GRAPHENEOS_CAPTIVE_PORTAL_OTHER_FALLBACK_URL); + Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE, + Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE); + } + } + + @Override + public boolean onPreferenceChange(Preference preference, Object value) { + final String key = preference.getKey(); + if (KEY_CONNECTIVITY_CHECK_SETTINGS.equals(key)) { + setCaptivePortalURLs(mContext.getContentResolver(), + Integer.parseInt((String)value)); + return true; + } else { + return false; + } + } + + private EnforcedAdmin getEnforcedAdmin() { + return RestrictedLockUtilsInternal.checkIfRestrictionEnforced( + mContext, UserManager.DISALLOW_CONFIG_PRIVATE_DNS, + UserHandle.myUserId()); + } + + private boolean isDisabledByAdmin() { return getEnforcedAdmin() != null; } +} diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java index 0cd24dc2a28..31295e9f832 100644 --- a/src/com/android/settings/network/NetworkDashboardFragment.java +++ b/src/com/android/settings/network/NetworkDashboardFragment.java @@ -121,6 +121,9 @@ private static List buildPreferenceControllers(Con } controllers.add(privateDnsPreferenceController); controllers.add(new NetworkProviderCallsSmsController(context, lifecycle)); + ConnectivityCheckPreferenceController connectivityCheck = + new ConnectivityCheckPreferenceController(context); + controllers.add(connectivityCheck); return controllers; } From 7120db7686fa8e39280fcd55b1e317b1dbe9f48b Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Thu, 17 Nov 2016 07:48:17 -0500 Subject: [PATCH 031/100] remove information referencing Google Play --- res/values/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index e880c769f92..431c8eb8856 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4211,9 +4211,9 @@ Erase all data (factory reset) - "This will erase all data from your tablet\u2019s internal storage, including:\n\n
  • Your Google Account
  • \n
  • System and app data and settings
  • \n
  • Downloaded apps
  • "
    + "This will erase all data from your tablet\u2019s internal storage, including:\n\n
  • System and app data and settings
  • \n
  • Downloaded apps
  • "
    - "This will erase all data from your phone\u2019s internal storage, including:\n\n
  • Your Google Account
  • \n
  • System and app data and settings
  • \n
  • Downloaded apps
  • "
    + "This will erase all data from your phone\u2019s internal storage, including:\n\n
  • System and app data and settings
  • \n
  • Downloaded apps
  • "
    "\n\nYou are currently signed into the following accounts:\n" From 704e0cd5d2c9baca7a1f6141a3d9b351a6909972 Mon Sep 17 00:00:00 2001 From: Danny Lin Date: Wed, 7 Jul 2021 03:02:05 -0700 Subject: [PATCH 032/100] Add preference for increased touch sensitivity (glove mode) This preference controls the glove mode feature on Pixel devices for increased touch sensitivity without requiring a custom HAL or other device-side code. This is done by using the debug.touch_sensitivity_mode system property, which Settings has permission to change. The user-visible value is persisted in Settings.Secure, while the property is persisted in persist.vendor.touch_sensitivity_mode. Requires frameworks/base commit: "Add a config to state whether a device supports increased touch sensitivity." Requires device/google/* commit: "Express support for increased touch sensitivity." Closes: #1 Co-authored-by: Diab Neiroukh Change-Id: I86af721fde33226d314d8a44525f310828299a72 --- res/values/strings.xml | 4 ++ res/xml/display_settings.xml | 6 ++ .../TouchSensitivityPreferenceController.java | 61 +++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100755 src/com/android/settings/display/TouchSensitivityPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 431c8eb8856..50980589106 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3273,6 +3273,10 @@ Camera access is required for Face Detection. Tap to manage permissions for Device Personalization Services Manage permissions + + Increase touch sensitivity + + Improves touch when using screen protectors Night Light diff --git a/res/xml/display_settings.xml b/res/xml/display_settings.xml index ad5236ecbd3..2a10a60ea0d 100644 --- a/res/xml/display_settings.xml +++ b/res/xml/display_settings.xml @@ -137,6 +137,12 @@ android:summary="@string/peak_refresh_rate_summary" settings:controller="com.android.settings.display.PeakRefreshRatePreferenceController"/> + + Date: Fri, 21 Jan 2022 22:05:44 +0200 Subject: [PATCH 033/100] add link to Sandboxed Google Play settings add Sandboxed Google Play link for the work profile The link is now dynamic and becomes hidden if GMS Core is uninstalled or disabled. --- res/values/strings.xml | 3 + res/xml/apps.xml | 13 ++++ .../applications/GmsCompatAppController.java | 65 +++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 src/com/android/settings/applications/GmsCompatAppController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 50980589106..00522974107 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14518,4 +14518,7 @@ Allow fingerprints to unlock the screen lock. If this is disabled, fingerprints can still be used in apps. Internet connectivity check HTTP endpoints to use for performing internet connectivity checks. + + Sandboxed Google Play + Sandboxed Google Play (work profile) diff --git a/res/xml/apps.xml b/res/xml/apps.xml index 4dc7c4dc026..686127907ec 100644 --- a/res/xml/apps.xml +++ b/res/xml/apps.xml @@ -95,4 +95,17 @@ android:order="20" settings:controller="com.android.settings.applications.SpecialAppAccessPreferenceController"/> + + + + diff --git a/src/com/android/settings/applications/GmsCompatAppController.java b/src/com/android/settings/applications/GmsCompatAppController.java new file mode 100644 index 00000000000..ff8232d3601 --- /dev/null +++ b/src/com/android/settings/applications/GmsCompatAppController.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2022 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.applications; + +import android.app.compat.gms.GmsCompat; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.UserHandle; +import android.text.TextUtils; + +import androidx.preference.Preference; + +import com.android.internal.gmscompat.GmsCompatApp; +import com.android.internal.gmscompat.GmsInfo; +import com.android.settings.core.BasePreferenceController; + +public class GmsCompatAppController extends BasePreferenceController { + private final Context context; + + public GmsCompatAppController(Context context, String key) { + super(context, key); + this.context = context; + } + + @Override + public int getAvailabilityStatus() { + UserHandle workProfile = getWorkProfileUser(); + int userId = workProfile != null ? + workProfile.getIdentifier() : + UserHandle.myUserId(); + + return GmsCompat.isGmsApp(GmsInfo.PACKAGE_GMS_CORE, userId) ? + AVAILABLE : DISABLED_FOR_USER; + } + + @Override + public boolean handlePreferenceTreeClick(Preference preference) { + if (!TextUtils.equals(preference.getKey(), getPreferenceKey())) { + return false; + } + Intent intent = new Intent(GmsCompatApp.PKG_NAME + ".SETTINGS_LINK"); + intent.setPackage(GmsCompatApp.PKG_NAME); + + UserHandle workProfile = getWorkProfileUser(); + if (workProfile != null) { + context.startActivityAsUser(intent, workProfile); + } else { + context.startActivity(intent); + } + return true; + } +} From 4d3a03ccb20ec220c1ca760d74ccf4b531fb5787 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Thu, 3 Feb 2022 16:49:25 +0200 Subject: [PATCH 034/100] do not allow disabling GmsCompat app Apps will break if it's disabled, handling this case in code increases complexity unnecessarily. --- .../applications/appinfo/AppButtonsPreferenceController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java index 51ae93459f7..232e424083d 100644 --- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java @@ -589,6 +589,7 @@ boolean handleDisableable() { if (mHomePackages.contains(mAppEntry.info.packageName) || mAppEntry.info.packageName.equals("com.android.inputmethod.latin") || mAppEntry.info.packageName.equals("app.vanadium.webview") + || mAppEntry.info.packageName.equals("app.grapheneos.gmscompat") || isSystemPackage(mActivity.getResources(), mPm, mPackageInfo)) { // Disable button for core system applications. mButtonsPref.setButton2Text(R.string.disable_text) From 3b555004dd3234e840207ec3dfe34f3630358119 Mon Sep 17 00:00:00 2001 From: flawedworld Date: Sat, 5 Feb 2022 17:42:07 +0000 Subject: [PATCH 035/100] add GrapheneOS icon --- AndroidManifest.xml | 3 ++- res/drawable/ic_launcher_foreground.xml | 30 +++++++++++++++++++++++++ res/mipmap-anydpi/ic_launcher.xml | 5 +++++ res/mipmap-anydpi/ic_launcher_round.xml | 5 +++++ res/values/ic_launcher_background.xml | 4 ++++ 5 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 res/drawable/ic_launcher_foreground.xml create mode 100644 res/mipmap-anydpi/ic_launcher.xml create mode 100644 res/mipmap-anydpi/ic_launcher_round.xml create mode 100644 res/values/ic_launcher_background.xml diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 6d2c636ccf7..1f2e4aba027 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -123,7 +123,8 @@ + + + + + diff --git a/res/mipmap-anydpi/ic_launcher.xml b/res/mipmap-anydpi/ic_launcher.xml new file mode 100644 index 00000000000..a8a8fa5518f --- /dev/null +++ b/res/mipmap-anydpi/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/res/mipmap-anydpi/ic_launcher_round.xml b/res/mipmap-anydpi/ic_launcher_round.xml new file mode 100644 index 00000000000..a8a8fa5518f --- /dev/null +++ b/res/mipmap-anydpi/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/res/values/ic_launcher_background.xml b/res/values/ic_launcher_background.xml new file mode 100644 index 00000000000..f42ada656ee --- /dev/null +++ b/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + From b39709fca0e44d03a79a2835b6e09a2ca3f5dd72 Mon Sep 17 00:00:00 2001 From: flawedworld Date: Sat, 5 Mar 2022 17:37:47 +0000 Subject: [PATCH 036/100] Show Hardware SKU in About Phone --- res/values/strings.xml | 2 + res/xml/hardware_info.xml | 9 ++++ .../HardwareSkuPreferenceController.java | 48 +++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 src/com/android/settings/deviceinfo/hardwareinfo/HardwareSkuPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 00522974107..832b55bae30 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3593,6 +3593,8 @@ Status of the battery, network, and other information Phone number, signal, etc. + + Hardware SKU Storage diff --git a/res/xml/hardware_info.xml b/res/xml/hardware_info.xml index 641f707a65e..8656c5ba830 100644 --- a/res/xml/hardware_info.xml +++ b/res/xml/hardware_info.xml @@ -48,4 +48,13 @@ settings:controller="com.android.settings.deviceinfo.hardwareinfo.HardwareRevisionPreferenceController" settings:enableCopying="true"/> + + + diff --git a/src/com/android/settings/deviceinfo/hardwareinfo/HardwareSkuPreferenceController.java b/src/com/android/settings/deviceinfo/hardwareinfo/HardwareSkuPreferenceController.java new file mode 100644 index 00000000000..4be09710e8c --- /dev/null +++ b/src/com/android/settings/deviceinfo/hardwareinfo/HardwareSkuPreferenceController.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2019 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.deviceinfo.hardwareinfo; + +import android.content.Context; +import android.os.SystemProperties; +import android.text.TextUtils; + +import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; +import com.android.settings.slices.Sliceable; + +public class HardwareSkuPreferenceController extends BasePreferenceController { + + public HardwareSkuPreferenceController(Context context, String preferenceKey) { + super(context, preferenceKey); + } + + @Override + public int getAvailabilityStatus() { + return mContext.getResources().getBoolean(R.bool.config_show_device_model) && + !TextUtils.isEmpty(getSummary()) ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + } + + @Override + public boolean useDynamicSliceSummary() { + return true; + } + + @Override + public CharSequence getSummary() { + return SystemProperties.get("ro.boot.hardware.sku"); + } +} From 3cd154e9b54a0461aef8d7c4a1a3e287fe6fd4b9 Mon Sep 17 00:00:00 2001 From: June Date: Sat, 19 Mar 2022 15:19:57 -0400 Subject: [PATCH 037/100] Make PIN scrambling a SwitchPreference (toggle) Signed-off-by: June --- res/values/arrays.xml | 10 ---------- res/xml/security_dashboard_settings.xml | 6 ++---- .../security/PinScramblePreferenceController.java | 12 ++++++------ 3 files changed, 8 insertions(+), 20 deletions(-) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 262252891ec..8258db547d2 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -224,16 +224,6 @@ 30 minutes
    - - Scramble PIN - No PIN scrambling - - - - true - false - - Off diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index 8a391dc44ec..4f672b4a706 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -77,13 +77,11 @@ android:summary="@string/native_debug_summary" android:persistent="false" /> - + android:persistent="false" /> Date: Sat, 19 Mar 2022 12:01:00 +0200 Subject: [PATCH 038/100] add toggle for the privileged eSIM management --- res/values/strings.xml | 3 + res/xml/network_provider_internet.xml | 9 ++ .../network/EuiccCompatController.java | 84 +++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 src/com/android/settings/network/EuiccCompatController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 832b55bae30..a630531ff79 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14523,4 +14523,7 @@ Sandboxed Google Play Sandboxed Google Play (work profile) + + Enable privileged eSIM management + Requires Sandboxed Google Play installation diff --git a/res/xml/network_provider_internet.xml b/res/xml/network_provider_internet.xml index 981afb3b3e6..d4874831b3e 100644 --- a/res/xml/network_provider_internet.xml +++ b/res/xml/network_provider_internet.xml @@ -54,6 +54,15 @@ settings:allowDividerAbove="true" settings:useAdminDisabledSummary="true" /> + + directive + return DISABLED_FOR_USER; + } + + return checkDependencies() ? + AVAILABLE : + DISABLED_DEPENDENT_SETTING; + } + + @Override + public boolean setChecked(boolean isChecked) { + int state = isChecked && checkDependencies() ? + COMPONENT_ENABLED_STATE_ENABLED : + COMPONENT_ENABLED_STATE_DISABLED; + try { + for (String pkg : GmsInfo.EUICC_PACKAGES) { + packageManager.setApplicationEnabledSetting(pkg, state, 0); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + private boolean checkDependencies() { + for (String pkg : GmsInfo.DEPENDENCIES_OF_EUICC_PACKAGES) { + // all dependencies are a part of the GMS suite + if (GmsCompat.isGmsApp(pkg, UserHandle.USER_SYSTEM)) { + continue; + } + return false; + } + return true; + } + + @Override + public int getSliceHighlightMenuRes() { + return R.string.menu_key_network; + } +} From 5f426befb129f95da8e2164714b8db3010176627 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sat, 26 Mar 2022 20:35:37 -0400 Subject: [PATCH 039/100] add exec spawning toggle --- res/values/strings.xml | 2 + res/xml/security_dashboard_settings.xml | 6 + .../ExecSpawnPreferenceController.java | 106 ++++++++++++++++++ .../settings/security/SecuritySettings.java | 1 + 4 files changed, 115 insertions(+) create mode 100644 src/com/android/settings/security/ExecSpawnPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index a630531ff79..c04a086c9f1 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14514,6 +14514,8 @@ Control support for USB peripherals such as input (mice, keyboards, joysticks) and storage devices. Screen lock camera access Allow camera access when the device is locked + Enable secure app spawning + Launch apps in a more secure way than Android which takes slightly longer and increases memory usage by app processes. Enable native code debugging Generate useful logs / bug reports from crashes and permit debugging native code. Allow fingerprint unlocking diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index 4f672b4a706..16f53f0433b 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -71,6 +71,12 @@ android:entries="@array/deny_new_usb_entries" android:entryValues="@array/deny_new_usb_values" /> + + buildPreferenceControllers(Con securityPreferenceControllers.add(new AutoRebootPreferenceController(context)); securityPreferenceControllers.add(new DenyNewUsbPreferenceController(context)); securityPreferenceControllers.add(new KeyguardCameraPreferenceController(context)); + securityPreferenceControllers.add(new ExecSpawnPreferenceController(context)); securityPreferenceControllers.add(new NativeDebugPreferenceController(context)); controllers.add(new PreferenceCategoryController(context, SECURITY_CATEGORY) .setChildren(securityPreferenceControllers)); From 6a01dc731ea1beaeb0bb259404a7f0b6cb581868 Mon Sep 17 00:00:00 2001 From: flawedworld Date: Mon, 28 Mar 2022 17:55:57 +0100 Subject: [PATCH 040/100] attestation key provisioning server setting --- res/values/arrays.xml | 10 ++ res/values/strings.xml | 3 + ...ttestProvisioningPreferenceController.java | 133 ++++++++++++++++++ .../network/NetworkDashboardFragment.java | 3 + 4 files changed, 149 insertions(+) create mode 100644 src/com/android/settings/network/AttestProvisioningPreferenceController.java diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 8258db547d2..98a7b0a38e0 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -283,6 +283,16 @@ 2 + + GrapheneOS proxy + Standard (Google) + + + + 0 + 1 + + diff --git a/res/values/strings.xml b/res/values/strings.xml index c04a086c9f1..ebcd62915b2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14523,6 +14523,9 @@ Internet connectivity check HTTP endpoints to use for performing internet connectivity checks. + Attestation key provisioning server + Server used for provisioning hardware-based attestation keys + Sandboxed Google Play Sandboxed Google Play (work profile) diff --git a/src/com/android/settings/network/AttestProvisioningPreferenceController.java b/src/com/android/settings/network/AttestProvisioningPreferenceController.java new file mode 100644 index 00000000000..e73bb3d9d2a --- /dev/null +++ b/src/com/android/settings/network/AttestProvisioningPreferenceController.java @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2022 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.network; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.res.Resources; +import android.database.ContentObserver; +import android.net.LinkProperties; +import android.net.Network; +import android.os.Handler; +import android.os.Looper; +import android.os.UserHandle; +import android.os.UserManager; +import android.os.Process; +import android.provider.Settings; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import com.android.internal.util.ArrayUtils; +import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; +import com.android.settingslib.RestrictedLockUtilsInternal; +import com.android.settingslib.core.lifecycle.events.OnResume; + +public class AttestProvisioningPreferenceController + extends BasePreferenceController + implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener, + OnResume { + + private static final int GRAPHENEOS_ATTEST_SERVER_INTVAL = 0; + private static final int STANDARD_ATTEST_SERVER_INTVAL = 1; + + private static final String KEY_ATTEST_SERVER_SETTINGS = + "attest_server_settings"; + + private ListPreference mServerPreference; + + public AttestProvisioningPreferenceController(Context context) { + super(context, KEY_ATTEST_SERVER_SETTINGS); + } + + @Override + public int getAvailabilityStatus() { + if (!Process.myUserHandle().isSystem()) { + return BasePreferenceController.DISABLED_FOR_USER; + } + return BasePreferenceController.AVAILABLE; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + ListPreference attestServerList = new ListPreference(screen.getContext()); + attestServerList.setKey(KEY_ATTEST_SERVER_SETTINGS); + attestServerList.setOrder(35); + attestServerList.setIcon(R.drawable.ic_lock_closed); + attestServerList.setTitle(R.string.attest_provisioning_title); + attestServerList.setSummary(R.string.attest_provisioning_summary); + attestServerList.setEntries(R.array.attest_provisioning_entries); + attestServerList.setEntryValues(R.array.attest_provisioning_values); + + if (mServerPreference == null) { + screen.addPreference(attestServerList); + mServerPreference = attestServerList; + } + super.displayPreference(screen); + updatePreferenceState(); + } + + @Override + public String getPreferenceKey() { + return KEY_ATTEST_SERVER_SETTINGS; + } + + private void updatePreferenceState() { + int pref = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.ATTEST_REMOTE_PROVISIONER_SERVER, GRAPHENEOS_ATTEST_SERVER_INTVAL); + if (GRAPHENEOS_ATTEST_SERVER_INTVAL == pref) { + mServerPreference.setValueIndex(GRAPHENEOS_ATTEST_SERVER_INTVAL); + } else { + mServerPreference.setValueIndex(STANDARD_ATTEST_SERVER_INTVAL); + } + } + + @Override + public void onResume() { + updatePreferenceState(); + if (mServerPreference != null) { + setAttestURL(mContext.getContentResolver(), Integer.parseInt(mServerPreference.getValue())); + } + } + + private void setAttestURL(ContentResolver cr, int mode) { + switch (mode) { + case STANDARD_ATTEST_SERVER_INTVAL: + Settings.Global.putInt(cr, Settings.Global.ATTEST_REMOTE_PROVISIONER_SERVER, STANDARD_ATTEST_SERVER_INTVAL); + break; + case GRAPHENEOS_ATTEST_SERVER_INTVAL: + Settings.Global.putInt(cr, Settings.Global.ATTEST_REMOTE_PROVISIONER_SERVER, GRAPHENEOS_ATTEST_SERVER_INTVAL); + break; + default: + // GrapheneOS URL as placeholder + Settings.Global.putInt(cr, Settings.Global.ATTEST_REMOTE_PROVISIONER_SERVER, GRAPHENEOS_ATTEST_SERVER_INTVAL); + } + } + + @Override + public boolean onPreferenceChange(Preference preference, Object value) { + final String key = preference.getKey(); + if (KEY_ATTEST_SERVER_SETTINGS.equals(key)) { + setAttestURL(mContext.getContentResolver(), Integer.parseInt((String)value)); + return true; + } else { + return false; + } + } + +} diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java index 31295e9f832..61c387557fe 100644 --- a/src/com/android/settings/network/NetworkDashboardFragment.java +++ b/src/com/android/settings/network/NetworkDashboardFragment.java @@ -124,6 +124,9 @@ private static List buildPreferenceControllers(Con ConnectivityCheckPreferenceController connectivityCheck = new ConnectivityCheckPreferenceController(context); controllers.add(connectivityCheck); + AttestProvisioningPreferenceController attestProvisioning = + new AttestProvisioningPreferenceController(context); + controllers.add(attestProvisioning); return controllers; } From 180ce930104f8fa38758653db4f57a9d3882879c Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Tue, 3 Mar 2020 18:45:32 +0530 Subject: [PATCH 041/100] Remove empty Security status header Change-Id: Ia09dfd67bcfb8334439bfb9dab419235b182e297 --- res/xml/security_dashboard_settings.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index 16f53f0433b..a1e7e3bc9c0 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -21,12 +21,6 @@ android:key="security_dashboard_page" android:title="@string/security_settings_title"> - - - From 17832c1426e2cff2ac7a7218140d715a8aabfcef Mon Sep 17 00:00:00 2001 From: Roman Royer Date: Wed, 4 May 2016 19:04:36 -0700 Subject: [PATCH 042/100] Allow sorting Applications by size Allow sorting applications by size in Settings->Apps just like in Settings->Storage/USB->Apps Change-Id: I9e022162110e1feff20f257992086e66735e0f5e --- .../applications/manageapplications/ManageApplications.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java index d335324a339..ea3c568ee2f 100644 --- a/src/com/android/settings/applications/manageapplications/ManageApplications.java +++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java @@ -767,9 +767,11 @@ void updateOptionsMenu() { } mOptionsMenu.findItem(R.id.advanced).setVisible(false); - mOptionsMenu.findItem(R.id.sort_order_alpha).setVisible(mListType == LIST_TYPE_STORAGE + mOptionsMenu.findItem(R.id.sort_order_alpha).setVisible( + (mListType == LIST_TYPE_STORAGE || mListType == LIST_TYPE_MAIN) && mSortOrder != R.id.sort_order_alpha); - mOptionsMenu.findItem(R.id.sort_order_size).setVisible(mListType == LIST_TYPE_STORAGE + mOptionsMenu.findItem(R.id.sort_order_size).setVisible( + (mListType == LIST_TYPE_STORAGE || mListType == LIST_TYPE_MAIN) && mSortOrder != R.id.sort_order_size); mOptionsMenu.findItem(R.id.show_system).setVisible(!mShowSystem From 59f3a78febc29612883b4429ed69aa0021baf0af Mon Sep 17 00:00:00 2001 From: flawedworld Date: Sun, 17 Apr 2022 14:39:53 +0100 Subject: [PATCH 043/100] Add toggle for choosing PSDS server --- res/values/arrays.xml | 10 ++ res/values/strings.xml | 3 + .../network/NetworkDashboardFragment.java | 3 + .../PsdsServerPreferenceController.java | 137 ++++++++++++++++++ 4 files changed, 153 insertions(+) create mode 100644 src/com/android/settings/network/PsdsServerPreferenceController.java diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 98a7b0a38e0..77607fb3c1e 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -293,6 +293,16 @@ 1 + + GrapheneOS proxy + Standard (Google) + + + + 0 + 1 + + diff --git a/res/values/strings.xml b/res/values/strings.xml index ebcd62915b2..46214fd3ca9 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14526,6 +14526,9 @@ Attestation key provisioning server Server used for provisioning hardware-based attestation keys + PSDS server + Server used for providing satellite information to assist location + Sandboxed Google Play Sandboxed Google Play (work profile) diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java index 61c387557fe..32d762198e4 100644 --- a/src/com/android/settings/network/NetworkDashboardFragment.java +++ b/src/com/android/settings/network/NetworkDashboardFragment.java @@ -127,6 +127,9 @@ private static List buildPreferenceControllers(Con AttestProvisioningPreferenceController attestProvisioning = new AttestProvisioningPreferenceController(context); controllers.add(attestProvisioning); + PsdsServerPreferenceController psdsServer = + new PsdsServerPreferenceController(context); + controllers.add(psdsServer); return controllers; } diff --git a/src/com/android/settings/network/PsdsServerPreferenceController.java b/src/com/android/settings/network/PsdsServerPreferenceController.java new file mode 100644 index 00000000000..645ce41d1f5 --- /dev/null +++ b/src/com/android/settings/network/PsdsServerPreferenceController.java @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2022 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.network; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.res.Resources; +import android.database.ContentObserver; +import android.net.LinkProperties; +import android.net.Network; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.os.UserHandle; +import android.os.UserManager; +import android.os.Process; +import android.provider.Settings; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import com.android.internal.util.ArrayUtils; +import com.android.settings.R; +import com.android.settings.core.BasePreferenceController; +import com.android.settings.core.PreferenceControllerMixin; +import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; +import com.android.settingslib.RestrictedLockUtilsInternal; +import com.android.settingslib.core.lifecycle.events.OnResume; + +public class PsdsServerPreferenceController + extends BasePreferenceController + implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener, + OnResume { + + private static final int GRAPHENEOS_PSDS_SERVER_INTVAL = 0; + private static final int STANDARD_PSDS_SERVER_INTVAL = 1; + + private static final String KEY_PSDS_SERVER_SETTINGS = + "psds_server_settings"; + + private ListPreference mServerPreference; + + public PsdsServerPreferenceController(Context context) { + super(context, KEY_PSDS_SERVER_SETTINGS); + } + + @Override + public int getAvailabilityStatus() { + if (!Process.myUserHandle().isSystem()) { + return BasePreferenceController.DISABLED_FOR_USER; + } + String device = android.os.Build.HARDWARE; + if (!device.equals("oriole") && !device.equals("raven") && !device.equals("bluejay") && !device.equals("panther") && !device.equals("cheetah")) { + return BasePreferenceController.DISABLED_FOR_USER; + } + return BasePreferenceController.AVAILABLE; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + ListPreference psdsServerList = new ListPreference(screen.getContext()); + psdsServerList.setKey(KEY_PSDS_SERVER_SETTINGS); + psdsServerList.setOrder(40); + psdsServerList.setTitle(R.string.psds_server_title); + psdsServerList.setSummary(R.string.psds_server_summary); + psdsServerList.setEntries(R.array.psds_server_entries); + psdsServerList.setEntryValues(R.array.psds_server_values); + + if (mServerPreference == null) { + screen.addPreference(psdsServerList); + mServerPreference = psdsServerList; + } + super.displayPreference(screen); + updatePreferenceState(); + } + + @Override + public String getPreferenceKey() { + return KEY_PSDS_SERVER_SETTINGS; + } + + private void updatePreferenceState() { + int pref = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.PSDS_SERVER, GRAPHENEOS_PSDS_SERVER_INTVAL); + if (GRAPHENEOS_PSDS_SERVER_INTVAL == pref) { + mServerPreference.setValueIndex(GRAPHENEOS_PSDS_SERVER_INTVAL); + } else { + mServerPreference.setValueIndex(STANDARD_PSDS_SERVER_INTVAL); + } + } + + @Override + public void onResume() { + updatePreferenceState(); + if (mServerPreference != null) { + setPsdsUrl(mContext.getContentResolver(), Integer.parseInt(mServerPreference.getValue())); + } + } + + private void setPsdsUrl(ContentResolver cr, int mode) { + switch (mode) { + case STANDARD_PSDS_SERVER_INTVAL: + Settings.Global.putInt(cr, Settings.Global.PSDS_SERVER, STANDARD_PSDS_SERVER_INTVAL); + break; + case GRAPHENEOS_PSDS_SERVER_INTVAL: + Settings.Global.putInt(cr, Settings.Global.PSDS_SERVER, GRAPHENEOS_PSDS_SERVER_INTVAL); + break; + default: + // GrapheneOS URL as placeholder + Settings.Global.putInt(cr, Settings.Global.PSDS_SERVER, GRAPHENEOS_PSDS_SERVER_INTVAL); + } + } + + @Override + public boolean onPreferenceChange(Preference preference, Object value) { + final String key = preference.getKey(); + if (KEY_PSDS_SERVER_SETTINGS.equals(key)) { + setPsdsUrl(mContext.getContentResolver(), Integer.parseInt((String)value)); + return true; + } else { + return false; + } + } + +} From 6a9b11db0e2efea2d8ffb9d22618cc9207d02540 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Sun, 17 Apr 2022 18:00:53 +0300 Subject: [PATCH 044/100] add an ability to disable non-system apps from the "App info" screen --- .../AppButtonsPreferenceController.java | 44 +++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java index 232e424083d..260e765bd43 100644 --- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java @@ -48,6 +48,7 @@ import androidx.fragment.app.Fragment; import androidx.preference.PreferenceScreen; +import com.android.internal.gmscompat.GmsCompatApp; import com.android.settings.R; import com.android.settings.SettingsActivity; import com.android.settings.Utils; @@ -208,6 +209,15 @@ public void onDestroy() { } private class UninstallAndDisableButtonListener implements View.OnClickListener { + private boolean mChangeEnabledStateOfUserApp; + + UninstallAndDisableButtonListener() { + this(false); + } + + UninstallAndDisableButtonListener(boolean changeEnabledStateOfUserApp) { + mChangeEnabledStateOfUserApp = changeEnabledStateOfUserApp; + } @Override public void onClick(View v) { @@ -239,8 +249,13 @@ public void onClick(View v) { mUserId); if (admin != null && !uninstallBlockedBySystem) { RestrictedLockUtils.sendShowAdminSupportDetailsIntent(mActivity, admin); - } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + } else if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0 || mChangeEnabledStateOfUserApp) { if (mAppEntry.info.enabled && !isDisabledUntilUsed()) { + if (mChangeEnabledStateOfUserApp) { + handleDialogClick(ButtonActionDialogFragment.DialogType.DISABLE); + return; + } + // If the system app has an update and this is the only user on the device, // then offer to downgrade the app, otherwise only offer to disable the // app for this user. @@ -488,6 +503,25 @@ void updateUninstallButton() { } mButtonsPref.setButton2Enabled(enabled); + + if (enabled && !isBundled) { + // "enabled" means "show uninstall button" in this context + int text; + int icon; + if (mAppEntry.info.enabled) { + text = R.string.disable_text; + icon = R.drawable.ic_settings_disable; + } else { + text = R.string.enable_text; + icon = R.drawable.ic_settings_enable; + } + mButtonsPref + .setButton4Text(text) + .setButton4Icon(icon) + .setButton4Visible(true) + .setButton4OnClickListener(new UninstallAndDisableButtonListener(true)) + ; + } } /** @@ -514,7 +548,9 @@ private void refreshAndFinishIfPossible(boolean removeTaskWhenFinishing) { @VisibleForTesting void updateForceStopButton() { - if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { + if (!mPackageInfo.applicationInfo.enabled) { + mButtonsPref.setButton3Visible(false); + } else if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { // User can't force stop device admin. Log.w(TAG, "User can't force stop device admin"); updateForceStopButtonInner(false /* enabled */); @@ -538,6 +574,7 @@ void updateForceStopButton() { @VisibleForTesting void updateForceStopButtonInner(boolean enabled) { + mButtonsPref.setButton3Visible(true); if (mAppsControlDisallowedBySystem) { mButtonsPref.setButton3Enabled(false); } else { @@ -552,6 +589,7 @@ void uninstallPkg(String packageName, boolean allUsers, boolean andDisable) { Uri packageUri = Uri.parse("package:" + packageName); Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageUri); uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, allUsers); + uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_SHOW_MORE_OPTIONS_BUTTON, false); mMetricsFeatureProvider.action( mActivity, SettingsEnums.ACTION_SETTINGS_UNINSTALL_APP); @@ -589,7 +627,7 @@ boolean handleDisableable() { if (mHomePackages.contains(mAppEntry.info.packageName) || mAppEntry.info.packageName.equals("com.android.inputmethod.latin") || mAppEntry.info.packageName.equals("app.vanadium.webview") - || mAppEntry.info.packageName.equals("app.grapheneos.gmscompat") + || mAppEntry.info.packageName.equals(GmsCompatApp.PKG_NAME) || isSystemPackage(mActivity.getResources(), mPm, mPackageInfo)) { // Disable button for core system applications. mButtonsPref.setButton2Text(R.string.disable_text) From e8e5672347da8ad760a4e12f90dc65f0375bc769 Mon Sep 17 00:00:00 2001 From: flawedworld Date: Fri, 6 May 2022 02:42:36 +0100 Subject: [PATCH 045/100] Fix Wi-Fi timeout string issue in Settings search --- res/values/strings.xml | 3 ++- .../android/settings/wifi/WifiTimeoutPreferenceController.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 46214fd3ca9..cd12c4468e7 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -50,7 +50,8 @@ Turn off Wi-Fi automatically - Wi-Fi will turn off after %1$s if no network connected + Automatically turn off Wi-Fi after a set amount of time. + Wi-Fi will turn off after %1$s if no network connected Disabled Never 15 seconds diff --git a/src/com/android/settings/wifi/WifiTimeoutPreferenceController.java b/src/com/android/settings/wifi/WifiTimeoutPreferenceController.java index 7116c905190..dfd08782366 100644 --- a/src/com/android/settings/wifi/WifiTimeoutPreferenceController.java +++ b/src/com/android/settings/wifi/WifiTimeoutPreferenceController.java @@ -106,7 +106,7 @@ private void updateTimeoutPreferenceDescription(ListPreference preference, String summary = ""; if (timeoutDescription != null) { if (currentTimeout != 0) - summary = mContext.getString(R.string.wifi_timeout_summary, timeoutDescription); + summary = mContext.getString(R.string.wifi_timeout_summary1, timeoutDescription); else summary = mContext.getString(R.string.wifi_timeout_summary2); } From 9ac51da94f0864bad640ddab7c604c15787a98db Mon Sep 17 00:00:00 2001 From: empratyush Date: Wed, 4 May 2022 20:54:16 +0530 Subject: [PATCH 046/100] add missing face unlock strings for English We would need some kind of automation to do this for all languages. --- res/layout/face_enroll_introduction.xml | 4 ++-- res/values/strings.xml | 12 ++++++++++++ .../biometrics/face/FaceEnrollIntroduction.java | 12 ++++++------ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/res/layout/face_enroll_introduction.xml b/res/layout/face_enroll_introduction.xml index 8b0352928ca..ea57f4acbc9 100644 --- a/res/layout/face_enroll_introduction.xml +++ b/res/layout/face_enroll_introduction.xml @@ -64,7 +64,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" style="@style/BiometricEnrollIntroTitle" - android:text="@string/security_settings_face_enroll_introduction_info_title" /> + android:text="@string/security_settings_face_enroll_introduction_info_title_en" /> + android:text="@string/security_settings_face_enroll_introduction_how_title_en" /> Use your face to unlock your phone, authorize purchases, or sign in to apps + + Keep in mind + How it works + + Glasses or lightly tinted sunglasses are OK. + Looking at the phone can unlock it even when you don’t intend to. Your phone can also be unlocked by someone who looks a lot like you, like an identical sibling, or if someone holds it up to your face. + Using a face to unlock the phone may be less secure than a strong pattern or PIN. + Face Unlock can require your eyes to be open to unlock the phone or verify it’s you. You can turn this option on at any time in Settings. + Face Unlock creates a unique model of your face to verify it’s you. To create this face model during setup, you will take images of your face from different angles.\n\nWhen you use Face Unlock, images are used to update your face model. Images used to create your face model are not stored, but the face model is stored securely on your phone and never leaves the phone. All processing occurs securely on your phone. + You’re in control + You can delete your face model or turn off Face Unlock at any time in Settings. Face models are stored on the phone until you delete them.\n\nLearn more at g.co/pixel/faceunlock. + diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java index ed74d2a550d..431b788ad73 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java @@ -202,32 +202,32 @@ protected boolean generateChallengeOnCreate() { @StringRes protected int getInfoMessageGlasses() { - return R.string.security_settings_face_enroll_introduction_info_glasses; + return R.string.security_settings_face_enroll_introduction_info_glasses_en; } @StringRes protected int getInfoMessageLooking() { - return R.string.security_settings_face_enroll_introduction_info_looking; + return R.string.security_settings_face_enroll_introduction_info_looking_en; } @StringRes protected int getInfoMessageRequireEyes() { - return R.string.security_settings_face_enroll_introduction_info_gaze; + return R.string.security_settings_face_enroll_introduction_info_gaze_en; } @StringRes protected int getHowMessage() { - return R.string.security_settings_face_enroll_introduction_how_message; + return R.string.security_settings_face_enroll_introduction_how_message_en; } @StringRes protected int getInControlTitle() { - return R.string.security_settings_face_enroll_introduction_control_title; + return R.string.security_settings_face_enroll_introduction_control_title_en; } @StringRes protected int getInControlMessage() { - return R.string.security_settings_face_enroll_introduction_control_message; + return R.string.security_settings_face_enroll_introduction_control_message_en; } @StringRes From 7a66a9b4821fe9036bac6ffdb8dae93afd7d9372 Mon Sep 17 00:00:00 2001 From: June Date: Mon, 2 May 2022 02:09:48 -0400 Subject: [PATCH 047/100] Add toggle for screenshot timestamp EXIF metadata Signed-off-by: June --- res/values/strings.xml | 3 + res/xml/privacy_dashboard_settings.xml | 8 +++ ...shotTimestampExifPreferenceController.java | 63 +++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 src/com/android/settings/privacy/ScreenshotTimestampExifPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 63329fe7ef3..d2ccea08e77 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14547,4 +14547,7 @@ Enable privileged eSIM management Requires Sandboxed Google Play installation + + Save screenshot timestamp to EXIF + Enables adding a timestamp to screenshot EXIF metadata diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml index f8f916e916a..87b16cf09bf 100644 --- a/res/xml/privacy_dashboard_settings.xml +++ b/res/xml/privacy_dashboard_settings.xml @@ -75,6 +75,14 @@ android:summary="@string/mic_toggle_description" settings:controller="com.android.settings.privacy.MicToggleController"/> + + + Date: Tue, 17 May 2022 14:42:48 +0100 Subject: [PATCH 048/100] UserManager unknown source app installation restrictions --- res/values/strings.xml | 2 ++ res/xml/user_details_settings.xml | 4 +++ .../settings/users/UserDetailsSettings.java | 31 +++++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/res/values/strings.xml b/res/values/strings.xml index d2ccea08e77..528993ca612 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -8031,6 +8031,8 @@ Turn on phone calls & SMS Disallow installing apps + + Disallow installing apps from third party sources Delete user diff --git a/res/xml/user_details_settings.xml b/res/xml/user_details_settings.xml index d2766360a0a..d91afc51025 100644 --- a/res/xml/user_details_settings.xml +++ b/res/xml/user_details_settings.xml @@ -33,6 +33,10 @@ android:icon="@drawable/ic_settings_install" android:key="disallow_install_apps" android:title="@string/user_disallow_install_apps" /> + users = mUserManager.getUsers(true); + for (UserInfo user: users) { + if (user.isGuest()) { + UserHandle userHandle = UserHandle.of(user.id); + for (String key : mDefaultGuestRestrictions.keySet()) { + mUserManager.setUserRestriction( + key, mDefaultGuestRestrictions.getBoolean(key), userHandle); + } + } + } + } else { + UserHandle userHandle = UserHandle.of(mUserInfo.id); + mUserManager.setUserRestriction(UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, (Boolean) newValue, + userHandle); + } } return true; } @@ -301,6 +326,7 @@ void initialize(Context context, Bundle arguments) { mAppAndContentAccessPref = findPreference(KEY_APP_AND_CONTENT_ACCESS); mAppCopyingPref = findPreference(KEY_APP_COPYING); mInstallAppsPref = findPreference(KEY_DISALLOW_INSTALL_APPS); + mInstallAppsUnknownSourcesPref = findPreference(KEY_DISALLOW_INSTALL_APPS_UNKNOWN_SOURCES); mSwitchUserPref.setTitle( context.getString(com.android.settingslib.R.string.user_switch_to_user, @@ -320,6 +346,7 @@ void initialize(Context context, Bundle arguments) { removePreference(KEY_APP_AND_CONTENT_ACCESS); removePreference(KEY_APP_COPYING); removePreference(KEY_DISALLOW_INSTALL_APPS); + removePreference(KEY_DISALLOW_INSTALL_APPS_UNKNOWN_SOURCES); } else { if (!Utils.isVoiceCapable(context)) { // no telephony removePreference(KEY_ENABLE_TELEPHONY); @@ -354,6 +381,7 @@ void initialize(Context context, Bundle arguments) { removePreference(KEY_APP_COPYING); } removePreference(KEY_DISALLOW_INSTALL_APPS); + removePreference(KEY_DISALLOW_INSTALL_APPS_UNKNOWN_SOURCES); } else { mPhonePref.setChecked(!mUserManager.hasUserRestriction( UserManager.DISALLOW_OUTGOING_CALLS, new UserHandle(userId))); @@ -361,6 +389,8 @@ void initialize(Context context, Bundle arguments) { removePreference(KEY_APP_COPYING); mInstallAppsPref.setChecked(mUserManager.hasUserRestriction( UserManager.DISALLOW_INSTALL_APPS, new UserHandle(userId))); + mInstallAppsUnknownSourcesPref.setChecked(mUserManager.hasUserRestriction( + UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES, new UserHandle(userId))); } if (RestrictedLockUtilsInternal.hasBaseUserRestriction(context, UserManager.DISALLOW_REMOVE_USER, UserHandle.myUserId())) { @@ -372,6 +402,7 @@ void initialize(Context context, Bundle arguments) { mAppAndContentAccessPref.setOnPreferenceClickListener(this); mAppCopyingPref.setOnPreferenceClickListener(this); mInstallAppsPref.setOnPreferenceChangeListener(this); + mInstallAppsUnknownSourcesPref.setOnPreferenceChangeListener(this); } } From c443ceb178a5bd0fe30c3c79eef08d02bce3da34 Mon Sep 17 00:00:00 2001 From: empratyush Date: Tue, 21 Jun 2022 00:46:29 +0530 Subject: [PATCH 049/100] Reverse Wireless Charging UI --- res/values/strings.xml | 3 + res/xml/power_usage_summary.xml | 6 ++ .../BatterySharePreferenceController.java | 98 +++++++++++++++++++ 3 files changed, 107 insertions(+) create mode 100644 src/com/android/settings/display/BatterySharePreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 528993ca612..660987723ee 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14552,4 +14552,7 @@ Save screenshot timestamp to EXIF Enables adding a timestamp to screenshot EXIF metadata + + Charge other devices by placing them on the back of your phone + Battery share diff --git a/res/xml/power_usage_summary.xml b/res/xml/power_usage_summary.xml index 9e86bf52b3d..1d922e13edc 100644 --- a/res/xml/power_usage_summary.xml +++ b/res/xml/power_usage_summary.xml @@ -64,6 +64,12 @@ android:summary="@string/battery_percentage_description" settings:controller="com.android.settings.display.BatteryPercentagePreferenceController" /> + + update()); + } + }; + + + public BatterySharePreferenceController(Context context, String preferenceKey) { + super(context, preferenceKey); + mContext = context; + wirelessCharger = ReverseWirelessCharger.getInstance(); + } + + public boolean isPlugged(Context context) { + Intent intent = context.registerReceiver(null, + new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + return plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS; + } + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + update(); + } + + @Override + public String getPreferenceKey() { + return KEY_BATTERY_SHARE; + } + + private void update() { + if (mPreference == null) return; + boolean enabled = !isPlugged(mContext) && wirelessCharger.isRtxSupported(); + mPreference.setEnabled(enabled); + ((SwitchPreference) mPreference).setChecked(wirelessCharger.isRtxModeOn()); + } + + @Override + public int getAvailabilityStatus() { + return wirelessCharger.isRtxSupported() ? AVAILABLE : UNSUPPORTED_ON_DEVICE; + } + + @Override + public void updateState(Preference preference) { + update(); + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + wirelessCharger.setRtxMode((Boolean) newValue); + return true; + } + + @Override + public void onStart() { + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_BATTERY_CHANGED); + mContext.registerReceiver(mBroadcastReceiver, filter); + } + + @Override + public void onStop() { + mContext.unregisterReceiver(mBroadcastReceiver); + } +} From 85d3bb456cf66b71bef4cf4d25fd94da1b0609ab Mon Sep 17 00:00:00 2001 From: June Date: Wed, 16 Mar 2022 07:09:46 +0200 Subject: [PATCH 050/100] add a per-user setting for forwarding censored notifs Signed-off-by: June Co-authored-by: inthewaves Co-authored-by: June --- res/values/strings.xml | 2 + res/xml/user_settings.xml | 6 ++ ...ionsToCurrentUserPreferenceController.java | 60 +++++++++++++++++++ .../android/settings/users/UserSettings.java | 20 +++++++ 4 files changed, 88 insertions(+) create mode 100644 src/com/android/settings/users/SendCensoredNotificationsToCurrentUserPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 660987723ee..e037e7a0b22 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14537,6 +14537,8 @@ Allow fingerprints to unlock the screen lock. If this is disabled, fingerprints can still be used in apps. Internet connectivity check HTTP endpoints to use for performing internet connectivity checks. + Send notifications to current user + Your lock screen notifications will be forwarded to the current user if you are active in the background. Only the user\'s name, the app\'s name, and the time received will be shown. Attestation key provisioning server Server used for provisioning hardware-based attestation keys diff --git a/res/xml/user_settings.xml b/res/xml/user_settings.xml index c14bfbd52ca..188e99f244d 100644 --- a/res/xml/user_settings.xml +++ b/res/xml/user_settings.xml @@ -92,4 +92,10 @@ android:fragment="com.android.settings.users.TimeoutToDockUserSettings" settings:controller="com.android.settings.users.TimeoutToDockUserPreferenceController"/> + + diff --git a/src/com/android/settings/users/SendCensoredNotificationsToCurrentUserPreferenceController.java b/src/com/android/settings/users/SendCensoredNotificationsToCurrentUserPreferenceController.java new file mode 100644 index 00000000000..637d7bbb782 --- /dev/null +++ b/src/com/android/settings/users/SendCensoredNotificationsToCurrentUserPreferenceController.java @@ -0,0 +1,60 @@ +package com.android.settings.users; + +import android.content.Context; +import android.provider.Settings; +import android.widget.Toast; + +import androidx.annotation.VisibleForTesting; +import androidx.preference.Preference; + +import com.android.settings.R; +import com.android.settings.core.TogglePreferenceController; + +public class SendCensoredNotificationsToCurrentUserPreferenceController + extends TogglePreferenceController { + private final UserCapabilities mUserCaps; + + public SendCensoredNotificationsToCurrentUserPreferenceController(Context context, String key) { + super(context, key); + mUserCaps = UserCapabilities.create(context); + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + mUserCaps.updateAddUserCapabilities(mContext); + if (!isAvailable()) { + preference.setVisible(false); + } else { + preference.setVisible(mUserCaps.mUserSwitcherEnabled); + } + } + + @Override + public int getAvailabilityStatus() { + return mUserCaps.mUserSwitcherEnabled ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + } + + @Override + public boolean isChecked() { + return Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.SEND_CENSORED_NOTIFICATIONS_TO_CURRENT_USER, 0) != 0; + } + + @Override + public boolean setChecked(boolean isChecked) { + return Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.SEND_CENSORED_NOTIFICATIONS_TO_CURRENT_USER, isChecked ? 1 : 0); + } + + @Override + public CharSequence getSummary() { + return mContext.getString( + R.string.user_settings_send_censored_notifications_to_current_summary); + } + + @Override + public int getSliceHighlightMenuRes() { + return R.string.menu_key_system; + } +} diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java index f1ee56ccef8..a18ffce3808 100644 --- a/src/com/android/settings/users/UserSettings.java +++ b/src/com/android/settings/users/UserSettings.java @@ -131,6 +131,8 @@ public class UserSettings extends SettingsPreferenceFragment private static final String KEY_GUEST_EXIT = "guest_exit"; private static final String KEY_REMOVE_GUEST_ON_EXIT = "remove_guest_on_exit"; private static final String KEY_GUEST_USER_CATEGORY = "guest_user_category"; + private static final String KEY_SEND_CENSORED_NOTIFICATIONS = + "user_settings_send_censored_notifications_to_current"; private static final String SETTING_GUEST_HAS_LOGGED_IN = "systemui.guest_has_logged_in"; @@ -212,6 +214,7 @@ public class UserSettings extends SettingsPreferenceFragment new EditUserInfoController(Utils.FILE_PROVIDER_AUTHORITY); private AddUserWhenLockedPreferenceController mAddUserWhenLockedPreferenceController; private RemoveGuestOnExitPreferenceController mRemoveGuestOnExitPreferenceController; + private SendCensoredNotificationsToCurrentUserPreferenceController mSendCensoredNotificationsToCurrentUserPreferenceController; private MultiUserTopIntroPreferenceController mMultiUserTopIntroPreferenceController; private TimeoutToDockUserPreferenceController mTimeoutToDockUserPreferenceController; private UserCreatingDialog mUserCreatingDialog; @@ -303,6 +306,10 @@ public void onCreate(Bundle icicle) { mRemoveGuestOnExitPreferenceController = new RemoveGuestOnExitPreferenceController( activity, KEY_REMOVE_GUEST_ON_EXIT, this, mHandler); + mSendCensoredNotificationsToCurrentUserPreferenceController = + new SendCensoredNotificationsToCurrentUserPreferenceController(activity, + KEY_SEND_CENSORED_NOTIFICATIONS); + mMultiUserTopIntroPreferenceController = new MultiUserTopIntroPreferenceController(activity, KEY_MULTIUSER_TOP_INTRO); @@ -312,11 +319,14 @@ public void onCreate(Bundle icicle) { final PreferenceScreen screen = getPreferenceScreen(); mAddUserWhenLockedPreferenceController.displayPreference(screen); mRemoveGuestOnExitPreferenceController.displayPreference(screen); + mSendCensoredNotificationsToCurrentUserPreferenceController.displayPreference(screen); mMultiUserTopIntroPreferenceController.displayPreference(screen); mTimeoutToDockUserPreferenceController.displayPreference(screen); screen.findPreference(mAddUserWhenLockedPreferenceController.getPreferenceKey()) .setOnPreferenceChangeListener(mAddUserWhenLockedPreferenceController); + screen.findPreference(mSendCensoredNotificationsToCurrentUserPreferenceController.getPreferenceKey()) + .setOnPreferenceChangeListener(mSendCensoredNotificationsToCurrentUserPreferenceController); screen.findPreference(mRemoveGuestOnExitPreferenceController.getPreferenceKey()) .setOnPreferenceChangeListener(mRemoveGuestOnExitPreferenceController); @@ -391,6 +401,9 @@ public void onResume() { mTimeoutToDockUserPreferenceController.getPreferenceKey())); mRemoveGuestOnExitPreferenceController.updateState(screen.findPreference( mRemoveGuestOnExitPreferenceController.getPreferenceKey())); + mSendCensoredNotificationsToCurrentUserPreferenceController.updateState(screen.findPreference( + mSendCensoredNotificationsToCurrentUserPreferenceController.getPreferenceKey())); + if (mShouldUpdateUserList) { updateUI(); } @@ -1287,8 +1300,13 @@ void updateUserList() { mAddUserWhenLockedPreferenceController.getPreferenceKey()); mAddUserWhenLockedPreferenceController.updateState(addUserOnLockScreen); + final Preference sendCensoredNotifs = getPreferenceScreen().findPreference( + mSendCensoredNotificationsToCurrentUserPreferenceController.getPreferenceKey()); + final Preference multiUserTopIntroPrefence = getPreferenceScreen().findPreference( mMultiUserTopIntroPreferenceController.getPreferenceKey()); + + mSendCensoredNotificationsToCurrentUserPreferenceController.updateState(sendCensoredNotifs); mMultiUserTopIntroPreferenceController.updateState(multiUserTopIntroPrefence); mUserListCategory.setVisible(mUserCaps.mUserSwitcherEnabled); updateGuestPreferences(); @@ -1703,6 +1721,8 @@ public List getNonIndexableKeysFromXml(Context context, int xmlResId, new AddUserWhenLockedPreferenceController( context, KEY_ADD_USER_WHEN_LOCKED); controller.updateNonIndexableKeys(niks); + new SendCensoredNotificationsToCurrentUserPreferenceController(context, + KEY_SEND_CENSORED_NOTIFICATIONS).updateNonIndexableKeys(niks); new AutoSyncDataPreferenceController(context, null /* parent */) .updateNonIndexableKeys(niks); new AutoSyncPersonalDataPreferenceController(context, null /* parent */) From 2b79e7ebec0638b416ffa59e9cc69345ce1ab47d Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Sat, 2 Jul 2022 09:41:50 +0300 Subject: [PATCH 051/100] add Storage Scopes link to the "App info" screen --- res/values/strings.xml | 2 + res/xml/app_info_settings.xml | 5 +++ .../appinfo/AppInfoDashboardFragment.java | 1 + .../AppStorageScopesPreferenceController.java | 38 +++++++++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 src/com/android/settings/applications/appinfo/AppStorageScopesPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index e037e7a0b22..8f3dfbbf16f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14557,4 +14557,6 @@ Charge other devices by placing them on the back of your phone Battery share + + Storage Scopes diff --git a/res/xml/app_info_settings.xml b/res/xml/app_info_settings.xml index 2bb05d000ae..30cca755d7f 100644 --- a/res/xml/app_info_settings.xml +++ b/res/xml/app_info_settings.xml @@ -59,6 +59,11 @@ settings:summaryLineCount="1" settings:controller="com.android.settings.applications.appinfo.AppPermissionPreferenceController" /> + + Date: Fri, 8 Jul 2022 13:40:22 +0300 Subject: [PATCH 052/100] add OBB access toggle to "Install unknown apps" screen --- res/values/strings.xml | 3 + .../appinfo/ExternalSourcesDetails.java | 55 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/res/values/strings.xml b/res/values/strings.xml index 8f3dfbbf16f..4b61cc7fdff 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14559,4 +14559,7 @@ Battery share Storage Scopes + + Allow access to Android/obb folder + Required for installation of some large apps (mostly games) that use OBB expansion files diff --git a/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java b/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java index b7232744365..f1ab2820520 100644 --- a/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java +++ b/src/com/android/settings/applications/appinfo/ExternalSourcesDetails.java @@ -21,6 +21,7 @@ import android.app.AppOpsManager; import android.app.settings.SettingsEnums; import android.content.Context; +import android.content.pm.GosPackageState; import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; @@ -133,6 +134,9 @@ protected boolean refreshUi() { return true; } mSwitchPref.setChecked(mInstallAppsState.canInstallApps()); + + setupObbToggle(); + return true; } @@ -145,4 +149,55 @@ protected AlertDialog createDialog(int id, int errorCode) { public int getMetricsCategory() { return SettingsEnums.MANAGE_EXTERNAL_SOURCES; } + + private RestrictedSwitchPreference mObbPref; + + private void setupObbToggle() { + RestrictedSwitchPreference p = mObbPref; + if (p == null) { + if (!GosPackageState.attachableToPackage(mPackageName)) { + return; + } + p = createObbToggle(); + mSwitchPref.getParent().addPreference(p); + mObbPref = p; + } + + boolean canInstallApps = mInstallAppsState.canInstallApps(); + + if (!canInstallApps) { + p.setChecked(false); + p.callChangeListener(Boolean.FALSE); + } else { + GosPackageState ps = GosPackageState.get(mPackageName); + p.setChecked(ps != null && ps.hasFlag(GosPackageState.FLAG_ALLOW_ACCESS_TO_OBB_DIRECTORY)); + } + + p.setEnabled(canInstallApps); + } + + private RestrictedSwitchPreference createObbToggle() { + RestrictedSwitchPreference p = new RestrictedSwitchPreference(mSwitchPref.getContext()); + p.setTitle(R.string.allow_access_to_obb_directory_title); + p.setSummary(R.string.allow_access_to_obb_directory_summary); + + p.setOnPreferenceChangeListener((preference, checkedB) -> { + var ps = GosPackageState.get(mPackageName); + boolean curValue = ps != null && ps.hasFlag(GosPackageState.FLAG_ALLOW_ACCESS_TO_OBB_DIRECTORY); + + if (curValue == (boolean) checkedB) { + return true; + } + + GosPackageState.edit(mPackageName) + .setFlagsState(GosPackageState.FLAG_ALLOW_ACCESS_TO_OBB_DIRECTORY, (boolean) checkedB) + // storage mount modes can't be updated dynamically + .killUidAfterApply() + .apply(); + + return true; + }); + + return p; + } } From f799d97426d998ac25e77db5457ca01641d7f030 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Wed, 17 Aug 2022 12:40:26 -0400 Subject: [PATCH 053/100] fully enable location indicators by default --- .../location/LocationIndicatorsPreferenceController.java | 2 +- .../location/RecentLocationAccessPreferenceController.java | 6 +++--- .../location/RecentLocationAccessSeeAllFragment.java | 6 +++--- .../RecentLocationAccessSeeAllPreferenceController.java | 4 ++-- .../location/RecentLocationRequestPreferenceController.java | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/com/android/settings/location/LocationIndicatorsPreferenceController.java b/src/com/android/settings/location/LocationIndicatorsPreferenceController.java index 75ffb3a9286..1b1af8f8f73 100644 --- a/src/com/android/settings/location/LocationIndicatorsPreferenceController.java +++ b/src/com/android/settings/location/LocationIndicatorsPreferenceController.java @@ -34,7 +34,7 @@ public LocationIndicatorsPreferenceController(Context context, String preference @Override public boolean isChecked() { return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, - Utils.PROPERTY_LOCATION_INDICATORS_ENABLED, false); + Utils.PROPERTY_LOCATION_INDICATORS_ENABLED, true); } @Override diff --git a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java index 61682d00a8c..6b28d921efa 100644 --- a/src/com/android/settings/location/RecentLocationAccessPreferenceController.java +++ b/src/com/android/settings/location/RecentLocationAccessPreferenceController.java @@ -48,7 +48,7 @@ public class RecentLocationAccessPreferenceController extends LocationBasePrefer RecentAppOpsAccess mRecentLocationApps; private PreferenceCategory mCategoryRecentLocationRequests; private int mType = ProfileSelectFragment.ProfileType.ALL; - private boolean mShowSystem = false; + private boolean mShowSystem = true; private boolean mSystemSettingChanged = false; private static class PackageEntryClickedListener implements @@ -85,9 +85,9 @@ public RecentLocationAccessPreferenceController(Context context, String key, super(context, key); mRecentLocationApps = recentLocationApps; mShowSystem = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, - SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, false) + SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, true) ? Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1 + Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 1) == 1 : false; } diff --git a/src/com/android/settings/location/RecentLocationAccessSeeAllFragment.java b/src/com/android/settings/location/RecentLocationAccessSeeAllFragment.java index ecbcb30eace..1566712e405 100644 --- a/src/com/android/settings/location/RecentLocationAccessSeeAllFragment.java +++ b/src/com/android/settings/location/RecentLocationAccessSeeAllFragment.java @@ -40,7 +40,7 @@ public class RecentLocationAccessSeeAllFragment extends DashboardFragment { private static final int MENU_SHOW_SYSTEM = Menu.FIRST + 1; private static final int MENU_HIDE_SYSTEM = Menu.FIRST + 2; - private boolean mShowSystem = false; + private boolean mShowSystem = true; private MenuItem mShowSystemMenu; private MenuItem mHideSystemMenu; private RecentLocationAccessSeeAllPreferenceController mController; @@ -61,9 +61,9 @@ public void onAttach(Context context) { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mShowSystem = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, - SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, false) + SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, true) ? Settings.Secure.getInt(getContentResolver(), - Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1 + Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 1) == 1 : false; } diff --git a/src/com/android/settings/location/RecentLocationAccessSeeAllPreferenceController.java b/src/com/android/settings/location/RecentLocationAccessSeeAllPreferenceController.java index d6586673f89..abda482a1e5 100644 --- a/src/com/android/settings/location/RecentLocationAccessSeeAllPreferenceController.java +++ b/src/com/android/settings/location/RecentLocationAccessSeeAllPreferenceController.java @@ -51,9 +51,9 @@ public class RecentLocationAccessSeeAllPreferenceController public RecentLocationAccessSeeAllPreferenceController(Context context, String key) { super(context, key); mShowSystem = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, - SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, false) + SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, true) ? Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1 + Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 1) == 1 : false; mRecentLocationAccesses = RecentAppOpsAccess.createForLocation(context); diff --git a/src/com/android/settings/location/RecentLocationRequestPreferenceController.java b/src/com/android/settings/location/RecentLocationRequestPreferenceController.java index 39211ee5202..bee904efdc4 100644 --- a/src/com/android/settings/location/RecentLocationRequestPreferenceController.java +++ b/src/com/android/settings/location/RecentLocationRequestPreferenceController.java @@ -87,9 +87,9 @@ public void displayPreference(PreferenceScreen screen) { final List recentLocationRequests = new ArrayList<>(); final UserManager userManager = UserManager.get(mContext); final boolean showSystem = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_PRIVACY, - SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, false) + SystemUiDeviceConfigFlags.PROPERTY_LOCATION_INDICATORS_SMALL_ENABLED, true) ? Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 0) == 1 + Settings.Secure.LOCATION_SHOW_SYSTEM_OPS, 1) == 1 : false; for (RecentLocationApps.Request request : mRecentLocationApps.getAppListSorted( From f9e1a915bbade1d301ebc49a36676930ed3452d5 Mon Sep 17 00:00:00 2001 From: renlord Date: Fri, 15 Oct 2021 20:02:51 +0530 Subject: [PATCH 054/100] add option to always randomize MAC RANDOMIZATION_ALWAYS is set as the default option --- res/layout/wifi_network_config.xml | 2 +- res/values/arrays.xml | 7 +++++ res/xml/wifi_network_details_fragment2.xml | 2 +- .../WifiDetailPreferenceController2.java | 2 +- .../WifiPrivacyPreferenceController2.java | 28 +++++++++++++++---- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/res/layout/wifi_network_config.xml b/res/layout/wifi_network_config.xml index f91f7385c17..c0907b19eef 100644 --- a/res/layout/wifi_network_config.xml +++ b/res/layout/wifi_network_config.xml @@ -675,7 +675,7 @@ android:layout_height="wrap_content" style="@style/wifi_item_spinner" android:prompt="@string/wifi_privacy_settings" - android:entries="@array/wifi_privacy_entries"/> + android:entries="@array/wifi_privacy_entries_extended"/> Treat as unmetered + + Use per-connection randomized MAC (default) + Use per-network randomized MAC + Use device MAC + + Use randomized MAC (default) Use device MAC @@ -1477,6 +1483,7 @@ + 100 1 0 diff --git a/res/xml/wifi_network_details_fragment2.xml b/res/xml/wifi_network_details_fragment2.xml index eb9add14f66..2079ef16759 100644 --- a/res/xml/wifi_network_details_fragment2.xml +++ b/res/xml/wifi_network_details_fragment2.xml @@ -69,7 +69,7 @@ android:key="privacy" android:icon="@drawable/ic_wifi_privacy_24dp" android:title="@string/wifi_privacy_settings" - android:entries="@array/wifi_privacy_entries" + android:entries="@array/wifi_privacy_entries_extended" android:entryValues="@array/wifi_privacy_values"/> Date: Fri, 19 Aug 2022 11:05:36 +0530 Subject: [PATCH 055/100] LTE Only Mode Co-authored-by: inthewaves --- res/values/strings.xml | 6 +++++ ...nabledNetworkModePreferenceController.java | 25 ++++++++++++++++++- ...ferredNetworkModePreferenceController.java | 2 +- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 4b61cc7fdff..aa4af4e735f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -13089,6 +13089,8 @@ Preferred network mode: CDMA/EvDo/GSM/WCDMA Preferred network mode: LTE + + Preferred network mode: LTE only Preferred network mode: GSM/WCDMA/LTE @@ -13154,8 +13156,12 @@ 4G LTE (recommended) + + LTE only 4G (recommended) + + 4G only 3G diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java index 43b3cc0e4c4..bb0fc8d3070 100644 --- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java +++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java @@ -90,7 +90,7 @@ public int getAvailabilityStatus(int subId) { CarrierConfigManager.KEY_HIDE_CARRIER_NETWORK_SETTINGS_BOOL) || carrierConfig.getBoolean( CarrierConfigManager.KEY_HIDE_PREFERRED_NETWORK_TYPE_BOOL)) { - visible = false; + visible = true; } else if (carrierConfig.getBoolean(CarrierConfigManager.KEY_WORLD_PHONE_BOOL)) { visible = false; } else if (!isCallStateIdle()) { @@ -237,6 +237,7 @@ public void updateConfig() { } void setPreferenceEntries() { + boolean lteOnlyUnsupported = false; mTelephonyManager = mTelephonyManager.createForSubscriptionId(mSubId); final PersistableBundle carrierConfig = mCarrierConfigCache.getConfigForSubId(mSubId); final boolean display2gOptions = carrierConfig @@ -254,6 +255,7 @@ void setPreferenceEntries() { .addFormat(UiOptions.PresentFormat.addGlobalEntry); break; case ENABLED_NETWORKS_CDMA_NO_LTE_CHOICES: + lteOnlyUnsupported = true; uiOptions = uiOptions .setChoices(R.array.enabled_networks_cdma_no_lte_values) .addFormat(UiOptions.PresentFormat.add3gEntry) @@ -273,6 +275,7 @@ void setPreferenceEntries() { .addFormat(UiOptions.PresentFormat.add2gEntry); break; case ENABLED_NETWORKS_EXCEPT_GSM_LTE_CHOICES: + lteOnlyUnsupported = true; uiOptions = uiOptions .setChoices(R.array.enabled_networks_except_gsm_lte_values) .addFormat(UiOptions.PresentFormat.add3gEntry); @@ -290,6 +293,7 @@ void setPreferenceEntries() { .addFormat(UiOptions.PresentFormat.add3gEntry); break; case ENABLED_NETWORKS_EXCEPT_LTE_CHOICES: + lteOnlyUnsupported = true; uiOptions = uiOptions .setChoices(R.array.enabled_networks_except_lte_values) .addFormat(UiOptions.PresentFormat.add3gEntry) @@ -310,6 +314,7 @@ void setPreferenceEntries() { .addFormat(UiOptions.PresentFormat.add2gEntry); break; case PREFERRED_NETWORK_MODE_CHOICES_WORLD_MODE: + lteOnlyUnsupported = true; uiOptions = uiOptions .setChoices(R.array.preferred_network_mode_values_world_mode) .addFormat(UiOptions.PresentFormat.addGlobalEntry) @@ -328,6 +333,11 @@ void setPreferenceEntries() { throw new IllegalArgumentException( uiOptions.getType().name() + " index error."); } + + if (!lteOnlyUnsupported){ + addLteOnlyEntry(); + } + // Compose options based on given values and formats. IntStream.range(0, formatList.size()).forEach(entryIndex -> { switch (formatList.get(entryIndex)) { @@ -506,6 +516,9 @@ void setPreferenceValueAndSummary(int networkMode) { break; } case TelephonyManagerConstants.NETWORK_MODE_LTE_ONLY: + setSummary(mShow4gForLTE + ? R.string.network_4G_only : R.string.network_lte_only); + break; case TelephonyManagerConstants.NETWORK_MODE_LTE_WCDMA: if (!mIsGlobalCdma) { setSelectedEntry( @@ -771,6 +784,16 @@ private void add1xEntry(int value) { mEntriesValue.add(value); } + private void addLteOnlyEntry() { + if (mShow4gForLTE) { + mEntries.add(mContext.getString(R.string.network_4G_only)); + mEntriesValue.add(TelephonyManagerConstants.NETWORK_MODE_LTE_ONLY); + } else { + mEntries.add(mContext.getString(R.string.network_lte_only)); + mEntriesValue.add(TelephonyManagerConstants.NETWORK_MODE_LTE_ONLY); + } + } + private void addCustomEntry(String name, int value) { mEntries.add(name); mEntriesValue.add(value); diff --git a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java index feeed91910c..2746bbe92e0 100644 --- a/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java +++ b/src/com/android/settings/network/telephony/PreferredNetworkModePreferenceController.java @@ -131,7 +131,7 @@ private int getPreferredNetworkModeSummaryResId(int NetworkMode) { case TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA: return R.string.preferred_network_mode_lte_tdscdma_summary; case TelephonyManagerConstants.NETWORK_MODE_LTE_ONLY: - return R.string.preferred_network_mode_lte_summary; + return R.string.preferred_network_mode_lte_only_summary; case TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_GSM: return R.string.preferred_network_mode_lte_tdscdma_gsm_summary; case TelephonyManagerConstants.NETWORK_MODE_LTE_TDSCDMA_GSM_WCDMA: From 60a86f7c27ae1e3328712aa234c0132eb29bf863 Mon Sep 17 00:00:00 2001 From: flawedworld Date: Tue, 23 Aug 2022 01:08:45 +0100 Subject: [PATCH 056/100] Fix LTE Only mode on World Mode --- .../telephony/EnabledNetworkModePreferenceController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java index bb0fc8d3070..1be4e6f4954 100644 --- a/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java +++ b/src/com/android/settings/network/telephony/EnabledNetworkModePreferenceController.java @@ -314,7 +314,6 @@ void setPreferenceEntries() { .addFormat(UiOptions.PresentFormat.add2gEntry); break; case PREFERRED_NETWORK_MODE_CHOICES_WORLD_MODE: - lteOnlyUnsupported = true; uiOptions = uiOptions .setChoices(R.array.preferred_network_mode_values_world_mode) .addFormat(UiOptions.PresentFormat.addGlobalEntry) From 9878e6306ae0ab3f7fe0a9c16514bacf1463cb68 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Sun, 14 Aug 2022 17:34:03 +0300 Subject: [PATCH 057/100] add a per-app toggle to relax app hardening --- res/values/strings.xml | 4 + res/xml/app_info_settings.xml | 6 + .../appinfo/AppInfoDashboardFragment.java | 5 + ...AppRelaxHardeningPreferenceController.java | 182 ++++++++++++++++++ 4 files changed, 197 insertions(+) create mode 100644 src/com/android/settings/applications/appinfo/AppRelaxHardeningPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index aa4af4e735f..84edb37e2a2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14568,4 +14568,8 @@ Allow access to Android/obb folder Required for installation of some large apps (mostly games) that use OBB expansion files + + Exploit protection compatibility mode + Improve compatibility with misbehaving apps by using Android\'s standard address space size and memory allocator + Configure hardening diff --git a/res/xml/app_info_settings.xml b/res/xml/app_info_settings.xml index 30cca755d7f..89252b369e7 100644 --- a/res/xml/app_info_settings.xml +++ b/res/xml/app_info_settings.xml @@ -158,6 +158,12 @@ android:title="@string/advanced_apps" settings:controller="com.android.settings.applications.appinfo.AdvancedAppInfoPreferenceCategoryController"> + + { + AppInfoBase.startAppInfoFragment(DevModeFragment.class, + mContext.getString(R.string.app_hardening_config), + getPackageName(), mParent.getPackageInfo().applicationInfo.uid, + mParent, -1, mParent.getMetricsCategory()); + return true; + }); + + p.setOrder(preference.getOrder() - 1); + preference.getParent().addPreference(p); + + addedDevPreference = true; + } + + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + boolean checked = (boolean) newValue; + + GosPackageState.edit(getPackageName()) + .setFlagsState(GosPackageState.FLAG_DISABLE_HARDENED_MALLOC + | GosPackageState.FLAG_ENABLE_COMPAT_VA_39_BIT, checked) + .killUidAfterApply() + .apply(); + + return true; + } + + private String getPackageName() { + return mParent.getPackageInfo().packageName; + } + + public static class DevModeFragment extends AppInfoWithHeader { + private static final String KEY_FLAG = "flag"; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + Context ctx = requireContext(); + PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(ctx); + + String[] flags = { "DISABLE_HARDENED_MALLOC", "ENABLE_COMPAT_VA_39_BIT" }; + + for (String flag : flags) { + SwitchPreference p = new SwitchPreference(ctx); + p.setTitle(flag); + + int psFlag; + try { + psFlag = GosPackageState.class.getDeclaredField("FLAG_" + flag).getInt(null); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + p.getExtras().putInt(KEY_FLAG, psFlag); + + p.setOnPreferenceChangeListener((preference, newValue) -> { + boolean state = (boolean) newValue; + + GosPackageState.edit(mPackageName) + .setFlagsState(psFlag, state) + .killUidAfterApply() + .apply(); + + return true; + }); + + screen.addPreference(p); + } + + setPreferenceScreen(screen); + } + + @Override + protected boolean refreshUi() { + GosPackageState ps = GosPackageState.get(mPackageName); + + PreferenceScreen s = getPreferenceScreen(); + for (int i = 0, m = s.getPreferenceCount(); i < m; ++i) { + Preference p = s.getPreference(i); + if (!(p instanceof SwitchPreference)) { + continue; + } + SwitchPreference sp = (SwitchPreference) p; + int psFlag = sp.getExtras().getInt(KEY_FLAG); + sp.setChecked(ps != null && ps.hasFlag(psFlag)); + } + + return true; + } + + @Override + protected AlertDialog createDialog(int id, int errorCode) { + return null; + } + + @Override + public int getMetricsCategory() { + return METRICS_CATEGORY_UNKNOWN; + } + } +} From be1327721af69ceec654f02f852e486c67cdb560 Mon Sep 17 00:00:00 2001 From: Pratyush Date: Sat, 3 Sep 2022 15:52:37 +0530 Subject: [PATCH 058/100] enable "install available apps" allowing adding (installed) apps from (owner) user manager ui. --- src/com/android/settings/users/UserDetailsSettings.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/com/android/settings/users/UserDetailsSettings.java b/src/com/android/settings/users/UserDetailsSettings.java index 58405fcf16f..15ed864c601 100644 --- a/src/com/android/settings/users/UserDetailsSettings.java +++ b/src/com/android/settings/users/UserDetailsSettings.java @@ -78,7 +78,7 @@ public class UserDetailsSettings extends SettingsPreferenceFragment private static final int DIALOG_CONFIRM_RESET_GUEST_AND_SWITCH_USER = 6; /** Whether to enable the app_copying fragment. */ - private static final boolean SHOW_APP_COPYING_PREF = false; + private static final boolean SHOW_APP_COPYING_PREF = true; private UserManager mUserManager; private UserCapabilities mUserCaps; @@ -386,7 +386,6 @@ void initialize(Context context, Bundle arguments) { mPhonePref.setChecked(!mUserManager.hasUserRestriction( UserManager.DISALLOW_OUTGOING_CALLS, new UserHandle(userId))); mRemoveUserPref.setTitle(R.string.user_remove_user); - removePreference(KEY_APP_COPYING); mInstallAppsPref.setChecked(mUserManager.hasUserRestriction( UserManager.DISALLOW_INSTALL_APPS, new UserHandle(userId))); mInstallAppsUnknownSourcesPref.setChecked(mUserManager.hasUserRestriction( From b8ce46d567be0e42e666f8c369dd7a0d6c031064 Mon Sep 17 00:00:00 2001 From: Pratyush Date: Tue, 13 Sep 2022 17:10:03 +0530 Subject: [PATCH 059/100] add monochrome icon --- res/mipmap-anydpi/ic_launcher.xml | 1 + res/mipmap-anydpi/ic_launcher_round.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/res/mipmap-anydpi/ic_launcher.xml b/res/mipmap-anydpi/ic_launcher.xml index a8a8fa5518f..5c84730caa7 100644 --- a/res/mipmap-anydpi/ic_launcher.xml +++ b/res/mipmap-anydpi/ic_launcher.xml @@ -2,4 +2,5 @@ + diff --git a/res/mipmap-anydpi/ic_launcher_round.xml b/res/mipmap-anydpi/ic_launcher_round.xml index a8a8fa5518f..5c84730caa7 100644 --- a/res/mipmap-anydpi/ic_launcher_round.xml +++ b/res/mipmap-anydpi/ic_launcher_round.xml @@ -2,4 +2,5 @@ + From 5a62657b6ad26bd24d4dbd2fe9933f3f8264f11a Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Wed, 21 Sep 2022 18:15:51 +0300 Subject: [PATCH 060/100] don't allow disabling GmsCompat config Disabling it would prevent auto-updates via Apps app. --- .../applications/appinfo/AppButtonsPreferenceController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java index 260e765bd43..7c6653edb32 100644 --- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java @@ -628,6 +628,7 @@ boolean handleDisableable() { || mAppEntry.info.packageName.equals("com.android.inputmethod.latin") || mAppEntry.info.packageName.equals("app.vanadium.webview") || mAppEntry.info.packageName.equals(GmsCompatApp.PKG_NAME) + || mAppEntry.info.packageName.equals(GmsCompatApp.PKG_NAME + ".config") || isSystemPackage(mActivity.getResources(), mPm, mPackageInfo)) { // Disable button for core system applications. mButtonsPref.setButton2Text(R.string.disable_text) From 1e2b04afcf760f9763a97ece924779c2c680d26d Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Wed, 21 Sep 2022 19:23:25 +0300 Subject: [PATCH 061/100] show more APK details on App info screen --- res/values/strings.xml | 3 ++ .../AppVersionPreferenceController.java | 40 ++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 84edb37e2a2..a24a343044d 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14572,4 +14572,7 @@ Exploit protection compatibility mode Improve compatibility with misbehaving apps by using Android\'s standard address space size and memory allocator Configure hardening + + Installed: %1$s + Updated: %1$s diff --git a/src/com/android/settings/applications/appinfo/AppVersionPreferenceController.java b/src/com/android/settings/applications/appinfo/AppVersionPreferenceController.java index 23dd9602f77..734bd6ff476 100644 --- a/src/com/android/settings/applications/appinfo/AppVersionPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppVersionPreferenceController.java @@ -22,6 +22,9 @@ import com.android.settings.R; +import java.text.DateFormat; +import java.util.Date; + public class AppVersionPreferenceController extends AppInfoPreferenceControllerBase { public AppVersionPreferenceController(Context context, String key) { @@ -36,7 +39,40 @@ public CharSequence getSummary() { if (packageInfo == null) { return null; } - return mContext.getString(R.string.version_text, - BidiFormatter.getInstance().unicodeWrap(packageInfo.versionName)); + + Context ctx = mContext; + + DateFormat dateFormat = android.text.format.DateFormat.getMediumDateFormat(ctx); + DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(ctx); + + String times = null; + if (packageInfo.firstInstallTime != 0) { + String s = formatDate(packageInfo.firstInstallTime, dateFormat, timeFormat); + times = ctx.getString(R.string.app_info_install_time, s); + } + + if (packageInfo.lastUpdateTime != 0 && packageInfo.lastUpdateTime != packageInfo.firstInstallTime) { + String s = formatDate(packageInfo.lastUpdateTime, dateFormat, timeFormat); + String updateTime = ctx.getString(R.string.app_info_update_time, s); + if (times != null) { + times += '\n' + updateTime; + } else { + times = updateTime; + } + } + + return ctx.getString(R.string.version_text, + BidiFormatter.getInstance().unicodeWrap(packageInfo.versionName)) + + "\n\n" + packageInfo.packageName + + "\nversionCode " + packageInfo.getLongVersionCode() + + "\n\ntargetSdk " + packageInfo.applicationInfo.targetSdkVersion + + "\nminSdk " + packageInfo.applicationInfo.minSdkVersion + + (times != null ? ("\n\n" + times) : "") + ; + } + + private static String formatDate(long unixTs, DateFormat dateFormat, DateFormat timeFormat) { + Date d = new Date(unixTs); + return dateFormat.format(d) + "; " + timeFormat.format(d); } } From 3e4664f3b2dc96eeca5c17f28f743b9819eaf3ae Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Sat, 1 Oct 2022 14:23:52 +0300 Subject: [PATCH 062/100] relax app hardening toggle: improve availability check --- .../AppRelaxHardeningPreferenceController.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/com/android/settings/applications/appinfo/AppRelaxHardeningPreferenceController.java b/src/com/android/settings/applications/appinfo/AppRelaxHardeningPreferenceController.java index 50ae5eeffcd..20c12806041 100644 --- a/src/com/android/settings/applications/appinfo/AppRelaxHardeningPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppRelaxHardeningPreferenceController.java @@ -30,6 +30,7 @@ import com.android.settings.R; import com.android.settings.applications.AppInfoBase; import com.android.settings.applications.AppInfoWithHeader; +import com.android.settingslib.applications.AppUtils; import dalvik.system.VMRuntime; @@ -47,16 +48,13 @@ public AppRelaxHardeningPreferenceController(Context ctx, String key) { @Override public int getAvailabilityStatus() { - ApplicationInfo ai = mParent.getPackageInfo().applicationInfo; - - String primaryAbi = ai.primaryCpuAbi; - - if (!ai.isSystemApp() && primaryAbi != null && VMRuntime.is64BitAbi(primaryAbi)) { - // non-system app that has native 64-bit code - return AVAILABLE; + if (!AppUtils.isAppInstalled(mAppEntry)) { + // not installed for the current user, App info page is still shown in Owner in this case + return CONDITIONALLY_UNAVAILABLE; } - return CONDITIONALLY_UNAVAILABLE; + ApplicationInfo ai = mParent.getPackageInfo().applicationInfo; + return GosPackageState.eligibleForRelaxHardeningFlag(ai) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } private boolean addedDevPreference; From 5ea7dd14e00cb245ce589a7c6719677710269f98 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Wed, 5 Oct 2022 19:58:22 +0300 Subject: [PATCH 063/100] add a toggle for auto-grants of OTHER_SENSORS permission --- res/values/strings.xml | 4 ++ res/xml/privacy_dashboard_settings.xml | 8 ++++ ...tOtherSensorsPermissionPrefController.java | 41 +++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 src/com/android/settings/privacy/AutoGrantOtherSensorsPermissionPrefController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index a24a343044d..db9ad803fdf 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14575,4 +14575,8 @@ Installed: %1$s Updated: %1$s + + Allow Sensors permission to apps by default + Sensors is a non-standard permission, apps may malfunction if it’s denied. + A permission prompt will be shown when an app tries to access sensors. Note that some apps may need to be manually restarted after allowing the Sensors permission. diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml index 87b16cf09bf..9a363dfb899 100644 --- a/res/xml/privacy_dashboard_settings.xml +++ b/res/xml/privacy_dashboard_settings.xml @@ -75,6 +75,14 @@ android:summary="@string/mic_toggle_description" settings:controller="com.android.settings.privacy.MicToggleController"/> + + Date: Sun, 13 Nov 2022 20:24:05 +0200 Subject: [PATCH 064/100] battery usage UI: use a fallback name for unknown components --- .../settings/fuelgauge/batteryusage/BatteryEntry.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java index ccb2fb786eb..748aa494d4d 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java +++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryEntry.java @@ -606,9 +606,10 @@ public static NameAndIcon getNameAndIconFromPowerComponent( iconId = R.drawable.ic_settings_phone_idle; break; default: - Log.w(TAG, "unknown attribute:" + DebugUtils.constantToString( - BatteryConsumer.class, "POWER_COMPONENT_", powerComponentId)); - name = null; + String fieldName = DebugUtils.constantToString( + BatteryConsumer.class, "POWER_COMPONENT_", powerComponentId); + Log.w(TAG, "unknown attribute:" + fieldName); + name = context.getResources().getString(R.string.header_category_system) + " (" + fieldName + ")"; iconId = R.drawable.ic_power_system; break; } From 9d259df2cf47f2ba6210a51dcc2557a3ec5ade93 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Sun, 13 Nov 2022 20:25:59 +0200 Subject: [PATCH 065/100] change the minimal value of Battery Saver schedule from 10 to 5% It's the value that it had in Android 12. --- .../BatterySaverScheduleRadioButtonsController.java | 4 ++-- .../batterysaver/BatterySaverScheduleSeekBarController.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java index 378918a50eb..41a9b60f908 100644 --- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java +++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java @@ -40,7 +40,7 @@ public class BatterySaverScheduleRadioButtonsController { public static final String KEY_NO_SCHEDULE = "key_battery_saver_no_schedule"; public static final String KEY_ROUTINE = "key_battery_saver_routine"; public static final String KEY_PERCENTAGE = "key_battery_saver_percentage"; - public static final int TRIGGER_LEVEL_MIN = 10; + public static final int TRIGGER_LEVEL_DEFAULT = 10; private Context mContext; private BatterySaverScheduleSeekBarController mSeekBarController; @@ -82,7 +82,7 @@ public boolean setDefaultKey(String key) { case KEY_NO_SCHEDULE: break; case KEY_PERCENTAGE: - triggerLevel = TRIGGER_LEVEL_MIN; + triggerLevel = TRIGGER_LEVEL_DEFAULT; confirmationExtras.putBoolean(BatterySaverUtils.EXTRA_CONFIRM_TEXT_ONLY, true); confirmationExtras.putInt(BatterySaverUtils.EXTRA_POWER_SAVE_MODE_TRIGGER, PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE); diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java index a441449ba55..d492cbcd86d 100644 --- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java +++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java @@ -45,7 +45,7 @@ public class BatterySaverScheduleSeekBarController implements OnPreferenceChangeListener { public static final int MAX_SEEKBAR_VALUE = 15; - public static final int MIN_SEEKBAR_VALUE = 2; + public static final int MIN_SEEKBAR_VALUE = 1; // percentage value == (seekbar value * 5) public static final String KEY_BATTERY_SAVER_SEEK_BAR = "battery_saver_seek_bar"; @VisibleForTesting From da2431b02eaeb6f7cee517cd51edea1af43d3644 Mon Sep 17 00:00:00 2001 From: Pratyush Date: Sat, 10 Dec 2022 01:40:31 +0530 Subject: [PATCH 066/100] fix smooth display setting description --- res/values/strings.xml | 1 + .../settings/display/PeakRefreshRatePreferenceController.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/res/values/strings.xml b/res/values/strings.xml index db9ad803fdf..e2525a507b2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -3252,6 +3252,7 @@ Smooth Display Automatically raises the refresh rate from 60 to 90 Hz for some content. Increases battery usage. + Automatically raises the refresh rate from 60 to %s Hz for some content. Increases battery usage. Force peak refresh rate diff --git a/src/com/android/settings/display/PeakRefreshRatePreferenceController.java b/src/com/android/settings/display/PeakRefreshRatePreferenceController.java index 27ba340c6ba..382c812c3cf 100644 --- a/src/com/android/settings/display/PeakRefreshRatePreferenceController.java +++ b/src/com/android/settings/display/PeakRefreshRatePreferenceController.java @@ -89,6 +89,9 @@ public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mPreference = screen.findPreference(getPreferenceKey()); + mPreference.setSummary( + screen.getContext().getString(R.string.peak_refresh_rate_summary_dynamic, (int) getDefaultPeakRefreshRate()) + ); } @Override From 876fdff79e84617669445beda5167ab213882371 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Fri, 30 Dec 2022 17:21:30 +0200 Subject: [PATCH 067/100] eUICC compat toggle: listen and react to changes to relevant packages --- .../network/EuiccCompatController.java | 70 +++++++++++++++++-- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/network/EuiccCompatController.java b/src/com/android/settings/network/EuiccCompatController.java index 4f7d4066c7a..6f9f7abaa75 100644 --- a/src/com/android/settings/network/EuiccCompatController.java +++ b/src/com/android/settings/network/EuiccCompatController.java @@ -1,12 +1,23 @@ package com.android.settings.network; +import android.annotation.Nullable; import android.app.compat.gms.GmsCompat; +import android.content.BroadcastReceiver; import android.content.Context; -import android.content.pm.PackageInfo; +import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; +import android.os.PatternMatcher; import android.os.Process; import android.os.UserHandle; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleObserver; +import androidx.lifecycle.OnLifecycleEvent; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; +import androidx.preference.TwoStatePreference; + import com.android.internal.gmscompat.GmsInfo; import com.android.settings.R; import com.android.settings.core.TogglePreferenceController; @@ -14,7 +25,7 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; -public class EuiccCompatController extends TogglePreferenceController { +public class EuiccCompatController extends TogglePreferenceController implements LifecycleObserver { private final PackageManager packageManager; public EuiccCompatController(Context context, String key) { @@ -45,9 +56,13 @@ public int getAvailabilityStatus() { return DISABLED_FOR_USER; } - return checkDependencies() ? - AVAILABLE : - DISABLED_DEPENDENT_SETTING; + return checkDependencies() ? AVAILABLE : DISABLED_DEPENDENT_SETTING; + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + preference.setEnabled(getAvailabilityStatus() == AVAILABLE); } @Override @@ -66,7 +81,7 @@ public boolean setChecked(boolean isChecked) { } } - private boolean checkDependencies() { + private static boolean checkDependencies() { for (String pkg : GmsInfo.DEPENDENCIES_OF_EUICC_PACKAGES) { // all dependencies are a part of the GMS suite if (GmsCompat.isGmsApp(pkg, UserHandle.USER_SYSTEM)) { @@ -81,4 +96,47 @@ private boolean checkDependencies() { public int getSliceHighlightMenuRes() { return R.string.menu_key_network; } + + @Nullable + TwoStatePreference preference; + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + preference = screen.findPreference(getPreferenceKey()); + } + + private final BroadcastReceiver packageChangeListener = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + var p = preference; + if (p != null) { + p.setEnabled(getAvailabilityStatus() == AVAILABLE); + p.setChecked(isChecked()); + } + } + }; + + @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) + public void onResume() { + var f = new IntentFilter(); + f.addAction(Intent.ACTION_PACKAGE_ADDED); + f.addAction(Intent.ACTION_PACKAGE_CHANGED); + f.addAction(Intent.ACTION_PACKAGE_REMOVED); + f.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED); + + f.addDataScheme("package"); + for (String pkg : GmsInfo.DEPENDENCIES_OF_EUICC_PACKAGES) { + f.addDataSchemeSpecificPart(pkg, PatternMatcher.PATTERN_LITERAL); + } + for (String pkg : GmsInfo.EUICC_PACKAGES) { + f.addDataSchemeSpecificPart(pkg, PatternMatcher.PATTERN_LITERAL); + } + mContext.registerReceiver(packageChangeListener, f); + } + + @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) + public void onPause() { + mContext.unregisterReceiver(packageChangeListener); + } } From efff55ee09db99f2846e35caa24fe5444d280575 Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Thu, 9 Jun 2022 11:27:32 +0200 Subject: [PATCH 068/100] Settings: Pass empty lottie resource for quickly open camera animation This lets us hide it properly. Change-Id: I02ac031a835236811b82a7de283335390ffebab9 --- res/drawable/quickly_open_camera.xml | 3 --- res/raw/lottie_quickly_open_camera.json | 0 res/xml/double_tap_power_settings.xml | 2 +- 3 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 res/drawable/quickly_open_camera.xml create mode 100644 res/raw/lottie_quickly_open_camera.json diff --git a/res/drawable/quickly_open_camera.xml b/res/drawable/quickly_open_camera.xml deleted file mode 100644 index dcbf9f4dc68..00000000000 --- a/res/drawable/quickly_open_camera.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/res/raw/lottie_quickly_open_camera.json b/res/raw/lottie_quickly_open_camera.json new file mode 100644 index 00000000000..e69de29bb2d diff --git a/res/xml/double_tap_power_settings.xml b/res/xml/double_tap_power_settings.xml index f4d7607c85e..37a502895ae 100644 --- a/res/xml/double_tap_power_settings.xml +++ b/res/xml/double_tap_power_settings.xml @@ -24,7 +24,7 @@ + app:lottie_rawRes="@raw/lottie_quickly_open_camera"/> Date: Wed, 18 Jan 2023 14:14:47 -0500 Subject: [PATCH 069/100] Revert "change the minimal value of Battery Saver schedule from 10 to 5%" This reverts commit f315f2ecc7e50e6bbd7c034a02f2191baf7335d1. --- .../BatterySaverScheduleRadioButtonsController.java | 4 ++-- .../batterysaver/BatterySaverScheduleSeekBarController.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java index 41a9b60f908..378918a50eb 100644 --- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java +++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleRadioButtonsController.java @@ -40,7 +40,7 @@ public class BatterySaverScheduleRadioButtonsController { public static final String KEY_NO_SCHEDULE = "key_battery_saver_no_schedule"; public static final String KEY_ROUTINE = "key_battery_saver_routine"; public static final String KEY_PERCENTAGE = "key_battery_saver_percentage"; - public static final int TRIGGER_LEVEL_DEFAULT = 10; + public static final int TRIGGER_LEVEL_MIN = 10; private Context mContext; private BatterySaverScheduleSeekBarController mSeekBarController; @@ -82,7 +82,7 @@ public boolean setDefaultKey(String key) { case KEY_NO_SCHEDULE: break; case KEY_PERCENTAGE: - triggerLevel = TRIGGER_LEVEL_DEFAULT; + triggerLevel = TRIGGER_LEVEL_MIN; confirmationExtras.putBoolean(BatterySaverUtils.EXTRA_CONFIRM_TEXT_ONLY, true); confirmationExtras.putInt(BatterySaverUtils.EXTRA_POWER_SAVE_MODE_TRIGGER, PowerManager.POWER_SAVE_MODE_TRIGGER_PERCENTAGE); diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java index d492cbcd86d..a441449ba55 100644 --- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java +++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java @@ -45,7 +45,7 @@ public class BatterySaverScheduleSeekBarController implements OnPreferenceChangeListener { public static final int MAX_SEEKBAR_VALUE = 15; - public static final int MIN_SEEKBAR_VALUE = 1; // percentage value == (seekbar value * 5) + public static final int MIN_SEEKBAR_VALUE = 2; public static final String KEY_BATTERY_SAVER_SEEK_BAR = "battery_saver_seek_bar"; @VisibleForTesting From 8c53bb464fb3af87321c4367cb99081096a17dda Mon Sep 17 00:00:00 2001 From: r3g_5z Date: Sun, 22 Jan 2023 18:53:14 -0500 Subject: [PATCH 070/100] do not allow disabling GrapheneOS Camera Since Android 11, only the system camera app is allowed to provide system media capture intents for images and video. Other apps depend on this functionality being available and users will not realize that only system camera apps can provide it. Signed-off-by: r3g_5z --- .../applications/appinfo/AppButtonsPreferenceController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java index 7c6653edb32..122410b4a57 100644 --- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java @@ -627,6 +627,7 @@ boolean handleDisableable() { if (mHomePackages.contains(mAppEntry.info.packageName) || mAppEntry.info.packageName.equals("com.android.inputmethod.latin") || mAppEntry.info.packageName.equals("app.vanadium.webview") + || mAppEntry.info.packageName.equals("app.grapheneos.camera") || mAppEntry.info.packageName.equals(GmsCompatApp.PKG_NAME) || mAppEntry.info.packageName.equals(GmsCompatApp.PKG_NAME + ".config") || isSystemPackage(mActivity.getResources(), mPm, mPackageInfo)) { From 1b41ca759c51ae6c4faf4099ede7ac080df6af5c Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Fri, 27 Jan 2023 10:33:22 +0200 Subject: [PATCH 071/100] bugfix: non-disableable packages couldn't be enabled from UI --- .../applications/ApplicationFeatureProviderImpl.java | 7 +++++++ .../appinfo/AppButtonsPreferenceController.java | 5 ----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java index 5b74a8884aa..46c83a225e5 100644 --- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java @@ -183,6 +183,13 @@ private Set getEnabledPackageAllowlist() { if (mPm.getWellbeingPackageName() != null) { keepEnabledPackages.add(mPm.getWellbeingPackageName()); } + + keepEnabledPackages.add("com.android.inputmethod.latin"); + keepEnabledPackages.add("app.vanadium.webview"); + keepEnabledPackages.add("app.grapheneos.camera"); + keepEnabledPackages.add(com.android.internal.gmscompat.GmsCompatApp.PKG_NAME); + keepEnabledPackages.add(com.android.internal.gmscompat.GmsCompatApp.PKG_NAME + ".config"); + return keepEnabledPackages; } diff --git a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java index 122410b4a57..71c51136d04 100644 --- a/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java +++ b/src/com/android/settings/applications/appinfo/AppButtonsPreferenceController.java @@ -625,11 +625,6 @@ boolean handleDisableable() { // by not allowing disabling of apps signed with the // system cert and any launcher app in the system. if (mHomePackages.contains(mAppEntry.info.packageName) - || mAppEntry.info.packageName.equals("com.android.inputmethod.latin") - || mAppEntry.info.packageName.equals("app.vanadium.webview") - || mAppEntry.info.packageName.equals("app.grapheneos.camera") - || mAppEntry.info.packageName.equals(GmsCompatApp.PKG_NAME) - || mAppEntry.info.packageName.equals(GmsCompatApp.PKG_NAME + ".config") || isSystemPackage(mActivity.getResources(), mPm, mPackageInfo)) { // Disable button for core system applications. mButtonsPref.setButton2Text(R.string.disable_text) From 172dbcae5791ed74f97cded3cf2ad733adeb4913 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Fri, 10 Feb 2023 12:44:30 +0200 Subject: [PATCH 072/100] add a toggle for forcibly disabling SUPL --- res/values/strings.xml | 3 ++ res/xml/location_settings.xml | 7 +++ .../ForceDisableSuplPrefController.java | 45 +++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 src/com/android/settings/location/ForceDisableSuplPrefController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index e2525a507b2..675eebe6d29 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14580,4 +14580,7 @@ Allow Sensors permission to apps by default Sensors is a non-standard permission, apps may malfunction if it’s denied. A permission prompt will be shown when an app tries to access sensors. Note that some apps may need to be manually restarted after allowing the Sensors permission. + + Force disable Secure User Plane Location (SUPL) + Always disable SUPL assisted location support regardless of carrier configuration (does not disable control plane A-GNSS and GrapheneOS does not send IMSI to the SUPL) diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml index fe87efd73d7..74502a7d582 100644 --- a/res/xml/location_settings.xml +++ b/res/xml/location_settings.xml @@ -66,6 +66,13 @@ android:title="@string/location_services_preference_title" settings:controller="com.android.settings.location.LocationServicesPreferenceController"/> + + + Date: Sun, 12 Feb 2023 20:21:09 +0200 Subject: [PATCH 073/100] add a separate file for non-AOSP strings --- res/values/strings_ext.xml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 res/values/strings_ext.xml diff --git a/res/values/strings_ext.xml b/res/values/strings_ext.xml new file mode 100644 index 00000000000..6da1fca2c7a --- /dev/null +++ b/res/values/strings_ext.xml @@ -0,0 +1,6 @@ + + + + + + From e385a6589e1c9a463dba2b5fb13fab060eaa413b Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Sun, 12 Feb 2023 19:43:44 +0200 Subject: [PATCH 074/100] add base class for ListPreference controllers --- .../ext/AbstractListPreferenceController.java | 150 ++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 src/com/android/settings/ext/AbstractListPreferenceController.java diff --git a/src/com/android/settings/ext/AbstractListPreferenceController.java b/src/com/android/settings/ext/AbstractListPreferenceController.java new file mode 100644 index 00000000000..f4179c49cbb --- /dev/null +++ b/src/com/android/settings/ext/AbstractListPreferenceController.java @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2022 GrapheneOS + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.android.settings.ext; + +import android.content.Context; +import android.text.format.DateUtils; +import android.util.SparseIntArray; + +import androidx.annotation.StringRes; +import androidx.preference.ListPreference; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; + +import com.android.settings.core.BasePreferenceController; + +import java.util.ArrayList; +import java.util.concurrent.TimeUnit; + +public abstract class AbstractListPreferenceController extends BasePreferenceController + implements Preference.OnPreferenceChangeListener { + + private ListPreference preference; + private Entries entries; + // current preference value is prepended to the baseSummary + private CharSequence baseSummary; + + protected AbstractListPreferenceController(Context ctx, String key) { + super(ctx, key); + } + + // call entries.add(entryName, entryValue) to add entries. + // entryValues can be mapped from other values or sets of values, as long as getCurrentValue() + // and setValue() methods are consistent + protected abstract void getEntries(Entries entries); + + protected abstract int getCurrentValue(); + protected abstract boolean setValue(int val); + + @Override + public void displayPreference(PreferenceScreen screen) { + super.displayPreference(screen); + + ListPreference p = screen.findPreference(mPreferenceKey); + if (p == null) { + return; + } + + this.preference = p; + + if (p.getEntries() == null) { + if (entries == null) { + entries = new Entries(mContext); + getEntries(entries); + } + + baseSummary = p.getSummary(); + + p.setSingleLineTitle(false); + p.setEntries(entries.getTitles()); + p.setEntryValues(entries.getValues()); + p.setPersistent(false); + p.setOnPreferenceChangeListener(this); + } + + updatePreference(); + } + + void updatePreference() { + ListPreference p = preference; + if (p == null) { + return; + } + + int idx = entries.getIndexForValue(getCurrentValue()); + if (idx >= 0) { + p.setValueIndex(idx); + + var summary = new StringBuilder(); + summary.append("[ "); + summary.append(p.getEntries()[idx]); + summary.append(" ]"); + if (baseSummary != null) { + summary.append("\n\n"); + summary.append(baseSummary); + } + p.setSummary(summary.toString()); + } + } + + @Override + public boolean onPreferenceChange(Preference preference, Object o) { + int val = Integer.parseInt((String) o); + return setValue(val); + } + + public static class Entries { + private final Context context; + private final ArrayList titles = new ArrayList<>(); + private final ArrayList values = new ArrayList<>(); + private final SparseIntArray valueToIndexMap = new SparseIntArray(); + + Entries(Context context) { + this.context = context; + } + + public void add(@StringRes int title, int value) { + add(context.getText(title), value); + } + + public void add(int duration, TimeUnit timeUnit) { + long durationMillis = timeUnit.toMillis(duration); + if (durationMillis > Integer.MAX_VALUE) { + throw new IllegalArgumentException(); + } + + add(DateUtils.formatDuration(durationMillis), (int) durationMillis); + } + + public void add(CharSequence title, int value) { + titles.add(title); + values.add(Integer.toString(value)); + valueToIndexMap.put(value, values.size() - 1); + } + + public CharSequence[] getTitles() { + return titles.toArray(CharSequence[]::new); + } + + public String[] getValues() { + return values.toArray(String[]::new); + } + + public int getIndexForValue(int val) { + return valueToIndexMap.get(val, -1); + } + } + + @Override + public boolean isSliceable() { + return false; + } + + @Override + public int getSliceHighlightMenuRes() { + return NO_RES; + } +} From 3e3330bbef3f1755cd74e8e1701f3fb5e6f990c1 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Sun, 12 Feb 2023 19:44:15 +0200 Subject: [PATCH 075/100] add base class for IntSetting preference controllers --- .../ext/IntSettingPrefController.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/com/android/settings/ext/IntSettingPrefController.java diff --git a/src/com/android/settings/ext/IntSettingPrefController.java b/src/com/android/settings/ext/IntSettingPrefController.java new file mode 100644 index 00000000000..fb7574fa4e7 --- /dev/null +++ b/src/com/android/settings/ext/IntSettingPrefController.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2022 GrapheneOS + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.android.settings.ext; + +import android.content.Context; +import android.ext.settings.IntSetting; +import android.ext.settings.Setting; +import android.os.Process; + +import androidx.annotation.NonNull; +import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.LifecycleOwner; + +import java.util.function.Consumer; + +public abstract class IntSettingPrefController extends AbstractListPreferenceController + implements DefaultLifecycleObserver, Consumer +{ + private final IntSetting setting; + + protected IntSettingPrefController(Context ctx, String key, IntSetting setting) { + super(ctx, key); + this.setting = setting; + } + + @Override + public int getAvailabilityStatus() { + if (setting.getScope() == Setting.Scope.GLOBAL) { + if (!Process.myUserHandle().isSystem()) { + return DISABLED_FOR_USER; + } + } + return AVAILABLE; + } + + @Override + protected final int getCurrentValue() { + return setting.get(mContext); + } + + @Override + protected final boolean setValue(int val) { + return setting.put(mContext, val); + } + + private Object observer; + + @Override + public void onResume(@NonNull LifecycleOwner owner) { + if (setting.canObserveState()) { + observer = setting.registerObserver(mContext, this, mContext.getMainThreadHandler()); + } + } + + // called by the setting observer + @Override + public void accept(IntSetting intSetting) { + updatePreference(); + } + + @Override + public void onPause(@NonNull LifecycleOwner owner) { + if (setting.canObserveState()) { + setting.unregisterObserver(mContext, observer); + } + } +} From 934e8eeb99394c1f7e00d4273f949bc0cc5ccdd0 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Tue, 14 Feb 2023 08:45:56 +0200 Subject: [PATCH 076/100] add base class for toggle preference controllers --- .../ext/AbstractTogglePrefController.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/com/android/settings/ext/AbstractTogglePrefController.java diff --git a/src/com/android/settings/ext/AbstractTogglePrefController.java b/src/com/android/settings/ext/AbstractTogglePrefController.java new file mode 100644 index 00000000000..db55c88384a --- /dev/null +++ b/src/com/android/settings/ext/AbstractTogglePrefController.java @@ -0,0 +1,38 @@ +package com.android.settings.ext; + +import android.content.Context; + +import androidx.annotation.Nullable; +import androidx.preference.Preference; + +import com.android.settings.core.TogglePreferenceController; + +public abstract class AbstractTogglePrefController extends TogglePreferenceController { + + AbstractTogglePrefController(Context ctx, String key) { + super(ctx, key); + } + + @Nullable protected Preference preference; + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + + if (preference != this.preference) { + preference.setSingleLineTitle(false); + preference.setPersistent(false); + this.preference = preference; + } + } + + @Override + public boolean isSliceable() { + return false; + } + + @Override + public int getSliceHighlightMenuRes() { + return NO_RES; + } +} From e7be80f6bfbc130957f76135b079c586d11ad8a8 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Sun, 12 Feb 2023 19:44:07 +0200 Subject: [PATCH 077/100] add base class for BoolSetting preference controllers If no customization is needed, base class can be used directly from XML by adding settings:boolSettingField=" " to the preference XML definition. --- res/values/attrs.xml | 2 + .../core/PreferenceControllerListHelper.java | 3 + .../core/PreferenceXmlParserUtils.java | 12 ++ .../ext/BoolSettingPrefController.java | 103 ++++++++++++++++++ 4 files changed, 120 insertions(+) create mode 100644 src/com/android/settings/ext/BoolSettingPrefController.java diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 307871716aa..4b59dd9768f 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -68,6 +68,8 @@ + + diff --git a/src/com/android/settings/core/PreferenceControllerListHelper.java b/src/com/android/settings/core/PreferenceControllerListHelper.java index 6d450fe137f..18e67982583 100644 --- a/src/com/android/settings/core/PreferenceControllerListHelper.java +++ b/src/com/android/settings/core/PreferenceControllerListHelper.java @@ -28,6 +28,7 @@ import android.util.Log; import com.android.settings.core.PreferenceXmlParserUtils.MetadataFlag; +import com.android.settings.ext.BoolSettingPrefController; import com.android.settingslib.core.AbstractPreferenceController; import org.xmlpull.v1.XmlPullParserException; @@ -56,6 +57,7 @@ public static List getPreferenceControllersFromXml(Con try { preferenceMetadata = PreferenceXmlParserUtils.extractMetadata(context, xmlResId, MetadataFlag.FLAG_NEED_KEY | MetadataFlag.FLAG_NEED_PREF_CONTROLLER + | MetadataFlag.FLAG_NEED_BOOL_SETTING_FIELD | MetadataFlag.FLAG_INCLUDE_PREF_SCREEN | MetadataFlag.FLAG_FOR_WORK); } catch (IOException | XmlPullParserException e) { Log.e(TAG, "Failed to parse preference xml for getting controllers", e); @@ -65,6 +67,7 @@ public static List getPreferenceControllersFromXml(Con for (Bundle metadata : preferenceMetadata) { final String controllerName = metadata.getString(METADATA_CONTROLLER); if (TextUtils.isEmpty(controllerName)) { + BoolSettingPrefController.maybeAdd(context, metadata, controllers); continue; } BasePreferenceController controller; diff --git a/src/com/android/settings/core/PreferenceXmlParserUtils.java b/src/com/android/settings/core/PreferenceXmlParserUtils.java index a1a8d6731a7..d9a1c397b64 100644 --- a/src/com/android/settings/core/PreferenceXmlParserUtils.java +++ b/src/com/android/settings/core/PreferenceXmlParserUtils.java @@ -68,6 +68,7 @@ public class PreferenceXmlParserUtils { MetadataFlag.FLAG_NEED_KEY, MetadataFlag.FLAG_NEED_PREF_TYPE, MetadataFlag.FLAG_NEED_PREF_CONTROLLER, + MetadataFlag.FLAG_NEED_BOOL_SETTING_FIELD, MetadataFlag.FLAG_NEED_PREF_TITLE, MetadataFlag.FLAG_NEED_PREF_SUMMARY, MetadataFlag.FLAG_NEED_PREF_ICON, @@ -91,11 +92,14 @@ public class PreferenceXmlParserUtils { int FLAG_UNAVAILABLE_SLICE_SUBTITLE = 1 << 11; int FLAG_FOR_WORK = 1 << 12; int FLAG_NEED_HIGHLIGHTABLE_MENU_KEY = 1 << 13; + + int FLAG_NEED_BOOL_SETTING_FIELD = 1 << 30; } public static final String METADATA_PREF_TYPE = "type"; public static final String METADATA_KEY = "key"; public static final String METADATA_CONTROLLER = "controller"; + public static final String METADATA_BOOL_SETTING_FIELD = "bool_setting_field"; public static final String METADATA_TITLE = "title"; public static final String METADATA_SUMMARY = "summary"; public static final String METADATA_ICON = "icon"; @@ -225,6 +229,10 @@ public static List extractMetadata(Context context, @XmlRes int xmlResId preferenceMetadata.putString(METADATA_CONTROLLER, getController(preferenceAttributes)); } + if (hasFlag(flags, MetadataFlag.FLAG_NEED_BOOL_SETTING_FIELD)) { + preferenceMetadata.putString(METADATA_BOOL_SETTING_FIELD, + getBoolSettingField(preferenceAttributes)); + } if (hasFlag(flags, MetadataFlag.FLAG_NEED_PREF_TITLE)) { preferenceMetadata.putString(METADATA_TITLE, getTitle(preferenceAttributes)); } @@ -321,6 +329,10 @@ private static String getController(TypedArray styledAttributes) { return styledAttributes.getString(R.styleable.Preference_controller); } + private static String getBoolSettingField(TypedArray styledAttributes) { + return styledAttributes.getString(R.styleable.Preference_boolSettingField); + } + private static String getHighlightableMenuKey(TypedArray styledAttributes) { return styledAttributes.getString(R.styleable.Preference_highlightableMenuKey); } diff --git a/src/com/android/settings/ext/BoolSettingPrefController.java b/src/com/android/settings/ext/BoolSettingPrefController.java new file mode 100644 index 00000000000..3a37f99f78e --- /dev/null +++ b/src/com/android/settings/ext/BoolSettingPrefController.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2022 GrapheneOS + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.android.settings.ext; + +import android.content.Context; +import android.ext.settings.BoolSetting; +import android.ext.settings.Setting; +import android.os.Bundle; +import android.os.Process; + +import androidx.annotation.NonNull; +import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.LifecycleOwner; + +import com.android.settings.core.BasePreferenceController; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; + +import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_BOOL_SETTING_FIELD; +import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_KEY; + +public class BoolSettingPrefController extends AbstractTogglePrefController + implements DefaultLifecycleObserver, Consumer { + private final BoolSetting setting; + + protected BoolSettingPrefController(Context ctx, String key, BoolSetting setting) { + super(ctx, key); + this.setting = setting; + } + + @Override + public int getAvailabilityStatus() { + if (setting.getScope() != Setting.Scope.PER_USER) { + if (!Process.myUserHandle().isSystem()) { + return DISABLED_FOR_USER; + } + } + return AVAILABLE; + } + + @Override + public final boolean isChecked() { + return setting.get(mContext); + } + + @Override + public final boolean setChecked(boolean isChecked) { + return setting.put(mContext, isChecked); + } + + private Object observer; + + @Override + public void onResume(@NonNull LifecycleOwner owner) { + if (setting.canObserveState()) { + observer = setting.registerObserver(mContext, this, mContext.getMainThreadHandler()); + } + } + + // called by the setting observer + @Override + public void accept(BoolSetting boolSetting) { + if (preference != null) { + updateState(preference); + } + } + + @Override + public void onPause(@NonNull LifecycleOwner owner) { + if (setting.canObserveState()) { + setting.unregisterObserver(mContext, observer); + } + } + + // called when PreferenceScreen XML is parsed + public static void maybeAdd(Context context, Bundle metadata, + List dest) { + String boolSettingField = metadata.getString(METADATA_BOOL_SETTING_FIELD); + if (boolSettingField == null) { + return; + } + String[] split = boolSettingField.split(" "); + + BoolSetting boolSetting; + try { + Class c = Class.forName(split[0]); + Field field = c.getField(split[1]); + boolSetting = (BoolSetting) Objects.requireNonNull(field.get(null)); + } catch (Exception e) { + throw new IllegalStateException("Invalid BoolSetting field " + boolSettingField); + } + + String key = Objects.requireNonNull(metadata.getString(METADATA_KEY)); + + dest.add(new BoolSettingPrefController(context, key, boolSetting)); + } +} From b684339682e6bb9ed86b196b77a3915681456f9d Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Tue, 14 Feb 2023 09:53:06 +0200 Subject: [PATCH 078/100] Revert "add a toggle for auto-grants of OTHER_SENSORS permission" This reverts commit 8888df44 --- res/values/strings.xml | 4 -- res/xml/privacy_dashboard_settings.xml | 8 ---- ...tOtherSensorsPermissionPrefController.java | 41 ------------------- 3 files changed, 53 deletions(-) delete mode 100644 src/com/android/settings/privacy/AutoGrantOtherSensorsPermissionPrefController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 675eebe6d29..a323966a430 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14577,10 +14577,6 @@ Installed: %1$s Updated: %1$s - Allow Sensors permission to apps by default - Sensors is a non-standard permission, apps may malfunction if it’s denied. - A permission prompt will be shown when an app tries to access sensors. Note that some apps may need to be manually restarted after allowing the Sensors permission. - Force disable Secure User Plane Location (SUPL) Always disable SUPL assisted location support regardless of carrier configuration (does not disable control plane A-GNSS and GrapheneOS does not send IMSI to the SUPL) diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml index 9a363dfb899..87b16cf09bf 100644 --- a/res/xml/privacy_dashboard_settings.xml +++ b/res/xml/privacy_dashboard_settings.xml @@ -75,14 +75,6 @@ android:summary="@string/mic_toggle_description" settings:controller="com.android.settings.privacy.MicToggleController"/> - - Date: Tue, 14 Feb 2023 10:05:57 +0200 Subject: [PATCH 079/100] add a toggle for auto-grants of OTHER_SENSORS permission --- res/values/strings_ext.xml | 4 +++- res/xml/privacy_dashboard_settings.xml | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/res/values/strings_ext.xml b/res/values/strings_ext.xml index 6da1fca2c7a..8b343fdd614 100644 --- a/res/values/strings_ext.xml +++ b/res/values/strings_ext.xml @@ -1,6 +1,8 @@ - + Allow Sensors permission to apps by default + Sensors is a non-standard permission, apps may malfunction if it’s denied. + A permission prompt will be shown when an app tries to access sensors. Note that some apps may need to be manually restarted after allowing the Sensors permission. diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml index 87b16cf09bf..fe2667dbc78 100644 --- a/res/xml/privacy_dashboard_settings.xml +++ b/res/xml/privacy_dashboard_settings.xml @@ -75,6 +75,13 @@ android:summary="@string/mic_toggle_description" settings:controller="com.android.settings.privacy.MicToggleController"/> + + Date: Tue, 14 Feb 2023 10:21:20 +0200 Subject: [PATCH 080/100] Revert "add keyguard camera toggle setting" This reverts commit 409f133a --- res/values/strings.xml | 2 - res/xml/security_dashboard_settings.xml | 6 -- .../KeyguardCameraPreferenceController.java | 97 ------------------- .../settings/security/SecuritySettings.java | 1 - 4 files changed, 106 deletions(-) delete mode 100644 src/com/android/settings/security/KeyguardCameraPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index a323966a430..c83cd0f3f1a 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14534,8 +14534,6 @@ Auto reboot Automatically reboot the device, if the phone hasn\'t been unlocked within the selected number of hours. Control support for USB peripherals such as input (mice, keyboards, joysticks) and storage devices. - Screen lock camera access - Allow camera access when the device is locked Enable secure app spawning Launch apps in a more secure way than Android which takes slightly longer and increases memory usage by app processes. Enable native code debugging diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index a1e7e3bc9c0..85c32b38a44 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -83,12 +83,6 @@ android:summary="@string/scramble_pin_summary" android:persistent="false" /> - - buildPreferenceControllers(Con securityPreferenceControllers.add(new PinScramblePreferenceController(context)); securityPreferenceControllers.add(new AutoRebootPreferenceController(context)); securityPreferenceControllers.add(new DenyNewUsbPreferenceController(context)); - securityPreferenceControllers.add(new KeyguardCameraPreferenceController(context)); securityPreferenceControllers.add(new ExecSpawnPreferenceController(context)); securityPreferenceControllers.add(new NativeDebugPreferenceController(context)); controllers.add(new PreferenceCategoryController(context, SECURITY_CATEGORY) From ad446bac49f9fa1d43e6658baa5385adbb60b4c4 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Tue, 14 Feb 2023 10:27:56 +0200 Subject: [PATCH 081/100] add a toggle for camera access from the lock screen --- res/values/strings_ext.xml | 3 +++ res/xml/security_dashboard_settings.xml | 9 ++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/res/values/strings_ext.xml b/res/values/strings_ext.xml index 8b343fdd614..ef714ee39ca 100644 --- a/res/values/strings_ext.xml +++ b/res/values/strings_ext.xml @@ -1,6 +1,9 @@ + Screen lock camera access + Allow camera access when the device is locked + Allow Sensors permission to apps by default Sensors is a non-standard permission, apps may malfunction if it’s denied. A permission prompt will be shown when an app tries to access sensors. Note that some apps may need to be manually restarted after allowing the Sensors permission. diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index 85c32b38a44..0cbd68cc552 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -48,7 +48,7 @@ android:title="@string/security_settings_face_preference_title" android:summary="@string/summary_placeholder" settings:keywords="@string/keywords_face_settings" /> - + + + Date: Tue, 14 Feb 2023 11:05:26 +0200 Subject: [PATCH 082/100] Revert "add auto-reboot setting" This reverts commit 06081b60 --- res/values/arrays.xml | 31 ------- res/values/strings.xml | 2 - res/xml/security_dashboard_settings.xml | 8 -- .../AutoRebootPreferenceController.java | 82 ------------------- .../settings/security/SecuritySettings.java | 1 - 5 files changed, 124 deletions(-) delete mode 100644 src/com/android/settings/security/AutoRebootPreferenceController.java diff --git a/res/values/arrays.xml b/res/values/arrays.xml index ce94c33877e..f80256af4f6 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -224,37 +224,6 @@ 30 minutes - - - Off - 10 minutes - 30 minutes - 1 hour - 2 hours - 4 hours - 8 hours - 12 hours - 24 hours - 36 hours - 48 hours - 72 hours - - - - 0 - 600000 - 1800000 - 3600000 - 7200000 - 14400000 - 28800000 - 43200000 - 86400000 - 129600000 - 172800000 - 259200000 - - Deny new USB peripherals Allow new USB peripherals when unlocked diff --git a/res/values/strings.xml b/res/values/strings.xml index c83cd0f3f1a..8644d7534c5 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14531,8 +14531,6 @@ PIN scrambling Controls PIN scrambling option when inputting PIN on screen lock. USB accessories - Auto reboot - Automatically reboot the device, if the phone hasn\'t been unlocked within the selected number of hours. Control support for USB peripherals such as input (mice, keyboards, joysticks) and storage devices. Enable secure app spawning Launch apps in a more secure way than Android which takes slightly longer and increases memory usage by app processes. diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index 0cbd68cc552..751e55f4aed 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -49,14 +49,6 @@ android:summary="@string/summary_placeholder" settings:keywords="@string/keywords_face_settings" /> - - buildPreferenceControllers(Con context, lifecycle)); securityPreferenceControllers.add(new ChangeScreenLockPreferenceController(context, host)); securityPreferenceControllers.add(new PinScramblePreferenceController(context)); - securityPreferenceControllers.add(new AutoRebootPreferenceController(context)); securityPreferenceControllers.add(new DenyNewUsbPreferenceController(context)); securityPreferenceControllers.add(new ExecSpawnPreferenceController(context)); securityPreferenceControllers.add(new NativeDebugPreferenceController(context)); From 4297966e4bca81f7233e653a16c20e5041b6c7a5 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Tue, 14 Feb 2023 11:23:29 +0200 Subject: [PATCH 083/100] add auto-reboot setting --- res/values/strings_ext.xml | 3 ++ res/xml/security_dashboard_settings.xml | 6 ++++ .../security/AutoRebootPrefController.java | 34 +++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 src/com/android/settings/security/AutoRebootPrefController.java diff --git a/res/values/strings_ext.xml b/res/values/strings_ext.xml index ef714ee39ca..07f59a2db7a 100644 --- a/res/values/strings_ext.xml +++ b/res/values/strings_ext.xml @@ -8,4 +8,7 @@ Sensors is a non-standard permission, apps may malfunction if it’s denied. A permission prompt will be shown when an app tries to access sensors. Note that some apps may need to be manually restarted after allowing the Sensors permission. + Auto reboot + Automatically reboot the device if it hasn\'t been unlocked within the selected duration of time + diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index 751e55f4aed..ef1d2a9d335 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -49,6 +49,12 @@ android:summary="@string/summary_placeholder" settings:keywords="@string/keywords_face_settings" /> + + Date: Thu, 16 Feb 2023 11:14:52 +0200 Subject: [PATCH 084/100] fix accessibility settings links in SetupWizard These fragments depend on SettingsGoogle components that are missing from AOSP Settings. --- ...xtReadingPreferenceFragmentForSetupWizard.java | 15 --------------- ...ificationPreferenceFragmentForSetupWizard.java | 15 --------------- ...eenReaderPreferenceFragmentForSetupWizard.java | 14 -------------- 3 files changed, 44 deletions(-) diff --git a/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java index 6ead3907a28..95b7e867707 100644 --- a/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java +++ b/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java @@ -43,24 +43,9 @@ public class TextReadingPreferenceFragmentForSetupWizard extends TextReadingPref public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - final GlifPreferenceLayout layout = (GlifPreferenceLayout) view; - final String title = getContext().getString( - R.string.accessibility_text_reading_options_title); - final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility); - icon.setTintList(Utils.getColorAttr(getContext(), android.R.attr.colorPrimary)); - AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title, - /* description= */ null, icon); - updateResetButtonPadding(); } - @Override - public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, - Bundle savedInstanceState) { - final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent; - return layout.onCreateRecyclerView(inflater, parent, savedInstanceState); - } - @Override public int getMetricsCategory() { return SettingsEnums.SUW_ACCESSIBILITY_TEXT_READING_OPTIONS; diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java index 12a988603d8..2f7c21c6ebf 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java @@ -36,14 +36,6 @@ public class ToggleScreenMagnificationPreferenceFragmentForSetupWizard public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - final GlifPreferenceLayout layout = (GlifPreferenceLayout) view; - final String title = getContext().getString( - R.string.accessibility_screen_magnification_title); - final String description = getContext().getString( - R.string.accessibility_screen_magnification_intro_text); - final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility); - AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title, - description, icon); hidePreferenceSettingComponents(); } @@ -65,13 +57,6 @@ private void hidePreferenceSettingComponents() { } } - @Override - public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, - Bundle savedInstanceState) { - final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent; - return layout.onCreateRecyclerView(inflater, parent, savedInstanceState); - } - @Override public int getMetricsCategory() { return SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION; diff --git a/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java index f9a1113c054..497b27a3c01 100644 --- a/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java +++ b/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java @@ -38,26 +38,12 @@ public class ToggleScreenReaderPreferenceFragmentForSetupWizard public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - final GlifPreferenceLayout layout = (GlifPreferenceLayout) view; - final String title = getArguments().getString(AccessibilitySettings.EXTRA_TITLE); - final String description = getContext().getString(R.string.talkback_summary); - final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility); - AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title, - description, icon); - mToggleSwitchWasInitiallyChecked = mToggleServiceSwitchPreference.isChecked(); if (mTopIntroPreference != null) { mTopIntroPreference.setVisible(false); } } - @Override - public RecyclerView onCreateRecyclerView(LayoutInflater inflater, ViewGroup parent, - Bundle savedInstanceState) { - final GlifPreferenceLayout layout = (GlifPreferenceLayout) parent; - return layout.onCreateRecyclerView(inflater, parent, savedInstanceState); - } - @Override public int getMetricsCategory() { return SettingsEnums.SUW_ACCESSIBILITY_TOGGLE_SCREEN_READER; From 7a98ab50b5d47d323acbe013f7865700b144d722 Mon Sep 17 00:00:00 2001 From: r3g_5z Date: Sat, 18 Feb 2023 11:05:36 -0500 Subject: [PATCH 085/100] Revert "Add toggle for screenshot timestamp EXIF metadata" This reverts commit 8df8863713aa7eb130e521baad848c4dded5757c. --- res/values/strings.xml | 3 - res/xml/privacy_dashboard_settings.xml | 8 --- ...shotTimestampExifPreferenceController.java | 63 ------------------- 3 files changed, 74 deletions(-) delete mode 100644 src/com/android/settings/privacy/ScreenshotTimestampExifPreferenceController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 8644d7534c5..a4c29884692 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14555,9 +14555,6 @@ Enable privileged eSIM management Requires Sandboxed Google Play installation - Save screenshot timestamp to EXIF - Enables adding a timestamp to screenshot EXIF metadata - Charge other devices by placing them on the back of your phone Battery share diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml index fe2667dbc78..9a85ddf924e 100644 --- a/res/xml/privacy_dashboard_settings.xml +++ b/res/xml/privacy_dashboard_settings.xml @@ -82,14 +82,6 @@ android:summaryOff="@string/auto_grant_OTHER_SENSORS_permission_summary_off" settings:boolSettingField="android.ext.settings.ExtSettings AUTO_GRANT_OTHER_SENSORS_PERMISSION"/> - - - Date: Sat, 18 Feb 2023 11:09:31 -0500 Subject: [PATCH 086/100] Add toggle for screenshot timestamp EXIF metadata Signed-off-by: r3g_5z --- res/values/strings_ext.xml | 3 +++ res/xml/privacy_dashboard_settings.xml | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/res/values/strings_ext.xml b/res/values/strings_ext.xml index 07f59a2db7a..20583869a81 100644 --- a/res/values/strings_ext.xml +++ b/res/values/strings_ext.xml @@ -11,4 +11,7 @@ Auto reboot Automatically reboot the device if it hasn\'t been unlocked within the selected duration of time + Save screenshot timestamp to EXIF + Enables adding a timestamp to screenshot EXIF metadata + diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml index 9a85ddf924e..7bd0dc1cc0e 100644 --- a/res/xml/privacy_dashboard_settings.xml +++ b/res/xml/privacy_dashboard_settings.xml @@ -82,6 +82,13 @@ android:summaryOff="@string/auto_grant_OTHER_SENSORS_permission_summary_off" settings:boolSettingField="android.ext.settings.ExtSettings AUTO_GRANT_OTHER_SENSORS_PERMISSION"/> + + + Date: Fri, 3 Mar 2023 08:19:11 +0200 Subject: [PATCH 087/100] Revert "add a toggle for forcibly disabling SUPL" This reverts commit 77277345 --- res/values/strings.xml | 3 -- res/xml/location_settings.xml | 7 --- .../ForceDisableSuplPrefController.java | 45 ------------------- 3 files changed, 55 deletions(-) delete mode 100644 src/com/android/settings/location/ForceDisableSuplPrefController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index a4c29884692..331bc1bca5f 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14569,7 +14569,4 @@ Installed: %1$s Updated: %1$s - - Force disable Secure User Plane Location (SUPL) - Always disable SUPL assisted location support regardless of carrier configuration (does not disable control plane A-GNSS and GrapheneOS does not send IMSI to the SUPL) diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml index 74502a7d582..fe87efd73d7 100644 --- a/res/xml/location_settings.xml +++ b/res/xml/location_settings.xml @@ -66,13 +66,6 @@ android:title="@string/location_services_preference_title" settings:controller="com.android.settings.location.LocationServicesPreferenceController"/> - - - Date: Fri, 3 Mar 2023 09:53:21 +0200 Subject: [PATCH 088/100] add GNSS SUPL setting --- res/values/strings_ext.xml | 7 ++++++ res/xml/location_settings.xml | 6 +++++ .../location/GnssSuplPrefController.java | 22 +++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 src/com/android/settings/location/GnssSuplPrefController.java diff --git a/res/values/strings_ext.xml b/res/values/strings_ext.xml index 20583869a81..86284df0c3e 100644 --- a/res/values/strings_ext.xml +++ b/res/values/strings_ext.xml @@ -14,4 +14,11 @@ Save screenshot timestamp to EXIF Enables adding a timestamp to screenshot EXIF metadata + Secure User Plane Location (SUPL) + A-GNSS (assisted satellite geolocation) based on nearby cell towers + + Enabled; GrapheneOS proxy + Enabled; standard server + Disabled + diff --git a/res/xml/location_settings.xml b/res/xml/location_settings.xml index fe87efd73d7..bb88acb197b 100644 --- a/res/xml/location_settings.xml +++ b/res/xml/location_settings.xml @@ -66,6 +66,12 @@ android:title="@string/location_services_preference_title" settings:controller="com.android.settings.location.LocationServicesPreferenceController"/> + + Date: Mon, 13 Mar 2023 23:08:01 +0200 Subject: [PATCH 089/100] fixup! add a toggle for disabling fingerprint unlock --- .../biometrics/fingerprint/FingerprintSettings.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index abe32df5774..3a3b9e13839 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -248,9 +248,7 @@ public void onRemovalError(Fingerprint fp, int errMsgId, } private void updateDialog() { - if (isSfps()) { - setRequireScreenOnToAuthVisibility(); - } + updateFingerprintUnlockCategory(); RenameDialog renameDialog = (RenameDialog) getFragmentManager(). findFragmentByTag(RenameDialog.class.getName()); if (renameDialog != null) { @@ -513,7 +511,7 @@ private PreferenceScreen createPreferenceHierarchy() { }); mFingerprintUnlockCategory.setVisible(false); if (isSfps()) { - setRequireScreenOnToAuthVisibility(); + updateFingerprintUnlockCategory(); } setPreferenceScreen(root); @@ -528,18 +526,21 @@ private PreferenceScreen createPreferenceHierarchy() { getContext().getContentResolver(), Settings.Secure.BIOMETRIC_KEYGUARD_ENABLED, 1) == 1); lockScreenFingerprintPreference.setOnPreferenceChangeListener(this); + + updateFingerprintUnlockCategory(); } return root; } - private void setRequireScreenOnToAuthVisibility() { + private void updateFingerprintUnlockCategory() { int fingerprintsEnrolled = mFingerprintManager.getEnrolledFingerprints(mUserId).size(); final boolean removalInProgress = mRemovalSidecar.inProgress(); // Removing last remaining fingerprint if (fingerprintsEnrolled == 0 && removalInProgress) { mFingerprintUnlockCategory.setVisible(false); } else { + mRequireScreenOnToAuthPreference.setVisible(isSfps()); mFingerprintUnlockCategory.setVisible(true); } } From 0841a8f1fe77ba75d4016f32db6a3db37d815834 Mon Sep 17 00:00:00 2001 From: r3g_5z Date: Sat, 18 Feb 2023 09:31:33 -0500 Subject: [PATCH 090/100] Revert "Make PIN scrambling a SwitchPreference (toggle)" This reverts commit a523a0fd649675cfb66373ebbb7bcf01001a33cc. --- res/values/arrays.xml | 10 ++++++++++ res/xml/security_dashboard_settings.xml | 6 ++++-- .../security/PinScramblePreferenceController.java | 12 ++++++------ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/res/values/arrays.xml b/res/values/arrays.xml index f80256af4f6..4b95d30d889 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -224,6 +224,16 @@ 30 minutes + + Scramble PIN + No PIN scrambling + + + + true + false + + Deny new USB peripherals Allow new USB peripherals when unlocked diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index ef1d2a9d335..d377a0f53a4 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -75,11 +75,13 @@ android:summary="@string/native_debug_summary" android:persistent="false" /> - + android:persistent="false" + android:entries="@array/scramble_pin_entries" + android:entryValues="@array/scramble_pin_values" /> Date: Sat, 18 Feb 2023 09:36:44 -0500 Subject: [PATCH 091/100] Revert "add PIN scrambling setting" This reverts commit d4cf8c3815569c14f3c12f2007dc7f99e1a43b40. --- res/values/arrays.xml | 10 --- res/values/strings.xml | 2 - res/xml/security_dashboard_settings.xml | 10 +-- .../PinScramblePreferenceController.java | 79 ------------------- .../settings/security/SecuritySettings.java | 1 - 5 files changed, 1 insertion(+), 101 deletions(-) delete mode 100644 src/com/android/settings/security/PinScramblePreferenceController.java diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 4b95d30d889..f80256af4f6 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -224,16 +224,6 @@ 30 minutes - - Scramble PIN - No PIN scrambling - - - - true - false - - Deny new USB peripherals Allow new USB peripherals when unlocked diff --git a/res/values/strings.xml b/res/values/strings.xml index 331bc1bca5f..471ac8396d0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14528,8 +14528,6 @@ QR code isn\u0027t a valid format - PIN scrambling - Controls PIN scrambling option when inputting PIN on screen lock. USB accessories Control support for USB peripherals such as input (mice, keyboards, joysticks) and storage devices. Enable secure app spawning diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index d377a0f53a4..e683ff75db6 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -75,14 +75,6 @@ android:summary="@string/native_debug_summary" android:persistent="false" /> - - - + \ No newline at end of file diff --git a/src/com/android/settings/security/PinScramblePreferenceController.java b/src/com/android/settings/security/PinScramblePreferenceController.java deleted file mode 100644 index f4a7ddf8f8c..00000000000 --- a/src/com/android/settings/security/PinScramblePreferenceController.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.android.settings.security; - -import android.content.Context; - -import android.os.UserHandle; -import android.os.UserManager; -import android.os.SystemProperties; - -import android.provider.Settings; - -import androidx.preference.ListPreference; -import androidx.preference.Preference; -import androidx.preference.PreferenceCategory; -import androidx.preference.PreferenceGroup; -import androidx.preference.PreferenceScreen; - -import com.android.internal.widget.LockPatternUtils; -import com.android.settings.core.PreferenceControllerMixin; -import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.core.lifecycle.events.OnResume; - -public class PinScramblePreferenceController extends AbstractPreferenceController - implements PreferenceControllerMixin, OnResume, Preference.OnPreferenceChangeListener { - - private static final String KEY_SCRAMBLE_PIN_LAYOUT = "scramble_pin_layout"; - private static final String PREF_KEY_SECURITY_CATEGORY = "security_category"; - - private PreferenceCategory mSecurityCategory; - private ListPreference mScramblePin; - - public PinScramblePreferenceController(Context context) { - super(context); - } - - @Override - public void displayPreference(PreferenceScreen screen) { - super.displayPreference(screen); - mSecurityCategory = screen.findPreference(PREF_KEY_SECURITY_CATEGORY); - updatePreferenceState(); - } - - @Override - public boolean isAvailable() { - return true; - } - - @Override - public String getPreferenceKey() { - return KEY_SCRAMBLE_PIN_LAYOUT; - } - - // TODO: should we use onCreatePreferences() instead? - private void updatePreferenceState() { - if (mSecurityCategory == null) { - return; - } - mScramblePin = (ListPreference) mSecurityCategory.findPreference(KEY_SCRAMBLE_PIN_LAYOUT); - mScramblePin.setValue(Boolean.toString(Settings.Secure.getInt(mContext.getContentResolver(), Settings.Secure.SCRAMBLE_PIN_LAYOUT, 0) != 0)); - } - - @Override - public void onResume() { - updatePreferenceState(); - if (mScramblePin != null) { - boolean mode = Boolean.parseBoolean(mScramblePin.getValue()); - Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.SCRAMBLE_PIN_LAYOUT, (mode) ? 0 : 1); - } - } - - @Override - public boolean onPreferenceChange(Preference preference, Object value) { - final String key = preference.getKey(); - if (KEY_SCRAMBLE_PIN_LAYOUT.equals(key)) { - boolean mode = Boolean.parseBoolean((String) value); - Settings.Secure.putInt(mContext.getContentResolver(), Settings.Secure.SCRAMBLE_PIN_LAYOUT, (mode) ? 1 : 0); - } - return true; - } -} diff --git a/src/com/android/settings/security/SecuritySettings.java b/src/com/android/settings/security/SecuritySettings.java index 9ae986933b6..d5146cd42f8 100644 --- a/src/com/android/settings/security/SecuritySettings.java +++ b/src/com/android/settings/security/SecuritySettings.java @@ -105,7 +105,6 @@ private static List buildPreferenceControllers(Con securityPreferenceControllers.add(new CombinedBiometricStatusPreferenceController( context, lifecycle)); securityPreferenceControllers.add(new ChangeScreenLockPreferenceController(context, host)); - securityPreferenceControllers.add(new PinScramblePreferenceController(context)); securityPreferenceControllers.add(new DenyNewUsbPreferenceController(context)); securityPreferenceControllers.add(new ExecSpawnPreferenceController(context)); securityPreferenceControllers.add(new NativeDebugPreferenceController(context)); From 3416cf879f585dbb971ba969d715868ff0fa748c Mon Sep 17 00:00:00 2001 From: r3g_5z Date: Sat, 18 Feb 2023 10:08:21 -0500 Subject: [PATCH 092/100] add PIN scrambling setting Signed-off-by: r3g_5z --- res/values/strings_ext.xml | 3 +++ res/xml/security_dashboard_settings.xml | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/res/values/strings_ext.xml b/res/values/strings_ext.xml index 86284df0c3e..8dfe980f9d8 100644 --- a/res/values/strings_ext.xml +++ b/res/values/strings_ext.xml @@ -21,4 +21,7 @@ Enabled; standard server Disabled + PIN scrambling + Controls PIN scrambling option when inputting PIN on screen lock. + diff --git a/res/xml/security_dashboard_settings.xml b/res/xml/security_dashboard_settings.xml index e683ff75db6..7f18d2f417a 100644 --- a/res/xml/security_dashboard_settings.xml +++ b/res/xml/security_dashboard_settings.xml @@ -75,6 +75,12 @@ android:summary="@string/native_debug_summary" android:persistent="false" /> + + Date: Wed, 15 Mar 2023 21:11:12 -0400 Subject: [PATCH 093/100] remove missing display resolution lottie animation AOSP does not provide these similar to the missing quickly open camera lottie animation Signed-off-by: r3g_5z --- src/com/android/settings/display/ScreenResolutionFragment.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/com/android/settings/display/ScreenResolutionFragment.java b/src/com/android/settings/display/ScreenResolutionFragment.java index 7c4b3aeef03..3e713aacbdb 100644 --- a/src/com/android/settings/display/ScreenResolutionFragment.java +++ b/src/com/android/settings/display/ScreenResolutionFragment.java @@ -93,7 +93,6 @@ protected int getPreferenceScreenResId() { @Override protected void addStaticPreferences(PreferenceScreen screen) { - updateIllustrationImage(mImagePreference); screen.addPreference(mImagePreference); final FooterPreference footerPreference = new FooterPreference(screen.getContext()); @@ -207,7 +206,6 @@ protected boolean setDefaultKey(final String key) { } setDisplayMode(width); - updateIllustrationImage(mImagePreference); return true; } From 892ed65c2849a7bf05979ecf4970179186d559a2 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Sun, 19 Mar 2023 18:44:01 +0200 Subject: [PATCH 094/100] revoke Camera permission from Google's eUICC LPA app before enabling it Previously, Camera permission was auto-granted with the FLAG_PERMISSION_SYSTEM_FIXED, which made it unchangeable by the user. Removing FLAG_PERMISSION_USER_FIXED is needed to make sure that the app is always able to show a permission request dialog after being enabled. --- .../settings/network/EuiccCompatController.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/com/android/settings/network/EuiccCompatController.java b/src/com/android/settings/network/EuiccCompatController.java index 6f9f7abaa75..a2894495ea9 100644 --- a/src/com/android/settings/network/EuiccCompatController.java +++ b/src/com/android/settings/network/EuiccCompatController.java @@ -1,5 +1,6 @@ package com.android.settings.network; +import android.Manifest; import android.annotation.Nullable; import android.app.compat.gms.GmsCompat; import android.content.BroadcastReceiver; @@ -10,6 +11,7 @@ import android.os.PatternMatcher; import android.os.Process; import android.os.UserHandle; +import android.permission.PermissionManager; import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleObserver; @@ -70,8 +72,23 @@ public boolean setChecked(boolean isChecked) { int state = isChecked && checkDependencies() ? COMPONENT_ENABLED_STATE_ENABLED : COMPONENT_ENABLED_STATE_DISABLED; + + PermissionManager permissionManager = mContext.getSystemService(PermissionManager.class); + try { for (String pkg : GmsInfo.EUICC_PACKAGES) { + // Previously, Camera permission was auto-granted with the FLAG_PERMISSION_SYSTEM_FIXED, + // which made it unchangeable by the user. + // Removing FLAG_PERMISSION_USER_FIXED is needed to make sure that the app is always + // able to show a permission request dialog after being enabled + if (state == COMPONENT_ENABLED_STATE_ENABLED && "com.google.android.euicc".equals(pkg)) { + UserHandle user = mContext.getUser(); + String perm = Manifest.permission.CAMERA; + permissionManager.revokeRuntimePermission(pkg, perm, user, null); + int permFlagsToRemove = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED + | PackageManager.FLAG_PERMISSION_USER_FIXED; + permissionManager.updatePermissionFlags(pkg, perm, permFlagsToRemove, 0, user); + } packageManager.setApplicationEnabledSetting(pkg, state, 0); } return true; From d42e888199d92bc22f1a23bfb7a0f9217bed77ff Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Mon, 27 Mar 2023 16:32:39 +0300 Subject: [PATCH 095/100] do not allow disabling EuiccSupportPixel --- .../settings/applications/ApplicationFeatureProviderImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java index 46c83a225e5..03c55bd28cf 100644 --- a/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java +++ b/src/com/android/settings/applications/ApplicationFeatureProviderImpl.java @@ -40,6 +40,7 @@ import androidx.annotation.VisibleForTesting; import com.android.internal.telephony.SmsApplication; +import com.android.internal.util.GoogleEuicc; import com.android.settings.R; import java.util.ArrayList; @@ -189,6 +190,8 @@ private Set getEnabledPackageAllowlist() { keepEnabledPackages.add("app.grapheneos.camera"); keepEnabledPackages.add(com.android.internal.gmscompat.GmsCompatApp.PKG_NAME); keepEnabledPackages.add(com.android.internal.gmscompat.GmsCompatApp.PKG_NAME + ".config"); + // handles firmware updates of embedded secure element that is used for eSIM, NFC, Felica etc + keepEnabledPackages.add(GoogleEuicc.EUICC_SUPPORT_PIXEL_PKG_NAME); return keepEnabledPackages; } From 82226d4e8b2e4029949807811cf4369e45ed0572 Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Mon, 27 Mar 2023 16:33:24 +0300 Subject: [PATCH 096/100] fix visibility of AbstractTogglePrefController constructor --- src/com/android/settings/ext/AbstractTogglePrefController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/ext/AbstractTogglePrefController.java b/src/com/android/settings/ext/AbstractTogglePrefController.java index db55c88384a..ceee6984bfd 100644 --- a/src/com/android/settings/ext/AbstractTogglePrefController.java +++ b/src/com/android/settings/ext/AbstractTogglePrefController.java @@ -9,7 +9,7 @@ public abstract class AbstractTogglePrefController extends TogglePreferenceController { - AbstractTogglePrefController(Context ctx, String key) { + protected AbstractTogglePrefController(Context ctx, String key) { super(ctx, key); } From 38a0b70d74a2d60a7bacab0787aec151ed3f4c6c Mon Sep 17 00:00:00 2001 From: Dmitry Muhomor Date: Mon, 27 Mar 2023 16:36:16 +0300 Subject: [PATCH 097/100] reimplement toggle for privileged eSIM management Use it only for controlling the LPA app state, EuiccSupportPixel package is now handled separately. --- res/values/strings.xml | 3 - res/values/strings_ext.xml | 3 + res/xml/network_provider_internet.xml | 2 +- .../network/EuiccCompatController.java | 159 ------------------ .../network/GoogleEuiccLpaController.java | 122 ++++++++++++++ 5 files changed, 126 insertions(+), 163 deletions(-) delete mode 100644 src/com/android/settings/network/EuiccCompatController.java create mode 100644 src/com/android/settings/network/GoogleEuiccLpaController.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 471ac8396d0..9e589574fc4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14550,9 +14550,6 @@ Sandboxed Google Play Sandboxed Google Play (work profile) - Enable privileged eSIM management - Requires Sandboxed Google Play installation - Charge other devices by placing them on the back of your phone Battery share diff --git a/res/values/strings_ext.xml b/res/values/strings_ext.xml index 8dfe980f9d8..15900b20198 100644 --- a/res/values/strings_ext.xml +++ b/res/values/strings_ext.xml @@ -24,4 +24,7 @@ PIN scrambling Controls PIN scrambling option when inputting PIN on screen lock. + Enable privileged eSIM management + Requires sandboxed Google Play installation + diff --git a/res/xml/network_provider_internet.xml b/res/xml/network_provider_internet.xml index d4874831b3e..dde4182f063 100644 --- a/res/xml/network_provider_internet.xml +++ b/res/xml/network_provider_internet.xml @@ -60,7 +60,7 @@ android:icon="@drawable/ic_sim_card" android:order="-14" android:summary="@string/privileged_euicc_management_summary" - settings:controller="com.android.settings.network.EuiccCompatController" + settings:controller="com.android.settings.network.GoogleEuiccLpaController" settings:userRestriction="no_config_mobile_networks"/> directive - return DISABLED_FOR_USER; - } - - return checkDependencies() ? AVAILABLE : DISABLED_DEPENDENT_SETTING; - } - - @Override - public void updateState(Preference preference) { - super.updateState(preference); - preference.setEnabled(getAvailabilityStatus() == AVAILABLE); - } - - @Override - public boolean setChecked(boolean isChecked) { - int state = isChecked && checkDependencies() ? - COMPONENT_ENABLED_STATE_ENABLED : - COMPONENT_ENABLED_STATE_DISABLED; - - PermissionManager permissionManager = mContext.getSystemService(PermissionManager.class); - - try { - for (String pkg : GmsInfo.EUICC_PACKAGES) { - // Previously, Camera permission was auto-granted with the FLAG_PERMISSION_SYSTEM_FIXED, - // which made it unchangeable by the user. - // Removing FLAG_PERMISSION_USER_FIXED is needed to make sure that the app is always - // able to show a permission request dialog after being enabled - if (state == COMPONENT_ENABLED_STATE_ENABLED && "com.google.android.euicc".equals(pkg)) { - UserHandle user = mContext.getUser(); - String perm = Manifest.permission.CAMERA; - permissionManager.revokeRuntimePermission(pkg, perm, user, null); - int permFlagsToRemove = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED - | PackageManager.FLAG_PERMISSION_USER_FIXED; - permissionManager.updatePermissionFlags(pkg, perm, permFlagsToRemove, 0, user); - } - packageManager.setApplicationEnabledSetting(pkg, state, 0); - } - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - private static boolean checkDependencies() { - for (String pkg : GmsInfo.DEPENDENCIES_OF_EUICC_PACKAGES) { - // all dependencies are a part of the GMS suite - if (GmsCompat.isGmsApp(pkg, UserHandle.USER_SYSTEM)) { - continue; - } - return false; - } - return true; - } - - @Override - public int getSliceHighlightMenuRes() { - return R.string.menu_key_network; - } - - @Nullable - TwoStatePreference preference; - - @Override - public void displayPreference(PreferenceScreen screen) { - super.displayPreference(screen); - preference = screen.findPreference(getPreferenceKey()); - } - - private final BroadcastReceiver packageChangeListener = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - var p = preference; - if (p != null) { - p.setEnabled(getAvailabilityStatus() == AVAILABLE); - p.setChecked(isChecked()); - } - } - }; - - @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) - public void onResume() { - var f = new IntentFilter(); - f.addAction(Intent.ACTION_PACKAGE_ADDED); - f.addAction(Intent.ACTION_PACKAGE_CHANGED); - f.addAction(Intent.ACTION_PACKAGE_REMOVED); - f.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED); - - f.addDataScheme("package"); - for (String pkg : GmsInfo.DEPENDENCIES_OF_EUICC_PACKAGES) { - f.addDataSchemeSpecificPart(pkg, PatternMatcher.PATTERN_LITERAL); - } - for (String pkg : GmsInfo.EUICC_PACKAGES) { - f.addDataSchemeSpecificPart(pkg, PatternMatcher.PATTERN_LITERAL); - } - mContext.registerReceiver(packageChangeListener, f); - } - - @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) - public void onPause() { - mContext.unregisterReceiver(packageChangeListener); - } -} diff --git a/src/com/android/settings/network/GoogleEuiccLpaController.java b/src/com/android/settings/network/GoogleEuiccLpaController.java new file mode 100644 index 00000000000..db6868fe0bc --- /dev/null +++ b/src/com/android/settings/network/GoogleEuiccLpaController.java @@ -0,0 +1,122 @@ +package com.android.settings.network; + +import android.Manifest; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.os.PatternMatcher; +import android.os.Process; +import android.os.UserHandle; +import android.permission.PermissionManager; + +import androidx.annotation.NonNull; +import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.LifecycleOwner; +import androidx.preference.Preference; +import androidx.preference.TwoStatePreference; + +import com.android.internal.util.GoogleEuicc; +import com.android.settings.ext.AbstractTogglePrefController; + +import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; +import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; + +public class GoogleEuiccLpaController extends AbstractTogglePrefController implements DefaultLifecycleObserver { + private final PackageManager packageManager; + + public GoogleEuiccLpaController(Context context, String key) { + super(context, key); + packageManager = context.getPackageManager(); + } + + @Override + public boolean isChecked() { + try { + return packageManager.getApplicationEnabledSetting(GoogleEuicc.LPA_PKG_NAME) + == COMPONENT_ENABLED_STATE_ENABLED; + } catch (IllegalArgumentException e) { + e.printStackTrace(); + return false; + } + } + + @Override + public int getAvailabilityStatus() { + if (!Process.myUserHandle().isSystem()) { + return DISABLED_FOR_USER; + } + + return GoogleEuicc.checkLpaDependencies() ? AVAILABLE : DISABLED_DEPENDENT_SETTING; + } + + @Override + public void updateState(Preference preference) { + super.updateState(preference); + preference.setEnabled(getAvailabilityStatus() == AVAILABLE); + } + + @Override + public boolean setChecked(boolean isChecked) { + int state = isChecked && GoogleEuicc.checkLpaDependencies() ? + COMPONENT_ENABLED_STATE_ENABLED : + COMPONENT_ENABLED_STATE_DISABLED; + + PermissionManager permissionManager = mContext.getSystemService(PermissionManager.class); + + try { + // Previously, Camera permission was auto-granted with the FLAG_PERMISSION_SYSTEM_FIXED, + // which made it unchangeable by the user. + // Removing FLAG_PERMISSION_USER_FIXED is needed to make sure that the app is always + // able to show a permission request dialog after being enabled + String pkg = GoogleEuicc.LPA_PKG_NAME; + if (state == COMPONENT_ENABLED_STATE_ENABLED) { + UserHandle user = mContext.getUser(); + String perm = Manifest.permission.CAMERA; + permissionManager.revokeRuntimePermission(pkg, perm, user, null); + int permFlagsToRemove = PackageManager.FLAG_PERMISSION_SYSTEM_FIXED + | PackageManager.FLAG_PERMISSION_USER_FIXED; + permissionManager.updatePermissionFlags(pkg, perm, permFlagsToRemove, 0, user); + } + packageManager.setApplicationEnabledSetting(pkg, state, 0); + + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + private final BroadcastReceiver packageChangeListener = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (preference != null) { + updateState(preference); + } + } + }; + + @Override + public void onResume(@NonNull LifecycleOwner owner) { + var f = new IntentFilter(); + f.addAction(Intent.ACTION_PACKAGE_ADDED); + f.addAction(Intent.ACTION_PACKAGE_CHANGED); + f.addAction(Intent.ACTION_PACKAGE_REMOVED); + f.addAction(Intent.ACTION_PACKAGE_FULLY_REMOVED); + + f.addDataScheme("package"); + for (String pkg : GoogleEuicc.getLpaDependencies()) { + f.addDataSchemeSpecificPart(pkg, PatternMatcher.PATTERN_LITERAL); + } + + f.addDataSchemeSpecificPart(GoogleEuicc.LPA_PKG_NAME, PatternMatcher.PATTERN_LITERAL); + + mContext.registerReceiver(packageChangeListener, f); + } + + @Override + public void onPause(@NonNull LifecycleOwner owner) { + mContext.unregisterReceiver(packageChangeListener); + } +} From 5e320c9454d70b07a71596d06f61b5915289ba59 Mon Sep 17 00:00:00 2001 From: r3g_5z Date: Sat, 1 Apr 2023 15:59:37 -0400 Subject: [PATCH 098/100] Revert "attestation key provisioning server setting" This reverts commit 6a01dc731ea1beaeb0bb259404a7f0b6cb581868. --- res/values/arrays.xml | 10 -- res/values/strings.xml | 3 - ...ttestProvisioningPreferenceController.java | 133 ------------------ .../network/NetworkDashboardFragment.java | 3 - 4 files changed, 149 deletions(-) delete mode 100644 src/com/android/settings/network/AttestProvisioningPreferenceController.java diff --git a/res/values/arrays.xml b/res/values/arrays.xml index f80256af4f6..ba65ea01cb1 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -252,16 +252,6 @@ 2 - - GrapheneOS proxy - Standard (Google) - - - - 0 - 1 - - GrapheneOS proxy Standard (Google) diff --git a/res/values/strings.xml b/res/values/strings.xml index 9e589574fc4..caeab78fd4e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -14541,9 +14541,6 @@ Send notifications to current user Your lock screen notifications will be forwarded to the current user if you are active in the background. Only the user\'s name, the app\'s name, and the time received will be shown. - Attestation key provisioning server - Server used for provisioning hardware-based attestation keys - PSDS server Server used for providing satellite information to assist location diff --git a/src/com/android/settings/network/AttestProvisioningPreferenceController.java b/src/com/android/settings/network/AttestProvisioningPreferenceController.java deleted file mode 100644 index e73bb3d9d2a..00000000000 --- a/src/com/android/settings/network/AttestProvisioningPreferenceController.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (C) 2022 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.network; - -import android.content.ContentResolver; -import android.content.Context; -import android.content.res.Resources; -import android.database.ContentObserver; -import android.net.LinkProperties; -import android.net.Network; -import android.os.Handler; -import android.os.Looper; -import android.os.UserHandle; -import android.os.UserManager; -import android.os.Process; -import android.provider.Settings; -import androidx.preference.ListPreference; -import androidx.preference.Preference; -import androidx.preference.PreferenceScreen; -import com.android.internal.util.ArrayUtils; -import com.android.settings.R; -import com.android.settings.core.BasePreferenceController; -import com.android.settings.core.PreferenceControllerMixin; -import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; -import com.android.settingslib.RestrictedLockUtilsInternal; -import com.android.settingslib.core.lifecycle.events.OnResume; - -public class AttestProvisioningPreferenceController - extends BasePreferenceController - implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener, - OnResume { - - private static final int GRAPHENEOS_ATTEST_SERVER_INTVAL = 0; - private static final int STANDARD_ATTEST_SERVER_INTVAL = 1; - - private static final String KEY_ATTEST_SERVER_SETTINGS = - "attest_server_settings"; - - private ListPreference mServerPreference; - - public AttestProvisioningPreferenceController(Context context) { - super(context, KEY_ATTEST_SERVER_SETTINGS); - } - - @Override - public int getAvailabilityStatus() { - if (!Process.myUserHandle().isSystem()) { - return BasePreferenceController.DISABLED_FOR_USER; - } - return BasePreferenceController.AVAILABLE; - } - - @Override - public void displayPreference(PreferenceScreen screen) { - ListPreference attestServerList = new ListPreference(screen.getContext()); - attestServerList.setKey(KEY_ATTEST_SERVER_SETTINGS); - attestServerList.setOrder(35); - attestServerList.setIcon(R.drawable.ic_lock_closed); - attestServerList.setTitle(R.string.attest_provisioning_title); - attestServerList.setSummary(R.string.attest_provisioning_summary); - attestServerList.setEntries(R.array.attest_provisioning_entries); - attestServerList.setEntryValues(R.array.attest_provisioning_values); - - if (mServerPreference == null) { - screen.addPreference(attestServerList); - mServerPreference = attestServerList; - } - super.displayPreference(screen); - updatePreferenceState(); - } - - @Override - public String getPreferenceKey() { - return KEY_ATTEST_SERVER_SETTINGS; - } - - private void updatePreferenceState() { - int pref = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.ATTEST_REMOTE_PROVISIONER_SERVER, GRAPHENEOS_ATTEST_SERVER_INTVAL); - if (GRAPHENEOS_ATTEST_SERVER_INTVAL == pref) { - mServerPreference.setValueIndex(GRAPHENEOS_ATTEST_SERVER_INTVAL); - } else { - mServerPreference.setValueIndex(STANDARD_ATTEST_SERVER_INTVAL); - } - } - - @Override - public void onResume() { - updatePreferenceState(); - if (mServerPreference != null) { - setAttestURL(mContext.getContentResolver(), Integer.parseInt(mServerPreference.getValue())); - } - } - - private void setAttestURL(ContentResolver cr, int mode) { - switch (mode) { - case STANDARD_ATTEST_SERVER_INTVAL: - Settings.Global.putInt(cr, Settings.Global.ATTEST_REMOTE_PROVISIONER_SERVER, STANDARD_ATTEST_SERVER_INTVAL); - break; - case GRAPHENEOS_ATTEST_SERVER_INTVAL: - Settings.Global.putInt(cr, Settings.Global.ATTEST_REMOTE_PROVISIONER_SERVER, GRAPHENEOS_ATTEST_SERVER_INTVAL); - break; - default: - // GrapheneOS URL as placeholder - Settings.Global.putInt(cr, Settings.Global.ATTEST_REMOTE_PROVISIONER_SERVER, GRAPHENEOS_ATTEST_SERVER_INTVAL); - } - } - - @Override - public boolean onPreferenceChange(Preference preference, Object value) { - final String key = preference.getKey(); - if (KEY_ATTEST_SERVER_SETTINGS.equals(key)) { - setAttestURL(mContext.getContentResolver(), Integer.parseInt((String)value)); - return true; - } else { - return false; - } - } - -} diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java index 32d762198e4..63da2a6e50e 100644 --- a/src/com/android/settings/network/NetworkDashboardFragment.java +++ b/src/com/android/settings/network/NetworkDashboardFragment.java @@ -124,9 +124,6 @@ private static List buildPreferenceControllers(Con ConnectivityCheckPreferenceController connectivityCheck = new ConnectivityCheckPreferenceController(context); controllers.add(connectivityCheck); - AttestProvisioningPreferenceController attestProvisioning = - new AttestProvisioningPreferenceController(context); - controllers.add(attestProvisioning); PsdsServerPreferenceController psdsServer = new PsdsServerPreferenceController(context); controllers.add(psdsServer); From 7f21d32d9cf6dbb157a190a6c5bc6916b2589fbf Mon Sep 17 00:00:00 2001 From: r3g_5z Date: Sun, 2 Apr 2023 22:23:41 -0400 Subject: [PATCH 099/100] attestation key provisioning server setting Co-authored-by: flawedworld Signed-off-by: r3g_5z --- res/values/strings_ext.xml | 6 +++ res/xml/network_provider_internet.xml | 8 ++++ .../RemoteProvisioningPrefController.java | 37 +++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 src/com/android/settings/network/RemoteProvisioningPrefController.java diff --git a/res/values/strings_ext.xml b/res/values/strings_ext.xml index 15900b20198..3e8ecf477a1 100644 --- a/res/values/strings_ext.xml +++ b/res/values/strings_ext.xml @@ -27,4 +27,10 @@ Enable privileged eSIM management Requires sandboxed Google Play installation + Attestation key provisioning server + Server used for provisioning hardware-based attestation keys + Enabled; GrapheneOS proxy + Enabled; standard server + Disabled + diff --git a/res/xml/network_provider_internet.xml b/res/xml/network_provider_internet.xml index dde4182f063..07b107a74ee 100644 --- a/res/xml/network_provider_internet.xml +++ b/res/xml/network_provider_internet.xml @@ -137,4 +137,12 @@ android:summary="@string/summary_placeholder" android:order="25" settings:controller="com.android.settings.network.AdaptiveConnectivityPreferenceController"/> + + diff --git a/src/com/android/settings/network/RemoteProvisioningPrefController.java b/src/com/android/settings/network/RemoteProvisioningPrefController.java new file mode 100644 index 00000000000..2ce8702fac7 --- /dev/null +++ b/src/com/android/settings/network/RemoteProvisioningPrefController.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2022 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.network; + +import android.content.Context; +import android.ext.settings.ExtSettings; +import android.ext.settings.RemoteProvisioningConstants; + +import com.android.settings.R; +import com.android.settings.ext.IntSettingPrefController; + +public class RemoteProvisioningPrefController extends IntSettingPrefController { + + public RemoteProvisioningPrefController(Context ctx, String key) { + super(ctx, key, ExtSettings.REMOTE_PROVISIONING_SERVER); + } + + @Override + protected void getEntries(Entries entries) { + entries.add(R.string.remote_provisioning_enabled_grapheneos_proxy, RemoteProvisioningConstants.GRAPHENEOS_PROXY); + entries.add(R.string.remote_provisioning_enabled_standard_server, RemoteProvisioningConstants.STANDARD_SERVER); + } +} From 70dd2301f20507fe30154e035b958d890747fac2 Mon Sep 17 00:00:00 2001 From: secrecyflag <96260868+secrecyflag@users.noreply.github.com> Date: Tue, 28 Mar 2023 11:37:47 -0400 Subject: [PATCH 100/100] Clipboard auto-clear timeout setting --- res/values/strings_ext.xml | 3 ++ res/xml/privacy_dashboard_settings.xml | 7 ++++ .../privacy/ClipboardTimeoutController.java | 33 +++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 src/com/android/settings/privacy/ClipboardTimeoutController.java diff --git a/res/values/strings_ext.xml b/res/values/strings_ext.xml index 3e8ecf477a1..68ace5607ad 100644 --- a/res/values/strings_ext.xml +++ b/res/values/strings_ext.xml @@ -33,4 +33,7 @@ Enabled; standard server Disabled + Clipboard auto clear + Automatically clear the clipboard after a selected duration of time + diff --git a/res/xml/privacy_dashboard_settings.xml b/res/xml/privacy_dashboard_settings.xml index 7bd0dc1cc0e..262ca3c501a 100644 --- a/res/xml/privacy_dashboard_settings.xml +++ b/res/xml/privacy_dashboard_settings.xml @@ -89,6 +89,13 @@ android:summary="@string/screenshot_timestamp_exif_summary" settings:boolSettingField="android.ext.settings.ExtSettings SCREENSHOT_TIMESTAMP_EXIF"/> + + +