Merge "Update wallet tile secondary label when QAW cards fetching in flight." into sc-dev

This commit is contained in:
Silin Huang
2021-06-30 02:24:45 +00:00
committed by Android (Google) Code Review
5 changed files with 89 additions and 9 deletions

View File

@@ -1661,6 +1661,8 @@
<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] -->
<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] -->
<string name="wallet_secondary_label_device_locked">Unlock to use</string>
<!-- Message shown when an unknown failure occurred when fetching cards. [CHAR LIMIT=NONE] -->

View File

@@ -73,6 +73,7 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
private final QuickAccessWalletController mController;
private WalletCard mSelectedCard;
private boolean mIsWalletUpdating = true;
@VisibleForTesting Drawable mCardViewDrawable;
@Inject
@@ -110,7 +111,8 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
super.handleSetListening(listening);
if (listening) {
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.");
mController.reCreateWalletClient();
}
@@ -158,7 +160,8 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
state.contentDescription = state.label;
state.icon = ResourceIcon.get(R.drawable.ic_wallet_lockscreen);
boolean isDeviceLocked = !mKeyguardStateController.isUnlocked();
if (mController.getWalletClient().isWalletServiceAvailable()) {
if (mController.getWalletClient().isWalletServiceAvailable()
&& mController.getWalletClient().isWalletFeatureAvailable()) {
if (mSelectedCard != null) {
if (isDeviceLocked) {
state.state = Tile.STATE_INACTIVE;
@@ -172,7 +175,11 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
}
} else {
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.stateDescription = state.secondaryLabel;
@@ -218,6 +225,7 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
@Override
public void onWalletCardsRetrieved(@NonNull GetWalletCardsResponse response) {
Log.i(TAG, "Successfully retrieved wallet cards.");
mIsWalletUpdating = false;
List<WalletCard> cards = response.getWalletCards();
if (cards.isEmpty()) {
Log.d(TAG, "No wallet cards exist.");
@@ -240,7 +248,7 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
@Override
public void onWalletCardRetrievalError(@NonNull GetWalletCardsError error) {
Log.w(TAG, "Error retrieve wallet cards");
mIsWalletUpdating = false;
mCardViewDrawable = null;
mSelectedCard = null;
refreshState();

View File

@@ -25,10 +25,11 @@ 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;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dagger.qualifiers.Background;
import com.android.systemui.util.settings.SecureSettings;
import java.util.concurrent.Executor;
@@ -65,7 +66,7 @@ public class QuickAccessWalletController {
@Inject
public QuickAccessWalletController(
Context context,
@Main Executor executor,
@Background Executor executor,
SecureSettings secureSettings,
QuickAccessWalletClient quickAccessWalletClient) {
mContext = context;
@@ -142,6 +143,10 @@ public class QuickAccessWalletController {
*/
public void queryWalletCards(
QuickAccessWalletClient.OnWalletCardsRetrievedCallback cardsRetriever) {
if (!mQuickAccessWalletClient.isWalletFeatureAvailable()) {
Log.d(TAG, "QuickAccessWallet feature is not available.");
return;
}
int cardWidth =
mContext.getResources().getDimensionPixelSize(R.dimen.wallet_tile_card_view_width);
int cardHeight =

View File

@@ -174,6 +174,15 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
verify(mController, times(1)).reCreateWalletClient();
}
@Test
public void testWalletFeatureUnavailable_recreateWalletClient() {
when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);
mTile.handleSetListening(true);
verify(mController, times(1)).reCreateWalletClient();
}
@Test
public void testIsAvailable_qawFeatureAvailable() {
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());
}
@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
public void testHandleUpdateState_hasCard_deviceLocked_tileInactive() {
when(mKeyguardStateController.isUnlocked()).thenReturn(false);
@@ -315,7 +359,7 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
}
@Test
public void testHandleUpdateState_qawFeatureUnavailable_tileUnavailable() {
public void testHandleUpdateState_qawServiceUnavailable_tileUnavailable() {
when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(false);
QSTile.State state = new QSTile.State();
@@ -326,6 +370,18 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
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
public void testHandleSetListening_queryCards() {
mTile.handleSetListening(true);

View File

@@ -21,7 +21,9 @@ 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;
@@ -61,12 +63,10 @@ public class QuickAccessWalletControllerTest extends SysuiTestCase {
private ArgumentCaptor<GetWalletCardsRequest> mRequestCaptor;
private QuickAccessWalletController mController;
private TestableLooper mTestableLooper;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mTestableLooper = TestableLooper.get(this);
when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
when(mQuickAccessWalletClient.isWalletFeatureAvailable()).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),
request.getCardHeightPx());
}
@Test
public void queryWalletCards_walletFeatureNotAvailable_noQuery() {
when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(false);
mController.queryWalletCards(mCardsRetriever);
verify(mQuickAccessWalletClient, never()).getWalletCards(any(), any(), any());
}
}