From 2c461060120131697931377ca50036c17dadb3f1 Mon Sep 17 00:00:00 2001 From: Peter Kalauskas Date: Wed, 2 Feb 2022 16:36:44 -0800 Subject: [PATCH] Disable dialog animation sync on low-RAM devices In DialogLaunchAnimator, disable animation sync if device is low-RAM. This is a mitigation to workaround a bug in animations sync which currently causes the UI to freeze for 4s when opening a dialog on certain devices. Also, rename isForTesting to forceDisableSynchronization for clarity Test: Tap "internet", "power", or "select-user" buttons in QS Bug: 217621394 Bug: 216391326 Change-Id: I33117466b5002671ee086aedade56737b19c8edb --- .../systemui/animation/DialogLaunchAnimator.kt | 16 +++++++++------- .../animation/DialogLaunchAnimatorTest.kt | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt index f7a7603944f6e..3051d8056a89e 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/DialogLaunchAnimator.kt @@ -19,6 +19,7 @@ package com.android.systemui.animation import android.animation.Animator import android.animation.AnimatorListenerAdapter import android.animation.ValueAnimator +import android.app.ActivityManager import android.app.Dialog import android.graphics.Color import android.graphics.Rect @@ -45,7 +46,8 @@ private const val TAG = "DialogLaunchAnimator" class DialogLaunchAnimator @JvmOverloads constructor( private val dreamManager: IDreamManager, private val launchAnimator: LaunchAnimator = LaunchAnimator(TIMINGS, INTERPOLATORS), - private var isForTesting: Boolean = false + // TODO(b/217621394): Remove special handling for low-RAM devices after animation sync is fixed + private var forceDisableSynchronization: Boolean = ActivityManager.isLowRamDeviceStatic() ) { private companion object { private val TIMINGS = ActivityLaunchAnimator.TIMINGS @@ -111,7 +113,7 @@ class DialogLaunchAnimator @JvmOverloads constructor( dialog = dialog, animateBackgroundBoundsChange, animatedParent, - isForTesting + forceDisableSynchronization ) openedDialogs.add(animatedDialog) @@ -187,10 +189,9 @@ private class AnimatedDialog( private val parentAnimatedDialog: AnimatedDialog? = null, /** - * Whether we are currently running in a test, in which case we need to disable - * synchronization. + * Whether synchronization should be disabled, which can be useful if we are running in a test. */ - private val isForTesting: Boolean + private val forceDisableSynchronization: Boolean ) { /** * The DecorView of this dialog window. @@ -420,8 +421,9 @@ private class AnimatedDialog( * (or inversely, removed from the UI when the touch surface is made visible). */ private fun synchronizeNextDraw(then: () -> Unit) { - if (isForTesting || !touchSurface.isAttachedToWindow || touchSurface.viewRootImpl == null || - !decorView.isAttachedToWindow || decorView.viewRootImpl == null) { + if (forceDisableSynchronization || + !touchSurface.isAttachedToWindow || touchSurface.viewRootImpl == null || + !decorView.isAttachedToWindow || decorView.viewRootImpl == null) { // No need to synchronize if either the touch surface or dialog view is not attached // to a window. then() diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/DialogLaunchAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/DialogLaunchAnimatorTest.kt index b951345a145bf..61e78f5cb2fce 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/animation/DialogLaunchAnimatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/animation/DialogLaunchAnimatorTest.kt @@ -43,7 +43,7 @@ class DialogLaunchAnimatorTest : SysuiTestCase() { @Before fun setUp() { dialogLaunchAnimator = DialogLaunchAnimator( - dreamManager, launchAnimator, isForTesting = true) + dreamManager, launchAnimator, forceDisableSynchronization = true) } @After