summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2020-06-16 23:01:15 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2020-06-16 23:01:15 +0000
commit11fcb1987afced671b0af54c37070ed2eb47ccd1 (patch)
tree7d9d3e2eb0e98dfa9c8e09d80d6a933cb2b588d5
parent02f853ebe69071e6172d1688b9844b3982d37b85 (diff)
parentf35971dfca4517097d3d30873443ae4f0d60bbe2 (diff)
Merge "Revert "Disable user animations on insets whose visible frame is empty"" into rvc-dev
-rw-r--r--core/java/android/view/InsetsController.java56
-rw-r--r--core/java/android/view/InsetsSource.java4
-rw-r--r--core/java/android/view/InsetsSourceConsumer.java8
-rw-r--r--core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java18
4 files changed, 20 insertions, 66 deletions
diff --git a/core/java/android/view/InsetsController.java b/core/java/android/view/InsetsController.java
index de786bed3144..b4dae566ce2a 100644
--- a/core/java/android/view/InsetsController.java
+++ b/core/java/android/view/InsetsController.java
@@ -492,12 +492,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
/** Set of inset types for which an animation was started since last resetting this field */
private @InsetsType int mLastStartedAnimTypes;
- /** Set of inset types which cannot be controlled by the user animation */
- private @InsetsType int mLastDisabledUserAnimationInsetsTypes;
-
- private Runnable mInvokeControllableInsetsChangedListeners =
- this::invokeControllableInsetsChangedListeners;
-
public InsetsController(Host host) {
this(host, (controller, type) -> {
if (type == ITYPE_IME) {
@@ -612,23 +606,9 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
private void updateState(InsetsState newState) {
mState.setDisplayFrame(newState.getDisplayFrame());
- @InsetsType int disabledUserAnimationTypes = 0;
- @InsetsType int[] cancelledUserAnimationTypes = {0};
for (int i = newState.getSourcesCount() - 1; i >= 0; i--) {
InsetsSource source = newState.sourceAt(i);
- @InternalInsetsType int internalInsetsType = source.getType();
- @AnimationType int animationType = getAnimationType(internalInsetsType);
- if (source.isVisibleFrameEmpty()) {
- @InsetsType int insetsType = toPublicType(internalInsetsType);
- // The user animation is not allowed when visible frame is empty.
- disabledUserAnimationTypes |= insetsType;
- if (animationType == ANIMATION_TYPE_USER) {
- // Existing user animation needs to be cancelled.
- animationType = ANIMATION_TYPE_NONE;
- cancelledUserAnimationTypes[0] |= insetsType;
- }
- }
- getSourceConsumer(internalInsetsType).updateSource(source, animationType);
+ getSourceConsumer(source.getType()).updateSource(source);
}
for (int i = mState.getSourcesCount() - 1; i >= 0; i--) {
InsetsSource source = mState.sourceAt(i);
@@ -640,27 +620,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
mState.getSource(ITYPE_CAPTION_BAR).setFrame(new Rect(mFrame.left, mFrame.top,
mFrame.right, mFrame.top + mCaptionInsetsHeight));
}
-
- updateDisabledUserAnimationTypes(disabledUserAnimationTypes);
-
- if (cancelledUserAnimationTypes[0] != 0) {
- mHandler.post(() -> show(cancelledUserAnimationTypes[0]));
- }
- }
-
- private void updateDisabledUserAnimationTypes(@InsetsType int disabledUserAnimationTypes) {
- @InsetsType int diff = mLastDisabledUserAnimationInsetsTypes ^ disabledUserAnimationTypes;
- if (diff != 0) {
- for (int i = mSourceConsumers.size() - 1; i >= 0; i--) {
- InsetsSourceConsumer consumer = mSourceConsumers.valueAt(i);
- if (consumer.getControl() != null && (toPublicType(consumer.mType) & diff) != 0) {
- mHandler.removeCallbacks(mInvokeControllableInsetsChangedListeners);
- mHandler.post(mInvokeControllableInsetsChangedListeners);
- break;
- }
- }
- mLastDisabledUserAnimationInsetsTypes = disabledUserAnimationTypes;
- }
}
private boolean captionInsetsUnchanged() {
@@ -944,15 +903,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
boolean imeReady = true;
for (int i = internalTypes.size() - 1; i >= 0; i--) {
final InsetsSourceConsumer consumer = getSourceConsumer(internalTypes.valueAt(i));
- if (animationType == ANIMATION_TYPE_USER) {
- final InsetsSource source = mState.peekSource(consumer.getType());
- if (source != null && source.isVisibleFrameEmpty()) {
- if (WARN) Log.w(TAG, String.format(
- "collectSourceControls can't run user animation for type: %s",
- InsetsState.typeToString(consumer.getType())));
- continue;
- }
- }
boolean show = animationType == ANIMATION_TYPE_SHOW
|| animationType == ANIMATION_TYPE_USER;
boolean canRun = false;
@@ -1345,8 +1295,7 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
@InsetsType int result = 0;
for (int i = mSourceConsumers.size() - 1; i >= 0; i--) {
InsetsSourceConsumer consumer = mSourceConsumers.valueAt(i);
- InsetsSource source = mState.peekSource(consumer.mType);
- if (consumer.getControl() != null && source != null && !source.isVisibleFrameEmpty()) {
+ if (consumer.getControl() != null) {
result |= toPublicType(consumer.mType);
}
}
@@ -1357,7 +1306,6 @@ public class InsetsController implements WindowInsetsController, InsetsAnimation
* @return The types that are now animating due to a listener invoking control/show/hide
*/
private @InsetsType int invokeControllableInsetsChangedListeners() {
- mHandler.removeCallbacks(mInvokeControllableInsetsChangedListeners);
mLastStartedAnimTypes = 0;
@InsetsType int types = calculateControllableTypes();
int size = mControllableInsetsChangedListeners.size();
diff --git a/core/java/android/view/InsetsSource.java b/core/java/android/view/InsetsSource.java
index c8394d25ef47..15b9a9330392 100644
--- a/core/java/android/view/InsetsSource.java
+++ b/core/java/android/view/InsetsSource.java
@@ -92,10 +92,6 @@ public class InsetsSource implements Parcelable {
return mVisible;
}
- public boolean isVisibleFrameEmpty() {
- return mVisibleFrame != null && mVisibleFrame.isEmpty();
- }
-
/**
* Calculates the insets this source will cause to a client window.
*
diff --git a/core/java/android/view/InsetsSourceConsumer.java b/core/java/android/view/InsetsSourceConsumer.java
index 8d92d7b5ab20..565846638acc 100644
--- a/core/java/android/view/InsetsSourceConsumer.java
+++ b/core/java/android/view/InsetsSourceConsumer.java
@@ -18,8 +18,8 @@ package android.view;
import static android.view.InsetsController.ANIMATION_TYPE_NONE;
import static android.view.InsetsController.AnimationType;
-import static android.view.InsetsController.DEBUG;
import static android.view.InsetsState.getDefaultVisibility;
+import static android.view.InsetsController.DEBUG;
import static android.view.InsetsState.toPublicType;
import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE;
@@ -275,9 +275,9 @@ public class InsetsSourceConsumer {
}
@VisibleForTesting(visibility = PACKAGE)
- public void updateSource(InsetsSource newSource, @AnimationType int animationType) {
+ public void updateSource(InsetsSource newSource) {
InsetsSource source = mState.peekSource(mType);
- if (source == null || animationType == ANIMATION_TYPE_NONE
+ if (source == null || mController.getAnimationType(mType) == ANIMATION_TYPE_NONE
|| source.getFrame().equals(newSource.getFrame())) {
mPendingFrame = null;
mPendingVisibleFrame = null;
@@ -286,7 +286,7 @@ public class InsetsSourceConsumer {
}
// Frame is changing while animating. Keep note of the new frame but keep existing frame
- // until animation is finished.
+ // until animaition is finished.
newSource = new InsetsSource(newSource);
mPendingFrame = new Rect(newSource.getFrame());
mPendingVisibleFrame = newSource.getVisibleFrame() != null
diff --git a/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java b/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java
index 1b3272572db0..bf7f339a8484 100644
--- a/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java
+++ b/core/tests/coretests/src/android/view/InsetsSourceConsumerTest.java
@@ -26,11 +26,13 @@ import static junit.framework.Assert.assertEquals;
import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
import android.app.Instrumentation;
import android.content.Context;
@@ -133,29 +135,37 @@ public class InsetsSourceConsumerTest {
InsetsSourceConsumer consumer = new InsetsSourceConsumer(
ITYPE_IME, state, null, controller);
+ when(controller.getAnimationType(anyInt())).thenReturn(ANIMATION_TYPE_NONE);
+
InsetsSource source = new InsetsSource(ITYPE_IME);
source.setFrame(0, 1, 2, 3);
- consumer.updateSource(new InsetsSource(source), ANIMATION_TYPE_NONE);
+ consumer.updateSource(new InsetsSource(source));
+
+ when(controller.getAnimationType(anyInt())).thenReturn(ANIMATION_TYPE_USER);
// While we're animating, updates are delayed
source.setFrame(4, 5, 6, 7);
- consumer.updateSource(new InsetsSource(source), ANIMATION_TYPE_USER);
+ consumer.updateSource(new InsetsSource(source));
assertEquals(new Rect(0, 1, 2, 3), state.peekSource(ITYPE_IME).getFrame());
// Finish the animation, now the pending frame should be applied
+ when(controller.getAnimationType(anyInt())).thenReturn(ANIMATION_TYPE_NONE);
assertTrue(consumer.notifyAnimationFinished());
assertEquals(new Rect(4, 5, 6, 7), state.peekSource(ITYPE_IME).getFrame());
+ when(controller.getAnimationType(anyInt())).thenReturn(ANIMATION_TYPE_USER);
+
// Animating again, updates are delayed
source.setFrame(8, 9, 10, 11);
- consumer.updateSource(new InsetsSource(source), ANIMATION_TYPE_USER);
+ consumer.updateSource(new InsetsSource(source));
assertEquals(new Rect(4, 5, 6, 7), state.peekSource(ITYPE_IME).getFrame());
// Updating with the current frame triggers a different code path, verify this clears
// the pending 8, 9, 10, 11 frame:
source.setFrame(4, 5, 6, 7);
- consumer.updateSource(new InsetsSource(source), ANIMATION_TYPE_USER);
+ consumer.updateSource(new InsetsSource(source));
+ when(controller.getAnimationType(anyInt())).thenReturn(ANIMATION_TYPE_NONE);
assertFalse(consumer.notifyAnimationFinished());
assertEquals(new Rect(4, 5, 6, 7), state.peekSource(ITYPE_IME).getFrame());
}