diff --git a/quickstep/src/com/android/quickstep/NavBarSwipeInteractionHandler.java b/quickstep/src/com/android/quickstep/NavBarSwipeInteractionHandler.java index 168c1fed52..eb5195c2d5 100644 --- a/quickstep/src/com/android/quickstep/NavBarSwipeInteractionHandler.java +++ b/quickstep/src/com/android/quickstep/NavBarSwipeInteractionHandler.java @@ -27,7 +27,6 @@ import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Rect; import android.os.Build; -import android.os.Handler; import android.os.UserHandle; import android.support.annotation.UiThread; import android.view.View; @@ -41,12 +40,12 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherState; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.states.InternalStateHandler; import com.android.launcher3.uioverrides.RecentsViewStateController; import com.android.launcher3.util.TraceHelper; -import com.android.launcher3.views.AllAppsScrim; import com.android.systemui.shared.recents.model.RecentsTaskLoadPlan; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.Task.TaskKey; @@ -61,7 +60,6 @@ public class NavBarSwipeInteractionHandler extends InternalStateHandler { private static final int STATE_SCALED_SNAPSHOT_RECENTS = 1 << 5; private static final int STATE_SCALED_SNAPSHOT_APP = 1 << 6; - private static final long RECENTS_VIEW_VISIBILITY_DURATION = 150; private static final long MAX_SWIPE_DURATION = 200; private static final long MIN_SWIPE_DURATION = 80; private static final int QUICK_SWITCH_SNAP_DURATION = 120; @@ -98,7 +96,6 @@ public class NavBarSwipeInteractionHandler extends InternalStateHandler { private RecentsViewStateController mStateController; private QuickScrubController mQuickScrubController; private Hotseat mHotseat; - private AllAppsScrim mAllAppsScrim; private boolean mLauncherReady; private boolean mTouchEndHandled; @@ -188,7 +185,6 @@ public class NavBarSwipeInteractionHandler extends InternalStateHandler { mRecentsView.showTask(mRunningTask); mStateController = mRecentsView.getStateController(); mHotseat = mLauncher.getHotseat(); - mAllAppsScrim = mLauncher.findViewById(R.id.all_apps_scrim); AbstractFloatingView.closeAllOpenViews(mLauncher, alreadyOnHome); mLauncher.getStateManager().goToState(LauncherState.OVERVIEW, alreadyOnHome); @@ -242,11 +238,10 @@ public class NavBarSwipeInteractionHandler extends InternalStateHandler { } float shift = mCurrentShift.value * mActivityMultiplier.value; - int hotseatSize = getHotseatSize(); - float hotseatTranslation = (1 - shift) * hotseatSize; - mHotseat.setTranslationY(hotseatTranslation); - mAllAppsScrim.setTranslationY(hotseatTranslation); + AllAppsTransitionController controller = mLauncher.getAllAppsController(); + float range = getHotseatSize() / controller.getShiftRange(); + controller.setProgress(1 + (1 - shift) * range); mRectEvaluator.evaluate(shift, mSourceRect, mTargetRect); @@ -329,8 +324,7 @@ public class NavBarSwipeInteractionHandler extends InternalStateHandler { private void cleanupLauncher() { // TODO: These should be done as part of ActivityOptions#OnAnimationStarted - mHotseat.setTranslationY(0); - mAllAppsScrim.setTranslationY(0); + mLauncher.getStateManager().reapplyState(); mLauncher.setOnResumeCallback(() -> mDragView.close(false)); } diff --git a/src/com/android/launcher3/views/AllAppsScrim.java b/src/com/android/launcher3/views/AllAppsScrim.java index 5d39adb4e4..cc7318257e 100644 --- a/src/com/android/launcher3/views/AllAppsScrim.java +++ b/src/com/android/launcher3/views/AllAppsScrim.java @@ -46,6 +46,7 @@ public class AllAppsScrim extends View implements OnChangeListener, Insettable { protected final WallpaperColorInfo mWallpaperColorInfo; private final Paint mFillPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Rect mDrawRect = new Rect(); private final Rect mPadding = new Rect(); private final Rect mInsets = new Rect(); private final DeviceProfile mGrid; @@ -62,7 +63,7 @@ public class AllAppsScrim extends View implements OnChangeListener, Insettable { private int mFillAlpha; private float mDrawHeight; - private float mTranslateY; + private float mDrawOffsetY; public AllAppsScrim(Context context) { this(context, null); @@ -135,7 +136,7 @@ public class AllAppsScrim extends View implements OnChangeListener, Insettable { @Override protected void onDraw(Canvas canvas) { - float edgeTop = getHeight() + mTranslateY - mDrawHeight + mPadding.top; + float edgeTop = getHeight() + mDrawOffsetY - mDrawHeight + mPadding.top; float edgeRight = getWidth() - mPadding.right; if (mPadding.left > 0 || mPadding.right > 0) { @@ -153,12 +154,29 @@ public class AllAppsScrim extends View implements OnChangeListener, Insettable { } public void setProgress(float translateY, float alpha) { - mFillAlpha = Math.round(alpha * mAlphaRange + mMinAlpha); - mFillPaint.setAlpha(mFillAlpha); + float newAlpha = Math.round(alpha * mAlphaRange + mMinAlpha); + // Negative translation means the scrim is moving up. For negative translation, we change + // draw offset as it requires redraw (since more area of the scrim needs to be shown). For + // position translation, we simply translate the scrim down as it avoids invalidate and + // hence could be optimized by the platform. + float drawOffsetY = Math.min(translateY, 0); - mTranslateY = translateY; + if (newAlpha != mFillAlpha || drawOffsetY != mDrawOffsetY) { + invalidateDrawRect(); - invalidate(); + mFillAlpha = Math.round(alpha * mAlphaRange + mMinAlpha); + mFillPaint.setAlpha(mFillAlpha); + mDrawOffsetY = drawOffsetY; + invalidateDrawRect(); + } + + setTranslationY(Math.max(translateY, 0)); + } + + private void invalidateDrawRect() { + mDrawRect.top = (int) (getHeight() + + mDrawOffsetY - mDrawHeight + mPadding.top - mShadowBlur - 0.5f); + invalidate(mDrawRect); } public void setDrawRegion(float height) { @@ -178,6 +196,24 @@ public class AllAppsScrim extends View implements OnChangeListener, Insettable { float scrimMargin = getResources().getDimension(R.dimen.all_apps_scrim_margin); setDrawRegion(mGrid.hotseatBarSizePx + insets.bottom + scrimMargin); } + updateDrawRect(); invalidate(); } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + updateDrawRect(); + } + + private void updateDrawRect() { + mDrawRect.bottom = getHeight(); + if (mGrid.isVerticalBarLayout()) { + mDrawRect.left = (int) (mPadding.left - mShadowBlur - 0.5f); + mDrawRect.right = (int) (getWidth() - mPadding.right + 0.5f); + } else { + mDrawRect.left = 0; + mDrawRect.right = getWidth(); + } + } }