1 package com.android.systemui.unfold.util 2 3 import android.animation.ValueAnimator 4 import android.content.ContentResolver 5 import android.database.ContentObserver 6 import android.provider.Settings 7 import com.android.systemui.unfold.UnfoldTransitionProgressProvider 8 import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener 9 10 /** Wraps [UnfoldTransitionProgressProvider] to disable transitions when animations are disabled. */ 11 class ScaleAwareTransitionProgressProvider( 12 unfoldTransitionProgressProvider: UnfoldTransitionProgressProvider, 13 private val contentResolver: ContentResolver 14 ) : UnfoldTransitionProgressProvider { 15 16 private val scopedUnfoldTransitionProgressProvider = 17 ScopedUnfoldTransitionProgressProvider(unfoldTransitionProgressProvider) 18 19 private val animatorDurationScaleObserver = object : ContentObserver(null) { 20 override fun onChange(selfChange: Boolean) { 21 onAnimatorScaleChanged() 22 } 23 } 24 25 init { 26 contentResolver.registerContentObserver( 27 Settings.Global.getUriFor(Settings.Global.ANIMATOR_DURATION_SCALE), 28 /* notifyForDescendants= */ false, 29 animatorDurationScaleObserver) 30 onAnimatorScaleChanged() 31 } 32 33 private fun onAnimatorScaleChanged() { 34 val animationsEnabled = ValueAnimator.areAnimatorsEnabled() 35 scopedUnfoldTransitionProgressProvider.setReadyToHandleTransition(animationsEnabled) 36 } 37 38 override fun addCallback(listener: TransitionProgressListener) { 39 scopedUnfoldTransitionProgressProvider.addCallback(listener) 40 } 41 42 override fun removeCallback(listener: TransitionProgressListener) { 43 scopedUnfoldTransitionProgressProvider.removeCallback(listener) 44 } 45 46 override fun destroy() { 47 contentResolver.unregisterContentObserver(animatorDurationScaleObserver) 48 scopedUnfoldTransitionProgressProvider.destroy() 49 } 50 } 51