Merge "Add UiEvents for blocked full-screen intents" into tm-qpr-dev

This commit is contained in:
Julia Tuttle
2022-10-21 18:03:48 +00:00
committed by Android (Google) Code Review
5 changed files with 67 additions and 8 deletions

View File

@@ -17,6 +17,8 @@
package com.android.systemui.statusbar.notification.interruption; package com.android.systemui.statusbar.notification.interruption;
import static com.android.systemui.statusbar.StatusBarState.SHADE; import static com.android.systemui.statusbar.StatusBarState.SHADE;
import static com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderImpl.NotificationInterruptEvent.FSI_SUPPRESSED_NO_HUN_OR_KEYGUARD;
import static com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderImpl.NotificationInterruptEvent.FSI_SUPPRESSED_SUPPRESSIVE_GROUP_ALERT_BEHAVIOR;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.content.ContentResolver; import android.content.ContentResolver;
@@ -32,6 +34,8 @@ import android.service.notification.StatusBarNotification;
import android.util.Log; import android.util.Log;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.UiEvent;
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
@@ -68,10 +72,30 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
private final NotificationInterruptLogger mLogger; private final NotificationInterruptLogger mLogger;
private final NotifPipelineFlags mFlags; private final NotifPipelineFlags mFlags;
private final KeyguardNotificationVisibilityProvider mKeyguardNotificationVisibilityProvider; private final KeyguardNotificationVisibilityProvider mKeyguardNotificationVisibilityProvider;
private final UiEventLogger mUiEventLogger;
@VisibleForTesting @VisibleForTesting
protected boolean mUseHeadsUp = false; protected boolean mUseHeadsUp = false;
public enum NotificationInterruptEvent implements UiEventLogger.UiEventEnum {
@UiEvent(doc = "FSI suppressed for suppressive GroupAlertBehavior")
FSI_SUPPRESSED_SUPPRESSIVE_GROUP_ALERT_BEHAVIOR(1235),
@UiEvent(doc = "FSI suppressed for requiring neither HUN nor keyguard")
FSI_SUPPRESSED_NO_HUN_OR_KEYGUARD(1236);
private final int mId;
NotificationInterruptEvent(int id) {
mId = id;
}
@Override
public int getId() {
return mId;
}
}
@Inject @Inject
public NotificationInterruptStateProviderImpl( public NotificationInterruptStateProviderImpl(
ContentResolver contentResolver, ContentResolver contentResolver,
@@ -85,7 +109,8 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
NotificationInterruptLogger logger, NotificationInterruptLogger logger,
@Main Handler mainHandler, @Main Handler mainHandler,
NotifPipelineFlags flags, NotifPipelineFlags flags,
KeyguardNotificationVisibilityProvider keyguardNotificationVisibilityProvider) { KeyguardNotificationVisibilityProvider keyguardNotificationVisibilityProvider,
UiEventLogger uiEventLogger) {
mContentResolver = contentResolver; mContentResolver = contentResolver;
mPowerManager = powerManager; mPowerManager = powerManager;
mDreamManager = dreamManager; mDreamManager = dreamManager;
@@ -97,6 +122,7 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
mLogger = logger; mLogger = logger;
mFlags = flags; mFlags = flags;
mKeyguardNotificationVisibilityProvider = keyguardNotificationVisibilityProvider; mKeyguardNotificationVisibilityProvider = keyguardNotificationVisibilityProvider;
mUiEventLogger = uiEventLogger;
ContentObserver headsUpObserver = new ContentObserver(mainHandler) { ContentObserver headsUpObserver = new ContentObserver(mainHandler) {
@Override @Override
public void onChange(boolean selfChange) { public void onChange(boolean selfChange) {
@@ -203,7 +229,9 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
// b/231322873: Detect and report an event when a notification has both an FSI and a // b/231322873: Detect and report an event when a notification has both an FSI and a
// suppressive groupAlertBehavior, and now correctly block the FSI from firing. // suppressive groupAlertBehavior, and now correctly block the FSI from firing.
final int uid = entry.getSbn().getUid(); final int uid = entry.getSbn().getUid();
final String packageName = entry.getSbn().getPackageName();
android.util.EventLog.writeEvent(0x534e4554, "231322873", uid, "groupAlertBehavior"); android.util.EventLog.writeEvent(0x534e4554, "231322873", uid, "groupAlertBehavior");
mUiEventLogger.log(FSI_SUPPRESSED_SUPPRESSIVE_GROUP_ALERT_BEHAVIOR, uid, packageName);
mLogger.logNoFullscreenWarning(entry, "GroupAlertBehavior will prevent HUN"); mLogger.logNoFullscreenWarning(entry, "GroupAlertBehavior will prevent HUN");
return false; return false;
} }
@@ -249,7 +277,9 @@ public class NotificationInterruptStateProviderImpl implements NotificationInter
// Detect the case determined by b/231322873 to launch FSI while device is in use, // Detect the case determined by b/231322873 to launch FSI while device is in use,
// as blocked by the correct implementation, and report the event. // as blocked by the correct implementation, and report the event.
final int uid = entry.getSbn().getUid(); final int uid = entry.getSbn().getUid();
final String packageName = entry.getSbn().getPackageName();
android.util.EventLog.writeEvent(0x534e4554, "231322873", uid, "no hun or keyguard"); android.util.EventLog.writeEvent(0x534e4554, "231322873", uid, "no hun or keyguard");
mUiEventLogger.log(FSI_SUPPRESSED_NO_HUN_OR_KEYGUARD, uid, packageName);
mLogger.logNoFullscreenWarning(entry, "Expected not to HUN while not on keyguard"); mLogger.logNoFullscreenWarning(entry, "Expected not to HUN while not on keyguard");
return false; return false;
} }

View File

@@ -51,12 +51,14 @@ import android.testing.AndroidTestingRunner;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.internal.logging.testing.UiEventLoggerFake;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.NotifPipelineFlags; import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry;
import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder; import com.android.systemui.statusbar.notification.collection.NotificationEntryBuilder;
import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderImpl.NotificationInterruptEvent;
import com.android.systemui.statusbar.policy.BatteryController; import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
@@ -97,6 +99,7 @@ public class NotificationInterruptStateProviderImplTest extends SysuiTestCase {
NotifPipelineFlags mFlags; NotifPipelineFlags mFlags;
@Mock @Mock
KeyguardNotificationVisibilityProvider mKeyguardNotificationVisibilityProvider; KeyguardNotificationVisibilityProvider mKeyguardNotificationVisibilityProvider;
UiEventLoggerFake mUiEventLoggerFake;
@Mock @Mock
PendingIntent mPendingIntent; PendingIntent mPendingIntent;
@@ -107,6 +110,8 @@ public class NotificationInterruptStateProviderImplTest extends SysuiTestCase {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
when(mFlags.fullScreenIntentRequiresKeyguard()).thenReturn(false); when(mFlags.fullScreenIntentRequiresKeyguard()).thenReturn(false);
mUiEventLoggerFake = new UiEventLoggerFake();
mNotifInterruptionStateProvider = mNotifInterruptionStateProvider =
new NotificationInterruptStateProviderImpl( new NotificationInterruptStateProviderImpl(
mContext.getContentResolver(), mContext.getContentResolver(),
@@ -120,7 +125,8 @@ public class NotificationInterruptStateProviderImplTest extends SysuiTestCase {
mLogger, mLogger,
mMockHandler, mMockHandler,
mFlags, mFlags,
mKeyguardNotificationVisibilityProvider); mKeyguardNotificationVisibilityProvider,
mUiEventLoggerFake);
mNotifInterruptionStateProvider.mUseHeadsUp = true; mNotifInterruptionStateProvider.mUseHeadsUp = true;
} }
@@ -442,6 +448,13 @@ public class NotificationInterruptStateProviderImplTest extends SysuiTestCase {
verify(mLogger, never()).logNoFullscreen(any(), any()); verify(mLogger, never()).logNoFullscreen(any(), any());
verify(mLogger).logNoFullscreenWarning(entry, "GroupAlertBehavior will prevent HUN"); verify(mLogger).logNoFullscreenWarning(entry, "GroupAlertBehavior will prevent HUN");
verify(mLogger, never()).logFullscreen(any(), any()); verify(mLogger, never()).logFullscreen(any(), any());
assertThat(mUiEventLoggerFake.numLogs()).isEqualTo(1);
UiEventLoggerFake.FakeUiEvent fakeUiEvent = mUiEventLoggerFake.get(0);
assertThat(fakeUiEvent.eventId).isEqualTo(
NotificationInterruptEvent.FSI_SUPPRESSED_SUPPRESSIVE_GROUP_ALERT_BEHAVIOR.getId());
assertThat(fakeUiEvent.uid).isEqualTo(entry.getSbn().getUid());
assertThat(fakeUiEvent.packageName).isEqualTo(entry.getSbn().getPackageName());
} }
@Test @Test
@@ -600,6 +613,13 @@ public class NotificationInterruptStateProviderImplTest extends SysuiTestCase {
verify(mLogger, never()).logNoFullscreen(any(), any()); verify(mLogger, never()).logNoFullscreen(any(), any());
verify(mLogger).logNoFullscreenWarning(entry, "Expected not to HUN while not on keyguard"); verify(mLogger).logNoFullscreenWarning(entry, "Expected not to HUN while not on keyguard");
verify(mLogger, never()).logFullscreen(any(), any()); verify(mLogger, never()).logFullscreen(any(), any());
assertThat(mUiEventLoggerFake.numLogs()).isEqualTo(1);
UiEventLoggerFake.FakeUiEvent fakeUiEvent = mUiEventLoggerFake.get(0);
assertThat(fakeUiEvent.eventId).isEqualTo(
NotificationInterruptEvent.FSI_SUPPRESSED_NO_HUN_OR_KEYGUARD.getId());
assertThat(fakeUiEvent.uid).isEqualTo(entry.getSbn().getUid());
assertThat(fakeUiEvent.packageName).isEqualTo(entry.getSbn().getPackageName());
} }
/** /**

View File

@@ -80,6 +80,7 @@ import androidx.test.filters.SmallTest;
import com.android.internal.colorextraction.ColorExtractor; import com.android.internal.colorextraction.ColorExtractor;
import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.logging.testing.FakeMetricsLogger; import com.android.internal.logging.testing.FakeMetricsLogger;
import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.IStatusBarService;
@@ -323,7 +324,8 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
mock(NotificationInterruptLogger.class), mock(NotificationInterruptLogger.class),
new Handler(TestableLooper.get(this).getLooper()), new Handler(TestableLooper.get(this).getLooper()),
mock(NotifPipelineFlags.class), mock(NotifPipelineFlags.class),
mock(KeyguardNotificationVisibilityProvider.class)); mock(KeyguardNotificationVisibilityProvider.class),
mock(UiEventLogger.class));
mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class)); mContext.addMockSystemService(TrustManager.class, mock(TrustManager.class));
mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class)); mContext.addMockSystemService(FingerprintManager.class, mock(FingerprintManager.class));
@@ -1157,7 +1159,8 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
NotificationInterruptLogger logger, NotificationInterruptLogger logger,
Handler mainHandler, Handler mainHandler,
NotifPipelineFlags flags, NotifPipelineFlags flags,
KeyguardNotificationVisibilityProvider keyguardNotificationVisibilityProvider) { KeyguardNotificationVisibilityProvider keyguardNotificationVisibilityProvider,
UiEventLogger uiEventLogger) {
super( super(
contentResolver, contentResolver,
powerManager, powerManager,
@@ -1170,7 +1173,8 @@ public class CentralSurfacesImplTest extends SysuiTestCase {
logger, logger,
mainHandler, mainHandler,
flags, flags,
keyguardNotificationVisibilityProvider keyguardNotificationVisibilityProvider,
uiEventLogger
); );
mUseHeadsUp = true; mUseHeadsUp = true;
} }

View File

@@ -80,6 +80,7 @@ import android.view.WindowManager;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
import com.android.internal.colorextraction.ColorExtractor; import com.android.internal.colorextraction.ColorExtractor;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.IStatusBarService;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.biometrics.AuthController; import com.android.systemui.biometrics.AuthController;
@@ -343,7 +344,8 @@ public class BubblesTest extends SysuiTestCase {
mock(NotificationInterruptLogger.class), mock(NotificationInterruptLogger.class),
mock(Handler.class), mock(Handler.class),
mock(NotifPipelineFlags.class), mock(NotifPipelineFlags.class),
mock(KeyguardNotificationVisibilityProvider.class) mock(KeyguardNotificationVisibilityProvider.class),
mock(UiEventLogger.class)
); );
when(mShellTaskOrganizer.getExecutor()).thenReturn(syncExecutor); when(mShellTaskOrganizer.getExecutor()).thenReturn(syncExecutor);
mBubbleController = new TestableBubbleController( mBubbleController = new TestableBubbleController(

View File

@@ -22,6 +22,7 @@ import android.os.Handler;
import android.os.PowerManager; import android.os.PowerManager;
import android.service.dreams.IDreamManager; import android.service.dreams.IDreamManager;
import com.android.internal.logging.UiEventLogger;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.notification.NotifPipelineFlags; import com.android.systemui.statusbar.notification.NotifPipelineFlags;
import com.android.systemui.statusbar.notification.interruption.KeyguardNotificationVisibilityProvider; import com.android.systemui.statusbar.notification.interruption.KeyguardNotificationVisibilityProvider;
@@ -46,7 +47,8 @@ public class TestableNotificationInterruptStateProviderImpl
NotificationInterruptLogger logger, NotificationInterruptLogger logger,
Handler mainHandler, Handler mainHandler,
NotifPipelineFlags flags, NotifPipelineFlags flags,
KeyguardNotificationVisibilityProvider keyguardNotificationVisibilityProvider) { KeyguardNotificationVisibilityProvider keyguardNotificationVisibilityProvider,
UiEventLogger uiEventLogger) {
super(contentResolver, super(contentResolver,
powerManager, powerManager,
dreamManager, dreamManager,
@@ -58,7 +60,8 @@ public class TestableNotificationInterruptStateProviderImpl
logger, logger,
mainHandler, mainHandler,
flags, flags,
keyguardNotificationVisibilityProvider); keyguardNotificationVisibilityProvider,
uiEventLogger);
mUseHeadsUp = true; mUseHeadsUp = true;
} }
} }