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