Merge "overview: rebalance hidden tasks in grid" into sc-v2-dev

This commit is contained in:
Thales Lima 2021-08-16 19:16:30 +00:00 committed by Android (Google) Code Review
commit 242c8c0b0f
1 changed files with 117 additions and 7 deletions

View File

@ -125,6 +125,7 @@ import com.android.launcher3.statemanager.StatefulActivity;
import com.android.launcher3.touch.OverScroll;
import com.android.launcher3.touch.PagedOrientationHandler;
import com.android.launcher3.util.DynamicResource;
import com.android.launcher3.util.IntArray;
import com.android.launcher3.util.IntSet;
import com.android.launcher3.util.MultiValueAlpha;
import com.android.launcher3.util.ResourceBasedOverride.Overrides;
@ -2087,23 +2088,39 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
}
}
/** Updates TaskView and ClearAllButtion scaling and translation required to turn into grid
/**
* Updates TaskView and ClearAllButtion scaling and translation required to turn into grid
* layout.
* This method is used when no task dismissal has occurred.
*/
private void updateGridProperties() {
updateGridProperties(false);
updateGridProperties(false, Integer.MAX_VALUE);
}
/**
* Updates TaskView and ClearAllButtion scaling and translation required to turn into grid
* layout.
*
* This method is used when task dismissal has occurred, but rebalance is not needed.
*
* @param isTaskDismissal indicates if update was called due to task dismissal
*/
private void updateGridProperties(boolean isTaskDismissal) {
updateGridProperties(isTaskDismissal, Integer.MAX_VALUE);
}
/**
* Updates TaskView and ClearAllButton scaling and translation required to turn into grid
* layout.
*
* This method only calculates the potential position and depends on {@link #setGridProgress} to
* apply the actual scaling and translation.
*
* @param isTaskDismissal indicates if update was called due to task dismissal
* @param isTaskDismissal indicates if update was called due to task dismissal
* @param startRebalanceAfter which view index to start rebalancing from. Use Integer.MAX_VALUE
* to skip rebalance
*/
private void updateGridProperties(boolean isTaskDismissal) {
private void updateGridProperties(boolean isTaskDismissal, int startRebalanceAfter) {
int taskCount = getTaskViewCount();
if (taskCount == 0) {
return;
@ -2170,8 +2187,20 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
focusedTaskShift += mIsRtl ? taskWidthAndSpacing : -taskWidthAndSpacing;
}
int taskViewId = taskView.getTaskViewId();
boolean isTopRow = isTaskDismissal ? mTopRowIdSet.contains(taskViewId)
: topRowWidth <= bottomRowWidth;
// Rebalance the grid starting after a certain index
boolean isTopRow;
if (isTaskDismissal) {
if (i > startRebalanceAfter) {
mTopRowIdSet.remove(taskViewId);
isTopRow = topRowWidth <= bottomRowWidth;
} else {
isTopRow = mTopRowIdSet.contains(taskViewId);
}
} else {
isTopRow = topRowWidth <= bottomRowWidth;
}
if (isTopRow) {
if (homeTaskView != null && nextFocusedTaskView == null) {
// TaskView will be focused when swipe up, don't count towards row width.
@ -2677,9 +2706,44 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
mTopRowIdSet.remove(mFocusedTaskViewId);
finalNextFocusedTaskView.animateIconScaleAndDimIntoView();
}
updateTaskSize(true);
updateTaskSize(/*isTaskDismissal=*/ true);
// Update scroll and snap to page.
updateScrollSynchronously();
int highestVisibleTaskIndex = getHighestVisibleTaskIndex();
if (highestVisibleTaskIndex < Integer.MAX_VALUE) {
TaskView taskView = getTaskViewAt(highestVisibleTaskIndex);
boolean shouldRebalance = false;
int screenStart = mOrientationHandler.getPrimaryScroll(
RecentsView.this);
int taskStart = mOrientationHandler.getChildStart(taskView)
+ (int) taskView.getOffsetAdjustment(
/*fullscreenEnabled=*/ false,
/*gridEnabled=*/ true);
// Rebalance only if there is a maximum gap between the task and the
// screen's edge; this ensures that rebalanced tasks are outside the
// visible screen.
if (mIsRtl) {
shouldRebalance = taskStart <= screenStart + mPageSpacing;
} else {
int screenEnd = screenStart + mOrientationHandler.getMeasuredSize(
RecentsView.this);
int taskSize = (int) (mOrientationHandler.getMeasuredSize(taskView)
* taskView.getSizeAdjustment(/*fullscreenEnabled=*/ false));
int taskEnd = taskStart + taskSize;
shouldRebalance = taskEnd >= screenEnd - mPageSpacing;
}
if (shouldRebalance) {
updateGridProperties(/*isTaskDismissal=*/ true,
highestVisibleTaskIndex);
updateScrollSynchronously();
}
}
setCurrentPage(pageToSnapTo);
dispatchScrollChanged();
}
@ -2691,6 +2755,52 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
return anim;
}
/**
* Returns all the tasks in the bottom row, without the focused task
*/
private IntArray getBottomRowIdArray() {
IntArray bottomArray = new IntArray();
int taskViewCount = getTaskViewCount();
for (int i = 0; i < taskViewCount; i++) {
int taskViewId = getTaskViewAt(i).getTaskViewId();
if (!mTopRowIdSet.contains(taskViewId) && taskViewId != mFocusedTaskViewId) {
bottomArray.add(taskViewId);
}
}
return bottomArray;
}
/**
* Iterate the grid by columns instead of by TaskView index, starting after the focused task and
* up to the last balanced column.
*
* @return the highest visible TaskView index between both rows
*/
private int getHighestVisibleTaskIndex() {
if (mTopRowIdSet.isEmpty()) return Integer.MAX_VALUE; // return earlier
int lastVisibleIndex = Integer.MAX_VALUE;
IntArray topRowIdArray = mTopRowIdSet.getArray();
IntArray bottomRowIdArray = getBottomRowIdArray();
int balancedColumns = Math.min(bottomRowIdArray.size(), topRowIdArray.size());
for (int i = 0; i < balancedColumns; i++) {
TaskView topTask = getTaskViewFromTaskViewId(topRowIdArray.get(i));
if (isTaskViewVisible(topTask)) {
TaskView bottomTask = getTaskViewFromTaskViewId(bottomRowIdArray.get(i));
lastVisibleIndex = Math.max(
indexOfChild(topTask) - mTaskViewStartIndex,
indexOfChild(bottomTask) - mTaskViewStartIndex
);
} else if (lastVisibleIndex < Integer.MAX_VALUE) {
break;
}
}
return lastVisibleIndex;
}
private void removeTaskInternal(int dismissedTaskId) {
UI_HELPER_EXECUTOR.getHandler().postDelayed(
() -> ActivityManagerWrapper.getInstance().removeTask(dismissedTaskId),