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