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:
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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());
|
||||
|
||||
/**
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user