diff --git a/TEST_MAPPING b/TEST_MAPPING index 9722a85360a..fd6bcbf2851 100644 --- a/TEST_MAPPING +++ b/TEST_MAPPING @@ -6,14 +6,20 @@ { "name": "SettingsUnitTests", "options": [ - { - "include-filter": "com.android.settings.password" - }, { "include-filter": "com.android.settings.biometrics" }, { "include-filter": "com.android.settings.biometrics2" + }, + { + "include-filter": "com.android.settings.password" + }, + { + "include-filter": "com.android.settings.safetycenter" + }, + { + "include-filter": "com.android.settings.security" } ] } diff --git a/res/values/strings.xml b/res/values/strings.xml index 7291fad3a93..707bc69757e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -11613,9 +11613,9 @@ other {# SIMs are available on this device, but only one can be used at a time} } - Activating + Turning on - Couldn\u2019t activate this SIM right now + Couldn\u2019t turn on this SIM right now @@ -12882,4 +12882,7 @@ + + + Show pointer while hovering diff --git a/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java b/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java index d8e88877ead..cd23103c5e4 100644 --- a/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java +++ b/src/com/android/settings/connecteddevice/stylus/StylusDevicesController.java @@ -24,6 +24,7 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.UserInfo; +import android.hardware.input.InputSettings; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; @@ -73,6 +74,8 @@ public class StylusDevicesController extends AbstractPreferenceController implem static final String KEY_IGNORE_BUTTON = "ignore_button"; @VisibleForTesting static final String KEY_DEFAULT_NOTES = "default_notes"; + @VisibleForTesting + static final String KEY_SHOW_STYLUS_POINTER_ICON = "show_stylus_pointer_icon"; private static final String TAG = "StylusDevicesController"; @@ -181,6 +184,26 @@ public class StylusDevicesController extends AbstractPreferenceController implem return pref; } + @Nullable + private SwitchPreferenceCompat createShowStylusPointerIconPreference( + SwitchPreferenceCompat preference) { + if (!mContext.getResources() + .getBoolean(com.android.internal.R.bool.config_enableStylusPointerIcon)) { + // If the config is not enabled, no need to show the preference to user + return null; + } + SwitchPreferenceCompat pref = preference == null ? new SwitchPreferenceCompat(mContext) + : preference; + pref.setKey(KEY_SHOW_STYLUS_POINTER_ICON); + pref.setTitle(mContext.getString(R.string.show_stylus_pointer_icon)); + pref.setIcon(R.drawable.ic_stylus); + pref.setOnPreferenceClickListener(this); + pref.setChecked(Settings.Secure.getInt(mContext.getContentResolver(), + Settings.Secure.STYLUS_POINTER_ICON_ENABLED, + InputSettings.DEFAULT_STYLUS_POINTER_ICON_ENABLED) == 1); + return pref; + } + @Override public boolean onPreferenceClick(Preference preference) { String key = preference.getKey(); @@ -213,6 +236,11 @@ public class StylusDevicesController extends AbstractPreferenceController implem Secure.STYLUS_BUTTONS_ENABLED, ((TwoStatePreference) preference).isChecked() ? 0 : 1); break; + case KEY_SHOW_STYLUS_POINTER_ICON: + Settings.Secure.putInt(mContext.getContentResolver(), + Secure.STYLUS_POINTER_ICON_ENABLED, + ((SwitchPreferenceCompat) preference).isChecked() ? 1 : 0); + break; } return true; } @@ -268,6 +296,13 @@ public class StylusDevicesController extends AbstractPreferenceController implem if (buttonPref == null) { mPreferencesContainer.addPreference(createButtonPressPreference()); } + SwitchPreferenceCompat currShowStylusPointerIconPref = mPreferencesContainer + .findPreference(KEY_SHOW_STYLUS_POINTER_ICON); + Preference showStylusPointerIconPref = + createShowStylusPointerIconPreference(currShowStylusPointerIconPref); + if (currShowStylusPointerIconPref == null && showStylusPointerIconPref != null) { + mPreferencesContainer.addPreference(showStylusPointerIconPref); + } } private boolean currentInputMethodSupportsHandwriting() { diff --git a/src/com/android/settings/network/telephony/ConvertToEsimPreferenceController.java b/src/com/android/settings/network/telephony/ConvertToEsimPreferenceController.java index 441c2498152..08e993b6cde 100644 --- a/src/com/android/settings/network/telephony/ConvertToEsimPreferenceController.java +++ b/src/com/android/settings/network/telephony/ConvertToEsimPreferenceController.java @@ -20,6 +20,7 @@ import static androidx.lifecycle.Lifecycle.Event.ON_START; import static androidx.lifecycle.Lifecycle.Event.ON_STOP; import android.Manifest; +import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -143,6 +144,7 @@ public class ConvertToEsimPreferenceController extends TelephonyBasePreferenceCo Intent intent = new Intent(EuiccManager.ACTION_CONVERT_TO_EMBEDDED_SUBSCRIPTION); intent.putExtra("subId", mSubId); mContext.startActivity(intent); + ((Activity) mContext).finish(); return true; } diff --git a/src/com/android/settings/safetycenter/BiometricsSafetySource.java b/src/com/android/settings/safetycenter/BiometricsSafetySource.java index 94db71f143e..8e1c78644d9 100644 --- a/src/com/android/settings/safetycenter/BiometricsSafetySource.java +++ b/src/com/android/settings/safetycenter/BiometricsSafetySource.java @@ -62,6 +62,16 @@ public final class BiometricsSafetySource { } final Context profileParentContext = context.createContextAsUser(profileParentUserHandle, 0); + if (android.os.Flags.allowPrivateProfile() && userManager.isPrivateProfile()) { + // SC always expects a response from the source if the broadcast has been sent for this + // source, therefore, we need to send a null SafetySourceData. + SafetyCenterManagerWrapper.get().setSafetySourceData( + context, + SAFETY_SOURCE_ID, + /* safetySourceData= */ null, + safetyEvent); + return; + } final BiometricNavigationUtils biometricNavigationUtils = new BiometricNavigationUtils(userId); diff --git a/src/com/android/settings/safetycenter/SafetyCenterManagerWrapper.java b/src/com/android/settings/safetycenter/SafetyCenterManagerWrapper.java index e7205260833..55eb4f14dc1 100644 --- a/src/com/android/settings/safetycenter/SafetyCenterManagerWrapper.java +++ b/src/com/android/settings/safetycenter/SafetyCenterManagerWrapper.java @@ -22,6 +22,8 @@ import android.safetycenter.SafetyEvent; import android.safetycenter.SafetySourceData; import android.util.Log; +import androidx.annotation.Nullable; + import com.android.internal.annotations.VisibleForTesting; /** A wrapper for the SafetyCenterManager system service. */ @@ -49,7 +51,7 @@ public class SafetyCenterManagerWrapper { /** Sets the latest safety source data for Safety Center. */ public void setSafetySourceData(Context context, String safetySourceId, - SafetySourceData safetySourceData, + @Nullable SafetySourceData safetySourceData, SafetyEvent safetyEvent) { SafetyCenterManager safetyCenterManager = context.getSystemService(SafetyCenterManager.class); diff --git a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java index a540d286203..135be4bc055 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/stylus/StylusDevicesControllerTest.java @@ -221,7 +221,7 @@ public class StylusDevicesControllerTest { showScreen(controller); - assertThat(mPreferenceContainer.getPreferenceCount()).isEqualTo(3); + assertThat(mPreferenceContainer.getPreferenceCount()).isEqualTo(4); } @Test @@ -249,11 +249,12 @@ public class StylusDevicesControllerTest { @Test public void btStylusInputDevice_showsAllPreferences() { showScreen(mController); + Preference defaultNotesPref = mPreferenceContainer.getPreference(0); Preference handwritingPref = mPreferenceContainer.getPreference(1); Preference buttonPref = mPreferenceContainer.getPreference(2); + Preference stylusPointerIconPref = mPreferenceContainer.getPreference(3); - assertThat(mPreferenceContainer.getPreferenceCount()).isEqualTo(3); assertThat(defaultNotesPref.getTitle().toString()).isEqualTo( mContext.getString(R.string.stylus_default_notes_app)); assertThat(defaultNotesPref.isVisible()).isTrue(); @@ -263,6 +264,9 @@ public class StylusDevicesControllerTest { assertThat(buttonPref.getTitle().toString()).isEqualTo( mContext.getString(R.string.stylus_ignore_button)); assertThat(buttonPref.isVisible()).isTrue(); + assertThat(stylusPointerIconPref.getTitle().toString()).isEqualTo( + mContext.getString(R.string.show_stylus_pointer_icon)); + assertThat(stylusPointerIconPref.isVisible()).isTrue(); } @Test @@ -551,6 +555,46 @@ public class StylusDevicesControllerTest { Secure.STYLUS_BUTTONS_ENABLED, -1)).isEqualTo(1); } + @Test + public void stylusPointerIconPreference_checkedWhenFlagTrue() { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.STYLUS_POINTER_ICON_ENABLED, 1); + + showScreen(mController); + SwitchPreferenceCompat stylusPointerIconPref = + (SwitchPreferenceCompat) mPreferenceContainer.getPreference(3); + + assertThat(stylusPointerIconPref.isChecked()).isEqualTo(true); + } + + @Test + public void stylusPointerIconPreference_uncheckedWhenFlagFalse() { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.STYLUS_POINTER_ICON_ENABLED, 0); + + showScreen(mController); + SwitchPreferenceCompat stylusPointerIconPref = + (SwitchPreferenceCompat) mPreferenceContainer.getPreference(3); + + assertThat(stylusPointerIconPref.isChecked()).isEqualTo(false); + } + + @Test + public void stylusPointerIconPreference_updatesFlagOnClick() { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.STYLUS_POINTER_ICON_ENABLED, 0); + + showScreen(mController); + SwitchPreferenceCompat stylusPointerIconPref = + (SwitchPreferenceCompat) mPreferenceContainer.getPreference(3); + + stylusPointerIconPref.performClick(); + + assertThat(stylusPointerIconPref.isChecked()).isEqualTo(true); + assertThat(Settings.Secure.getInt(mContext.getContentResolver(), + Secure.STYLUS_POINTER_ICON_ENABLED, -1)).isEqualTo(1); + } + private void showScreen(StylusDevicesController controller) { controller.displayPreference(mScreen); } diff --git a/tests/robotests/src/com/android/settings/nfc/NfcForegroundPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/nfc/NfcForegroundPreferenceControllerTest.java index 63fa320fbe2..56326ef185f 100644 --- a/tests/robotests/src/com/android/settings/nfc/NfcForegroundPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/nfc/NfcForegroundPreferenceControllerTest.java @@ -25,6 +25,9 @@ import static org.mockito.Mockito.when; import android.app.settings.SettingsEnums; import android.content.Context; import android.content.pm.PackageManager; +import android.platform.test.annotations.RequiresFlagsDisabled; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; import androidx.preference.ListPreference; import androidx.preference.PreferenceScreen; @@ -33,6 +36,7 @@ import com.android.settings.R; import com.android.settings.testutils.FakeFeatureFactory; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -43,10 +47,14 @@ import org.robolectric.RuntimeEnvironment; import java.util.ArrayList; @RunWith(RobolectricTestRunner.class) +@RequiresFlagsDisabled(android.permission.flags.Flags.FLAG_WALLET_ROLE_ENABLED) public class NfcForegroundPreferenceControllerTest { private static final String PREF_KEY = PaymentSettingsTest.FOREGROUND_KEY; + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); + @Mock private PaymentBackend mPaymentBackend; @Mock diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java index bf2c84a5a72..6c4c5b4eae7 100644 --- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java +++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java @@ -101,18 +101,20 @@ public class FakeFeatureFactory extends FeatureFactory { public FastPairFeatureProvider mFastPairFeatureProvider; public PrivateSpaceLoginFeatureProvider mPrivateSpaceLoginFeatureProvider; - /** - * Call this in {@code @Before} method of the test class to use fake factory. - */ + /** Call this in {@code @Before} method of the test class to use fake factory. */ public static FakeFeatureFactory setupForTest() { FakeFeatureFactory factory = new FakeFeatureFactory(); - setFactory(getAppContext(), factory); + try { + setFactory(getAppContext(), factory); + } catch (NoSuchMethodError ex) { + // The getAppContext() @JvmStatic method doesn't appear to generated in AOSP. Falling + // back to using the companion object method instead. + setFactory(FeatureFactory.Companion.getAppContext(), factory); + } return factory; } - /** - * FeatureFactory constructor. - */ + /** FeatureFactory constructor. */ public FakeFeatureFactory() { supportFeatureProvider = mock(SupportFeatureProvider.class); metricsFeatureProvider = mock(MetricsFeatureProvider.class);