blob: 114a59407487a92d9467e67ace6b57395adefe64 [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 Chunga29eb982016-12-14 12:01:27 -080019import static android.view.Display.DEFAULT_DISPLAY;
20
Sudheer Shankadc589ac2016-11-10 15:30:17 -080021import android.app.ActivityManager;
Winson73bc1592016-10-18 18:47:43 -070022import android.app.IActivityManager;
Winson Chung3535df22017-01-17 18:43:39 -080023import android.content.ComponentName;
Winson73bc1592016-10-18 18:47:43 -070024import android.content.Context;
Winson Chunga29eb982016-12-14 12:01:27 -080025import android.content.pm.ParceledListSlice;
Winson Chung2a82fe52017-02-02 14:43:34 -080026import android.graphics.Rect;
Winson Chunga29eb982016-12-14 12:01:27 -080027import android.os.Handler;
28import android.os.RemoteException;
29import android.util.Log;
30import android.view.IPinnedStackController;
31import android.view.IPinnedStackListener;
Winson73bc1592016-10-18 18:47:43 -070032import android.view.IWindowManager;
33import android.view.WindowManagerGlobal;
34
Winson Chung29a78652017-02-09 18:35:26 -080035import com.android.systemui.pip.BasePipManager;
Winson Chung929d4f72017-01-13 10:21:33 -080036import com.android.systemui.recents.misc.SystemServicesProxy;
37import com.android.systemui.recents.misc.SystemServicesProxy.TaskStackListener;
Winson Chungac52f282017-03-30 14:44:52 -070038import com.android.systemui.statusbar.CommandQueue;
Winson Chung929d4f72017-01-13 10:21:33 -080039
Winson Chung29a78652017-02-09 18:35:26 -080040import java.io.PrintWriter;
41
Winson73bc1592016-10-18 18:47:43 -070042/**
43 * Manages the picture-in-picture (PIP) UI and states for Phones.
44 */
Winson Chung29a78652017-02-09 18:35:26 -080045public class PipManager implements BasePipManager {
Winson73bc1592016-10-18 18:47:43 -070046 private static final String TAG = "PipManager";
47
48 private static PipManager sPipController;
49
50 private Context mContext;
51 private IActivityManager mActivityManager;
52 private IWindowManager mWindowManager;
Winson Chunga29eb982016-12-14 12:01:27 -080053 private Handler mHandler = new Handler();
54
55 private final PinnedStackListener mPinnedStackListener = new PinnedStackListener();
Winson73bc1592016-10-18 18:47:43 -070056
Winson Chungd2d90972017-02-28 11:40:41 -080057 private InputConsumerController mInputConsumerController;
Winson Chung15504af2016-11-02 18:11:36 -070058 private PipMenuActivityController mMenuController;
Winson Chung97a60d92017-01-18 16:01:53 -080059 private PipMediaController mMediaController;
Winson Chungc81c0ce2017-03-17 12:27:30 -070060 private PipNotificationController mNotificationController;
Winson73bc1592016-10-18 18:47:43 -070061 private PipTouchHandler mTouchHandler;
62
Winson Chunga29eb982016-12-14 12:01:27 -080063 /**
Winson Chung929d4f72017-01-13 10:21:33 -080064 * Handler for system task stack changes.
65 */
66 TaskStackListener mTaskStackListener = new TaskStackListener() {
67 @Override
Winson Chungc81c0ce2017-03-17 12:27:30 -070068 public void onActivityPinned(String packageName) {
Winson Chung3535df22017-01-17 18:43:39 -080069 if (!checkCurrentUserId(false /* debug */)) {
70 return;
71 }
Winson Chungc81c0ce2017-03-17 12:27:30 -070072
Winson Chung929d4f72017-01-13 10:21:33 -080073 mTouchHandler.onActivityPinned();
Winson Chung97a60d92017-01-18 16:01:53 -080074 mMediaController.onActivityPinned();
Winson Chungd2d90972017-02-28 11:40:41 -080075 mMenuController.onActivityPinned();
Winson Chungc81c0ce2017-03-17 12:27:30 -070076 mNotificationController.onActivityPinned(packageName);
Winson Chungac52f282017-03-30 14:44:52 -070077
78 SystemServicesProxy.getInstance(mContext).setPipVisibility(true);
Winson Chungc81c0ce2017-03-17 12:27:30 -070079 }
80
81 @Override
82 public void onActivityUnpinned() {
83 if (!checkCurrentUserId(false /* debug */)) {
84 return;
85 }
86
Winson Chungac52f282017-03-30 14:44:52 -070087 ComponentName topPipActivity = PipUtils.getTopPinnedActivity(mContext,
88 mActivityManager);
89 mNotificationController.onActivityUnpinned(topPipActivity);
90
91 SystemServicesProxy.getInstance(mContext).setPipVisibility(topPipActivity != null);
Winson Chung929d4f72017-01-13 10:21:33 -080092 }
93
94 @Override
Winson Chung85d39982017-02-24 15:21:25 -080095 public void onPinnedStackAnimationStarted() {
96 // Disable touches while the animation is running
97 mTouchHandler.setTouchEnabled(false);
98 }
99
100 @Override
Winson Chung929d4f72017-01-13 10:21:33 -0800101 public void onPinnedStackAnimationEnded() {
Winson Chung85d39982017-02-24 15:21:25 -0800102 // Re-enable touches after the animation completes
103 mTouchHandler.setTouchEnabled(true);
Winson Chungac52f282017-03-30 14:44:52 -0700104 mTouchHandler.onPinnedStackAnimationEnded();
Winson Chung929d4f72017-01-13 10:21:33 -0800105 }
106
107 @Override
Winson Chungd95687c2017-03-03 12:06:21 -0800108 public void onPinnedActivityRestartAttempt() {
Winson Chung3535df22017-01-17 18:43:39 -0800109 if (!checkCurrentUserId(false /* debug */)) {
110 return;
111 }
112
Winson Chungd95687c2017-03-03 12:06:21 -0800113 mTouchHandler.getMotionHelper().expandPip();
Winson Chung929d4f72017-01-13 10:21:33 -0800114 }
115 };
116
117 /**
Winson Chunga29eb982016-12-14 12:01:27 -0800118 * Handler for messages from the PIP controller.
119 */
120 private class PinnedStackListener extends IPinnedStackListener.Stub {
121
122 @Override
123 public void onListenerRegistered(IPinnedStackController controller) {
124 mHandler.post(() -> {
125 mTouchHandler.setPinnedStackController(controller);
126 });
127 }
128
129 @Override
Winson Chung2a82fe52017-02-02 14:43:34 -0800130 public void onImeVisibilityChanged(boolean imeVisible, int imeHeight) {
Winson Chunga29eb982016-12-14 12:01:27 -0800131 mHandler.post(() -> {
Winson Chung2a82fe52017-02-02 14:43:34 -0800132 mTouchHandler.onImeVisibilityChanged(imeVisible, imeHeight);
Winson Chunga29eb982016-12-14 12:01:27 -0800133 });
134 }
135
136 @Override
137 public void onMinimizedStateChanged(boolean isMinimized) {
138 mHandler.post(() -> {
Winson Chung2a82fe52017-02-02 14:43:34 -0800139 mTouchHandler.setMinimizedState(isMinimized, true /* fromController */);
Winson Chunga29eb982016-12-14 12:01:27 -0800140 });
141 }
142
143 @Override
Winson Chung2a82fe52017-02-02 14:43:34 -0800144 public void onMovementBoundsChanged(Rect insetBounds, Rect normalBounds,
Winson Chungbaa7b722017-03-03 21:33:44 -0800145 Rect animatingBounds, boolean fromImeAdjustement) {
Winson Chunga29eb982016-12-14 12:01:27 -0800146 mHandler.post(() -> {
Winson Chungbaa7b722017-03-03 21:33:44 -0800147 mTouchHandler.onMovementBoundsChanged(insetBounds, normalBounds, animatingBounds,
148 fromImeAdjustement);
Winson Chung2a82fe52017-02-02 14:43:34 -0800149 });
150 }
151
152 @Override
153 public void onActionsChanged(ParceledListSlice actions) {
154 mHandler.post(() -> {
155 mMenuController.setAppActions(actions);
Winson Chunga29eb982016-12-14 12:01:27 -0800156 });
157 }
158 }
159
Winson73bc1592016-10-18 18:47:43 -0700160 private PipManager() {}
161
162 /**
163 * Initializes {@link PipManager}.
164 */
165 public void initialize(Context context) {
166 mContext = context;
Sudheer Shankadc589ac2016-11-10 15:30:17 -0800167 mActivityManager = ActivityManager.getService();
Winson73bc1592016-10-18 18:47:43 -0700168 mWindowManager = WindowManagerGlobal.getWindowManagerService();
169
Winson Chunga29eb982016-12-14 12:01:27 -0800170 try {
171 mWindowManager.registerPinnedStackListener(DEFAULT_DISPLAY, mPinnedStackListener);
172 } catch (RemoteException e) {
173 Log.e(TAG, "Failed to register pinned stack listener", e);
174 }
Winson Chung929d4f72017-01-13 10:21:33 -0800175 SystemServicesProxy.getInstance(mContext).registerTaskStackListener(mTaskStackListener);
Winson Chunga29eb982016-12-14 12:01:27 -0800176
Winson Chungd2d90972017-02-28 11:40:41 -0800177 mInputConsumerController = new InputConsumerController(mWindowManager);
Winson Chung97a60d92017-01-18 16:01:53 -0800178 mMediaController = new PipMediaController(context, mActivityManager);
Winson Chungd2d90972017-02-28 11:40:41 -0800179 mMenuController = new PipMenuActivityController(context, mActivityManager, mMediaController,
180 mInputConsumerController);
181 mTouchHandler = new PipTouchHandler(context, mActivityManager, mMenuController,
182 mInputConsumerController);
Winson Chung664758c2017-03-28 21:03:52 -0700183 mNotificationController = new PipNotificationController(context, mActivityManager,
184 mTouchHandler.getMotionHelper());
Winson73bc1592016-10-18 18:47:43 -0700185 }
186
187 /**
188 * Updates the PIP per configuration changed.
189 */
Winson Chung303c6b72016-10-24 17:12:49 -0700190 public void onConfigurationChanged() {
191 mTouchHandler.onConfigurationChanged();
192 }
Winson73bc1592016-10-18 18:47:43 -0700193
194 /**
Winson Chungac52f282017-03-30 14:44:52 -0700195 * Sent from KEYCODE_WINDOW handler in PhoneWindowManager, to request the menu to be shown.
196 */
197 public void showPictureInPictureMenu() {
198 mTouchHandler.showPictureInPictureMenu();
199 }
200
201 /**
Winson73bc1592016-10-18 18:47:43 -0700202 * Gets an instance of {@link PipManager}.
203 */
204 public static PipManager getInstance() {
205 if (sPipController == null) {
206 sPipController = new PipManager();
207 }
208 return sPipController;
209 }
Winson Chung29a78652017-02-09 18:35:26 -0800210
211 public void dump(PrintWriter pw) {
212 final String innerPrefix = " ";
213 pw.println(TAG);
Winson Chungd2d90972017-02-28 11:40:41 -0800214 mInputConsumerController.dump(pw, innerPrefix);
Winson Chung29a78652017-02-09 18:35:26 -0800215 mMenuController.dump(pw, innerPrefix);
216 mTouchHandler.dump(pw, innerPrefix);
217 }
Winson73bc1592016-10-18 18:47:43 -0700218}