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

Commit 4c00545c authored by Massimo Carli's avatar Massimo Carli Committed by Android (Google) Code Review
Browse files

Merge "[86/n] Save additional TaskInfo data in Repository" into main

parents b7ed1781 0c4d1150
Loading
Loading
Loading
Loading
+26 −11
Original line number Diff line number Diff line
@@ -18,10 +18,11 @@ package com.android.wm.shell.compatui.letterbox.state

import android.app.ActivityManager.RunningTaskInfo
import android.view.SurfaceControl
import com.android.window.flags.Flags.appCompatRefactoring
import com.android.window.flags.Flags
import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.ShellTaskOrganizer.TaskAppearedListener
import com.android.wm.shell.ShellTaskOrganizer.TaskVanishedListener
import com.android.wm.shell.compatui.letterbox.lifecycle.TaskIdResolver
import com.android.wm.shell.dagger.WMSingleton
import com.android.wm.shell.sysui.ShellInit
import javax.inject.Inject
@@ -34,11 +35,12 @@ import javax.inject.Inject
class LetterboxTaskListenerAdapter @Inject constructor(
    shellInit: ShellInit,
    shellTaskOrganizer: ShellTaskOrganizer,
    private val letterboxTaskInfoRepository: LetterboxTaskInfoRepository
    private val letterboxTaskInfoRepository: LetterboxTaskInfoRepository,
    private val taskIdResolver: TaskIdResolver
) : TaskVanishedListener, TaskAppearedListener {

    init {
        if (appCompatRefactoring()) {
        if (Flags.appCompatRefactoring()) {
            shellInit.addInitCallback({
                shellTaskOrganizer.addTaskAppearedListener(this)
                shellTaskOrganizer.addTaskVanishedListener(this)
@@ -50,14 +52,27 @@ class LetterboxTaskListenerAdapter @Inject constructor(
        taskInfo: RunningTaskInfo,
        leash: SurfaceControl
    ) {
        if (Flags.appCompatRefactoringFixMultiwindowTaskHierarchy()) {
            letterboxTaskInfoRepository.insert(
                key = taskInfo.taskId,
                item = LetterboxTaskInfoState(
                    containerToken = taskInfo.token,
                containerLeash = leash
                    containerLeash = leash,
                    parentTaskId = taskInfo.parentTaskId,
                    taskId = taskIdResolver.getLetterboxTaskId(taskInfo)
                ),
                overrideIfPresent = true
            )
        } else {
            letterboxTaskInfoRepository.insert(
                key = taskInfo.taskId,
                item = LetterboxTaskInfoState(
                    containerToken = taskInfo.token,
                    containerLeash = leash,
                ),
                overrideIfPresent = true
            )
        }
    }

    override fun onTaskVanished(taskInfo: RunningTaskInfo) {
+44 −1
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.wm.shell.ShellTaskOrganizer
import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.common.ShellExecutor
import com.android.wm.shell.compatui.letterbox.asMode
import com.android.wm.shell.compatui.letterbox.lifecycle.TaskIdResolver
import com.android.wm.shell.sysui.ShellInit
import com.android.wm.shell.util.testTaskAppearedListener
import com.android.wm.shell.util.testTaskVanishedListener
@@ -37,6 +38,7 @@ import kotlin.test.assertNull
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify

@@ -69,6 +71,38 @@ class LetterboxTaskListenerAdapterTest : ShellTestCase() {
    }

    @Test
    @EnableFlags(
        Flags.FLAG_APP_COMPAT_REFACTORING,
        Flags.FLAG_APP_COMPAT_REFACTORING_FIX_MULTIWINDOW_TASK_HIERARCHY
    )
    fun `When a Task appears the TaskInfo data are persisted with parentTaskId`() {
        runTestScenario { r ->
            testTaskAppearedListener(r.getLetterboxTaskListenerAdapterFactory()) {
                val leashTest = SurfaceControl()
                val tokenTest = mock<WindowContainerToken>()
                r.configureTaskIdResolver(letterboxTaskId = 37)
                runningTaskInfo { ti ->
                    ti.taskId = 10
                    ti.parentTaskId = 20
                    ti.token = tokenTest
                    ti.appCompatTaskInfo.setIsLeafTask(true)
                }
                leash { leashTest }
                validateOnTaskAppeared {
                    r.validateItem(10) { item ->
                        assertEquals(leashTest, item?.containerLeash)
                        assertEquals(tokenTest, item?.containerToken)
                        assertEquals(37, item?.taskId)
                        assertEquals(20, item?.parentTaskId)
                    }
                }
            }
        }
    }

    @Test
    @EnableFlags(Flags.FLAG_APP_COMPAT_REFACTORING)
    @DisableFlags(Flags.FLAG_APP_COMPAT_REFACTORING_FIX_MULTIWINDOW_TASK_HIERARCHY)
    fun `When a Task appears the TaskInfo data are persisted`() {
        runTestScenario { r ->
            testTaskAppearedListener(r.getLetterboxTaskListenerAdapterFactory()) {
@@ -77,6 +111,7 @@ class LetterboxTaskListenerAdapterTest : ShellTestCase() {
                runningTaskInfo { ti ->
                    ti.taskId = 10
                    ti.token = tokenTest
                    ti.appCompatTaskInfo.setIsLeafTask(true)
                }
                leash { leashTest }
                validateOnTaskAppeared {
@@ -90,6 +125,7 @@ class LetterboxTaskListenerAdapterTest : ShellTestCase() {
    }

    @Test
    @EnableFlags(Flags.FLAG_APP_COMPAT_REFACTORING)
    fun `When a Task vanishes the TaskInfo data are removed`() {
        runTestScenario { r ->
            val leashTest = SurfaceControl()
@@ -135,16 +171,19 @@ class LetterboxTaskListenerAdapterTest : ShellTestCase() {
        private val shellTaskOrganizer: ShellTaskOrganizer
        private val letterboxTaskListenerAdapter: LetterboxTaskListenerAdapter
        private val letterboxTaskInfoRepository: LetterboxTaskInfoRepository
        private val taskIdResolver: TaskIdResolver

        init {
            executor = mock<ShellExecutor>()
            shellInit = ShellInit(executor)
            shellTaskOrganizer = mock<ShellTaskOrganizer>()
            letterboxTaskInfoRepository = LetterboxTaskInfoRepository()
            taskIdResolver = mock<TaskIdResolver>()
            letterboxTaskListenerAdapter = LetterboxTaskListenerAdapter(
                shellInit,
                shellTaskOrganizer,
                letterboxTaskInfoRepository
                letterboxTaskInfoRepository,
                taskIdResolver
            )
        }

@@ -154,6 +193,10 @@ class LetterboxTaskListenerAdapterTest : ShellTestCase() {

        fun invokeShellInit() = shellInit.init()

        fun configureTaskIdResolver(letterboxTaskId: Int) {
            doReturn(letterboxTaskId).`when`(taskIdResolver).getLetterboxTaskId(any())
        }

        fun checkListenerIsRegistered(expected: Boolean) {
            verify(shellTaskOrganizer, expected.asMode()).addTaskAppearedListener(any())
            verify(shellTaskOrganizer, expected.asMode()).addTaskVanishedListener(any())