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

Commit d6a02b6e authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Hide "unlock" button when the UDFPS is enabled." into sc-dev am: 68cced0e

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/14878790

Change-Id: I61b7705bff41a9aeb58eb1abc8568400368fa49a
parents f757a908 68cced0e
Loading
Loading
Loading
Loading
+29 −3
Original line number Diff line number Diff line
@@ -19,8 +19,8 @@ package com.android.systemui.wallet.ui;
import static android.provider.Settings.ACTION_LOCKSCREEN_SETTINGS;

import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.hardware.biometrics.BiometricSourceType;
import android.os.Bundle;
import android.os.Handler;
import android.service.quickaccesswallet.QuickAccessWalletClient;
@@ -34,6 +34,9 @@ import android.widget.Toolbar;

import androidx.annotation.NonNull;

import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.dagger.qualifiers.Main;
@@ -63,7 +66,10 @@ public class WalletActivity extends LifecycleActivity implements
    private final Handler mHandler;
    private final FalsingManager mFalsingManager;
    private final UserTracker mUserTracker;
    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    private final StatusBarKeyguardViewManager mKeyguardViewManager;

    private KeyguardUpdateMonitorCallback mKeyguardUpdateMonitorCallback;
    private WalletScreenController mWalletScreenController;
    private QuickAccessWalletClient mWalletClient;
    private boolean mHasRegisteredListener;
@@ -77,6 +83,7 @@ public class WalletActivity extends LifecycleActivity implements
            @Main Handler handler,
            FalsingManager falsingManager,
            UserTracker userTracker,
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            StatusBarKeyguardViewManager keyguardViewManager) {
        mKeyguardStateController = keyguardStateController;
        mKeyguardDismissUtil = keyguardDismissUtil;
@@ -85,6 +92,7 @@ public class WalletActivity extends LifecycleActivity implements
        mHandler = handler;
        mFalsingManager = falsingManager;
        mUserTracker = userTracker;
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mKeyguardViewManager = keyguardViewManager;
    }

@@ -116,7 +124,17 @@ public class WalletActivity extends LifecycleActivity implements
                mHandler,
                mUserTracker,
                mFalsingManager,
                mKeyguardUpdateMonitor,
                mKeyguardStateController);
        mKeyguardUpdateMonitorCallback = new KeyguardUpdateMonitorCallback() {
            @Override
            public void onBiometricRunningStateChanged(
                    boolean running,
                    BiometricSourceType biometricSourceType) {
                Log.d(TAG, "Biometric running state has changed.");
                mWalletScreenController.queryWalletCards();
            }
        };

        walletView.getAppButton().setOnClickListener(
                v -> {
@@ -146,7 +164,9 @@ public class WalletActivity extends LifecycleActivity implements
        // Click the action button to re-render the screen when the device is unlocked.
        walletView.setDeviceLockedActionOnClickListener(
                v -> {
                    Log.d(TAG, "Wallet action button is clicked.");
                    if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
                        Log.d(TAG, "False tap detected on wallet action button.");
                        return;
                    }

@@ -164,13 +184,17 @@ public class WalletActivity extends LifecycleActivity implements
            mHasRegisteredListener = true;
        }
        mKeyguardStateController.addCallback(mWalletScreenController);
        mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback);
    }

    @Override
    protected void onResume() {
        super.onResume();
        mWalletScreenController.queryWalletCards();
        mKeyguardViewManager.requestFp(true, Color.BLACK);
        mKeyguardViewManager.requestFp(
                true,
                Utils.getColorAttrDefaultColor(
                        this, com.android.internal.R.attr.colorAccentPrimary));
        mKeyguardViewManager.requestFace(true);
    }

