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

Commit fbe971fa authored by Ben Lin's avatar Ben Lin Committed by Android (Google) Code Review
Browse files

Merge "Add DesktkopState#isProjectedMode." into main

parents ebe5002f 0f787cf9
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -78,6 +78,13 @@ interface DesktopState {
     */
    fun isDesktopModeSupportedOnDisplay(display: Display): Boolean

    /**
     * Check if the current device is in projected display mode.
     *
     * Note, if the device is not connected to any display, this will return false.
     */
    fun isProjectedMode(): Boolean

    /**
     * Whether the app handle should be shown on this device.
     */
+14 −0
Original line number Diff line number Diff line
@@ -123,6 +123,20 @@ class DesktopStateImpl(context: Context) : DesktopState {
        return false
    }

    override fun isProjectedMode(): Boolean {
        if (!DesktopExperienceFlags.ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE.isTrue) {
            return false
        }

        if (isDesktopModeSupportedOnDisplay(Display.DEFAULT_DISPLAY)) {
            return false
        }

        return displayManager.displays
            ?.any { display -> isDesktopModeSupportedOnDisplay(display)
            } ?: false
    }

    private val deviceHasLargeScreen =
        displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)
            ?.filter { display -> display.type == Display.TYPE_INTERNAL }
+75 −0
Original line number Diff line number Diff line
@@ -16,10 +16,13 @@

package com.android.wm.shell.shared.desktopmode

import android.hardware.display.DisplayManager
import android.os.SystemProperties
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.annotations.Presubmit
import android.view.Display
import android.view.WindowManager
import android.window.DesktopModeFlags
import androidx.test.filters.SmallTest
import com.android.dx.mockito.inline.extended.ExtendedMockito
@@ -32,8 +35,11 @@ import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.mockito.ArgumentMatchers.anyInt
import org.mockito.Mock
import org.mockito.kotlin.any
import org.mockito.kotlin.eq
import org.mockito.kotlin.whenever
import org.mockito.quality.Strictness

/**
@@ -44,6 +50,10 @@ import org.mockito.quality.Strictness
class DesktopStateImplTest : ShellTestCase() {

    private lateinit var mockitoSession: StaticMockitoSession
    @Mock private lateinit var displayManager: DisplayManager
    @Mock private lateinit var windowManager: WindowManager
    @Mock private lateinit var defaultDisplay: Display
    @Mock private lateinit var extendedDisplay: Display

    @Before
    fun setUp() {
@@ -54,11 +64,20 @@ class DesktopStateImplTest : ShellTestCase() {
                .startMocking()

        val resources = mContext.getOrCreateTestableResources()
        mContext.addMockSystemService(DisplayManager::class.java, displayManager)
        mContext.addMockSystemService(WindowManager::class.java, windowManager)
        resources.apply {
            addOverride(R.bool.config_isDesktopModeSupported, false)
            addOverride(R.bool.config_isDesktopModeDevOptionSupported, false)
            addOverride(R.bool.config_canInternalDisplayHostDesktops, false)
        }
        whenever(defaultDisplay.type).thenReturn(Display.TYPE_INTERNAL)
        whenever(defaultDisplay.displayId).thenReturn(Display.DEFAULT_DISPLAY)
        whenever(extendedDisplay.type).thenReturn(Display.TYPE_EXTERNAL)
        whenever(extendedDisplay.displayId).thenReturn(Display.DEFAULT_DISPLAY + 1)

        whenever(displayManager.displays).thenReturn(arrayOf(defaultDisplay, extendedDisplay))
        whenever(displayManager.getDisplay(Display.DEFAULT_DISPLAY)).thenReturn(defaultDisplay)
        setEnforceDeviceRestriction(true)
        setEnterDesktopByDefaultOnFreeformDisplay(false)

@@ -265,6 +284,62 @@ class DesktopStateImplTest : ShellTestCase() {
        assertThat(desktopState.isDeviceEligibleForDesktopMode).isTrue()
    }

    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE)
    @Test
    fun isProjectedMode_oneDisplay_returnsFalse() {
        val resources = mContext.getOrCreateTestableResources()
        resources.addOverride(R.bool.config_isDesktopModeSupported, true)
        whenever(displayManager.displays).thenReturn(arrayOf(defaultDisplay))
        val desktopState = DesktopStateImpl(context)

        assertThat(desktopState.isProjectedMode()).isFalse()
    }

    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE)
    @Test
    fun isProjectedMode_twoDisplay_bothSupportDesktopMode_returnsFalse() {
        whenever(displayManager
            .getDisplays(DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED))
            .thenReturn(arrayOf(defaultDisplay, extendedDisplay))
        val resources = mContext.getOrCreateTestableResources()
        resources.addOverride(R.bool.config_isDesktopModeSupported, true)
        resources.addOverride(R.bool.config_canInternalDisplayHostDesktops, true)
        whenever(windowManager.isEligibleForDesktopMode(anyInt())).thenReturn(true)
        val desktopState = DesktopStateImpl(context)

        assertThat(desktopState.isProjectedMode()).isFalse()
    }

    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE)
    @Test
    fun isProjectedMode_twoDisplay_onlyExternalSupportDesktopMode_returnsTrue() {
        whenever(displayManager
            .getDisplays(DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED))
            .thenReturn(arrayOf(defaultDisplay, extendedDisplay))
        val resources = mContext.getOrCreateTestableResources()
        resources.addOverride(R.bool.config_isDesktopModeSupported, true)
        resources.addOverride(R.bool.config_canInternalDisplayHostDesktops, false)
        whenever(windowManager.isEligibleForDesktopMode(anyInt())).thenReturn(true)
        val desktopState = DesktopStateImpl(context)

        assertThat(desktopState.isProjectedMode()).isTrue()
    }

    @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_MODE_THROUGH_DEV_OPTION, Flags.FLAG_ENABLE_PROJECTED_DISPLAY_DESKTOP_MODE)
    @Test
    fun isProjectedMode_twoDisplay_neitherSupportDesktopMode_returnsFalse() {
        whenever(displayManager
            .getDisplays(DisplayManager.DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED))
            .thenReturn(arrayOf(defaultDisplay, extendedDisplay))
        val resources = mContext.getOrCreateTestableResources()
        resources.addOverride(R.bool.config_isDesktopModeSupported, true)
        resources.addOverride(R.bool.config_canInternalDisplayHostDesktops, false)
        whenever(windowManager.isEligibleForDesktopMode(anyInt())).thenReturn(false)
        val desktopState = DesktopStateImpl(context)

        assertThat(desktopState.isProjectedMode()).isFalse()
    }

    @DisableFlags(Flags.FLAG_SHOW_DESKTOP_EXPERIENCE_DEV_OPTION)
    @Test
    fun canShowDesktopExperienceDevOption_flagDisabled_returnsFalse() {
+4 −0
Original line number Diff line number Diff line
@@ -56,6 +56,10 @@ class FakeDesktopState : DesktopState {
        return isDesktopModeSupportedOnDisplay(display.displayId)
    }

    override fun isProjectedMode(): Boolean {
        return false
    }

    override var overridesShowAppHandle: Boolean = false

    override var isFreeformEnabled: Boolean = false