From ab63d0671cef557fa5b79b6c10c6fca6cad1459b Mon Sep 17 00:00:00 2001 From: yuanjiahsu Date: Wed, 9 Mar 2022 12:07:50 +0800 Subject: [PATCH] Don't send callback with null topActivity The topActivity defined in ActivityListener#onTopActivityChanged is @NonNull, so GenericWindowPolicyController should not send the callback when topActivity is null. Bug: 222771130 Test: manual testing Change-Id: I227d1d83e0e191975ab45b110909938022bb1d0c --- .../java/android/companion/virtual/VirtualDeviceManager.java | 4 ++++ .../companion/virtual/GenericWindowPolicyController.java | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/core/java/android/companion/virtual/VirtualDeviceManager.java b/core/java/android/companion/virtual/VirtualDeviceManager.java index a1983ca9ee96f..914b321b75061 100644 --- a/core/java/android/companion/virtual/VirtualDeviceManager.java +++ b/core/java/android/companion/virtual/VirtualDeviceManager.java @@ -469,6 +469,10 @@ public final class VirtualDeviceManager { /** * Called when the top activity is changed. * + *

Note: When there are no activities running on the virtual display, the + * {@link #onDisplayEmpty(int)} will be called. If the value topActivity is cached, it + * should be cleared when {@link #onDisplayEmpty(int)} is called. + * * @param displayId The display ID on which the activity change happened. * @param topActivity The component name of the top activity. */ diff --git a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java index 3a26c46116290..f4c24a82ae139 100644 --- a/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java +++ b/services/companion/java/com/android/server/companion/virtual/GenericWindowPolicyController.java @@ -165,7 +165,10 @@ public class GenericWindowPolicyController extends DisplayWindowPolicyController @Override public void onTopActivityChanged(ComponentName topActivity, int uid) { - if (mActivityListener != null) { + // Don't send onTopActivityChanged() callback when topActivity is null because it's defined + // as @NonNull in ActivityListener interface. Sends onDisplayEmpty() callback instead when + // there is no activity running on virtual display. + if (mActivityListener != null && topActivity != null) { // Post callback on the main thread so it doesn't block activity launching mHandler.post(() -> mActivityListener.onTopActivityChanged(Display.INVALID_DISPLAY, topActivity));