blob: 7e275d81031dc9075d8d57daf38c76c0782a2fab [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;
23import android.content.Context;
Winson Chunga29eb982016-12-14 12:01:27 -080024import android.content.pm.ParceledListSlice;
25import android.os.Handler;
26import android.os.RemoteException;
27import android.util.Log;
28import android.view.IPinnedStackController;
29import android.view.IPinnedStackListener;
Winson73bc1592016-10-18 18:47:43 -070030import android.view.IWindowManager;
31import android.view.WindowManagerGlobal;
32
33/**
34 * Manages the picture-in-picture (PIP) UI and states for Phones.
35 */
36public class PipManager {
37 private static final String TAG = "PipManager";
38
39 private static PipManager sPipController;
40
41 private Context mContext;
42 private IActivityManager mActivityManager;
43 private IWindowManager mWindowManager;
Winson Chunga29eb982016-12-14 12:01:27 -080044 private Handler mHandler = new Handler();
45
46 private final PinnedStackListener mPinnedStackListener = new PinnedStackListener();
Winson73bc1592016-10-18 18:47:43 -070047
Winson Chung15504af2016-11-02 18:11:36 -070048 private PipMenuActivityController mMenuController;
Winson73bc1592016-10-18 18:47:43 -070049 private PipTouchHandler mTouchHandler;
50
Winson Chunga29eb982016-12-14 12:01:27 -080051 /**
52 * Handler for messages from the PIP controller.
53 */
54 private class PinnedStackListener extends IPinnedStackListener.Stub {
55
56 @Override
57 public void onListenerRegistered(IPinnedStackController controller) {
58 mHandler.post(() -> {
59 mTouchHandler.setPinnedStackController(controller);
60 });
61 }
62
63 @Override
64 public void onBoundsChanged(boolean adjustedForIme) {
65 // Do nothing
66 }
67
68 @Override
69 public void onActionsChanged(ParceledListSlice actions) {
70 mHandler.post(() -> {
71 mMenuController.setActions(actions);
72 });
73 }
74
75 @Override
76 public void onMinimizedStateChanged(boolean isMinimized) {
77 mHandler.post(() -> {
78 mTouchHandler.onMinimizedStateChanged(isMinimized);
79 });
80 }
81
82 @Override
83 public void onSnapToEdgeStateChanged(boolean isSnapToEdge) {
84 mHandler.post(() -> {
85 mTouchHandler.onSnapToEdgeStateChanged(isSnapToEdge);
86 });
87 }
88 }
89
Winson73bc1592016-10-18 18:47:43 -070090 private PipManager() {}
91
92 /**
93 * Initializes {@link PipManager}.
94 */
95 public void initialize(Context context) {
96 mContext = context;
Sudheer Shankadc589ac2016-11-10 15:30:17 -080097 mActivityManager = ActivityManager.getService();
Winson73bc1592016-10-18 18:47:43 -070098 mWindowManager = WindowManagerGlobal.getWindowManagerService();
99
Winson Chunga29eb982016-12-14 12:01:27 -0800100 try {
101 mWindowManager.registerPinnedStackListener(DEFAULT_DISPLAY, mPinnedStackListener);
102 } catch (RemoteException e) {
103 Log.e(TAG, "Failed to register pinned stack listener", e);
104 }
105
Winson Chung15504af2016-11-02 18:11:36 -0700106 mMenuController = new PipMenuActivityController(context, mActivityManager, mWindowManager);
107 mTouchHandler = new PipTouchHandler(context, mMenuController, mActivityManager,
108 mWindowManager);
Winson73bc1592016-10-18 18:47:43 -0700109 }
110
111 /**
112 * Updates the PIP per configuration changed.
113 */
Winson Chung303c6b72016-10-24 17:12:49 -0700114 public void onConfigurationChanged() {
115 mTouchHandler.onConfigurationChanged();
116 }
Winson73bc1592016-10-18 18:47:43 -0700117
118 /**
119 * Gets an instance of {@link PipManager}.
120 */
121 public static PipManager getInstance() {
122 if (sPipController == null) {
123 sPipController = new PipManager();
124 }
125 return sPipController;
126 }
127}