Merge "Add listeners for the creation and destruction of virtual displays. This will be used later by VibrationSettings to keep record of active virtual displays." into tm-qpr-dev am: 81b40baea8
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19477752 Change-Id: I66fa50d09760d2308315ea27f35b37812d07ec02 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -56,6 +56,7 @@ import com.android.server.wm.ActivityTaskManagerInternal;
|
|||||||
|
|
||||||
import java.io.FileDescriptor;
|
import java.io.FileDescriptor;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
@@ -208,6 +209,10 @@ public class VirtualDeviceManagerService extends SystemService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
|
VirtualDeviceManagerInternal getLocalServiceInstance() {
|
||||||
|
return mLocalService;
|
||||||
|
}
|
||||||
|
|
||||||
class VirtualDeviceManagerImpl extends IVirtualDeviceManager.Stub implements
|
class VirtualDeviceManagerImpl extends IVirtualDeviceManager.Stub implements
|
||||||
VirtualDeviceImpl.PendingTrampolineCallback {
|
VirtualDeviceImpl.PendingTrampolineCallback {
|
||||||
|
|
||||||
@@ -308,10 +313,11 @@ public class VirtualDeviceManagerService extends SystemService {
|
|||||||
final long tokenTwo = Binder.clearCallingIdentity();
|
final long tokenTwo = Binder.clearCallingIdentity();
|
||||||
try {
|
try {
|
||||||
virtualDeviceImpl.onVirtualDisplayCreatedLocked(gwpc, displayId);
|
virtualDeviceImpl.onVirtualDisplayCreatedLocked(gwpc, displayId);
|
||||||
return displayId;
|
|
||||||
} finally {
|
} finally {
|
||||||
Binder.restoreCallingIdentity(tokenTwo);
|
Binder.restoreCallingIdentity(tokenTwo);
|
||||||
}
|
}
|
||||||
|
mLocalService.onVirtualDisplayCreated(displayId);
|
||||||
|
return displayId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -378,6 +384,10 @@ public class VirtualDeviceManagerService extends SystemService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private final class LocalService extends VirtualDeviceManagerInternal {
|
private final class LocalService extends VirtualDeviceManagerInternal {
|
||||||
|
@GuardedBy("mVirtualDeviceManagerLock")
|
||||||
|
private final ArrayList<VirtualDeviceManagerInternal.VirtualDisplayListener>
|
||||||
|
mVirtualDisplayListeners = new ArrayList<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isValidVirtualDevice(IVirtualDevice virtualDevice) {
|
public boolean isValidVirtualDevice(IVirtualDevice virtualDevice) {
|
||||||
synchronized (mVirtualDeviceManagerLock) {
|
synchronized (mVirtualDeviceManagerLock) {
|
||||||
@@ -385,11 +395,31 @@ public class VirtualDeviceManagerService extends SystemService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onVirtualDisplayCreated(int displayId) {
|
||||||
|
final VirtualDisplayListener[] listeners;
|
||||||
|
synchronized (mVirtualDeviceManagerLock) {
|
||||||
|
listeners = mVirtualDisplayListeners.toArray(new VirtualDisplayListener[0]);
|
||||||
|
}
|
||||||
|
mHandler.post(() -> {
|
||||||
|
for (VirtualDisplayListener listener : listeners) {
|
||||||
|
listener.onVirtualDisplayCreated(displayId);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onVirtualDisplayRemoved(IVirtualDevice virtualDevice, int displayId) {
|
public void onVirtualDisplayRemoved(IVirtualDevice virtualDevice, int displayId) {
|
||||||
|
final VirtualDisplayListener[] listeners;
|
||||||
synchronized (mVirtualDeviceManagerLock) {
|
synchronized (mVirtualDeviceManagerLock) {
|
||||||
((VirtualDeviceImpl) virtualDevice).onVirtualDisplayRemovedLocked(displayId);
|
((VirtualDeviceImpl) virtualDevice).onVirtualDisplayRemovedLocked(displayId);
|
||||||
|
listeners = mVirtualDisplayListeners.toArray(new VirtualDisplayListener[0]);
|
||||||
}
|
}
|
||||||
|
mHandler.post(() -> {
|
||||||
|
for (VirtualDisplayListener listener : listeners) {
|
||||||
|
listener.onVirtualDisplayRemoved(displayId);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -435,6 +465,22 @@ public class VirtualDeviceManagerService extends SystemService {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void registerVirtualDisplayListener(
|
||||||
|
@NonNull VirtualDisplayListener listener) {
|
||||||
|
synchronized (mVirtualDeviceManagerLock) {
|
||||||
|
mVirtualDisplayListeners.add(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unregisterVirtualDisplayListener(
|
||||||
|
@NonNull VirtualDisplayListener listener) {
|
||||||
|
synchronized (mVirtualDeviceManagerLock) {
|
||||||
|
mVirtualDisplayListeners.remove(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class PendingTrampolineMap {
|
private static final class PendingTrampolineMap {
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.server.companion.virtual;
|
package com.android.server.companion.virtual;
|
||||||
|
|
||||||
|
import android.annotation.NonNull;
|
||||||
import android.companion.virtual.IVirtualDevice;
|
import android.companion.virtual.IVirtualDevice;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -24,16 +25,41 @@ import android.companion.virtual.IVirtualDevice;
|
|||||||
*/
|
*/
|
||||||
public abstract class VirtualDeviceManagerInternal {
|
public abstract class VirtualDeviceManagerInternal {
|
||||||
|
|
||||||
|
/** Interface to listen to the creation and destruction of virtual displays. */
|
||||||
|
public interface VirtualDisplayListener {
|
||||||
|
/** Notifies that a virtual display was created. */
|
||||||
|
void onVirtualDisplayCreated(int displayId);
|
||||||
|
|
||||||
|
/** Notifies that a virtual display was removed. */
|
||||||
|
void onVirtualDisplayRemoved(int displayId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Register a listener for the creation and destruction of virtual displays. */
|
||||||
|
public abstract void registerVirtualDisplayListener(
|
||||||
|
@NonNull VirtualDisplayListener listener);
|
||||||
|
|
||||||
|
/** Unregister a listener for the creation and destruction of virtual displays. */
|
||||||
|
public abstract void unregisterVirtualDisplayListener(
|
||||||
|
@NonNull VirtualDisplayListener listener);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Validate the virtual device.
|
* Validate the virtual device.
|
||||||
*/
|
*/
|
||||||
public abstract boolean isValidVirtualDevice(IVirtualDevice virtualDevice);
|
public abstract boolean isValidVirtualDevice(IVirtualDevice virtualDevice);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Notify a virtual display is removed.
|
* Notifies that a virtual display is created.
|
||||||
|
*
|
||||||
|
* @param displayId The display id of the created virtual display.
|
||||||
|
*/
|
||||||
|
public abstract void onVirtualDisplayCreated(int displayId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies that a virtual display is removed.
|
||||||
*
|
*
|
||||||
* @param virtualDevice The virtual device where the virtual display located.
|
* @param virtualDevice The virtual device where the virtual display located.
|
||||||
* @param displayId The display id of the removed virtual display.
|
* @param displayId The display id of the removed virtual display.
|
||||||
*/
|
*/
|
||||||
public abstract void onVirtualDisplayRemoved(IVirtualDevice virtualDevice, int displayId);
|
public abstract void onVirtualDisplayRemoved(IVirtualDevice virtualDevice, int displayId);
|
||||||
|
|
||||||
|
|||||||
@@ -124,6 +124,8 @@ public class VirtualDeviceManagerServiceTest {
|
|||||||
private VirtualDeviceImpl mDeviceImpl;
|
private VirtualDeviceImpl mDeviceImpl;
|
||||||
private InputController mInputController;
|
private InputController mInputController;
|
||||||
private AssociationInfo mAssociationInfo;
|
private AssociationInfo mAssociationInfo;
|
||||||
|
private VirtualDeviceManagerService mVdms;
|
||||||
|
private VirtualDeviceManagerInternal mLocalService;
|
||||||
@Mock
|
@Mock
|
||||||
private InputController.NativeWrapper mNativeWrapperMock;
|
private InputController.NativeWrapper mNativeWrapperMock;
|
||||||
@Mock
|
@Mock
|
||||||
@@ -139,6 +141,8 @@ public class VirtualDeviceManagerServiceTest {
|
|||||||
@Mock
|
@Mock
|
||||||
private Consumer<ArraySet<Integer>> mRunningAppsChangedCallback;
|
private Consumer<ArraySet<Integer>> mRunningAppsChangedCallback;
|
||||||
@Mock
|
@Mock
|
||||||
|
private VirtualDeviceManagerInternal.VirtualDisplayListener mDisplayListener;
|
||||||
|
@Mock
|
||||||
IPowerManager mIPowerManagerMock;
|
IPowerManager mIPowerManagerMock;
|
||||||
@Mock
|
@Mock
|
||||||
IThermalService mIThermalServiceMock;
|
IThermalService mIThermalServiceMock;
|
||||||
@@ -215,6 +219,9 @@ public class VirtualDeviceManagerServiceTest {
|
|||||||
mAssociationInfo = new AssociationInfo(1, 0, null,
|
mAssociationInfo = new AssociationInfo(1, 0, null,
|
||||||
MacAddress.BROADCAST_ADDRESS, "", null, true, false, false, 0, 0);
|
MacAddress.BROADCAST_ADDRESS, "", null, true, false, false, 0, 0);
|
||||||
|
|
||||||
|
mVdms = new VirtualDeviceManagerService(mContext);
|
||||||
|
mLocalService = mVdms.getLocalServiceInstance();
|
||||||
|
|
||||||
VirtualDeviceParams params = new VirtualDeviceParams
|
VirtualDeviceParams params = new VirtualDeviceParams
|
||||||
.Builder()
|
.Builder()
|
||||||
.setBlockedActivities(getBlockedActivities())
|
.setBlockedActivities(getBlockedActivities())
|
||||||
@@ -234,6 +241,28 @@ public class VirtualDeviceManagerServiceTest {
|
|||||||
mDeviceImpl.onVirtualDisplayRemovedLocked(DISPLAY_ID);
|
mDeviceImpl.onVirtualDisplayRemovedLocked(DISPLAY_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onVirtualDisplayCreatedLocked_listenersNotified() throws RemoteException {
|
||||||
|
mLocalService.registerVirtualDisplayListener(mDisplayListener);
|
||||||
|
|
||||||
|
mLocalService.onVirtualDisplayCreated(DISPLAY_ID);
|
||||||
|
TestableLooper.get(this).processAllMessages();
|
||||||
|
|
||||||
|
verify(mDisplayListener).onVirtualDisplayCreated(DISPLAY_ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onVirtualDisplayRemovedLocked_listenersNotified() throws RemoteException {
|
||||||
|
mLocalService.registerVirtualDisplayListener(mDisplayListener);
|
||||||
|
mDeviceImpl.onVirtualDisplayCreatedLocked(
|
||||||
|
mDeviceImpl.createWindowPolicyController(), DISPLAY_ID);
|
||||||
|
|
||||||
|
mLocalService.onVirtualDisplayRemoved(mDeviceImpl, DISPLAY_ID);
|
||||||
|
TestableLooper.get(this).processAllMessages();
|
||||||
|
|
||||||
|
verify(mDisplayListener).onVirtualDisplayRemoved(DISPLAY_ID);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onVirtualDisplayCreatedLocked_wakeLockIsAcquired() throws RemoteException {
|
public void onVirtualDisplayCreatedLocked_wakeLockIsAcquired() throws RemoteException {
|
||||||
verify(mIPowerManagerMock, never()).acquireWakeLock(any(Binder.class), anyInt(),
|
verify(mIPowerManagerMock, never()).acquireWakeLock(any(Binder.class), anyInt(),
|
||||||
|
|||||||
Reference in New Issue
Block a user