Merge "Add a tile service meta-data for QuickAccessWalletServiceInfo that fetches a drawable for wallet tile." into sc-dev am: 516cd210f6
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15045436 Change-Id: Ifc33e093621615535f8cc0025ff55cc01f5c6ecb
This commit is contained in:
@@ -177,6 +177,14 @@ public interface QuickAccessWalletClient extends Closeable {
|
|||||||
@Nullable
|
@Nullable
|
||||||
Drawable getLogo();
|
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.
|
* 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);
|
return mServiceInfo == null ? null : mServiceInfo.getWalletLogo(mContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Drawable getTileIcon() {
|
||||||
|
return mServiceInfo == null ? null : mServiceInfo.getTileIcon();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public CharSequence getServiceLabel() {
|
public CharSequence getServiceLabel() {
|
||||||
|
|||||||
@@ -195,6 +195,13 @@ public abstract class QuickAccessWalletService extends Service {
|
|||||||
*/
|
*/
|
||||||
public static final String SERVICE_META_DATA = "android.quickaccesswallet";
|
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());
|
private final Handler mHandler = new Handler(Looper.getMainLooper());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -56,12 +56,15 @@ class QuickAccessWalletServiceInfo {
|
|||||||
|
|
||||||
private final ServiceInfo mServiceInfo;
|
private final ServiceInfo mServiceInfo;
|
||||||
private final ServiceMetadata mServiceMetadata;
|
private final ServiceMetadata mServiceMetadata;
|
||||||
|
private final TileServiceMetadata mTileServiceMetadata;
|
||||||
|
|
||||||
private QuickAccessWalletServiceInfo(
|
private QuickAccessWalletServiceInfo(
|
||||||
@NonNull ServiceInfo serviceInfo,
|
@NonNull ServiceInfo serviceInfo,
|
||||||
@NonNull ServiceMetadata metadata) {
|
@NonNull ServiceMetadata metadata,
|
||||||
|
@NonNull TileServiceMetadata tileServiceMetadata) {
|
||||||
mServiceInfo = serviceInfo;
|
mServiceInfo = serviceInfo;
|
||||||
mServiceMetadata = metadata;
|
mServiceMetadata = metadata;
|
||||||
|
mTileServiceMetadata = tileServiceMetadata;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -84,7 +87,9 @@ class QuickAccessWalletServiceInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ServiceMetadata metadata = parseServiceMetadata(context, serviceInfo);
|
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) {
|
private static ComponentName getDefaultPaymentApp(Context context) {
|
||||||
@@ -105,6 +110,31 @@ class QuickAccessWalletServiceInfo {
|
|||||||
return resolveInfos.isEmpty() ? null : resolveInfos.get(0).serviceInfo;
|
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 {
|
private static class ServiceMetadata {
|
||||||
@Nullable
|
@Nullable
|
||||||
private final String mSettingsActivity;
|
private final String mSettingsActivity;
|
||||||
@@ -216,6 +246,11 @@ class QuickAccessWalletServiceInfo {
|
|||||||
return mServiceInfo.loadIcon(context.getPackageManager());
|
return mServiceInfo.loadIcon(context.getPackageManager());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
Drawable getTileIcon() {
|
||||||
|
return mTileServiceMetadata.mTileIcon;
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
CharSequence getShortcutShortLabel(Context context) {
|
CharSequence getShortcutShortLabel(Context context) {
|
||||||
if (!TextUtils.isEmpty(mServiceMetadata.mShortcutShortLabel)) {
|
if (!TextUtils.isEmpty(mServiceMetadata.mShortcutShortLabel)) {
|
||||||
|
|||||||
@@ -17,21 +17,12 @@
|
|||||||
*/
|
*/
|
||||||
-->
|
-->
|
||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:width="24dp"
|
android:width="24dp"
|
||||||
android:height="24dp"
|
android:height="24dp"
|
||||||
android:viewportWidth="24"
|
android:viewportWidth="24"
|
||||||
android:viewportHeight="24">
|
android:viewportHeight="24"
|
||||||
<group>
|
android:tint="?attr/colorControlNormal">
|
||||||
<clip-path
|
<path
|
||||||
android:pathData="M2.15,1.54h20v21h-20z"/>
|
android:fillColor="@android:color/white"
|
||||||
<path
|
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"/>
|
||||||
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>
|
|
||||||
</vector>
|
</vector>
|
||||||
|
|||||||
@@ -158,7 +158,11 @@ public class QuickAccessWalletTile extends QSTileImpl<QSTile.State> {
|
|||||||
CharSequence label = mController.getWalletClient().getServiceLabel();
|
CharSequence label = mController.getWalletClient().getServiceLabel();
|
||||||
state.label = label == null ? mLabel : label;
|
state.label = label == null ? mLabel : label;
|
||||||
state.contentDescription = state.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();
|
boolean isDeviceLocked = !mKeyguardStateController.isUnlocked();
|
||||||
if (mController.getWalletClient().isWalletServiceAvailable()
|
if (mController.getWalletClient().isWalletServiceAvailable()
|
||||||
&& mController.getWalletClient().isWalletFeatureAvailable()) {
|
&& mController.getWalletClient().isWalletFeatureAvailable()) {
|
||||||
|
|||||||
@@ -455,6 +455,10 @@ public class KeyguardBottomAreaView extends FrameLayout implements View.OnClickL
|
|||||||
mWalletButton.setVisibility(GONE);
|
mWalletButton.setVisibility(GONE);
|
||||||
mIndicationArea.setPadding(0, 0, 0, 0);
|
mIndicationArea.setPadding(0, 0, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
|
Drawable tileIcon = mQuickAccessWalletController.getWalletClient().getTileIcon();
|
||||||
|
if (tileIcon != null) {
|
||||||
|
mWalletButton.setImageDrawable(tileIcon);
|
||||||
|
}
|
||||||
mWalletButton.setVisibility(VISIBLE);
|
mWalletButton.setVisibility(VISIBLE);
|
||||||
mWalletButton.setOnClickListener(this::onWalletClick);
|
mWalletButton.setOnClickListener(this::onWalletClick);
|
||||||
mIndicationArea.setPadding(mIndicationPadding, 0, mIndicationPadding, 0);
|
mIndicationArea.setPadding(mIndicationPadding, 0, mIndicationPadding, 0);
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.graphics.drawable.Icon;
|
import android.graphics.drawable.Icon;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.service.quickaccesswallet.GetWalletCardsError;
|
import android.service.quickaccesswallet.GetWalletCardsError;
|
||||||
@@ -93,6 +94,7 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
|
|||||||
private static final Icon CARD_IMAGE =
|
private static final Icon CARD_IMAGE =
|
||||||
Icon.createWithBitmap(Bitmap.createBitmap(70, 50, Bitmap.Config.ARGB_8888));
|
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)
|
private final Intent mWalletIntent = new Intent(QuickAccessWalletService.ACTION_VIEW_WALLET)
|
||||||
.setComponent(new ComponentName(mContext.getPackageName(), "WalletActivity"));
|
.setComponent(new ComponentName(mContext.getPackageName(), "WalletActivity"));
|
||||||
|
|
||||||
@@ -137,6 +139,7 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
|
|||||||
when(mHost.getContext()).thenReturn(mSpiedContext);
|
when(mHost.getContext()).thenReturn(mSpiedContext);
|
||||||
when(mHost.getUiEventLogger()).thenReturn(mUiEventLogger);
|
when(mHost.getUiEventLogger()).thenReturn(mUiEventLogger);
|
||||||
when(mQuickAccessWalletClient.getServiceLabel()).thenReturn(LABEL);
|
when(mQuickAccessWalletClient.getServiceLabel()).thenReturn(LABEL);
|
||||||
|
when(mQuickAccessWalletClient.getTileIcon()).thenReturn(mTileIcon);
|
||||||
when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true);
|
when(mQuickAccessWalletClient.isWalletFeatureAvailable()).thenReturn(true);
|
||||||
when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
|
when(mQuickAccessWalletClient.isWalletServiceAvailable()).thenReturn(true);
|
||||||
when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true);
|
when(mQuickAccessWalletClient.isWalletFeatureAvailableWhenDeviceLocked()).thenReturn(true);
|
||||||
@@ -255,6 +258,18 @@ public class QuickAccessWalletTileTest extends SysuiTestCase {
|
|||||||
@Test
|
@Test
|
||||||
public void testHandleUpdateState_updateLabelAndIcon() {
|
public void testHandleUpdateState_updateLabelAndIcon() {
|
||||||
QSTile.State state = new QSTile.State();
|
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);
|
QSTile.Icon icon = QSTileImpl.ResourceIcon.get(R.drawable.ic_wallet_lockscreen);
|
||||||
|
|
||||||
mTile.handleUpdateState(state, null);
|
mTile.handleUpdateState(state, null);
|
||||||
|
|||||||
Reference in New Issue
Block a user