From 3d9cf89d067d1818938b820a631c90f96690d844 Mon Sep 17 00:00:00 2001 From: Silin Huang Date: Mon, 21 Jun 2021 00:06:21 -0700 Subject: [PATCH] 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 --- .../QuickAccessWalletClient.java | 8 ++++ .../QuickAccessWalletClientImpl.java | 6 +++ .../QuickAccessWalletService.java | 7 ++++ .../QuickAccessWalletServiceInfo.java | 39 ++++++++++++++++++- .../res/drawable/ic_wallet_lockscreen.xml | 25 ++++-------- .../qs/tiles/QuickAccessWalletTile.java | 6 ++- .../phone/KeyguardBottomAreaView.java | 4 ++ .../qs/tiles/QuickAccessWalletTileTest.java | 15 +++++++ 8 files changed, 90 insertions(+), 20 deletions(-) diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java index f12256173c436..f69c89d453126 100644 --- a/core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java +++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java @@ -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. * diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java index 2e4af3fad1b52..2d0faad8cb13d 100644 --- a/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java +++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java @@ -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() { diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletService.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletService.java index ef6150dd02f92..db20a51e23ed2 100644 --- a/core/java/android/service/quickaccesswallet/QuickAccessWalletService.java +++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletService.java @@ -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()); /** diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java index c87407e9d38c8..0d290eee5777d 100644 --- a/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java +++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java @@ -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)) { diff --git a/packages/SystemUI/res/drawable/ic_wallet_lockscreen.xml b/packages/SystemUI/res/drawable/ic_wallet_lockscreen.xml index 2f8f11d72331b..def7b3136f30d 100644 --- a/packages/SystemUI/res/drawable/ic_wallet_lockscreen.xml +++ b/packages/SystemUI/res/drawable/ic_wallet_lockscreen.xml @@ -17,21 +17,12 @@ */ --> - - - - - - + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24" + android:tint="?attr/colorControlNormal"> + 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 4dc7508f42b56..82b6c0c1805d4 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/QuickAccessWalletTile.java @@ -158,7 +158,11 @@ public class QuickAccessWalletTile extends QSTileImpl { 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()) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java index 8e3aed43d1af5..16f8319928bb9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java @@ -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); 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 b1e67f5cb7c82..a70c2be4954e1 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 @@ -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);