From 81ba11eccbc2519338782100c13cf4a5909ad6be Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Wed, 3 Feb 2016 22:04:22 -0800 Subject: [PATCH] Put dismiss end target at navigation bar This makes the animation when exiting docked mode a bit nicer when you fling the divider towards to the navigation bar. However, since the divider ends at the navigation bar, we need to immediately dismiss it instead of fading out when the divider is fully occluded by the navigation bar. Change-Id: Ic5432fd118cb71be36485667b2c537caf5065ce5 --- .../android/view/WindowManagerPolicy.java | 5 ++++ .../internal/policy/DividerSnapAlgorithm.java | 6 ++--- .../server/policy/PhoneWindowManager.java | 24 +++++++++++++++---- .../wm/DockedStackDividerController.java | 4 ++++ .../server/wm/WindowManagerService.java | 5 ++++ 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 6e38b32686831..947906bf4403a 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -460,6 +460,11 @@ public interface WindowManagerPolicy { /** Unregister a system listener for touch events */ void unregisterPointerEventListener(PointerEventListener listener); + + /** + * @return The content insets of the docked divider window. + */ + int getDockedDividerInsetsLw(); } public interface PointerEventListener { diff --git a/core/java/com/android/internal/policy/DividerSnapAlgorithm.java b/core/java/com/android/internal/policy/DividerSnapAlgorithm.java index 597c5225f89fb..84d0fc70b1ca6 100644 --- a/core/java/com/android/internal/policy/DividerSnapAlgorithm.java +++ b/core/java/com/android/internal/policy/DividerSnapAlgorithm.java @@ -136,8 +136,7 @@ public class DividerSnapAlgorithm { / (mFirstSplitTarget.position - getStartInset()); } else if (position > mLastSplitTarget.position) { return (float) (position - mLastSplitTarget.position) - / (mDismissEndTarget.position - getEndInset() - - mLastSplitTarget.position - mDividerSize); + / (mDismissEndTarget.position - mLastSplitTarget.position - mDividerSize); } return 0f; } @@ -222,7 +221,8 @@ public class DividerSnapAlgorithm { addMiddleTarget(isHorizontalDivision); break; } - mTargets.add(new SnapTarget(dividerMax, SnapTarget.FLAG_DISMISS_END, 0.35f)); + int navBarSize = isHorizontalDivision ? mInsets.bottom : mInsets.right; + mTargets.add(new SnapTarget(dividerMax - navBarSize, SnapTarget.FLAG_DISMISS_END, 0.35f)); } private void addFixedDivisionTargets(boolean isHorizontalDivision) { diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index a92cc31659e64..c046ba610b3ad 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2645,11 +2645,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } } else if (win.getAttrs().type == TYPE_DOCK_DIVIDER) { - if (transit == TRANSIT_ENTER || transit == TRANSIT_SHOW) { - return R.anim.fade_in; - } else if (transit == TRANSIT_EXIT) { - return R.anim.fade_out; - } + return selectDockedDividerAnimationLw(win, transit); } if (transit == TRANSIT_PREVIEW_DONE) { @@ -2669,6 +2665,24 @@ public class PhoneWindowManager implements WindowManagerPolicy { return 0; } + private int selectDockedDividerAnimationLw(WindowState win, int transit) { + int insets = mWindowManagerFuncs.getDockedDividerInsetsLw(); + + // If the divider is behind the navigation bar, don't animate. + if (mNavigationBar != null + && (win.getFrameLw().top + insets >= mNavigationBar.getFrameLw().top + || win.getFrameLw().left + insets >= mNavigationBar.getFrameLw().left)) { + return 0; + } + if (transit == TRANSIT_ENTER || transit == TRANSIT_SHOW) { + return R.anim.fade_in; + } else if (transit == TRANSIT_EXIT) { + return R.anim.fade_out; + } else { + return 0; + } + } + @Override public void selectRotationAnimationLw(int anim[]) { if (PRINT_ANIM) Slog.i(TAG, "selectRotationAnimation mTopFullscreen=" diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index 72953183a173b..412a455001573 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -72,6 +72,10 @@ public class DockedStackDividerController implements DimLayerUser { return mDividerWindowWidth - 2 * mDividerInsets; } + int getContentInsets() { + return mDividerInsets; + } + void setResizing(boolean resizing) { mResizing = resizing; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 1b041cb751f11..d1ffaa07ed13c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -9619,6 +9619,11 @@ public class WindowManagerService extends IWindowManager.Stub && !appWindow.mTask.inFreeformWorkspace(); } + @Override + public int getDockedDividerInsetsLw() { + return getDefaultDisplayContentLocked().getDockedDividerController().getContentInsets(); + } + void dumpPolicyLocked(PrintWriter pw, String[] args, boolean dumpAll) { pw.println("WINDOW MANAGER POLICY STATE (dumpsys window policy)"); mPolicy.dump(" ", pw, args);