<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