blob: 4c5d8a12a8721752e5c37287b86779f0987e145a [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;
38
Winson Chung29a78652017-02-09 18:35:26 -080039import java.io.PrintWriter;
40
Winson73bc1592016-10-18 18:47:43 -070041/**
42 * Manages the picture-in-picture (PIP) UI and states for Phones.
43 */
Winson Chung29a78652017-02-09 18:35:26 -080044public class PipManager implements BasePipManager {
Winson73bc1592016-10-18 18:47:43 -070045 private static final String TAG = "PipManager";
46
47 private static PipManager sPipController;
48
49 private Context mContext;
50 private IActivityManager mActivityManager;
51 private IWindowManager mWindowManager;
Winson Chunga29eb982016-12-14 12:01:27 -080052 private Handler mHandler = new Handler();
53
54 private final PinnedStackListener mPinnedStackListener = new PinnedStackListener();
Winson73bc1592016-10-18 18:47:43 -070055
Winson Chungd2d90972017-02-28 11:40:41 -080056 private InputConsumerController mInputConsumerController;
Winson Chung15504af2016-11-02 18:11:36 -070057 private PipMenuActivityController mMenuController;
Winson Chung97a60d92017-01-18 16:01:53 -080058 private PipMediaController mMediaController;
Winson73bc1592016-10-18 18:47:43 -070059 private PipTouchHandler mTouchHandler;
60
Winson Chunga29eb982016-12-14 12:01:27 -080061 /**
Winson Chung929d4f72017-01-13 10:21:33 -080062 * Handler for system task stack changes.
63 */
64 TaskStackListener mTaskStackListener = new TaskStackListener() {
65 @Override
66 public void onActivityPinned() {
Winson Chung3535df22017-01-17 18:43:39 -080067 if (!checkCurrentUserId(false /* debug */)) {
68 return;
69 }
Winson Chung929d4f72017-01-13 10:21:33 -080070 mTouchHandler.onActivityPinned();
Winson Chung97a60d92017-01-18 16:01:53 -080071 mMediaController.onActivityPinned();
Winson Chungd2d90972017-02-28 11:40:41 -080072 mMenuController.onActivityPinned();
Winson Chung929d4f72017-01-13 10:21:33 -080073 }
74
75 @Override
Winson Chung85d39982017-02-24 15:21:25 -080076 public void onPinnedStackAnimationStarted() {
77 // Disable touches while the animation is running
78 mTouchHandler.setTouchEnabled(false);
79 }
80
81 @Override
Winson Chung929d4f72017-01-13 10:21:33 -080082 public void onPinnedStackAnimationEnded() {
Winson Chung85d39982017-02-24 15:21:25 -080083 // Re-enable touches after the animation completes
84 mTouchHandler.setTouchEnabled(true);
Winson Chung929d4f72017-01-13 10:21:33 -080085 }
86
87 @Override
Winson Chungd95687c2017-03-03 12:06:21 -080088 public void onPinnedActivityRestartAttempt() {
Winson Chung3535df22017-01-17 18:43:39 -080089 if (!checkCurrentUserId(false /* debug */)) {
90 return;
91 }
92
Winson Chungd95687c2017-03-03 12:06:21 -080093 mTouchHandler.getMotionHelper().expandPip();
Winson Chung929d4f72017-01-13 10:21:33 -080094 }
95 };
96
97 /**
Winson Chunga29eb982016-12-14 12:01:27 -080098 * Handler for messages from the PIP controller.
99 */
100 private class PinnedStackListener extends IPinnedStackListener.Stub {
101
102 @Override
103 public void onListenerRegistered(IPinnedStackController controller) {
104 mHandler.post(() -> {
105 mTouchHandler.setPinnedStackController(controller);
106 });
107 }
108
109 @Override
Winson Chung2a82fe52017-02-02 14:43:34 -0800110 public void onImeVisibilityChanged(boolean imeVisible, int imeHeight) {
Winson Chunga29eb982016-12-14 12:01:27 -0800111 mHandler.post(() -> {
Winson Chung2a82fe52017-02-02 14:43:34 -0800112 mTouchHandler.onImeVisibilityChanged(imeVisible, imeHeight);
Winson Chunga29eb982016-12-14 12:01:27 -0800113 });
114 }
115
116 @Override
117 public void onMinimizedStateChanged(boolean isMinimized) {
118 mHandler.post(() -> {
Winson Chung2a82fe52017-02-02 14:43:34 -0800119 mTouchHandler.setMinimizedState(isMinimized, true /* fromController */);
Winson Chunga29eb982016-12-14 12:01:27 -0800120 });
121 }
122
123 @Override
Winson Chung2a82fe52017-02-02 14:43:34 -0800124 public void onMovementBoundsChanged(Rect insetBounds, Rect normalBounds,
125 boolean fromImeAdjustement) {
Winson Chunga29eb982016-12-14 12:01:27 -0800126 mHandler.post(() -> {
Winson Chung2a82fe52017-02-02 14:43:34 -0800127 mTouchHandler.onMovementBoundsChanged(insetBounds, normalBounds, fromImeAdjustement);
128 });
129 }
130
131 @Override
132 public void onActionsChanged(ParceledListSlice actions) {
133 mHandler.post(() -> {
134 mMenuController.setAppActions(actions);
Winson Chunga29eb982016-12-14 12:01:27 -0800135 });
136 }
137 }
138
Winson73bc1592016-10-18 18:47:43 -0700139 private PipManager() {}
140
141 /**
142 * Initializes {@link PipManager}.
143 */
144 public void initialize(Context context) {
145 mContext = context;
Sudheer Shankadc589ac2016-11-10 15:30:17 -0800146 mActivityManager = ActivityManager.getService();
Winson73bc1592016-10-18 18:47:43 -0700147 mWindowManager = WindowManagerGlobal.getWindowManagerService();
148
Winson Chunga29eb982016-12-14 12:01:27 -0800149 try {
150 mWindowManager.registerPinnedStackListener(DEFAULT_DISPLAY, mPinnedStackListener);
151 } catch (RemoteException e) {
152 Log.e(TAG, "Failed to register pinned stack listener", e);
153 }
Winson Chung929d4f72017-01-13 10:21:33 -0800154 SystemServicesProxy.getInstance(mContext).registerTaskStackListener(mTaskStackListener);
Winson Chunga29eb982016-12-14 12:01:27 -0800155
Winson Chungd2d90972017-02-28 11:40:41 -0800156 mInputConsumerController = new InputConsumerController(mWindowManager);
Winson Chung97a60d92017-01-18 16:01:53 -0800157 mMediaController = new PipMediaController(context, mActivityManager);
Winson Chungd2d90972017-02-28 11:40:41 -0800158 mMenuController = new PipMenuActivityController(context, mActivityManager, mMediaController,
159 mInputConsumerController);
160 mTouchHandler = new PipTouchHandler(context, mActivityManager, mMenuController,
161 mInputConsumerController);
Winson73bc1592016-10-18 18:47:43 -0700162 }
163
164 /**
165 * Updates the PIP per configuration changed.
166 */
Winson Chung303c6b72016-10-24 17:12:49 -0700167 public void onConfigurationChanged() {
168 mTouchHandler.onConfigurationChanged();
169 }
Winson73bc1592016-10-18 18:47:43 -0700170
171 /**
172 * Gets an instance of {@link PipManager}.
173 */
174 public static PipManager getInstance() {
175 if (sPipController == null) {
176 sPipController = new PipManager();
177 }
178 return sPipController;
179 }
Winson Chung29a78652017-02-09 18:35:26 -0800180
181 public void dump(PrintWriter pw) {
182 final String innerPrefix = " ";
183 pw.println(TAG);
Winson Chungd2d90972017-02-28 11:40:41 -0800184 mInputConsumerController.dump(pw, innerPrefix);
Winson Chung29a78652017-02-09 18:35:26 -0800185 mMenuController.dump(pw, innerPrefix);
186 mTouchHandler.dump(pw, innerPrefix);
187 }
Winson73bc1592016-10-18 18:47:43 -0700188}