Merge "Ensure we show the PiP menu in response to KEYCODE_WINDOW." into oc-dev
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 586b3b2..a2ff4f7 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -271,7 +271,7 @@
/**
* Called by System UI to notify of changes to the visibility of PIP.
*/
- oneway void setTvPipVisibility(boolean visible);
+ oneway void setPipVisibility(boolean visible);
/**
* Device has a software navigation bar (separate from the status bar).
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 2617d45..bb6e0ee 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -1517,7 +1517,7 @@
/**
* Called by System UI to notify of changes to the visibility of PIP.
*/
- public void setTvPipVisibilityLw(boolean visible);
+ void setPipVisibilityLw(boolean visible);
/**
* Specifies whether there is an on-screen navigation bar separate from the status bar.
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index 21e39f6..7d9538f 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -102,9 +102,9 @@
void onCameraLaunchGestureDetected(int source);
/**
- * Shows the TV's picture-in-picture menu if an activity is in picture-in-picture mode.
+ * Shows the picture-in-picture menu if an activity is in picture-in-picture mode.
*/
- void showTvPictureInPictureMenu();
+ void showPictureInPictureMenu();
/**
* Shows the global actions menu.
diff --git a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
index 69541ec..68c8007 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
@@ -22,6 +22,7 @@
public interface BasePipManager {
void initialize(Context context);
+ void showPictureInPictureMenu();
void onConfigurationChanged();
void dump(PrintWriter pw);
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
index 9a8090d..a1f6553 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
@@ -24,6 +24,7 @@
import com.android.systemui.SystemUI;
import com.android.systemui.recents.misc.SystemServicesProxy;
+import com.android.systemui.statusbar.CommandQueue;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -31,7 +32,7 @@
/**
* Controls the picture-in-picture window.
*/
-public class PipUI extends SystemUI {
+public class PipUI extends SystemUI implements CommandQueue.Callbacks {
private BasePipManager mPipManager;
@@ -55,6 +56,13 @@
? com.android.systemui.pip.tv.PipManager.getInstance()
: com.android.systemui.pip.phone.PipManager.getInstance();
mPipManager.initialize(mContext);
+
+ getComponent(CommandQueue.class).addCallbacks(this);
+ }
+
+ @Override
+ public void showPictureInPictureMenu() {
+ mPipManager.showPictureInPictureMenu();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
index 87f8ddb..114a594 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
@@ -35,6 +35,7 @@
import com.android.systemui.pip.BasePipManager;
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.recents.misc.SystemServicesProxy.TaskStackListener;
+import com.android.systemui.statusbar.CommandQueue;
import java.io.PrintWriter;
@@ -73,6 +74,8 @@
mMediaController.onActivityPinned();
mMenuController.onActivityPinned();
mNotificationController.onActivityPinned(packageName);
+
+ SystemServicesProxy.getInstance(mContext).setPipVisibility(true);
}
@Override
@@ -81,7 +84,11 @@
return;
}
- mNotificationController.onActivityUnpinned();
+ ComponentName topPipActivity = PipUtils.getTopPinnedActivity(mContext,
+ mActivityManager);
+ mNotificationController.onActivityUnpinned(topPipActivity);
+
+ SystemServicesProxy.getInstance(mContext).setPipVisibility(topPipActivity != null);
}
@Override
@@ -94,6 +101,7 @@
public void onPinnedStackAnimationEnded() {
// Re-enable touches after the animation completes
mTouchHandler.setTouchEnabled(true);
+ mTouchHandler.onPinnedStackAnimationEnded();
}
@Override
@@ -184,6 +192,13 @@
}
/**
+ * Sent from KEYCODE_WINDOW handler in PhoneWindowManager, to request the menu to be shown.
+ */
+ public void showPictureInPictureMenu() {
+ mTouchHandler.showPictureInPictureMenu();
+ }
+
+ /**
* Gets an instance of {@link PipManager}.
*/
public static PipManager getInstance() {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipNotificationController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipNotificationController.java
index db83b8b..53746e2 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipNotificationController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipNotificationController.java
@@ -110,11 +110,10 @@
registerAppOpsListener(packageName);
}
- public void onActivityUnpinned() {
+ public void onActivityUnpinned(ComponentName topPipActivity) {
// Unregister for changes to the previously PiP'ed package
unregisterAppOpsListener();
- ComponentName topPipActivity = PipUtils.getTopPinnedActivity(mContext, mActivityManager);
if (topPipActivity != null) {
onActivityPinned(topPipActivity.getPackageName());
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
index 6ade571..d68836c 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -188,6 +188,14 @@
mTouchState.setAllowTouches(enabled);
}
+ public void showPictureInPictureMenu() {
+ // Only show the menu if the user isn't currently interacting with the PiP
+ if (!mTouchState.isUserInteracting()) {
+ mMenuController.showMenu(mMotionHelper.getBounds(), mMovementBounds,
+ false /* allowMenuTimeout */);
+ }
+ }
+
public void onActivityPinned() {
// Reset some states once we are pinned
if (mIsMenuVisible) {
@@ -199,6 +207,11 @@
mDismissViewController.destroyDismissTarget();
}
+ public void onPinnedStackAnimationEnded() {
+ // Always synchronize the motion helper bounds once PiP animations finish
+ mMotionHelper.synchronizePinnedStackBounds();
+ }
+
@Override
public void onTuningChanged(String key, String newValue) {
if (newValue == null) {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
index b96b0ae..dd8cd2b 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
@@ -35,11 +35,9 @@
import android.os.Handler;
import android.os.RemoteException;
import android.os.SystemProperties;
-import android.os.UserHandle;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
-import android.view.Display;
import android.view.IPinnedStackController;
import android.view.IPinnedStackListener;
import android.view.IWindowManager;
@@ -281,7 +279,7 @@
/**
* Shows the picture-in-picture menu if an activity is in picture-in-picture mode.
*/
- public void showTvPictureInPictureMenu() {
+ public void showPictureInPictureMenu() {
if (mState == STATE_PIP_OVERLAY) {
resizePinnedStack(STATE_PIP_MENU);
}
@@ -721,7 +719,7 @@
}
private void updatePipVisibility(final boolean visible) {
- SystemServicesProxy.getInstance(mContext).setTvPipVisibility(visible);
+ SystemServicesProxy.getInstance(mContext).setPipVisibility(visible);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index 9b75f01..1c71da0 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -1215,9 +1215,9 @@
/**
* Updates the visibility of the picture-in-picture.
*/
- public void setTvPipVisibility(boolean visible) {
+ public void setPipVisibility(boolean visible) {
try {
- mIwm.setTvPipVisibility(visible);
+ mIwm.setPipVisibility(visible);
} catch (RemoteException e) {
Log.e(TAG, "Unable to reach window manager", e);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 73bf454..5c9360a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -70,7 +70,7 @@
private static final int MSG_START_ASSIST = 23 << MSG_SHIFT;
private static final int MSG_CAMERA_LAUNCH_GESTURE = 24 << MSG_SHIFT;
private static final int MSG_TOGGLE_KEYBOARD_SHORTCUTS = 25 << MSG_SHIFT;
- private static final int MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU = 26 << MSG_SHIFT;
+ private static final int MSG_SHOW_PICTURE_IN_PICTURE_MENU = 26 << MSG_SHIFT;
private static final int MSG_ADD_QS_TILE = 27 << MSG_SHIFT;
private static final int MSG_REMOVE_QS_TILE = 28 << MSG_SHIFT;
private static final int MSG_CLICK_QS_TILE = 29 << MSG_SHIFT;
@@ -128,7 +128,7 @@
default void showAssistDisclosure() { }
default void startAssist(Bundle args) { }
default void onCameraLaunchGestureDetected(int source) { }
- default void showTvPictureInPictureMenu() { }
+ default void showPictureInPictureMenu() { }
default void addQsTile(ComponentName tile) { }
default void remQsTile(ComponentName tile) { }
@@ -307,10 +307,10 @@
}
@Override
- public void showTvPictureInPictureMenu() {
+ public void showPictureInPictureMenu() {
synchronized (mLock) {
- mHandler.removeMessages(MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU);
- mHandler.obtainMessage(MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU).sendToTarget();
+ mHandler.removeMessages(MSG_SHOW_PICTURE_IN_PICTURE_MENU);
+ mHandler.obtainMessage(MSG_SHOW_PICTURE_IN_PICTURE_MENU).sendToTarget();
}
}
@@ -570,9 +570,9 @@
mCallbacks.get(i).onCameraLaunchGestureDetected(msg.arg1);
}
break;
- case MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU:
+ case MSG_SHOW_PICTURE_IN_PICTURE_MENU:
for (int i = 0; i < mCallbacks.size(); i++) {
- mCallbacks.get(i).showTvPictureInPictureMenu();
+ mCallbacks.get(i).showPictureInPictureMenu();
}
break;
case MSG_ADD_QS_TILE:
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index e1fceb6..9a71ed7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -138,6 +138,7 @@
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.fragments.PluginFragmentListener;
import com.android.systemui.keyguard.KeyguardViewMediator;
+import com.android.systemui.pip.phone.PipManager;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.statusbar.NotificationSwipeActionHelper.SnoozeOption;
@@ -4947,11 +4948,6 @@
}
}
- @Override
- public void showTvPictureInPictureMenu() {
- // no-op.
- }
-
public void notifyFpAuthModeChanged() {
updateDozing();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
index 5d11ef3..b5d92a5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
@@ -16,13 +16,11 @@
package com.android.systemui.statusbar.tv;
-import android.content.ComponentName;
import android.content.Context;
import android.graphics.Rect;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.service.notification.NotificationListenerService.RankingMap;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.StatusBarIcon;
@@ -42,11 +40,6 @@
private IStatusBarService mBarService;
@Override
- public void showTvPictureInPictureMenu() {
- PipManager.getInstance().showTvPictureInPictureMenu();
- }
-
- @Override
public void start() {
putComponent(TvStatusBar.class, this);
CommandQueue commandQueue = getComponent(CommandQueue.class);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
index 930e560..c13d13b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
@@ -229,10 +229,10 @@
}
@Test
- public void testShowTvPipMenu() {
- mCommandQueue.showTvPictureInPictureMenu();
+ public void testShowPipMenu() {
+ mCommandQueue.showPictureInPictureMenu();
waitForIdleSync();
- verify(mCallbacks).showTvPictureInPictureMenu();
+ verify(mCallbacks).showPictureInPictureMenu();
}
@Test
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 52f6955..b507df0 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -508,7 +508,7 @@
volatile boolean mCameraGestureTriggeredDuringGoingToSleep;
volatile boolean mGoingToSleep;
volatile boolean mRecentsVisible;
- volatile boolean mTvPictureInPictureVisible;
+ volatile boolean mPictureInPictureVisible;
// Written by vr manager thread, only read in this class
volatile boolean mPersistentVrModeEnabled;
@@ -813,7 +813,7 @@
private static final int MSG_POWER_LONG_PRESS = 14;
private static final int MSG_UPDATE_DREAMING_SLEEP_TOKEN = 15;
private static final int MSG_REQUEST_TRANSIENT_BARS = 16;
- private static final int MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU = 17;
+ private static final int MSG_SHOW_PICTURE_IN_PICTURE_MENU = 17;
private static final int MSG_BACK_LONG_PRESS = 18;
private static final int MSG_DISPOSE_INPUT_CONSUMER = 19;
private static final int MSG_BACK_DELAYED_PRESS = 20;
@@ -880,8 +880,8 @@
requestTransientBars(targetBar);
}
break;
- case MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU:
- showTvPictureInPictureMenuInternal();
+ case MSG_SHOW_PICTURE_IN_PICTURE_MENU:
+ showPictureInPictureMenuInternal();
break;
case MSG_BACK_LONG_PRESS:
backLongPress();
@@ -1726,18 +1726,18 @@
}
}
- private void showTvPictureInPictureMenu(KeyEvent event) {
- if (DEBUG_INPUT) Log.d(TAG, "showTvPictureInPictureMenu event=" + event);
- mHandler.removeMessages(MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU);
- Message msg = mHandler.obtainMessage(MSG_SHOW_TV_PICTURE_IN_PICTURE_MENU);
+ private void showPictureInPictureMenu(KeyEvent event) {
+ if (DEBUG_INPUT) Log.d(TAG, "showPictureInPictureMenu event=" + event);
+ mHandler.removeMessages(MSG_SHOW_PICTURE_IN_PICTURE_MENU);
+ Message msg = mHandler.obtainMessage(MSG_SHOW_PICTURE_IN_PICTURE_MENU);
msg.setAsynchronous(true);
msg.sendToTarget();
}
- private void showTvPictureInPictureMenuInternal() {
+ private void showPictureInPictureMenuInternal() {
StatusBarManagerInternal statusbar = getStatusBarManagerInternal();
if (statusbar != null) {
- statusbar.showTvPictureInPictureMenu();
+ statusbar.showPictureInPictureMenu();
}
}
@@ -4115,8 +4115,8 @@
}
@Override
- public void setTvPipVisibilityLw(boolean visible) {
- mTvPictureInPictureVisible = visible;
+ public void setPipVisibilityLw(boolean visible) {
+ mPictureInPictureVisible = visible;
}
@Override
@@ -6049,13 +6049,12 @@
}
case KeyEvent.KEYCODE_WINDOW: {
if (mShortPressWindowBehavior == SHORT_PRESS_WINDOW_PICTURE_IN_PICTURE) {
- if (mTvPictureInPictureVisible) {
- // Consumes the key only if picture-in-picture is visible
- // to show picture-in-picture control menu.
- // This gives a chance to the foreground activity
- // to customize PIP key behavior.
+ if (mPictureInPictureVisible) {
+ // Consumes the key only if picture-in-picture is visible to show
+ // picture-in-picture control menu. This gives a chance to the foreground
+ // activity to customize PIP key behavior.
if (!down) {
- showTvPictureInPictureMenu(event);
+ showPictureInPictureMenu(event);
}
result &= ~ACTION_PASS_TO_USER;
}
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
index 135b20d..5e322da 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
@@ -38,9 +38,9 @@
void toggleKeyboardShortcutsMenu(int deviceId);
/**
- * Show TV picture-in-picture menu.
+ * Show picture-in-picture menu.
*/
- void showTvPictureInPictureMenu();
+ void showPictureInPictureMenu();
void setWindowState(int window, int state);
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index aaaa080..83ea075 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -266,10 +266,10 @@
}
@Override
- public void showTvPictureInPictureMenu() {
+ public void showPictureInPictureMenu() {
if (mBar != null) {
try {
- mBar.showTvPictureInPictureMenu();
+ mBar.showPictureInPictureMenu();
} catch (RemoteException ex) {}
}
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 0dc74d7..6c7da50 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -6040,7 +6040,7 @@
}
@Override
- public void setTvPipVisibility(boolean visible) {
+ public void setPipVisibility(boolean visible) {
if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.STATUS_BAR)
!= PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Caller does not hold permission "
@@ -6048,7 +6048,7 @@
}
synchronized (mWindowMap) {
- mPolicy.setTvPipVisibilityLw(visible);
+ mPolicy.setPipVisibilityLw(visible);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
index 0971bb6..0b72a21 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -625,7 +625,7 @@
}
@Override
- public void setTvPipVisibilityLw(boolean visible) {
+ public void setPipVisibilityLw(boolean visible) {
}
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index 1282349..15fd2ce 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -376,7 +376,7 @@
}
@Override
- public void setTvPipVisibility(boolean visible) {
+ public void setPipVisibility(boolean visible) {
// TODO Auto-generated method stub
}