Loading services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +26 −8 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import android.view.Display; import android.window.DisplayWindowPolicyController; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.BlockedAppStreamingActivity; import java.util.List; Loading Loading @@ -112,7 +113,9 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController final ArraySet<Integer> mRunningUids = new ArraySet<>(); @Nullable private final ActivityListener mActivityListener; private final Handler mHandler = new Handler(Looper.getMainLooper()); private final ArraySet<RunningAppsChangedListener> mRunningAppsChangedListener = @NonNull @GuardedBy("mGenericWindowPolicyControllerLock") private final ArraySet<RunningAppsChangedListener> mRunningAppsChangedListeners = new ArraySet<>(); @Nullable private final @AssociationRequest.DeviceProfile String mDeviceProfile; Loading Loading @@ -178,12 +181,16 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController /** Register a listener for running applications changes. */ public void registerRunningAppsChangedListener(@NonNull RunningAppsChangedListener listener) { mRunningAppsChangedListener.add(listener); synchronized (mGenericWindowPolicyControllerLock) { mRunningAppsChangedListeners.add(listener); } } /** Unregister a listener for running applications changes. */ public void unregisterRunningAppsChangedListener(@NonNull RunningAppsChangedListener listener) { mRunningAppsChangedListener.remove(listener); synchronized (mGenericWindowPolicyControllerLock) { mRunningAppsChangedListeners.remove(listener); } } @Override Loading Loading @@ -283,13 +290,17 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController // Post callback on the main thread so it doesn't block activity launching mHandler.post(() -> mActivityListener.onDisplayEmpty(mDisplayId)); } } if (!mRunningAppsChangedListeners.isEmpty()) { final ArraySet<RunningAppsChangedListener> listeners = new ArraySet<>(mRunningAppsChangedListeners); mHandler.post(() -> { for (RunningAppsChangedListener listener : mRunningAppsChangedListener) { for (RunningAppsChangedListener listener : listeners) { listener.onRunningAppsChanged(runningUids); } }); } } } @Override public boolean canShowTasksInRecents() { Loading Loading @@ -354,4 +365,11 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController } return true; } @VisibleForTesting int getRunningAppsChangedListenersSizeForTesting() { synchronized (mGenericWindowPolicyControllerLock) { return mRunningAppsChangedListeners.size(); } } } services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java +30 −0 Original line number Diff line number Diff line Loading @@ -891,4 +891,34 @@ public class VirtualDeviceManagerServiceTest { verify(mContext).startActivityAsUser(argThat(intent -> intent.filterEquals(blockedAppIntent)), any(), any()); } @Test public void registerRunningAppsChangedListener_onRunningAppsChanged_listenersNotified() { ArraySet<Integer> uids = new ArraySet<>(Arrays.asList(UID_1, UID_2)); mDeviceImpl.onVirtualDisplayCreatedLocked( mDeviceImpl.createWindowPolicyController(), DISPLAY_ID); GenericWindowPolicyController gwpc = mDeviceImpl.getWindowPolicyControllersForTesting().get( DISPLAY_ID); gwpc.onRunningAppsChanged(uids); mDeviceImpl.onRunningAppsChanged(uids); assertThat(gwpc.getRunningAppsChangedListenersSizeForTesting()).isEqualTo(1); verify(mRunningAppsChangedCallback).accept(new ArraySet<>(Arrays.asList(UID_1, UID_2))); } @Test public void noRunningAppsChangedListener_onRunningAppsChanged_doesNotThrowException() { ArraySet<Integer> uids = new ArraySet<>(Arrays.asList(UID_1, UID_2)); mDeviceImpl.onVirtualDisplayCreatedLocked( mDeviceImpl.createWindowPolicyController(), DISPLAY_ID); GenericWindowPolicyController gwpc = mDeviceImpl.getWindowPolicyControllersForTesting().get( DISPLAY_ID); mDeviceImpl.onVirtualDisplayRemovedLocked(DISPLAY_ID); // This call should not throw any exceptions. gwpc.onRunningAppsChanged(uids); assertThat(gwpc.getRunningAppsChangedListenersSizeForTesting()).isEqualTo(0); } } Loading
services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +26 −8 Original line number Diff line number Diff line Loading @@ -44,6 +44,7 @@ import android.view.Display; import android.window.DisplayWindowPolicyController; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.BlockedAppStreamingActivity; import java.util.List; Loading Loading @@ -112,7 +113,9 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController final ArraySet<Integer> mRunningUids = new ArraySet<>(); @Nullable private final ActivityListener mActivityListener; private final Handler mHandler = new Handler(Looper.getMainLooper()); private final ArraySet<RunningAppsChangedListener> mRunningAppsChangedListener = @NonNull @GuardedBy("mGenericWindowPolicyControllerLock") private final ArraySet<RunningAppsChangedListener> mRunningAppsChangedListeners = new ArraySet<>(); @Nullable private final @AssociationRequest.DeviceProfile String mDeviceProfile; Loading Loading @@ -178,12 +181,16 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController /** Register a listener for running applications changes. */ public void registerRunningAppsChangedListener(@NonNull RunningAppsChangedListener listener) { mRunningAppsChangedListener.add(listener); synchronized (mGenericWindowPolicyControllerLock) { mRunningAppsChangedListeners.add(listener); } } /** Unregister a listener for running applications changes. */ public void unregisterRunningAppsChangedListener(@NonNull RunningAppsChangedListener listener) { mRunningAppsChangedListener.remove(listener); synchronized (mGenericWindowPolicyControllerLock) { mRunningAppsChangedListeners.remove(listener); } } @Override Loading Loading @@ -283,13 +290,17 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController // Post callback on the main thread so it doesn't block activity launching mHandler.post(() -> mActivityListener.onDisplayEmpty(mDisplayId)); } } if (!mRunningAppsChangedListeners.isEmpty()) { final ArraySet<RunningAppsChangedListener> listeners = new ArraySet<>(mRunningAppsChangedListeners); mHandler.post(() -> { for (RunningAppsChangedListener listener : mRunningAppsChangedListener) { for (RunningAppsChangedListener listener : listeners) { listener.onRunningAppsChanged(runningUids); } }); } } } @Override public boolean canShowTasksInRecents() { Loading Loading @@ -354,4 +365,11 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController } return true; } @VisibleForTesting int getRunningAppsChangedListenersSizeForTesting() { synchronized (mGenericWindowPolicyControllerLock) { return mRunningAppsChangedListeners.size(); } } }
services/tests/servicestests/src/com/android/server/companion/virtual/VirtualDeviceManagerServiceTest.java +30 −0 Original line number Diff line number Diff line Loading @@ -891,4 +891,34 @@ public class VirtualDeviceManagerServiceTest { verify(mContext).startActivityAsUser(argThat(intent -> intent.filterEquals(blockedAppIntent)), any(), any()); } @Test public void registerRunningAppsChangedListener_onRunningAppsChanged_listenersNotified() { ArraySet<Integer> uids = new ArraySet<>(Arrays.asList(UID_1, UID_2)); mDeviceImpl.onVirtualDisplayCreatedLocked( mDeviceImpl.createWindowPolicyController(), DISPLAY_ID); GenericWindowPolicyController gwpc = mDeviceImpl.getWindowPolicyControllersForTesting().get( DISPLAY_ID); gwpc.onRunningAppsChanged(uids); mDeviceImpl.onRunningAppsChanged(uids); assertThat(gwpc.getRunningAppsChangedListenersSizeForTesting()).isEqualTo(1); verify(mRunningAppsChangedCallback).accept(new ArraySet<>(Arrays.asList(UID_1, UID_2))); } @Test public void noRunningAppsChangedListener_onRunningAppsChanged_doesNotThrowException() { ArraySet<Integer> uids = new ArraySet<>(Arrays.asList(UID_1, UID_2)); mDeviceImpl.onVirtualDisplayCreatedLocked( mDeviceImpl.createWindowPolicyController(), DISPLAY_ID); GenericWindowPolicyController gwpc = mDeviceImpl.getWindowPolicyControllersForTesting().get( DISPLAY_ID); mDeviceImpl.onVirtualDisplayRemovedLocked(DISPLAY_ID); // This call should not throw any exceptions. gwpc.onRunningAppsChanged(uids); assertThat(gwpc.getRunningAppsChangedListenersSizeForTesting()).isEqualTo(0); } }