From aa3a7e6273559c7d554c375932f286bfe851c19c Mon Sep 17 00:00:00 2001 From: Jacqueline Bronger Date: Tue, 8 Feb 2022 14:11:30 +0100 Subject: [PATCH] Implement custom PiP close action on TV. The custom close action will replace the system close action and the button in the menu will be colored red to be able to tell it apart. If one of the custom actions matches the close actions it will be removed to avoid duplicates resulting from the custom close action. If the app doesn't close the PiP after five seconds the system will continue to close the PiP as normal. Bug: 218487423 Test: manual Change-Id: Ic3c520c50ac0e3d2f0e73cf2f71d47a4f548f861 --- .../android/view/IPinnedTaskListener.aidl | 2 +- .../res/color/tv_pip_menu_close_icon.xml | 19 +++++++ .../res/color/tv_pip_menu_close_icon_bg.xml | 21 +++++++ .../Shell/res/values-television/config.xml | 4 ++ .../Shell/res/values/colors_tv.xml | 4 +- .../pip/PinnedStackListenerForwarder.java | 13 +++-- .../wm/shell/pip/PipMenuController.java | 2 +- .../pip/phone/PhonePipMenuController.java | 3 +- .../wm/shell/pip/phone/PipController.java | 5 +- .../wm/shell/pip/tv/TvPipController.java | 38 +++++++++++-- .../shell/pip/tv/TvPipMenuActionButton.java | 11 ++++ .../wm/shell/pip/tv/TvPipMenuController.java | 20 ++++--- .../wm/shell/pip/tv/TvPipMenuView.java | 56 ++++++++++++++++--- .../server/wm/ActivityClientController.java | 3 +- .../server/wm/ActivityTaskManagerService.java | 3 +- .../server/wm/PinnedTaskController.java | 12 ++-- .../core/java/com/android/server/wm/Task.java | 4 +- 17 files changed, 179 insertions(+), 41 deletions(-) create mode 100644 libs/WindowManager/Shell/res/color/tv_pip_menu_close_icon.xml create mode 100644 libs/WindowManager/Shell/res/color/tv_pip_menu_close_icon_bg.xml diff --git a/core/java/android/view/IPinnedTaskListener.aidl b/core/java/android/view/IPinnedTaskListener.aidl index 7d39ffe182c76..595a846e069ad 100644 --- a/core/java/android/view/IPinnedTaskListener.aidl +++ b/core/java/android/view/IPinnedTaskListener.aidl @@ -47,7 +47,7 @@ oneway interface IPinnedTaskListener { * Called when the set of actions for the current PiP activity changes, or when the listener * is first registered to allow the listener to synchronize its state with the controller. */ - void onActionsChanged(in ParceledListSlice actions); + void onActionsChanged(in ParceledListSlice actions, in RemoteAction closeAction); /** * Called by the window manager to notify the listener that Activity (was or is in pinned mode) diff --git a/libs/WindowManager/Shell/res/color/tv_pip_menu_close_icon.xml b/libs/WindowManager/Shell/res/color/tv_pip_menu_close_icon.xml new file mode 100644 index 0000000000000..ce8640df00936 --- /dev/null +++ b/libs/WindowManager/Shell/res/color/tv_pip_menu_close_icon.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/libs/WindowManager/Shell/res/color/tv_pip_menu_close_icon_bg.xml b/libs/WindowManager/Shell/res/color/tv_pip_menu_close_icon_bg.xml new file mode 100644 index 0000000000000..6cbf66f00df78 --- /dev/null +++ b/libs/WindowManager/Shell/res/color/tv_pip_menu_close_icon_bg.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/libs/WindowManager/Shell/res/values-television/config.xml b/libs/WindowManager/Shell/res/values-television/config.xml index dcb4c10260626..86ca655263362 100644 --- a/libs/WindowManager/Shell/res/values-television/config.xml +++ b/libs/WindowManager/Shell/res/values-television/config.xml @@ -39,4 +39,8 @@ 5000 + + + 5000 diff --git a/libs/WindowManager/Shell/res/values/colors_tv.xml b/libs/WindowManager/Shell/res/values/colors_tv.xml index 08d3cef104283..64b146ec3a834 100644 --- a/libs/WindowManager/Shell/res/values/colors_tv.xml +++ b/libs/WindowManager/Shell/res/values/colors_tv.xml @@ -16,8 +16,10 @@ --> #0E0E0F - #E8EAED + #F8F9FA #80868B + #D93025 + #D69F261F #E8EAED #990E0E0F #E8EAED diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PinnedStackListenerForwarder.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PinnedStackListenerForwarder.java index 3fefc4a0e0bfa..87eca74acd0b2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PinnedStackListenerForwarder.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PinnedStackListenerForwarder.java @@ -72,9 +72,10 @@ public class PinnedStackListenerForwarder { } } - private void onActionsChanged(ParceledListSlice actions) { + private void onActionsChanged(ParceledListSlice actions, + RemoteAction closeAction) { for (PinnedTaskListener listener : mListeners) { - listener.onActionsChanged(actions); + listener.onActionsChanged(actions, closeAction); } } @@ -113,9 +114,10 @@ public class PinnedStackListenerForwarder { } @Override - public void onActionsChanged(ParceledListSlice actions) { + public void onActionsChanged(ParceledListSlice actions, + RemoteAction closeAction) { mMainExecutor.execute(() -> { - PinnedStackListenerForwarder.this.onActionsChanged(actions); + PinnedStackListenerForwarder.this.onActionsChanged(actions, closeAction); }); } @@ -152,7 +154,8 @@ public class PinnedStackListenerForwarder { public void onImeVisibilityChanged(boolean imeVisible, int imeHeight) {} - public void onActionsChanged(ParceledListSlice actions) {} + public void onActionsChanged(ParceledListSlice actions, + RemoteAction closeAction) {} public void onActivityHidden(ComponentName componentName) {} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMenuController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMenuController.java index caa1f017082b9..f6ff294b43286 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMenuController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipMenuController.java @@ -66,7 +66,7 @@ public interface PipMenuController { /** * Given a set of actions, update the menu. */ - void setAppActions(ParceledListSlice appActions); + void setAppActions(ParceledListSlice appActions, RemoteAction closeAction); /** * Resize the PiP menu with the given bounds. The PiP SurfaceControl is given if there is a diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java index c4dadf1f739ab..5e4c12ed37edd 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PhonePipMenuController.java @@ -474,7 +474,8 @@ public class PhonePipMenuController implements PipMenuController { * Sets the menu actions to the actions provided by the current PiP menu. */ @Override - public void setAppActions(ParceledListSlice appActions) { + public void setAppActions(ParceledListSlice appActions, + RemoteAction closeAction) { mAppActions = appActions; updateMenuActions(); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java index e7a1c4cca07e8..e86ebaaabbfe3 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipController.java @@ -246,8 +246,9 @@ public class PipController implements PipTransitionController.PipTransitionCallb } @Override - public void onActionsChanged(ParceledListSlice actions) { - mMenuController.setAppActions(actions); + public void onActionsChanged(ParceledListSlice actions, + RemoteAction closeAction) { + mMenuController.setAppActions(actions, closeAction); } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java index f397ac01e60df..917eaa061d1b1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java @@ -22,6 +22,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; import android.annotation.IntDef; import android.app.ActivityManager; import android.app.ActivityTaskManager; +import android.app.PendingIntent; import android.app.RemoteAction; import android.app.TaskInfo; import android.content.ComponentName; @@ -69,7 +70,7 @@ public class TvPipController implements PipTransitionController.PipTransitionCal private static final int NONEXISTENT_TASK_ID = -1; @Retention(RetentionPolicy.SOURCE) - @IntDef(prefix = { "STATE_" }, value = { + @IntDef(prefix = {"STATE_"}, value = { STATE_NO_PIP, STATE_PIP, STATE_PIP_MENU, @@ -109,6 +110,10 @@ public class TvPipController implements PipTransitionController.PipTransitionCal private int mPinnedTaskId = NONEXISTENT_TASK_ID; private Runnable mUnstashRunnable; + private RemoteAction mCloseAction; + // How long the shell will wait for the app to close the PiP if a custom action is set. + private int mPipForceCloseDelay; + private int mResizeAnimationDuration; public static Pip create( @@ -369,9 +374,29 @@ public class TvPipController implements PipTransitionController.PipTransitionCal public void closePip() { if (DEBUG) { ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, - "%s: closePip(), state=%s", TAG, stateToName(mState)); + "%s: closePip(), state=%s, loseAction=%s", TAG, stateToName(mState), + mCloseAction); } + if (mCloseAction != null) { + try { + mCloseAction.getActionIntent().send(); + } catch (PendingIntent.CanceledException e) { + ProtoLog.w(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: Failed to send close action, %s", TAG, e); + } + mMainExecutor.executeDelayed(() -> closeCurrentPiP(mPinnedTaskId), mPipForceCloseDelay); + } else { + closeCurrentPiP(mPinnedTaskId); + } + } + + private void closeCurrentPiP(int pinnedTaskId) { + if (mPinnedTaskId != pinnedTaskId) { + ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, + "%s: PiP has already been closed by custom close action", TAG); + return; + } removeTask(mPinnedTaskId); onPipDisappeared(); } @@ -468,6 +493,7 @@ public class TvPipController implements PipTransitionController.PipTransitionCal private void loadConfigurations() { final Resources res = mContext.getResources(); mResizeAnimationDuration = res.getInteger(R.integer.config_pipResizeAnimationDuration); + mPipForceCloseDelay = res.getInteger(R.integer.config_pipForceCloseDelay); } private void registerTaskStackListenerCallback(TaskStackListenerImpl taskStackListener) { @@ -592,13 +618,15 @@ public class TvPipController implements PipTransitionController.PipTransitionCal public void onMovementBoundsChanged(boolean fromImeAdjustment) {} @Override - public void onActionsChanged(ParceledListSlice actions) { + public void onActionsChanged(ParceledListSlice actions, + RemoteAction closeAction) { if (DEBUG) { ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, "%s: onActionsChanged()", TAG); } - mTvPipMenuController.setAppActions(actions); + mTvPipMenuController.setAppActions(actions, closeAction); + mCloseAction = closeAction; } }); } catch (RemoteException e) { @@ -617,7 +645,7 @@ public class TvPipController implements PipTransitionController.PipTransitionCal WINDOWING_MODE_PINNED, ACTIVITY_TYPE_UNDEFINED); if (DEBUG) { ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, - "%s: > taskInfo=%s", TAG, taskInfo); + "%s: taskInfo=%s", TAG, taskInfo); } return taskInfo; } catch (RemoteException e) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuActionButton.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuActionButton.java index 4eb46d93c8878..abbc614b4b4ff 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuActionButton.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuActionButton.java @@ -126,4 +126,15 @@ public class TvPipMenuActionButton extends RelativeLayout implements View.OnClic public boolean isEnabled() { return mButtonView.isEnabled(); } + + void setIsCustomCloseAction(boolean isCustomCloseAction) { + mIconImageView.setImageTintList( + getResources().getColorStateList( + isCustomCloseAction ? R.color.tv_pip_menu_close_icon + : R.color.tv_pip_menu_icon)); + mButtonView.setBackgroundTintList(getResources() + .getColorStateList(isCustomCloseAction ? R.color.tv_pip_menu_close_icon_bg + : R.color.tv_pip_menu_icon_bg)); + } + } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java index 1a035c5a68db9..b6ae398c1eb90 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuController.java @@ -45,6 +45,7 @@ import com.android.wm.shell.protolog.ShellProtoLogGroup; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * Manages the visibility of the PiP Menu as user interacts with PiP. @@ -67,6 +68,7 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis private final List mMediaActions = new ArrayList<>(); private final List mAppActions = new ArrayList<>(); + private RemoteAction mCloseAction; private SyncRtSurfaceTransactionApplier mApplier; RectF mTmpSourceRectF = new RectF(); @@ -270,12 +272,12 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis } @Override - public void setAppActions(ParceledListSlice actions) { + public void setAppActions(ParceledListSlice actions, RemoteAction closeAction) { if (DEBUG) { ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, "%s: setAppActions()", TAG); } - updateAdditionalActionsList(mAppActions, actions.getList()); + updateAdditionalActionsList(mAppActions, actions.getList(), closeAction); } private void onMediaActionsChanged(List actions) { @@ -291,17 +293,19 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis enabledActions.add(remoteAction); } } - updateAdditionalActionsList(mMediaActions, enabledActions); + updateAdditionalActionsList(mMediaActions, enabledActions, mCloseAction); } - private void updateAdditionalActionsList( - List destination, @Nullable List source) { + private void updateAdditionalActionsList(List destination, + @Nullable List source, RemoteAction closeAction) { final int number = source != null ? source.size() : 0; - if (number == 0 && destination.isEmpty()) { + if (number == 0 && destination.isEmpty() && Objects.equals(closeAction, mCloseAction)) { // Nothing changed. return; } + mCloseAction = closeAction; + destination.clear(); if (number > 0) { destination.addAll(source); @@ -314,9 +318,9 @@ public class TvPipMenuController implements PipMenuController, TvPipMenuView.Lis return; } if (!mAppActions.isEmpty()) { - mPipMenuView.setAdditionalActions(mAppActions, mMainHandler); + mPipMenuView.setAdditionalActions(mAppActions, mCloseAction, mMainHandler); } else { - mPipMenuView.setAdditionalActions(mMediaActions, mMainHandler); + mPipMenuView.setAdditionalActions(mMediaActions, mCloseAction, mMainHandler); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java index 984dea2c016ef..7fdb9ed90875d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipMenuView.java @@ -50,6 +50,7 @@ import com.android.wm.shell.protolog.ShellProtoLogGroup; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * A View that represents Pip Menu on TV. It's responsible for displaying 3 ever-present Pip Menu @@ -78,6 +79,7 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { private Rect mCurrentBounds; private final TvPipMenuActionButton mExpandButton; + private final TvPipMenuActionButton mCloseButton; public TvPipMenuView(@NonNull Context context) { this(context, null); @@ -100,8 +102,11 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { mActionButtonsContainer = findViewById(R.id.tv_pip_menu_action_buttons); mActionButtonsContainer.findViewById(R.id.tv_pip_menu_fullscreen_button) .setOnClickListener(this); - mActionButtonsContainer.findViewById(R.id.tv_pip_menu_close_button) - .setOnClickListener(this); + + mCloseButton = mActionButtonsContainer.findViewById(R.id.tv_pip_menu_close_button); + mCloseButton.setOnClickListener(this); + mCloseButton.setIsCustomCloseAction(true); + mActionButtonsContainer.findViewById(R.id.tv_pip_menu_move_button) .setOnClickListener(this); mExpandButton = findViewById(R.id.tv_pip_menu_expand_button); @@ -220,12 +225,24 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { || mArrowLeft.getAlpha() != 0f; } - void setAdditionalActions(List actions, Handler mainHandler) { + void setAdditionalActions(List actions, RemoteAction closeAction, + Handler mainHandler) { if (DEBUG) { ProtoLog.d(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, "%s: setAdditionalActions()", TAG); } + // Replace system close action with custom close action if available + if (closeAction != null) { + setActionForButton(closeAction, mCloseButton, mainHandler); + } else { + mCloseButton.setTextAndDescription(R.string.pip_close); + mCloseButton.setImageResource(R.drawable.pip_ic_close_white); + } + mCloseButton.setIsCustomCloseAction(closeAction != null); + // Make sure the close action is always enabled + mCloseButton.setEnabled(true); + // Make sure we exactly as many additional buttons as we have actions to display. final int actionsNumber = actions.size(); int buttonsNumber = mAdditionalButtons.size(); @@ -256,14 +273,37 @@ public class TvPipMenuView extends FrameLayout implements View.OnClickListener { for (int index = 0; index < actionsNumber; index++) { final RemoteAction action = actions.get(index); final TvPipMenuActionButton button = mAdditionalButtons.get(index); - button.setVisibility(View.VISIBLE); // Ensure the button is visible. - button.setTextAndDescription(action.getContentDescription()); - button.setEnabled(action.isEnabled()); - button.setTag(action); - action.getIcon().loadDrawableAsync(mContext, button::setImageDrawable, mainHandler); + + // Remove action if it matches the custom close action. + if (actionsMatch(action, closeAction)) { + button.setVisibility(GONE); + continue; + } + setActionForButton(action, button, mainHandler); } } + /** + * Checks whether title, description and intent match. + * Comparing icons would be good, but using equals causes false negatives + */ + private boolean actionsMatch(RemoteAction action1, RemoteAction action2) { + if (action1 == action2) return true; + if (action1 == null) return false; + return Objects.equals(action1.getTitle(), action2.getTitle()) + && Objects.equals(action1.getContentDescription(), action2.getContentDescription()) + && Objects.equals(action1.getActionIntent(), action2.getActionIntent()); + } + + private void setActionForButton(RemoteAction action, TvPipMenuActionButton button, + Handler mainHandler) { + button.setVisibility(View.VISIBLE); // Ensure the button is visible. + button.setTextAndDescription(action.getContentDescription()); + button.setEnabled(action.isEnabled()); + button.setTag(action); + action.getIcon().loadDrawableAsync(mContext, button::setImageDrawable, mainHandler); + } + @Nullable SurfaceControl getWindowSurfaceControl() { final ViewRootImpl root = getViewRootImpl(); diff --git a/services/core/java/com/android/server/wm/ActivityClientController.java b/services/core/java/com/android/server/wm/ActivityClientController.java index ffc438834658d..8018d5652b1b3 100644 --- a/services/core/java/com/android/server/wm/ActivityClientController.java +++ b/services/core/java/com/android/server/wm/ActivityClientController.java @@ -749,7 +749,8 @@ class ActivityClientController extends IActivityClientController.Stub { rootTask.setPictureInPictureAspectRatio( r.pictureInPictureArgs.getAspectRatioFloat(), r.pictureInPictureArgs.getExpandedAspectRatioFloat()); - rootTask.setPictureInPictureActions(r.pictureInPictureArgs.getActions()); + rootTask.setPictureInPictureActions(r.pictureInPictureArgs.getActions(), + r.pictureInPictureArgs.getCloseAction()); } } } finally { diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 988a7c6cde9a1..8b6262f0fccaa 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -3527,11 +3527,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final float expandedAspectRatio = r.pictureInPictureArgs.getExpandedAspectRatioFloat(); final List actions = r.pictureInPictureArgs.getActions(); + final RemoteAction closeAction = r.pictureInPictureArgs.getCloseAction(); mRootWindowContainer.moveActivityToPinnedRootTask(r, null /* launchIntoPipHostActivity */, "enterPictureInPictureMode"); final Task task = r.getTask(); task.setPictureInPictureAspectRatio(aspectRatio, expandedAspectRatio); - task.setPictureInPictureActions(actions); + task.setPictureInPictureActions(actions, closeAction); // Continue the pausing process after entering pip. if (task.getPausingActivity() == r) { diff --git a/services/core/java/com/android/server/wm/PinnedTaskController.java b/services/core/java/com/android/server/wm/PinnedTaskController.java index 06e3a73940b47..43d077664fd54 100644 --- a/services/core/java/com/android/server/wm/PinnedTaskController.java +++ b/services/core/java/com/android/server/wm/PinnedTaskController.java @@ -92,6 +92,7 @@ class PinnedTaskController { // The set of actions and aspect-ratio for the that are currently allowed on the PiP activity private ArrayList mActions = new ArrayList<>(); + private RemoteAction mCloseAction; private float mAspectRatio = -1f; private float mExpandedAspectRatio = 0f; @@ -154,7 +155,7 @@ class PinnedTaskController { mPinnedTaskListener = listener; notifyImeVisibilityChanged(mIsImeShowing, mImeHeight); notifyMovementBoundsChanged(false /* fromImeAdjustment */); - notifyActionsChanged(mActions); + notifyActionsChanged(mActions, mCloseAction); } catch (RemoteException e) { Log.e(TAG, "Failed to register pinned task listener", e); } @@ -408,12 +409,13 @@ class PinnedTaskController { /** * Sets the current set of actions. */ - void setActions(List actions) { + void setActions(List actions, RemoteAction closeAction) { mActions.clear(); if (actions != null) { mActions.addAll(actions); } - notifyActionsChanged(mActions); + mCloseAction = closeAction; + notifyActionsChanged(mActions, closeAction); } /** @@ -450,10 +452,10 @@ class PinnedTaskController { /** * Notifies listeners that the PIP actions have changed. */ - private void notifyActionsChanged(List actions) { + private void notifyActionsChanged(List actions, RemoteAction closeAction) { if (mPinnedTaskListener != null) { try { - mPinnedTaskListener.onActionsChanged(new ParceledListSlice(actions)); + mPinnedTaskListener.onActionsChanged(new ParceledListSlice(actions), closeAction); } catch (RemoteException e) { Slog.e(TAG_WM, "Error delivering actions changed event.", e); } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index f71bd7288532f..9f23f2055ebc2 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -6098,7 +6098,7 @@ class Task extends TaskFragment { /** * Sets the current picture-in-picture actions. */ - void setPictureInPictureActions(List actions) { + void setPictureInPictureActions(List actions, RemoteAction closeAction) { if (!mWmService.mAtmService.mSupportsPictureInPicture) { return; } @@ -6107,7 +6107,7 @@ class Task extends TaskFragment { return; } - getDisplayContent().getPinnedTaskController().setActions(actions); + getDisplayContent().getPinnedTaskController().setActions(actions, closeAction); } public DisplayInfo getDisplayInfo() {