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

Commit 4833c7b3 authored by Massimo Carli's avatar Massimo Carli
Browse files

[82/n] Improving Skip Logic

The actual skipping logic needs to be improved because there are cases
when the Changes cannot be completely skipped but they require
different actions depending on other factors. For instance, in some
cases, the Changes should be ignored when the letterbox surfaces are created
but not ignored in case of resizing (e.g. Split Screen).

Flag: EXEMPT Refactoring
Bug: 430486865
Test: atest WMShellUnitTests:LetterboxLifecycleEventTest
Test: atest WMShellUnitTests:SkipLetterboxLifecycleEventFactoryTest

Change-Id: I6cf0762c3034bc3251805e6089825177c05c834e
parent 76b853b2
Loading
Loading
Loading
Loading
+6 −10
Original line number Diff line number Diff line
@@ -67,15 +67,8 @@ fun Change.asLetterboxLifecycleEventType() = when {

/**
 * Logic to skip a [Change] if not related to Letterboxing. We always skip changes about closing.
 * We skip the changes for tasks which are not leaves. The isLeaf information for changes with
 * activity target is always false but those changes cannot be skipped.
 *
 * No leaf task    -> isChangeForALeafTask()==false  isActivityChange()==false     Skip
 * leaf task       -> isChangeForALeafTask()==true   isActivityChange()==false     No Skip
 * Activity change -> isChangeForALeafTask()==false  isActivityChange()==true      No Skip
 */
fun Change.shouldSkipForLetterbox(): Boolean =
    isClosingType(mode) || !(isChangeForALeafTask() || isActivityChange())
fun Change.shouldSkipForLetterbox(): Boolean = isClosingType(mode)

/**
 * Returns [true] if the [Change] is about an [Activity] and so it contains a
@@ -88,6 +81,9 @@ fun Change.isActivityChange(): Boolean = activityTransitionInfo != null
 */
fun Change.isTranslucent() = hasFlags(FLAG_TRANSLUCENT)

/** Returns [true] if the Task hosts Activities */
/**
 * Returns [true] if the Task hosts Activities. This is true if the Change has Activity as target
 * or if task is a leaf task.
 */
fun Change.isChangeForALeafTask(): Boolean =
    taskInfo?.appCompatTaskInfo?.isLeafTask() ?: false
    taskInfo?.appCompatTaskInfo?.isLeafTask ?: isActivityChange()
+23 −3
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.testing.AndroidTestingRunner
import android.view.WindowManager
import android.window.TransitionInfo.FLAG_TRANSLUCENT
import androidx.test.filters.SmallTest
import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.compatui.letterbox.lifecycle.LetterboxLifecycleEventType.CLOSE
import com.android.wm.shell.compatui.letterbox.lifecycle.LetterboxLifecycleEventType.OPEN
import com.android.wm.shell.util.testLetterboxLifecycleEvent
@@ -37,7 +38,7 @@ import org.junit.runner.RunWith
 */
@RunWith(AndroidTestingRunner::class)
@SmallTest
class LetterboxLifecycleEventTest {
class LetterboxLifecycleEventTest : ShellTestCase() {

    @Test
    fun `asLetterboxLifecycleEventType returns the right type for OPEN modes`() {
@@ -135,19 +136,38 @@ class LetterboxLifecycleEventTest {
        }
    }

    @Test
    fun `isChangeForALeafTask returns true if the Change has Activity target`() {
        testLetterboxLifecycleEvent {
            inputChange {
            }
            useChange { change ->
                assertFalse(change.isChangeForALeafTask())
            }

            inputChange {
                activityTransitionInfo {
                }
            }
            useChange { change ->
                assertTrue(change.isChangeForALeafTask())
            }
        }
    }

    @Test
    fun `isTranslucent returns true if the FLAG_TRANSLUCENT flag is present in Change`() {
        testLetterboxLifecycleEvent {
            inputChange { }
            useChange { change ->
                assert(!change.isTranslucent())
                assertFalse(change.isTranslucent())
            }

            inputChange {
                flags = FLAG_TRANSLUCENT
            }
            useChange { change ->
                assert(!change.isTranslucent())
                assertTrue(change.isTranslucent())
            }
        }
    }
+1 −48
Original line number Diff line number Diff line
@@ -24,7 +24,6 @@ import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.util.testLetterboxLifecycleEventFactory
import java.util.function.Consumer
import kotlin.test.assertFalse
import kotlin.test.assertNull
import kotlin.test.assertTrue
import org.junit.Test
import org.junit.runner.RunWith
@@ -49,62 +48,16 @@ class SkipLetterboxLifecycleEventFactoryTest : ShellTestCase() {
                validateCanHandle { canHandle ->
                    assertTrue(canHandle)
                }
                validateCreateLifecycleEvent { event ->
                    assertNull(event)
                }
            }
        }
    }

    @Test
    fun `Factory is active when Change is for a Task which is NOT a leaf`() {
        runTestScenario { r ->
            testLetterboxLifecycleEventFactory(r.getLetterboxLifecycleEventFactory()) {
                inputChange {
                    mode = TRANSIT_OPEN
                    runningTaskInfo { ti ->
                        ti.appCompatTaskInfo.setIsLeafTask(false)
                    }
                }
                validateCanHandle { canHandle ->
                    assertTrue(canHandle)
                }
                validateCreateLifecycleEvent { event ->
                    assertNull(event)
                }
            }
        }
    }

    @Test
    fun `Factory is active when Change is not closing for a Task which is NOT a leaf`() {
    fun `Factory is NOT active when Change is NOT a Closing one`() {
        runTestScenario { r ->
            testLetterboxLifecycleEventFactory(r.getLetterboxLifecycleEventFactory()) {
                inputChange {
                    mode = TRANSIT_OPEN
                    runningTaskInfo { ti ->
                        ti.appCompatTaskInfo.setIsLeafTask(false)
                    }
                }
                validateCanHandle { canHandle ->
                    assertTrue(canHandle)
                }
                validateCreateLifecycleEvent { event ->
                    assertNull(event)
                }
            }
        }
    }

    @Test
    fun `Factory is NOT active when Change is not closing for an Activity Transition`() {
        runTestScenario { r ->
            testLetterboxLifecycleEventFactory(r.getLetterboxLifecycleEventFactory()) {
                inputChange {
                    mode = TRANSIT_OPEN
                    activityTransitionInfo {
                        this.taskId = 10
                    }
                }
                validateCanHandle { canHandle ->
                    assertFalse(canHandle)