1 /* 2 * Copyright (C) 2024 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.util.kotlin 18 19 import com.android.app.tracing.coroutines.createCoroutineTracingContext 20 import com.android.systemui.dagger.qualifiers.Application 21 import com.android.systemui.dagger.qualifiers.Main 22 import com.android.systemui.dagger.qualifiers.Tracing 23 import dagger.Module 24 import dagger.Provides 25 import javax.inject.Singleton 26 import kotlin.coroutines.CoroutineContext 27 import kotlinx.coroutines.CoroutineDispatcher 28 import kotlinx.coroutines.CoroutineScope 29 import kotlinx.coroutines.Dispatchers 30 import kotlinx.coroutines.ExperimentalCoroutinesApi 31 32 /** Providers for various application-wide coroutines-related constructs. */ 33 @Module 34 class GlobalCoroutinesModule { 35 @Provides 36 @Singleton 37 @Application applicationScopenull38 fun applicationScope( 39 @Main dispatcherContext: CoroutineContext, 40 ): CoroutineScope = CoroutineScope(dispatcherContext) 41 42 @Provides 43 @Singleton 44 @Main 45 @Deprecated( 46 "Use @Main CoroutineContext instead", 47 ReplaceWith("mainCoroutineContext()", "kotlin.coroutines.CoroutineContext") 48 ) 49 fun mainDispatcher(): CoroutineDispatcher = Dispatchers.Main.immediate 50 51 @Provides 52 @Singleton 53 @Main 54 fun mainCoroutineContext(@Tracing tracingCoroutineContext: CoroutineContext): CoroutineContext { 55 return Dispatchers.Main.immediate + tracingCoroutineContext 56 } 57 58 @OptIn(ExperimentalCoroutinesApi::class) 59 @Provides 60 @Tracing 61 @Singleton tracingCoroutineContextnull62 fun tracingCoroutineContext(): CoroutineContext { 63 return createCoroutineTracingContext() 64 } 65 } 66