blob: 0373d77940d76e1d84d3453f870025fc7251dd2e [file] [log] [blame]
Winson73bc1592016-10-18 18:47:43 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.pip.phone;
18
Winson Chungb5026902017-05-03 12:45:13 -070019import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
Winson Chunga29eb982016-12-14 12:01:27 -080020import static android.view.Display.DEFAULT_DISPLAY;
21
Sudheer Shankadc589ac2016-11-10 15:30:17 -080022import android.app.ActivityManager;
Winson Chungb5026902017-05-03 12:45:13 -070023import android.app.ActivityManager.StackInfo;
Winson73bc1592016-10-18 18:47:43 -070024import android.app.IActivityManager;
Winson Chung3535df22017-01-17 18:43:39 -080025import android.content.ComponentName;
Winson73bc1592016-10-18 18:47:43 -070026import android.content.Context;
Winson Chunga29eb982016-12-14 12:01:27 -080027import android.content.pm.ParceledListSlice;
Winson Chung0c5a5922017-05-22 17:41:06 -070028import android.content.res.Configuration;
Winson Chung2a82fe52017-02-02 14:43:34 -080029import android.graphics.Rect;
Winson Chunga29eb982016-12-14 12:01:27 -080030import android.os.Handler;
31import android.os.RemoteException;
32import android.util.Log;
33import android.view.IPinnedStackController;
34import android.view.IPinnedStackListener;
Winson73bc1592016-10-18 18:47:43 -070035import android.view.IWindowManager;
36import android.view.WindowManagerGlobal;
37
Winson Chung29a78652017-02-09 18:35:26 -080038import com.android.systemui.pip.BasePipManager;
Winson Chungb5026902017-05-03 12:45:13 -070039import com.android.systemui.recents.events.EventBus;
40import com.android.systemui.recents.events.component.ExpandPipEvent;
Winson Chung929d4f72017-01-13 10:21:33 -080041import com.android.systemui.recents.misc.SystemServicesProxy;
42import com.android.systemui.recents.misc.SystemServicesProxy.TaskStackListener;
Winson Chungac52f282017-03-30 14:44:52 -070043import com.android.systemui.statusbar.CommandQueue;
Winson Chung929d4f72017-01-13 10:21:33 -080044
Winson Chung29a78652017-02-09 18:35:26 -080045import java.io.PrintWriter;
46
Winson73bc1592016-10-18 18:47:43 -070047/**
48 * Manages the picture-in-picture (PIP) UI and states for Phones.
49 */
Winson Chung29a78652017-02-09 18:35:26 -080050public class PipManager implements BasePipManager {
Winson73bc1592016-10-18 18:47:43 -070051 private static final String TAG = "PipManager";
52
53 private static PipManager sPipController;
54
55 private Context mContext;
56 private IActivityManager mActivityManager;
57 private IWindowManager mWindowManager;
Winson Chunga29eb982016-12-14 12:01:27 -080058 private Handler mHandler = new Handler();
59
60 private final PinnedStackListener mPinnedStackListener = new PinnedStackListener();
Winson73bc1592016-10-18 18:47:43 -070061
Winson Chungd2d90972017-02-28 11:40:41 -080062 private InputConsumerController mInputConsumerController;
Winson Chung15504af2016-11-02 18:11:36 -070063 private PipMenuActivityController mMenuController;
Winson Chung97a60d92017-01-18 16:01:53 -080064 private PipMediaController mMediaController;
Winson Chungc81c0ce2017-03-17 12:27:30 -070065 private PipNotificationController mNotificationController;
Winson73bc1592016-10-18 18:47:43 -070066 private PipTouchHandler mTouchHandler;
67
Winson Chunga29eb982016-12-14 12:01:27 -080068 /**
Winson Chung929d4f72017-01-13 10:21:33 -080069 * Handler for system task stack changes.
70 */
71 TaskStackListener mTaskStackListener = new TaskStackListener() {
72 @Override
Winson Chungb5026902017-05-03 12:45:13 -070073 public void onActivityPinned(String packageName, int taskId) {
Winson Chungee697562017-05-18 14:29:43 -070074 if (!checkCurrentUserId(mContext, false /* debug */)) {
Winson Chung3535df22017-01-17 18:43:39 -080075 return;
76 }
Winson Chungc81c0ce2017-03-17 12:27:30 -070077
Winson Chung929d4f72017-01-13 10:21:33 -080078 mTouchHandler.onActivityPinned();
Winson Chung97a60d92017-01-18 16:01:53 -080079 mMediaController.onActivityPinned();
Winson Chungd2d90972017-02-28 11:40:41 -080080 mMenuController.onActivityPinned();
Winson Chung6b991b62017-05-11 11:30:36 -070081 mNotificationController.onActivityPinned(packageName,
82 true /* deferUntilAnimationEnds */);
Winson Chungac52f282017-03-30 14:44:52 -070083
84 SystemServicesProxy.getInstance(mContext).setPipVisibility(true);
Winson Chungc81c0ce2017-03-17 12:27:30 -070085 }
86
87 @Override
88 public void onActivityUnpinned() {
Winson Chungee697562017-05-18 14:29:43 -070089 if (!checkCurrentUserId(mContext, false /* debug */)) {
Winson Chungc81c0ce2017-03-17 12:27:30 -070090 return;
91 }
92
Winson Chungac52f282017-03-30 14:44:52 -070093 ComponentName topPipActivity = PipUtils.getTopPinnedActivity(mContext,
94 mActivityManager);
Winson Chung32c566f2017-04-11 18:31:21 -070095 mMenuController.hideMenu();
Winson Chungac52f282017-03-30 14:44:52 -070096 mNotificationController.onActivityUnpinned(topPipActivity);
97
98 SystemServicesProxy.getInstance(mContext).setPipVisibility(topPipActivity != null);
Winson Chung929d4f72017-01-13 10:21:33 -080099 }
100
101 @Override
Winson Chung85d39982017-02-24 15:21:25 -0800102 public void onPinnedStackAnimationStarted() {
103 // Disable touches while the animation is running
104 mTouchHandler.setTouchEnabled(false);
105 }
106
107 @Override
Winson Chung929d4f72017-01-13 10:21:33 -0800108 public void onPinnedStackAnimationEnded() {
Winson Chung85d39982017-02-24 15:21:25 -0800109 // Re-enable touches after the animation completes
110 mTouchHandler.setTouchEnabled(true);
Winson Chungac52f282017-03-30 14:44:52 -0700111 mTouchHandler.onPinnedStackAnimationEnded();
Winson Chung34488242017-04-26 15:53:51 -0700112 mMenuController.onPinnedStackAnimationEnded();
Winson Chung6b991b62017-05-11 11:30:36 -0700113 mNotificationController.onPinnedStackAnimationEnded();
Winson Chung929d4f72017-01-13 10:21:33 -0800114 }
115
116 @Override
Winson Chunge6385a22017-05-02 18:15:16 -0700117 public void onPinnedActivityRestartAttempt(boolean clearedTask) {
Winson Chungee697562017-05-18 14:29:43 -0700118 if (!checkCurrentUserId(mContext, false /* debug */)) {
Winson Chung3535df22017-01-17 18:43:39 -0800119 return;
120 }
121
Winson Chunge6385a22017-05-02 18:15:16 -0700122 mTouchHandler.getMotionHelper().expandPip(clearedTask /* skipAnimation */);
Winson Chung929d4f72017-01-13 10:21:33 -0800123 }
124 };
125
126 /**
Winson Chunga29eb982016-12-14 12:01:27 -0800127 * Handler for messages from the PIP controller.
128 */
129 private class PinnedStackListener extends IPinnedStackListener.Stub {
130
131 @Override
132 public void onListenerRegistered(IPinnedStackController controller) {
133 mHandler.post(() -> {
134 mTouchHandler.setPinnedStackController(controller);
135 });
136 }
137
138 @Override
Winson Chung2a82fe52017-02-02 14:43:34 -0800139 public void onImeVisibilityChanged(boolean imeVisible, int imeHeight) {
Winson Chunga29eb982016-12-14 12:01:27 -0800140 mHandler.post(() -> {
Winson Chung2a82fe52017-02-02 14:43:34 -0800141 mTouchHandler.onImeVisibilityChanged(imeVisible, imeHeight);
Winson Chunga29eb982016-12-14 12:01:27 -0800142 });
143 }
144
145 @Override
146 public void onMinimizedStateChanged(boolean isMinimized) {
147 mHandler.post(() -> {
Winson Chung2a82fe52017-02-02 14:43:34 -0800148 mTouchHandler.setMinimizedState(isMinimized, true /* fromController */);
Winson Chunga29eb982016-12-14 12:01:27 -0800149 });
150 }
151
152 @Override
Winson Chung2a82fe52017-02-02 14:43:34 -0800153 public void onMovementBoundsChanged(Rect insetBounds, Rect normalBounds,
Winson Chungef4dc812017-04-11 13:31:44 -0700154 Rect animatingBounds, boolean fromImeAdjustement, int displayRotation) {
Winson Chunga29eb982016-12-14 12:01:27 -0800155 mHandler.post(() -> {
Winson Chungbaa7b722017-03-03 21:33:44 -0800156 mTouchHandler.onMovementBoundsChanged(insetBounds, normalBounds, animatingBounds,
Winson Chungef4dc812017-04-11 13:31:44 -0700157 fromImeAdjustement, displayRotation);
Winson Chung2a82fe52017-02-02 14:43:34 -0800158 });
159 }
160
161 @Override
162 public void onActionsChanged(ParceledListSlice actions) {
163 mHandler.post(() -> {
164 mMenuController.setAppActions(actions);
Winson Chunga29eb982016-12-14 12:01:27 -0800165 });
166 }
167 }
168
Winson73bc1592016-10-18 18:47:43 -0700169 private PipManager() {}
170
171 /**
172 * Initializes {@link PipManager}.
173 */
174 public void initialize(Context context) {
175 mContext = context;
Sudheer Shankadc589ac2016-11-10 15:30:17 -0800176 mActivityManager = ActivityManager.getService();
Winson73bc1592016-10-18 18:47:43 -0700177 mWindowManager = WindowManagerGlobal.getWindowManagerService();
178
Winson Chunga29eb982016-12-14 12:01:27 -0800179 try {
180 mWindowManager.registerPinnedStackListener(DEFAULT_DISPLAY, mPinnedStackListener);
181 } catch (RemoteException e) {
182 Log.e(TAG, "Failed to register pinned stack listener", e);
183 }
Winson Chung929d4f72017-01-13 10:21:33 -0800184 SystemServicesProxy.getInstance(mContext).registerTaskStackListener(mTaskStackListener);
Winson Chunga29eb982016-12-14 12:01:27 -0800185
Winson Chungd2d90972017-02-28 11:40:41 -0800186 mInputConsumerController = new InputConsumerController(mWindowManager);
Winson Chung97a60d92017-01-18 16:01:53 -0800187 mMediaController = new PipMediaController(context, mActivityManager);
Winson Chungd2d90972017-02-28 11:40:41 -0800188 mMenuController = new PipMenuActivityController(context, mActivityManager, mMediaController,
189 mInputConsumerController);
190 mTouchHandler = new PipTouchHandler(context, mActivityManager, mMenuController,
191 mInputConsumerController);
Winson Chung664758c2017-03-28 21:03:52 -0700192 mNotificationController = new PipNotificationController(context, mActivityManager,
193 mTouchHandler.getMotionHelper());
Winson Chungb5026902017-05-03 12:45:13 -0700194 EventBus.getDefault().register(this);
Winson73bc1592016-10-18 18:47:43 -0700195 }
196
197 /**
198 * Updates the PIP per configuration changed.
199 */
Winson Chung0c5a5922017-05-22 17:41:06 -0700200 public void onConfigurationChanged(Configuration newConfig) {
Winson Chung303c6b72016-10-24 17:12:49 -0700201 mTouchHandler.onConfigurationChanged();
202 }
Winson73bc1592016-10-18 18:47:43 -0700203
204 /**
Winson Chungb5026902017-05-03 12:45:13 -0700205 * Expands the PIP.
206 */
207 public final void onBusEvent(ExpandPipEvent event) {
208 if (event.clearThumbnailWindows) {
209 try {
210 StackInfo stackInfo = mActivityManager.getStackInfo(PINNED_STACK_ID);
211 if (stackInfo != null && stackInfo.taskIds != null) {
212 SystemServicesProxy ssp = SystemServicesProxy.getInstance(mContext);
213 for (int taskId : stackInfo.taskIds) {
214 ssp.cancelThumbnailTransition(taskId);
215 }
216 }
217 } catch (RemoteException e) {
218 // Do nothing
219 }
220 }
221 mTouchHandler.getMotionHelper().expandPip(false /* skipAnimation */);
222 }
223
224 /**
Winson Chungac52f282017-03-30 14:44:52 -0700225 * Sent from KEYCODE_WINDOW handler in PhoneWindowManager, to request the menu to be shown.
226 */
227 public void showPictureInPictureMenu() {
228 mTouchHandler.showPictureInPictureMenu();
229 }
230
231 /**
Winson73bc1592016-10-18 18:47:43 -0700232 * Gets an instance of {@link PipManager}.
233 */
234 public static PipManager getInstance() {
235 if (sPipController == null) {
236 sPipController = new PipManager();
237 }
238 return sPipController;
239 }
Winson Chung29a78652017-02-09 18:35:26 -0800240
241 public void dump(PrintWriter pw) {
242 final String innerPrefix = " ";
243 pw.println(TAG);
Winson Chungd2d90972017-02-28 11:40:41 -0800244 mInputConsumerController.dump(pw, innerPrefix);
Winson Chung29a78652017-02-09 18:35:26 -0800245 mMenuController.dump(pw, innerPrefix);
246 mTouchHandler.dump(pw, innerPrefix);
247 }
Winson73bc1592016-10-18 18:47:43 -0700248}