From cb639a9e4b76cf90bda8a08ef04c92be2a6bc816 Mon Sep 17 00:00:00 2001 From: Silin Huang Date: Wed, 2 Jun 2021 08:58:58 -0700 Subject: [PATCH] Polish Wallet empty state view. Another change is a bug fix that do not use the cached "mWalletEnabled" on cards querying, because that param is for the wallet preference only. We use "cardsRetriever"s to handle querying cards on wallet feature/service not available. Also register the wallet service event listener to WalletActivity, this enables the wallet activity finish after the user makes an NFC payment tap. Fixes: 189869634 Fixes: 187970986 Fixes: 188972317 Test: manual- see demo: https: //drive.google.com/file/d/1I-vwffhRqR2HDHR8wQqitOqzH0tWjMEI/view?usp=sharing&resourcekey=0-3BZsJl_c7jzW7muwNG9hmA Change-Id: If907cb5d6c89878d2a5a6a282284e3bf77f7188f --- .../res/layout/wallet_empty_state.xml | 2 +- .../SystemUI/res/layout/wallet_fullscreen.xml | 7 +-- packages/SystemUI/res/values/strings.xml | 2 + .../qs/tiles/QuickAccessWalletTile.java | 5 +-- .../QuickAccessWalletController.java | 5 --- .../systemui/wallet/ui/WalletActivity.java | 41 +++++++++++++++--- .../wallet/ui/WalletScreenController.java | 31 +------------ .../systemui/wallet/ui/WalletView.java | 8 ++-- .../qs/tiles/QuickAccessWalletTileTest.java | 6 --- .../QuickAccessWalletControllerTest.java | 12 ------ .../wallet/ui/WalletScreenControllerTest.java | 43 +------------------ 11 files changed, 51 insertions(+), 111 deletions(-) diff --git a/packages/SystemUI/res/layout/wallet_empty_state.xml b/packages/SystemUI/res/layout/wallet_empty_state.xml index cc2e781a8f13b..d41679a5b4162 100644 --- a/packages/SystemUI/res/layout/wallet_empty_state.xml +++ b/packages/SystemUI/res/layout/wallet_empty_state.xml @@ -22,7 +22,7 @@ android:id="@+id/wallet_empty_state" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_marginHorizontal="16dp" + android:layout_marginHorizontal="48dp" android:layout_marginTop="48dp" android:background="@drawable/wallet_empty_state_bg" android:orientation="vertical" diff --git a/packages/SystemUI/res/layout/wallet_fullscreen.xml b/packages/SystemUI/res/layout/wallet_fullscreen.xml index aceefeecad5a9..71006f08e8fae 100644 --- a/packages/SystemUI/res/layout/wallet_fullscreen.xml +++ b/packages/SystemUI/res/layout/wallet_fullscreen.xml @@ -54,9 +54,12 @@ android:id="@+id/label" android:layout_width="match_parent" android:layout_height="wrap_content" - style="@style/Wallet.TextAppearance" + android:layout_marginHorizontal="48dp" + android:textColor="?androidprv:attr/textColorPrimary" android:textAlignment="center"/> + + - - Wallet + + Get set up to make faster, more secure purchases with your phone Show all diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java index 64aec5e0b32b5..7fab0f5f802c5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java @@ -56,7 +56,6 @@ import com.android.systemui.wallet.controller.QuickAccessWalletController; import com.android.systemui.wallet.ui.WalletActivity; import java.util.List; -import java.util.concurrent.Executor; import javax.inject.Inject; @@ -71,7 +70,6 @@ public class QuickAccessWalletTile extends QSTileImpl { private final KeyguardStateController mKeyguardStateController; private final PackageManager mPackageManager; private final SecureSettings mSecureSettings; - private final Executor mExecutor; private final QuickAccessWalletController mController; private final FeatureFlags mFeatureFlags; @@ -91,7 +89,6 @@ public class QuickAccessWalletTile extends QSTileImpl { KeyguardStateController keyguardStateController, PackageManager packageManager, SecureSettings secureSettings, - @Main Executor executor, QuickAccessWalletController quickAccessWalletController, FeatureFlags featureFlags) { super(host, backgroundLooper, mainHandler, falsingManager, metricsLogger, @@ -100,7 +97,6 @@ public class QuickAccessWalletTile extends QSTileImpl { mKeyguardStateController = keyguardStateController; mPackageManager = packageManager; mSecureSettings = secureSettings; - mExecutor = executor; mFeatureFlags = featureFlags; } @@ -118,6 +114,7 @@ public class QuickAccessWalletTile extends QSTileImpl { if (listening) { mController.setupWalletChangeObservers(mCardRetriever, DEFAULT_PAYMENT_APP_CHANGE); if (!mController.getWalletClient().isWalletServiceAvailable()) { + Log.i(TAG, "QAW service is unavailable, recreating the wallet client."); mController.reCreateWalletClient(); } mController.queryWalletCards(mCardRetriever); diff --git a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java index 9d0cc6a00ec0e..65f236b77a643 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/controller/QuickAccessWalletController.java @@ -25,7 +25,6 @@ import android.provider.Settings; import android.service.quickaccesswallet.GetWalletCardsRequest; import android.service.quickaccesswallet.QuickAccessWalletClient; import android.service.quickaccesswallet.QuickAccessWalletClientImpl; -import android.util.Log; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; @@ -143,10 +142,6 @@ public class QuickAccessWalletController { */ public void queryWalletCards( QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever) { - if (!mWalletEnabled) { - Log.w(TAG, "QuickAccessWallet is unavailable, unable to query cards."); - return; - } int cardWidth = mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_width); int cardHeight = 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 c6123e77076d7..236954b786587 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletActivity.java @@ -24,6 +24,7 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; import android.service.quickaccesswallet.QuickAccessWalletClient; +import android.service.quickaccesswallet.WalletServiceEvent; import android.util.Log; import android.view.Menu; import android.view.MenuItem; @@ -51,7 +52,8 @@ import javax.inject.Inject; /** * Displays Wallet carousel screen inside an activity. */ -public class WalletActivity extends LifecycleActivity { +public class WalletActivity extends LifecycleActivity implements + QuickAccessWalletClient.WalletServiceEventListener { private static final String TAG = "WalletActivity"; private final KeyguardStateController mKeyguardStateController; @@ -63,6 +65,8 @@ public class WalletActivity extends LifecycleActivity { private final UserTracker mUserTracker; private final StatusBarKeyguardViewManager mKeyguardViewManager; private WalletScreenController mWalletScreenController; + private QuickAccessWalletClient mWalletClient; + private boolean mHasRegisteredListener; @Inject public WalletActivity( @@ -102,11 +106,11 @@ public class WalletActivity extends LifecycleActivity { getActionBar().setHomeActionContentDescription(R.string.accessibility_desc_close); WalletView walletView = requireViewById(R.id.wallet_view); - QuickAccessWalletClient walletClient = QuickAccessWalletClient.create(this); + mWalletClient = QuickAccessWalletClient.create(this); mWalletScreenController = new WalletScreenController( this, walletView, - walletClient, + mWalletClient, mActivityStarter, mExecutor, mHandler, @@ -116,7 +120,7 @@ public class WalletActivity extends LifecycleActivity { walletView.getAppButton().setOnClickListener( v -> { - if (walletClient.createWalletIntent() == null) { + if (mWalletClient.createWalletIntent() == null) { Log.w(TAG, "Unable to create wallet app intent."); return; } @@ -127,12 +131,12 @@ public class WalletActivity extends LifecycleActivity { if (mKeyguardStateController.isUnlocked()) { mActivityStarter.startActivity( - walletClient.createWalletIntent(), true); + mWalletClient.createWalletIntent(), true); finish(); } else { mKeyguardDismissUtil.executeWhenUnlocked(() -> { mActivityStarter.startActivity( - walletClient.createWalletIntent(), true); + mWalletClient.createWalletIntent(), true); finish(); return false; }, false, true); @@ -154,6 +158,11 @@ public class WalletActivity extends LifecycleActivity { @Override protected void onStart() { super.onStart(); + if (!mHasRegisteredListener) { + // Listener is registered even when device is locked. Should only be registered once. + mWalletClient.addWalletServiceEventListener(this); + mHasRegisteredListener = true; + } mKeyguardStateController.addCallback(mWalletScreenController); } @@ -178,6 +187,24 @@ public class WalletActivity extends LifecycleActivity { return super.onCreateOptionsMenu(menu); } + /** + * Implements {@link QuickAccessWalletClient.WalletServiceEventListener}. Called when the wallet + * application propagates an event, such as an NFC tap, to the quick access wallet view. + */ + @Override + public void onWalletServiceEvent(WalletServiceEvent event) { + switch (event.getEventType()) { + case WalletServiceEvent.TYPE_NFC_PAYMENT_STARTED: + finish(); + break; + case WalletServiceEvent.TYPE_WALLET_CARDS_UPDATED: + mWalletScreenController.queryWalletCards(); + break; + default: + Log.w(TAG, "onWalletServiceEvent: Unknown event type"); + } + } + @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { int itemId = item.getItemId(); @@ -198,6 +225,8 @@ public class WalletActivity extends LifecycleActivity { protected void onDestroy() { mKeyguardStateController.removeCallback(mWalletScreenController); mWalletScreenController.onDismissed(); + mWalletClient.removeWalletServiceEventListener(this); + mHasRegisteredListener = false; super.onDestroy(); } 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 8da80caefdd37..96a3087a95683 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletScreenController.java @@ -30,7 +30,6 @@ import android.service.quickaccesswallet.GetWalletCardsResponse; import android.service.quickaccesswallet.QuickAccessWalletClient; import android.service.quickaccesswallet.SelectWalletCardRequest; import android.service.quickaccesswallet.WalletCard; -import android.service.quickaccesswallet.WalletServiceEvent; import android.text.TextUtils; import android.util.Log; import android.view.View; @@ -55,7 +54,6 @@ import java.util.concurrent.TimeUnit; public class WalletScreenController implements WalletCardCarousel.OnSelectionListener, QuickAccessWalletClient.OnWalletCardsRetrievedCallback, - QuickAccessWalletClient.WalletServiceEventListener, KeyguardStateController.Callback { private static final String TAG = "WalletScreenCtrl"; @@ -77,7 +75,6 @@ public class WalletScreenController implements @VisibleForTesting String mSelectedCardId; @VisibleForTesting boolean mIsDismissed; - private boolean mHasRegisteredListener; public WalletScreenController( Context context, @@ -117,6 +114,7 @@ public class WalletScreenController implements if (mIsDismissed) { return; } + Log.i(TAG, "Successfully retrieved wallet cards."); List walletCards = response.getWalletCards(); List data = new ArrayList<>(walletCards.size()); for (WalletCard card : walletCards) { @@ -158,26 +156,6 @@ public class WalletScreenController implements }); } - /** - * Implements {@link QuickAccessWalletClient.WalletServiceEventListener}. Called when the wallet - * application propagates an event, such as an NFC tap, to the quick access wallet view. - */ - @Override - public void onWalletServiceEvent(WalletServiceEvent event) { - if (mIsDismissed) { - return; - } - switch (event.getEventType()) { - case WalletServiceEvent.TYPE_NFC_PAYMENT_STARTED: - break; - case WalletServiceEvent.TYPE_WALLET_CARDS_UPDATED: - queryWalletCards(); - break; - default: - Log.w(TAG, "onWalletServiceEvent: Unknown event type"); - } - } - @Override public void onKeyguardFadingAwayChanged() { queryWalletCards(); @@ -236,11 +214,6 @@ public class WalletScreenController implements if (cardWidthPx == 0 || cardHeightPx == 0) { return; } - if (!mHasRegisteredListener) { - // Listener is registered even when device is locked. Should only be registered once. - mWalletClient.addWalletServiceEventListener(this); - mHasRegisteredListener = true; - } mWalletView.show(); mWalletView.hideErrorMessage(); @@ -261,7 +234,6 @@ public class WalletScreenController implements mSelectedCardId = null; mHandler.removeCallbacks(mSelectionRunnable); mWalletClient.notifyWalletDismissed(); - mWalletClient.removeWalletServiceEventListener(this); mWalletView.animateDismissal(); // clear refs to the Wallet Activity mContext = null; @@ -282,7 +254,6 @@ public class WalletScreenController implements mWalletView.hide(); mPrefs.edit().putInt(PREFS_WALLET_VIEW_HEIGHT, 0).apply(); } else { - logo.setTint(mContext.getColor(R.color.GM2_grey_900)); mWalletView.showEmptyStateView( logo, logoContentDesc, 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 bf146b6cd02fc..4f83abfa64a93 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java +++ b/packages/SystemUI/src/com/android/systemui/wallet/ui/WalletView.java @@ -161,10 +161,12 @@ public class WalletView extends FrameLayout implements WalletCardCarousel.OnCard OnClickListener clickListener) { mEmptyStateView.setVisibility(VISIBLE); mErrorView.setVisibility(GONE); - mCardCarouselContainer.setVisibility(GONE); + mCardCarousel.setVisibility(GONE); + mIcon.setImageDrawable(logo); + mIcon.setContentDescription(logoContentDescription); + mCardLabel.setText(R.string.wallet_empty_state_label); ImageView logoView = mEmptyStateView.requireViewById(R.id.empty_state_icon); - logoView.setImageDrawable(logo); - logoView.setContentDescription(logoContentDescription); + logoView.setImageDrawable(mContext.getDrawable(R.drawable.ic_qs_plus)); mEmptyStateView.requireViewById(R.id.empty_state_title).setText(label); mEmptyStateView.setOnClickListener(clickListener); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java index b09afab3d242f..09b042700dd88 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/QuickAccessWalletTileTest.java @@ -46,7 +46,6 @@ import android.graphics.Bitmap; 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; @@ -75,8 +74,6 @@ import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.settings.SecureSettings; import com.android.systemui.wallet.controller.QuickAccessWalletController; -import com.google.common.util.concurrent.MoreExecutors; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -126,8 +123,6 @@ public class QuickAccessWalletTileTest extends SysuiTestCase { @Captor ArgumentCaptor mIntentCaptor; @Captor - ArgumentCaptor mRequestCaptor; - @Captor ArgumentCaptor mCallbackCaptor; private Context mSpiedContext; @@ -163,7 +158,6 @@ public class QuickAccessWalletTileTest extends SysuiTestCase { mKeyguardStateController, mPackageManager, mSecureSettings, - MoreExecutors.directExecutor(), mController, mFeatureFlags); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java index 33666bc5b4627..23abce0867283 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/wallet/controller/QuickAccessWalletControllerTest.java @@ -21,9 +21,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -126,18 +124,8 @@ public class QuickAccessWalletControllerTest extends SysuiTestCase { assertNotSame(mQuickAccessWalletClient, mController.getWalletClient()); } - @Test - public void queryWalletCards_walletNotEnabled_notQuery() { - when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false); - - mController.queryWalletCards(mCardsRetriever); - - verify(mQuickAccessWalletClient, never()).getWalletCards(any(), any(), any()); - } - @Test public void queryWalletCards_walletEnabled_queryCards() { - mController.updateWalletPreference(); mController.queryWalletCards(mCardsRetriever); verify(mQuickAccessWalletClient) 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 cd1eb1c4468e0..01623d6cfa683 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 @@ -20,13 +20,9 @@ import static android.view.View.GONE; import static android.view.View.VISIBLE; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.app.PendingIntent; @@ -43,7 +39,6 @@ import android.service.quickaccesswallet.GetWalletCardsResponse; import android.service.quickaccesswallet.QuickAccessWalletClient; import android.service.quickaccesswallet.QuickAccessWalletService; import android.service.quickaccesswallet.WalletCard; -import android.service.quickaccesswallet.WalletServiceEvent; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -250,7 +245,7 @@ public class WalletScreenControllerTest extends SysuiTestCase { callback.onWalletCardsRetrieved(response); mTestableLooper.processAllMessages(); - assertEquals(GONE, mWalletView.getCardCarouselContainer().getVisibility()); + assertEquals(GONE, mWalletView.getCardCarousel().getVisibility()); assertEquals(VISIBLE, mWalletView.getEmptyStateView().getVisibility()); assertEquals(GONE, mWalletView.getErrorView().getVisibility()); } @@ -267,7 +262,7 @@ public class WalletScreenControllerTest extends SysuiTestCase { mCallbackCaptor.getValue().onWalletCardsRetrieved(response); mTestableLooper.processAllMessages(); - assertEquals(GONE, mWalletView.getCardCarouselContainer().getVisibility()); + assertEquals(GONE, mWalletView.getCardCarousel().getVisibility()); assertEquals(VISIBLE, mWalletView.getEmptyStateView().getVisibility()); assertEquals(GONE, mWalletView.getErrorView().getVisibility()); } @@ -291,40 +286,6 @@ public class WalletScreenControllerTest extends SysuiTestCase { assertEquals(errorMessage, mWalletView.getErrorView().getText().toString()); } - @Test - public void onWalletServiceEvent_nfcPaymentStart_doNothing() { - WalletServiceEvent event = - new WalletServiceEvent(WalletServiceEvent.TYPE_NFC_PAYMENT_STARTED); - - mController.onWalletServiceEvent(event); - mTestableLooper.processAllMessages(); - - assertNull(mController.mSelectedCardId); - assertFalse(mController.mIsDismissed); - verifyZeroInteractions(mWalletClient); - } - - @Test - public void onWalletServiceEvent_walletCardsUpdate_queryCards() { - mController.queryWalletCards(); - - verify(mWalletClient).addWalletServiceEventListener(mListenerCaptor.capture()); - - WalletServiceEvent event = - new WalletServiceEvent(WalletServiceEvent.TYPE_WALLET_CARDS_UPDATED); - - QuickAccessWalletClient.WalletServiceEventListener listener = mListenerCaptor.getValue(); - listener.onWalletServiceEvent(event); - mTestableLooper.processAllMessages(); - - verify(mWalletClient, times(2)) - .getWalletCards(any(), mRequestCaptor.capture(), mCallbackCaptor.capture()); - - GetWalletCardsRequest request = mRequestCaptor.getValue(); - - assertEquals(MAX_CARDS, request.getMaxCards()); - } - @Test public void onKeyguardFadingAwayChanged_queryCards() { mController.onKeyguardFadingAwayChanged();