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

Commit 3fde467b authored by Alex Chau's avatar Alex Chau
Browse files

Make DeskopTaskView use latest TTV

- Made TaskThumbnailViewDeprecated nullable in TaskContainer, with non-null getter that requires feature flag to be on/off
- Removed TaskThumbnailViewDeprecated.setTaskOverlay, as it'll now be null with feature flag on
- Removed TaskThumbnailViewDeprecated from DesktopTaskView xml
- Simplifed DesktopTaskView binding logic, to always get thumbnailViews from viewPool, removeView and recycle all thumbnailViews in onRecycle
- Didn't implement view pooling of TaskThumbnailView due to difficulty with TaskContainer not being recycled togetehr with TaskThumbnailView

Bug: 338360089
Test: TaskThumbnailViewModelTest
Test: manual testing for DesktopTaskView for both enable_refactor_task_thumbnail on and off
Flag: com.android.launcher3.enable_refactor_task_thumbnail
Flag: com.android.window.flags.enable_desktop_windowing_mode
Change-Id: I38a6dfc6bc561689578d1660794f91d30bad4a68
parent a00c81c1
Loading
Loading
Loading
Loading
+0 −9
Original line number Diff line number Diff line
@@ -36,15 +36,6 @@
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!--
         TODO(b249371338): DesktopTaskView extends from TaskView. TaskView expects TaskThumbnailView
         and IconView with these ids to be present. Need to refactor RecentsView to accept child
         views that do not inherint from TaskView only or create a generic TaskView that have
         N number of tasks.
     -->
    <include layout="@layout/task_thumbnail"
        android:visibility="gone" />

    <ViewStub
        android:id="@+id/icon"
        android:inflatedId="@id/icon"
+12 −6
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.view.View
import android.view.ViewOutlineProvider
import androidx.annotation.ColorInt
import com.android.launcher3.Utilities
import com.android.launcher3.util.ViewPool
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.BackgroundOnly
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.LiveTile
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Snapshot
@@ -42,7 +43,7 @@ import com.android.systemui.shared.system.QuickStepContract
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.launch

class TaskThumbnailView : View {
class TaskThumbnailView : View, ViewPool.Reusable {
    // TODO(b/335649589): Ideally create and obtain this from DI. This ViewModel should be scoped
    //  to [TaskView], and also shared between [TaskView] and [TaskThumbnailView]
    //  This is using a lazy for now because the dependencies cannot be obtained without DI.
@@ -71,7 +72,7 @@ class TaskThumbnailView : View {
            return _measuredBounds
        }

    private var cornerRadius: Float = TaskCornerRadius.get(context)
    private var overviewCornerRadius: Float = TaskCornerRadius.get(context)
    private var fullscreenCornerRadius: Float = QuickStepContract.getWindowCornerRadius(context)

    constructor(context: Context?) : super(context)
@@ -100,7 +101,7 @@ class TaskThumbnailView : View {
                invalidate()
            }
        }
        MainScope().launch { viewModel.recentsFullscreenProgress.collect { invalidateOutline() } }
        MainScope().launch { viewModel.cornerRadiusProgress.collect { invalidateOutline() } }
        MainScope().launch {
            viewModel.inheritedScale.collect { viewModelInheritedScale ->
                inheritedScale = viewModelInheritedScale
@@ -117,6 +118,11 @@ class TaskThumbnailView : View {
            }
    }

    override fun onRecycle() {
        // Do nothing
        uiState = Uninitialized
    }

    override fun onDraw(canvas: Canvas) {
        when (val uiStateVal = uiState) {
            is Uninitialized -> drawBackgroundOnly(canvas, Color.BLACK)
@@ -138,7 +144,7 @@ class TaskThumbnailView : View {
    override fun onConfigurationChanged(newConfig: Configuration?) {
        super.onConfigurationChanged(newConfig)

        cornerRadius = TaskCornerRadius.get(context)
        overviewCornerRadius = TaskCornerRadius.get(context)
        fullscreenCornerRadius = QuickStepContract.getWindowCornerRadius(context)
        invalidateOutline()
    }
@@ -159,8 +165,8 @@ class TaskThumbnailView : View {

    private fun getCurrentCornerRadius() =
        Utilities.mapRange(
            viewModel.recentsFullscreenProgress.value,
            cornerRadius,
            viewModel.cornerRadiusProgress.value,
            overviewCornerRadius,
            fullscreenCornerRadius
        ) / inheritedScale

+8 −1
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import com.android.systemui.shared.recents.model.Task
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flatMapLatest
@@ -47,7 +48,13 @@ class TaskThumbnailViewModel(
    private val task = MutableStateFlow<Flow<Task?>>(flowOf(null))
    private var boundTaskIsRunning = false

    val recentsFullscreenProgress = recentsViewData.fullscreenProgress
    /**
     * Progress for changes in corner radius. progress: 0 = overview corner radius; 1 = fullscreen
     * corner radius.
     */
    val cornerRadiusProgress =
        if (taskViewData.isOutlineFormedByThumbnailView) recentsViewData.fullscreenProgress
        else MutableStateFlow(1f).asStateFlow()
    val inheritedScale =
        combine(recentsViewData.scale, taskViewData.scale) { recentsScale, taskScale ->
            recentsScale * taskScale
+6 −1
Original line number Diff line number Diff line
@@ -16,9 +16,14 @@

package com.android.quickstep.task.viewmodel

import com.android.quickstep.views.TaskViewType
import kotlinx.coroutines.flow.MutableStateFlow

class TaskViewData {
class TaskViewData(taskViewType: TaskViewType) {
    // This is typically a View concern but it is used to invalidate rendering in other Views
    val scale = MutableStateFlow(1f)

    // TODO(b/331753115): This property should not be in TaskViewData once TaskView is MVVM.
    /** Whether outline of TaskView is formed by outline thumbnail view(s). */
    val isOutlineFormedByThumbnailView: Boolean = taskViewType != TaskViewType.DESKTOP
}
+2 −2
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ package com.android.quickstep.util;

import androidx.annotation.NonNull;

import com.android.quickstep.views.TaskView;
import com.android.quickstep.views.TaskViewType;
import com.android.systemui.shared.recents.model.Task;

import java.util.List;
@@ -34,7 +34,7 @@ public class DesktopTask extends GroupTask {
    public final List<Task> tasks;

    public DesktopTask(@NonNull List<Task> tasks) {
        super(tasks.get(0), null, null, TaskView.Type.DESKTOP);
        super(tasks.get(0), null, null, TaskViewType.DESKTOP);
        this.tasks = tasks;
    }

Loading