summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java76
-rw-r--r--packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java4
2 files changed, 63 insertions, 17 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java
index 77b733881a0f..e3fe1abf8b20 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackLayoutAlgorithm.java
@@ -404,7 +404,7 @@ public class TaskStackLayoutAlgorithm {
* Sets the system insets.
*/
public boolean setSystemInsets(Rect systemInsets) {
- boolean changed = mSystemInsets.equals(systemInsets);
+ boolean changed = !mSystemInsets.equals(systemInsets);
mSystemInsets.set(systemInsets);
return changed;
}
@@ -583,11 +583,25 @@ public class TaskStackLayoutAlgorithm {
if (getInitialFocusState() == STATE_UNFOCUSED && mNumStackTasks > 1) {
if (ignoreScrollToFront || (!launchState.launchedWithAltTab && !scrollToFront)) {
// Set the initial scroll to the predefined state (which differs from the stack)
- float [] initialNormX = new float[] {
- getNormalizedXFromUnfocusedY(mSystemInsets.bottom + mInitialBottomOffset,
- FROM_BOTTOM),
- getNormalizedXFromUnfocusedY(mInitialTopOffset, FROM_TOP)
- };
+ float [] initialNormX = null;
+ float minBottomTaskNormX = getNormalizedXFromUnfocusedY(mSystemInsets.bottom +
+ mInitialBottomOffset, FROM_BOTTOM);
+ float maxBottomTaskNormX = getNormalizedXFromUnfocusedY(mFocusedTopPeekHeight +
+ mTaskRect.height() - mMinMargin, FROM_TOP);
+ if (mNumStackTasks <= 2) {
+ // For small stacks, position the tasks so that they are top aligned to under
+ // the action button, but ensure that it is at least a certain offset from the
+ // bottom of the stack
+ initialNormX = new float[] {
+ Math.min(maxBottomTaskNormX, minBottomTaskNormX),
+ getNormalizedXFromUnfocusedY(mFocusedTopPeekHeight, FROM_TOP)
+ };
+ } else {
+ initialNormX = new float[] {
+ minBottomTaskNormX,
+ getNormalizedXFromUnfocusedY(mInitialTopOffset, FROM_TOP)
+ };
+ }
mUnfocusedRange.offset(0f);
List<Task> tasks = stack.getStackTasks();
@@ -881,14 +895,7 @@ public class TaskStackLayoutAlgorithm {
TaskViewTransform frontTransform, boolean ignoreSingleTaskCase, boolean forceUpdate) {
SystemServicesProxy ssp = Recents.getSystemServices();
- // Compute the focused and unfocused offset
- float boundedStackScroll = Utilities.clamp(stackScroll, mMinScrollP, mMaxScrollP);
- mUnfocusedRange.offset(boundedStackScroll);
- mFocusedRange.offset(boundedStackScroll);
- float boundedScrollUnfocusedRangeX = mUnfocusedRange.getNormalizedX(taskProgress);
- float boundedScrollFocusedRangeX = mFocusedRange.getNormalizedX(taskProgress);
- float boundedScrollUnfocusedNonOverrideRangeX =
- mUnfocusedRange.getNormalizedX(nonOverrideTaskProgress);
+ // Ensure that the task is in range
mUnfocusedRange.offset(stackScroll);
mFocusedRange.offset(stackScroll);
boolean unfocusedVisible = mUnfocusedRange.isInRange(taskProgress);
@@ -900,9 +907,30 @@ public class TaskStackLayoutAlgorithm {
return;
}
+ // Map the absolute task progress to the normalized x at the stack scroll. We use this to
+ // calculate positions along the curve.
+ mUnfocusedRange.offset(stackScroll);
+ mFocusedRange.offset(stackScroll);
float unfocusedRangeX = mUnfocusedRange.getNormalizedX(taskProgress);
float focusedRangeX = mFocusedRange.getNormalizedX(taskProgress);
+ // Map the absolute task progress to the normalized x at the bounded stack scroll. We use
+ // this to calculate bounded properties, like translationZ and outline alpha.
+ float boundedStackScroll = Utilities.clamp(stackScroll, mMinScrollP, mMaxScrollP);
+ mUnfocusedRange.offset(boundedStackScroll);
+ mFocusedRange.offset(boundedStackScroll);
+ float boundedScrollUnfocusedRangeX = mUnfocusedRange.getNormalizedX(taskProgress);
+ float boundedScrollUnfocusedNonOverrideRangeX =
+ mUnfocusedRange.getNormalizedX(nonOverrideTaskProgress);
+
+ // Map the absolute task progress to the normalized x at the upper bounded stack scroll.
+ // We use this to calculate the dim, which is bounded only on one end.
+ float lowerBoundedStackScroll = Utilities.clamp(stackScroll, -Float.MAX_VALUE, mMaxScrollP);
+ mUnfocusedRange.offset(lowerBoundedStackScroll);
+ mFocusedRange.offset(lowerBoundedStackScroll);
+ float lowerBoundedUnfocusedRangeX = mUnfocusedRange.getNormalizedX(taskProgress);
+ float lowerBoundedFocusedRangeX = mFocusedRange.getNormalizedX(taskProgress);
+
int x = (mStackRect.width() - mTaskRect.width()) / 2;
int y;
float z;
@@ -917,7 +945,8 @@ public class TaskStackLayoutAlgorithm {
y = centerYOffset + getYForDeltaP(tmpP, 0);
z = mMaxTranslationZ;
dimAlpha = 0f;
- viewOutlineAlpha = (OUTLINE_ALPHA_MIN_VALUE + OUTLINE_ALPHA_MAX_VALUE) / 2f;
+ viewOutlineAlpha = OUTLINE_ALPHA_MIN_VALUE +
+ (OUTLINE_ALPHA_MAX_VALUE - OUTLINE_ALPHA_MIN_VALUE) / 2f;
} else {
// Otherwise, update the task to the stack layout
@@ -926,9 +955,22 @@ public class TaskStackLayoutAlgorithm {
int focusedY = (int) ((1f - mFocusedCurveInterpolator.getInterpolation(
focusedRangeX)) * mStackRect.height());
float unfocusedDim = mUnfocusedDimCurveInterpolator.getInterpolation(
- boundedScrollUnfocusedRangeX);
+ lowerBoundedUnfocusedRangeX);
float focusedDim = mFocusedDimCurveInterpolator.getInterpolation(
- boundedScrollFocusedRangeX);
+ lowerBoundedFocusedRangeX);
+
+ // Special case, because we override the initial task positions differently for small
+ // stacks, we clamp the dim to 0 in the initial position, and then only modulate the
+ // dim when the task is scrolled back towards the top of the screen
+ if (mNumStackTasks <= 2 && nonOverrideTaskProgress == 0f) {
+ if (boundedScrollUnfocusedRangeX >= 0.5f) {
+ unfocusedDim = 0f;
+ } else {
+ float offset = mUnfocusedDimCurveInterpolator.getInterpolation(0.5f);
+ unfocusedDim -= offset;
+ unfocusedDim *= MAX_DIM / (MAX_DIM - offset);
+ }
+ }
y = (mStackRect.top - mTaskRect.top) +
(int) Utilities.mapRange(focusState, unfocusedY, focusedY);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
index 0d9f77c5d2fa..231360e46ae9 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -1996,6 +1996,10 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
if (event.fromDeviceOrientationChange) {
mDisplayOrientation = Utilities.getAppConfiguration(mContext).orientation;
mDisplayRect = Recents.getSystemServices().getDisplayRect();
+
+ // Always stop the scroller, otherwise, we may continue setting the stack scroll to the
+ // wrong bounds in the new layout
+ mStackScroller.stopScroller();
}
reloadOnConfigurationChange();