1 package com.android.systemui.animation
2 
3 import android.util.MathUtils
4 
5 object ShadeInterpolation {
6 
7     /**
8      * Interpolate alpha for notification background scrim during shade expansion.
9      *
10      * @param fraction Shade expansion fraction
11      */
12     @JvmStatic
13     fun getNotificationScrimAlpha(fraction: Float): Float {
14         val mappedFraction = MathUtils.constrainedMap(0f, 1f, 0f, 0.5f, fraction)
15         return interpolateEaseInOut(mappedFraction)
16     }
17 
18     /**
19      * Interpolate alpha for shade content during shade expansion.
20      *
21      * @param fraction Shade expansion fraction
22      */
23     @JvmStatic
24     fun getContentAlpha(fraction: Float): Float {
25         val mappedFraction = MathUtils.constrainedMap(0f, 1f, 0.3f, 1f, fraction)
26         return interpolateEaseInOut(mappedFraction)
27     }
28 
29     private fun interpolateEaseInOut(fraction: Float): Float {
30         val mappedFraction = fraction * 1.2f - 0.2f
31         return if (mappedFraction <= 0) {
32             0f
33         } else {
34             val oneMinusFrac = 1f - mappedFraction
35             (1f - 0.5f * (1f - Math.cos((3.14159f * oneMinusFrac * oneMinusFrac).toDouble())))
36                 .toFloat()
37         }
38     }
39 }
40