diff options
| author | 2020-06-16 23:01:15 +0000 | |
|---|---|---|
| committer | 2020-06-16 23:01:15 +0000 | |
| commit | 11fcb1987afced671b0af54c37070ed2eb47ccd1 (patch) | |
| tree | 7d9d3e2eb0e98dfa9c8e09d80d6a933cb2b588d5 | |
| parent | 02f853ebe69071e6172d1688b9844b3982d37b85 (diff) | |
| parent | f35971dfca4517097d3d30873443ae4f0d60bbe2 (diff) | |
Merge "Revert "Disable user animations on insets whose visible frame is empty"" into rvc-dev
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()); } |