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

Commit 3dfdde0a authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Additional logging for notifications and DND

Bug: 116445483
Bug: 117164070
Test: review event log after performing relevant actions

Change-Id: I2032b5ecf960465b1369a0421f2493aa39386127
parent d5705da0
Loading
Loading
Loading
Loading
+3 −6
Original line number Original line Diff line number Diff line
@@ -719,8 +719,7 @@ public class NotificationManagerService extends SystemService {
                    return;
                    return;
                }
                }
                final long now = System.currentTimeMillis();
                final long now = System.currentTimeMillis();
                MetricsLogger.action(r.getLogMaker(now)
                MetricsLogger.action(r.getItemLogMaker()
                        .setCategory(MetricsEvent.NOTIFICATION_ITEM)
                        .setType(MetricsEvent.TYPE_ACTION)
                        .setType(MetricsEvent.TYPE_ACTION)
                        .addTaggedData(MetricsEvent.NOTIFICATION_SHADE_INDEX, nv.rank)
                        .addTaggedData(MetricsEvent.NOTIFICATION_SHADE_INDEX, nv.rank)
                        .addTaggedData(MetricsEvent.NOTIFICATION_SHADE_COUNT, nv.count));
                        .addTaggedData(MetricsEvent.NOTIFICATION_SHADE_COUNT, nv.count));
