Add a tile service meta-data for QuickAccessWalletServiceInfo that

fetches a drawable for wallet tile.

The wallet tile will get the icon drawable from QAW client; if it
doesn't exist, fall back to the static icon in SysUI.

Test: manual
Bug: 190606984
Fixes: 190539096
Change-Id: I2d822ee34c8e4b27ae72e86186b0d78f2b52854f
This commit is contained in:
Silin Huang
2021-06-21 00:06:21 -07:00
parent 98b57c304d
commit 3d9cf89d06
8 changed files with 90 additions and 20 deletions

View File

@@ -177,6 +177,14 @@ public interface QuickAccessWalletClient extends Closeable {
@Nullable
Drawable getLogo();
/**
* Returns the tile icon associated with the {@link QuickAccessWalletService}.
*
* @hide
*/
@Nullable
Drawable getTileIcon();
/**
* Returns the service label specified by {@code android:label} in the service manifest entry.
*

View File

@@ -307,6 +307,12 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser
return mServiceInfo == null ? null : mServiceInfo.getWalletLogo(mContext);
}
@Nullable
@Override
public Drawable getTileIcon() {
return mServiceInfo == null ? null : mServiceInfo.getTileIcon();
}
@Override
@Nullable
public CharSequence getServiceLabel() {

View File

@@ -195,6 +195,13 @@ public abstract class QuickAccessWalletService extends Service {
*/
public static final String SERVICE_META_DATA = "android.quickaccesswallet";
/**
* Name of the QuickAccessWallet tile service meta-data.
*
* @hide
*/
public static final String TILE_SERVICE_META_DATA = "android.quickaccesswallet.tile";
private final Handler mHandler = new Handler(Looper.getMainLooper());
/**

View File

@@ -56,12 +56,15 @@ class QuickAccessWalletServiceInfo {
private final ServiceInfo mServiceInfo;
private final ServiceMetadata mServiceMetadata;
private final TileServiceMetadata mTileServiceMetadata;
private QuickAccessWalletServiceInfo(
@NonNull ServiceInfo serviceInfo,
@NonNull ServiceMetadata metadata) {
@NonNull ServiceMetadata metadata,
@NonNull TileServiceMetadata tileServiceMetadata) {
mServiceInfo = serviceInfo;
mServiceMetadata = metadata;
mTileServiceMetadata = tileServiceMetadata;
}
@Nullable
@@ -84,7 +87,9 @@ class QuickAccessWalletServiceInfo {
}
ServiceMetadata metadata = parseServiceMetadata(context, serviceInfo);
return new QuickAccessWalletServiceInfo(serviceInfo, metadata);
TileServiceMetadata tileServiceMetadata =
new TileServiceMetadata(parseTileServiceMetadata(context, serviceInfo));
return new QuickAccessWalletServiceInfo(serviceInfo, metadata, tileServiceMetadata);
}
private static ComponentName getDefaultPaymentApp(Context context) {
@@ -105,6 +110,31 @@ class QuickAccessWalletServiceInfo {
return resolveInfos.isEmpty() ? null : resolveInfos.get(0).serviceInfo;
}
private static class TileServiceMetadata {
@Nullable
private final Drawable mTileIcon;
private TileServiceMetadata(@Nullable Drawable tileIcon) {
mTileIcon = tileIcon;
}
}
@Nullable
private static Drawable parseTileServiceMetadata(Context context, ServiceInfo serviceInfo) {
PackageManager pm = context.getPackageManager();
int tileIconDrawableId =
serviceInfo.metaData.getInt(QuickAccessWalletService.TILE_SERVICE_META_DATA);
if (tileIconDrawableId != 0) {
try {
Resources resources = pm.getResourcesForApplication(serviceInfo.applicationInfo);
return resources.getDrawable(tileIconDrawableId, null);
} catch (PackageManager.NameNotFoundException e) {
Log.e(TAG, "Error parsing quickaccesswallet tile service meta-data", e);
}
}
return null;
}
private static class ServiceMetadata {
@Nullable
private final String mSettingsActivity;
@@ -216,6 +246,11 @@ class QuickAccessWalletServiceInfo {
return mServiceInfo.loadIcon(context.getPackageManager());
}
@Nullable
Drawable getTileIcon() {
return mTileServiceMetadata.mTileIcon;
}
@NonNull
CharSequence getShortcutShortLabel(Context context) {
if (!TextUtils.isEmpty(mServiceMetadata.mShortcutShortLabel)) {

View File

@@ -17,21 +17,12 @@
*/
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<group>
<clip-path
android:pathData="M2.15,1.54h20v21h-20z"/>
<path
android:pathData="M19,21.83H5.35a3.19,3.19 0,0 1,-3.2 -3.19v-7A3.19,3.19 0,0 1,5.35 8.5H19a3.19,3.19 0,0 1,3.19 3.19v7A3.19,3.19 0,0 1,19 21.83ZM5.35,10.44A1.25,1.25 0,0 0,4.1 11.69v7a1.25,1.25 0,0 0,1.25 1.24H19a1.25,1.25 0,0 0,1.25 -1.24v-7A1.25,1.25 0,0 0,19 10.44Z"
android:fillColor="#FF000000" />
<path
android:pathData="M4.7,10.16 L4.21,8.57 16,5a3.56,3.56 0,0 1,3.1 0.25c1,0.67 1.65,2 1.89,4l-1.66,0.2C19.12,8 18.72,7 18.15,6.62a2,2 0,0 0,-1.7 0Z"
android:fillColor="#FF000000" />
<path
android:pathData="M4.43,10.47l-1,-1.34 7.31,-5.44c3,-1.86 5.51,1 6.33,2L15.82,6.77c-2.1,-2.44 -3.23,-2.26 -4.14,-1.7Z"
android:fillColor="#FF000000" />
</group>
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
android:pathData="M20,4L4,4c-1.11,0 -1.99,0.89 -1.99,2L2,18c0,1.11 0.89,2 2,2h16c1.11,0 2,-0.89 2,-2L22,6c0,-1.11 -0.89,-2 -2,-2zM20,18L4,18v-6h16v6zM20,8L4,8L4,6h16v2z"/>
</vector>

View File

@@ -158,7 +158,11 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
CharSequence label = mController.getWalletClient().getServiceLabel();
state.label = label == null ? mLabel : label;
state.contentDescription = state.label;
state.icon = ResourceIcon.get(R.drawable.ic_wallet_lockscreen);
Drawable tileIcon = mController.getWalletClient().getTileIcon();
state.icon =
tileIcon == null
? ResourceIcon.get(R.drawable.ic_wallet_lockscreen)
: new DrawableIcon(tileIcon);
boolean isDeviceLocked = !mKeyguardStateController.isUnlocked();
if (mController.getWalletClient().isWalletServiceAvailable()
&& mController.getWalletClient().isWalletFeatureAvailable()) {

View File

@@ -455,6 +455,10 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
mWalletButton.setVisibility(GONE);
mIndicationArea.setPadding(0, 0, 0, 0);
} else {
Drawable tileIcon = mQuickAccessWalletController.getWalletClient().getTileIcon();
if (tileIcon != null) {
mWalletButton.setImageDrawable(tileIcon);
}
mWalletButton.setVisibility(VISIBLE);
mWalletButton.setOnClickListener(this::onWalletClick);
mIndicationArea.setPadding(mIndicationPadding, 0, mIndicationPadding, 0);

View File

@@ -43,6 +43,7 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.os.Handler;
import android.service.quickaccesswallet.GetWalletCardsError;
@@ -93,6 +94,7 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
private static final Icon CARD_IMAGE =
Icon.createWithBitmap(Bitmap.createBitmap(70, 50, Bitmap.Config.ARGB_8888));
private final Drawable mTileIcon = mContext.getDrawable(R.drawable.ic_qs_wallet);
private final Intent mWalletIntent = new Intent(QuickAccessWalletService.ACTION_VIEW_WALLET)
.setComponent(new ComponentName(mContext.getPackageName(), "WalletActivity"));
@@ -137,6 +139,7 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
when(mHost.getContext()).thenReturn(mSpiedContext);
when(mHost.getUiEventLogger()).thenReturn(mUiEventLogger);
when(mQuickAccessWalletClient.getServiceLabel()).thenReturn(LABEL);
when(mQuickAccessWalletClient.getTileIcon()).thenReturn(mTileIcon);
when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true);
when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true);
@@ -255,6 +258,18 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
@Test
public void testHandleUpdateState_updateLabelAndIcon() {
QSTile.State state = new QSTile.State();
mTile.handleUpdateState(state, null);
assertEquals(LABEL, state.label.toString());
assertTrue(state.label.toString().contentEquals(state.contentDescription));
assertEquals(mTileIcon, state.icon.getDrawable(mContext));
}
@Test
public void testHandleUpdateState_updateLabelAndIcon_noIconFromApi() {
when(mQuickAccessWalletClient.getTileIcon()).thenReturn(null);
QSTile.State state = new QSTile.State();
QSTile.Icon icon = QSTileImpl.ResourceIcon.get(R.drawable.ic_wallet_lockscreen);
mTile.handleUpdateState(state, null);