Fingerprint swipe settings and suggestions should not show if hardware unavailable
Fixes: 63589121
Test: remove FP driver, make sure swipe setting and suggestions
don't show anymore && make -j RunSettingsRoboTests
Change-Id: I2539128daff8df52d040606141f772fc9edffa57
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 9b3414c..1579a9f 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -1222,6 +1222,11 @@
}
}
+ public static boolean hasFingerprintHardware(Context context) {
+ FingerprintManager fingerprintManager = getFingerprintManagerOrNull(context);
+ return fingerprintManager != null && fingerprintManager.isHardwareDetected();
+ }
+
/**
* Launches an intent which may optionally have a user id defined.
* @param fragment Fragment to use to launch the activity.
diff --git a/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java b/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java
index 3e85d2c..6ff0413 100644
--- a/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java
+++ b/src/com/android/settings/dashboard/suggestions/SuggestionsChecks.java
@@ -65,12 +65,14 @@
} else if (className.equals(WifiCallingSuggestionActivity.class.getName())) {
return isWifiCallingUnavailableOrEnabled();
} else if (className.equals(FingerprintSuggestionActivity.class.getName())) {
- return isNotSingleFingerprintEnrolled() || !isFingerprintEnabled();
+ return !Utils.hasFingerprintHardware(mContext) || !isFingerprintEnabled()
+ || isNotSingleFingerprintEnrolled();
} else if (className.equals(ScreenLockSuggestionActivity.class.getName())) {
return isDeviceSecured();
} else if (className.equals(FingerprintEnrollSuggestionActivity.class.getName())) {
- FingerprintManager manager = Utils.getFingerprintManagerOrNull(mContext);
- if (manager == null || !isFingerprintEnabled()) {
+ final FingerprintManager manager = Utils.getFingerprintManagerOrNull(mContext);
+ if (manager == null || !isFingerprintEnabled()
+ || !Utils.hasFingerprintHardware(mContext)) {
return true;
}
return manager.hasEnrolledFingerprints();
diff --git a/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java b/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java
index bb63f21..6935cce 100644
--- a/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java
+++ b/src/com/android/settings/gestures/SwipeToNotificationPreferenceController.java
@@ -23,7 +23,7 @@
import android.support.v7.preference.Preference;
import com.android.settings.R;
-import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.Utils;
import com.android.settings.search.DatabaseIndexingUtils;
import com.android.settings.search.InlineSwitchPayload;
import com.android.settings.search.ResultPayload;
@@ -50,7 +50,7 @@
}
private static boolean isGestureAvailable(Context context) {
- return context.getResources()
+ return Utils.hasFingerprintHardware(context) && context.getResources()
.getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys);
}
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
index 824aa1f..2fde357 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionFeatureProviderImplTest.java
@@ -16,12 +16,15 @@
package com.android.settings.dashboard.suggestions;
+
import android.app.ActivityManager;
+
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
+import android.hardware.fingerprint.FingerprintManager;
import android.provider.Settings.Secure;
import com.android.internal.logging.nano.MetricsProto;
@@ -59,6 +62,7 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
@@ -84,6 +88,12 @@
private Tile mSuggestion;
@Mock
private ActivityManager mActivityManager;
+ @Mock
+ private PackageManager mPackageManager;
+ @Mock
+ private FingerprintManager mFingerprintManager;
+ @Mock
+ private SharedPreferences mSharedPreferences;
private FakeFeatureFactory mFactory;
private SuggestionFeatureProviderImpl mProvider;
@@ -93,9 +103,14 @@
MockitoAnnotations.initMocks(this);
FakeFeatureFactory.setupForTest(mContext);
mFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ // Explicit casting to object due to MockitoCast bug
+ when((Object) mContext.getSystemService(FingerprintManager.class))
+ .thenReturn(mFingerprintManager);
when(mContext.getApplicationContext()).thenReturn(RuntimeEnvironment.application);
when(mContext.getSystemService(Context.ACTIVITY_SERVICE)).thenReturn(mActivityManager);
when(mActivityManager.isLowRamDevice()).thenReturn(false);
+
mSuggestion.intent = new Intent().setClassName("pkg", "cls");
mSuggestion.category = "category";
@@ -210,39 +225,56 @@
}
@Test
- @Config(shadows = SettingsShadowResources.class)
- public void isSuggestionCompleted_swipeToNotification_trueWhenNotAvailable() {
- SettingsShadowResources.overrideResource(
- com.android.internal.R.bool.config_supportSystemNavigationKeys, false);
+ public void isSuggestionCompleted_swipeToNotification_trueWhenNotHardwareNotAvailable() {
+ stubFingerprintSupported(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
+ when(mContext.getResources().
+ getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
+ .thenReturn(true);
- assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application,
- new ComponentName(RuntimeEnvironment.application,
- SwipeToNotificationSuggestionActivity.class))).isTrue();
+ assertThat(mProvider.isSuggestionCompleted(mContext,
+ new ComponentName(mContext, SwipeToNotificationSuggestionActivity.class))).isTrue();
}
@Test
- @Config(shadows = SettingsShadowResources.class)
+ public void isSuggestionCompleted_swipeToNotification_trueWhenNotAvailable() {
+ stubFingerprintSupported(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+ when(mContext.getResources().
+ getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
+ .thenReturn(false);
+
+ assertThat(mProvider.isSuggestionCompleted(mContext,
+ new ComponentName(mContext, SwipeToNotificationSuggestionActivity.class))).isTrue();
+ }
+
+ @Test
public void isSuggestionCompleted_swipeToNotification_falseWhenNotVisited() {
- SettingsShadowResources.overrideResource(
- com.android.internal.R.bool.config_supportSystemNavigationKeys, true);
+ stubFingerprintSupported(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+ when(mContext.getResources().
+ getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
+ .thenReturn(true);
// No stored value in shared preferences if not visited yet.
- assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application,
- new ComponentName(RuntimeEnvironment.application,
+ assertThat(mProvider.isSuggestionCompleted(mContext,
+ new ComponentName(mContext,
SwipeToNotificationSuggestionActivity.class))).isFalse();
}
@Test
- @Config(shadows = SettingsShadowResources.class)
public void isSuggestionCompleted_swipeToNotification_trueWhenVisited() {
- SettingsShadowResources.overrideResource(
- com.android.internal.R.bool.config_supportSystemNavigationKeys, true);
- mProvider.getSharedPrefs(RuntimeEnvironment.application).edit().putBoolean(
- SwipeToNotificationSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit();
+ stubFingerprintSupported(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+ when(mContext.getResources().
+ getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
+ .thenReturn(true);
+ when(mContext.getSharedPreferences(anyString(), anyInt())).thenReturn(mSharedPreferences);
+ when(mSharedPreferences.getBoolean(
+ SwipeToNotificationSettings.PREF_KEY_SUGGESTION_COMPLETE, false)).thenReturn(true);
- assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application,
- new ComponentName(RuntimeEnvironment.application,
- SwipeToNotificationSuggestionActivity.class))).isTrue();
+ assertThat(mProvider.isSuggestionCompleted(mContext,
+ new ComponentName(mContext, SwipeToNotificationSuggestionActivity.class))).isTrue();
}
@Test
@@ -360,6 +392,11 @@
PackageManager.DONT_KILL_APP);
}
+ private void stubFingerprintSupported(boolean enabled) {
+ when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
+ .thenReturn(enabled);
+ }
+
@Test
public void filterExclusiveSuggestions_shouldOnlyKeepFirst3() {
final List<Tile> suggestions = new ArrayList<>();
diff --git a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionsChecksTest.java b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionsChecksTest.java
index b46ee08..b3bdbb5 100644
--- a/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionsChecksTest.java
+++ b/tests/robotests/src/com/android/settings/dashboard/suggestions/SuggestionsChecksTest.java
@@ -78,6 +78,7 @@
public void testFingerprintEnrollmentIntroductionIsCompleteWhenFingerprintAdded() {
stubFingerprintSupported(true);
when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
Tile tile = createFingerprintTile();
assertThat(mSuggestionsChecks.isSuggestionComplete(tile)).isTrue();
}
@@ -86,11 +87,21 @@
public void testFingerprintEnrollmentIntroductionIsNotCompleteWhenNoFingerprintAdded() {
stubFingerprintSupported(true);
when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(false);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
Tile tile = createFingerprintTile();
assertThat(mSuggestionsChecks.isSuggestionComplete(tile)).isFalse();
}
@Test
+ public void testFingerprintEnrollmentIntroductionIsCompleteWhenHardwareNotDetected() {
+ stubFingerprintSupported(true);
+ when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(false);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
+ Tile tile = createFingerprintTile();
+ assertThat(mSuggestionsChecks.isSuggestionComplete(tile)).isTrue();
+ }
+
+ @Test
public void testFingerprintEnrollmentIntroductionIsCompleteWhenFingerprintNotSupported() {
stubFingerprintSupported(false);
Tile tile = createFingerprintTile();
@@ -101,6 +112,7 @@
public void testFingerprintEnrollmentIntroductionIsCompleteWhenFingerprintDisabled() {
stubFingerprintSupported(true);
when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(false);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mDevicePolicyManager.getKeyguardDisabledFeatures(any(), anyInt()))
.thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
diff --git a/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
index b00a511..3b92ed1 100644
--- a/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/gestures/SwipeToNotificationPreferenceControllerTest.java
@@ -18,7 +18,9 @@
import android.content.ContentResolver;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.content.res.Resources;
+import android.hardware.fingerprint.FingerprintManager;
import android.provider.Settings;
import com.android.settings.search.InlinePayload;
@@ -52,6 +54,10 @@
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private Context mContext;
+ @Mock
+ private PackageManager mPackageManager;
+ @Mock
+ private FingerprintManager mFingerprintManager;
private SwipeToNotificationPreferenceController mController;
private static final String KEY_SWIPE_DOWN = "gesture_swipe_down_fingerprint";
@@ -60,10 +66,27 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
mController = new SwipeToNotificationPreferenceController(mContext, null, KEY_SWIPE_DOWN);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ // Explicit casting to object due to MockitoCast bug
+ when((Object) mContext.getSystemService(FingerprintManager.class))
+ .thenReturn(mFingerprintManager);
+ }
+
+ @Test
+ public void isAvailable_hardwareNotAvailable_shouldReturnFalse() {
+ stubFingerprintSupported(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
+ when(mContext.getResources().
+ getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
+ .thenReturn(true);
+
+ assertThat(mController.isAvailable()).isFalse();
}
@Test
public void isAvailable_configIsTrue_shouldReturnTrue() {
+ stubFingerprintSupported(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mContext.getResources().
getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
.thenReturn(true);
@@ -73,6 +96,8 @@
@Test
public void isAvailable_configIsFalse_shouldReturnFalse() {
+ stubFingerprintSupported(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
when(mContext.getResources().
getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
.thenReturn(false);
@@ -82,6 +107,8 @@
@Test
public void testSwitchEnabled_configIsSet_shouldReturnTrue() {
+ stubFingerprintSupported(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
// Set the setting to be enabled.
final Context context = ShadowApplication.getInstance().getApplicationContext();
Settings.System.putInt(context.getContentResolver(), SYSTEM_NAVIGATION_KEYS_ENABLED, 1);
@@ -92,6 +119,8 @@
@Test
public void testSwitchEnabled_configIsNotSet_shouldReturnFalse() {
+ stubFingerprintSupported(true);
+ when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
// Set the setting to be disabled.
final Context context = ShadowApplication.getInstance().getApplicationContext();
Settings.System.putInt(context.getContentResolver(), SYSTEM_NAVIGATION_KEYS_ENABLED, 0);
@@ -139,4 +168,9 @@
assertThat(newValue).isEqualTo(currentValue);
}
+
+ private void stubFingerprintSupported(boolean enabled) {
+ when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
+ .thenReturn(enabled);
+ }
}