• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download

<lambda>null1 package com.android.systemui
2 
3 import android.content.ComponentName
4 import android.content.Context
5 import android.content.pm.PackageManager
6 import android.util.Log
7 import com.android.internal.R
8 import com.android.systemui.dagger.SysUISingleton
9 import com.android.systemui.dagger.qualifiers.Application
10 import com.android.systemui.dagger.qualifiers.Background
11 import com.android.systemui.flags.FeatureFlags
12 import com.android.systemui.flags.FlagListenable
13 import com.android.systemui.flags.Flags
14 import com.android.systemui.settings.UserTracker
15 import kotlinx.coroutines.CoroutineDispatcher
16 import kotlinx.coroutines.CoroutineScope
17 import kotlinx.coroutines.launch
18 import kotlinx.coroutines.suspendCancellableCoroutine
19 import kotlinx.coroutines.withContext
20 import javax.inject.Inject
21 
22 @SysUISingleton
23 class ChooserSelector @Inject constructor(
24         private val context: Context,
25         private val userTracker: UserTracker,
26         private val featureFlags: FeatureFlags,
27         @Application private val coroutineScope: CoroutineScope,
28         @Background private val bgDispatcher: CoroutineDispatcher,
29 ) : CoreStartable {
30 
31     private val chooserComponent = ComponentName.unflattenFromString(
32             context.resources.getString(R.string.config_chooserActivity))
33 
34     override fun start() {
35         coroutineScope.launch {
36             val listener = FlagListenable.Listener { event ->
37                 if (event.flagName == Flags.CHOOSER_UNBUNDLED.name) {
38                     launch { updateUnbundledChooserEnabled() }
39                     event.requestNoRestart()
40                 }
41             }
42             featureFlags.addListener(Flags.CHOOSER_UNBUNDLED, listener)
43             updateUnbundledChooserEnabled()
44 
45             awaitCancellationAndThen { featureFlags.removeListener(listener) }
46         }
47     }
48 
49     private suspend fun updateUnbundledChooserEnabled() {
50         setUnbundledChooserEnabled(withContext(bgDispatcher) {
51             featureFlags.isEnabled(Flags.CHOOSER_UNBUNDLED)
52         })
53     }
54 
55     private fun setUnbundledChooserEnabled(enabled: Boolean) {
56         val newState = if (enabled) {
57             PackageManager.COMPONENT_ENABLED_STATE_ENABLED
58         } else {
59             PackageManager.COMPONENT_ENABLED_STATE_DISABLED
60         }
61         userTracker.userProfiles.forEach {
62             try {
63                 context.createContextAsUser(it.userHandle, /* flags = */ 0).packageManager
64                         .setComponentEnabledSetting(chooserComponent, newState, /* flags = */ 0)
65             } catch (e: IllegalArgumentException) {
66                 Log.w(
67                         "ChooserSelector",
68                         "Unable to set IntentResolver enabled=$enabled for user ${it.id}",
69                         e,
70                 )
71             }
72         }
73     }
74 
75     suspend inline fun awaitCancellation(): Nothing = suspendCancellableCoroutine { }
76     suspend inline fun awaitCancellationAndThen(block: () -> Unit): Nothing = try {
77         awaitCancellation()
78     } finally {
79         block()
80     }
81 }
82