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.intentresolver.inject
18  
19  import dagger.Module
20  import dagger.Provides
21  import dagger.hilt.InstallIn
22  import dagger.hilt.android.ViewModelLifecycle
23  import dagger.hilt.android.components.ViewModelComponent
24  import dagger.hilt.android.scopes.ViewModelScoped
25  import kotlin.coroutines.CoroutineContext
26  import kotlin.coroutines.EmptyCoroutineContext
27  import kotlinx.coroutines.CoroutineDispatcher
28  import kotlinx.coroutines.CoroutineScope
29  import kotlinx.coroutines.cancel
30  
31  @Module
32  @InstallIn(ViewModelComponent::class)
33  object ViewModelCoroutineScopeModule {
34      @Provides
35      @ViewModelScoped
36      @ViewModelOwned
viewModelScopenull37      fun viewModelScope(@Main dispatcher: CoroutineDispatcher, lifecycle: ViewModelLifecycle) =
38          lifecycle.asCoroutineScope(dispatcher)
39  }
40  
41  fun ViewModelLifecycle.asCoroutineScope(context: CoroutineContext = EmptyCoroutineContext) =
42      CoroutineScope(context).also { addOnClearedListener { it.cancel() } }
43