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

Commit 730d949e authored by Alex Mang's avatar Alex Mang
Browse files

Support for NotificationAssistantService to rerank notifications.

NotificationAssistantService passes a RankingScore via an Adjustment to
NotificationRecord. NotificationManagerService sorts notification using
rank as part of NotificationComparator.

Bug: 146443378
Test: atest NotificationComparatorTest
Change-Id: I9f4d03c7d0ccf5adba4f26f48eb2638aa6caa49b
parent 211ac27e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7998,6 +7998,7 @@ package android.service.notification {
    field public static final String KEY_CONTEXTUAL_ACTIONS = "key_contextual_actions";
    field public static final String KEY_IMPORTANCE = "key_importance";
    field public static final String KEY_PEOPLE = "key_people";
    field public static final String KEY_RANKING_SCORE = "key_ranking_score";
    field public static final String KEY_SNOOZE_CRITERIA = "key_snooze_criteria";
    field public static final String KEY_TEXT_REPLIES = "key_text_replies";
    field public static final String KEY_USER_SENTIMENT = "key_user_sentiment";
+1 −0
Original line number Diff line number Diff line
@@ -2831,6 +2831,7 @@ package android.service.notification {
    field @NonNull public static final android.os.Parcelable.Creator<android.service.notification.Adjustment> CREATOR;
    field public static final String KEY_CONTEXTUAL_ACTIONS = "key_contextual_actions";
    field public static final String KEY_IMPORTANCE = "key_importance";
    field public static final String KEY_RANKING_SCORE = "key_ranking_score";
    field public static final String KEY_SNOOZE_CRITERIA = "key_snooze_criteria";
    field public static final String KEY_TEXT_REPLIES = "key_text_replies";
    field public static final String KEY_USER_SENTIMENT = "key_user_sentiment";
+7 −0
Original line number Diff line number Diff line
@@ -123,6 +123,13 @@ public final class Adjustment implements Parcelable {
     */
    public static final String KEY_IMPORTANCE = "key_importance";

    /**
     * Data type: float, a ranking score from 0 (lowest) to 1 (highest).
     * Used to rank notifications inside that fall under the same classification (i.e. alerting,
     * silenced).
     */
    public static final String KEY_RANKING_SCORE = "key_ranking_score";

    /**
     * Create a notification adjustment.
     *
+6 −0
Original line number Diff line number Diff line
@@ -59,6 +59,12 @@ public class NotificationComparator
            return -1 * Boolean.compare(isLeftHighImportance, isRightHighImportance);
        }

        // If a score has been assigned by notification assistant service, use this service
        // rank results within each bucket instead of this comparator implementation.
        if (left.getRankingScore() != right.getRankingScore()) {
            return -1 * Float.compare(left.getRankingScore(), right.getRankingScore());
        }

        // first all colorized notifications
        boolean leftImportantColorized = isImportantColorized(left);
        boolean rightImportantColorized = isImportantColorized(right);
+8 −0
Original line number Diff line number Diff line
@@ -144,6 +144,7 @@ public final class NotificationRecord {
    private int mSystemImportance = IMPORTANCE_UNSPECIFIED;
    private int mAssistantImportance = IMPORTANCE_UNSPECIFIED;
    private int mImportance = IMPORTANCE_UNSPECIFIED;
    private float mRankingScore = 0f;
    // Field used in global sort key to bypass normal notifications
    private int mCriticality = CriticalNotificationExtractor.NORMAL;
    // A MetricsEvent.NotificationImportanceExplanation, tracking source of mImportance.
@@ -655,6 +656,9 @@ public final class NotificationRecord {
                    importance = Math.min(IMPORTANCE_HIGH, importance);
                    setAssistantImportance(importance);
                }
                if (signals.containsKey(Adjustment.KEY_RANKING_SCORE)) {
                    mRankingScore = signals.getFloat(Adjustment.KEY_RANKING_SCORE);
                }
                if (!signals.isEmpty() && adjustment.getIssuer() != null) {
                    mAdjustmentIssuer = adjustment.getIssuer();
                }
@@ -772,6 +776,10 @@ public final class NotificationRecord {
        return mImportance;
    }

    public float getRankingScore() {
        return mRankingScore;
    }

    public CharSequence getImportanceExplanation() {
        switch (mImportanceExplanationCode) {
            case MetricsEvent.IMPORTANCE_EXPLANATION_UNKNOWN:
Loading