xref: /aosp_15_r20/frameworks/base/packages/SystemUI/unfold/src/com/android/systemui/unfold/UnfoldSharedComponent.kt (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
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.UnfoldBg
26 import com.android.systemui.unfold.dagger.UnfoldMain
27 import com.android.systemui.unfold.dagger.UnfoldSingleThreadBg
28 import com.android.systemui.unfold.progress.RemoteUnfoldTransitionReceiver
29 import com.android.systemui.unfold.updates.FoldProvider
30 import com.android.systemui.unfold.updates.RotationChangeProvider
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 {
createnull54         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 @UnfoldBg bgHandler: Handler,
67             @BindsInstance contentResolver: ContentResolver = context.contentResolver,
68         ): UnfoldSharedComponent
69     }
70 
71     val unfoldTransitionProvider: Optional<UnfoldTransitionProgressProvider>
72 }
73 
74 /**
75  * Generates a [RemoteTransitionProgress] usable to receive unfold transition progress from another
76  * process.
77  */
78 @Singleton
79 @Component(modules = [UnfoldRemoteModule::class])
80 interface RemoteUnfoldSharedComponent {
81 
82     @Component.Factory
83     interface Factory {
84         fun create(
85             @BindsInstance context: Context,
86             @BindsInstance config: UnfoldTransitionConfig,
87             @BindsInstance @UnfoldMain executor: Executor,
88             @BindsInstance @UnfoldMain handler: Handler,
89             @BindsInstance @UnfoldSingleThreadBg singleThreadBgExecutor: Executor,
90             @BindsInstance @UnfoldBg bgHandler: Handler,
91             @BindsInstance displayManager: DisplayManager,
92             @BindsInstance @UnfoldTransitionATracePrefix tracingTagPrefix: String,
93         ): RemoteUnfoldSharedComponent
94     }
95 
96     val remoteTransitionProgress: Optional<RemoteUnfoldTransitionReceiver>
97 
98     @UnfoldMain fun getRotationChangeProvider(): RotationChangeProvider
99 }
100 
101 /**
102  * Usable to receive and propagate unfold transition progresses
103  *
104  * All unfold events received by [remoteReceiver] will be propagated to [localProvider].
105  * [remoteReceiver] is meant to receive events from a remote process (E.g. from a binder service).
106  */
107 data class RemoteTransitionProgress(
108     val localProvider: UnfoldTransitionProgressProvider,
109     val remoteReceiver: UnfoldTransitionProgressProvider.TransitionProgressListener
110 )
111