Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 378622c9 authored by Alex Chau's avatar Alex Chau
Browse files

Support switch to screenshot for TTV

- Moved live tile decision to TaskThumbnailViewModel, and added RecentsViewData for runningTask information
- Implemented a ThumbnailData override mechanism to override screenshot from TaskThunmbnailCache, the override will be added during switchToScreenshot and cleared when user exit recents (RecentsView.reset)
- During the thumbnail override, we wait until the new ThumbnailData propagates, before finsihing Recents animation to avoid a frame of flash

Bug: 343364498
Test: TaskThumbnailViewModelTest, TaskRepositoryTest, RecentsViewModelTest
Flag: com.android.launcher3.enable_refactor_task_thumbnail
Change-Id: I776943ecdfa0d65d94b054692297b42686f59f8a
parent 7617787c
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -41,4 +41,10 @@ interface RecentTasksRepository {
     * populated e.g. icons/thumbnails etc.
     */
    fun setVisibleTasks(visibleTaskIdList: List<Int>)

    /**
     * Override [ThumbnailData] with a map of taskId to [ThumbnailData]. The override only applies
     * if the tasks are already visible, and will be invalidated when tasks become invisible.
     */
    fun setThumbnailOverride(thumbnailOverride: Map<Int, ThumbnailData>)
}
+13 −4
Original line number Diff line number Diff line
@@ -45,15 +45,18 @@ class TasksRepository(
    private val _taskData =
        groupedTaskData.map { groupTaskList -> groupTaskList.flatMap { it.tasks } }
    private val visibleTaskIds = MutableStateFlow(emptySet<Int>())
    private val thumbnailOverride = MutableStateFlow(mapOf<Int, ThumbnailData>())

    private val taskData: Flow<List<Task>> =
        combine(_taskData, getThumbnailQueryResults(), getIconQueryResults()) {
        combine(_taskData, getThumbnailQueryResults(), getIconQueryResults(), thumbnailOverride) {
            tasks,
            thumbnailQueryResults,
            iconQueryResults ->
            iconQueryResults,
            thumbnailOverride ->
            tasks.forEach { task ->
                // Add retrieved thumbnails + remove unnecessary thumbnails
                task.thumbnail = thumbnailQueryResults[task.key.id]
                // Add retrieved thumbnails + remove unnecessary thumbnails (e.g. invisible)
                task.thumbnail =
                    thumbnailOverride[task.key.id] ?: thumbnailQueryResults[task.key.id]

                // TODO(b/352331675) don't load icons for DesktopTaskView
                // Add retrieved icons + remove unnecessary icons
@@ -79,6 +82,12 @@ class TasksRepository(

    override fun setVisibleTasks(visibleTaskIdList: List<Int>) {
        this.visibleTaskIds.value = visibleTaskIdList.toSet()
        setThumbnailOverride(thumbnailOverride.value)
    }

    override fun setThumbnailOverride(thumbnailOverride: Map<Int, ThumbnailData>) {
        this.thumbnailOverride.value =
            thumbnailOverride.filterKeys(this.visibleTaskIds.value::contains).toMap()
    }

    /** Flow wrapper for [TaskThumbnailDataSource.getThumbnailInBackground] api */
+6 −0
Original line number Diff line number Diff line
@@ -36,4 +36,10 @@ class RecentsViewData {
    val tintAmount = MutableStateFlow(0f)

    val thumbnailSplashProgress = MutableStateFlow(0f)

    // A list of taskIds that are associated with a RecentsAnimationController. */
    val runningTaskIds = MutableStateFlow(emptySet<Int>())

    // Whether we should use static screenshot instead of live tile for taskIds in [runningTaskIds]
    val runningTaskShowScreenshot = MutableStateFlow(false)
}
+35 −0
Original line number Diff line number Diff line
@@ -17,6 +17,10 @@
package com.android.quickstep.recents.viewmodel

import com.android.quickstep.recents.data.RecentTasksRepository
import com.android.systemui.shared.recents.model.ThumbnailData
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.first

class RecentsViewModel(
    private val recentsTasksRepository: RecentTasksRepository,
@@ -53,4 +57,35 @@ class RecentsViewModel(
    fun updateThumbnailSplashProgress(taskThumbnailSplashAlpha: Float) {
        recentsViewData.thumbnailSplashProgress.value = taskThumbnailSplashAlpha
    }

    fun setThumbnailOverride(thumbnailOverride: Map<Int, ThumbnailData>) {
        recentsTasksRepository.setThumbnailOverride(thumbnailOverride)
    }

    suspend fun waitForThumbnailsToUpdate(updatedThumbnails: Map<Int, ThumbnailData>) {
        combine(
                updatedThumbnails.map {
                    recentsTasksRepository.getThumbnailById(it.key).filter { thumbnailData ->
                        thumbnailData == it.value
                    }
                }
            ) {}
            .first()
    }

    suspend fun waitForRunningTaskShowScreenshotToUpdate() {
        recentsViewData.runningTaskShowScreenshot.filter { it }.first()
    }

    fun onReset() {
        updateVisibleTasks(emptyList())
    }

    fun updateRunningTask(taskIds: Set<Int>) {
        recentsViewData.runningTaskIds.value = taskIds
    }

    fun setRunningTaskShowScreenshot(showScreenshot: Boolean) {
        recentsViewData.runningTaskShowScreenshot.value = showScreenshot
    }
}
+0 −2
Original line number Diff line number Diff line
@@ -45,5 +45,3 @@ sealed class TaskThumbnailUiState {
        val size: Point,
    )
}

data class TaskThumbnail(val taskId: Int, val isRunning: Boolean)
Loading