Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e74f5ad4 authored by Miranda Kephart's avatar Miranda Kephart
Browse files

Show clipboard overlay on correct display

Sets the launch display id on the intents sent from clipboard to ensure
that they're launched on the right display (the same one as where the UI
appears/where the content was copied from) and gives the toast
controller (used if e.g. setup is incomplete) the context to show on the
correct display.

Also adds mLaunchDisplayId to the set of values that gets copied over in
ActivityOptions.update(otherOptions: ActivityOptions).

Bug: 425706893
Test: atest ClipboardOverlayController
Test: manual using virtual displays
Flag: com.android.systemui.clipboard_overlay_multiuser

Change-Id: I09027317550ec0bc2cb14e6e20d8ebdec2d0eb86
parent 940d70b4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2505,6 +2505,7 @@ public class ActivityOptions extends ComponentOptions {
        mSpecsFuture = otherOptions.mSpecsFuture;
        mRemoteAnimationAdapter = otherOptions.mRemoteAnimationAdapter;
        mLaunchIntoPipParams = otherOptions.mLaunchIntoPipParams;
        mLaunchDisplayId = otherOptions.mLaunchDisplayId;
        mIsEligibleForLegacyPermissionPrompt = otherOptions.mIsEligibleForLegacyPermissionPrompt;

        sendResultIgnoreErrors(mAnimationAbortListener, null);
+46 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar.phone

import android.app.ActivityOptions
import android.app.IActivityTaskManager
import android.app.PendingIntent
import android.content.Intent
import android.os.Bundle
@@ -25,6 +26,7 @@ import android.os.RemoteException
import android.os.UserHandle
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.view.RemoteAnimationAdapter
import android.view.View
import android.widget.FrameLayout
import android.window.SplashScreen.SPLASH_SCREEN_STYLE_SOLID_COLOR
@@ -44,6 +46,7 @@ import com.android.systemui.keyguard.KeyguardViewMediator
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.kosmos.testScope
import com.android.systemui.model.SysUiState
import com.android.systemui.plugins.ActivityStartOptions
import com.android.systemui.plugins.ActivityStarter.OnDismissAction
import com.android.systemui.settings.UserTracker
import com.android.systemui.shade.ShadeController
@@ -107,12 +110,14 @@ class LegacyActivityStarterInternalImplTest : SysuiTestCase() {
    @Mock private lateinit var statusBarStateController: SysuiStatusBarStateController
    @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
    @Mock private lateinit var deviceProvisionedController: DeviceProvisionedController
    @Mock private lateinit var activityTaskManager: IActivityTaskManager
    @Mock private lateinit var userTracker: UserTracker
    @Mock private lateinit var activityIntentHelper: ActivityIntentHelper
    @Mock private lateinit var communalSceneInteractor: CommunalSceneInteractor
    @Mock private lateinit var communalSettingsInteractor: CommunalSettingsInteractor
    @Mock private lateinit var perDisplaySysUiStateRepository: PerDisplayRepository<SysUiState>
    @Mock private lateinit var sysUIState: SysUiState
    @Mock private lateinit var remoteAnimationAdapter: RemoteAnimationAdapter
    private lateinit var underTest: LegacyActivityStarterInternalImpl
    private val kosmos = testKosmos()
    private val mainExecutor = FakeExecutor(FakeSystemClock())
@@ -147,6 +152,7 @@ class LegacyActivityStarterInternalImplTest : SysuiTestCase() {
                deviceProvisionedController = deviceProvisionedController,
                userTracker = userTracker,
                activityIntentHelper = activityIntentHelper,
                activityTaskManager = activityTaskManager,
                mainExecutor = mainExecutor,
                applicationScope = kosmos.testScope,
                communalSceneInteractor = communalSceneInteractor,
@@ -259,6 +265,46 @@ class LegacyActivityStarterInternalImplTest : SysuiTestCase() {
            .startIntentWithAnimation(eq(null), eq(false), eq(null), eq(false), any())
    }

    @Test
    fun startActivityDismissingKeyguard_includesDisplayLaunchId() {
        val intent = mock(Intent::class.java)
        val activityOptions = ActivityOptions.makeBasic().apply { launchDisplayId = 17 }

        underTest.startActivityDismissingKeyguard(
            ActivityStartOptions(intent, activityOptions = activityOptions)
        )
        mainExecutor.runAllReady()

        val intentStarterCaptor = argumentCaptor<(RemoteAnimationAdapter?) -> Int>()
        verify(activityTransitionAnimator)
            .startIntentWithAnimation(
                eq(null),
                eq(false),
                eq(null),
                eq(false),
                intentStarterCaptor.capture(),
            )
        intentStarterCaptor.lastValue(remoteAnimationAdapter)
        val activityOptionsCaptor = argumentCaptor<Bundle>()
        verify(activityTaskManager)
            .startActivityAsUser(
                eq(null),
                any(),
                eq(null),
                eq(intent),
                eq(null),
                eq(null),
                eq(null),
                any(),
                any(),
                eq(null),
                activityOptionsCaptor.capture(),
                any(),
            )
        val calledActivityOptions = ActivityOptions.fromBundle(activityOptionsCaptor.lastValue)
        assertThat(calledActivityOptions.launchDisplayId).isEqualTo(17)
    }

    @Test
    fun startPendingIntentDismissingKeyguard_keyguardShowing_dismissWithAction() {
        val pendingIntent = mock(PendingIntent::class.java)
+4 −1
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import static com.android.systemui.clipboardoverlay.ClipboardOverlayEvent.CLIPBO

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.app.ActivityOptions;
import android.app.RemoteAction;
import android.content.BroadcastReceiver;
import android.content.ClipData;
@@ -488,7 +489,9 @@ public class ClipboardOverlayController implements ClipboardListener.ClipboardOv
                            mActivityStarter.startActivityDismissingKeyguard(
                                    new ActivityStartOptions(intent, false, false, null,
                                            intent.getFlags(), null, null, false,
                                            mUserTracker.getUserHandle(), null));
                                            mUserTracker.getUserHandle(),
                                            ActivityOptions.makeBasic()
                                                    .setLaunchDisplayId(mContext.getDisplayId())));
                        } else {
                            mContext.startActivity(intent);
                        }
+2 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.clipboardoverlay;
import android.content.Context;
import android.widget.Toast;

import com.android.systemui.clipboardoverlay.dagger.ClipboardOverlayModule;
import com.android.systemui.res.R;

import javax.inject.Inject;
@@ -31,7 +32,7 @@ class ClipboardToast extends Toast.Callback {
    private Toast mCopiedToast;

    @Inject
    ClipboardToast(Context context) {
    ClipboardToast(@ClipboardOverlayModule.OverlayWindowContext Context context) {
        mContext = context;
    }

+1 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ constructor(
            )
        transition.second.startExit()
        if (clipboardOverlayMultiuser()) {
            transition.first.launchDisplayId = window.context.displayId
            activityStarter.startActivityDismissingKeyguard(
                ActivityStartOptions(
                    intent,
Loading