Fix launch animation from grid am: f75725830a
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/16240053 Change-Id: I6815036c3d3916a4378340c089a35339a52206d4
This commit is contained in:
@@ -322,11 +322,11 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
|
||||
public final void calculateGridTaskSize(Context context, DeviceProfile dp, Rect outRect,
|
||||
PagedOrientationHandler orientedState) {
|
||||
Resources res = context.getResources();
|
||||
Rect gridRect = new Rect();
|
||||
calculateGridSize(context, dp, gridRect);
|
||||
Rect taskRect = new Rect();
|
||||
calculateTaskSize(context, dp, taskRect);
|
||||
|
||||
float rowHeight =
|
||||
(gridRect.height() + dp.overviewTaskThumbnailTopMarginPx - dp.overviewRowSpacing)
|
||||
(taskRect.height() + dp.overviewTaskThumbnailTopMarginPx - dp.overviewRowSpacing)
|
||||
/ 2f;
|
||||
|
||||
PointF taskDimension = getTaskDimension(context, dp);
|
||||
@@ -336,7 +336,7 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
|
||||
|
||||
int gravity = Gravity.TOP;
|
||||
gravity |= orientedState.getRecentsRtlSetting(res) ? Gravity.RIGHT : Gravity.LEFT;
|
||||
Gravity.apply(gravity, outWidth, outHeight, gridRect, outRect);
|
||||
Gravity.apply(gravity, outWidth, outHeight, taskRect, outRect);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -215,6 +215,7 @@ public final class TaskViewUtils {
|
||||
tvsLocal.taskSecondaryTranslation.value = gridTranslationSecondary;
|
||||
}
|
||||
tvsLocal.setScroll(startScroll);
|
||||
tvsLocal.setIsGridTask(v.isGridTask());
|
||||
|
||||
// Fade in the task during the initial 20% of the animation
|
||||
out.addFloat(targetHandle.getTransformParams(), TransformParams.TARGET_ALPHA, 0, 1,
|
||||
|
||||
@@ -101,6 +101,7 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
|
||||
private int mOrientationStateId;
|
||||
private StagedSplitBounds mStagedSplitBounds;
|
||||
private boolean mDrawsBelowRecents;
|
||||
private boolean mIsGridTask;
|
||||
|
||||
public TaskViewSimulator(Context context, BaseActivityInterface sizeStrategy) {
|
||||
mContext = context;
|
||||
@@ -140,18 +141,23 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
|
||||
if (mDp == null) {
|
||||
return 1;
|
||||
}
|
||||
Rect fullTaskSize = new Rect();
|
||||
mSizeStrategy.calculateTaskSize(mContext, mDp, fullTaskSize);
|
||||
if (mIsGridTask) {
|
||||
mSizeStrategy.calculateGridTaskSize(mContext, mDp, mTaskRect,
|
||||
mOrientationState.getOrientationHandler());
|
||||
} else {
|
||||
mSizeStrategy.calculateTaskSize(mContext, mDp, mTaskRect);
|
||||
}
|
||||
|
||||
Rect fullTaskSize;
|
||||
if (mStagedSplitBounds != null) {
|
||||
// The task rect changes according to the staged split task sizes, but recents
|
||||
// fullscreen scale and pivot remains the same since the task fits into the existing
|
||||
// sized task space bounds
|
||||
mSizeStrategy.calculateTaskSize(mContext, mDp, mTaskRect);
|
||||
fullTaskSize = new Rect(mTaskRect);
|
||||
mOrientationState.getOrientationHandler()
|
||||
.setSplitTaskSwipeRect(mDp, mTaskRect, mStagedSplitBounds, mStagePosition);
|
||||
} else {
|
||||
mTaskRect.set(fullTaskSize);
|
||||
fullTaskSize = mTaskRect;
|
||||
}
|
||||
return mOrientationState.getFullScreenScaleAndPivot(fullTaskSize, mDp, mPivot);
|
||||
}
|
||||
@@ -204,6 +210,13 @@ public class TaskViewSimulator implements TransformParams.BuilderProxy {
|
||||
mDrawsBelowRecents = drawsBelowRecents;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether the task is part of overview grid and not being focused.
|
||||
*/
|
||||
public void setIsGridTask(boolean isGridTask) {
|
||||
mIsGridTask = isGridTask;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds animation for all the components corresponding to transition from an app to overview.
|
||||
*/
|
||||
|
||||
@@ -157,6 +157,7 @@ import com.android.quickstep.TaskOverlayFactory;
|
||||
import com.android.quickstep.TaskThumbnailCache;
|
||||
import com.android.quickstep.TaskViewUtils;
|
||||
import com.android.quickstep.ViewUtils;
|
||||
import com.android.quickstep.util.GroupTask;
|
||||
import com.android.quickstep.util.LayoutUtils;
|
||||
import com.android.quickstep.util.RecentsOrientedState;
|
||||
import com.android.quickstep.util.SplitScreenBounds;
|
||||
@@ -166,7 +167,6 @@ import com.android.quickstep.util.TaskViewSimulator;
|
||||
import com.android.quickstep.util.TransformParams;
|
||||
import com.android.quickstep.util.VibratorWrapper;
|
||||
import com.android.systemui.plugins.ResourceProvider;
|
||||
import com.android.quickstep.util.GroupTask;
|
||||
import com.android.systemui.shared.recents.model.Task;
|
||||
import com.android.systemui.shared.recents.model.Task.TaskKey;
|
||||
import com.android.systemui.shared.recents.model.ThumbnailData;
|
||||
@@ -1018,8 +1018,10 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
}
|
||||
|
||||
private TaskView getLastGridTaskView() {
|
||||
IntArray topRowIdArray = getTopRowIdArray();
|
||||
IntArray bottomRowIdArray = getBottomRowIdArray();
|
||||
return getLastGridTaskView(getTopRowIdArray(), getBottomRowIdArray());
|
||||
}
|
||||
|
||||
private TaskView getLastGridTaskView(IntArray topRowIdArray, IntArray bottomRowIdArray) {
|
||||
if (topRowIdArray.isEmpty() && bottomRowIdArray.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
@@ -3145,38 +3147,23 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
}
|
||||
}
|
||||
|
||||
TaskView newLastGridTaskView = getLastGridTaskView();
|
||||
IntArray topRowIdArray = getTopRowIdArray();
|
||||
IntArray bottomRowIdArray = getBottomRowIdArray();
|
||||
if (finalSnapToLastTask) {
|
||||
// If snapping to last task, find the last task after dismissal.
|
||||
pageToSnapTo = indexOfChild(newLastGridTaskView);
|
||||
pageToSnapTo = indexOfChild(
|
||||
getLastGridTaskView(topRowIdArray, bottomRowIdArray));
|
||||
} else if (taskViewIdToSnapTo != -1) {
|
||||
// If snapping to another page due to indices rearranging, find
|
||||
// the new index after dismissal & rearrange using the task view id.
|
||||
pageToSnapTo = indexOfChild(
|
||||
getTaskViewFromTaskViewId(taskViewIdToSnapTo));
|
||||
int taskViewToSnapToScroll = getScrollForPage(pageToSnapTo);
|
||||
int lastGridTaskScroll = getScrollForPage(
|
||||
indexOfChild(newLastGridTaskView));
|
||||
if (!currentPageSnapsToEndOfGrid
|
||||
&& taskViewToSnapToScroll == lastGridTaskScroll) {
|
||||
if (!currentPageSnapsToEndOfGrid) {
|
||||
// If it wasn't snapped to one of the last pages, but is now
|
||||
// snapped to last pages, we'll need to compensate for the
|
||||
// difference as last pages' scroll is the position where
|
||||
// ClearAllButton is barely invisible, instead of aligned to
|
||||
// mLastComputedTaskSize.
|
||||
int normalTaskEnd = mIsRtl
|
||||
? mLastComputedTaskSize.right
|
||||
: mLastComputedTaskSize.left;
|
||||
int lastTaskStart = mIsRtl
|
||||
? mLastComputedGridSize.left
|
||||
: mLastComputedGridSize.right;
|
||||
// As snapped task is not the last task, it can only be the
|
||||
// second last task.
|
||||
int distanceToSnappedTaskEnd =
|
||||
(mPageSpacing + mLastComputedGridTaskSize.width()) * 2;
|
||||
int snappedTaskEnd = lastTaskStart + (mIsRtl
|
||||
? distanceToSnappedTaskEnd : -distanceToSnappedTaskEnd);
|
||||
mCurrentPageScrollDiff += snappedTaskEnd - normalTaskEnd;
|
||||
// offset from the page's scroll to its visual position.
|
||||
mCurrentPageScrollDiff += getOffsetFromScrollPosition(
|
||||
pageToSnapTo, topRowIdArray, bottomRowIdArray);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4613,7 +4600,58 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||
overScrollShift, getUndampedOverScrollShift());
|
||||
}
|
||||
return getScrollForPage(pageIndex) - mOrientationHandler.getPrimaryScroll(this)
|
||||
+ overScrollShift;
|
||||
+ overScrollShift + getOffsetFromScrollPosition(pageIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns how many pixels the page is offset from its scroll position.
|
||||
*/
|
||||
private int getOffsetFromScrollPosition(int pageIndex) {
|
||||
return getOffsetFromScrollPosition(pageIndex, getTopRowIdArray(), getBottomRowIdArray());
|
||||
}
|
||||
|
||||
private int getOffsetFromScrollPosition(
|
||||
int pageIndex, IntArray topRowIdArray, IntArray bottomRowIdArray) {
|
||||
if (!showAsGrid()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
TaskView taskView = getTaskViewAt(pageIndex);
|
||||
if (taskView == null) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
TaskView lastGridTaskView = getLastGridTaskView(topRowIdArray, bottomRowIdArray);
|
||||
if (lastGridTaskView == null) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (getScrollForPage(pageIndex) != getScrollForPage(indexOfChild(lastGridTaskView))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Check distance from lastGridTaskView to taskView.
|
||||
int lastGridTaskViewPosition =
|
||||
getPositionInRow(lastGridTaskView, topRowIdArray, bottomRowIdArray);
|
||||
int taskViewPosition = getPositionInRow(taskView, topRowIdArray, bottomRowIdArray);
|
||||
int gridTaskSizeAndSpacing = mLastComputedGridTaskSize.width() + mPageSpacing;
|
||||
int positionDiff = gridTaskSizeAndSpacing * (lastGridTaskViewPosition - taskViewPosition);
|
||||
|
||||
int lastTaskEnd = (mIsRtl
|
||||
? mLastComputedGridSize.left
|
||||
: mLastComputedGridSize.right)
|
||||
+ (mIsRtl ? mPageSpacing : -mPageSpacing);
|
||||
int taskEnd = lastTaskEnd + (mIsRtl ? positionDiff : -positionDiff);
|
||||
int normalTaskEnd = mIsRtl
|
||||
? mLastComputedGridTaskSize.left
|
||||
: mLastComputedGridTaskSize.right;
|
||||
return taskEnd - normalTaskEnd;
|
||||
}
|
||||
|
||||
private int getPositionInRow(
|
||||
TaskView taskView, IntArray topRowIdArray, IntArray bottomRowIdArray) {
|
||||
int position = topRowIdArray.indexOf(taskView.getTaskViewId());
|
||||
return position != -1 ? position : bottomRowIdArray.indexOf(taskView.getTaskViewId());
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -877,7 +877,7 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
LayoutParams snapshotParams = (LayoutParams) mSnapshotView.getLayoutParams();
|
||||
DeviceProfile deviceProfile = mActivity.getDeviceProfile();
|
||||
snapshotParams.topMargin = deviceProfile.overviewTaskThumbnailTopMarginPx;
|
||||
boolean isGridTask = deviceProfile.overviewShowAsGrid && !isFocusedTask();
|
||||
boolean isGridTask = isGridTask();
|
||||
int taskIconHeight = deviceProfile.overviewTaskIconSizePx;
|
||||
int taskMargin = isGridTask ? deviceProfile.overviewTaskMarginGridPx
|
||||
: deviceProfile.overviewTaskMarginPx;
|
||||
@@ -897,6 +897,14 @@ public class TaskView extends FrameLayout implements Reusable {
|
||||
mSnapshotView.getTaskOverlay().updateOrientationState(orientationState);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the task is part of overview grid and not being focused.
|
||||
*/
|
||||
public boolean isGridTask() {
|
||||
DeviceProfile deviceProfile = mActivity.getDeviceProfile();
|
||||
return deviceProfile.overviewShowAsGrid && !isFocusedTask();
|
||||
}
|
||||
|
||||
private void setIconAndDimTransitionProgress(float progress, boolean invert) {
|
||||
if (invert) {
|
||||
progress = 1 - progress;
|
||||
|
||||
Reference in New Issue
Block a user