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:
@@ -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()
|
||||
|
||||
@@ -43,7 +43,7 @@ class DialogLaunchAnimatorTest : SysuiTestCase() {
|
||||
@Before
|
||||
fun setUp() {
|
||||
dialogLaunchAnimator = DialogLaunchAnimator(
|
||||
dreamManager, launchAnimator, isForTesting = true)
|
||||
dreamManager, launchAnimator, forceDisableSynchronization = true)
|
||||
}
|
||||
|
||||
@After
|
||||
|
||||
Reference in New Issue
Block a user