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