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
     }