blob: fb7fa4de088f43d6cf1c3c1c5c1923637f10d7b1 [file] [log] [blame]
Youngsang Chof1647922015-12-17 13:39:39 -08001/*
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.tv.pip;
18
19import android.app.Activity;
20import android.media.session.MediaController;
Jaewan Kim62338192016-02-25 10:00:05 -080021import android.media.session.PlaybackState;
Youngsang Chof1647922015-12-17 13:39:39 -080022import android.os.Bundle;
Youngsang Chof1647922015-12-17 13:39:39 -080023import android.view.View;
Jaewan Kim62338192016-02-25 10:00:05 -080024import android.widget.ImageView;
25import android.widget.TextView;
Youngsang Chof1647922015-12-17 13:39:39 -080026
27import com.android.systemui.R;
28
Jaewan Kim62338192016-02-25 10:00:05 -080029import static android.content.pm.PackageManager.FEATURE_LEANBACK;
30import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
31import static android.media.session.PlaybackState.ACTION_PAUSE;
32import static android.media.session.PlaybackState.ACTION_PLAY;
33
Youngsang Chof1647922015-12-17 13:39:39 -080034/**
35 * Activity to show the PIP menu to control PIP.
36 */
37public class PipMenuActivity extends Activity implements PipManager.Listener {
38 private static final String TAG = "PipMenuActivity";
Youngsang Chof1647922015-12-17 13:39:39 -080039
40 private final PipManager mPipManager = PipManager.getInstance();
41 private MediaController mMediaController;
42
Jaewan Kim1a9dc562016-02-17 13:41:51 -080043 private View mFullButtonView;
44 private View mFullDescriptionView;
Jaewan Kim62338192016-02-25 10:00:05 -080045 private View mPlayPauseView;
46 private ImageView mPlayPauseButtonImageView;
47 private TextView mPlayPauseDescriptionTextView;
Jaewan Kim1a9dc562016-02-17 13:41:51 -080048 private View mCloseButtonView;
49 private View mCloseDescriptionView;
50
Jaewan Kim62338192016-02-25 10:00:05 -080051 private MediaController.Callback mMediaControllerCallback = new MediaController.Callback() {
52 @Override
53 public void onPlaybackStateChanged(PlaybackState state) {
54 updatePlayPauseView(state);
55 }
56 };
57
Youngsang Chof1647922015-12-17 13:39:39 -080058 @Override
59 protected void onCreate(Bundle bundle) {
60 super.onCreate(bundle);
61 setContentView(R.layout.tv_pip_menu);
62 mPipManager.addListener(this);
Jaewan Kim62338192016-02-25 10:00:05 -080063 mFullButtonView = findViewById(R.id.full_button);
Jaewan Kim1a9dc562016-02-17 13:41:51 -080064 mFullDescriptionView = findViewById(R.id.full_desc);
65 mFullButtonView.setOnClickListener(new View.OnClickListener() {
Youngsang Chof1647922015-12-17 13:39:39 -080066 @Override
67 public void onClick(View v) {
68 mPipManager.movePipToFullscreen();
Jaewan Kim1a9dc562016-02-17 13:41:51 -080069 finish();
Youngsang Chof1647922015-12-17 13:39:39 -080070 }
71 });
Jaewan Kim1a9dc562016-02-17 13:41:51 -080072 mFullButtonView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
73 @Override
74 public void onFocusChange(View v, boolean hasFocus) {
75 mFullDescriptionView.setVisibility(hasFocus ? View.VISIBLE : View.INVISIBLE);
76 }
77 });
78
Jaewan Kim62338192016-02-25 10:00:05 -080079 mPlayPauseView = findViewById(R.id.play_pause);
80 mPlayPauseButtonImageView = (ImageView) findViewById(R.id.play_pause_button);
81 mPlayPauseDescriptionTextView = (TextView) findViewById(R.id.play_pause_desc);
82 mPlayPauseButtonImageView.setOnClickListener(new View.OnClickListener() {
Jaewan Kim1a9dc562016-02-17 13:41:51 -080083 @Override
84 public void onClick(View v) {
Jaewan Kim62338192016-02-25 10:00:05 -080085 if (mMediaController == null || mMediaController.getPlaybackState() == null) {
86 return;
87 }
88 long actions = mMediaController.getPlaybackState().getActions();
89 int state = mMediaController.getPlaybackState().getState();
90 if (((actions & ACTION_PLAY) != 0) && !isPlaying(state)) {
91 mMediaController.getTransportControls().play();
92 } else if ((actions & ACTION_PAUSE) != 0 && isPlaying(state)) {
93 mMediaController.getTransportControls().pause();
94 }
95 // View will be updated later in {@link mMediaControllerCallback}
Jaewan Kim1a9dc562016-02-17 13:41:51 -080096 }
97 });
Jaewan Kim62338192016-02-25 10:00:05 -080098 mPlayPauseButtonImageView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
Jaewan Kim1a9dc562016-02-17 13:41:51 -080099 @Override
100 public void onFocusChange(View v, boolean hasFocus) {
Jaewan Kim62338192016-02-25 10:00:05 -0800101 mPlayPauseDescriptionTextView.setVisibility(hasFocus ? View.VISIBLE : View.INVISIBLE);
Jaewan Kim1a9dc562016-02-17 13:41:51 -0800102 }
103 });
104
Jaewan Kim62338192016-02-25 10:00:05 -0800105 mCloseButtonView = findViewById(R.id.close_button);
Jaewan Kim1a9dc562016-02-17 13:41:51 -0800106 mCloseDescriptionView = findViewById(R.id.close_desc);
107 mCloseButtonView.setOnClickListener(new View.OnClickListener() {
Youngsang Chof1647922015-12-17 13:39:39 -0800108 @Override
109 public void onClick(View v) {
110 mPipManager.closePip();
111 finish();
112 }
113 });
Jaewan Kim1a9dc562016-02-17 13:41:51 -0800114 mCloseButtonView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
Youngsang Chof1647922015-12-17 13:39:39 -0800115 @Override
Jaewan Kim1a9dc562016-02-17 13:41:51 -0800116 public void onFocusChange(View v, boolean hasFocus) {
117 mCloseDescriptionView.setVisibility(hasFocus ? View.VISIBLE : View.INVISIBLE);
Youngsang Chof1647922015-12-17 13:39:39 -0800118 }
119 });
Jaewan Kim62338192016-02-25 10:00:05 -0800120 updateMediaController();
121 }
122
123 private void updateMediaController() {
124 MediaController newController = mPipManager.getMediaController();
125 if (mMediaController == newController) {
126 return;
127 }
128 if (mMediaController != null) {
129 mMediaController.unregisterCallback(mMediaControllerCallback);
130 }
131 mMediaController = newController;
132 if (mMediaController != null) {
133 mMediaController.registerCallback(mMediaControllerCallback);
134 updatePlayPauseView(mMediaController.getPlaybackState());
135 } else {
136 updatePlayPauseView(null);
137 }
138 }
139
140 private void updatePlayPauseView(PlaybackState playbackState) {
141 if (playbackState != null
142 && (playbackState.getActions() & (ACTION_PLAY | ACTION_PAUSE)) != 0) {
143 mPlayPauseView.setVisibility(View.VISIBLE);
144 if (isPlaying(playbackState.getState())) {
145 mPlayPauseButtonImageView.setImageResource(R.drawable.tv_pip_pause_button);
146 mPlayPauseDescriptionTextView.setText(R.string.pip_pause);
147 } else {
148 mPlayPauseButtonImageView.setImageResource(R.drawable.tv_pip_play_button);
149 mPlayPauseDescriptionTextView.setText(R.string.pip_play);
150 }
151 } else {
152 mPlayPauseView.setVisibility(View.GONE);
153 }
154 }
155
156 private boolean isPlaying(int state) {
157 return state == PlaybackState.STATE_BUFFERING
158 || state == PlaybackState.STATE_CONNECTING
159 || state == PlaybackState.STATE_PLAYING
160 || state == PlaybackState.STATE_FAST_FORWARDING
161 || state == PlaybackState.STATE_REWINDING
162 || state == PlaybackState.STATE_SKIPPING_TO_PREVIOUS
163 || state == PlaybackState.STATE_SKIPPING_TO_NEXT;
Youngsang Chof1647922015-12-17 13:39:39 -0800164 }
165
Jaewan Kim9c23b282016-02-25 20:04:12 -0800166 private void restorePipAndFinish() {
167 mPipManager.resizePinnedStack(PipManager.STATE_PIP_OVERLAY);
168 finish();
169 }
170
171 @Override
172 public void onPause() {
173 super.onPause();
174 restorePipAndFinish();
175 }
176
Youngsang Chof1647922015-12-17 13:39:39 -0800177 @Override
178 protected void onDestroy() {
Youngsang Chof1647922015-12-17 13:39:39 -0800179 super.onDestroy();
Jaewan Kim62338192016-02-25 10:00:05 -0800180 if (mMediaController != null) {
181 mMediaController.unregisterCallback(mMediaControllerCallback);
182 }
Wale Ogunwale480dca02016-02-06 13:58:29 -0800183 mPipManager.removeListener(this);
184 mPipManager.resumePipResizing(
185 PipManager.SUSPEND_PIP_RESIZE_REASON_WAITING_FOR_MENU_ACTIVITY_FINISH);
Youngsang Chof1647922015-12-17 13:39:39 -0800186 }
187
188 @Override
189 public void onBackPressed() {
Jaewan Kim9c23b282016-02-25 20:04:12 -0800190 restorePipAndFinish();
Youngsang Chof1647922015-12-17 13:39:39 -0800191 }
192
193 @Override
194 public void onPipActivityClosed() {
195 finish();
196 }
197
198 @Override
199 public void onShowPipMenu() { }
200
201 @Override
202 public void onMoveToFullscreen() {
203 finish();
204 }
Wale Ogunwale480dca02016-02-06 13:58:29 -0800205
206 @Override
Jaewan Kim62338192016-02-25 10:00:05 -0800207 public void onMediaControllerChanged() {
208 updateMediaController();
209 }
210
211 @Override
Wale Ogunwale480dca02016-02-06 13:58:29 -0800212 public void onPipResizeAboutToStart() {
213 finish();
214 mPipManager.suspendPipResizing(
215 PipManager.SUSPEND_PIP_RESIZE_REASON_WAITING_FOR_MENU_ACTIVITY_FINISH);
216 }
Youngsang Chof1647922015-12-17 13:39:39 -0800217}