Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3da8a68a authored by Xiaowen Lei's avatar Xiaowen Lei
Browse files

Exclude ViewPager2 from default transition in KeyguardClockViewBinder.

When `TransitionManager.beginDelayedTransition` is called without
passing a transition, the default `AutoTransition()` is used. The
`AutoTransition()` contains transitions that subclass the `Visibility`
transition.

`Visibility.onDisappear` invokes the `onViewAdded` method, which isn't
supported by `ViewPager2`. As a result, this leads to the "ViewPager2
does not support direct child views" crash.

This is the only `Visibility` transition I found in the keyguard code
that doesn't exclude the `ViewPager2`. So hopefully it fixes the crash.

Flag: EXEMPT bugfix
Fix: 387398068
Test: See #comment21 and #comment24 in the bug for steps
Test: Crash trends
Change-Id: I896023db2b8181cd73e2cc76a470b3a218c12f0e
parent c8aeb045
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.keyguard.ui.binder

import android.transition.AutoTransition
import android.transition.TransitionManager
import android.transition.TransitionSet
import android.view.View.INVISIBLE
@@ -26,6 +27,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import androidx.viewpager2.widget.ViewPager2
import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.systemui.keyguard.domain.interactor.KeyguardBlueprintInteractor
import com.android.systemui.keyguard.domain.interactor.KeyguardClockInteractor
@@ -47,6 +49,7 @@ import kotlinx.coroutines.flow.map

object KeyguardClockViewBinder {
    private val TAG = KeyguardClockViewBinder::class.simpleName!!
    private val defaultTransition = AutoTransition().excludeTarget(ViewPager2::class.java, true)

    @JvmStatic
    fun bind(
@@ -242,7 +245,7 @@ object KeyguardClockViewBinder {
        clockSection.applyConstraints(constraintSet)
        if (animated) {
            set?.let { TransitionManager.beginDelayedTransition(rootView, it) }
                ?: run { TransitionManager.beginDelayedTransition(rootView) }
                ?: run { TransitionManager.beginDelayedTransition(rootView, defaultTransition) }
        }
        constraintSet.applyTo(rootView)
    }