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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user