summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java39
-rw-r--r--core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java24
-rw-r--r--core/java/android/service/quickaccesswallet/QuickAccessWalletService.java16
-rw-r--r--core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java72
-rw-r--r--core/res/res/values/attrs.xml9
5 files changed, 144 insertions, 16 deletions
diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java
index 4f5b13981d64..f12256173c43 100644
--- a/core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java
+++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletClient.java
@@ -22,6 +22,7 @@ import android.annotation.Nullable;
import android.annotation.TestApi;
import android.content.Context;
import android.content.Intent;
+import android.graphics.drawable.Drawable;
import java.io.Closeable;
import java.util.concurrent.Executor;
@@ -165,4 +166,42 @@ public interface QuickAccessWalletClient extends Closeable {
*/
@Nullable
Intent createWalletSettingsIntent();
+
+ /**
+ * Returns the logo associated with the {@link QuickAccessWalletService}. This is specified by
+ * {@code android:logo} manifest entry. If the logo is not specified, the app icon will be
+ * returned instead ({@code android:icon}).
+ *
+ * @hide
+ */
+ @Nullable
+ Drawable getLogo();
+
+ /**
+ * Returns the service label specified by {@code android:label} in the service manifest entry.
+ *
+ * @hide
+ */
+ @Nullable
+ CharSequence getServiceLabel();
+
+ /**
+ * Returns the text specified by the {@link android:shortcutShortLabel} in the service manifest
+ * entry. If the shortcutShortLabel isn't specified, the service label ({@code android:label})
+ * will be returned instead.
+ *
+ * @hide
+ */
+ @Nullable
+ CharSequence getShortcutShortLabel();
+
+ /**
+ * Returns the text specified by the {@link android:shortcutLongLabel} in the service manifest
+ * entry. If the shortcutShortLabel isn't specified, the service label ({@code android:label})
+ * will be returned instead.
+ *
+ * @hide
+ */
+ @Nullable
+ CharSequence getShortcutLongLabel();
}
diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java
index e4dd082edaa5..31a085d15a34 100644
--- a/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java
+++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletClientImpl.java
@@ -26,6 +26,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -256,6 +257,29 @@ public class QuickAccessWalletClientImpl implements QuickAccessWalletClient, Ser
mServiceInfo.getSettingsActivity()));
}
+ @Override
+ @Nullable
+ public Drawable getLogo() {
+ return mServiceInfo == null ? null : mServiceInfo.getWalletLogo(mContext);
+ }
+
+ @Override
+ @Nullable
+ public CharSequence getServiceLabel() {
+ return mServiceInfo == null ? null : mServiceInfo.getServiceLabel(mContext);
+ }
+
+ @Override
+ @Nullable
+ public CharSequence getShortcutShortLabel() {
+ return mServiceInfo == null ? null : mServiceInfo.getShortcutShortLabel(mContext);
+ }
+
+ @Override
+ public CharSequence getShortcutLongLabel() {
+ return mServiceInfo == null ? null : mServiceInfo.getShortcutLongLabel(mContext);
+ }
+
private void connect() {
mHandler.post(this::connectInternal);
}
diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletService.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletService.java
index aba5611581e3..ef6150dd02f9 100644
--- a/core/java/android/service/quickaccesswallet/QuickAccessWalletService.java
+++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletService.java
@@ -113,6 +113,7 @@ import android.util.Log;
* android:name=".MyQuickAccessWalletService"
* android:label="@string/my_default_tile_label"
* android:icon="@drawable/my_default_icon_label"
+ * android:logo="@drawable/my_wallet_logo"
* android:permission="android.permission.BIND_QUICK_ACCESS_WALLET_SERVICE">
* <intent-filter>
* <action android:name="android.service.quickaccesswallet.QuickAccessWalletService" />
@@ -133,6 +134,8 @@ import android.util.Log;
* <quickaccesswallet-service
* xmlns:android="http://schemas.android.com/apk/res/android"
* android:settingsActivity="com.example.android.SettingsActivity"
+ * android:shortcutLongLabel="@string/my_wallet_empty_state_text"
+ * android:shortcutShortLabel="@string/my_wallet_button_text"
* android:targetActivity="com.example.android.WalletActivity"/>
* }
* </pre>
@@ -140,9 +143,16 @@ import android.util.Log;
* <p>The entry for {@code settingsActivity} should contain the fully qualified class name of an
* activity that allows the user to modify the settings for this service. The {@code targetActivity}
* entry should contain the fully qualified class name of an activity that allows the user to view
- * their entire wallet. If specified, the wallet activity will be started with the Intent action
- * {@link #ACTION_VIEW_WALLET} and the settings activity will be started with the Intent action
- * {@link #ACTION_VIEW_WALLET_SETTINGS}.
+ * their entire wallet. The {@code targetActivity} will be started with the Intent action
+ * {@link #ACTION_VIEW_WALLET} and the {@code settingsActivity} will be started with the Intent
+ * action {@link #ACTION_VIEW_WALLET_SETTINGS}.
+ *
+ * <p>The {@code shortcutShortLabel} and {@code shortcutLongLabel} are used by the QuickAccessWallet
+ * in the buttons that navigate to the wallet app. The {@code shortcutShortLabel} is displayed next
+ * to the cards that are returned by the service and should be no more than 20 characters. The
+ * {@code shortcutLongLabel} is displayed when no cards are returned. This 'empty state' view also
+ * displays the service logo, specified by the {@code android:logo} manifest entry. If the logo is
+ * not specified, the empty state view will show the app icon instead.
*/
public abstract class QuickAccessWalletService extends Service {
diff --git a/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java b/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java
index 31e51bb945d6..f584bcd6b23f 100644
--- a/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java
+++ b/core/java/android/service/quickaccesswallet/QuickAccessWalletServiceInfo.java
@@ -29,7 +29,9 @@ import android.content.pm.ServiceInfo;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
+import android.graphics.drawable.Drawable;
import android.provider.Settings;
+import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Xml;
@@ -104,11 +106,25 @@ class QuickAccessWalletServiceInfo {
@Nullable
private final String mSettingsActivity;
@Nullable
- private final String mWalletActivity;
+ private final String mTargetActivity;
+ @Nullable
+ private final CharSequence mShortcutShortLabel;
+ @Nullable
+ private final CharSequence mShortcutLongLabel;
+
+ private static ServiceMetadata empty() {
+ return new ServiceMetadata(null, null, null, null);
+ }
- private ServiceMetadata(String settingsActivity, String walletActivity) {
- this.mSettingsActivity = settingsActivity;
- this.mWalletActivity = walletActivity;
+ private ServiceMetadata(
+ String targetActivity,
+ String settingsActivity,
+ CharSequence shortcutShortLabel,
+ CharSequence shortcutLongLabel) {
+ mTargetActivity = targetActivity;
+ mSettingsActivity = settingsActivity;
+ mShortcutShortLabel = shortcutShortLabel;
+ mShortcutLongLabel = shortcutLongLabel;
}
}
@@ -118,7 +134,7 @@ class QuickAccessWalletServiceInfo {
serviceInfo.loadXmlMetaData(pm, QuickAccessWalletService.SERVICE_META_DATA);
if (parser == null) {
- return new ServiceMetadata(null, null);
+ return ServiceMetadata.empty();
}
try {
@@ -134,11 +150,16 @@ class QuickAccessWalletServiceInfo {
try {
afsAttributes = resources.obtainAttributes(allAttributes,
R.styleable.QuickAccessWalletService);
+ String targetActivity = afsAttributes.getString(
+ R.styleable.QuickAccessWalletService_targetActivity);
String settingsActivity = afsAttributes.getString(
R.styleable.QuickAccessWalletService_settingsActivity);
- String walletActivity = afsAttributes.getString(
- R.styleable.QuickAccessWalletService_targetActivity);
- return new ServiceMetadata(settingsActivity, walletActivity);
+ CharSequence shortcutShortLabel = afsAttributes.getText(
+ R.styleable.QuickAccessWalletService_shortcutShortLabel);
+ CharSequence shortcutLongLabel = afsAttributes.getText(
+ R.styleable.QuickAccessWalletService_shortcutLongLabel);
+ return new ServiceMetadata(targetActivity, settingsActivity, shortcutShortLabel,
+ shortcutLongLabel);
} finally {
if (afsAttributes != null) {
afsAttributes.recycle();
@@ -147,13 +168,12 @@ class QuickAccessWalletServiceInfo {
} else {
Log.e(TAG, "Meta-data does not start with quickaccesswallet-service tag");
}
-
} catch (PackageManager.NameNotFoundException
| IOException
| XmlPullParserException e) {
Log.e(TAG, "Error parsing quickaccesswallet service meta-data", e);
}
- return new ServiceMetadata(null, null);
+ return ServiceMetadata.empty();
}
/**
@@ -171,7 +191,7 @@ class QuickAccessWalletServiceInfo {
*/
@Nullable
String getWalletActivity() {
- return mServiceMetadata.mWalletActivity;
+ return mServiceMetadata.mTargetActivity;
}
/**
@@ -183,4 +203,34 @@ class QuickAccessWalletServiceInfo {
String getSettingsActivity() {
return mServiceMetadata.mSettingsActivity;
}
+
+ @NonNull
+ Drawable getWalletLogo(Context context) {
+ Drawable drawable = mServiceInfo.loadLogo(context.getPackageManager());
+ if (drawable != null) {
+ return drawable;
+ }
+ return mServiceInfo.loadIcon(context.getPackageManager());
+ }
+
+ @NonNull
+ CharSequence getShortcutShortLabel(Context context) {
+ if (!TextUtils.isEmpty(mServiceMetadata.mShortcutShortLabel)) {
+ return mServiceMetadata.mShortcutShortLabel;
+ }
+ return mServiceInfo.loadLabel(context.getPackageManager());
+ }
+
+ @NonNull
+ CharSequence getShortcutLongLabel(Context context) {
+ if (!TextUtils.isEmpty(mServiceMetadata.mShortcutLongLabel)) {
+ return mServiceMetadata.mShortcutLongLabel;
+ }
+ return mServiceInfo.loadLabel(context.getPackageManager());
+ }
+
+ @NonNull
+ CharSequence getServiceLabel(Context context) {
+ return mServiceInfo.loadLabel(context.getPackageManager());
+ }
}
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index ecf46962f352..4065a6c83f8f 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -8356,10 +8356,15 @@
<declare-styleable name="QuickAccessWalletService">
<!-- Fully qualified class name of an activity that allows the user to modify
the settings for this service. -->
- <attr name="settingsActivity"/>
+ <attr name="settingsActivity" format="string"/>
<!-- Fully qualified class name of an activity that allows the user to view
their entire wallet -->
- <attr name="targetActivity"/>
+ <attr name="targetActivity" format="string"/>
+ <!-- Text shown on the empty state button if no cards are provided -->
+ <attr name="shortcutLongLabel"/>
+ <!-- Text shown on the button that takes users to the wallet application -->
+ <attr name="shortcutShortLabel"/>
+
</declare-styleable>
<!-- Use <code>recognition-service</code> as the root tag of the XML resource that