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
This commit is contained in:
Peter Kalauskas
2022-02-02 16:36:44 -08:00
parent 6aa536eb7f
commit 2c46106012
2 changed files with 10 additions and 8 deletions

View File

@@ -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()

View File

@@ -43,7 +43,7 @@ class DialogLaunchAnimatorTest : SysuiTestCase() {
@Before
fun setUp() {
dialogLaunchAnimator = DialogLaunchAnimator(
dreamManager, launchAnimator, isForTesting = true)
dreamManager, launchAnimator, forceDisableSynchronization = true)
}
@After