Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2a2dcb52 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

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

Merged-In: I2539128daff8df52d040606141f772fc9edffa57
Change-Id: I2539128daff8df52d040606141f772fc9edffa57
parent 6666bf56
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -1253,6 +1253,11 @@ public final class Utils extends com.android.settingslib.Utils {
        }
        }
    }
    }


    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.
     * Launches an intent which may optionally have a user id defined.
     * @param fragment Fragment to use to launch the activity.
     * @param fragment Fragment to use to launch the activity.
+5 −3
Original line number Original line Diff line number Diff line
@@ -65,12 +65,14 @@ public class SuggestionsChecks {
        } else if (className.equals(WifiCallingSuggestionActivity.class.getName())) {
        } else if (className.equals(WifiCallingSuggestionActivity.class.getName())) {
            return isWifiCallingUnavailableOrEnabled();
            return isWifiCallingUnavailableOrEnabled();
        } else if (className.equals(FingerprintSuggestionActivity.class.getName())) {
        } else if (className.equals(FingerprintSuggestionActivity.class.getName())) {
            return isNotSingleFingerprintEnrolled() || !isFingerprintEnabled();
            return !Utils.hasFingerprintHardware(mContext) || !isFingerprintEnabled()
                    || isNotSingleFingerprintEnrolled();
        } else if (className.equals(ScreenLockSuggestionActivity.class.getName())) {
        } else if (className.equals(ScreenLockSuggestionActivity.class.getName())) {
            return isDeviceSecured();
            return isDeviceSecured();
        } else if (className.equals(FingerprintEnrollSuggestionActivity.class.getName())) {
        } else if (className.equals(FingerprintEnrollSuggestionActivity.class.getName())) {
            FingerprintManager manager = Utils.getFingerprintManagerOrNull(mContext);
            final FingerprintManager manager = Utils.getFingerprintManagerOrNull(mContext);
            if (manager == null || !isFingerprintEnabled()) {
            if (manager == null || !isFingerprintEnabled()
                    || !Utils.hasFingerprintHardware(mContext)) {
                return true;
                return true;
            }
            }
            return manager.hasEnrolledFingerprints();
            return manager.hasEnrolledFingerprints();
+2 −2
Original line number Original line Diff line number Diff line
@@ -23,7 +23,7 @@ import android.provider.Settings;
import android.support.v7.preference.Preference;
import android.support.v7.preference.Preference;


import com.android.settings.R;
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.DatabaseIndexingUtils;
import com.android.settings.search.InlineSwitchPayload;
import com.android.settings.search.InlineSwitchPayload;
import com.android.settings.search.ResultPayload;
import com.android.settings.search.ResultPayload;
@@ -50,7 +50,7 @@ public class SwipeToNotificationPreferenceController extends GesturePreferenceCo
    }
    }


    private static boolean isGestureAvailable(Context context) {
    private static boolean isGestureAvailable(Context context) {
        return context.getResources()
        return Utils.hasFingerprintHardware(context) && context.getResources()
                .getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys);
                .getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys);
    }
    }


+56 −19
Original line number Original line Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.settings.dashboard.suggestions;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.never;
@@ -29,7 +30,10 @@ import static org.mockito.Mockito.when;
import android.content.ComponentName;
import android.content.ComponentName;
import android.content.Context;
import android.content.Context;
import android.content.Intent;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager;
import android.hardware.fingerprint.FingerprintManager;

