Add APIs for notification app overlays
- Can be enabled/disabled at channel and channel group levels
- An activity to launch can be added to notification
Test: atest, cts
Bug: 111236845
Change-Id: I9a4832211676cca4649d1f28e6e3e3157954d268
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 4f41da6..6d464fb 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -1275,6 +1275,8 @@
private String mShortcutId;
private CharSequence mSettingsText;
+ private PendingIntent mAppOverlayIntent;
+
/** @hide */
@IntDef(prefix = { "GROUP_ALERT_" }, value = {
GROUP_ALERT_ALL, GROUP_ALERT_CHILDREN, GROUP_ALERT_SUMMARY
@@ -2225,6 +2227,9 @@
}
mGroupAlertBehavior = parcel.readInt();
+ if (parcel.readInt() != 0) {
+ mAppOverlayIntent = PendingIntent.CREATOR.createFromParcel(parcel);
+ }
}
@Override
@@ -2339,6 +2344,7 @@
that.mBadgeIcon = this.mBadgeIcon;
that.mSettingsText = this.mSettingsText;
that.mGroupAlertBehavior = this.mGroupAlertBehavior;
+ that.mAppOverlayIntent = this.mAppOverlayIntent;
if (!heavy) {
that.lightenPayload(); // will clean out extras
@@ -2660,6 +2666,13 @@
parcel.writeInt(mGroupAlertBehavior);
+ if (mAppOverlayIntent != null) {
+ parcel.writeInt(1);
+ mAppOverlayIntent.writeToParcel(parcel, 0);
+ } else {
+ parcel.writeInt(0);
+ }
+
// mUsesStandardHeader is not written because it should be recomputed in listeners
}
@@ -3073,6 +3086,14 @@
}
/**
+ * Returns the intent that will be used to display app content in a floating window over the
+ * existing foreground activity.
+ */
+ public PendingIntent getAppOverlayIntent() {
+ return mAppOverlayIntent;
+ }
+
+ /**
* The small icon representing this notification in the status bar and content view.
*
* @return the small icon representing this notification.
@@ -3406,6 +3427,23 @@
return this;
}
+ /**
+ * Sets the intent that will be used to display app content in a floating window
+ * over the existing foreground activity.
+ *
+ * <p>This intent will be ignored unless this notification is posted to a channel that
+ * allows {@link NotificationChannel#canOverlayApps() app overlays}.</p>
+ *
+ * <p>Notifications with a valid and allowed app overlay intent will be displayed as
+ * floating windows outside of the notification shade on unlocked devices. When a user
+ * interacts with one of these windows, this app overlay intent will be invoked and
+ * displayed.</p>
+ */
+ public Builder setAppOverlayIntent(PendingIntent intent) {
+ mN.mAppOverlayIntent = intent;
+ return this;
+ }
+
/** @removed */
@Deprecated
public Builder setChannel(String channelId) {