From 16d26494f69c57caf97083f4b320d996ec069604 Mon Sep 17 00:00:00 2001 From: Silin Huang Date: Mon, 7 Jun 2021 00:11:17 -0700 Subject: [PATCH] Hide "unlock" button when the UDFPS is enabled. Also update the UDFPS fingerprint icon color to material next colors. Bug: 188541680 Test: atest Change-Id: Id09bf898090b42e9e539597266b001734da356f3 --- .../systemui/wallet/ui/WalletActivity.java | 32 +++++++++- .../wallet/ui/WalletScreenController.java | 11 +++- .../systemui/wallet/ui/WalletView.java | 18 ++++-- .../wallet/ui/WalletScreenControllerTest.java | 61 +++++++++++++++++-- 4 files changed, 107 insertions(+), 15 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java index 236954b786587..2dcc43cf60dcd 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java @@ -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; diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java index 96a3087a95683..ab8ad7779689d 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java @@ -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(); diff --git a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java index 4f83abfa64a93..8412a8ae966ee 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java @@ -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 data, int selectedIndex, boolean isDeviceLocked) { + List 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 -> { diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java index 01623d6cfa683..e6c740b3a2634 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/ui/WalletScreenControllerTest.java @@ -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 mIntentCaptor; @Captor - ArgumentCaptor mRequestCaptor; - @Captor ArgumentCaptor mCallbackCaptor; - @Captor - ArgumentCaptor 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 =