diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/MediaProjectionMetricsLogger.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/MediaProjectionMetricsLogger.kt index a53f0f11c38047741c10af8767c608c59a257376..ce8b79cd9e38882adc0a494a5e1e66cd66313cf1 100644 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/MediaProjectionMetricsLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/MediaProjectionMetricsLogger.kt @@ -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 @@ -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. * diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java b/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java index fa418fc8b98b47db4c37d3351d2d5a16f8b60678..2d830d3115625152d1cf832c2f17172e7ba3bd92 100644 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/permission/MediaProjectionPermissionActivity.java @@ -249,6 +249,10 @@ public class MediaProjectionPermissionActivity extends Activity setUpDialog(mDialog); mDialog.show(); + + if (savedInstanceState == null) { + mMediaProjectionMetricsLogger.notifyPermissionRequestDisplayed(); + } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java index 959afd86ee8d9966bf4fd65f40c7aff1695b6ec2..e27a59c6fb21e8300f6815a2a1ad866e5361eaa9 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ScreenRecordTile.java @@ -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; @@ -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; @@ -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; @@ -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); @@ -99,6 +102,7 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> mKeyguardStateController = keyguardStateController; mDialogLaunchAnimator = dialogLaunchAnimator; mPanelInteractor = panelInteractor; + mMediaProjectionMetricsLogger = mediaProjectionMetricsLogger; } @Override @@ -190,6 +194,9 @@ public class ScreenRecordTile extends QSTileImpl<QSTile.BooleanState> } else { dialog.show(); } + + mMediaProjectionMetricsLogger.notifyPermissionRequestDisplayed(); + return false; }; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java index 5b3d45bb6625ec4ddf030161c1d7451c55464d1c..ac03073be17badea38dfe202929324b73ed80a20 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tiles/ScreenRecordTileTest.java @@ -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; @@ -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; @@ -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; @@ -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; @@ -116,7 +123,8 @@ public class ScreenRecordTileTest extends SysuiTestCase { mKeyguardDismissUtil, mKeyguardStateController, mDialogLaunchAnimator, - mPanelInteractor + mPanelInteractor, + mMediaProjectionMetricsLogger ); mTile.initialize(); @@ -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(); + } + }