@@ -865,8 +864,7 @@ public class NotificationManagerService extends SystemService {
                    r.stats.onExpansionChanged(userAction, expanded);
                    r.stats.onExpansionChanged(userAction, expanded);
                    final long now = System.currentTimeMillis();
                    final long now = System.currentTimeMillis();
                    if (userAction) {
                    if (userAction) {
                        MetricsLogger.action(r.getLogMaker(now)
                        MetricsLogger.action(r.getItemLogMaker()
                                .setCategory(MetricsEvent.NOTIFICATION_ITEM)
                                .setType(expanded ? MetricsEvent.TYPE_DETAIL
                                .setType(expanded ? MetricsEvent.TYPE_DETAIL
                                        : MetricsEvent.TYPE_COLLAPSE));
                                        : MetricsEvent.TYPE_COLLAPSE));
                    }
                    }
@@ -5842,8 +5840,7 @@ public class NotificationManagerService extends SystemService {
        mArchive.record(r.sbn);
        mArchive.record(r.sbn);


        final long now = System.currentTimeMillis();
        final long now = System.currentTimeMillis();
        final LogMaker logMaker = r.getLogMaker(now)
        final LogMaker logMaker = r.getItemLogMaker()
                .setCategory(MetricsEvent.NOTIFICATION_ITEM)
                .setType(MetricsEvent.TYPE_DISMISS)
                .setType(MetricsEvent.TYPE_DISMISS)
                .setSubtype(reason);
                .setSubtype(reason);
        if (rank != -1 && count != -1) {
        if (rank != -1 && count != -1) {
+31 −0
Original line number Original line Diff line number Diff line
@@ -611,6 +611,7 @@ public final class NotificationRecord {
    }
    }


    public void applyAdjustments() {
    public void applyAdjustments() {
        long now = System.currentTimeMillis();
        synchronized (mAdjustments) {
        synchronized (mAdjustments) {
            for (Adjustment adjustment: mAdjustments) {
            for (Adjustment adjustment: mAdjustments) {
                Bundle signals = adjustment.getSignals();
                Bundle signals = adjustment.getSignals();
@@ -618,17 +619,25 @@ public final class NotificationRecord {
                    final ArrayList<String> people =
                    final ArrayList<String> people =
                            adjustment.getSignals().getStringArrayList(Adjustment.KEY_PEOPLE);
                            adjustment.getSignals().getStringArrayList(Adjustment.KEY_PEOPLE);
                    setPeopleOverride(people);
                    setPeopleOverride(people);
                    MetricsLogger.action(getAdjustmentLogMaker()
                            .addTaggedData(MetricsEvent.ADJUSTMENT_KEY_PEOPLE, people.size()));
                }
                }
                if (signals.containsKey(Adjustment.KEY_SNOOZE_CRITERIA)) {
                if (signals.containsKey(Adjustment.KEY_SNOOZE_CRITERIA)) {
                    final ArrayList<SnoozeCriterion> snoozeCriterionList =
                    final ArrayList<SnoozeCriterion> snoozeCriterionList =
                            adjustment.getSignals().getParcelableArrayList(
                            adjustment.getSignals().getParcelableArrayList(
                                    Adjustment.KEY_SNOOZE_CRITERIA);
                                    Adjustment.KEY_SNOOZE_CRITERIA);
                    setSnoozeCriteria(snoozeCriterionList);
                    setSnoozeCriteria(snoozeCriterionList);
                    MetricsLogger.action(getAdjustmentLogMaker()
                            .addTaggedData(MetricsEvent.ADJUSTMENT_KEY_SNOOZE_CRITERIA,
                                    snoozeCriterionList.size()));
                }
                }
                if (signals.containsKey(Adjustment.KEY_GROUP_KEY)) {
                if (signals.containsKey(Adjustment.KEY_GROUP_KEY)) {
                    final String groupOverrideKey =
                    final String groupOverrideKey =
                            adjustment.getSignals().getString(Adjustment.KEY_GROUP_KEY);
                            adjustment.getSignals().getString(Adjustment.KEY_GROUP_KEY);
                    setOverrideGroupKey(groupOverrideKey);
                    setOverrideGroupKey(groupOverrideKey);
                    MetricsLogger.action(getAdjustmentLogMaker()
                            .addTaggedData(MetricsEvent.ADJUSTMENT_KEY_GROUP_KEY,
                                    groupOverrideKey));
                }
                }
                if (signals.containsKey(Adjustment.KEY_USER_SENTIMENT)) {
                if (signals.containsKey(Adjustment.KEY_USER_SENTIMENT)) {
                    // Only allow user sentiment update from assistant if user hasn't already
                    // Only allow user sentiment update from assistant if user hasn't already
@@ -637,19 +646,31 @@ public final class NotificationRecord {
                            && (getChannel().getUserLockedFields() & USER_LOCKED_IMPORTANCE) == 0) {
                            && (getChannel().getUserLockedFields() & USER_LOCKED_IMPORTANCE) == 0) {
                        setUserSentiment(adjustment.getSignals().getInt(
                        setUserSentiment(adjustment.getSignals().getInt(
                                Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEUTRAL));
                                Adjustment.KEY_USER_SENTIMENT, USER_SENTIMENT_NEUTRAL));
                        MetricsLogger.action(getAdjustmentLogMaker()
                                .addTaggedData(MetricsEvent.ADJUSTMENT_KEY_USER_SENTIMENT,
                                        getUserSentiment()));
                    }
                    }
                }
                }
                if (signals.containsKey(Adjustment.KEY_SMART_ACTIONS)) {
                if (signals.containsKey(Adjustment.KEY_SMART_ACTIONS)) {
                    setSmartActions(signals.getParcelableArrayList(Adjustment.KEY_SMART_ACTIONS));
                    setSmartActions(signals.getParcelableArrayList(Adjustment.KEY_SMART_ACTIONS));
                    MetricsLogger.action(getAdjustmentLogMaker()
                            .addTaggedData(MetricsEvent.ADJUSTMENT_KEY_SMART_ACTIONS,
                                    getSmartActions().size()));
                }
                }
                if (signals.containsKey(Adjustment.KEY_SMART_REPLIES)) {
                if (signals.containsKey(Adjustment.KEY_SMART_REPLIES)) {
                    setSmartReplies(signals.getCharSequenceArrayList(Adjustment.KEY_SMART_REPLIES));
                    setSmartReplies(signals.getCharSequenceArrayList(Adjustment.KEY_SMART_REPLIES));
                    MetricsLogger.action(getAdjustmentLogMaker()
                            .addTaggedData(MetricsEvent.ADJUSTMENT_KEY_SMART_REPLIES,
                                    getSmartReplies().size()));
                }
                }
                if (signals.containsKey(Adjustment.KEY_IMPORTANCE)) {
                if (signals.containsKey(Adjustment.KEY_IMPORTANCE)) {
                    int importance = signals.getInt(Adjustment.KEY_IMPORTANCE);
                    int importance = signals.getInt(Adjustment.KEY_IMPORTANCE);
                    importance = Math.max(IMPORTANCE_UNSPECIFIED, importance);
                    importance = Math.max(IMPORTANCE_UNSPECIFIED, importance);
                    importance = Math.min(IMPORTANCE_HIGH, importance);
                    importance = Math.min(IMPORTANCE_HIGH, importance);
                    setAssistantImportance(importance);
                    setAssistantImportance(importance);
                    MetricsLogger.action(getAdjustmentLogMaker()
                            .addTaggedData(MetricsEvent.ADJUSTMENT_KEY_IMPORTANCE,
                                    importance));
                }
                }
            }
            }
        }
        }
@@ -1203,6 +1224,16 @@ public final class NotificationRecord {
        return getLogMaker(System.currentTimeMillis());
        return getLogMaker(System.currentTimeMillis());
    }
    }


    public LogMaker getItemLogMaker() {
        return getLogMaker().setCategory(MetricsEvent.NOTIFICATION_ITEM);
    }

    public LogMaker getAdjustmentLogMaker() {
        return getLogMaker()
                .setCategory(MetricsEvent.NOTIFICATION_ITEM)
                .setType(MetricsEvent.NOTIFICATION_ASSISTANT_ADJUSTMENT);
    }

    @VisibleForTesting
    @VisibleForTesting
    static final class Light {
    static final class Light {
        public final int color;
        public final int color;
+67 −5
Original line number Original line Diff line number Diff line
@@ -1212,27 +1212,89 @@ public class ZenModeHelper {
    }
    }


    private final class Metrics extends Callback {
    private final class Metrics extends Callback {
        private static final String COUNTER_PREFIX = "dnd_mode_";
        private static final String COUNTER_MODE_PREFIX = "dnd_mode_";
        private static final String COUNTER_TYPE_PREFIX = "dnd_type_";
        private static final int DND_OFF = 0;
        private static final int DND_ON_MANUAL = 1;
        private static final int DND_ON_AUTOMATIC = 2;
        private static final String COUNTER_RULE = "dnd_rule_count";
        private static final long MINIMUM_LOG_PERIOD_MS = 60 * 1000;
        private static final long MINIMUM_LOG_PERIOD_MS = 60 * 1000;


        // Total silence, alarms only, priority only
        private int mPreviousZenMode = -1;
        private int mPreviousZenMode = -1;
        private long mBeginningMs = 0L;
        private long mModeLogTimeMs = 0L;

        private int mNumZenRules = -1;
        private long mRuleCountLogTime = 0L;

        // automatic (1) vs manual (0) vs dnd off (2)
        private int mPreviousZenType = -1;
        private long mTypeLogTimeMs = 0L;


        @Override
        @Override
        void onZenModeChanged() {
        void onZenModeChanged() {
            emit();
            emit();
        }
        }


        @Override
        void onConfigChanged() {
            emit();
        }

        private void emit() {
        private void emit() {
            mHandler.postMetricsTimer();
            mHandler.postMetricsTimer();
            emitZenMode();
            emitRules();
            emitDndType();
        }

        private void emitZenMode() {
            final long now = SystemClock.elapsedRealtime();
            final long now = SystemClock.elapsedRealtime();
            final long since = (now - mBeginningMs);
            final long since = (now - mModeLogTimeMs);
            if (mPreviousZenMode != mZenMode || since > MINIMUM_LOG_PERIOD_MS) {
            if (mPreviousZenMode != mZenMode || since > MINIMUM_LOG_PERIOD_MS) {
                if (mPreviousZenMode != -1) {
                if (mPreviousZenMode != -1) {
                    MetricsLogger.count(mContext, COUNTER_PREFIX + mPreviousZenMode, (int) since);
                    MetricsLogger.count(
                            mContext, COUNTER_MODE_PREFIX + mPreviousZenMode, (int) since);
                }
                }
                mPreviousZenMode = mZenMode;
                mPreviousZenMode = mZenMode;
                mBeginningMs = now;
                mModeLogTimeMs = now;
            }
        }

        private void emitRules() {
            final long now = SystemClock.elapsedRealtime();
            final long since = (now - mRuleCountLogTime);
            synchronized (mConfig) {
                int numZenRules = mConfig.automaticRules.size();
                if (mNumZenRules != numZenRules
                        || since > MINIMUM_LOG_PERIOD_MS) {
                    if (mNumZenRules != -1) {
                        MetricsLogger.count(mContext, COUNTER_RULE,
                                numZenRules - mNumZenRules);
                    }
                    mNumZenRules = numZenRules;

                    mRuleCountLogTime = since;
                }
            }
        }

        private void emitDndType() {
            final long now = SystemClock.elapsedRealtime();
            final long since = (now - mTypeLogTimeMs);
            synchronized (mConfig) {
                boolean dndOn = mZenMode != Global.ZEN_MODE_OFF;
                int zenType = !dndOn ? DND_OFF
                        : (mConfig.manualRule != null) ? DND_ON_MANUAL : DND_ON_AUTOMATIC;
                if (zenType != mPreviousZenType
                        || since > MINIMUM_LOG_PERIOD_MS) {
                    if (mPreviousZenType != -1) {
                        MetricsLogger.count(
                                mContext, COUNTER_TYPE_PREFIX + mPreviousZenType, (int) since);
                    }
                    mTypeLogTimeMs = now;
                    mPreviousZenType = zenType;
                }
            }
            }
        }
        }
    }
    }