Loading services/companion/java/com/android/server/companion/virtual/computercontrol/ComputerControlSessionImpl.java +10 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()) Loading @@ -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( Loading Loading @@ -328,7 +331,7 @@ final class ComputerControlSessionImpl extends IComputerControlSession.Stub mVirtualDevice.addActivityPolicyExemption( new ActivityPolicyExemption.Builder().setPackageName(packageName).build()); } final UserHandle user = UserHandle.of(UserHandle.getUserId(Binder.getCallingUid())); final UserHandle user = Binder.getCallingUserHandle(); Binder.withCleanCallingIdentity(() -> mInjector.launchApplicationOnDisplayAsUser( packageName, mVirtualDisplayId, user)); notifyApplicationLaunchToStabilityCalculator(); Loading Loading @@ -744,6 +747,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 Loading services/tests/servicestests/src/com/android/server/companion/virtual/computercontrol/ComputerControlSessionProcessorTest.java +6 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading services/tests/servicestests/src/com/android/server/companion/virtual/computercontrol/ComputerControlSessionTest.java +5 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading
services/companion/java/com/android/server/companion/virtual/computercontrol/ComputerControlSessionImpl.java +10 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()) Loading @@ -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( Loading Loading @@ -328,7 +331,7 @@ final class ComputerControlSessionImpl extends IComputerControlSession.Stub mVirtualDevice.addActivityPolicyExemption( new ActivityPolicyExemption.Builder().setPackageName(packageName).build()); } final UserHandle user = UserHandle.of(UserHandle.getUserId(Binder.getCallingUid())); final UserHandle user = Binder.getCallingUserHandle(); Binder.withCleanCallingIdentity(() -> mInjector.launchApplicationOnDisplayAsUser( packageName, mVirtualDisplayId, user)); notifyApplicationLaunchToStabilityCalculator(); Loading Loading @@ -744,6 +747,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 Loading
services/tests/servicestests/src/com/android/server/companion/virtual/computercontrol/ComputerControlSessionProcessorTest.java +6 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading
services/tests/servicestests/src/com/android/server/companion/virtual/computercontrol/ComputerControlSessionTest.java +5 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading