OSDN Git Service

Tweaking PiP for accessibility.
authorWinson Chung <winsonc@google.com>
Thu, 30 Mar 2017 17:26:48 +0000 (10:26 -0700)
committerWinson Chung <winsonc@google.com>
Thu, 30 Mar 2017 17:26:48 +0000 (10:26 -0700)
- Disabling timeout when the PiP menu is invoked via an accessibility event
- Increasing default duration before menu times out and collapses
- Fixing issue where temporary bundle data was being clobbered

Bug: 36103023
Test: Launch PiP activity with accessibility, ensure menu does not time out
Change-Id: I4beda18ef2fb2e2b638b0ff6bac9a71ed1986639

packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java

index ebda2e8..eb570cc 100644 (file)
@@ -17,6 +17,7 @@
 package com.android.systemui.pip.phone;
 
 import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_ACTIONS;
+import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_ALLOW_TIMEOUT;
 import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_CONTROLLER_MESSENGER;
 import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_DISMISS_FRACTION;
 import static com.android.systemui.pip.phone.PipMenuActivityController.EXTRA_MOVEMENT_BOUNDS;
@@ -76,8 +77,8 @@ public class PipMenuActivity extends Activity {
     public static final int MESSAGE_UPDATE_ACTIONS = 4;
     public static final int MESSAGE_UPDATE_DISMISS_FRACTION = 5;
 
-    private static final long INITIAL_DISMISS_DELAY = 2000;
-    private static final long POST_INTERACTION_DISMISS_DELAY = 1500;
+    private static final long INITIAL_DISMISS_DELAY = 3500;
+    private static final long POST_INTERACTION_DISMISS_DELAY = 2000;
     private static final long MENU_FADE_DURATION = 125;
 
     private static final float MENU_BACKGROUND_ALPHA = 0.3f;
@@ -117,7 +118,8 @@ public class PipMenuActivity extends Activity {
                 case MESSAGE_SHOW_MENU: {
                     final Bundle data = (Bundle) msg.obj;
                     showMenu(data.getParcelable(EXTRA_STACK_BOUNDS),
-                            data.getParcelable(EXTRA_MOVEMENT_BOUNDS));
+                            data.getParcelable(EXTRA_MOVEMENT_BOUNDS),
+                            data.getBoolean(EXTRA_ALLOW_TIMEOUT));
                     break;
                 }
                 case MESSAGE_POKE_MENU:
@@ -252,7 +254,7 @@ public class PipMenuActivity extends Activity {
         // Do nothing
     }
 
-    private void showMenu(Rect stackBounds, Rect movementBounds) {
+    private void showMenu(Rect stackBounds, Rect movementBounds, boolean allowMenuTimeout) {
         if (!mMenuVisible) {
             updateActionViews(stackBounds);
             if (mMenuContainerAnimator != null) {
@@ -264,18 +266,22 @@ public class PipMenuActivity extends Activity {
                     mMenuContainer.getAlpha(), 1f);
             mMenuContainerAnimator.setInterpolator(Interpolators.ALPHA_IN);
             mMenuContainerAnimator.setDuration(MENU_FADE_DURATION);
-            mMenuContainerAnimator.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    repostDelayedFinish(INITIAL_DISMISS_DELAY);
-                }
-            });
+            if (allowMenuTimeout) {
+                mMenuContainerAnimator.addListener(new AnimatorListenerAdapter() {
+                    @Override
+                    public void onAnimationEnd(Animator animation) {
+                        repostDelayedFinish(INITIAL_DISMISS_DELAY);
+                    }
+                });
+            }
             mMenuContainerAnimator.addUpdateListener(mMenuBgUpdateListener);
             mMenuContainerAnimator.start();
         } else {
             // If we are already visible, then just start the delayed dismiss and unregister any
             // existing input consumers from the previous drag
-            repostDelayedFinish(POST_INTERACTION_DISMISS_DELAY);
+            if (allowMenuTimeout) {
+                repostDelayedFinish(POST_INTERACTION_DISMISS_DELAY);
+            }
             notifyUnregisterInputConsumer();
         }
     }
