1 /*
2  * Copyright (C) 2022 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.ContentResolver
20 import android.content.Context
21 import android.hardware.SensorManager
22 import android.hardware.display.DisplayManager
23 import android.os.Handler
24 import com.android.systemui.unfold.config.UnfoldTransitionConfig
25 import com.android.systemui.unfold.dagger.UnfoldMain
26 import com.android.systemui.unfold.dagger.UnfoldSingleThreadBg
27 import com.android.systemui.unfold.progress.RemoteUnfoldTransitionReceiver
28 import com.android.systemui.unfold.updates.FoldProvider
29 import com.android.systemui.unfold.updates.RotationChangeProvider
30 import com.android.systemui.unfold.updates.hinge.HingeAngleProvider
31 import com.android.systemui.unfold.updates.screen.ScreenStatusProvider
32 import com.android.systemui.unfold.util.CurrentActivityTypeProvider
33 import com.android.systemui.unfold.util.UnfoldTransitionATracePrefix
34 import dagger.BindsInstance
35 import dagger.Component
36 import java.util.Optional
37 import java.util.concurrent.Executor
38 import javax.inject.Singleton
39 
40 /**
41  * Provides [UnfoldTransitionProgressProvider]. The [Optional] is empty when the transition
42  * animation is disabled.
43  *
44  * This component is meant to be used for places that don't use dagger. By providing those
45  * parameters to the factory, all dagger objects are correctly instantiated. See
46  * [createUnfoldSharedComponent] for an example.
47  */
48 @Singleton
49 @Component(modules = [UnfoldSharedModule::class])
50 interface UnfoldSharedComponent {
51 
52     @Component.Factory
53     interface Factory {
54         fun create(
55             @BindsInstance context: Context,
56             @BindsInstance config: UnfoldTransitionConfig,
57             @BindsInstance screenStatusProvider: ScreenStatusProvider,
58             @BindsInstance foldProvider: FoldProvider,
59             @BindsInstance activityTypeProvider: CurrentActivityTypeProvider,
60             @BindsInstance sensorManager: SensorManager,
61             @BindsInstance @UnfoldMain handler: Handler,
62             @BindsInstance @UnfoldMain executor: Executor,
63             @BindsInstance @UnfoldSingleThreadBg singleThreadBgExecutor: Executor,
64             @BindsInstance @UnfoldTransitionATracePrefix tracingTagPrefix: String,
65             @BindsInstance displayManager: DisplayManager,
66             @BindsInstance contentResolver: ContentResolver = context.contentResolver
67         ): UnfoldSharedComponent
68     }
69 
70     val unfoldTransitionProvider: Optional<UnfoldTransitionProgressProvider>
71     val hingeAngleProvider: HingeAngleProvider
72     val rotationChangeProvider: RotationChangeProvider
73 }
74 
75 /**
76  * Generates a [RemoteTransitionProgress] usable to receive unfold transition progress from another
77  * process.
78  */
79 @Singleton
80 @Component(modules = [UnfoldRemoteModule::class])
81 interface RemoteUnfoldSharedComponent {
82 
83     @Component.Factory
84     interface Factory {
85         fun create(
86             @BindsInstance context: Context,
87             @BindsInstance config: UnfoldTransitionConfig,
88             @BindsInstance @UnfoldMain executor: Executor,
89             @BindsInstance @UnfoldMain handler: Handler,
90             @BindsInstance @UnfoldSingleThreadBg singleThreadBgExecutor: Executor,
91             @BindsInstance displayManager: DisplayManager,
92             @BindsInstance @UnfoldTransitionATracePrefix tracingTagPrefix: String,
93         ): RemoteUnfoldSharedComponent
94     }
95 
96     val remoteTransitionProgress: Optional<RemoteUnfoldTransitionReceiver>
97     val rotationChangeProvider: RotationChangeProvider
98 }
99 
100 /**
101  * Usable to receive and propagate unfold transition progresses
102  *
103  * All unfold events received by [remoteReceiver] will be propagated to [localProvider].
104  * [remoteReceiver] is meant to receive events from a remote process (E.g. from a binder service).
105  */
106 data class RemoteTransitionProgress(
107     val localProvider: UnfoldTransitionProgressProvider,
108     val remoteReceiver: UnfoldTransitionProgressProvider.TransitionProgressListener
109 )
110