Loading src/com/android/settings/biometrics/combination/CombinedBiometricStatusPreferenceController.java +5 −1 Original line number Original line Diff line number Diff line Loading @@ -35,7 +35,7 @@ import com.android.settingslib.RestrictedPreference; */ */ public class CombinedBiometricStatusPreferenceController extends public class CombinedBiometricStatusPreferenceController extends BiometricStatusPreferenceController implements LifecycleObserver { BiometricStatusPreferenceController implements LifecycleObserver { private static final String KEY_BIOMETRIC_SETTINGS = "biometric_settings"; public static final String KEY_BIOMETRIC_SETTINGS = "biometric_settings"; @VisibleForTesting @VisibleForTesting RestrictedPreference mPreference; RestrictedPreference mPreference; Loading Loading @@ -122,4 +122,8 @@ public class CombinedBiometricStatusPreferenceController extends protected String getSettingsClassName() { protected String getSettingsClassName() { return mCombinedBiometricStatusUtils.getSettingsClassName(); return mCombinedBiometricStatusUtils.getSettingsClassName(); } } public void setPreferenceScreen(PreferenceScreen preferenceScreen) { mPreferenceScreen = preferenceScreen; } } } src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -38,6 +38,7 @@ public class FaceStatusPreferenceController extends BiometricStatusPreferenceCon public static final String KEY_FACE_SETTINGS = "face_settings"; public static final String KEY_FACE_SETTINGS = "face_settings"; protected final FaceManager mFaceManager; protected final FaceManager mFaceManager; @VisibleForTesting @VisibleForTesting RestrictedPreference mPreference; RestrictedPreference mPreference; private PreferenceScreen mPreferenceScreen; private PreferenceScreen mPreferenceScreen; Loading Loading @@ -111,4 +112,8 @@ public class FaceStatusPreferenceController extends BiometricStatusPreferenceCon protected String getSettingsClassName() { protected String getSettingsClassName() { return mFaceStatusUtils.getSettingsClassName(); return mFaceStatusUtils.getSettingsClassName(); } } public void setPreferenceScreen(PreferenceScreen preferenceScreen) { mPreferenceScreen = preferenceScreen; } } } src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceController.java +5 −1 Original line number Original line Diff line number Diff line Loading @@ -35,7 +35,7 @@ import com.android.settingslib.RestrictedPreference; public class FingerprintStatusPreferenceController extends BiometricStatusPreferenceController public class FingerprintStatusPreferenceController extends BiometricStatusPreferenceController implements LifecycleObserver { implements LifecycleObserver { private static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings"; public static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings"; protected final FingerprintManager mFingerprintManager; protected final FingerprintManager mFingerprintManager; @VisibleForTesting @VisibleForTesting Loading Loading @@ -112,4 +112,8 @@ public class FingerprintStatusPreferenceController extends BiometricStatusPrefer mPreference.setDisabledByAdmin(enforcedAdmin); mPreference.setDisabledByAdmin(enforcedAdmin); } } } } public void setPreferenceScreen(PreferenceScreen preferenceScreen) { mPreferenceScreen = preferenceScreen; } } } src/com/android/settings/security/SecuritySettings.java +6 −1 Original line number Original line Diff line number Diff line Loading @@ -40,7 +40,7 @@ import java.util.List; public class SecuritySettings extends DashboardFragment { public class SecuritySettings extends DashboardFragment { private static final String TAG = "SecuritySettings"; private static final String TAG = "SecuritySettings"; private static final String SECURITY_CATEGORY = "security_category"; protected static final String SECURITY_CATEGORY = "security_category"; public static final int CHANGE_TRUST_AGENT_SETTINGS = 126; public static final int CHANGE_TRUST_AGENT_SETTINGS = 126; public static final int UNIFY_LOCK_CONFIRM_PROFILE_REQUEST = 129; public static final int UNIFY_LOCK_CONFIRM_PROFILE_REQUEST = 129; Loading Loading @@ -132,4 +132,9 @@ public class SecuritySettings extends DashboardFragment { && !SafetyCenterManagerWrapper.get().isEnabled(context); && !SafetyCenterManagerWrapper.get().isEnabled(context); } } }; }; @Override public Lifecycle getSettingsLifecycle() { return super.getSettingsLifecycle(); } } } tests/unit/src/com/android/settings/security/SecuritySettingsTest.java +207 −3 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,10 @@ import android.os.Bundle; import android.os.Looper; import android.os.Looper; import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource; import androidx.lifecycle.Lifecycle; import androidx.preference.Preference; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import androidx.test.annotation.UiThreadTest; import androidx.test.annotation.UiThreadTest; import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4; Loading @@ -51,6 +55,7 @@ import com.android.settings.core.PreferenceXmlParserUtils; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.security.trustagent.TrustAgentManager; import com.android.settings.security.trustagent.TrustAgentManager; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.RestrictedPreference; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; import org.junit.Before; import org.junit.Before; Loading @@ -62,13 +67,15 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.ArrayList; import java.util.List; import java.util.List; @RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class) public class SecuritySettingsTest { public class SecuritySettingsTest { private Context mContext; private Context mContext; private SecuritySettingsFeatureProvider mSecuritySettingsFeatureProvider; private SecuritySettingsFeatureProvider mSecuritySettingsFeatureProvider; private SecuritySettings mSecuritySettings; private SecuritySettings mSecuritySettings; private Preference mPreference; private RestrictedPreference mPreferenceFace; private RestrictedPreference mPreferenceFingerprint; private RestrictedPreference mPreferenceCombined; @Mock @Mock private TrustAgentManager mTrustAgentManager; private TrustAgentManager mTrustAgentManager; Loading @@ -79,6 +86,8 @@ public class SecuritySettingsTest { @Mock @Mock private PackageManager mPackageManager; private PackageManager mPackageManager; private PreferenceScreen mScreen; @Before @Before @UiThreadTest @UiThreadTest public void setup() { public void setup() { Loading @@ -96,10 +105,30 @@ public class SecuritySettingsTest { FakeFeatureFactory mFeatureFactory = FakeFeatureFactory.setupForTest(); FakeFeatureFactory mFeatureFactory = FakeFeatureFactory.setupForTest(); SecurityFeatureProvider mSecurityFeatureProvider = SecurityFeatureProvider mSecurityFeatureProvider = mFeatureFactory.getSecurityFeatureProvider(); mFeatureFactory.getSecurityFeatureProvider(); when(mSecurityFeatureProvider.getTrustAgentManager()).thenReturn(mTrustAgentManager); when(mSecurityFeatureProvider.getTrustAgentManager()).thenReturn(mTrustAgentManager); mSecuritySettingsFeatureProvider = mFeatureFactory.getSecuritySettingsFeatureProvider(); mSecuritySettingsFeatureProvider = mFeatureFactory.getSecuritySettingsFeatureProvider(); mSecuritySettings = new SecuritySettings(); mSecuritySettings = new SecuritySettings(); PreferenceManager preferenceManager = new PreferenceManager(mContext); mScreen = preferenceManager.createPreferenceScreen(mContext); mPreference = new Preference(mContext); mPreference.setKey(SecuritySettings.SECURITY_CATEGORY); mPreferenceFace = new RestrictedPreference(mContext); mPreferenceFingerprint = new RestrictedPreference(mContext); mPreferenceCombined = new RestrictedPreference(mContext); mPreferenceFace.setKey(FaceStatusPreferenceController .KEY_FACE_SETTINGS); mPreferenceFingerprint.setKey(FingerprintStatusPreferenceController .KEY_FINGERPRINT_SETTINGS); mPreferenceCombined.setKey(CombinedBiometricStatusPreferenceController .KEY_BIOMETRIC_SETTINGS); mScreen.addPreference(mPreference); mScreen.addPreference(mPreferenceFace); mScreen.addPreference(mPreferenceFingerprint); mScreen.addPreference(mPreferenceCombined); } } @Test @Test Loading Loading @@ -167,6 +196,150 @@ public class SecuritySettingsTest { assertThat(isCombinedPrefAvailable(controllers)).isTrue(); assertThat(isCombinedPrefAvailable(controllers)).isTrue(); } } @Test @UiThreadTest public void preferenceLifecycle_faceShowsThenCombined() { when(mFaceManager.isHardwareDetected()).thenReturn(true); when(mFingerprintManager.isHardwareDetected()).thenReturn(false); final List<AbstractPreferenceController> controllers = mSecuritySettings.createPreferenceControllers(mContext); FaceStatusPreferenceController mFaceStatusPreferenceController = getFaceStatusPreferenceController(controllers); FingerprintStatusPreferenceController mFingerprintStatusPreferenceController = getFingerprintStatusPreferenceController(controllers); CombinedBiometricStatusPreferenceController mCombinedStatusPreferenceController = getCombinedBiometricStatusPreferenceController(controllers); mFaceStatusPreferenceController.setPreferenceScreen(mScreen); mFingerprintStatusPreferenceController.setPreferenceScreen(mScreen); mCombinedStatusPreferenceController.setPreferenceScreen(mScreen); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isTrue(); assertThat(mPreferenceFingerprint.isVisible()).isFalse(); assertThat(mPreferenceCombined.isVisible()).isFalse(); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); when(mFingerprintManager.isHardwareDetected()).thenReturn(true); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isFalse(); assertThat(mPreferenceFingerprint.isVisible()).isFalse(); assertThat(mPreferenceCombined.isVisible()).isTrue(); } @Test @UiThreadTest public void preferenceLifecycle_fingerprintShowsThenCombined() { when(mFaceManager.isHardwareDetected()).thenReturn(false); when(mFingerprintManager.isHardwareDetected()).thenReturn(true); final List<AbstractPreferenceController> controllers = mSecuritySettings.createPreferenceControllers(mContext); FaceStatusPreferenceController mFaceStatusPreferenceController = getFaceStatusPreferenceController(controllers); FingerprintStatusPreferenceController mFingerprintStatusPreferenceController = getFingerprintStatusPreferenceController(controllers); CombinedBiometricStatusPreferenceController mCombinedStatusPreferenceController = getCombinedBiometricStatusPreferenceController(controllers); mFaceStatusPreferenceController.setPreferenceScreen(mScreen); mFingerprintStatusPreferenceController.setPreferenceScreen(mScreen); mCombinedStatusPreferenceController.setPreferenceScreen(mScreen); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isFalse(); assertThat(mPreferenceFingerprint.isVisible()).isTrue(); assertThat(mPreferenceCombined.isVisible()).isFalse(); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); when(mFaceManager.isHardwareDetected()).thenReturn(true); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isFalse(); assertThat(mPreferenceFingerprint.isVisible()).isFalse(); assertThat(mPreferenceCombined.isVisible()).isTrue(); } @Test @UiThreadTest public void preferenceLifecycle_combinedShowsThenFace() { when(mFaceManager.isHardwareDetected()).thenReturn(true); when(mFingerprintManager.isHardwareDetected()).thenReturn(true); final List<AbstractPreferenceController> controllers = mSecuritySettings.createPreferenceControllers(mContext); FaceStatusPreferenceController mFaceStatusPreferenceController = getFaceStatusPreferenceController(controllers); FingerprintStatusPreferenceController mFingerprintStatusPreferenceController = getFingerprintStatusPreferenceController(controllers); CombinedBiometricStatusPreferenceController mCombinedStatusPreferenceController = getCombinedBiometricStatusPreferenceController(controllers); mFaceStatusPreferenceController.setPreferenceScreen(mScreen); mFingerprintStatusPreferenceController.setPreferenceScreen(mScreen); mCombinedStatusPreferenceController.setPreferenceScreen(mScreen); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isFalse(); assertThat(mPreferenceFingerprint.isVisible()).isFalse(); assertThat(mPreferenceCombined.isVisible()).isTrue(); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); when(mFingerprintManager.isHardwareDetected()).thenReturn(false); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isTrue(); assertThat(mPreferenceFingerprint.isVisible()).isFalse(); assertThat(mPreferenceCombined.isVisible()).isFalse(); } @Test @UiThreadTest public void preferenceLifecycle_combinedShowsThenFingerprint() { when(mFaceManager.isHardwareDetected()).thenReturn(true); when(mFingerprintManager.isHardwareDetected()).thenReturn(true); final List<AbstractPreferenceController> controllers = mSecuritySettings.createPreferenceControllers(mContext); FaceStatusPreferenceController mFaceStatusPreferenceController = getFaceStatusPreferenceController(controllers); FingerprintStatusPreferenceController mFingerprintStatusPreferenceController = getFingerprintStatusPreferenceController(controllers); CombinedBiometricStatusPreferenceController mCombinedStatusPreferenceController = getCombinedBiometricStatusPreferenceController(controllers); mFaceStatusPreferenceController.setPreferenceScreen(mScreen); mFingerprintStatusPreferenceController.setPreferenceScreen(mScreen); mCombinedStatusPreferenceController.setPreferenceScreen(mScreen); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isFalse(); assertThat(mPreferenceFingerprint.isVisible()).isFalse(); assertThat(mPreferenceCombined.isVisible()).isTrue(); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); when(mFaceManager.isHardwareDetected()).thenReturn(false); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isFalse(); assertThat(mPreferenceFingerprint.isVisible()).isTrue(); assertThat(mPreferenceCombined.isVisible()).isFalse(); } private List<String> getAllXmlKeys(BaseSearchIndexProvider indexProvider) throws Exception { private List<String> getAllXmlKeys(BaseSearchIndexProvider indexProvider) throws Exception { final List<SearchIndexableResource> resources = indexProvider.getXmlResourcesToIndex( final List<SearchIndexableResource> resources = indexProvider.getXmlResourcesToIndex( mContext, true /* not used*/); mContext, true /* not used*/); Loading Loading @@ -207,4 +380,35 @@ public class SecuritySettingsTest { controller -> controller instanceof CombinedBiometricStatusPreferenceController controller -> controller instanceof CombinedBiometricStatusPreferenceController && controller.isAvailable()).count() == 1; && controller.isAvailable()).count() == 1; } } FaceStatusPreferenceController getFaceStatusPreferenceController( List<AbstractPreferenceController> controllers) { for (AbstractPreferenceController abstractPreferenceController: controllers) { if (abstractPreferenceController instanceof FaceStatusPreferenceController) { return (FaceStatusPreferenceController) abstractPreferenceController; } } return null; } FingerprintStatusPreferenceController getFingerprintStatusPreferenceController( List<AbstractPreferenceController> controllers) { for (AbstractPreferenceController abstractPreferenceController: controllers) { if (abstractPreferenceController instanceof FingerprintStatusPreferenceController) { return (FingerprintStatusPreferenceController) abstractPreferenceController; } } return null; } CombinedBiometricStatusPreferenceController getCombinedBiometricStatusPreferenceController( List<AbstractPreferenceController> controllers) { for (AbstractPreferenceController abstractPreferenceController: controllers) { if (abstractPreferenceController instanceof CombinedBiometricStatusPreferenceController) { return (CombinedBiometricStatusPreferenceController) abstractPreferenceController; } } return null; } } } Loading
src/com/android/settings/biometrics/combination/CombinedBiometricStatusPreferenceController.java +5 −1 Original line number Original line Diff line number Diff line Loading @@ -35,7 +35,7 @@ import com.android.settingslib.RestrictedPreference; */ */ public class CombinedBiometricStatusPreferenceController extends public class CombinedBiometricStatusPreferenceController extends BiometricStatusPreferenceController implements LifecycleObserver { BiometricStatusPreferenceController implements LifecycleObserver { private static final String KEY_BIOMETRIC_SETTINGS = "biometric_settings"; public static final String KEY_BIOMETRIC_SETTINGS = "biometric_settings"; @VisibleForTesting @VisibleForTesting RestrictedPreference mPreference; RestrictedPreference mPreference; Loading Loading @@ -122,4 +122,8 @@ public class CombinedBiometricStatusPreferenceController extends protected String getSettingsClassName() { protected String getSettingsClassName() { return mCombinedBiometricStatusUtils.getSettingsClassName(); return mCombinedBiometricStatusUtils.getSettingsClassName(); } } public void setPreferenceScreen(PreferenceScreen preferenceScreen) { mPreferenceScreen = preferenceScreen; } } }
src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java +5 −0 Original line number Original line Diff line number Diff line Loading @@ -38,6 +38,7 @@ public class FaceStatusPreferenceController extends BiometricStatusPreferenceCon public static final String KEY_FACE_SETTINGS = "face_settings"; public static final String KEY_FACE_SETTINGS = "face_settings"; protected final FaceManager mFaceManager; protected final FaceManager mFaceManager; @VisibleForTesting @VisibleForTesting RestrictedPreference mPreference; RestrictedPreference mPreference; private PreferenceScreen mPreferenceScreen; private PreferenceScreen mPreferenceScreen; Loading Loading @@ -111,4 +112,8 @@ public class FaceStatusPreferenceController extends BiometricStatusPreferenceCon protected String getSettingsClassName() { protected String getSettingsClassName() { return mFaceStatusUtils.getSettingsClassName(); return mFaceStatusUtils.getSettingsClassName(); } } public void setPreferenceScreen(PreferenceScreen preferenceScreen) { mPreferenceScreen = preferenceScreen; } } }
src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceController.java +5 −1 Original line number Original line Diff line number Diff line Loading @@ -35,7 +35,7 @@ import com.android.settingslib.RestrictedPreference; public class FingerprintStatusPreferenceController extends BiometricStatusPreferenceController public class FingerprintStatusPreferenceController extends BiometricStatusPreferenceController implements LifecycleObserver { implements LifecycleObserver { private static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings"; public static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings"; protected final FingerprintManager mFingerprintManager; protected final FingerprintManager mFingerprintManager; @VisibleForTesting @VisibleForTesting Loading Loading @@ -112,4 +112,8 @@ public class FingerprintStatusPreferenceController extends BiometricStatusPrefer mPreference.setDisabledByAdmin(enforcedAdmin); mPreference.setDisabledByAdmin(enforcedAdmin); } } } } public void setPreferenceScreen(PreferenceScreen preferenceScreen) { mPreferenceScreen = preferenceScreen; } } }
src/com/android/settings/security/SecuritySettings.java +6 −1 Original line number Original line Diff line number Diff line Loading @@ -40,7 +40,7 @@ import java.util.List; public class SecuritySettings extends DashboardFragment { public class SecuritySettings extends DashboardFragment { private static final String TAG = "SecuritySettings"; private static final String TAG = "SecuritySettings"; private static final String SECURITY_CATEGORY = "security_category"; protected static final String SECURITY_CATEGORY = "security_category"; public static final int CHANGE_TRUST_AGENT_SETTINGS = 126; public static final int CHANGE_TRUST_AGENT_SETTINGS = 126; public static final int UNIFY_LOCK_CONFIRM_PROFILE_REQUEST = 129; public static final int UNIFY_LOCK_CONFIRM_PROFILE_REQUEST = 129; Loading Loading @@ -132,4 +132,9 @@ public class SecuritySettings extends DashboardFragment { && !SafetyCenterManagerWrapper.get().isEnabled(context); && !SafetyCenterManagerWrapper.get().isEnabled(context); } } }; }; @Override public Lifecycle getSettingsLifecycle() { return super.getSettingsLifecycle(); } } }
tests/unit/src/com/android/settings/security/SecuritySettingsTest.java +207 −3 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,10 @@ import android.os.Bundle; import android.os.Looper; import android.os.Looper; import android.provider.SearchIndexableResource; import android.provider.SearchIndexableResource; import androidx.lifecycle.Lifecycle; import androidx.preference.Preference; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; import androidx.test.annotation.UiThreadTest; import androidx.test.annotation.UiThreadTest; import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4; Loading @@ -51,6 +55,7 @@ import com.android.settings.core.PreferenceXmlParserUtils; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.security.trustagent.TrustAgentManager; import com.android.settings.security.trustagent.TrustAgentManager; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settings.testutils.FakeFeatureFactory; import com.android.settingslib.RestrictedPreference; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; import org.junit.Before; import org.junit.Before; Loading @@ -62,13 +67,15 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.ArrayList; import java.util.List; import java.util.List; @RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class) public class SecuritySettingsTest { public class SecuritySettingsTest { private Context mContext; private Context mContext; private SecuritySettingsFeatureProvider mSecuritySettingsFeatureProvider; private SecuritySettingsFeatureProvider mSecuritySettingsFeatureProvider; private SecuritySettings mSecuritySettings; private SecuritySettings mSecuritySettings; private Preference mPreference; private RestrictedPreference mPreferenceFace; private RestrictedPreference mPreferenceFingerprint; private RestrictedPreference mPreferenceCombined; @Mock @Mock private TrustAgentManager mTrustAgentManager; private TrustAgentManager mTrustAgentManager; Loading @@ -79,6 +86,8 @@ public class SecuritySettingsTest { @Mock @Mock private PackageManager mPackageManager; private PackageManager mPackageManager; private PreferenceScreen mScreen; @Before @Before @UiThreadTest @UiThreadTest public void setup() { public void setup() { Loading @@ -96,10 +105,30 @@ public class SecuritySettingsTest { FakeFeatureFactory mFeatureFactory = FakeFeatureFactory.setupForTest(); FakeFeatureFactory mFeatureFactory = FakeFeatureFactory.setupForTest(); SecurityFeatureProvider mSecurityFeatureProvider = SecurityFeatureProvider mSecurityFeatureProvider = mFeatureFactory.getSecurityFeatureProvider(); mFeatureFactory.getSecurityFeatureProvider(); when(mSecurityFeatureProvider.getTrustAgentManager()).thenReturn(mTrustAgentManager); when(mSecurityFeatureProvider.getTrustAgentManager()).thenReturn(mTrustAgentManager); mSecuritySettingsFeatureProvider = mFeatureFactory.getSecuritySettingsFeatureProvider(); mSecuritySettingsFeatureProvider = mFeatureFactory.getSecuritySettingsFeatureProvider(); mSecuritySettings = new SecuritySettings(); mSecuritySettings = new SecuritySettings(); PreferenceManager preferenceManager = new PreferenceManager(mContext); mScreen = preferenceManager.createPreferenceScreen(mContext); mPreference = new Preference(mContext); mPreference.setKey(SecuritySettings.SECURITY_CATEGORY); mPreferenceFace = new RestrictedPreference(mContext); mPreferenceFingerprint = new RestrictedPreference(mContext); mPreferenceCombined = new RestrictedPreference(mContext); mPreferenceFace.setKey(FaceStatusPreferenceController .KEY_FACE_SETTINGS); mPreferenceFingerprint.setKey(FingerprintStatusPreferenceController .KEY_FINGERPRINT_SETTINGS); mPreferenceCombined.setKey(CombinedBiometricStatusPreferenceController .KEY_BIOMETRIC_SETTINGS); mScreen.addPreference(mPreference); mScreen.addPreference(mPreferenceFace); mScreen.addPreference(mPreferenceFingerprint); mScreen.addPreference(mPreferenceCombined); } } @Test @Test Loading Loading @@ -167,6 +196,150 @@ public class SecuritySettingsTest { assertThat(isCombinedPrefAvailable(controllers)).isTrue(); assertThat(isCombinedPrefAvailable(controllers)).isTrue(); } } @Test @UiThreadTest public void preferenceLifecycle_faceShowsThenCombined() { when(mFaceManager.isHardwareDetected()).thenReturn(true); when(mFingerprintManager.isHardwareDetected()).thenReturn(false); final List<AbstractPreferenceController> controllers = mSecuritySettings.createPreferenceControllers(mContext); FaceStatusPreferenceController mFaceStatusPreferenceController = getFaceStatusPreferenceController(controllers); FingerprintStatusPreferenceController mFingerprintStatusPreferenceController = getFingerprintStatusPreferenceController(controllers); CombinedBiometricStatusPreferenceController mCombinedStatusPreferenceController = getCombinedBiometricStatusPreferenceController(controllers); mFaceStatusPreferenceController.setPreferenceScreen(mScreen); mFingerprintStatusPreferenceController.setPreferenceScreen(mScreen); mCombinedStatusPreferenceController.setPreferenceScreen(mScreen); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isTrue(); assertThat(mPreferenceFingerprint.isVisible()).isFalse(); assertThat(mPreferenceCombined.isVisible()).isFalse(); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); when(mFingerprintManager.isHardwareDetected()).thenReturn(true); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isFalse(); assertThat(mPreferenceFingerprint.isVisible()).isFalse(); assertThat(mPreferenceCombined.isVisible()).isTrue(); } @Test @UiThreadTest public void preferenceLifecycle_fingerprintShowsThenCombined() { when(mFaceManager.isHardwareDetected()).thenReturn(false); when(mFingerprintManager.isHardwareDetected()).thenReturn(true); final List<AbstractPreferenceController> controllers = mSecuritySettings.createPreferenceControllers(mContext); FaceStatusPreferenceController mFaceStatusPreferenceController = getFaceStatusPreferenceController(controllers); FingerprintStatusPreferenceController mFingerprintStatusPreferenceController = getFingerprintStatusPreferenceController(controllers); CombinedBiometricStatusPreferenceController mCombinedStatusPreferenceController = getCombinedBiometricStatusPreferenceController(controllers); mFaceStatusPreferenceController.setPreferenceScreen(mScreen); mFingerprintStatusPreferenceController.setPreferenceScreen(mScreen); mCombinedStatusPreferenceController.setPreferenceScreen(mScreen); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isFalse(); assertThat(mPreferenceFingerprint.isVisible()).isTrue(); assertThat(mPreferenceCombined.isVisible()).isFalse(); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); when(mFaceManager.isHardwareDetected()).thenReturn(true); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isFalse(); assertThat(mPreferenceFingerprint.isVisible()).isFalse(); assertThat(mPreferenceCombined.isVisible()).isTrue(); } @Test @UiThreadTest public void preferenceLifecycle_combinedShowsThenFace() { when(mFaceManager.isHardwareDetected()).thenReturn(true); when(mFingerprintManager.isHardwareDetected()).thenReturn(true); final List<AbstractPreferenceController> controllers = mSecuritySettings.createPreferenceControllers(mContext); FaceStatusPreferenceController mFaceStatusPreferenceController = getFaceStatusPreferenceController(controllers); FingerprintStatusPreferenceController mFingerprintStatusPreferenceController = getFingerprintStatusPreferenceController(controllers); CombinedBiometricStatusPreferenceController mCombinedStatusPreferenceController = getCombinedBiometricStatusPreferenceController(controllers); mFaceStatusPreferenceController.setPreferenceScreen(mScreen); mFingerprintStatusPreferenceController.setPreferenceScreen(mScreen); mCombinedStatusPreferenceController.setPreferenceScreen(mScreen); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isFalse(); assertThat(mPreferenceFingerprint.isVisible()).isFalse(); assertThat(mPreferenceCombined.isVisible()).isTrue(); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); when(mFingerprintManager.isHardwareDetected()).thenReturn(false); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isTrue(); assertThat(mPreferenceFingerprint.isVisible()).isFalse(); assertThat(mPreferenceCombined.isVisible()).isFalse(); } @Test @UiThreadTest public void preferenceLifecycle_combinedShowsThenFingerprint() { when(mFaceManager.isHardwareDetected()).thenReturn(true); when(mFingerprintManager.isHardwareDetected()).thenReturn(true); final List<AbstractPreferenceController> controllers = mSecuritySettings.createPreferenceControllers(mContext); FaceStatusPreferenceController mFaceStatusPreferenceController = getFaceStatusPreferenceController(controllers); FingerprintStatusPreferenceController mFingerprintStatusPreferenceController = getFingerprintStatusPreferenceController(controllers); CombinedBiometricStatusPreferenceController mCombinedStatusPreferenceController = getCombinedBiometricStatusPreferenceController(controllers); mFaceStatusPreferenceController.setPreferenceScreen(mScreen); mFingerprintStatusPreferenceController.setPreferenceScreen(mScreen); mCombinedStatusPreferenceController.setPreferenceScreen(mScreen); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isFalse(); assertThat(mPreferenceFingerprint.isVisible()).isFalse(); assertThat(mPreferenceCombined.isVisible()).isTrue(); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_PAUSE); when(mFaceManager.isHardwareDetected()).thenReturn(false); mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME); assertThat(mPreferenceFace.isVisible()).isFalse(); assertThat(mPreferenceFingerprint.isVisible()).isTrue(); assertThat(mPreferenceCombined.isVisible()).isFalse(); } private List<String> getAllXmlKeys(BaseSearchIndexProvider indexProvider) throws Exception { private List<String> getAllXmlKeys(BaseSearchIndexProvider indexProvider) throws Exception { final List<SearchIndexableResource> resources = indexProvider.getXmlResourcesToIndex( final List<SearchIndexableResource> resources = indexProvider.getXmlResourcesToIndex( mContext, true /* not used*/); mContext, true /* not used*/); Loading Loading @@ -207,4 +380,35 @@ public class SecuritySettingsTest { controller -> controller instanceof CombinedBiometricStatusPreferenceController controller -> controller instanceof CombinedBiometricStatusPreferenceController && controller.isAvailable()).count() == 1; && controller.isAvailable()).count() == 1; } } FaceStatusPreferenceController getFaceStatusPreferenceController( List<AbstractPreferenceController> controllers) { for (AbstractPreferenceController abstractPreferenceController: controllers) { if (abstractPreferenceController instanceof FaceStatusPreferenceController) { return (FaceStatusPreferenceController) abstractPreferenceController; } } return null; } FingerprintStatusPreferenceController getFingerprintStatusPreferenceController( List<AbstractPreferenceController> controllers) { for (AbstractPreferenceController abstractPreferenceController: controllers) { if (abstractPreferenceController instanceof FingerprintStatusPreferenceController) { return (FingerprintStatusPreferenceController) abstractPreferenceController; } } return null; } CombinedBiometricStatusPreferenceController getCombinedBiometricStatusPreferenceController( List<AbstractPreferenceController> controllers) { for (AbstractPreferenceController abstractPreferenceController: controllers) { if (abstractPreferenceController instanceof CombinedBiometricStatusPreferenceController) { return (CombinedBiometricStatusPreferenceController) abstractPreferenceController; } } return null; } } }