@@ -195,7 +219,6 @@ public class WalletActivity extends LifecycleActivity implements
    public void onWalletServiceEvent(WalletServiceEvent event) {
        switch (event.getEventType()) {
            case WalletServiceEvent.TYPE_NFC_PAYMENT_STARTED:
                finish();
                break;
            case WalletServiceEvent.TYPE_WALLET_CARDS_UPDATED:
                mWalletScreenController.queryWalletCards();
@@ -224,6 +247,9 @@ public class WalletActivity extends LifecycleActivity implements
    @Override
    protected void onDestroy() {
        mKeyguardStateController.removeCallback(mWalletScreenController);
        if (mKeyguardUpdateMonitorCallback != null) {
            mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateMonitorCallback);
        }
        mWalletScreenController.onDismissed();
        mWalletClient.removeWalletServiceEventListener(this);
        mHasRegisteredListener = false;
+10 −1
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import android.widget.FrameLayout;
import androidx.annotation.NonNull;

import com.android.internal.annotations.VisibleForTesting;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
@@ -66,6 +67,7 @@ public class WalletScreenController implements
    private final ActivityStarter mActivityStarter;
    private final Executor mExecutor;
    private final Handler mHandler;
    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    private final KeyguardStateController mKeyguardStateController;
    private final Runnable mSelectionRunnable = this::selectCard;
    private final SharedPreferences mPrefs;
@@ -85,6 +87,7 @@ public class WalletScreenController implements
            Handler handler,
            UserTracker userTracker,
            FalsingManager falsingManager,
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            KeyguardStateController keyguardStateController) {
        mContext = context;
        mWalletClient = walletClient;
@@ -92,6 +95,7 @@ public class WalletScreenController implements
        mExecutor = executor;
        mHandler = handler;
        mFalsingManager = falsingManager;
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mKeyguardStateController = keyguardStateController;
        mPrefs = userTracker.getUserContext().getSharedPreferences(TAG, Context.MODE_PRIVATE);
        mWalletView = walletView;
@@ -134,8 +138,13 @@ public class WalletScreenController implements
                    Log.w(TAG, "Invalid selected card index, showing empty state.");
                    showEmptyStateView();
                } else {
                    boolean isUdfpsEnabled = mKeyguardUpdateMonitor.isUdfpsEnrolled()
                            && mKeyguardUpdateMonitor.isFingerprintDetectionRunning();
                    mWalletView.showCardCarousel(
                            data, selectedIndex, !mKeyguardStateController.isUnlocked());
                            data,
                            selectedIndex,
                            !mKeyguardStateController.isUnlocked(),
                            isUdfpsEnabled);
                }
            }
            removeMinHeightAndRecordHeightOnLayout();
