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 
17 package com.android.systemui.unfold
18 
19 import android.content.Context
20 import android.hardware.SensorManager
21 import android.hardware.devicestate.DeviceStateManager
22 import android.os.Handler
23 import android.view.IWindowManager
24 import com.android.systemui.dagger.qualifiers.Main
25 import com.android.systemui.keyguard.LifecycleScreenStatusProvider
26 import com.android.systemui.unfold.config.UnfoldTransitionConfig
27 import com.android.systemui.unfold.util.NaturalRotationUnfoldProgressProvider
28 import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
29 import com.android.wm.shell.unfold.ShellUnfoldProgressProvider
30 import dagger.Lazy
31 import dagger.Module
32 import dagger.Provides
33 import java.util.Optional
34 import java.util.concurrent.Executor
35 import javax.inject.Named
36 import javax.inject.Singleton
37 
38 @Module
39 class UnfoldTransitionModule {
40 
41     @Provides
42     @Singleton
43     fun provideUnfoldTransitionProgressProvider(
44         context: Context,
45         config: UnfoldTransitionConfig,
46         screenStatusProvider: Lazy<LifecycleScreenStatusProvider>,
47         deviceStateManager: DeviceStateManager,
48         sensorManager: SensorManager,
49         @Main executor: Executor,
50         @Main handler: Handler
51     ) =
52         if (config.isEnabled) {
53             Optional.of(
54                 createUnfoldTransitionProgressProvider(
55                     context,
56                     config,
57                     screenStatusProvider.get(),
58                     deviceStateManager,
59                     sensorManager,
60                     handler,
61                     executor
62                 )
63             )
64         } else {
65             Optional.empty()
66         }
67 
68     @Provides
69     @Singleton
70     fun provideUnfoldTransitionConfig(context: Context): UnfoldTransitionConfig =
71         createConfig(context)
72 
73     @Provides
74     @Singleton
75     fun provideNaturalRotationProgressProvider(
76         context: Context,
77         windowManager: IWindowManager,
78         unfoldTransitionProgressProvider: Optional<UnfoldTransitionProgressProvider>
79     ) =
80         unfoldTransitionProgressProvider.map {
81             provider -> NaturalRotationUnfoldProgressProvider(
82                 context,
83                 windowManager,
84                 provider
85             )
86         }
87 
88     @Provides
89     @Named(UNFOLD_STATUS_BAR)
90     @Singleton
91     fun provideStatusBarScopedTransitionProvider(
92         source: Optional<NaturalRotationUnfoldProgressProvider>
93     ) =
94         source.map {
95             provider -> ScopedUnfoldTransitionProgressProvider(provider)
96         }
97 
98     @Provides
99     @Singleton
100     fun provideShellProgressProvider(
101         config: UnfoldTransitionConfig,
102         provider: Optional<UnfoldTransitionProgressProvider>
103     ): ShellUnfoldProgressProvider =
104         if (config.isEnabled && provider.isPresent()) {
105             UnfoldProgressProvider(provider.get())
106         } else {
107             ShellUnfoldProgressProvider.NO_PROVIDER
108         }
109 }
110 
111 const val UNFOLD_STATUS_BAR = "unfold_status_bar"
112