Loading core/java/android/service/notification/StatusBarNotification.java +26 −3 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.os.Parcelable; import android.os.UserHandle; import android.text.TextUtils; import com.android.internal.logging.InstanceId; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; Loading Loading @@ -68,6 +69,8 @@ public class StatusBarNotification implements Parcelable { private final UserHandle user; @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) private final long postTime; // A small per-notification ID, used for statsd logging. private InstanceId mInstanceId; // Not final, see setInstanceId() private Context mContext; // used for inflation & icon expansion Loading Loading @@ -131,8 +134,9 @@ public class StatusBarNotification implements Parcelable { this.postTime = in.readLong(); if (in.readInt() != 0) { this.overrideGroupKey = in.readString(); } else { this.overrideGroupKey = null; } if (in.readInt() != 0) { this.mInstanceId = InstanceId.CREATOR.createFromParcel(in); } this.key = key(); this.groupKey = groupKey(); Loading Loading @@ -196,7 +200,6 @@ public class StatusBarNotification implements Parcelable { out.writeInt(this.initialPid); this.notification.writeToParcel(out, flags); user.writeToParcel(out, flags); out.writeLong(this.postTime); if (this.overrideGroupKey != null) { out.writeInt(1); Loading @@ -204,6 +207,12 @@ public class StatusBarNotification implements Parcelable { } else { out.writeInt(0); } if (this.mInstanceId != null) { out.writeInt(1); mInstanceId.writeToParcel(out, flags); } else { out.writeInt(0); } } public int describeContents() { Loading Loading @@ -387,6 +396,20 @@ public class StatusBarNotification implements Parcelable { mContext = null; } /** * @hide */ public InstanceId getInstanceId() { return mInstanceId; } /** * @hide */ public void setInstanceId(InstanceId instanceId) { mInstanceId = instanceId; } /** * @hide */ Loading core/java/com/android/internal/logging/InstanceId.java +42 −5 Original line number Diff line number Diff line Loading @@ -16,20 +16,33 @@ package com.android.internal.logging; import static java.lang.Math.max; import static java.lang.Math.min; import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; import com.android.internal.annotations.VisibleForTesting; /** * An opaque identifier used to disambiguate which logs refer to a particular instance of some * UI element. Useful when there might be multiple instances simultaneously active. * Obtain from InstanceIdSequence. * Obtain from InstanceIdSequence. Clipped to range [0, INSTANCE_ID_MAX]. */ public class InstanceId { private int mId; protected InstanceId(int id) { mId = id; public final class InstanceId implements Parcelable { // At most 20 bits: ~1m possibilities, ~0.5% probability of collision in 100 values static final int INSTANCE_ID_MAX = 1 << 20; private final int mId; InstanceId(int id) { mId = min(max(0, id), INSTANCE_ID_MAX); } private InstanceId(Parcel in) { this(in.readInt()); } @VisibleForTesting public int getId() { return mId; Loading @@ -47,4 +60,28 @@ public class InstanceId { } return mId == ((InstanceId) obj).mId; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeInt(mId); } public static final Parcelable.Creator<InstanceId> CREATOR = new Parcelable.Creator<InstanceId>() { @Override public InstanceId createFromParcel(Parcel in) { return new InstanceId(in); } @Override public InstanceId[] newArray(int size) { return new InstanceId[size]; } }; } core/java/com/android/internal/logging/InstanceIdSequence.java +14 −4 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.internal.logging; import static java.lang.Math.max; import static java.lang.Math.min; import com.android.internal.annotations.VisibleForTesting; import java.security.SecureRandom; import java.util.Random; Loading @@ -28,8 +30,6 @@ import java.util.Random; * first use; try to give it a long lifetime. Safe for concurrent use. */ public class InstanceIdSequence { // At most 20 bits: ~1m possibilities, ~0.5% probability of collision in 100 values private static final int INSTANCE_ID_MAX = 1 << 20; protected final int mInstanceIdMax; private final Random mRandom = new SecureRandom(); Loading @@ -39,7 +39,7 @@ public class InstanceIdSequence { * an all-zero sequence. */ public InstanceIdSequence(int instanceIdMax) { mInstanceIdMax = min(max(0, instanceIdMax), INSTANCE_ID_MAX); mInstanceIdMax = min(max(0, instanceIdMax), InstanceId.INSTANCE_ID_MAX); } /** Loading @@ -47,6 +47,16 @@ public class InstanceIdSequence { * @return new InstanceId */ public InstanceId newInstanceId() { return new InstanceId(mRandom.nextInt(mInstanceIdMax)); return newInstanceIdInternal(mRandom.nextInt(mInstanceIdMax)); } /** * Factory function for instance IDs, used for testing. * @param id * @return new InstanceId(id) */ @VisibleForTesting protected InstanceId newInstanceIdInternal(int id) { return new InstanceId(id); } } services/core/java/com/android/server/notification/NotificationManagerService.java +19 −3 Original line number Diff line number Diff line Loading @@ -231,6 +231,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.compat.IPlatformCompat; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.logging.InstanceIdSequence; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; Loading Loading @@ -380,6 +381,8 @@ public class NotificationManagerService extends SystemService { private static final String SCHEME_TIMEOUT = "timeout"; private static final String EXTRA_KEY = "key"; private static final int NOTIFICATION_INSTANCE_ID_MAX = (1 << 13); /** * Apps that post custom toasts in the background will have those blocked. Apps can * still post toasts created with Loading Loading @@ -519,6 +522,7 @@ public class NotificationManagerService extends SystemService { private final SavePolicyFileRunnable mSavePolicyFile = new SavePolicyFileRunnable(); private NotificationRecordLogger mNotificationRecordLogger; private InstanceIdSequence mNotificationInstanceIdSequence; private static class Archive { final int mBufferSize; Loading Loading @@ -1718,18 +1722,22 @@ public class NotificationManagerService extends SystemService { } public NotificationManagerService(Context context) { this(context, new NotificationRecordLoggerImpl()); this(context, new NotificationRecordLoggerImpl(), new InstanceIdSequence(NOTIFICATION_INSTANCE_ID_MAX)); } @VisibleForTesting public NotificationManagerService(Context context, NotificationRecordLogger notificationRecordLogger) { NotificationRecordLogger notificationRecordLogger, InstanceIdSequence notificationInstanceIdSequence) { super(context); mNotificationRecordLogger = notificationRecordLogger; mNotificationInstanceIdSequence = notificationInstanceIdSequence; Notification.processWhitelistToken = WHITELIST_TOKEN; } // TODO - replace these methods with a single VisibleForTesting constructor // TODO - replace these methods with new fields in the VisibleForTesting constructor @VisibleForTesting void setAudioManager(AudioManager audioMananger) { mAudioManager = audioMananger; Loading Loading @@ -6291,6 +6299,14 @@ public class NotificationManagerService extends SystemService { NotificationRecord old = mNotificationsByKey.get(key); final StatusBarNotification n = r.sbn; final Notification notification = n.getNotification(); // Make sure the SBN has an instance ID for statsd logging. if (old == null || old.sbn.getInstanceId() == null) { n.setInstanceId(mNotificationInstanceIdSequence.newInstanceId()); } else { n.setInstanceId(old.sbn.getInstanceId()); } int index = indexOfNotificationLocked(n.getKey()); if (index < 0) { mNotificationList.add(r); Loading services/core/java/com/android/server/notification/NotificationRecordLogger.java +4 −0 Original line number Diff line number Diff line Loading @@ -138,5 +138,9 @@ public interface NotificationRecordLogger { String assistant = r.getAdjustmentIssuer(); return (assistant == null) ? 0 : assistant.hashCode(); } int getInstanceId() { return (r.sbn.getInstanceId() == null ? 0 : r.sbn.getInstanceId().getId()); } } } Loading
core/java/android/service/notification/StatusBarNotification.java +26 −3 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ import android.os.Parcelable; import android.os.UserHandle; import android.text.TextUtils; import com.android.internal.logging.InstanceId; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; Loading Loading @@ -68,6 +69,8 @@ public class StatusBarNotification implements Parcelable { private final UserHandle user; @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) private final long postTime; // A small per-notification ID, used for statsd logging. private InstanceId mInstanceId; // Not final, see setInstanceId() private Context mContext; // used for inflation & icon expansion Loading Loading @@ -131,8 +134,9 @@ public class StatusBarNotification implements Parcelable { this.postTime = in.readLong(); if (in.readInt() != 0) { this.overrideGroupKey = in.readString(); } else { this.overrideGroupKey = null; } if (in.readInt() != 0) { this.mInstanceId = InstanceId.CREATOR.createFromParcel(in); } this.key = key(); this.groupKey = groupKey(); Loading Loading @@ -196,7 +200,6 @@ public class StatusBarNotification implements Parcelable { out.writeInt(this.initialPid); this.notification.writeToParcel(out, flags); user.writeToParcel(out, flags); out.writeLong(this.postTime); if (this.overrideGroupKey != null) { out.writeInt(1); Loading @@ -204,6 +207,12 @@ public class StatusBarNotification implements Parcelable { } else { out.writeInt(0); } if (this.mInstanceId != null) { out.writeInt(1); mInstanceId.writeToParcel(out, flags); } else { out.writeInt(0); } } public int describeContents() { Loading Loading @@ -387,6 +396,20 @@ public class StatusBarNotification implements Parcelable { mContext = null; } /** * @hide */ public InstanceId getInstanceId() { return mInstanceId; } /** * @hide */ public void setInstanceId(InstanceId instanceId) { mInstanceId = instanceId; } /** * @hide */ Loading
core/java/com/android/internal/logging/InstanceId.java +42 −5 Original line number Diff line number Diff line Loading @@ -16,20 +16,33 @@ package com.android.internal.logging; import static java.lang.Math.max; import static java.lang.Math.min; import android.annotation.Nullable; import android.os.Parcel; import android.os.Parcelable; import com.android.internal.annotations.VisibleForTesting; /** * An opaque identifier used to disambiguate which logs refer to a particular instance of some * UI element. Useful when there might be multiple instances simultaneously active. * Obtain from InstanceIdSequence. * Obtain from InstanceIdSequence. Clipped to range [0, INSTANCE_ID_MAX]. */ public class InstanceId { private int mId; protected InstanceId(int id) { mId = id; public final class InstanceId implements Parcelable { // At most 20 bits: ~1m possibilities, ~0.5% probability of collision in 100 values static final int INSTANCE_ID_MAX = 1 << 20; private final int mId; InstanceId(int id) { mId = min(max(0, id), INSTANCE_ID_MAX); } private InstanceId(Parcel in) { this(in.readInt()); } @VisibleForTesting public int getId() { return mId; Loading @@ -47,4 +60,28 @@ public class InstanceId { } return mId == ((InstanceId) obj).mId; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel out, int flags) { out.writeInt(mId); } public static final Parcelable.Creator<InstanceId> CREATOR = new Parcelable.Creator<InstanceId>() { @Override public InstanceId createFromParcel(Parcel in) { return new InstanceId(in); } @Override public InstanceId[] newArray(int size) { return new InstanceId[size]; } }; }
core/java/com/android/internal/logging/InstanceIdSequence.java +14 −4 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.internal.logging; import static java.lang.Math.max; import static java.lang.Math.min; import com.android.internal.annotations.VisibleForTesting; import java.security.SecureRandom; import java.util.Random; Loading @@ -28,8 +30,6 @@ import java.util.Random; * first use; try to give it a long lifetime. Safe for concurrent use. */ public class InstanceIdSequence { // At most 20 bits: ~1m possibilities, ~0.5% probability of collision in 100 values private static final int INSTANCE_ID_MAX = 1 << 20; protected final int mInstanceIdMax; private final Random mRandom = new SecureRandom(); Loading @@ -39,7 +39,7 @@ public class InstanceIdSequence { * an all-zero sequence. */ public InstanceIdSequence(int instanceIdMax) { mInstanceIdMax = min(max(0, instanceIdMax), INSTANCE_ID_MAX); mInstanceIdMax = min(max(0, instanceIdMax), InstanceId.INSTANCE_ID_MAX); } /** Loading @@ -47,6 +47,16 @@ public class InstanceIdSequence { * @return new InstanceId */ public InstanceId newInstanceId() { return new InstanceId(mRandom.nextInt(mInstanceIdMax)); return newInstanceIdInternal(mRandom.nextInt(mInstanceIdMax)); } /** * Factory function for instance IDs, used for testing. * @param id * @return new InstanceId(id) */ @VisibleForTesting protected InstanceId newInstanceIdInternal(int id) { return new InstanceId(id); } }
services/core/java/com/android/server/notification/NotificationManagerService.java +19 −3 Original line number Diff line number Diff line Loading @@ -231,6 +231,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.compat.IPlatformCompat; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.logging.InstanceIdSequence; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; Loading Loading @@ -380,6 +381,8 @@ public class NotificationManagerService extends SystemService { private static final String SCHEME_TIMEOUT = "timeout"; private static final String EXTRA_KEY = "key"; private static final int NOTIFICATION_INSTANCE_ID_MAX = (1 << 13); /** * Apps that post custom toasts in the background will have those blocked. Apps can * still post toasts created with Loading Loading @@ -519,6 +522,7 @@ public class NotificationManagerService extends SystemService { private final SavePolicyFileRunnable mSavePolicyFile = new SavePolicyFileRunnable(); private NotificationRecordLogger mNotificationRecordLogger; private InstanceIdSequence mNotificationInstanceIdSequence; private static class Archive { final int mBufferSize; Loading Loading @@ -1718,18 +1722,22 @@ public class NotificationManagerService extends SystemService { } public NotificationManagerService(Context context) { this(context, new NotificationRecordLoggerImpl()); this(context, new NotificationRecordLoggerImpl(), new InstanceIdSequence(NOTIFICATION_INSTANCE_ID_MAX)); } @VisibleForTesting public NotificationManagerService(Context context, NotificationRecordLogger notificationRecordLogger) { NotificationRecordLogger notificationRecordLogger, InstanceIdSequence notificationInstanceIdSequence) { super(context); mNotificationRecordLogger = notificationRecordLogger; mNotificationInstanceIdSequence = notificationInstanceIdSequence; Notification.processWhitelistToken = WHITELIST_TOKEN; } // TODO - replace these methods with a single VisibleForTesting constructor // TODO - replace these methods with new fields in the VisibleForTesting constructor @VisibleForTesting void setAudioManager(AudioManager audioMananger) { mAudioManager = audioMananger; Loading Loading @@ -6291,6 +6299,14 @@ public class NotificationManagerService extends SystemService { NotificationRecord old = mNotificationsByKey.get(key); final StatusBarNotification n = r.sbn; final Notification notification = n.getNotification(); // Make sure the SBN has an instance ID for statsd logging. if (old == null || old.sbn.getInstanceId() == null) { n.setInstanceId(mNotificationInstanceIdSequence.newInstanceId()); } else { n.setInstanceId(old.sbn.getInstanceId()); } int index = indexOfNotificationLocked(n.getKey()); if (index < 0) { mNotificationList.add(r); Loading
services/core/java/com/android/server/notification/NotificationRecordLogger.java +4 −0 Original line number Diff line number Diff line Loading @@ -138,5 +138,9 @@ public interface NotificationRecordLogger { String assistant = r.getAdjustmentIssuer(); return (assistant == null) ? 0 : assistant.hashCode(); } int getInstanceId() { return (r.sbn.getInstanceId() == null ? 0 : r.sbn.getInstanceId().getId()); } } }