summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin Li <delphij@google.com>2022-08-12 14:10:50 -0700
committerXin Li <delphij@google.com>2022-08-12 14:10:50 -0700
commita3d250979464d1a0a64d3027ec0c0468676fc589 (patch)
tree6e66abd0c2fd188cb68c16ef87abd8cd30b080b5
parent0699d0238b8b6d96fbd9979793f4d02b19247970 (diff)
parentbff944d05cd47d2b3b713565d3f00d512840d282 (diff)
downloadbase-a3d250979464d1a0a64d3027ec0c0468676fc589.tar.gz
DO NOT MERGE - Merge TP1A.220624.021.A1
Merged-In: Ice6de1149b05564294e5c51308e962112cf4eda7 Change-Id: Ibe4efa97b786828db4ddce40f0cfcd45c6188682
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java28
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java4
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java76
-rw-r--r--services/core/java/com/android/server/wm/WindowOrganizerController.java19
5 files changed, 109 insertions, 22 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
index c9d70d1ad44c..e2ed1d83530b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java
@@ -1323,10 +1323,24 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
if (mOnStackYChanged != null) {
mOnStackYChanged.accept(listenerNeedsAnimation);
}
+ updateStackEndHeightAndStackHeight(fraction);
+ }
+
+ @VisibleForTesting
+ public void updateStackEndHeightAndStackHeight(float fraction) {
+ final float oldStackHeight = mAmbientState.getStackHeight();
if (mQsExpansionFraction <= 0 && !shouldSkipHeightUpdate()) {
final float endHeight = updateStackEndHeight(
getHeight(), getEmptyBottomMargin(), mTopPadding);
updateStackHeight(endHeight, fraction);
+ } else {
+ // Always updateStackHeight to prevent jumps in the stack height when this fraction
+ // suddenly reapplies after a freeze.
+ final float endHeight = mAmbientState.getStackEndHeight();
+ updateStackHeight(endHeight, fraction);
+ }
+ if (oldStackHeight != mAmbientState.getStackHeight()) {
+ requestChildrenUpdate();
}
}
@@ -1343,6 +1357,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
return stackEndHeight;
}
+ @VisibleForTesting
public void updateStackHeight(float endHeight, float fraction) {
// During the (AOD<=>LS) transition where dozeAmount is changing,
// apply dozeAmount to stack height instead of expansionFraction
@@ -5041,6 +5056,19 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
public void setUnlockHintRunning(boolean running) {
mAmbientState.setUnlockHintRunning(running);
+ if (!running) {
+ // re-calculate the stack height which was frozen while running this animation
+ updateStackPosition();
+ }
+ }
+
+ @ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
+ public void setPanelFlinging(boolean flinging) {
+ mAmbientState.setIsFlinging(flinging);
+ if (!flinging) {
+ // re-calculate the stack height which was frozen while flinging
+ updateStackPosition();
+ }
}
@ShadeViewRefactor(RefactorComponent.SHADE_VIEW)
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
index 2493ccbe5a48..010e6cf90817 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java
@@ -1190,6 +1190,10 @@ public class NotificationStackScrollLayoutController {
mView.setUnlockHintRunning(running);
}
+ public void setPanelFlinging(boolean flinging) {
+ mView.setPanelFlinging(flinging);
+ }
+
public boolean isFooterViewNotGone() {
return mView.isFooterViewNotGone();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index 2cac0017db9c..3580fe6cdbc5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -1782,14 +1782,14 @@ public class NotificationPanelViewController extends PanelViewController {
mHeadsUpTouchHelper.notifyFling(!expand);
mKeyguardStateController.notifyPanelFlingStart(!expand /* flingingToDismiss */);
setClosingWithAlphaFadeout(!expand && !isOnKeyguard() && getFadeoutAlpha() == 1.0f);
- mAmbientState.setIsFlinging(true);
+ mNotificationStackScrollLayoutController.setPanelFlinging(true);
super.flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing);
}
@Override
protected void onFlingEnd(boolean cancelled) {
super.onFlingEnd(cancelled);
- mAmbientState.setIsFlinging(false);
+ mNotificationStackScrollLayoutController.setPanelFlinging(false);
}
private boolean onQsIntercept(MotionEvent event) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
index f5fe6f3a1a5f..b83743c90623 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java
@@ -39,6 +39,7 @@ import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -122,12 +123,12 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
allowTestableLooperAsMainThread();
// Interact with real instance of AmbientState.
- mAmbientState = new AmbientState(
+ mAmbientState = spy(new AmbientState(
mContext,
mDumpManager,
mNotificationSectionsManager,
mBypassController,
- mStatusBarKeyguardViewManager);
+ mStatusBarKeyguardViewManager));
// Inject dependencies before initializing the layout
mDependency.injectTestDependency(SysuiStatusBarStateController.class, mBarState);
@@ -190,7 +191,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
endHeight, dozeAmount);
mStackScroller.updateStackHeight(endHeight, expansionFraction);
- assertTrue(mAmbientState.getStackHeight() == expected);
+ assertThat(mAmbientState.getStackHeight()).isEqualTo(expected);
}
@Test
@@ -205,7 +206,74 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase {
endHeight, expansionFraction);
mStackScroller.updateStackHeight(endHeight, expansionFraction);
- assertTrue(mAmbientState.getStackHeight() == expected);
+ assertThat(mAmbientState.getStackHeight()).isEqualTo(expected);
+ }
+
+ @Test
+ public void updateStackEndHeightAndStackHeight_normallyUpdatesBoth() {
+ final float expansionFraction = 0.5f;
+ mAmbientState.setStatusBarState(StatusBarState.KEYGUARD);
+
+ // Validate that by default we update everything
+ clearInvocations(mAmbientState);
+ mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction);
+ verify(mAmbientState).setStackEndHeight(anyFloat());
+ verify(mAmbientState).setStackHeight(anyFloat());
+ }
+
+ @Test
+ public void updateStackEndHeightAndStackHeight_onlyUpdatesStackHeightDuringSwipeUp() {
+ final float expansionFraction = 0.5f;
+ mAmbientState.setStatusBarState(StatusBarState.KEYGUARD);
+ mAmbientState.setSwipingUp(true);
+
+ // Validate that when the gesture is in progress, we update only the stackHeight
+ clearInvocations(mAmbientState);
+ mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction);
+ verify(mAmbientState, never()).setStackEndHeight(anyFloat());
+ verify(mAmbientState).setStackHeight(anyFloat());
+ }
+
+ @Test
+ public void setPanelFlinging_updatesStackEndHeightOnlyOnFinish() {
+ final float expansionFraction = 0.5f;
+ mAmbientState.setStatusBarState(StatusBarState.KEYGUARD);
+ mAmbientState.setSwipingUp(true);
+ mStackScroller.setPanelFlinging(true);
+ mAmbientState.setSwipingUp(false);
+
+ // Validate that when the animation is running, we update only the stackHeight
+ clearInvocations(mAmbientState);
+ mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction);
+ verify(mAmbientState, never()).setStackEndHeight(anyFloat());
+ verify(mAmbientState).setStackHeight(anyFloat());
+
+ // Validate that when the animation ends the stackEndHeight is recalculated immediately
+ clearInvocations(mAmbientState);
+ mStackScroller.setPanelFlinging(false);
+ verify(mAmbientState).setIsFlinging(eq(false));
+ verify(mAmbientState).setStackEndHeight(anyFloat());
+ verify(mAmbientState).setStackHeight(anyFloat());
+ }
+
+ @Test
+ public void setUnlockHintRunning_updatesStackEndHeightOnlyOnFinish() {
+ final float expansionFraction = 0.5f;
+ mAmbientState.setStatusBarState(StatusBarState.KEYGUARD);
+ mStackScroller.setUnlockHintRunning(true);
+
+ // Validate that when the animation is running, we update only the stackHeight
+ clearInvocations(mAmbientState);
+ mStackScroller.updateStackEndHeightAndStackHeight(expansionFraction);
+ verify(mAmbientState, never()).setStackEndHeight(anyFloat());
+ verify(mAmbientState).setStackHeight(anyFloat());
+
+ // Validate that when the animation ends the stackEndHeight is recalculated immediately
+ clearInvocations(mAmbientState);
+ mStackScroller.setUnlockHintRunning(false);
+ verify(mAmbientState).setUnlockHintRunning(eq(false));
+ verify(mAmbientState).setStackEndHeight(anyFloat());
+ verify(mAmbientState).setStackHeight(anyFloat());
}
@Test
diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java
index 64a5deb32fcb..aee66faa8faa 100644
--- a/services/core/java/com/android/server/wm/WindowOrganizerController.java
+++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java
@@ -759,7 +759,7 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
}
if (parent.isAllowedToEmbedActivity(activity) != EMBEDDING_ALLOWED) {
final Throwable exception = new SecurityException(
- "The task fragment is not trusted to embed the given activity.");
+ "The task fragment is not allowed to embed the given activity.");
sendTaskFragmentOperationFailure(organizer, errorCallbackToken, exception);
break;
}
@@ -769,11 +769,6 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
sendTaskFragmentOperationFailure(organizer, errorCallbackToken, exception);
break;
}
- if (parent.smallerThanMinDimension(activity)) {
- sendMinimumDimensionViolation(parent, activity.getMinDimensions(),
- errorCallbackToken, "reparentActivityToTask");
- break;
- }
activity.reparent(parent, POSITION_TOP);
effects |= TRANSACT_EFFECTS_LIFECYCLE;
@@ -1583,10 +1578,10 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
// We are reparenting activities to a new embedded TaskFragment, this operation is only
// allowed if the new parent is trusted by all reparent activities.
final boolean isEmbeddingDisallowed = oldParent.forAllActivities(activity ->
- newParentTF.isAllowedToEmbedActivity(activity) == EMBEDDING_ALLOWED);
+ newParentTF.isAllowedToEmbedActivity(activity) != EMBEDDING_ALLOWED);
if (isEmbeddingDisallowed) {
final Throwable exception = new SecurityException(
- "The new parent is not trusted to embed the activities.");
+ "The new parent is not allowed to embed the activities.");
sendTaskFragmentOperationFailure(organizer, errorCallbackToken, exception);
return;
}
@@ -1603,14 +1598,6 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub
sendTaskFragmentOperationFailure(organizer, errorCallbackToken, exception);
return;
}
- final Point minDimensions = oldParent.calculateMinDimension();
- final Rect newParentBounds = newParentTF.getBounds();
- if (newParentBounds.width() < minDimensions.x
- || newParentBounds.height() < minDimensions.y) {
- sendMinimumDimensionViolation(newParentTF, minDimensions, errorCallbackToken,
- "reparentTaskFragment");
- return;
- }
while (oldParent.hasChild()) {
oldParent.getChildAt(0).reparent(newParentTF, POSITION_TOP);
}