am 2fd0ba8e: am f78ff07f: Merge "Fix concurrency issues when parceling StatusBarNotifications." into jb-mr2-dev

* commit '2fd0ba8e9529780fd87b71a024edb3200ad1d93a':
  Fix concurrency issues when parceling StatusBarNotifications.
This commit is contained in:
Daniel Sandler
2013-04-23 11:16:19 -07:00
committed by Android Git Automerger
4 changed files with 64 additions and 24 deletions

View File

@@ -635,11 +635,16 @@ public class Notification implements Parcelable
@Override
public Notification clone() {
Notification that = new Notification();
cloneInto(that);
cloneInto(that, true);
return that;
}
private void cloneInto(Notification that) {
/**
* Copy all (or if heavy is false, all except Bitmaps and RemoteViews) members
* of this into that.
* @hide
*/
public void cloneInto(Notification that, boolean heavy) {
that.when = this.when;
that.icon = this.icon;
that.number = this.number;
@@ -652,13 +657,13 @@ public class Notification implements Parcelable
if (this.tickerText != null) {
that.tickerText = this.tickerText.toString();
}
if (this.tickerView != null) {
if (heavy && this.tickerView != null) {
that.tickerView = this.tickerView.clone();
}
if (this.contentView != null) {
if (heavy && this.contentView != null) {
that.contentView = this.contentView.clone();
}
if (this.largeIcon != null) {
if (heavy && this.largeIcon != null) {
that.largeIcon = Bitmap.createBitmap(this.largeIcon);
}
that.iconLevel = this.iconLevel;
@@ -690,7 +695,6 @@ public class Notification implements Parcelable
if (this.extras != null) {
that.extras = new Bundle(this.extras);
}
if (this.actions != null) {
@@ -700,9 +704,30 @@ public class Notification implements Parcelable
}
}
if (this.bigContentView != null) {
if (heavy && this.bigContentView != null) {
that.bigContentView = this.bigContentView.clone();
}
if (!heavy) {
that.lightenPayload(); // will clean out extras
}
}
/**
* Removes heavyweight parts of the Notification object for archival or for sending to
* listeners when the full contents are not necessary.
* @hide
*/
public final void lightenPayload() {
tickerView = null;
contentView = null;
bigContentView = null;
largeIcon = null;
if (extras != null) {
extras.remove(Notification.EXTRA_LARGE_ICON);
extras.remove(Notification.EXTRA_LARGE_ICON_BIG);
extras.remove(Notification.EXTRA_PICTURE);
}
}
public int describeContents() {
@@ -1706,7 +1731,7 @@ public class Notification implements Parcelable
* @hide
*/
public Notification buildInto(Notification n) {
build().cloneInto(n);
build().cloneInto(n, true);
return n;
}
}

View File

@@ -55,10 +55,17 @@ public abstract class NotificationListenerService extends Service {
* <P>
* This might occur because the user has dismissed the notification using system UI (or another
* notification listener) or because the app has withdrawn the notification.
* <P>
* NOTE: The {@link StatusBarNotification} object you receive will be "light"; that is, the
* {@link StatusBarNotification#notification} member may be missing some heavyweight
* fields such as {@link android.app.Notification#contentView} and
* {@link android.app.Notification#largeIcon}. However, all other fields on
* {@link StatusBarNotification}, sufficient to match this call with a prior call to
* {@link #onNotificationPosted(StatusBarNotification)}, will be intact.
*
* @param sbn A data structure encapsulating the original {@link android.app.Notification}
* object as well as its identifying information (tag and id) and source
* (package name).
* @param sbn A data structure encapsulating at least the original information (tag and id)
* and source (package name) used to post the {@link android.app.Notification} that
* was just removed.
*/
public abstract void onNotificationRemoved(StatusBarNotification sbn);

View File

@@ -152,6 +152,17 @@ public class StatusBarNotification implements Parcelable {
}
};
/**
* @hide
*/
public StatusBarNotification cloneLight() {
final Notification no = new Notification();
this.notification.cloneInto(no, false); // light copy
return new StatusBarNotification(this.pkg, this.basePkg,
this.id, this.tag, this.uid, this.initialPid,
this.score, no, this.user, this.postTime);
}
@Override
public StatusBarNotification clone() {
return new StatusBarNotification(this.pkg, this.basePkg,