From 3aeddedc179db6921547e6bd652b0195102f4449 Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Fri, 31 Mar 2017 14:42:09 -0400 Subject: [PATCH] Show a link to app settings in notification guts. Test: runtest systemui, cts Change-Id: I7204102d5c83d589af5d3da57f72068491c12daa --- api/current.txt | 4 + api/system-current.txt | 4 + api/test-current.txt | 4 + core/java/android/app/Notification.java | 60 +++- .../SystemUI/res/layout/notification_info.xml | 9 + packages/SystemUI/res/values/strings.xml | 3 + packages/SystemUI/res/values/styles.xml | 4 + .../systemui/statusbar/NotificationInfo.java | 106 +++++-- .../systemui/statusbar/phone/StatusBar.java | 17 +- .../statusbar/NotificationInfoTest.java | 293 +++++++++++++++--- 10 files changed, 420 insertions(+), 84 deletions(-) diff --git a/api/current.txt b/api/current.txt index 15d308e2c34c6..0ae0298634009 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5116,6 +5116,7 @@ package android.app { method public java.lang.String getChannel(); method public java.lang.String getGroup(); method public android.graphics.drawable.Icon getLargeIcon(); + method public java.lang.CharSequence getSettingsText(); method public java.lang.String getShortcutId(); method public android.graphics.drawable.Icon getSmallIcon(); method public java.lang.String getSortKey(); @@ -5160,6 +5161,8 @@ package android.app { field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big"; field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession"; field public static final java.lang.String EXTRA_MESSAGES = "android.messages"; + field public static final java.lang.String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID"; + field public static final java.lang.String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG"; field public static final java.lang.String EXTRA_PEOPLE = "android.people"; field public static final java.lang.String EXTRA_PICTURE = "android.picture"; field public static final java.lang.String EXTRA_PROGRESS = "android.progress"; @@ -5345,6 +5348,7 @@ package android.app { method public android.app.Notification.Builder setProgress(int, int, boolean); method public android.app.Notification.Builder setPublicVersion(android.app.Notification); method public android.app.Notification.Builder setRemoteInputHistory(java.lang.CharSequence[]); + method public android.app.Notification.Builder setSettingsText(java.lang.CharSequence); method public android.app.Notification.Builder setShortcutId(java.lang.String); method public android.app.Notification.Builder setShowWhen(boolean); method public android.app.Notification.Builder setSmallIcon(int); diff --git a/api/system-current.txt b/api/system-current.txt index f74bc3a443d21..341602d035133 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5289,6 +5289,7 @@ package android.app { method public java.lang.String getGroup(); method public android.graphics.drawable.Icon getLargeIcon(); method public static java.lang.Class getNotificationStyleClass(java.lang.String); + method public java.lang.CharSequence getSettingsText(); method public java.lang.String getShortcutId(); method public android.graphics.drawable.Icon getSmallIcon(); method public java.lang.String getSortKey(); @@ -5334,6 +5335,8 @@ package android.app { field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big"; field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession"; field public static final java.lang.String EXTRA_MESSAGES = "android.messages"; + field public static final java.lang.String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID"; + field public static final java.lang.String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG"; field public static final java.lang.String EXTRA_PEOPLE = "android.people"; field public static final java.lang.String EXTRA_PICTURE = "android.picture"; field public static final java.lang.String EXTRA_PROGRESS = "android.progress"; @@ -5521,6 +5524,7 @@ package android.app { method public android.app.Notification.Builder setProgress(int, int, boolean); method public android.app.Notification.Builder setPublicVersion(android.app.Notification); method public android.app.Notification.Builder setRemoteInputHistory(java.lang.CharSequence[]); + method public android.app.Notification.Builder setSettingsText(java.lang.CharSequence); method public android.app.Notification.Builder setShortcutId(java.lang.String); method public android.app.Notification.Builder setShowWhen(boolean); method public android.app.Notification.Builder setSmallIcon(int); diff --git a/api/test-current.txt b/api/test-current.txt index b51739be69d5f..1ea195a0f9494 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -5128,6 +5128,7 @@ package android.app { method public java.lang.String getChannel(); method public java.lang.String getGroup(); method public android.graphics.drawable.Icon getLargeIcon(); + method public java.lang.CharSequence getSettingsText(); method public java.lang.String getShortcutId(); method public android.graphics.drawable.Icon getSmallIcon(); method public java.lang.String getSortKey(); @@ -5172,6 +5173,8 @@ package android.app { field public static final java.lang.String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big"; field public static final java.lang.String EXTRA_MEDIA_SESSION = "android.mediaSession"; field public static final java.lang.String EXTRA_MESSAGES = "android.messages"; + field public static final java.lang.String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID"; + field public static final java.lang.String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG"; field public static final java.lang.String EXTRA_PEOPLE = "android.people"; field public static final java.lang.String EXTRA_PICTURE = "android.picture"; field public static final java.lang.String EXTRA_PROGRESS = "android.progress"; @@ -5357,6 +5360,7 @@ package android.app { method public android.app.Notification.Builder setProgress(int, int, boolean); method public android.app.Notification.Builder setPublicVersion(android.app.Notification); method public android.app.Notification.Builder setRemoteInputHistory(java.lang.CharSequence[]); + method public android.app.Notification.Builder setSettingsText(java.lang.CharSequence); method public android.app.Notification.Builder setShortcutId(java.lang.String); method public android.app.Notification.Builder setShowWhen(boolean); method public android.app.Notification.Builder setSmallIcon(int); diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 161dd2583134b..6d7486b5311e9 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -103,8 +103,7 @@ public class Notification implements Parcelable /** * An activity that provides a user interface for adjusting notification preferences for its - * containing application. Optional but recommended for apps that post - * {@link android.app.Notification Notifications}. + * containing application. */ @SdkConstant(SdkConstantType.INTENT_CATEGORY) public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES @@ -113,10 +112,24 @@ public class Notification implements Parcelable /** * Optional extra for {@link #INTENT_CATEGORY_NOTIFICATION_PREFERENCES}. If provided, will * contain a {@link NotificationChannel#getId() channel id} that can be used to narrow down - * what in app notifications settings should be shown. + * what settings should be shown in the target app. */ public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID"; + /** + * Optional extra for {@link #INTENT_CATEGORY_NOTIFICATION_PREFERENCES}. If provided, will + * contain the tag provided to {@link NotificationManager#notify(String, int, Notification)} + * that can be used to narrow down what settings should be shown in the target app. + */ + public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG"; + + /** + * Optional extra for {@link #INTENT_CATEGORY_NOTIFICATION_PREFERENCES}. If provided, will + * contain the id provided to {@link NotificationManager#notify(String, int, Notification)} + * that can be used to narrow down what settings should be shown in the target app. + */ + public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID"; + /** * Use all default values (where applicable). */ @@ -1082,6 +1095,7 @@ public class Notification implements Parcelable private long mTimeout; private String mShortcutId; + private CharSequence mSettingsText; /** * If this notification is being shown as a badge, always show as a number. @@ -1851,6 +1865,10 @@ public class Notification implements Parcelable } mBadgeIcon = parcel.readInt(); + + if (parcel.readInt() != 0) { + mSettingsText = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel); + } } @Override @@ -1960,6 +1978,9 @@ public class Notification implements Parcelable that.mChannelId = this.mChannelId; that.mTimeout = this.mTimeout; + that.mShortcutId = this.mShortcutId; + that.mBadgeIcon = this.mBadgeIcon; + that.mSettingsText = this.mSettingsText; if (!heavy) { that.lightenPayload(); // will clean out extras @@ -2229,6 +2250,13 @@ public class Notification implements Parcelable } parcel.writeInt(mBadgeIcon); + + if (mSettingsText != null) { + parcel.writeInt(1); + TextUtils.writeToParcel(mSettingsText, parcel, flags); + } else { + parcel.writeInt(0); + } } /** @@ -2458,6 +2486,14 @@ public class Notification implements Parcelable return mShortcutId; } + + /** + * Returns the settings text provided to {@link Builder#setSettingsText(CharSequence)}. + */ + public CharSequence getSettingsText() { + return mSettingsText; + } + /** * The small icon representing this notification in the status bar and content view. * @@ -2886,6 +2922,24 @@ public class Notification implements Parcelable return this; } + /** + * Provides text that will appear as a link to your application's settings. + * + *

This text does not appear within notification {@link Style templates} but may + * appear when the user uses an affordance to learn more about the notification. + * Additionally, this text will not appear unless you provide a valid link target by + * handling {@link #INTENT_CATEGORY_NOTIFICATION_PREFERENCES}. + * + *

This text is meant to be concise description about what the user can customize + * when they click on this link. The recommended maximum length is 40 characters. + * @param text + * @return + */ + public Builder setSettingsText(CharSequence text) { + mN.mSettingsText = safeCharSequence(text); + return this; + } + /** * Set the remote input history. * diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml index 195eb9bafdab4..ff22ffb319fb9 100644 --- a/packages/SystemUI/res/layout/notification_info.xml +++ b/packages/SystemUI/res/layout/notification_info.xml @@ -97,6 +97,15 @@ android:layout_height="wrap_content" android:text="@string/notification_channel_disabled" style="@style/TextAppearance.NotificationInfo.Secondary" /> + + More settings + + Customize: %1$s Done diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index d6abda6bd4c94..c9479b8b41f72 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -370,6 +370,10 @@ ?android:attr/colorError + +