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