From 0b495ea0c32b5d5a9c2f6298a871dc3d50868971 Mon Sep 17 00:00:00 2001 From: Sergey Nikolaienkov Date: Thu, 29 Oct 2020 10:26:30 +0000 Subject: [PATCH] Fix Pip dependenices on TV Fix crash in .tv.PipController: .tv.PipController creates a PipNotification object before assigning mPipMediaController, but PipNotification calls PipController#getPipMediaController() from its constructor, receives null, and causes NPE when tries to subscribe to it. This CL fixes the crash by providing PipNotification with a PipMediaController reference directly (as a constructor param). Bug: 169575409 Bug: 165795012 Test: make && flash adt3-userdebug Test: atest android.systemui.cts.tv.MicIndicatorTest Change-Id: I0010863921607cc315acfcbe0cb9d181b79d26b2 --- .../wm/shell/pip/tv/PipController.java | 5 +- .../wm/shell/pip/tv/PipNotification.java | 76 +++++++++---------- .../android/systemui/wmshell/TvPipModule.java | 6 +- 3 files changed, 45 insertions(+), 42 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/PipController.java index 7b710553b67d5..3468b888c06a5 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/PipController.java @@ -224,10 +224,11 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac PipBoundsHandler pipBoundsHandler, PipTaskOrganizer pipTaskOrganizer, PipMediaController pipMediaController, + PipNotification pipNotification, WindowManagerShellWrapper windowManagerShellWrapper) { mContext = context; mPipBoundsState = pipBoundsState; - mPipNotification = new PipNotification(context, this); + mPipNotification = pipNotification; mPipBoundsHandler = pipBoundsHandler; mPipMediaController = pipMediaController; // Ensure that we have the display info in case we get calls to update the bounds @@ -242,6 +243,8 @@ public class PipController implements Pip, PipTaskOrganizer.PipTransitionCallbac mPipTaskOrganizer.registerPipTransitionCallback(this); mActivityTaskManager = ActivityTaskManager.getService(); + addListener(mPipNotification); + final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ACTION_CLOSE); intentFilter.addAction(ACTION_MENU); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/PipNotification.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/PipNotification.java index d6368ea837712..b30dee4f331fe 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/PipNotification.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/PipNotification.java @@ -32,6 +32,7 @@ import android.text.TextUtils; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.wm.shell.R; +import com.android.wm.shell.pip.PipMediaController; import java.util.Objects; @@ -40,7 +41,7 @@ import java.util.Objects; *

Once it's created, it will manage the PIP notification UI by itself except for handling * configuration changes. */ -public class PipNotification { +public class PipNotification implements PipController.Listener { private static final boolean DEBUG = PipController.DEBUG; private static final String TAG = "PipNotification"; @@ -63,42 +64,7 @@ public class PipNotification { private String mMediaTitle; private Bitmap mArt; - private PipController.Listener mPipListener = new PipController.Listener() { - @Override - public void onPipEntered(String packageName) { - mPackageName = packageName; - notifyPipNotification(); - } - - @Override - public void onPipActivityClosed() { - dismissPipNotification(); - mPackageName = null; - } - - @Override - public void onShowPipMenu() { - // no-op. - } - - @Override - public void onPipMenuActionsChanged(ParceledListSlice actions) { - // no-op. - } - - @Override - public void onMoveToFullscreen() { - dismissPipNotification(); - mPackageName = null; - } - - @Override - public void onPipResizeAboutToStart() { - // no-op. - } - }; - - public PipNotification(Context context, PipController pipController) { + public PipNotification(Context context, PipMediaController pipMediaController) { mPackageManager = context.getPackageManager(); mNotificationManager = context.getSystemService(NotificationManager.class); @@ -110,12 +76,44 @@ public class PipNotification { .setContentIntent(createPendingIntent(context, ACTION_MENU)) .setDeleteIntent(createPendingIntent(context, ACTION_CLOSE))); - pipController.addListener(mPipListener); - pipController.getPipMediaController().addMetadataListener(this::onMediaMetadataChanged); + pipMediaController.addMetadataListener(this::onMediaMetadataChanged); onConfigurationChanged(context); } + @Override + public void onPipEntered(String packageName) { + mPackageName = packageName; + notifyPipNotification(); + } + + @Override + public void onPipActivityClosed() { + dismissPipNotification(); + mPackageName = null; + } + + @Override + public void onShowPipMenu() { + // no-op. + } + + @Override + public void onPipMenuActionsChanged(ParceledListSlice actions) { + // no-op. + } + + @Override + public void onMoveToFullscreen() { + dismissPipNotification(); + mPackageName = null; + } + + @Override + public void onPipResizeAboutToStart() { + // no-op. + } + private void onMediaMetadataChanged(MediaMetadata metadata) { if (updateMediaControllerMetadata(metadata) && mNotified) { // update notification diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java b/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java index 9701b40a06a66..b7efa7c4c5ace 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/TvPipModule.java @@ -53,6 +53,7 @@ public abstract class TvPipModule { PipBoundsHandler pipBoundsHandler, PipTaskOrganizer pipTaskOrganizer, PipMediaController pipMediaController, + PipNotification pipNotification, WindowManagerShellWrapper windowManagerShellWrapper) { return Optional.of( new PipController( @@ -61,6 +62,7 @@ public abstract class TvPipModule { pipBoundsHandler, pipTaskOrganizer, pipMediaController, + pipNotification, windowManagerShellWrapper)); } @@ -80,8 +82,8 @@ public abstract class TvPipModule { @WMSingleton @Provides static PipNotification providePipNotification(Context context, - PipController pipController) { - return new PipNotification(context, pipController); + PipMediaController pipMediaController) { + return new PipNotification(context, pipMediaController); } @WMSingleton