Merge "Add UiEvents for blocked full-screen intents" into tm-qpr-dev am: 6bc1bb751f
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20245649 Change-Id: If41d68848ba2d52fbcf85495600096ba538ce58c Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user