Loading packages/SystemUI/src/com/android/systemui/mediaprojection/MediaProjectionMetricsLogger.kt +5 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGE import com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__CREATION_SOURCE__CREATION_SOURCE_SYSTEM_UI_SCREEN_RECORDER as METRICS_CREATION_SOURCE_SYSTEM_UI_SCREEN_RECORDER import com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__CREATION_SOURCE__CREATION_SOURCE_UNKNOWN as METRICS_CREATION_SOURCE_UNKNOWN import com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_INITIATED import com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_PERMISSION_REQUEST_DISPLAYED as METRICS_STATE_PERMISSION_REQUEST_DISPLAYED import com.android.systemui.dagger.SysUISingleton import javax.inject.Inject Loading @@ -47,6 +48,10 @@ constructor(private val service: IMediaProjectionManager) { ) } fun notifyPermissionRequestDisplayed() { notifyToServer(METRICS_STATE_PERMISSION_REQUEST_DISPLAYED, SessionCreationSource.UNKNOWN) } /** * Request to log that the permission request moved to the given state. * Loading packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java +4 −0 Original line number Diff line number Diff line Loading @@ -249,6 +249,10 @@ public class MediaProjectionPermissionActivity extends Activity setUpDialog(mDialog); mDialog.show(); if (savedInstanceState == null) { mMediaProjectionMetricsLogger.notifyPermissionRequestDisplayed(); } } @Override Loading packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java +9 −2 Original line number Diff line number Diff line Loading @@ -30,12 +30,12 @@ import androidx.annotation.Nullable; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.MetricsLogger; import com.android.systemui.res.R; import com.android.systemui.animation.DialogCuj; import com.android.systemui.animation.DialogLaunchAnimator; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.QSTile; Loading @@ -45,6 +45,7 @@ import com.android.systemui.qs.QsEventLogger; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.res.R; import com.android.systemui.screenrecord.RecordingController; import com.android.systemui.statusbar.phone.KeyguardDismissUtil; import com.android.systemui.statusbar.policy.KeyguardStateController; Loading @@ -69,6 +70,7 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> private final DialogLaunchAnimator mDialogLaunchAnimator; private final FeatureFlags mFlags; private final PanelInteractor mPanelInteractor; private final MediaProjectionMetricsLogger mMediaProjectionMetricsLogger; private long mMillisUntilFinished = 0; Loading @@ -88,7 +90,8 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> KeyguardDismissUtil keyguardDismissUtil, KeyguardStateController keyguardStateController, DialogLaunchAnimator dialogLaunchAnimator, PanelInteractor panelInteractor PanelInteractor panelInteractor, MediaProjectionMetricsLogger mediaProjectionMetricsLogger ) { super(host, uiEventLogger, backgroundLooper, mainHandler, falsingManager, metricsLogger, statusBarStateController, activityStarter, qsLogger); Loading @@ -99,6 +102,7 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> mKeyguardStateController = keyguardStateController; mDialogLaunchAnimator = dialogLaunchAnimator; mPanelInteractor = panelInteractor; mMediaProjectionMetricsLogger = mediaProjectionMetricsLogger; } @Override Loading Loading @@ -190,6 +194,9 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> } else { dialog.show(); } mMediaProjectionMetricsLogger.notifyPermissionRequestDisplayed(); return false; }; Loading packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java +33 −2 Original line number Diff line number Diff line Loading @@ -22,11 +22,13 @@ import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertFalse; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Dialog; import android.os.Handler; import android.service.quicksettings.Tile; import android.testing.AndroidTestingRunner; Loading @@ -35,11 +37,11 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; import com.android.internal.logging.MetricsLogger; import com.android.systemui.res.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.animation.DialogLaunchAnimator; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.statusbar.StatusBarStateController; Loading @@ -48,6 +50,7 @@ import com.android.systemui.qs.QsEventLogger; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.res.R; import com.android.systemui.screenrecord.RecordingController; import com.android.systemui.statusbar.phone.KeyguardDismissUtil; import com.android.systemui.statusbar.policy.KeyguardStateController; Loading Loading @@ -89,6 +92,10 @@ public class ScreenRecordTileTest extends SysuiTestCase { private PanelInteractor mPanelInteractor; @Mock private QsEventLogger mUiEventLogger; @Mock private MediaProjectionMetricsLogger mMediaProjectionMetricsLogger; @Mock private Dialog mPermissionDialogPrompt; private TestableLooper mTestableLooper; private ScreenRecordTile mTile; Loading Loading @@ -116,7 +123,8 @@ public class ScreenRecordTileTest extends SysuiTestCase { mKeyguardDismissUtil, mKeyguardStateController, mDialogLaunchAnimator, mPanelInteractor mPanelInteractor, mMediaProjectionMetricsLogger ); mTile.initialize(); Loading Loading @@ -280,4 +288,27 @@ public class ScreenRecordTileTest extends SysuiTestCase { assertEquals(state.icon, QSTileImpl.ResourceIcon.get(R.drawable.qs_screen_record_icon_off)); } @Test public void showingDialogPrompt_logsMediaProjectionPermissionRequested() { when(mController.isStarting()).thenReturn(false); when(mController.isRecording()).thenReturn(false); when(mController.createScreenRecordDialog(any(), any(), any(), any(), any())) .thenReturn(mPermissionDialogPrompt); mTile.handleClick(null /* view */); mTestableLooper.processAllMessages(); verify(mController).createScreenRecordDialog(any(), eq(mFeatureFlags), eq(mDialogLaunchAnimator), eq(mActivityStarter), any()); var onDismissAction = ArgumentCaptor.forClass(ActivityStarter.OnDismissAction.class); verify(mKeyguardDismissUtil).executeWhenUnlocked( onDismissAction.capture(), anyBoolean(), anyBoolean()); assertNotNull(onDismissAction.getValue()); onDismissAction.getValue().onDismiss(); verify(mPermissionDialogPrompt).show(); verify(mMediaProjectionMetricsLogger).notifyPermissionRequestDisplayed(); } } Loading
packages/SystemUI/src/com/android/systemui/mediaprojection/MediaProjectionMetricsLogger.kt +5 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGE import com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__CREATION_SOURCE__CREATION_SOURCE_SYSTEM_UI_SCREEN_RECORDER as METRICS_CREATION_SOURCE_SYSTEM_UI_SCREEN_RECORDER import com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__CREATION_SOURCE__CREATION_SOURCE_UNKNOWN as METRICS_CREATION_SOURCE_UNKNOWN import com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_INITIATED import com.android.internal.util.FrameworkStatsLog.MEDIA_PROJECTION_STATE_CHANGED__STATE__MEDIA_PROJECTION_STATE_PERMISSION_REQUEST_DISPLAYED as METRICS_STATE_PERMISSION_REQUEST_DISPLAYED import com.android.systemui.dagger.SysUISingleton import javax.inject.Inject Loading @@ -47,6 +48,10 @@ constructor(private val service: IMediaProjectionManager) { ) } fun notifyPermissionRequestDisplayed() { notifyToServer(METRICS_STATE_PERMISSION_REQUEST_DISPLAYED, SessionCreationSource.UNKNOWN) } /** * Request to log that the permission request moved to the given state. * Loading
packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java +4 −0 Original line number Diff line number Diff line Loading @@ -249,6 +249,10 @@ public class MediaProjectionPermissionActivity extends Activity setUpDialog(mDialog); mDialog.show(); if (savedInstanceState == null) { mMediaProjectionMetricsLogger.notifyPermissionRequestDisplayed(); } } @Override Loading
packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java +9 −2 Original line number Diff line number Diff line Loading @@ -30,12 +30,12 @@ import androidx.annotation.Nullable; import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.logging.MetricsLogger; import com.android.systemui.res.R; import com.android.systemui.animation.DialogCuj; import com.android.systemui.animation.DialogLaunchAnimator; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.QSTile; Loading @@ -45,6 +45,7 @@ import com.android.systemui.qs.QsEventLogger; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.res.R; import com.android.systemui.screenrecord.RecordingController; import com.android.systemui.statusbar.phone.KeyguardDismissUtil; import com.android.systemui.statusbar.policy.KeyguardStateController; Loading @@ -69,6 +70,7 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> private final DialogLaunchAnimator mDialogLaunchAnimator; private final FeatureFlags mFlags; private final PanelInteractor mPanelInteractor; private final MediaProjectionMetricsLogger mMediaProjectionMetricsLogger; private long mMillisUntilFinished = 0; Loading @@ -88,7 +90,8 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> KeyguardDismissUtil keyguardDismissUtil, KeyguardStateController keyguardStateController, DialogLaunchAnimator dialogLaunchAnimator, PanelInteractor panelInteractor PanelInteractor panelInteractor, MediaProjectionMetricsLogger mediaProjectionMetricsLogger ) { super(host, uiEventLogger, backgroundLooper, mainHandler, falsingManager, metricsLogger, statusBarStateController, activityStarter, qsLogger); Loading @@ -99,6 +102,7 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> mKeyguardStateController = keyguardStateController; mDialogLaunchAnimator = dialogLaunchAnimator; mPanelInteractor = panelInteractor; mMediaProjectionMetricsLogger = mediaProjectionMetricsLogger; } @Override Loading Loading @@ -190,6 +194,9 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> } else { dialog.show(); } mMediaProjectionMetricsLogger.notifyPermissionRequestDisplayed(); return false; }; Loading
packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java +33 −2 Original line number Diff line number Diff line Loading @@ -22,11 +22,13 @@ import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertFalse; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Dialog; import android.os.Handler; import android.service.quicksettings.Tile; import android.testing.AndroidTestingRunner; Loading @@ -35,11 +37,11 @@ import android.testing.TestableLooper; import androidx.test.filters.SmallTest; import com.android.internal.logging.MetricsLogger; import com.android.systemui.res.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.animation.DialogLaunchAnimator; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.mediaprojection.MediaProjectionMetricsLogger; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.statusbar.StatusBarStateController; Loading @@ -48,6 +50,7 @@ import com.android.systemui.qs.QsEventLogger; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.res.R; import com.android.systemui.screenrecord.RecordingController; import com.android.systemui.statusbar.phone.KeyguardDismissUtil; import com.android.systemui.statusbar.policy.KeyguardStateController; Loading Loading @@ -89,6 +92,10 @@ public class ScreenRecordTileTest extends SysuiTestCase { private PanelInteractor mPanelInteractor; @Mock private QsEventLogger mUiEventLogger; @Mock private MediaProjectionMetricsLogger mMediaProjectionMetricsLogger; @Mock private Dialog mPermissionDialogPrompt; private TestableLooper mTestableLooper; private ScreenRecordTile mTile; Loading Loading @@ -116,7 +123,8 @@ public class ScreenRecordTileTest extends SysuiTestCase { mKeyguardDismissUtil, mKeyguardStateController, mDialogLaunchAnimator, mPanelInteractor mPanelInteractor, mMediaProjectionMetricsLogger ); mTile.initialize(); Loading Loading @@ -280,4 +288,27 @@ public class ScreenRecordTileTest extends SysuiTestCase { assertEquals(state.icon, QSTileImpl.ResourceIcon.get(R.drawable.qs_screen_record_icon_off)); } @Test public void showingDialogPrompt_logsMediaProjectionPermissionRequested() { when(mController.isStarting()).thenReturn(false); when(mController.isRecording()).thenReturn(false); when(mController.createScreenRecordDialog(any(), any(), any(), any(), any())) .thenReturn(mPermissionDialogPrompt); mTile.handleClick(null /* view */); mTestableLooper.processAllMessages(); verify(mController).createScreenRecordDialog(any(), eq(mFeatureFlags), eq(mDialogLaunchAnimator), eq(mActivityStarter), any()); var onDismissAction = ArgumentCaptor.forClass(ActivityStarter.OnDismissAction.class); verify(mKeyguardDismissUtil).executeWhenUnlocked( onDismissAction.capture(), anyBoolean(), anyBoolean()); assertNotNull(onDismissAction.getValue()); onDismissAction.getValue().onDismiss(); verify(mPermissionDialogPrompt).show(); verify(mMediaProjectionMetricsLogger).notifyPermissionRequestDisplayed(); } }