import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.R;
import com.android.settings.Settings.AmbientDisplaySuggestionActivity;
import com.android.settings.Settings.AmbientDisplaySuggestionActivity;
@@ -72,6 +76,12 @@ public class SuggestionFeatureProviderImplTest {
    private SuggestionParser mSuggestionParser;
    private SuggestionParser mSuggestionParser;
    @Mock
    @Mock
    private Tile mSuggestion;
    private Tile mSuggestion;
    @Mock
    private PackageManager mPackageManager;
    @Mock
    private FingerprintManager mFingerprintManager;
    @Mock
    private SharedPreferences mSharedPreferences;


    private FakeFeatureFactory mFactory;
    private FakeFeatureFactory mFactory;
    private SuggestionFeatureProviderImpl mProvider;
    private SuggestionFeatureProviderImpl mProvider;
@@ -81,7 +91,12 @@ public class SuggestionFeatureProviderImplTest {
        MockitoAnnotations.initMocks(this);
        MockitoAnnotations.initMocks(this);
        FakeFeatureFactory.setupForTest(mContext);
        FakeFeatureFactory.setupForTest(mContext);
        mFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(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.getApplicationContext()).thenReturn(RuntimeEnvironment.application);

        mSuggestion.intent = new Intent().setClassName("pkg", "cls");
        mSuggestion.intent = new Intent().setClassName("pkg", "cls");
        mSuggestion.category = "category";
        mSuggestion.category = "category";


@@ -196,39 +211,56 @@ public class SuggestionFeatureProviderImplTest {
    }
    }


    @Test
    @Test
    @Config(shadows = SettingsShadowResources.class)
    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(mContext,
                new ComponentName(mContext, SwipeToNotificationSuggestionActivity.class))).isTrue();
    }

    @Test
    public void isSuggestionCompleted_swipeToNotification_trueWhenNotAvailable() {
    public void isSuggestionCompleted_swipeToNotification_trueWhenNotAvailable() {
        SettingsShadowResources.overrideResource(
        stubFingerprintSupported(true);
                com.android.internal.R.bool.config_supportSystemNavigationKeys, false);
        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
        when(mContext.getResources().
                getBoolean(com.android.internal.R.bool.config_supportSystemNavigationKeys))
                .thenReturn(false);


        assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application,
        assertThat(mProvider.isSuggestionCompleted(mContext,
                new ComponentName(RuntimeEnvironment.application,
                new ComponentName(mContext, SwipeToNotificationSuggestionActivity.class))).isTrue();
                        SwipeToNotificationSuggestionActivity.class))).isTrue();
    }
    }


    @Test
    @Test
    @Config(shadows = SettingsShadowResources.class)
    public void isSuggestionCompleted_swipeToNotification_falseWhenNotVisited() {
    public void isSuggestionCompleted_swipeToNotification_falseWhenNotVisited() {
        SettingsShadowResources.overrideResource(
        stubFingerprintSupported(true);
                com.android.internal.R.bool.config_supportSystemNavigationKeys, 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.
        // No stored value in shared preferences if not visited yet.


        assertThat(mProvider.isSuggestionCompleted(RuntimeEnvironment.application,
        assertThat(mProvider.isSuggestionCompleted(mContext,
                new ComponentName(RuntimeEnvironment.application,
                new ComponentName(mContext,
                        SwipeToNotificationSuggestionActivity.class))).isFalse();
                        SwipeToNotificationSuggestionActivity.class))).isFalse();
    }
    }


    @Test
    @Test
    @Config(shadows = SettingsShadowResources.class)
    public void isSuggestionCompleted_swipeToNotification_trueWhenVisited() {
    public void isSuggestionCompleted_swipeToNotification_trueWhenVisited() {
        SettingsShadowResources.overrideResource(
        stubFingerprintSupported(true);
                com.android.internal.R.bool.config_supportSystemNavigationKeys, true);
        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
        mProvider.getSharedPrefs(RuntimeEnvironment.application).edit().putBoolean(
        when(mContext.getResources().
                SwipeToNotificationSettings.PREF_KEY_SUGGESTION_COMPLETE, true).commit();
                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,
        assertThat(mProvider.isSuggestionCompleted(mContext,
                new ComponentName(RuntimeEnvironment.application,
                new ComponentName(mContext, SwipeToNotificationSuggestionActivity.class))).isTrue();
                        SwipeToNotificationSuggestionActivity.class))).isTrue();
    }
    }


    @Test
    @Test
@@ -313,6 +345,11 @@ public class SuggestionFeatureProviderImplTest {
                        PackageManager.DONT_KILL_APP);
                        PackageManager.DONT_KILL_APP);
    }
    }


    private void stubFingerprintSupported(boolean enabled) {
        when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT))
                .thenReturn(enabled);
    }

    @Test
    @Test
    public void filterExclusiveSuggestions_shouldOnlyKeepFirst3() {
    public void filterExclusiveSuggestions_shouldOnlyKeepFirst3() {
        final List<Tile> suggestions = new ArrayList<>();
        final List<Tile> suggestions = new ArrayList<>();
+12 −0
Original line number Original line Diff line number Diff line
@@ -78,6 +78,7 @@ public class SuggestionsChecksTest {
    public void testFingerprintEnrollmentIntroductionIsCompleteWhenFingerprintAdded() {
    public void testFingerprintEnrollmentIntroductionIsCompleteWhenFingerprintAdded() {
        stubFingerprintSupported(true);
        stubFingerprintSupported(true);
        when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(true);
        when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(true);
        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
        Tile tile = createFingerprintTile();
        Tile tile = createFingerprintTile();
        assertThat(mSuggestionsChecks.isSuggestionComplete(tile)).isTrue();
        assertThat(mSuggestionsChecks.isSuggestionComplete(tile)).isTrue();
    }
    }
@@ -86,10 +87,20 @@ public class SuggestionsChecksTest {
    public void testFingerprintEnrollmentIntroductionIsNotCompleteWhenNoFingerprintAdded() {
    public void testFingerprintEnrollmentIntroductionIsNotCompleteWhenNoFingerprintAdded() {
        stubFingerprintSupported(true);
        stubFingerprintSupported(true);
        when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(false);
        when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(false);
        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
        Tile tile = createFingerprintTile();
        Tile tile = createFingerprintTile();
        assertThat(mSuggestionsChecks.isSuggestionComplete(tile)).isFalse();
        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
    @Test
    public void testFingerprintEnrollmentIntroductionIsCompleteWhenFingerprintNotSupported() {
    public void testFingerprintEnrollmentIntroductionIsCompleteWhenFingerprintNotSupported() {
@@ -102,6 +113,7 @@ public class SuggestionsChecksTest {
    public void testFingerprintEnrollmentIntroductionIsCompleteWhenFingerprintDisabled() {
    public void testFingerprintEnrollmentIntroductionIsCompleteWhenFingerprintDisabled() {
        stubFingerprintSupported(true);
        stubFingerprintSupported(true);
        when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(false);
        when(mFingerprintManager.hasEnrolledFingerprints()).thenReturn(false);
        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
        when(mDevicePolicyManager.getKeyguardDisabledFeatures(any(), anyInt()))
        when(mDevicePolicyManager.getKeyguardDisabledFeatures(any(), anyInt()))
                .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
                .thenReturn(DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);


Loading