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

Commit bb123d7b authored by Silin Huang's avatar Silin Huang Committed by Automerger Merge Worker
Browse files

Merge "Update wallet tile secondary label when QAW cards fetching in flight."...

Merge "Update wallet tile secondary label when QAW cards fetching in flight." into sc-dev am: ed6a7679 am: 71ceda27 am: 945d3802

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

Change-Id: Ic85c70e6367cfd9766f6fa5cbdcda4fdaa6d7111
parents 843d1080 945d3802
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -1661,6 +1661,8 @@
    <string name="wallet_action_button_label_unlock">Unlock to pay</string>
    <string name="wallet_action_button_label_unlock">Unlock to pay</string>
    <!-- Secondary label of the quick access wallet tile if no card. [CHAR LIMIT=NONE] -->
    <!-- Secondary label of the quick access wallet tile if no card. [CHAR LIMIT=NONE] -->
    <string name="wallet_secondary_label_no_card">Not set up</string>
    <string name="wallet_secondary_label_no_card">Not set up</string>
    <!-- Secondary label of the quick access wallet tile if wallet is still updating. [CHAR LIMIT=NONE] -->
    <string name="wallet_secondary_label_updating">Updating</string>
    <!-- Secondary label of the quick access wallet tile if device locked. [CHAR LIMIT=NONE] -->
    <!-- Secondary label of the quick access wallet tile if device locked. [CHAR LIMIT=NONE] -->
    <string name="wallet_secondary_label_device_locked">Unlock to use</string>
    <string name="wallet_secondary_label_device_locked">Unlock to use</string>
    <!-- Message shown when an unknown failure occurred when fetching cards. [CHAR LIMIT=NONE] -->
    <!-- Message shown when an unknown failure occurred when fetching cards. [CHAR LIMIT=NONE] -->
+12 −4
Original line number Original line Diff line number Diff line
@@ -73,6 +73,7 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
    private final QuickAccessWalletController mController;
    private final QuickAccessWalletController mController;


    private WalletCard mSelectedCard;
    private WalletCard mSelectedCard;
    private boolean mIsWalletUpdating = true;
    @VisibleForTesting Drawable mCardViewDrawable;
    @VisibleForTesting Drawable mCardViewDrawable;


    @Inject
    @Inject
