Merge "Statsd notif logs: important conversations." into rvc-dev am: 263c7f9bc1

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11931359

Change-Id: I23ceed6f13b748d91fe104fd0f966e23acffd6e2
This commit is contained in:
TreeHugger Robot
2020-06-19 22:55:33 +00:00
committed by Automerger Merge Worker
5 changed files with 52 additions and 9 deletions

View File

@@ -26,4 +26,5 @@ enum NotificationImportance { // Constants from NotificationManager.java
IMPORTANCE_LOW = 2; // Shows in shade, maybe status bar, no buzz/beep. IMPORTANCE_LOW = 2; // Shows in shade, maybe status bar, no buzz/beep.
IMPORTANCE_DEFAULT = 3; // Shows everywhere, makes noise, no heads-up. IMPORTANCE_DEFAULT = 3; // Shows everywhere, makes noise, no heads-up.
IMPORTANCE_HIGH = 4; // Shows everywhere, makes noise, heads-up, may full-screen. IMPORTANCE_HIGH = 4; // Shows everywhere, makes noise, heads-up, may full-screen.
IMPORTANCE_IMPORTANT_CONVERSATION = 5; // High + isImportantConversation().
} }

View File

@@ -16,9 +16,12 @@
package com.android.server.notification; package com.android.server.notification;
import static android.app.NotificationManager.IMPORTANCE_HIGH;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.app.NotificationChannel; import android.app.NotificationChannel;
import android.app.NotificationChannelGroup; import android.app.NotificationChannelGroup;
import android.stats.sysui.NotificationEnums;
import com.android.internal.logging.UiEvent; import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger; import com.android.internal.logging.UiEventLogger;
@@ -42,7 +45,7 @@ public interface NotificationChannelLogger {
String pkg) { String pkg) {
logNotificationChannel( logNotificationChannel(
NotificationChannelEvent.getCreated(channel), NotificationChannelEvent.getCreated(channel),
channel, uid, pkg, 0, 0); channel, uid, pkg, 0, getLoggingImportance(channel));
} }
/** /**
@@ -55,7 +58,7 @@ public interface NotificationChannelLogger {
String pkg) { String pkg) {
logNotificationChannel( logNotificationChannel(
NotificationChannelEvent.getDeleted(channel), NotificationChannelEvent.getDeleted(channel),
channel, uid, pkg, 0, 0); channel, uid, pkg, getLoggingImportance(channel), 0);
} }
/** /**
@@ -63,13 +66,13 @@ public interface NotificationChannelLogger {
* @param channel The channel. * @param channel The channel.
* @param uid UID of app that owns the channel. * @param uid UID of app that owns the channel.
* @param pkg Package of app that owns the channel. * @param pkg Package of app that owns the channel.
* @param oldImportance Previous importance level of the channel. * @param oldLoggingImportance Previous logging importance level of the channel.
* @param byUser True if the modification was user-specified. * @param byUser True if the modification was user-specified.
*/ */
default void logNotificationChannelModified(@NonNull NotificationChannel channel, int uid, default void logNotificationChannelModified(@NonNull NotificationChannel channel, int uid,
String pkg, int oldImportance, boolean byUser) { String pkg, int oldLoggingImportance, boolean byUser) {
logNotificationChannel(NotificationChannelEvent.getUpdated(byUser), logNotificationChannel(NotificationChannelEvent.getUpdated(byUser),
channel, uid, pkg, oldImportance, channel.getImportance()); channel, uid, pkg, oldLoggingImportance, getLoggingImportance(channel));
} }
/** /**
@@ -218,6 +221,27 @@ public interface NotificationChannelLogger {
return SmallHash.hash(group.getId()); return SmallHash.hash(group.getId());
} }
/**
* @return Logging importance for a channel: the regular importance, or
* IMPORTANCE_IMPORTANT_CONVERSATION for a HIGH-importance conversation tagged important.
*/
static int getLoggingImportance(@NonNull NotificationChannel channel) {
return getLoggingImportance(channel, channel.getImportance());
}
/**
* @return Logging importance for a channel or notification: the regular importance, or
* IMPORTANCE_IMPORTANT_CONVERSATION for a HIGH-importance conversation tagged important.
*/
static int getLoggingImportance(@NonNull NotificationChannel channel, int importance) {
if (channel.getConversationId() == null || importance < IMPORTANCE_HIGH) {
return importance;
}
return (channel.isImportantConversation())
? NotificationEnums.IMPORTANCE_IMPORTANT_CONVERSATION
: importance;
}
/** /**
* @return "Importance" for a channel group * @return "Importance" for a channel group
*/ */

View File

