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

Commit 09e2a7f9 authored by Zixuan Qu's avatar Zixuan Qu Committed by Automerger Merge Worker
Browse files

Merge "Add listeners for the creation and destruction of virtual displays....

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: 81b40bae

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19477752



Change-Id: I66fa50d09760d2308315ea27f35b37812d07ec02
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents cfdb4292 81b40bae
Loading
Loading
Loading
Loading
+47 −1
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ import com.android.server.wm.ActivityTaskManagerInternal;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;

@@ -208,6 +209,10 @@ public class VirtualDeviceManagerService extends SystemService {
    }

    @VisibleForTesting
    VirtualDeviceManagerInternal getLocalServiceInstance() {
        return mLocalService;
    }

    class VirtualDeviceManagerImpl extends IVirtualDeviceManager.Stub implements
            VirtualDeviceImpl.PendingTrampolineCallback {

@@ -308,10 +313,11 @@ public class VirtualDeviceManagerService extends SystemService {
            final long tokenTwo = Binder.clearCallingIdentity();
            try {
                virtualDeviceImpl.onVirtualDisplayCreatedLocked(gwpc, displayId);
                return displayId;
            } finally {
                Binder.restoreCallingIdentity(tokenTwo);
            }
            mLocalService.onVirtualDisplayCreated(displayId);
            return displayId;
        }

        @Nullable
@@ -378,6 +384,10 @@ public class VirtualDeviceManagerService extends SystemService {
    }

    private final class LocalService extends VirtualDeviceManagerInternal {
        @GuardedBy("mVirtualDeviceManagerLock")
        private final ArrayList<VirtualDeviceManagerInternal.VirtualDisplayListener>
                mVirtualDisplayListeners = new ArrayList<>();

        @Override
        public boolean isValidVirtualDevice(IVirtualDevice virtualDevice) {
            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
        public void onVirtualDisplayRemoved(IVirtualDevice virtualDevice, int displayId) {
            final VirtualDisplayListener[] listeners;
            synchronized (mVirtualDeviceManagerLock) {
                ((VirtualDeviceImpl) virtualDevice).onVirtualDisplayRemovedLocked(displayId);
                listeners = mVirtualDisplayListeners.toArray(new VirtualDisplayListener[0]);
            }
            mHandler.post(() -> {
                for (VirtualDisplayListener listener : listeners) {
                    listener.onVirtualDisplayRemoved(displayId);
                }
            });
        }

        @Override
@@ -435,6 +465,22 @@ public class VirtualDeviceManagerService extends SystemService {
            }
            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 {
+28 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server.companion.virtual;

import android.annotation.NonNull;
import android.companion.virtual.IVirtualDevice;

/**
@@ -24,13 +25,38 @@ import android.companion.virtual.IVirtualDevice;
 */
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.
     */
    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 displayId     The display id of the removed virtual display.
+29 −0
Original line number Diff line number Diff line
@@ -124,6 +124,8 @@ public class VirtualDeviceManagerServiceTest {
    private VirtualDeviceImpl mDeviceImpl;
    private InputController mInputController;
    private AssociationInfo mAssociationInfo;
    private VirtualDeviceManagerService mVdms;
    private VirtualDeviceManagerInternal mLocalService;
    @Mock
    private InputController.NativeWrapper mNativeWrapperMock;
    @Mock
@@ -139,6 +141,8 @@ public class VirtualDeviceManagerServiceTest {
    @Mock
    private Consumer<ArraySet<Integer>> mRunningAppsChangedCallback;
    @Mock
    private VirtualDeviceManagerInternal.VirtualDisplayListener mDisplayListener;
    @Mock
    IPowerManager mIPowerManagerMock;
    @Mock
    IThermalService mIThermalServiceMock;
@@ -215,6 +219,9 @@ public class VirtualDeviceManagerServiceTest {
        mAssociationInfo = new AssociationInfo(1, 0, null,
                MacAddress.BROADCAST_ADDRESS, "", null, true, false, false, 0, 0);

        mVdms = new VirtualDeviceManagerService(mContext);
        mLocalService = mVdms.getLocalServiceInstance();

        VirtualDeviceParams params = new VirtualDeviceParams
                .Builder()
                .setBlockedActivities(getBlockedActivities())
@@ -234,6 +241,28 @@ public class VirtualDeviceManagerServiceTest {
        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
    public void onVirtualDisplayCreatedLocked_wakeLockIsAcquired() throws RemoteException {
        verify(mIPowerManagerMock, never()).acquireWakeLock(any(Binder.class), anyInt(),