Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dde20309 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Notification instance ids in NMS for statsd logs."

parents 9b8a9441 cfd98306
Loading
Loading
Loading
Loading
+26 −3
Original line number Diff line number Diff line
@@ -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;

@@ -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

@@ -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();
@@ -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);
@@ -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() {
@@ -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
     */
+42 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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];
        }
    };

}
+14 −4
Original line number Diff line number Diff line
@@ -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;

@@ -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();

@@ -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);
    }

    /**
@@ -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);
    }
}
+19 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -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;
@@ -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;
@@ -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);
+4 −0
Original line number Diff line number Diff line
@@ -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