@@ -20,8 +20,10 @@ import static android.service.notification.NotificationListenerService.REASON_CA
import static android.service.notification.NotificationListenerService.REASON_CLICK; import static android.service.notification.NotificationListenerService.REASON_CLICK;
import static android.service.notification.NotificationListenerService.REASON_TIMEOUT; import static android.service.notification.NotificationListenerService.REASON_TIMEOUT;
import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationChannel;
import android.app.Person; import android.app.Person;
import android.os.Bundle; import android.os.Bundle;
import android.service.notification.NotificationListenerService; import android.service.notification.NotificationListenerService;
@@ -346,7 +348,8 @@ public interface NotificationRecordLogger {
== old.getSbn().getNotification().isGroupSummary()) == old.getSbn().getNotification().isGroupSummary())
&& Objects.equals(r.getSbn().getNotification().category, && Objects.equals(r.getSbn().getNotification().category,
old.getSbn().getNotification().category) old.getSbn().getNotification().category)
&& (r.getImportance() == old.getImportance())); && (r.getImportance() == old.getImportance())
&& (getLoggingImportance(r) == getLoggingImportance(old)));
} }
/** /**
@@ -413,5 +416,17 @@ public interface NotificationRecordLogger {
} }
/**
* @param r NotificationRecord
* @return Logging importance of record, taking important conversation channels into account.
*/
static int getLoggingImportance(@NonNull NotificationRecord r) {
final int importance = r.getImportance();
final NotificationChannel channel = r.getChannel();
if (channel == null) {
return importance;
}
return NotificationChannelLogger.getLoggingImportance(channel, importance);
}
} }

View File

@@ -51,7 +51,8 @@ public class NotificationRecordLoggerImpl implements NotificationRecordLogger {
/* int32 style = 11 */ p.getStyle(), /* int32 style = 11 */ p.getStyle(),
/* int32 num_people = 12 */ p.getNumPeople(), /* int32 num_people = 12 */ p.getNumPeople(),
/* int32 position = 13 */ position, /* int32 position = 13 */ position,
/* android.stats.sysui.NotificationImportance importance = 14 */ r.getImportance(), /* android.stats.sysui.NotificationImportance importance = 14 */
NotificationRecordLogger.getLoggingImportance(r),
/* int32 alerting = 15 */ buzzBeepBlink, /* int32 alerting = 15 */ buzzBeepBlink,
/* NotificationImportanceExplanation importance_source = 16 */ /* NotificationImportanceExplanation importance_source = 16 */
r.getImportanceExplanationCode(), r.getImportanceExplanationCode(),

View File

@@ -838,6 +838,8 @@ public class PreferencesHelper implements RankingConfig {
// Apps are allowed to downgrade channel importance if the user has not changed any // Apps are allowed to downgrade channel importance if the user has not changed any
// fields on this channel yet. // fields on this channel yet.
final int previousExistingImportance = existing.getImportance(); final int previousExistingImportance = existing.getImportance();
final int previousLoggingImportance =
NotificationChannelLogger.getLoggingImportance(existing);
if (existing.getUserLockedFields() == 0 && if (existing.getUserLockedFields() == 0 &&
channel.getImportance() < existing.getImportance()) { channel.getImportance() < existing.getImportance()) {
existing.setImportance(channel.getImportance()); existing.setImportance(channel.getImportance());
@@ -867,7 +869,7 @@ public class PreferencesHelper implements RankingConfig {
updateConfig(); updateConfig();
if (needsPolicyFileChange && !wasUndeleted) { if (needsPolicyFileChange && !wasUndeleted) {
mNotificationChannelLogger.logNotificationChannelModified(existing, uid, pkg, mNotificationChannelLogger.logNotificationChannelModified(existing, uid, pkg,
previousExistingImportance, false); previousLoggingImportance, false);
} }
return needsPolicyFileChange; return needsPolicyFileChange;
} }
@@ -985,7 +987,7 @@ public class PreferencesHelper implements RankingConfig {
MetricsLogger.action(getChannelLog(updatedChannel, pkg) MetricsLogger.action(getChannelLog(updatedChannel, pkg)
.setSubtype(fromUser ? 1 : 0)); .setSubtype(fromUser ? 1 : 0));
mNotificationChannelLogger.logNotificationChannelModified(updatedChannel, uid, pkg, mNotificationChannelLogger.logNotificationChannelModified(updatedChannel, uid, pkg,
channel.getImportance(), fromUser); NotificationChannelLogger.getLoggingImportance(channel), fromUser);
} }
if (updatedChannel.canBypassDnd() != mAreChannelsBypassingDnd if (updatedChannel.canBypassDnd() != mAreChannelsBypassingDnd