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

<lambda>null1 package com.android.systemui.statusbar.notification.fsi
2 
3 import android.annotation.UiContext
4 import android.app.PendingIntent
5 import android.content.Context
6 import android.graphics.drawable.Drawable
7 import com.android.systemui.CoreStartable
8 import com.android.systemui.dagger.SysUISingleton
9 import com.android.systemui.dagger.qualifiers.Main
10 import com.android.systemui.statusbar.notification.fsi.FsiDebug.Companion.log
11 import com.android.wm.shell.TaskView
12 import com.android.wm.shell.TaskViewFactory
13 import java.util.Optional
14 import java.util.concurrent.Executor
15 import javax.inject.Inject
16 import kotlin.coroutines.resume
17 import kotlinx.coroutines.flow.Flow
18 import kotlinx.coroutines.flow.mapLatest
19 import kotlinx.coroutines.suspendCancellableCoroutine
20 
21 /**
22  * Handle view-related data for fullscreen intent container on lockscreen. Wraps FsiChromeRepo,
23  * transforms events/state into view-relevant representation for FsiChromeView. Alive for lifetime
24  * of SystemUI.
25  */
26 @SysUISingleton
27 class FsiChromeViewModelFactory
28 @Inject
29 constructor(
30     val repo: FsiChromeRepo,
31     val taskViewFactory: Optional<TaskViewFactory>,
32     @UiContext val context: Context,
33     @Main val mainExecutor: Executor,
34 ) : CoreStartable {
35 
36     companion object {
37         private const val classTag = "FsiChromeViewModelFactory"
38     }
39 
40     val viewModelFlow: Flow<FsiChromeViewModel?> =
41         repo.infoFlow.mapLatest { fsiInfo ->
42             fsiInfo?.let {
43                 log("$classTag viewModelFlow got new fsiInfo")
44 
45                 // mapLatest emits null when FSIInfo is null
46                 FsiChromeViewModel(
47                     fsiInfo.appName,
48                     fsiInfo.appIcon,
49                     createTaskView(),
50                     fsiInfo.fullscreenIntent,
51                     repo
52                 )
53             }
54         }
55 
56     override fun start() {
57         log("$classTag start")
58     }
59 
60     private suspend fun createTaskView(): TaskView = suspendCancellableCoroutine { k ->
61         log("$classTag createTaskView")
62 
63         taskViewFactory.get().create(context, mainExecutor) { taskView -> k.resume(taskView) }
64     }
65 }
66 
67 // Alive for lifetime of FSI.
68 data class FsiChromeViewModel(
69     val appName: String,
70     val appIcon: Drawable,
71     val taskView: TaskView,
72     val fsi: PendingIntent,
73     val repo: FsiChromeRepo
74 ) {
75     companion object {
76         private const val classTag = "FsiChromeViewModel"
77     }
78 
onDismissnull79     fun onDismiss() {
80         log("$classTag onDismiss")
81         repo.dismiss()
82     }
onFullscreennull83     fun onFullscreen() {
84         log("$classTag onFullscreen")
85         repo.onFullscreen()
86     }
87 }
88