diff options
20 files changed, 84 insertions, 62 deletions
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 586b3b225fef..a2ff4f787b61 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -271,7 +271,7 @@ interface IWindowManager /** * 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 2617d45a6a02..bb6e0eed57cc 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -1517,7 +1517,7 @@ public interface WindowManagerPolicy { /** * 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 21e39f6408ed..7d9538f737d7 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -102,9 +102,9 @@ oneway interface IStatusBar 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 69541ec8e090..68c80073d240 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 @@ import java.io.PrintWriter; 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 9a8090d72199..a1f6553aa7d5 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 android.content.res.Configuration; 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 @@ import java.io.PrintWriter; /** * 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 @@ public class PipUI extends SystemUI { ? 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 87f8ddb7f2f2..114a59407487 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 android.view.WindowManagerGlobal; 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 @@ public class PipManager implements BasePipManager { mMediaController.onActivityPinned(); mMenuController.onActivityPinned(); mNotificationController.onActivityPinned(packageName); + + SystemServicesProxy.getInstance(mContext).setPipVisibility(true); } @Override @@ -81,7 +84,11 @@ public class PipManager implements BasePipManager { return; } - mNotificationController.onActivityUnpinned(); + ComponentName topPipActivity = PipUtils.getTopPinnedActivity(mContext, + mActivityManager); + mNotificationController.onActivityUnpinned(topPipActivity); + + SystemServicesProxy.getInstance(mContext).setPipVisibility(topPipActivity != null); } @Override @@ -94,6 +101,7 @@ public class PipManager implements BasePipManager { public void onPinnedStackAnimationEnded() { // Re-enable touches after the animation completes mTouchHandler.setTouchEnabled(true); + mTouchHandler.onPinnedStackAnimationEnded(); } @Override @@ -184,6 +192,13 @@ public class PipManager implements BasePipManager { } /** + * 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 db83b8b918a4..53746e2a6124 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 @@ public class PipNotificationController { 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 6ade571336fa..d68836c717e4 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 @@ public class PipTouchHandler implements TunerService.Tunable { 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 @@ public class PipTouchHandler implements TunerService.Tunable { 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 b96b0ae9ddd9..dd8cd2b3655f 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.Debug; 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 @@ public class PipManager implements BasePipManager { /** * 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 @@ public class PipManager implements BasePipManager { } 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 9b75f0103cc9..1c71da007fd0 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 @@ public class SystemServicesProxy { /** * 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 73bf454ec5f0..5c9360abc7f4 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 @@ public class CommandQueue extends IStatusBar.Stub { 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 @@ public class CommandQueue extends IStatusBar.Stub { 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 @@ public class CommandQueue extends IStatusBar.Stub { } @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 @@ public class CommandQueue extends IStatusBar.Stub { 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 e1fceb63a572..9a71ed7d2e6b 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.doze.DozeLog; 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 @@ public class StatusBar extends SystemUI implements DemoMode, } } - @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 5d11ef34bf1e..b5d92a5840e0 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 @@ public class TvStatusBar extends SystemUI implements Callbacks { 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 930e560d0fda..c13d13b8a6fe 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 @@ public class CommandQueueTest extends SysuiTestCase { } @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 52f6955568cb..b507df0b8447 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } - 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 @@ public class PhoneWindowManager implements WindowManagerPolicy { } @Override - public void setTvPipVisibilityLw(boolean visible) { - mTvPictureInPictureVisible = visible; + public void setPipVisibilityLw(boolean visible) { + mPictureInPictureVisible = visible; } @Override @@ -6049,13 +6049,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { } 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 135b20d16d63..5e322dac0eb3 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 @@ public interface StatusBarManagerInternal { 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 aaaa0805b3c4..83ea075434e8 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 @@ public class StatusBarManagerService extends IStatusBarService.Stub { } @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 0dc74d72635b..6c7da502ed29 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 @@ public class WindowManagerService extends IWindowManager.Stub } @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 @@ public class WindowManagerService extends IWindowManager.Stub } 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 0971bb61ac3f..0b72a21ca30d 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 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { } @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 1282349dc40f..15fd2ceea5fa 100644 --- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java +++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java @@ -376,7 +376,7 @@ public class IWindowManagerImpl implements IWindowManager { } @Override - public void setTvPipVisibility(boolean visible) { + public void setPipVisibility(boolean visible) { // TODO Auto-generated method stub } |