/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.notification; import android.app.Notification; import android.content.Context; import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.graphics.Bitmap; import android.service.notification.StatusBarNotification; import java.io.PrintWriter; import java.lang.reflect.Array; import java.util.Arrays; /** * Holds data about notifications that should not be shared with the * {@link android.service.notification.NotificationListenerService}s. * *
These objects should not be mutated unless the code is synchronized * on {@link NotificationManagerService#mNotificationList}, and any * modification should be followed by a sorting of that list.
* *Is sortable by {@link NotificationComparator}.
* * {@hide} */ public final class NotificationRecord { final StatusBarNotification sbn; NotificationUsageStats.SingleNotificationStats stats; boolean isCanceled; int score; // These members are used by NotificationSignalExtractors // to communicate with the ranking module. private float mContactAffinity; private boolean mRecentlyIntrusive; // is this notification currently being intercepted by Zen Mode? private boolean mIntercept; // InterceptedNotifications needs to know if this has been previously evaluated. private boolean mTouchedByZen; // The timestamp used for ranking. private long mRankingTimeMs; // Is this record an update of an old record? public boolean isUpdate; NotificationRecord(StatusBarNotification sbn, int score) { this.sbn = sbn; this.score = score; mRankingTimeMs = calculateRankingTimeMs(0L); } // copy any notes that the ranking system may have made before the update public void copyRankingInformation(NotificationRecord previous) { mContactAffinity = previous.mContactAffinity; mRecentlyIntrusive = previous.mRecentlyIntrusive; mTouchedByZen = previous.mTouchedByZen; mIntercept = previous.mIntercept; mRankingTimeMs = calculateRankingTimeMs(previous.getRankingTimeMs()); } public Notification getNotification() { return sbn.getNotification(); } public int getFlags() { return sbn.getNotification().flags; } public int getUserId() { return sbn.getUserId(); } public String getKey() { return sbn.getKey(); } void dump(PrintWriter pw, String prefix, Context baseContext) { final Notification notification = sbn.getNotification(); pw.println(prefix + this); pw.println(prefix + " uid=" + sbn.getUid() + " userId=" + sbn.getUserId()); pw.println(prefix + " icon=0x" + Integer.toHexString(notification.icon) + " / " + idDebugString(baseContext, sbn.getPackageName(), notification.icon)); pw.println(prefix + " pri=" + notification.priority + " score=" + sbn.getScore()); pw.println(prefix + " key=" + sbn.getKey()); pw.println(prefix + " contentIntent=" + notification.contentIntent); pw.println(prefix + " deleteIntent=" + notification.deleteIntent); pw.println(prefix + " tickerText=" + notification.tickerText); pw.println(prefix + " contentView=" + notification.contentView); pw.println(prefix + String.format(" defaults=0x%08x flags=0x%08x", notification.defaults, notification.flags)); pw.println(prefix + " sound=" + notification.sound); pw.println(prefix + String.format(" color=0x%08x", notification.color)); pw.println(prefix + " vibrate=" + Arrays.toString(notification.vibrate)); pw.println(prefix + String.format(" led=0x%08x onMs=%d offMs=%d", notification.ledARGB, notification.ledOnMS, notification.ledOffMS)); if (notification.actions != null && notification.actions.length > 0) { pw.println(prefix + " actions={"); final int N = notification.actions.length; for (int i=0; i