@@ -321,7 +327,8 @@ public class PipMenuActivity extends Activity {
         if (intent.getBooleanExtra(EXTRA_SHOW_MENU, false)) {
             Rect stackBounds = intent.getParcelableExtra(EXTRA_STACK_BOUNDS);
             Rect movementBounds = intent.getParcelableExtra(EXTRA_MOVEMENT_BOUNDS);
-            showMenu(stackBounds, movementBounds);
+            boolean allowMenuTimeout = intent.getBooleanExtra(EXTRA_ALLOW_TIMEOUT, true);
+            showMenu(stackBounds, movementBounds, allowMenuTimeout);
         }
     }
 
index e2069e2..bcaa395 100644 (file)
@@ -33,7 +33,6 @@ import android.os.Messenger;
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.util.Log;
-import android.util.Pair;
 import android.view.IWindowManager;
 
 import com.android.systemui.pip.phone.PipMediaController.ActionListener;
@@ -56,6 +55,7 @@ public class PipMenuActivityController {
     public static final String EXTRA_ACTIONS = "actions";
     public static final String EXTRA_STACK_BOUNDS = "stack_bounds";
     public static final String EXTRA_MOVEMENT_BOUNDS = "movement_bounds";
+    public static final String EXTRA_ALLOW_TIMEOUT = "allow_timeout";
     public static final String EXTRA_SHOW_MENU = "show_menu";
     public static final String EXTRA_DISMISS_FRACTION = "dismiss_fraction";
 
@@ -105,7 +105,8 @@ public class PipMenuActivityController {
     private ParceledListSlice mMediaActions;
     private boolean mMenuVisible;
 
-    private Bundle mTmpData = new Bundle();
+    // The dismiss fraction update is sent frequently, so use a temporary bundle for the message
+    private Bundle mTmpDismissFractionData = new Bundle();
 
     private boolean mStartActivityRequested;
     private Messenger mToActivityMessenger;
@@ -195,11 +196,11 @@ public class PipMenuActivityController {
      */
     public void setDismissFraction(float fraction) {
         if (mToActivityMessenger != null) {
-            mTmpData.clear();
-            mTmpData.putFloat(EXTRA_DISMISS_FRACTION, fraction);
+            mTmpDismissFractionData.clear();
+            mTmpDismissFractionData.putFloat(EXTRA_DISMISS_FRACTION, fraction);
             Message m = Message.obtain();
             m.what = PipMenuActivity.MESSAGE_UPDATE_DISMISS_FRACTION;
-            m.obj = mTmpData;
+            m.obj = mTmpDismissFractionData;
             try {
                 mToActivityMessenger.send(m);
             } catch (RemoteException e) {
@@ -207,28 +208,29 @@ public class PipMenuActivityController {
             }
         } else if (!mStartActivityRequested) {
             startMenuActivity(null /* stackBounds */, null /* movementBounds */,
-                    false /* showMenu */);
+                    false /* showMenu */, false /* allowMenuTimeout */);
         }
     }
 
     /**
      * Shows the menu activity.
      */
-    public void showMenu(Rect stackBounds, Rect movementBounds) {
+    public void showMenu(Rect stackBounds, Rect movementBounds, boolean allowMenuTimeout) {
         if (mToActivityMessenger != null) {
-            mTmpData.clear();
-            mTmpData.putParcelable(EXTRA_STACK_BOUNDS, stackBounds);
-            mTmpData.putParcelable(EXTRA_MOVEMENT_BOUNDS, movementBounds);
+            Bundle data = new Bundle();
+            data.putParcelable(EXTRA_STACK_BOUNDS, stackBounds);
+            data.putParcelable(EXTRA_MOVEMENT_BOUNDS, movementBounds);
+            data.putBoolean(EXTRA_ALLOW_TIMEOUT, allowMenuTimeout);
             Message m = Message.obtain();
             m.what = PipMenuActivity.MESSAGE_SHOW_MENU;
-            m.obj = mTmpData;
+            m.obj = data;
             try {
                 mToActivityMessenger.send(m);
             } catch (RemoteException e) {
                 Log.e(TAG, "Could not notify menu to show", e);
             }
         } else if (!mStartActivityRequested) {
-            startMenuActivity(stackBounds, movementBounds, true /* showMenu */);
+            startMenuActivity(stackBounds, movementBounds, true /* showMenu */, allowMenuTimeout);
         }
     }
 
@@ -290,7 +292,8 @@ public class PipMenuActivityController {
     /**
      * Starts the menu activity on the top task of the pinned stack.
      */
-    private void startMenuActivity(Rect stackBounds, Rect movementBounds, boolean showMenu) {
+    private void startMenuActivity(Rect stackBounds, Rect movementBounds, boolean showMenu,
+            boolean allowMenuTimeout) {
         try {
             StackInfo pinnedStackInfo = mActivityManager.getStackInfo(PINNED_STACK_ID);
             if (pinnedStackInfo != null && pinnedStackInfo.taskIds != null &&
@@ -305,6 +308,7 @@ public class PipMenuActivityController {
                     intent.putExtra(EXTRA_MOVEMENT_BOUNDS, movementBounds);
                 }
                 intent.putExtra(EXTRA_SHOW_MENU, showMenu);
+                intent.putExtra(EXTRA_ALLOW_TIMEOUT, allowMenuTimeout);
                 ActivityOptions options = ActivityOptions.makeCustomAnimation(mContext, 0, 0);
                 options.setLaunchTaskId(
                         pinnedStackInfo.taskIds[pinnedStackInfo.taskIds.length - 1]);
@@ -336,12 +340,12 @@ public class PipMenuActivityController {
                 Log.e(TAG, "Error showing PIP menu activity", e);
             }
 
-            mTmpData.clear();
-            mTmpData.putParcelable(EXTRA_STACK_BOUNDS, stackBounds);
-            mTmpData.putParcelable(EXTRA_ACTIONS, resolveMenuActions());
+            Bundle data = new Bundle();
+            data.putParcelable(EXTRA_STACK_BOUNDS, stackBounds);
+            data.putParcelable(EXTRA_ACTIONS, resolveMenuActions());
             Message m = Message.obtain();
             m.what = PipMenuActivity.MESSAGE_UPDATE_ACTIONS;
-            m.obj = mTmpData;
+            m.obj = data;
             try {
                 mToActivityMessenger.send(m);
             } catch (RemoteException e) {
index a0f491f..0ce3210 100644 (file)
@@ -288,7 +288,8 @@ public class PipTouchHandler implements TunerService.Tunable {
     }
 
     private void onAccessibilityShowMenu() {
-        mMenuController.showMenu(mMotionHelper.getBounds(), mMovementBounds);
+        mMenuController.showMenu(mMotionHelper.getBounds(), mMovementBounds,
+                false /* allowMenuTimeout */);
     }
 
     private boolean handleTouchEvent(MotionEvent ev) {
@@ -617,7 +618,8 @@ public class PipTouchHandler implements TunerService.Tunable {
                 // If the menu is still visible, and we aren't minimized, then just poke the menu
                 // so that it will timeout after the user stops touching it
                 if (mMenuController.isMenuVisible()) {
-                    mMenuController.showMenu(mMotionHelper.getBounds(), mMovementBounds);
+                    mMenuController.showMenu(mMotionHelper.getBounds(), mMovementBounds,
+                            true /* allowMenuTimeout */);
                 }
 
                 if (isFling) {
@@ -631,7 +633,8 @@ public class PipTouchHandler implements TunerService.Tunable {
                 mMotionHelper.animateToClosestSnapTarget(mMovementBounds, null /* listener */);
                 setMinimizedStateInternal(false);
             } else if (!mIsMenuVisible) {
-                mMenuController.showMenu(mMotionHelper.getBounds(), mMovementBounds);
+                mMenuController.showMenu(mMotionHelper.getBounds(), mMovementBounds,
+                        true /* allowMenuTimeout */);
             } else {
                 mMotionHelper.expandPip();
             }