+12 −6
Original line number Diff line number Diff line
@@ -63,6 +63,7 @@ public class WalletView extends FrameLayout implements WalletCardCarousel.OnCard
    private final ViewGroup mEmptyStateView;
    private CharSequence mCenterCardText;
    private boolean mIsDeviceLocked = false;
    private boolean mIsUdfpsEnabled = false;
    private OnClickListener mDeviceLockedActionOnClickListener;

    public WalletView(Context context) {
@@ -108,7 +109,7 @@ public class WalletView extends FrameLayout implements WalletCardCarousel.OnCard
            mCardLabel.setText(centerCardText);
            mIcon.setImageDrawable(centerCardIcon);
        }
        renderActionButton(centerCard, mIsDeviceLocked);
        renderActionButton(centerCard, mIsDeviceLocked, mIsUdfpsEnabled);
        if (TextUtils.equals(centerCardText, getLabelText(nextCard))) {
            mCardLabel.setAlpha(1f);
        } else {
@@ -128,15 +129,19 @@ public class WalletView extends FrameLayout implements WalletCardCarousel.OnCard
     * @param isDeviceLocked indicates whether the device is locked.
     */
    void showCardCarousel(
            List<WalletCardViewInfo> data, int selectedIndex, boolean isDeviceLocked) {
            List<WalletCardViewInfo> data,
            int selectedIndex,
            boolean isDeviceLocked,
            boolean isUdfpsEnabled) {
        boolean shouldAnimate =
                mCardCarousel.setData(data, selectedIndex, mIsDeviceLocked != isDeviceLocked);
        mIsDeviceLocked = isDeviceLocked;
        mIsUdfpsEnabled = isUdfpsEnabled;
        mCardCarouselContainer.setVisibility(VISIBLE);
        mErrorView.setVisibility(GONE);
        mEmptyStateView.setVisibility(GONE);
        mIcon.setImageDrawable(getHeaderIcon(mContext, data.get(selectedIndex)));
        renderActionButton(data.get(selectedIndex), isDeviceLocked);
        renderActionButton(data.get(selectedIndex), isDeviceLocked, mIsUdfpsEnabled);
        if (shouldAnimate) {
            animateViewsShown(mIcon, mCardLabel, mActionButton);
        }
@@ -240,13 +245,14 @@ public class WalletView extends FrameLayout implements WalletCardCarousel.OnCard
        return icon;
    }

    private void renderActionButton(WalletCardViewInfo walletCard, boolean isDeviceLocked) {
    private void renderActionButton(
            WalletCardViewInfo walletCard, boolean isDeviceLocked, boolean isUdfpsEnabled) {
        CharSequence actionButtonText = getActionButtonText(walletCard);
        if (isDeviceLocked) {
        if (!isUdfpsEnabled && isDeviceLocked) {
            mActionButton.setVisibility(VISIBLE);
            mActionButton.setText(R.string.wallet_action_button_label_unlock);
            mActionButton.setOnClickListener(mDeviceLockedActionOnClickListener);
        } else if (actionButtonText != null) {
        } else if (!isDeviceLocked && actionButtonText != null) {
            mActionButton.setText(actionButtonText);
            mActionButton.setVisibility(VISIBLE);
            mActionButton.setOnClickListener(v -> {
+56 −5
Original line number Diff line number Diff line
@@ -34,7 +34,6 @@ import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.os.Handler;
import android.service.quickaccesswallet.GetWalletCardsError;
import android.service.quickaccesswallet.GetWalletCardsRequest;
import android.service.quickaccesswallet.GetWalletCardsResponse;
import android.service.quickaccesswallet.QuickAccessWalletClient;
import android.service.quickaccesswallet.QuickAccessWalletService;
@@ -44,6 +43,7 @@ import android.testing.TestableLooper;

import androidx.test.filters.SmallTest;

import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
@@ -89,15 +89,13 @@ public class WalletScreenControllerTest extends SysuiTestCase {
    @Mock
    FalsingManager mFalsingManager;
    @Mock
    KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    @Mock
    KeyguardStateController mKeyguardStateController;
    @Captor
    ArgumentCaptor<Intent> mIntentCaptor;
    @Captor
    ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor;
    @Captor
    ArgumentCaptor<QuickAccessWalletClient.OnWalletCardsRetrievedCallback> mCallbackCaptor;
    @Captor
    ArgumentCaptor<QuickAccessWalletClient.WalletServiceEventListener> mListenerCaptor;
    private WalletScreenController mController;
    private TestableLooper mTestableLooper;

@@ -114,6 +112,8 @@ public class WalletScreenControllerTest extends SysuiTestCase {
        when(mWalletClient.getServiceLabel()).thenReturn(SERVICE_LABEL);
        when(mWalletClient.createWalletIntent()).thenReturn(mWalletIntent);
        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
        when(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(false);
        when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(false);
        mController = new WalletScreenController(
                mContext,
                mWalletView,
@@ -123,9 +123,60 @@ public class WalletScreenControllerTest extends SysuiTestCase {
                new Handler(mTestableLooper.getLooper()),
                mUserTracker,
                mFalsingManager,
                mKeyguardUpdateMonitor,
                mKeyguardStateController);
    }

    @Test
    public void queryCards_deviceLocked_udfpsEnabled_hideUnlockButton() {
        when(mKeyguardUpdateMonitor.isFingerprintDetectionRunning()).thenReturn(true);
        when(mKeyguardUpdateMonitor.isUdfpsEnrolled()).thenReturn(true);
        when(mKeyguardStateController.isUnlocked()).thenReturn(false);
        GetWalletCardsResponse response =
                new GetWalletCardsResponse(
                        Collections.singletonList(createWalletCard(mContext)), 0);

        mController.queryWalletCards();
        mTestableLooper.processAllMessages();

        verify(mWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture());

        QuickAccessWalletClient.OnWalletCardsRetrievedCallback callback =
                mCallbackCaptor.getValue();

        assertEquals(mController, callback);

        callback.onWalletCardsRetrieved(response);
        mTestableLooper.processAllMessages();

        assertEquals(VISIBLE, mWalletView.getCardCarouselContainer().getVisibility());
        assertEquals(GONE, mWalletView.getActionButton().getVisibility());
    }

    @Test
    public void queryCards_deviceLocked_udfpsNotEnabled_showUnlockButton() {
        when(mKeyguardStateController.isUnlocked()).thenReturn(false);
        GetWalletCardsResponse response =
                new GetWalletCardsResponse(
                        Collections.singletonList(createWalletCard(mContext)), 0);

        mController.queryWalletCards();
        mTestableLooper.processAllMessages();

        verify(mWalletClient).getWalletCards(any(), any(), mCallbackCaptor.capture());

        QuickAccessWalletClient.OnWalletCardsRetrievedCallback callback =
                mCallbackCaptor.getValue();

        assertEquals(mController, callback);

        callback.onWalletCardsRetrieved(response);
        mTestableLooper.processAllMessages();

        assertEquals(VISIBLE, mWalletView.getCardCarouselContainer().getVisibility());
        assertEquals(VISIBLE, mWalletView.getActionButton().getVisibility());
    }

    @Test
    public void queryCards_hasCards_showCarousel_activeCard() {
        GetWalletCardsResponse response =