blob: 583ce67e26d4e4f76e28b7a86a94cf95ebef15d2 [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;
18
19import static android.content.pm.PackageManager.FEATURE_LEANBACK_ONLY;
20import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
21
Dave Mankoffa5d8a392019-10-10 12:21:09 -040022import android.content.Context;
Winson73bc1592016-10-18 18:47:43 -070023import android.content.pm.PackageManager;
24import android.content.res.Configuration;
Winson Chung67f5c8b2018-09-24 12:09:19 -070025import android.os.UserHandle;
26import android.os.UserManager;
Gus Prevasab336792018-11-14 13:52:20 -050027
Winson73bc1592016-10-18 18:47:43 -070028import com.android.systemui.SystemUI;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000029import com.android.systemui.broadcast.BroadcastDispatcher;
Winson Chungac52f282017-03-30 14:44:52 -070030import com.android.systemui.statusbar.CommandQueue;
Gus Prevasab336792018-11-14 13:52:20 -050031
Winson Chung29a78652017-02-09 18:35:26 -080032import java.io.FileDescriptor;
33import java.io.PrintWriter;
34
Dave Mankoff33174bc2019-10-10 14:57:02 -040035import javax.inject.Inject;
36import javax.inject.Singleton;
37
Winson73bc1592016-10-18 18:47:43 -070038/**
39 * Controls the picture-in-picture window.
40 */
Dave Mankoff33174bc2019-10-10 14:57:02 -040041@Singleton
Winson Chungac52f282017-03-30 14:44:52 -070042public class PipUI extends SystemUI implements CommandQueue.Callbacks {
Winson73bc1592016-10-18 18:47:43 -070043
Dave Mankoffbcaca8a2019-10-31 18:04:08 -040044 private final CommandQueue mCommandQueue;
Winson Chung29a78652017-02-09 18:35:26 -080045 private BasePipManager mPipManager;
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000046 private final BroadcastDispatcher mBroadcastDispatcher;
Winson Chung29a78652017-02-09 18:35:26 -080047
Winson73bc1592016-10-18 18:47:43 -070048 private boolean mSupportsPip;
Winson73bc1592016-10-18 18:47:43 -070049
Dave Mankoff33174bc2019-10-10 14:57:02 -040050 @Inject
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000051 public PipUI(Context context, CommandQueue commandQueue,
52 BroadcastDispatcher broadcastDispatcher) {
Dave Mankoffa5d8a392019-10-10 12:21:09 -040053 super(context);
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000054 mBroadcastDispatcher = broadcastDispatcher;
Dave Mankoffbcaca8a2019-10-31 18:04:08 -040055 mCommandQueue = commandQueue;
Dave Mankoffa5d8a392019-10-10 12:21:09 -040056 }
57
Winson73bc1592016-10-18 18:47:43 -070058 @Override
59 public void start() {
60 PackageManager pm = mContext.getPackageManager();
61 mSupportsPip = pm.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE);
Winson73bc1592016-10-18 18:47:43 -070062 if (!mSupportsPip) {
63 return;
64 }
Winson Chung29a78652017-02-09 18:35:26 -080065
Winson Chung853c99a2017-03-21 22:16:42 -070066 // Ensure that we are the primary user's SystemUI.
Winson Chung67f5c8b2018-09-24 12:09:19 -070067 final int processUser = UserManager.get(mContext).getUserHandle();
68 if (processUser != UserHandle.USER_SYSTEM) {
Winson Chung853c99a2017-03-21 22:16:42 -070069 throw new IllegalStateException("Non-primary Pip component not currently supported.");
70 }
71
Winson Chung29a78652017-02-09 18:35:26 -080072 mPipManager = pm.hasSystemFeature(FEATURE_LEANBACK_ONLY)
73 ? com.android.systemui.pip.tv.PipManager.getInstance()
74 : com.android.systemui.pip.phone.PipManager.getInstance();
Fabian Kozynski5ca7a512019-10-16 19:56:11 +000075 mPipManager.initialize(mContext, mBroadcastDispatcher);
Winson Chungac52f282017-03-30 14:44:52 -070076
Dave Mankoffbcaca8a2019-10-31 18:04:08 -040077 mCommandQueue.addCallback(this);
Winson Chungac52f282017-03-30 14:44:52 -070078 }
79
80 @Override
81 public void showPictureInPictureMenu() {
82 mPipManager.showPictureInPictureMenu();
Winson73bc1592016-10-18 18:47:43 -070083 }
84
Winson Chung67f5c8b2018-09-24 12:09:19 -070085 public void expandPip() {
Winson Chung2dbcf092018-10-24 13:00:41 -070086 mPipManager.expandPip();
87 }
88
89 public void hidePipMenu(Runnable onStartCallback, Runnable onEndCallback) {
90 mPipManager.hidePipMenu(onStartCallback, onEndCallback);
Winson Chung67f5c8b2018-09-24 12:09:19 -070091 }
92
Winson73bc1592016-10-18 18:47:43 -070093 @Override
94 protected void onConfigurationChanged(Configuration newConfig) {
95 super.onConfigurationChanged(newConfig);
Winson Chung29a78652017-02-09 18:35:26 -080096 if (mPipManager == null) {
Winson73bc1592016-10-18 18:47:43 -070097 return;
98 }
Winson Chung29a78652017-02-09 18:35:26 -080099
Winson Chung0c5a5922017-05-22 17:41:06 -0700100 mPipManager.onConfigurationChanged(newConfig);
Winson Chung29a78652017-02-09 18:35:26 -0800101 }
102
Hongwei Wang9b751802019-09-11 12:13:21 -0700103 public void setShelfHeight(boolean visible, int height) {
104 if (mPipManager == null) {
105 return;
106 }
107
108 mPipManager.setShelfHeight(visible, height);
109 }
110
Winson Chung29a78652017-02-09 18:35:26 -0800111 @Override
112 public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
113 if (mPipManager == null) {
114 return;
Winson73bc1592016-10-18 18:47:43 -0700115 }
Winson Chung29a78652017-02-09 18:35:26 -0800116
117 mPipManager.dump(pw);
Winson73bc1592016-10-18 18:47:43 -0700118 }
119}