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();