Merge "overview: rebalance hidden tasks in grid" into sc-v2-dev
This commit is contained in:
commit
242c8c0b0f
|
@ -125,6 +125,7 @@ import com.android.launcher3.statemanager.StatefulActivity;
|
||||||
import com.android.launcher3.touch.OverScroll;
|
import com.android.launcher3.touch.OverScroll;
|
||||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||||
import com.android.launcher3.util.DynamicResource;
|
import com.android.launcher3.util.DynamicResource;
|
||||||
|
import com.android.launcher3.util.IntArray;
|
||||||
import com.android.launcher3.util.IntSet;
|
import com.android.launcher3.util.IntSet;
|
||||||
import com.android.launcher3.util.MultiValueAlpha;
|
import com.android.launcher3.util.MultiValueAlpha;
|
||||||
import com.android.launcher3.util.ResourceBasedOverride.Overrides;
|
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.
|
* layout.
|
||||||
* This method is used when no task dismissal has occurred.
|
* This method is used when no task dismissal has occurred.
|
||||||
*/
|
*/
|
||||||
private void updateGridProperties() {
|
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
|
* Updates TaskView and ClearAllButton scaling and translation required to turn into grid
|
||||||
* layout.
|
* layout.
|
||||||
|
*
|
||||||
* This method only calculates the potential position and depends on {@link #setGridProgress} to
|
* This method only calculates the potential position and depends on {@link #setGridProgress} to
|
||||||
* apply the actual scaling and translation.
|
* 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();
|
int taskCount = getTaskViewCount();
|
||||||
if (taskCount == 0) {
|
if (taskCount == 0) {
|
||||||
return;
|
return;
|
||||||
|
@ -2170,8 +2187,20 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||||
focusedTaskShift += mIsRtl ? taskWidthAndSpacing : -taskWidthAndSpacing;
|
focusedTaskShift += mIsRtl ? taskWidthAndSpacing : -taskWidthAndSpacing;
|
||||||
}
|
}
|
||||||
int taskViewId = taskView.getTaskViewId();
|
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 (isTopRow) {
|
||||||
if (homeTaskView != null && nextFocusedTaskView == null) {
|
if (homeTaskView != null && nextFocusedTaskView == null) {
|
||||||
// TaskView will be focused when swipe up, don't count towards row width.
|
// 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);
|
mTopRowIdSet.remove(mFocusedTaskViewId);
|
||||||
finalNextFocusedTaskView.animateIconScaleAndDimIntoView();
|
finalNextFocusedTaskView.animateIconScaleAndDimIntoView();
|
||||||
}
|
}
|
||||||
updateTaskSize(true);
|
updateTaskSize(/*isTaskDismissal=*/ true);
|
||||||
// Update scroll and snap to page.
|
// Update scroll and snap to page.
|
||||||
updateScrollSynchronously();
|
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);
|
setCurrentPage(pageToSnapTo);
|
||||||
dispatchScrollChanged();
|
dispatchScrollChanged();
|
||||||
}
|
}
|
||||||
|
@ -2691,6 +2755,52 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
|
||||||
return anim;
|
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) {
|
private void removeTaskInternal(int dismissedTaskId) {
|
||||||
UI_HELPER_EXECUTOR.getHandler().postDelayed(
|
UI_HELPER_EXECUTOR.getHandler().postDelayed(
|
||||||
() -> ActivityManagerWrapper.getInstance().removeTask(dismissedTaskId),
|
() -> ActivityManagerWrapper.getInstance().removeTask(dismissedTaskId),
|
||||||
|
|
Loading…
Reference in New Issue