1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 @file:JvmName("UnfoldTransitionFactory")
17 
18 package com.android.systemui.unfold
19 
20 import android.content.Context
21 import android.hardware.SensorManager
22 import android.hardware.devicestate.DeviceStateManager
23 import android.os.Handler
24 import com.android.systemui.unfold.updates.screen.ScreenStatusProvider
25 import com.android.systemui.unfold.config.ResourceUnfoldTransitionConfig
26 import com.android.systemui.unfold.config.UnfoldTransitionConfig
27 import com.android.systemui.unfold.progress.FixedTimingTransitionProgressProvider
28 import com.android.systemui.unfold.progress.PhysicsBasedUnfoldTransitionProgressProvider
29 import com.android.systemui.unfold.util.ScaleAwareTransitionProgressProvider
30 import com.android.systemui.unfold.updates.DeviceFoldStateProvider
31 import com.android.systemui.unfold.updates.hinge.EmptyHingeAngleProvider
32 import com.android.systemui.unfold.updates.hinge.HingeSensorAngleProvider
33 import java.lang.IllegalStateException
34 import java.util.concurrent.Executor
35 
36 fun createUnfoldTransitionProgressProvider(
37     context: Context,
38     config: UnfoldTransitionConfig,
39     screenStatusProvider: ScreenStatusProvider,
40     deviceStateManager: DeviceStateManager,
41     sensorManager: SensorManager,
42     mainHandler: Handler,
43     mainExecutor: Executor
44 ): UnfoldTransitionProgressProvider {
45 
46     if (!config.isEnabled) {
47         throw IllegalStateException("Trying to create " +
48             "UnfoldTransitionProgressProvider when the transition is disabled")
49     }
50 
51     val hingeAngleProvider =
52         if (config.isHingeAngleEnabled) {
53             HingeSensorAngleProvider(sensorManager)
54         } else {
55             EmptyHingeAngleProvider()
56         }
57 
58     val foldStateProvider = DeviceFoldStateProvider(
59         context,
60         hingeAngleProvider,
61         screenStatusProvider,
62         deviceStateManager,
63         mainExecutor,
64         mainHandler
65     )
66 
67     val unfoldTransitionProgressProvider = if (config.isHingeAngleEnabled) {
68         PhysicsBasedUnfoldTransitionProgressProvider(foldStateProvider)
69     } else {
70         FixedTimingTransitionProgressProvider(foldStateProvider)
71     }
72     return ScaleAwareTransitionProgressProvider(
73             unfoldTransitionProgressProvider,
74             context.contentResolver
75     )
76 }
77 
78 fun createConfig(context: Context): UnfoldTransitionConfig =
79     ResourceUnfoldTransitionConfig(context)
80