Loading core/java/android/view/WindowManagerPolicy.java +11 −0 Original line number Diff line number Diff line Loading @@ -1328,4 +1328,15 @@ public interface WindowManagerPolicy { * @param fadeoutDuration the duration of the exit animation, in milliseconds */ public void startKeyguardExitAnimation(long startTime, long fadeoutDuration); /** * Calculates the stable insets without running a layout. * * @param displayRotation the current display rotation * @param outInsets the insets to return * @param displayWidth the current display width * @param displayHeight the current display height */ public void getStableInsetsLw(int displayRotation, int displayWidth, int displayHeight, Rect outInsets); } packages/SystemUI/src/com/android/systemui/stackdivider/DividerSnapAlgorithm.java→core/java/com/android/internal/policy/DividerSnapAlgorithm.java +21 −11 Original line number Diff line number Diff line Loading @@ -14,18 +14,19 @@ * limitations under the License. */ package com.android.systemui.stackdivider; package com.android.internal.policy; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; import com.android.systemui.statusbar.FlingAnimationUtils; import java.util.ArrayList; /** * Calculates the snap targets and the snap position given a position and a velocity. All positions * here are to be interpreted as the left/top edge of the divider rectangle. * * @hide */ public class DividerSnapAlgorithm { Loading @@ -44,8 +45,7 @@ public class DividerSnapAlgorithm { */ private static final int SNAP_ONLY_1_1 = 2; private final Context mContext; private final FlingAnimationUtils mFlingAnimationUtils; private final float mMinFlingVelocityPxPerSecond; private final int mDisplayWidth; private final int mDisplayHeight; private final int mDividerSize; Loading @@ -63,18 +63,17 @@ public class DividerSnapAlgorithm { private final SnapTarget mDismissStartTarget; private final SnapTarget mDismissEndTarget; public DividerSnapAlgorithm(Context ctx, FlingAnimationUtils flingAnimationUtils, public DividerSnapAlgorithm(Resources res, float minFlingVelocityPxPerSecond, int displayWidth, int displayHeight, int dividerSize, boolean isHorizontalDivision, Rect insets) { mContext = ctx; mFlingAnimationUtils = flingAnimationUtils; mMinFlingVelocityPxPerSecond = minFlingVelocityPxPerSecond; mDividerSize = dividerSize; mDisplayWidth = displayWidth; mDisplayHeight = displayHeight; mInsets.set(insets); mSnapMode = ctx.getResources().getInteger( mSnapMode = res.getInteger( com.android.internal.R.integer.config_dockedStackDividerSnapMode); mFixedRatio = ctx.getResources().getFraction( mFixedRatio = res.getFraction( com.android.internal.R.fraction.docked_stack_divider_fixed_ratio, 1, 1); calculateTargets(isHorizontalDivision); mFirstSplitTarget = mTargets.get(1); Loading @@ -84,7 +83,7 @@ public class DividerSnapAlgorithm { } public SnapTarget calculateSnapTarget(int position, float velocity) { if (Math.abs(velocity) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) { if (Math.abs(velocity) < mMinFlingVelocityPxPerSecond) { return snap(position); } if (position < mFirstSplitTarget.position && velocity < 0) { Loading @@ -100,6 +99,17 @@ public class DividerSnapAlgorithm { } } public SnapTarget calculateNonDismissingSnapTarget(int position) { SnapTarget target = snap(position); if (target == mDismissStartTarget) { return mFirstSplitTarget; } else if (target == mDismissEndTarget) { return mLastSplitTarget; } else { return target; } } public float calculateDismissingFraction(int position) { if (position < mFirstSplitTarget.position) { return 1f - (float) position / mFirstSplitTarget.position; Loading core/java/com/android/internal/policy/DockedDividerUtils.java 0 → 100644 +74 −0 Original line number Diff line number Diff line /* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.policy; import android.graphics.Rect; import android.view.WindowManager; /** * Utility functions for docked stack divider used by both window manager and System UI. * * @hide */ public class DockedDividerUtils { public static void calculateBoundsForPosition(int position, int dockSide, Rect outRect, int displayWidth, int displayHeight, int dividerSize) { outRect.set(0, 0, displayWidth, displayHeight); switch (dockSide) { case WindowManager.DOCKED_LEFT: outRect.right = position; break; case WindowManager.DOCKED_TOP: outRect.bottom = position; break; case WindowManager.DOCKED_RIGHT: outRect.left = position + dividerSize; break; case WindowManager.DOCKED_BOTTOM: outRect.top = position + dividerSize; break; } if (outRect.left > outRect.right) { outRect.left = outRect.right; } if (outRect.top > outRect.bottom) { outRect.top = outRect.bottom; } if (outRect.right < outRect.left) { outRect.right = outRect.left; } if (outRect.bottom < outRect.top) { outRect.bottom = outRect.top; } } public static int calculatePositionForBounds(Rect bounds, int dockSide, int dividerSize) { switch (dockSide) { case WindowManager.DOCKED_LEFT: return bounds.right; case WindowManager.DOCKED_TOP: return bounds.bottom; case WindowManager.DOCKED_RIGHT: return bounds.left - dividerSize; case WindowManager.DOCKED_BOTTOM: return bounds.top - dividerSize; default: return 0; } } } packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +10 −34 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ import android.graphics.Rect; import android.graphics.Region.Op; import android.hardware.display.DisplayManager; import android.util.AttributeSet; import android.util.MathUtils; import android.view.Display; import android.view.DisplayInfo; import android.view.MotionEvent; Loading @@ -39,7 +38,6 @@ import android.view.View.OnTouchListener; import android.view.ViewConfiguration; import android.view.ViewTreeObserver.InternalInsetsInfo; import android.view.ViewTreeObserver.OnComputeInternalInsetsListener; import android.view.Window; import android.view.WindowInsets; import android.view.WindowManager; import android.view.animation.AnimationUtils; Loading @@ -48,8 +46,10 @@ import android.view.animation.PathInterpolator; import android.widget.FrameLayout; import android.widget.ImageButton; import com.android.internal.policy.DividerSnapAlgorithm; import com.android.internal.policy.DockedDividerUtils; import com.android.systemui.R; import com.android.systemui.stackdivider.DividerSnapAlgorithm.SnapTarget; import com.android.internal.policy.DividerSnapAlgorithm.SnapTarget; import com.android.systemui.statusbar.FlingAnimationUtils; import static android.view.PointerIcon.STYLE_HORIZONTAL_DOUBLE_ARROW; Loading Loading @@ -167,7 +167,8 @@ public class DividerView extends FrameLayout implements OnTouchListener, public boolean startDragging(boolean animate) { mHandle.setTouching(true, animate); mDockSide = mWindowManagerProxy.getDockSide(); mSnapAlgorithm = new DividerSnapAlgorithm(getContext(), mFlingAnimationUtils, mDisplayWidth, mSnapAlgorithm = new DividerSnapAlgorithm(getContext().getResources(), mFlingAnimationUtils.getMinVelocityPxPerSecond(), mDisplayWidth, mDisplayHeight, mDividerSize, isHorizontalDivision(), mStableInsets); if (mDockSide != WindowManager.DOCKED_INVALID) { mWindowManagerProxy.setResizing(true); Loading Loading @@ -362,36 +363,6 @@ public class DividerView extends FrameLayout implements OnTouchListener, return mStartPosition + touchY - mStartY; } public void calculateBoundsForPosition(int position, int dockSide, Rect outRect) { outRect.set(0, 0, mDisplayWidth, mDisplayHeight); switch (dockSide) { case WindowManager.DOCKED_LEFT: outRect.right = position; break; case WindowManager.DOCKED_TOP: outRect.bottom = position; break; case WindowManager.DOCKED_RIGHT: outRect.left = position + mDividerWindowWidth - 2 * mDividerInsets; break; case WindowManager.DOCKED_BOTTOM: outRect.top = position + mDividerWindowWidth - 2 * mDividerInsets; break; } if (outRect.left > outRect.right) { outRect.left = outRect.right; } if (outRect.top > outRect.bottom) { outRect.top = outRect.bottom; } if (outRect.right < outRect.left) { outRect.right = outRect.left; } if (outRect.bottom < outRect.top) { outRect.bottom = outRect.top; } } private int invertDockSide(int dockSide) { switch (dockSide) { case WindowManager.DOCKED_LEFT: Loading Loading @@ -421,6 +392,11 @@ public class DividerView extends FrameLayout implements OnTouchListener, containingRect.right, containingRect.bottom); } public void calculateBoundsForPosition(int position, int dockSide, Rect outRect) { DockedDividerUtils.calculateBoundsForPosition(position, dockSide, outRect, mDisplayWidth, mDisplayHeight, mDividerSize); } public void resizeStack(int position, int taskPosition, SnapTarget taskSnapTarget) { calculateBoundsForPosition(position, mDockSide, mDockedRect); Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java +1 −2 Original line number Diff line number Diff line Loading @@ -29,8 +29,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; import com.android.systemui.RecentsComponent; import com.android.systemui.stackdivider.Divider; import com.android.systemui.stackdivider.DividerSnapAlgorithm.SnapTarget; import com.android.systemui.stackdivider.DividerView; import com.android.internal.policy.DividerSnapAlgorithm.SnapTarget; import com.android.systemui.tuner.TunerService; import static android.view.WindowManager.*; Loading Loading
core/java/android/view/WindowManagerPolicy.java +11 −0 Original line number Diff line number Diff line Loading @@ -1328,4 +1328,15 @@ public interface WindowManagerPolicy { * @param fadeoutDuration the duration of the exit animation, in milliseconds */ public void startKeyguardExitAnimation(long startTime, long fadeoutDuration); /** * Calculates the stable insets without running a layout. * * @param displayRotation the current display rotation * @param outInsets the insets to return * @param displayWidth the current display width * @param displayHeight the current display height */ public void getStableInsetsLw(int displayRotation, int displayWidth, int displayHeight, Rect outInsets); }
packages/SystemUI/src/com/android/systemui/stackdivider/DividerSnapAlgorithm.java→core/java/com/android/internal/policy/DividerSnapAlgorithm.java +21 −11 Original line number Diff line number Diff line Loading @@ -14,18 +14,19 @@ * limitations under the License. */ package com.android.systemui.stackdivider; package com.android.internal.policy; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; import com.android.systemui.statusbar.FlingAnimationUtils; import java.util.ArrayList; /** * Calculates the snap targets and the snap position given a position and a velocity. All positions * here are to be interpreted as the left/top edge of the divider rectangle. * * @hide */ public class DividerSnapAlgorithm { Loading @@ -44,8 +45,7 @@ public class DividerSnapAlgorithm { */ private static final int SNAP_ONLY_1_1 = 2; private final Context mContext; private final FlingAnimationUtils mFlingAnimationUtils; private final float mMinFlingVelocityPxPerSecond; private final int mDisplayWidth; private final int mDisplayHeight; private final int mDividerSize; Loading @@ -63,18 +63,17 @@ public class DividerSnapAlgorithm { private final SnapTarget mDismissStartTarget; private final SnapTarget mDismissEndTarget; public DividerSnapAlgorithm(Context ctx, FlingAnimationUtils flingAnimationUtils, public DividerSnapAlgorithm(Resources res, float minFlingVelocityPxPerSecond, int displayWidth, int displayHeight, int dividerSize, boolean isHorizontalDivision, Rect insets) { mContext = ctx; mFlingAnimationUtils = flingAnimationUtils; mMinFlingVelocityPxPerSecond = minFlingVelocityPxPerSecond; mDividerSize = dividerSize; mDisplayWidth = displayWidth; mDisplayHeight = displayHeight; mInsets.set(insets); mSnapMode = ctx.getResources().getInteger( mSnapMode = res.getInteger( com.android.internal.R.integer.config_dockedStackDividerSnapMode); mFixedRatio = ctx.getResources().getFraction( mFixedRatio = res.getFraction( com.android.internal.R.fraction.docked_stack_divider_fixed_ratio, 1, 1); calculateTargets(isHorizontalDivision); mFirstSplitTarget = mTargets.get(1); Loading @@ -84,7 +83,7 @@ public class DividerSnapAlgorithm { } public SnapTarget calculateSnapTarget(int position, float velocity) { if (Math.abs(velocity) < mFlingAnimationUtils.getMinVelocityPxPerSecond()) { if (Math.abs(velocity) < mMinFlingVelocityPxPerSecond) { return snap(position); } if (position < mFirstSplitTarget.position && velocity < 0) { Loading @@ -100,6 +99,17 @@ public class DividerSnapAlgorithm { } } public SnapTarget calculateNonDismissingSnapTarget(int position) { SnapTarget target = snap(position); if (target == mDismissStartTarget) { return mFirstSplitTarget; } else if (target == mDismissEndTarget) { return mLastSplitTarget; } else { return target; } } public float calculateDismissingFraction(int position) { if (position < mFirstSplitTarget.position) { return 1f - (float) position / mFirstSplitTarget.position; Loading
core/java/com/android/internal/policy/DockedDividerUtils.java 0 → 100644 +74 −0 Original line number Diff line number Diff line /* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.policy; import android.graphics.Rect; import android.view.WindowManager; /** * Utility functions for docked stack divider used by both window manager and System UI. * * @hide */ public class DockedDividerUtils { public static void calculateBoundsForPosition(int position, int dockSide, Rect outRect, int displayWidth, int displayHeight, int dividerSize) { outRect.set(0, 0, displayWidth, displayHeight); switch (dockSide) { case WindowManager.DOCKED_LEFT: outRect.right = position; break; case WindowManager.DOCKED_TOP: outRect.bottom = position; break; case WindowManager.DOCKED_RIGHT: outRect.left = position + dividerSize; break; case WindowManager.DOCKED_BOTTOM: outRect.top = position + dividerSize; break; } if (outRect.left > outRect.right) { outRect.left = outRect.right; } if (outRect.top > outRect.bottom) { outRect.top = outRect.bottom; } if (outRect.right < outRect.left) { outRect.right = outRect.left; } if (outRect.bottom < outRect.top) { outRect.bottom = outRect.top; } } public static int calculatePositionForBounds(Rect bounds, int dockSide, int dividerSize) { switch (dockSide) { case WindowManager.DOCKED_LEFT: return bounds.right; case WindowManager.DOCKED_TOP: return bounds.bottom; case WindowManager.DOCKED_RIGHT: return bounds.left - dividerSize; case WindowManager.DOCKED_BOTTOM: return bounds.top - dividerSize; default: return 0; } } }
packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +10 −34 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ import android.graphics.Rect; import android.graphics.Region.Op; import android.hardware.display.DisplayManager; import android.util.AttributeSet; import android.util.MathUtils; import android.view.Display; import android.view.DisplayInfo; import android.view.MotionEvent; Loading @@ -39,7 +38,6 @@ import android.view.View.OnTouchListener; import android.view.ViewConfiguration; import android.view.ViewTreeObserver.InternalInsetsInfo; import android.view.ViewTreeObserver.OnComputeInternalInsetsListener; import android.view.Window; import android.view.WindowInsets; import android.view.WindowManager; import android.view.animation.AnimationUtils; Loading @@ -48,8 +46,10 @@ import android.view.animation.PathInterpolator; import android.widget.FrameLayout; import android.widget.ImageButton; import com.android.internal.policy.DividerSnapAlgorithm; import com.android.internal.policy.DockedDividerUtils; import com.android.systemui.R; import com.android.systemui.stackdivider.DividerSnapAlgorithm.SnapTarget; import com.android.internal.policy.DividerSnapAlgorithm.SnapTarget; import com.android.systemui.statusbar.FlingAnimationUtils; import static android.view.PointerIcon.STYLE_HORIZONTAL_DOUBLE_ARROW; Loading Loading @@ -167,7 +167,8 @@ public class DividerView extends FrameLayout implements OnTouchListener, public boolean startDragging(boolean animate) { mHandle.setTouching(true, animate); mDockSide = mWindowManagerProxy.getDockSide(); mSnapAlgorithm = new DividerSnapAlgorithm(getContext(), mFlingAnimationUtils, mDisplayWidth, mSnapAlgorithm = new DividerSnapAlgorithm(getContext().getResources(), mFlingAnimationUtils.getMinVelocityPxPerSecond(), mDisplayWidth, mDisplayHeight, mDividerSize, isHorizontalDivision(), mStableInsets); if (mDockSide != WindowManager.DOCKED_INVALID) { mWindowManagerProxy.setResizing(true); Loading Loading @@ -362,36 +363,6 @@ public class DividerView extends FrameLayout implements OnTouchListener, return mStartPosition + touchY - mStartY; } public void calculateBoundsForPosition(int position, int dockSide, Rect outRect) { outRect.set(0, 0, mDisplayWidth, mDisplayHeight); switch (dockSide) { case WindowManager.DOCKED_LEFT: outRect.right = position; break; case WindowManager.DOCKED_TOP: outRect.bottom = position; break; case WindowManager.DOCKED_RIGHT: outRect.left = position + mDividerWindowWidth - 2 * mDividerInsets; break; case WindowManager.DOCKED_BOTTOM: outRect.top = position + mDividerWindowWidth - 2 * mDividerInsets; break; } if (outRect.left > outRect.right) { outRect.left = outRect.right; } if (outRect.top > outRect.bottom) { outRect.top = outRect.bottom; } if (outRect.right < outRect.left) { outRect.right = outRect.left; } if (outRect.bottom < outRect.top) { outRect.bottom = outRect.top; } } private int invertDockSide(int dockSide) { switch (dockSide) { case WindowManager.DOCKED_LEFT: Loading Loading @@ -421,6 +392,11 @@ public class DividerView extends FrameLayout implements OnTouchListener, containingRect.right, containingRect.bottom); } public void calculateBoundsForPosition(int position, int dockSide, Rect outRect) { DockedDividerUtils.calculateBoundsForPosition(position, dockSide, outRect, mDisplayWidth, mDisplayHeight, mDividerSize); } public void resizeStack(int position, int taskPosition, SnapTarget taskSnapTarget) { calculateBoundsForPosition(position, mDockSide, mDockedRect); Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java +1 −2 Original line number Diff line number Diff line Loading @@ -29,8 +29,7 @@ import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; import com.android.systemui.RecentsComponent; import com.android.systemui.stackdivider.Divider; import com.android.systemui.stackdivider.DividerSnapAlgorithm.SnapTarget; import com.android.systemui.stackdivider.DividerView; import com.android.internal.policy.DividerSnapAlgorithm.SnapTarget; import com.android.systemui.tuner.TunerService; import static android.view.WindowManager.*; Loading