Remove grid scaling in Overveiw

- Grid scaling has problem that scales task icon and menu, which makes it hard to control icon size and text size in the manula
- Replaced the whole concept with dedicated Task size calculation in grid layout
- Support different icon size in TaskView in grid and removed task_thumbnail_top_margin
- Removed grid progress in TaskViewSimulator as well
- Refactored how ClearAllButton scroll and translations are calcualted to align clear all properly in grid
- Make page center calculation aware of PagedView pivot and scaling

Bug: 174464863
Test: Manual on two screens
Change-Id: I47b13ef6e55c6e16c52ea04225f5bde02ed82fc2
This commit is contained in:
Alex Chau
2021-03-17 16:53:26 +00:00
parent 21aa7042c0
commit dedbc8ac36
15 changed files with 233 additions and 214 deletions
+1
View File
@@ -16,6 +16,7 @@
<resources>
<dimen name="task_thumbnail_icon_size">48dp</dimen>
<dimen name="task_thumbnail_icon_size_grid">32dp</dimen>
<!-- For screens without rounded corners -->
<dimen name="task_corner_radius_small">2dp</dimen>
@@ -923,6 +923,9 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
float currentShift = mCurrentShift.value;
final GestureEndTarget endTarget = calculateEndTarget(velocity, endVelocity,
isFling, isCancel);
// Set the state, but don't notify until the animation completes
mGestureState.setEndTarget(endTarget, false /* isAtomic */);
float endShift = endTarget.isLauncher ? 1 : 0;
final float startShift;
if (!isFling) {
@@ -945,7 +948,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
}
Interpolator interpolator;
S state = mActivityInterface.stateFromGestureEndTarget(endTarget);
if (state.displayOverviewTasksAsGrid(mActivity.getDeviceProfile())) {
if (state.displayOverviewTasksAsGrid(mDp)) {
interpolator = ACCEL_DEACCEL;
} else if (endTarget == RECENTS) {
interpolator = OVERSHOOT_1_2;
@@ -1055,8 +1058,6 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
@UiThread
private void animateToProgressInternal(float start, float end, long duration,
Interpolator interpolator, GestureEndTarget target, PointF velocityPxPerMs) {
// Set the state, but don't notify until the animation completes
mGestureState.setEndTarget(target, false /* isAtomic */);
maybeUpdateRecentsAttachedState();
// If we are transitioning to launcher, then listen for the activity to be restarted while
@@ -1147,10 +1148,8 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
});
animatorSet.play(windowAnim);
S state = mActivityInterface.stateFromGestureEndTarget(mGestureState.getEndTarget());
if (mRecentsView != null && state.displayOverviewTasksAsGrid(
mActivity.getDeviceProfile())) {
if (mRecentsView != null && state.displayOverviewTasksAsGrid(mDp)) {
animatorSet.play(ObjectAnimator.ofFloat(mRecentsView, RECENTS_GRID_PROGRESS, 1));
animatorSet.play(mTaskViewSimulator.gridProgress.animateToValue(0, 1));
}
animatorSet.setDuration(duration).setInterpolator(interpolator);
animatorSet.start();
@@ -31,6 +31,7 @@ import android.animation.Animator;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.PointF;
import android.graphics.Rect;
import android.os.Build;
import android.view.Gravity;
@@ -43,6 +44,7 @@ import com.android.launcher3.DeviceProfile;
import com.android.launcher3.R;
import com.android.launcher3.anim.AnimatorPlaybackController;
import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.statehandlers.DepthController;
import com.android.launcher3.statemanager.BaseState;
import com.android.launcher3.statemanager.StatefulActivity;
@@ -195,45 +197,53 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
}
/**
* Calculates the taskView size for the provided device configuration
* Calculates the taskView size for the provided device configuration.
*/
public final void calculateTaskSize(Context context, DeviceProfile dp, Rect outRect,
PagedOrientationHandler orientedState) {
Resources res = context.getResources();
if (dp.isTablet && FeatureFlags.ENABLE_OVERVIEW_GRID.get()) {
Rect gridRect = new Rect();
calculateGridSize(context, dp, gridRect);
int taskMargin = dp.overviewTaskMarginPx;
int proactiveRowAndMargin;
if (dp.isVerticalBarLayout()) {
// In Vertical Bar Layout the proactive row doesn't have its own space, it's inside
// the actions row.
proactiveRowAndMargin = 0;
int rowSpacing = res.getDimensionPixelSize(R.dimen.overview_grid_row_spacing);
float rowHeight = (gridRect.height() - rowSpacing) / 2f;
PointF taskDimension = getTaskDimension(context, dp);
float scale = (rowHeight - dp.overviewTaskThumbnailTopMarginPx) / Math.max(
taskDimension.x, taskDimension.y);
int outWidth = Math.round(scale * taskDimension.x);
int outHeight = Math.round(scale * taskDimension.y);
int gravity = Gravity.TOP;
gravity |= orientedState.getRecentsRtlSetting(res) ? Gravity.RIGHT : Gravity.LEFT;
gridRect.inset(0, dp.overviewTaskThumbnailTopMarginPx, 0, 0);
Gravity.apply(gravity, outWidth, outHeight, gridRect, outRect);
} else {
proactiveRowAndMargin = res.getDimensionPixelSize(R.dimen.overview_proactive_row_height)
+ res.getDimensionPixelSize(R.dimen.overview_proactive_row_bottom_margin);
int taskMargin = dp.overviewTaskMarginPx;
int proactiveRowAndMargin;
if (dp.isVerticalBarLayout()) {
// In Vertical Bar Layout the proactive row doesn't have its own space, it's inside
// the actions row.
proactiveRowAndMargin = 0;
} else {
proactiveRowAndMargin = res.getDimensionPixelSize(
R.dimen.overview_proactive_row_height)
+ res.getDimensionPixelSize(R.dimen.overview_proactive_row_bottom_margin);
}
calculateTaskSizeInternal(context, dp,
dp.overviewTaskThumbnailTopMarginPx,
proactiveRowAndMargin + getOverviewActionsHeight(context) + taskMargin,
res.getDimensionPixelSize(R.dimen.overview_minimum_next_prev_size) + taskMargin,
outRect);
}
calculateTaskSizeInternal(context, dp,
dp.overviewTaskThumbnailTopMarginPx,
proactiveRowAndMargin + getOverviewActionsHeight(context) + taskMargin,
res.getDimensionPixelSize(R.dimen.overview_minimum_next_prev_size) + taskMargin,
outRect);
}
private void calculateTaskSizeInternal(Context context, DeviceProfile dp,
int claimedSpaceAbove, int claimedSpaceBelow, int minimumHorizontalPadding,
Rect outRect) {
float taskWidth, taskHeight;
PointF taskDimension = getTaskDimension(context, dp);
Rect insets = dp.getInsets();
if (dp.isMultiWindowMode) {
WindowBounds bounds = SplitScreenBounds.INSTANCE.getSecondaryWindowBounds(context);
taskWidth = bounds.availableSize.x;
taskHeight = bounds.availableSize.y;
} else if (TaskView.CLIP_STATUS_AND_NAV_BARS) {
taskWidth = dp.availableWidthPx;
taskHeight = dp.availableHeightPx;
} else {
taskWidth = dp.widthPx;
taskHeight = dp.heightPx;
}
Rect potentialTaskRect = new Rect(0, 0, dp.widthPx, dp.heightPx);
potentialTaskRect.inset(insets.left, insets.top, insets.right, insets.bottom);
@@ -244,14 +254,30 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
claimedSpaceBelow);
float scale = Math.min(
potentialTaskRect.width() / taskWidth,
potentialTaskRect.height() / taskHeight);
int outWidth = Math.round(scale * taskWidth);
int outHeight = Math.round(scale * taskHeight);
potentialTaskRect.width() / taskDimension.x,
potentialTaskRect.height() / taskDimension.y);
int outWidth = Math.round(scale * taskDimension.x);
int outHeight = Math.round(scale * taskDimension.y);
Gravity.apply(Gravity.CENTER, outWidth, outHeight, potentialTaskRect, outRect);
}
private PointF getTaskDimension(Context context, DeviceProfile dp) {
PointF dimension = new PointF();
if (dp.isMultiWindowMode) {
WindowBounds bounds = SplitScreenBounds.INSTANCE.getSecondaryWindowBounds(context);
dimension.x = bounds.availableSize.x;
dimension.y = bounds.availableSize.y;
} else if (TaskView.CLIP_STATUS_AND_NAV_BARS) {
dimension.x = dp.availableWidthPx;
dimension.y = dp.availableHeightPx;
} else {
dimension.x = dp.widthPx;
dimension.y = dp.heightPx;
}
return dimension;
}
/**
* Calculates the overview grid size for the provided device configuration.
*/
@@ -22,6 +22,7 @@ import static com.android.launcher3.QuickstepTransitionManager.RECENTS_LAUNCH_DU
import static com.android.launcher3.Utilities.getDescendantCoordRelativeToAncestor;
import static com.android.launcher3.anim.Interpolators.LINEAR;
import static com.android.launcher3.anim.Interpolators.TOUCH_RESPONSE_INTERPOLATOR;
import static com.android.launcher3.anim.Interpolators.TOUCH_RESPONSE_INTERPOLATOR_ACCEL_DEACCEL;
import static com.android.launcher3.anim.Interpolators.clampToProgress;
import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
import static com.android.launcher3.statehandlers.DepthController.DEPTH;
@@ -200,8 +201,7 @@ public final class TaskViewUtils {
tsv.setPreview(targets.apps[targets.apps.length - 1]);
tsv.fullScreenProgress.value = 0;
tsv.recentsViewScale.value = 1;
tsv.gridProgress.value = gridProgress;
tsv.gridTranslationSecondary.value = gridTranslationSecondary;
tsv.taskSecondaryTranslation.value = gridTranslationSecondary;
tsv.setScroll(startScroll);
// Fade in the task during the initial 20% of the animation
@@ -214,7 +214,8 @@ public final class TaskViewUtils {
AnimatedFloat.VALUE, 1, TOUCH_RESPONSE_INTERPOLATOR);
out.setFloat(tsv.recentsViewScale,
AnimatedFloat.VALUE, tsv.getFullScreenScale(), TOUCH_RESPONSE_INTERPOLATOR);
out.setFloat(tsv.gridProgress, AnimatedFloat.VALUE, 0, TOUCH_RESPONSE_INTERPOLATOR);
out.setFloat(tsv.taskSecondaryTranslation, AnimatedFloat.VALUE, 0,
TOUCH_RESPONSE_INTERPOLATOR_ACCEL_DEACCEL);
out.setInt(tsv, TaskViewSimulator.SCROLL, 0, TOUCH_RESPONSE_INTERPOLATOR);
TaskViewSimulator finalTsv = tsv;
@@ -15,7 +15,6 @@
*/
package com.android.quickstep.util;
import static com.android.launcher3.anim.Interpolators.ACCEL_DEACCEL;
import static com.android.launcher3.states.RotationHelper.deltaRotation;
import static com.android.launcher3.touch.PagedOrientationHandler.MATRIX_POST_TRANSLATE;
import static com.android.quickstep.util.NavigationModeFeatureFlag.LIVE_TILE;
@@ -36,7 +35,6 @@ import android.util.IntProperty;
import androidx.annotation.NonNull;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.touch.PagedOrientationHandler;
@@ -79,7 +77,6 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
private final boolean mIsRecentsRtl;
private final Rect mTaskRect = new Rect();
private final Rect mGridRect = new Rect();
private boolean mDrawsBelowRecents;
private final PointF mPivot = new PointF();
private DeviceProfile mDp;
@@ -98,21 +95,18 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
private final FullscreenDrawParams mCurrentFullscreenParams;
public final AnimatedFloat taskPrimaryTranslation = new AnimatedFloat();
public final AnimatedFloat taskSecondaryTranslation = new AnimatedFloat();
public final AnimatedFloat gridTranslationSecondary = new AnimatedFloat();
// RecentsView properties
public final AnimatedFloat recentsViewScale = new AnimatedFloat();
public final AnimatedFloat fullScreenProgress = new AnimatedFloat();
public final AnimatedFloat recentsViewSecondaryTranslation = new AnimatedFloat();
public final AnimatedFloat recentsViewPrimaryTranslation = new AnimatedFloat();
public final AnimatedFloat gridProgress = new AnimatedFloat();
private final ScrollState mScrollState = new ScrollState();
// Cached calculations
private boolean mLayoutValid = false;
private boolean mScrollValid = false;
private int mOrientationStateId;
private final int mRowSpacing;
public TaskViewSimulator(Context context, BaseActivityInterface sizeStrategy) {
mContext = context;
@@ -124,7 +118,6 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
mOrientationStateId = mOrientationState.getStateId();
Resources resources = context.getResources();
mIsRecentsRtl = mOrientationState.getOrientationHandler().getRecentsRtlSetting(resources);
mRowSpacing = (int) resources.getDimension(R.dimen.overview_grid_row_spacing);
}
/**
@@ -266,7 +259,6 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
mOrientationStateId = mOrientationState.getStateId();
getFullScreenScale();
mSizeStrategy.calculateGridSize(mContext, mDp, mGridRect);
mThumbnailData.rotation = mOrientationState.getDisplayRotation();
// mIsRecentsRtl is the inverse of TaskView RTL.
@@ -307,34 +299,6 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
mMatrix.postTranslate(insets.left, insets.top);
mMatrix.postScale(scale, scale);
// Apply TaskView matrix: gridProgress related properties
float interpolatedGridProgress = ACCEL_DEACCEL.getInterpolation(gridProgress.value);
final int boxLength = (int) Math.max(taskWidth, taskHeight);
float availableHeight = mGridRect.height();
float rowHeight = (availableHeight - mRowSpacing) / 2;
float gridScale = rowHeight / (boxLength + mDp.overviewTaskThumbnailTopMarginPx);
scale = Utilities.mapRange(interpolatedGridProgress, 1f, gridScale);
mMatrix.postScale(scale, scale, mIsRecentsRtl ? 0 : taskWidth, 0);
mOrientationState.getOrientationHandler().setSecondary(mMatrix, MATRIX_POST_TRANSLATE,
Utilities.mapRange(interpolatedGridProgress, 0, gridTranslationSecondary.value));
// Apply TaskView matrix: task rect and grid rect difference
float scaledWidth = taskWidth * gridScale;
float taskGridHorizontalDiff;
if (mIsRecentsRtl) {
float taskRight = mTaskRect.left + scaledWidth;
taskGridHorizontalDiff = mGridRect.right - taskRight;
} else {
float taskLeft = mTaskRect.right - scaledWidth;
taskGridHorizontalDiff = mGridRect.left - taskLeft;
}
float taskGridVerticalDiff =
mGridRect.top + mDp.overviewTaskThumbnailTopMarginPx * gridScale - mTaskRect.top;
mOrientationState.getOrientationHandler().set(mMatrix, MATRIX_POST_TRANSLATE,
Utilities.mapRange(interpolatedGridProgress, 0, taskGridHorizontalDiff));
mOrientationState.getOrientationHandler().setSecondary(mMatrix, MATRIX_POST_TRANSLATE,
Utilities.mapRange(interpolatedGridProgress, 0, taskGridVerticalDiff));
// Apply TaskView matrix: translate, scroll
mMatrix.postTranslate(mTaskRect.left, mTaskRect.top);
mOrientationState.getOrientationHandler().set(mMatrix, MATRIX_POST_TRANSLATE,
@@ -50,8 +50,11 @@ public class ClearAllButton extends Button implements PageCallbacks {
private boolean mIsRtl;
private float mNormalTranslationPrimary;
private float mGridTranslationPrimary;
private float mGridTranslationSecondary;
private float mGridScrollOffset;
private float mOffsetTranslationPrimary;
private int mScrollOffset;
private int mSidePadding;
public ClearAllButton(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -63,7 +66,7 @@ public class ClearAllButton extends Button implements PageCallbacks {
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
PagedOrientationHandler orientationHandler = getRecentsView().getPagedOrientationHandler();
mScrollOffset = orientationHandler.getClearAllScrollOffset(getRecentsView(), mIsRtl);
mSidePadding = orientationHandler.getClearAllSidePadding(getRecentsView(), mIsRtl);
}
private RecentsView getRecentsView() {
@@ -96,25 +99,27 @@ public class ClearAllButton extends Button implements PageCallbacks {
}
@Override
public void onPageScroll(ScrollState scrollState) {
PagedOrientationHandler orientationHandler = getRecentsView().getPagedOrientationHandler();
public void onPageScroll(ScrollState scrollState, boolean gridEnabled) {
RecentsView recentsView = getRecentsView();
if (recentsView == null) {
return;
}
PagedOrientationHandler orientationHandler = recentsView.getPagedOrientationHandler();
float orientationSize = orientationHandler.getPrimaryValue(getWidth(), getHeight());
if (orientationSize == 0) {
return;
}
float shift;
if (mIsRtl) {
shift = Math.min(scrollState.scrollFromEdge, orientationSize);
} else {
shift = Math.min(scrollState.scrollFromEdge,
orientationSize + getGridTrans(mGridTranslationPrimary))
- getGridTrans(mGridTranslationPrimary);
int leftEdgeScroll = recentsView.getLeftMostChildScroll();
float adjustedScrollFromEdge = scrollState.scrollFromEdge - leftEdgeScroll;
float shift = Math.min(adjustedScrollFromEdge, orientationSize);
mNormalTranslationPrimary = mIsRtl ? -shift : shift;
if (!gridEnabled) {
mNormalTranslationPrimary += mSidePadding;
}
mNormalTranslationPrimary = mIsRtl ? (mScrollOffset - shift) : (mScrollOffset + shift);
applyPrimaryTranslation();
orientationHandler.getSecondaryViewTranslate().set(this,
orientationHandler.getSecondaryValue(0f, getOriginalTranslationY()));
applySecondaryTranslation();
mScrollAlpha = 1 - shift / orientationSize;
updateAlpha();
}
@@ -130,11 +135,26 @@ public class ClearAllButton extends Button implements PageCallbacks {
applyPrimaryTranslation();
}
public void setGridTranslationSecondary(float gridTranslationSecondary) {
mGridTranslationSecondary = gridTranslationSecondary;
applyPrimaryTranslation();
}
public void setGridScrollOffset(float gridScrollOffset) {
mGridScrollOffset = gridScrollOffset;
}
public void setOffsetTranslationPrimary(float offsetTranslationPrimary) {
mOffsetTranslationPrimary = offsetTranslationPrimary;
applyPrimaryTranslation();
}
public float getScrollAdjustment(boolean gridEnabled) {
float scrollAdjustment = 0;
if (gridEnabled) {
scrollAdjustment += mGridTranslationPrimary;
scrollAdjustment += mGridTranslationPrimary + mGridScrollOffset;
}
scrollAdjustment += mOffsetTranslationPrimary;
return scrollAdjustment;
}
@@ -160,7 +180,21 @@ public class ClearAllButton extends Button implements PageCallbacks {
PagedOrientationHandler orientationHandler = recentsView.getPagedOrientationHandler();
orientationHandler.getPrimaryViewTranslate().set(this,
mNormalTranslationPrimary + getGridTrans(mGridTranslationPrimary));
orientationHandler.getPrimaryValue(0f, getOriginalTranslationY())
+ mNormalTranslationPrimary + mOffsetTranslationPrimary + getGridTrans(
mGridTranslationPrimary));
}
private void applySecondaryTranslation() {
RecentsView recentsView = getRecentsView();
if (recentsView == null) {
return;
}
PagedOrientationHandler orientationHandler = recentsView.getPagedOrientationHandler();
orientationHandler.getSecondaryViewTranslate().set(this,
orientationHandler.getSecondaryValue(0f, getOriginalTranslationY())
+ getGridTrans(mGridTranslationSecondary));
}
private float getGridTrans(float endTranslation) {
@@ -301,6 +301,7 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
protected final Rect mTempRect = new Rect();
protected final RectF mTempRectF = new RectF();
private final PointF mTempPointF = new PointF();
private float mFullscreenScale;
private static final int DISMISS_TASK_DURATION = 300;
private static final int ADDITION_TASK_DURATION = 200;
@@ -741,7 +742,7 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
int taskStart = mOrientationHandler.getChildStart(tv) + (int) tv.getOffsetAdjustment(
mOverviewFullscreenEnabled, showAsGrid());
int taskSize = (int) (mOrientationHandler.getMeasuredSize(tv) * tv.getSizeAdjustment(
mOverviewFullscreenEnabled, showAsGrid()));
mOverviewFullscreenEnabled));
int taskEnd = taskStart + taskSize;
return (taskStart >= start && taskStart <= end) || (taskEnd >= start
&& taskEnd <= end);
@@ -1019,7 +1020,6 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
mLiveTileTaskViewSimulator.taskSecondaryTranslation.value = 0;
mLiveTileTaskViewSimulator.fullScreenProgress.value = 0;
mLiveTileTaskViewSimulator.recentsViewScale.value = 1;
mLiveTileTaskViewSimulator.gridProgress.value = 0;
}
if (mRunningTaskTileHidden) {
setRunningTaskHidden(mRunningTaskTileHidden);
@@ -1091,6 +1091,10 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
*/
private void updateTaskSize() {
final int taskCount = getTaskViewCount();
if (taskCount == 0) {
return;
}
float accumulatedTranslationX = 0;
float[] fullscreenTranslations = new float[taskCount];
int firstNonHomeTaskIndex = 0;
@@ -1105,8 +1109,11 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
taskView.updateTaskSize();
fullscreenTranslations[i] += accumulatedTranslationX;
// Compensate space caused by TaskView scaling.
float widthDiff =
taskView.getLayoutParams().width * (1 - taskView.getFullscreenScale());
// Compensate page spacing widening caused by RecentsView scaling.
widthDiff += mPageSpacing * (1 - 1 / mFullscreenScale);
float fullscreenTranslationX = mIsRtl ? widthDiff : -widthDiff;
fullscreenTranslations[i] += fullscreenTranslationX;
accumulatedTranslationX += fullscreenTranslationX;
@@ -1180,13 +1187,13 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
View page = getPageAt(i);
mScrollState.updateInterpolation(mActivity.getDeviceProfile(),
mOrientationHandler.getChildStartWithTranslation(page));
((PageCallbacks) page).onPageScroll(mScrollState);
((PageCallbacks) page).onPageScroll(mScrollState, mOverviewGridEnabled);
}
}
@Override
protected int getDestinationPage(int scaledScroll) {
if (mGridProgress == 0) {
if (!showAsGrid()) {
return super.getDestinationPage(scaledScroll);
}
@@ -1599,11 +1606,7 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
}
final int boxLength = Math.max(mTaskWidth, mTaskHeight);
float availableHeight = mLastComputedGridSize.height();
float rowHeight = (availableHeight - mRowSpacing) / 2;
int taskTopMargin = mActivity.getDeviceProfile().overviewTaskThumbnailTopMarginPx;
float gridScale = rowHeight / (boxLength + taskTopMargin);
int topRowWidth = 0;
int bottomRowWidth = 0;
float topAccumulatedTranslationX = 0;
@@ -1621,43 +1624,17 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
continue;
}
taskView.setGridScale(gridScale);
float scaledWidth = taskView.getLayoutParams().width * gridScale;
float taskGridHorizontalDiff;
if (mIsRtl) {
float taskRight = mLastComputedTaskSize.left + scaledWidth;
taskGridHorizontalDiff = mLastComputedGridSize.right - taskRight;
} else {
float taskLeft = mLastComputedTaskSize.right - scaledWidth;
taskGridHorizontalDiff = mLastComputedGridSize.left - taskLeft;
}
gridTranslations[i] -= taskGridHorizontalDiff;
taskView.setGridOffsetTranslationX(taskGridHorizontalDiff);
float taskGridVerticalDiff = mLastComputedGridSize.top + taskTopMargin * gridScale
- mLastComputedTaskSize.top;
// Off-set gap due to task scaling.
float widthDiff = taskView.getLayoutParams().width * (1 - gridScale);
float gridScaleTranslationX = mIsRtl ? widthDiff : -widthDiff;
gridTranslations[i] += gridScaleTranslationX;
// Visible offset caused by having scaling pivot on top-right.
taskView.setNonRtlVisibleOffset(mIsRtl ? 0 : widthDiff);
if (topRowWidth <= bottomRowWidth) {
gridTranslations[i] += topAccumulatedTranslationX;
topRowWidth += taskView.getLayoutParams().width * gridScale + mPageSpacing;
topRowWidth += taskView.getLayoutParams().width + mPageSpacing;
topSet.add(i);
taskView.setGridTranslationY(taskGridVerticalDiff);
taskView.setGridTranslationY(0);
// Move horizontally into empty space.
float widthOffset = 0;
for (int j = i - 1; bottomSet.contains(j); j--) {
widthOffset += getTaskViewAt(j).getLayoutParams().width * gridScale
+ mPageSpacing;
widthOffset += getTaskViewAt(j).getLayoutParams().width + mPageSpacing;
}
float gridTranslationX = mIsRtl ? widthOffset : -widthOffset;
@@ -1665,26 +1642,39 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
topAccumulatedTranslationX += gridTranslationX;
} else {
gridTranslations[i] += bottomAccumulatedTranslationX;
bottomRowWidth += taskView.getLayoutParams().width * gridScale + mPageSpacing;
bottomRowWidth += taskView.getLayoutParams().width + mPageSpacing;
bottomSet.add(i);
// Move into bottom row.
float heightOffset = (boxLength + taskTopMargin) * gridScale + mRowSpacing;
taskView.setGridTranslationY(heightOffset + taskGridVerticalDiff);
float heightOffset = (boxLength + taskTopMargin) + mRowSpacing;
taskView.setGridTranslationY(heightOffset);
// Move horizontally into empty space.
float widthOffset = 0;
for (int j = i - 1; topSet.contains(j); j--) {
widthOffset += getTaskViewAt(j).getLayoutParams().width * gridScale
+ mPageSpacing;
widthOffset += getTaskViewAt(j).getLayoutParams().width + mPageSpacing;
}
float gridTranslationX = mIsRtl ? widthOffset : -widthOffset;
gridTranslations[i] += gridTranslationX;
bottomAccumulatedTranslationX += gridTranslationX;
}
topAccumulatedTranslationX += gridScaleTranslationX;
bottomAccumulatedTranslationX += gridScaleTranslationX;
}
// If the first non-home task does not take full width of task Rect, shift all tasks
// accordingly without affecting scrolls.
int firstTaskWidth = getTaskViewAt(firstNonHomeTaskIndex).getLayoutParams().width;
float firstNonHomeTaskOffset = firstTaskWidth == ViewGroup.LayoutParams.MATCH_PARENT ? 0
: mTaskWidth - firstTaskWidth;
float offsetTranslation = mIsRtl ? firstNonHomeTaskOffset : -firstNonHomeTaskOffset;
// We need to maintain first non-home task's grid translation at 0, now shift translation
// of all the TaskViews to achieve that.
for (int i = firstNonHomeTaskIndex; i < taskCount; i++) {
TaskView taskView = getTaskViewAt(i);
taskView.setGridTranslationX(
gridTranslations[i] - gridTranslations[firstNonHomeTaskIndex]);
taskView.setGridOffsetTranslationX(offsetTranslation);
}
// Use the accumulated translation of the longer row.
@@ -1700,7 +1690,7 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
shorterRowCompensation = bottomRowWidth - topRowWidth;
}
} else {
if (!topSet.contains(taskCount - 1)) {
if (bottomSet.contains(taskCount - 1)) {
shorterRowCompensation = topRowWidth - bottomRowWidth;
}
}
@@ -1721,14 +1711,14 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
clearAllAccumulatedTranslation + clearAllShorterRowCompensation
+ clearAllShortTotalCompensation;
// We need to maintain first non-home task's grid translation at 0, now shift translation
// of all the TaskViews to achieve that.
for (int i = firstNonHomeTaskIndex; i < taskCount; i++) {
getTaskViewAt(i).setGridTranslationX(
gridTranslations[i] - gridTranslations[firstNonHomeTaskIndex]);
}
mClearAllButton.setGridTranslationPrimary(
clearAllTotalTranslationX - gridTranslations[firstNonHomeTaskIndex]);
mClearAllButton.setGridTranslationSecondary(
boxLength - mTaskHeight / 2f + mRowSpacing / 2f);
mClearAllButton.setGridScrollOffset(
mIsRtl ? mLastComputedTaskSize.left - mLastComputedGridSize.left
: mLastComputedTaskSize.right - mLastComputedGridSize.right);
mClearAllButton.setOffsetTranslationPrimary(offsetTranslation);
setGridProgress(mGridProgress);
}
@@ -1753,7 +1743,6 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
for (int i = 0; i < taskCount; i++) {
getTaskViewAt(i).setGridProgress(gridProgress);
}
mLiveTileTaskViewSimulator.gridProgress.value = gridProgress;
mClearAllButton.setGridProgress(gridProgress);
}
@@ -1801,8 +1790,10 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
/**
* Updates the page UI based on scroll params.
*
* @param gridEnabled whether Overveiw is currently showing as 2 rows grid
*/
default void onPageScroll(ScrollState scrollState) {}
default void onPageScroll(ScrollState scrollState, boolean gridEnabled) {}
}
public static class ScrollState extends CurveProperties {
@@ -2297,7 +2288,7 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
// Update the pivots such that when the task is scaled, it fills the full page
getTaskSize(mTempRect);
getPagedViewOrientedState().getFullScreenScaleAndPivot(
mFullscreenScale = getPagedViewOrientedState().getFullScreenScaleAndPivot(
mTempRect, mActivity.getDeviceProfile(), mTempPointF);
setPivotX(mTempPointF.x);
setPivotY(mTempPointF.y);
@@ -2858,22 +2849,42 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
@Override
protected int computeMinScroll() {
if (getTaskViewCount() > 0) {
if (mDisallowScrollToClearAll) {
if (mIsRtl && mDisallowScrollToClearAll) {
// We aren't showing the clear all button,
// so use the leftmost task as the min scroll.
if (mIsRtl) {
return getScrollForPage(indexOfChild(getTaskViewAt(getTaskViewCount() - 1)));
}
return getScrollForPage(mTaskViewStartIndex);
return getScrollForPage(indexOfChild(getTaskViewAt(getTaskViewCount() - 1)));
}
if (mIsRtl) {
return getScrollForPage(indexOfChild(getTaskViewAt(getTaskViewCount() - 1)) + 1);
}
return getScrollForPage(mTaskViewStartIndex);
return getLeftMostChildScroll();
}
return super.computeMinScroll();
}
/**
* Returns page scroll of the left most child.
*/
public int getLeftMostChildScroll() {
if (mIsRtl) {
return getScrollForPage(indexOfChild(getTaskViewAt(getTaskViewCount() - 1)) + 1);
}
return getScrollForPage(mTaskViewStartIndex);
}
@Override
protected int computeMaxScroll() {
if (getTaskViewCount() > 0) {
if (!mIsRtl && mDisallowScrollToClearAll) {
// We aren't showing the clear all button,
// so use the rightmost task as the min scroll.
return getScrollForPage(indexOfChild(getTaskViewAt(getTaskViewCount() - 1)));
}
if (mIsRtl) {
return getScrollForPage(mTaskViewStartIndex);
}
return getScrollForPage(indexOfChild(getTaskViewAt(getTaskViewCount() - 1)) + 1);
}
return super.computeMaxScroll();
}
@Override
protected boolean getPageScrolls(int[] outPageScrolls, boolean layoutChildren,
ComputePageScrollsLogic scrollLogic) {
@@ -2919,26 +2930,7 @@ public abstract class RecentsView<T extends StatefulActivity> extends PagedView
return super.getChildVisibleSize(index);
}
return (int) (super.getChildVisibleSize(index) * taskView.getSizeAdjustment(
mOverviewFullscreenEnabled, showAsGrid()));
}
@Override
protected int computeMaxScroll() {
if (getTaskViewCount() > 0) {
if (mDisallowScrollToClearAll) {
// We aren't showing the clear all button,
// so use the rightmost task as the min scroll.
if (mIsRtl) {
return getScrollForPage(mTaskViewStartIndex);
}
return getScrollForPage(indexOfChild(getTaskViewAt(getTaskViewCount() - 1)));
}
if (mIsRtl) {
return getScrollForPage(mTaskViewStartIndex);
}
return getScrollForPage(indexOfChild(getTaskViewAt(getTaskViewCount() - 1)) + 1);
}
return super.computeMaxScroll();
mOverviewFullscreenEnabled));
}
public ClearAllButton getClearAllButton() {
@@ -279,7 +279,6 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
private float mFullscreenProgress;
private float mGridProgress;
private float mFullscreenScale = 1;
private float mGridScale = 1;
private final FullscreenDrawParams mCurrentFullscreenParams;
private final StatefulActivity mActivity;
@@ -298,7 +297,6 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
private float mGridTranslationY;
// Offset translation does not affect scroll calculation.
private float mGridOffsetTranslationX;
private float mNonRtlVisibleOffset;
private ObjectAnimator mIconAndDimAnimator;
private float mIconScaleAnimStartProgress = 0;
@@ -678,9 +676,10 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
PagedOrientationHandler orientationHandler = orientationState.getOrientationHandler();
boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
LayoutParams snapshotParams = (LayoutParams) mSnapshotView.getLayoutParams();
snapshotParams.topMargin = mActivity.getDeviceProfile().overviewTaskThumbnailTopMarginPx;
int taskIconMargin = mActivity.getDeviceProfile().overviewTaskMarginPx;
int taskIconHeight = (int) getResources().getDimension(R.dimen.task_thumbnail_icon_size);
DeviceProfile deviceProfile = mActivity.getDeviceProfile();
snapshotParams.topMargin = deviceProfile.overviewTaskThumbnailTopMarginPx;
int taskIconMargin = deviceProfile.overviewTaskMarginPx;
int taskIconHeight = deviceProfile.overviewTaskIconSizePx;
LayoutParams iconParams = (LayoutParams) mIconView.getLayoutParams();
switch (orientationHandler.getRotation()) {
case ROTATION_90:
@@ -709,8 +708,11 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
break;
}
mSnapshotView.setLayoutParams(snapshotParams);
iconParams.width = iconParams.height = taskIconHeight;
mIconView.setLayoutParams(iconParams);
mIconView.setRotation(orientationHandler.getDegreesRotated());
snapshotParams.topMargin = deviceProfile.overviewTaskThumbnailTopMarginPx;
mSnapshotView.setLayoutParams(snapshotParams);
if (mMenuView != null) {
mMenuView.onRotationChanged();
@@ -790,8 +792,8 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
@Override
public void onRecycle() {
mFullscreenTranslationX = mGridTranslationX = mGridTranslationY =
mGridOffsetTranslationX = mBoxTranslationY = mNonRtlVisibleOffset = 0f;
mFullscreenTranslationX = mGridTranslationX =
mGridTranslationY = mGridOffsetTranslationX = mBoxTranslationY = 0f;
resetViewTransforms();
// Clear any references to the thumbnail (it will be re-read either from the cache or the
// system on next bind)
@@ -801,7 +803,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
}
@Override
public void onPageScroll(ScrollState scrollState) {
public void onPageScroll(ScrollState scrollState, boolean gridEnabled) {
// Don't do anything if it's modal.
if (mModalness > 0) {
return;
@@ -904,11 +906,6 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
return mFullscreenScale;
}
public void setGridScale(float gridScale) {
mGridScale = gridScale;
applyScale();
}
/**
* Moves TaskView between carousel and 2 row grid.
*
@@ -925,8 +922,6 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
float scale = 1;
float fullScreenProgress = EXAGGERATED_EASE.getInterpolation(mFullscreenProgress);
scale *= Utilities.mapRange(fullScreenProgress, 1f, mFullscreenScale);
float gridProgress = ACCEL_DEACCEL.getInterpolation(mGridProgress);
scale *= Utilities.mapRange(gridProgress, 1f, mGridScale);
setScaleX(scale);
setScaleY(scale);
}
@@ -989,10 +984,6 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
applyTranslationX();
}
public void setNonRtlVisibleOffset(float nonRtlVisibleOffset) {
mNonRtlVisibleOffset = nonRtlVisibleOffset;
}
public float getScrollAdjustment(boolean fullscreenEnabled, boolean gridEnabled) {
float scrollAdjustment = 0;
if (fullscreenEnabled) {
@@ -1004,22 +995,19 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable {
return scrollAdjustment;
}
public float getOffsetAdjustment(boolean fullscreenEnabled, boolean gridEnabled) {
public float getOffsetAdjustment(boolean fullscreenEnabled,boolean gridEnabled) {
float offsetAdjustment = getScrollAdjustment(fullscreenEnabled, gridEnabled);
if (gridEnabled) {
offsetAdjustment += mGridOffsetTranslationX + mNonRtlVisibleOffset;
offsetAdjustment += mGridOffsetTranslationX;
}
return offsetAdjustment;
}
public float getSizeAdjustment(boolean fullscreenEnabled, boolean gridEnabled) {
public float getSizeAdjustment(boolean fullscreenEnabled) {
float sizeAdjustment = 1;
if (fullscreenEnabled) {
sizeAdjustment *= mFullscreenScale;
}
if (gridEnabled) {
sizeAdjustment *= mGridScale;
}
return sizeAdjustment;
}
+1
View File
@@ -294,6 +294,7 @@
<!-- Overview placeholder to compile in Launcer3 without Quickstep -->
<dimen name="task_thumbnail_icon_size">0dp</dimen>
<dimen name="task_thumbnail_icon_size_grid">0dp</dimen>
<dimen name="overview_task_margin">0dp</dimen>
</resources>
+7 -4
View File
@@ -152,8 +152,9 @@ public class DeviceProfile {
public float allAppsIconTextSizePx;
// Overview
public int overviewTaskThumbnailTopMarginPx;
public int overviewTaskMarginPx;
public int overviewTaskIconSizePx;
public int overviewTaskThumbnailTopMarginPx;
// Widgets
public final PointF appWidgetScale = new PointF(1.0f, 1.0f);
@@ -301,10 +302,12 @@ public class DeviceProfile {
: (hotseatBarTopPaddingPx + hotseatBarBottomPaddingPx
+ (isScalableGrid ? 0 : hotseatExtraVerticalSize)));
overviewTaskMarginPx = res.getDimensionPixelSize(R.dimen.overview_task_margin);
overviewTaskThumbnailTopMarginPx = res.getDimensionPixelSize(
R.dimen.task_thumbnail_icon_size) + 2 * overviewTaskMarginPx;
overviewTaskIconSizePx =
isTablet && FeatureFlags.ENABLE_OVERVIEW_GRID.get() ? res.getDimensionPixelSize(
R.dimen.task_thumbnail_icon_size_grid) : res.getDimensionPixelSize(
R.dimen.task_thumbnail_icon_size);
overviewTaskThumbnailTopMarginPx = overviewTaskIconSizePx + overviewTaskMarginPx * 2;
// Calculate all of the remaining variables.
extraSpace = updateAvailableDimensions(res);
+15 -8
View File
@@ -1512,17 +1512,16 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
return getDestinationPage(mOrientationHandler.getPrimaryScroll(this));
}
protected int getDestinationPage(int scaledScroll) {
return getPageNearestToCenterOfScreen(scaledScroll);
protected int getDestinationPage(int primaryScroll) {
return getPageNearestToCenterOfScreen(primaryScroll);
}
public int getPageNearestToCenterOfScreen() {
return getPageNearestToCenterOfScreen(mOrientationHandler.getPrimaryScroll(this));
}
private int getPageNearestToCenterOfScreen(int scaledScroll) {
int pageOrientationSize = mOrientationHandler.getMeasuredSize(this);
int screenCenter = scaledScroll + (pageOrientationSize / 2);
private int getPageNearestToCenterOfScreen(int primaryScroll) {
int screenCenter = getScreenCenter(primaryScroll);
int minDistanceFromScreenCenter = Integer.MAX_VALUE;
int minDistanceFromScreenCenterIndex = -1;
final int childCount = getChildCount();
@@ -1538,18 +1537,26 @@ public abstract class PagedView<T extends View & PageIndicator> extends ViewGrou
}
private int getDisplacementFromScreenCenter(int childIndex, int screenCenter) {
int childSize = getChildVisibleSize(childIndex);
int childSize = Math.round(getChildVisibleSize(childIndex));
int halfChildSize = (childSize / 2);
int childCenter = getChildOffset(childIndex) + halfChildSize;
return childCenter - screenCenter;
}
protected int getDisplacementFromScreenCenter(int childIndex) {
int pageOrientationSize = mOrientationHandler.getMeasuredSize(this);
int screenCenter = mOrientationHandler.getPrimaryScroll(this) + (pageOrientationSize / 2);
int primaryScroll = mOrientationHandler.getPrimaryScroll(this);
int screenCenter = getScreenCenter(primaryScroll);
return getDisplacementFromScreenCenter(childIndex, screenCenter);
}
private int getScreenCenter(int primaryScroll) {
float primaryScale = mOrientationHandler.getPrimaryScale(this);
float primaryPivot = mOrientationHandler.getPrimaryValue(getPivotX(), getPivotY());
int pageOrientationSize = mOrientationHandler.getMeasuredSize(this);
return Math.round(primaryScroll + (pageOrientationSize / 2f - primaryPivot) / primaryScale
+ primaryPivot);
}
protected void snapToDestination() {
snapToPage(getDestinationPage(), getPageSnapDuration());
}
@@ -77,6 +77,9 @@ public class Interpolators {
public static final Interpolator TOUCH_RESPONSE_INTERPOLATOR =
new PathInterpolator(0.3f, 0f, 0.1f, 1f);
public static final Interpolator TOUCH_RESPONSE_INTERPOLATOR_ACCEL_DEACCEL =
v -> ACCEL_DEACCEL.getInterpolation(TOUCH_RESPONSE_INTERPOLATOR.getInterpolation(v));
/**
* Inversion of ZOOM_OUT, compounded with an ease-out.
@@ -136,7 +136,7 @@ public class LandscapePagedViewHandler implements PagedOrientationHandler {
}
@Override
public int getClearAllScrollOffset(View view, boolean isRtl) {
public int getClearAllSidePadding(View view, boolean isRtl) {
return (isRtl ? view.getPaddingBottom() : - view.getPaddingTop()) / 2;
}
@@ -66,7 +66,7 @@ public interface PagedOrientationHandler {
float getPrimaryVelocity(VelocityTracker velocityTracker, int pointerId);
int getMeasuredSize(View view);
float getPrimarySize(RectF rect);
int getClearAllScrollOffset(View view, boolean isRtl);
int getClearAllSidePadding(View view, boolean isRtl);
int getSecondaryDimension(View view);
FloatProperty<View> getPrimaryViewTranslate();
FloatProperty<View> getSecondaryViewTranslate();
@@ -132,7 +132,7 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler {
}
@Override
public int getClearAllScrollOffset(View view, boolean isRtl) {
public int getClearAllSidePadding(View view, boolean isRtl) {
return (isRtl ? view.getPaddingRight() : - view.getPaddingLeft()) / 2;
}