diff --git a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt index 779f1d8011e31..e74d78d2b5d98 100644 --- a/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt +++ b/packages/SystemUI/src/com/android/systemui/notetask/NoteTaskController.kt @@ -27,6 +27,7 @@ import android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.content.pm.PackageManager import android.os.Build +import android.os.UserHandle import android.os.UserManager import android.util.Log import androidx.annotation.VisibleForTesting @@ -99,6 +100,14 @@ constructor( */ fun showNoteTask( entryPoint: NoteTaskEntryPoint, + ) { + showNoteTaskAsUser(entryPoint, userTracker.userHandle) + } + + /** A variant of [showNoteTask] which launches note task in the given [user]. */ + fun showNoteTaskAsUser( + entryPoint: NoteTaskEntryPoint, + user: UserHandle, ) { if (!isEnabled) return @@ -113,7 +122,7 @@ constructor( // note task when the screen is locked. if ( isKeyguardLocked && - devicePolicyManager.areKeyguardShortcutsDisabled(userId = userTracker.userId) + devicePolicyManager.areKeyguardShortcutsDisabled(userId = user.identifier) ) { logDebug { "Enterprise policy disallows launching note app when the screen is locked." } return @@ -126,7 +135,7 @@ constructor( // TODO(b/266686199): We should handle when app not available. For now, we log. val intent = createNoteIntent(info) try { - logDebug { "onShowNoteTask - start: $info" } + logDebug { "onShowNoteTask - start: $info on user#${user.identifier}" } when (info.launchMode) { is NoteTaskLaunchMode.AppBubble -> { bubbles.showOrHideAppBubble(intent, userTracker.userHandle) @@ -134,7 +143,7 @@ constructor( logDebug { "onShowNoteTask - opened as app bubble: $info" } } is NoteTaskLaunchMode.Activity -> { - context.startActivityAsUser(intent, userTracker.userHandle) + context.startActivityAsUser(intent, user) eventLogger.logNoteTaskOpened(info) logDebug { "onShowNoteTask - opened as activity: $info" } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt index 40c733a19ccd6..0a8cd269139fb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/notetask/NoteTaskControllerTest.kt @@ -215,6 +215,41 @@ internal class NoteTaskControllerTest : SysuiTestCase() { verifyZeroInteractions(bubbles) } + @Test + fun showNoteTaskWithUser_keyguardIsLocked_shouldStartActivityWithExpectedUserAndLogUiEvent() { + val user10 = UserHandle.of(/* userId= */ 10) + val expectedInfo = + noteTaskInfo.copy( + entryPoint = NoteTaskEntryPoint.TAIL_BUTTON, + isKeyguardLocked = true, + ) + whenever(keyguardManager.isKeyguardLocked).thenReturn(expectedInfo.isKeyguardLocked) + whenever(resolver.resolveInfo(any(), any())).thenReturn(expectedInfo) + + createNoteTaskController() + .showNoteTaskAsUser( + entryPoint = expectedInfo.entryPoint!!, + user = user10, + ) + + val intentCaptor = argumentCaptor() + val userCaptor = argumentCaptor() + verify(context).startActivityAsUser(capture(intentCaptor), capture(userCaptor)) + intentCaptor.value.let { intent -> + assertThat(intent.action).isEqualTo(Intent.ACTION_CREATE_NOTE) + assertThat(intent.`package`).isEqualTo(NOTES_PACKAGE_NAME) + assertThat(intent.flags and FLAG_ACTIVITY_NEW_TASK).isEqualTo(FLAG_ACTIVITY_NEW_TASK) + assertThat(intent.flags and FLAG_ACTIVITY_MULTIPLE_TASK) + .isEqualTo(FLAG_ACTIVITY_MULTIPLE_TASK) + assertThat(intent.flags and FLAG_ACTIVITY_NEW_DOCUMENT) + .isEqualTo(FLAG_ACTIVITY_NEW_DOCUMENT) + assertThat(intent.getBooleanExtra(Intent.EXTRA_USE_STYLUS_MODE, false)).isTrue() + } + assertThat(userCaptor.value).isEqualTo(user10) + verify(eventLogger).logNoteTaskOpened(expectedInfo) + verifyZeroInteractions(bubbles) + } + @Test fun showNoteTask_keyguardIsUnlocked_shouldStartBubblesWithoutLoggingUiEvent() { val expectedInfo =