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

Commit 6d030047 authored by Vladimir Komsiyski's avatar Vladimir Komsiyski
Browse files

Get the user's main display instead of hardcoding DEFAULT_DISPLAY

Bug: 440005498
Test: presubmit
Flag: android.companion.virtualdevice.flags.computer_control_access

Change-Id: Ie545263ad9a4918ba7a57a1e5e5f267998033e5b
parent e95de5ae
Loading
Loading
Loading
Loading
+10 −3
Original line number Diff line number Diff line
@@ -135,6 +135,7 @@ final class ComputerControlSessionImpl extends IComputerControlSession.Stub
    private final OnClosedListener mOnClosedListener;
    private final IVirtualDevice mVirtualDevice;
    private final int mVirtualDisplayId;
    private final int mMainDisplayId;
    private final IVirtualDisplayCallback mVirtualDisplayToken;
    private final IVirtualInputDevice mVirtualTouchscreen;
    private final IVirtualInputDevice mVirtualDpad;
@@ -163,6 +164,9 @@ final class ComputerControlSessionImpl extends IComputerControlSession.Stub
        mOwnerPackageName = attributionSource.getPackageName();
        mOnClosedListener = onClosedListener;
        mInjector = injector;
        // TODO(b/440005498): Consider using the display from the app's context instead.
        mMainDisplayId = injector.getMainDisplayIdForUser(
                UserHandle.getUserId(attributionSource.getUid()));

        final VirtualDeviceParams virtualDeviceParams = new VirtualDeviceParams.Builder()
                .setName(mParams.getName())
@@ -189,8 +193,7 @@ final class ComputerControlSessionImpl extends IComputerControlSession.Stub
        final VirtualDisplayConfig virtualDisplayConfig;
        if (params.getDisplaySurface() == null) {
            displayFlags |= DisplayManager.VIRTUAL_DISPLAY_FLAG_ALWAYS_UNLOCKED;
            final DisplayInfo defaultDisplayInfo =
                    mInjector.getDisplayInfo(Display.DEFAULT_DISPLAY);
            final DisplayInfo defaultDisplayInfo = mInjector.getDisplayInfo(mMainDisplayId);
            mDisplayWidth = defaultDisplayInfo.logicalWidth;
            mDisplayHeight = defaultDisplayInfo.logicalHeight;
            virtualDisplayConfig = new VirtualDisplayConfig.Builder(
@@ -325,7 +328,7 @@ final class ComputerControlSessionImpl extends IComputerControlSession.Stub
            throw new IllegalArgumentException(
                    "Package " + packageName + " is not allowed to be launched in this session.");
        }
        final UserHandle user = UserHandle.of(UserHandle.getUserId(Binder.getCallingUid()));
        final UserHandle user = Binder.getCallingUserHandle();
        Binder.withCleanCallingIdentity(() -> mInjector.launchApplicationOnDisplayAsUser(
                packageName, mVirtualDisplayId, user));
        notifyApplicationLaunchToStabilityCalculator();
@@ -741,6 +744,10 @@ final class ComputerControlSessionImpl extends IComputerControlSession.Stub
            return (long) (ViewConfiguration.getLongPressTimeout() * LONG_PRESS_TIMEOUT_MULTIPLIER);
        }

        public int getMainDisplayIdForUser(@UserIdInt int user) {
            return mUserManagerInternal.getMainDisplayAssignedToUser(user);
        }

        public IRemoteComputerControlInputConnection getInputConnection(int displayId) {
            // getUserAssignedToDisplay returns the main userId, if we want to support cross
            // profile CC interactions and typing on CC display, we need to find the right user
+6 −0
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;

import com.android.server.LocalServices;
import com.android.server.pm.UserManagerInternal;
import com.android.server.wm.WindowManagerInternal;

import org.junit.After;
@@ -87,6 +88,8 @@ public class ComputerControlSessionProcessorTest {
    @Mock
    private WindowManagerInternal mWindowManagerInternal;
    @Mock
    private UserManagerInternal mUserManagerInternal;
    @Mock
    private ComputerControlSessionProcessor.VirtualDeviceFactory mVirtualDeviceFactory;
    @Mock
    private ComputerControlSessionProcessor.PendingIntentFactory mPendingIntentFactory;
@@ -120,6 +123,9 @@ public class ComputerControlSessionProcessorTest {
        LocalServices.removeServiceForTest(WindowManagerInternal.class);
        LocalServices.addService(WindowManagerInternal.class, mWindowManagerInternal);

        LocalServices.removeServiceForTest(UserManagerInternal.class);
        LocalServices.addService(UserManagerInternal.class, mUserManagerInternal);

        mContext = spy(new ContextWrapper(
                InstrumentationRegistry.getInstrumentation().getTargetContext()));
        when(mContext.getSystemService(Context.KEYGUARD_SERVICE)).thenReturn(mKeyguardManager);
+5 −1
Original line number Diff line number Diff line
@@ -93,6 +93,7 @@ public class ComputerControlSessionTest {

    private static final String PERMISSION_CONTROLLER_PACKAGE = "permission.controller.package";

    private static final int MAIN_DISPLAY_ID = 41;
    private static final int VIRTUAL_DISPLAY_ID = 42;
    private static final int DISPLAY_WIDTH = 600;
    private static final int DISPLAY_HEIGHT = 1000;
@@ -147,11 +148,14 @@ public class ComputerControlSessionTest {
    public void setUp() throws Exception {
        mMockitoSession = MockitoAnnotations.openMocks(this);

        when(mInjector.getMainDisplayIdForUser(anyInt())).thenReturn(MAIN_DISPLAY_ID);

        DisplayInfo displayInfo = new DisplayInfo();
        displayInfo.logicalWidth = DISPLAY_WIDTH;
        displayInfo.logicalHeight = DISPLAY_HEIGHT;
        displayInfo.logicalDensityDpi = DISPLAY_DPI;
        when(mInjector.getDisplayInfo(anyInt())).thenReturn(displayInfo);
        when(mInjector.getDisplayInfo(MAIN_DISPLAY_ID)).thenReturn(displayInfo);
        when(mInjector.getDisplayInfo(VIRTUAL_DISPLAY_ID)).thenReturn(displayInfo);

        when(mInjector.getPermissionControllerPackageName())
                .thenReturn(PERMISSION_CONTROLLER_PACKAGE);