xref: /aosp_15_r20/frameworks/base/packages/SystemUI/utils/kairos/src/com/android/systemui/kairos/internal/NoScope.kt (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
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.kairos.internal
18 
19 import com.android.systemui.kairos.FrpScope
20 import kotlin.coroutines.Continuation
21 import kotlin.coroutines.CoroutineContext
22 import kotlin.coroutines.EmptyCoroutineContext
23 import kotlin.coroutines.coroutineContext
24 import kotlin.coroutines.startCoroutine
25 import kotlinx.coroutines.CompletableDeferred
26 import kotlinx.coroutines.completeWith
27 import kotlinx.coroutines.job
28 
29 internal object NoScope {
30     private object FrpScopeImpl : FrpScope
31 
runInFrpScopenull32     suspend fun <R> runInFrpScope(block: suspend FrpScope.() -> R): R {
33         val complete = CompletableDeferred<R>(coroutineContext.job)
34         block.startCoroutine(
35             FrpScopeImpl,
36             object : Continuation<R> {
37                 override val context: CoroutineContext
38                     get() = EmptyCoroutineContext
39 
40                 override fun resumeWith(result: Result<R>) {
41                     complete.completeWith(result)
42                 }
43             },
44         )
45         return complete.await()
46     }
47 }
48