@@ -110,7 +111,8 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
        super.handleSetListening(listening);
        super.handleSetListening(listening);
        if (listening) {
        if (listening) {
            mController.setupWalletChangeObservers(mCardRetriever, DEFAULT_PAYMENT_APP_CHANGE);
            mController.setupWalletChangeObservers(mCardRetriever, DEFAULT_PAYMENT_APP_CHANGE);
            if (!mController.getWalletClient().isWalletServiceAvailable()) {
            if (!mController.getWalletClient().isWalletServiceAvailable()
                    || !mController.getWalletClient().isWalletFeatureAvailable()) {
                Log.i(TAG, "QAW service is unavailable, recreating the wallet client.");
                Log.i(TAG, "QAW service is unavailable, recreating the wallet client.");
                mController.reCreateWalletClient();
                mController.reCreateWalletClient();
            }
            }
@@ -158,7 +160,8 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
        state.contentDescription = state.label;
        state.contentDescription = state.label;
        state.icon = ResourceIcon.get(R.drawable.ic_wallet_lockscreen);
        state.icon = ResourceIcon.get(R.drawable.ic_wallet_lockscreen);
        boolean isDeviceLocked = !mKeyguardStateController.isUnlocked();
        boolean isDeviceLocked = !mKeyguardStateController.isUnlocked();
        if (mController.getWalletClient().isWalletServiceAvailable()) {
        if (mController.getWalletClient().isWalletServiceAvailable()
                && mController.getWalletClient().isWalletFeatureAvailable()) {
            if (mSelectedCard != null) {
            if (mSelectedCard != null) {
                if (isDeviceLocked) {
                if (isDeviceLocked) {
                    state.state = Tile.STATE_INACTIVE;
                    state.state = Tile.STATE_INACTIVE;
@@ -172,7 +175,11 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
                }
                }
            } else {
            } else {
                state.state = Tile.STATE_INACTIVE;
                state.state = Tile.STATE_INACTIVE;
                state.secondaryLabel = mContext.getString(R.string.wallet_secondary_label_no_card);
                state.secondaryLabel =
                        mContext.getString(
                                mIsWalletUpdating
                                        ? R.string.wallet_secondary_label_updating
                                        : R.string.wallet_secondary_label_no_card);
                state.sideViewCustomDrawable = null;
                state.sideViewCustomDrawable = null;
            }
            }
            state.stateDescription = state.secondaryLabel;
            state.stateDescription = state.secondaryLabel;
@@ -218,6 +225,7 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
        @Override
        @Override
        public void onWalletCardsRetrieved(@NonNull GetWalletCardsResponse response) {
        public void onWalletCardsRetrieved(@NonNull GetWalletCardsResponse response) {
            Log.i(TAG, "Successfully retrieved wallet cards.");
            Log.i(TAG, "Successfully retrieved wallet cards.");
            mIsWalletUpdating = false;
            List<WalletCard> cards = response.getWalletCards();
            List<WalletCard> cards = response.getWalletCards();
            if (cards.isEmpty()) {
            if (cards.isEmpty()) {
                Log.d(TAG, "No wallet cards exist.");
                Log.d(TAG, "No wallet cards exist.");
@@ -240,7 +248,7 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {


        @Override
        @Override
        public void onWalletCardRetrievalError(@NonNull GetWalletCardsError error) {
        public void onWalletCardRetrievalError(@NonNull GetWalletCardsError error) {
            Log.w(TAG, "Error retrieve wallet cards");
            mIsWalletUpdating = false;
            mCardViewDrawable = null;
            mCardViewDrawable = null;
            mSelectedCard = null;
            mSelectedCard = null;
            refreshState();
            refreshState();
+7 −2
Original line number Original line Diff line number Diff line
@@ -25,10 +25,11 @@ import android.provider.Settings;
import android.service.quickaccesswallet.GetWalletCardsRequest;
import android.service.quickaccesswallet.GetWalletCardsRequest;
import android.service.quickaccesswallet.QuickAccessWalletClient;
import android.service.quickaccesswallet.QuickAccessWalletClient;
import android.service.quickaccesswallet.QuickAccessWalletClientImpl;
import android.service.quickaccesswallet.QuickAccessWalletClientImpl;
import android.util.Log;


import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.util.settings.SecureSettings;
import com.android.systemui.util.settings.SecureSettings;


import java.util.concurrent.Executor;
import java.util.concurrent.Executor;
@@ -65,7 +66,7 @@ public class QuickAccessWalletController {
    @Inject
    @Inject
    public QuickAccessWalletController(
    public QuickAccessWalletController(
            Context context,
            Context context,
            @Main Executor executor,
            @Background Executor executor,
            SecureSettings secureSettings,
            SecureSettings secureSettings,
            QuickAccessWalletClient quickAccessWalletClient) {
            QuickAccessWalletClient quickAccessWalletClient) {
        mContext = context;
        mContext = context;
@@ -142,6 +143,10 @@ public class QuickAccessWalletController {
     */
     */
    public void queryWalletCards(
    public void queryWalletCards(
            QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever) {
            QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever) {
        if (!mQuickAccessWalletClient.isWalletFeatureAvailable()) {
            Log.d(TAG, "QuickAccessWallet feature is not available.");
            return;
        }
        int cardWidth =
        int cardWidth =
                mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_width);
                mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_width);
        int cardHeight =
        int cardHeight =
+57 −1
Original line number Original line Diff line number Diff line
@@ -174,6 +174,15 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
        verify(mController, times(1)).reCreateWalletClient();
        verify(mController, times(1)).reCreateWalletClient();
    }
    }


    @Test
    public void testWalletFeatureUnavailable_recreateWalletClient() {
        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);

        mTile.handleSetListening(true);

        verify(mController, times(1)).reCreateWalletClient();
    }

    @Test
    @Test
    public void testIsAvailable_qawFeatureAvailable() {
    public void testIsAvailable_qawFeatureAvailable() {
        when(mPackageManager.hasSystemFeature(FEATURE_NFC_HOST_CARD_EMULATION)).thenReturn(true);
        when(mPackageManager.hasSystemFeature(FEATURE_NFC_HOST_CARD_EMULATION)).thenReturn(true);
@@ -266,6 +275,41 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
        assertEquals(mContext.getString(R.string.wallet_title), mTile.getTileLabel().toString());
        assertEquals(mContext.getString(R.string.wallet_title), mTile.getTileLabel().toString());
    }
    }


    @Test
    public void testHandleUpdateState_walletIsUpdating() {
        when(mKeyguardStateController.isUnlocked()).thenReturn(true);
        QSTile.State state = new QSTile.State();
        GetWalletCardsResponse response =
                new GetWalletCardsResponse(
                        Collections.singletonList(createWalletCard(mContext)), 0);

        mTile.handleSetListening(true);

        verify(mController).queryWalletCards(mCallbackCaptor.capture());

        // Wallet cards fetching on its way; wallet updating.
        mTile.handleUpdateState(state, null);

        assertEquals(Tile.STATE_INACTIVE, state.state);
        assertEquals(
                mContext.getString(R.string.wallet_secondary_label_updating), state.secondaryLabel);
        assertNotNull(state.stateDescription);
        assertNull(state.sideViewCustomDrawable);

        // Wallet cards fetching completed.
        mCallbackCaptor.getValue().onWalletCardsRetrieved(response);
        mTestableLooper.processAllMessages();

        mTile.handleUpdateState(state, null);

        assertEquals(Tile.STATE_ACTIVE, state.state);
        assertEquals(
                "•••• 1234",
                state.secondaryLabel);
        assertNotNull(state.stateDescription);
        assertNotNull(state.sideViewCustomDrawable);
    }

    @Test
    @Test
    public void testHandleUpdateState_hasCard_deviceLocked_tileInactive() {
    public void testHandleUpdateState_hasCard_deviceLocked_tileInactive() {
        when(mKeyguardStateController.isUnlocked()).thenReturn(false);
        when(mKeyguardStateController.isUnlocked()).thenReturn(false);
@@ -315,7 +359,7 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
    }
    }


    @Test
    @Test
    public void testHandleUpdateState_qawFeatureUnavailable_tileUnavailable() {
    public void testHandleUpdateState_qawServiceUnavailable_tileUnavailable() {
        when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false);
        when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false);
        QSTile.State state = new QSTile.State();
        QSTile.State state = new QSTile.State();


@@ -326,6 +370,18 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
        assertNull(state.sideViewCustomDrawable);
        assertNull(state.sideViewCustomDrawable);
    }
    }


    @Test
    public void testHandleUpdateState_qawFeatureUnavailable_tileUnavailable() {
        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);
        QSTile.State state = new QSTile.State();

        mTile.handleUpdateState(state, null);

        assertEquals(Tile.STATE_UNAVAILABLE, state.state);
        assertNull(state.stateDescription);
        assertNull(state.sideViewCustomDrawable);
    }

    @Test
    @Test
    public void testHandleSetListening_queryCards() {
    public void testHandleSetListening_queryCards() {
        mTile.handleSetListening(true);
        mTile.handleSetListening(true);
+11 −2
Original line number Original line Diff line number Diff line
@@ -21,7 +21,9 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


@@ -61,12 +63,10 @@ public class QuickAccessWalletControllerTest extends SysuiTestCase {
    private ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor;
    private ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor;


    private QuickAccessWalletController mController;
    private QuickAccessWalletController mController;
    private TestableLooper mTestableLooper;


    @Before
    @Before
    public void setUp() {
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        MockitoAnnotations.initMocks(this);
        mTestableLooper = TestableLooper.get(this);
        when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
        when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true);
        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true);
        when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true);
        when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true);
@@ -143,4 +143,13 @@ public class QuickAccessWalletControllerTest extends SysuiTestCase {
                mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_height),
                mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_height),
                request.getCardHeightPx());
                request.getCardHeightPx());
    }
    }

    @Test
    public void queryWalletCards_walletFeatureNotAvailable_noQuery() {
        when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);

        mController.queryWalletCards(mCardsRetriever);

        verify(mQuickAccessWalletClient, never()).getWalletCards(any(), any(), any());
    }
}
}