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

Commit 8a3ab668 authored by Massimo Carli's avatar Massimo Carli
Browse files

[2/n] Ignore Compat UI Education when in Desktop Mode

Flag: com.android.window.flags.skip_compat_ui_education_in_desktop_mode
Bug: 357062954
Test: atest WMShellUnitTests:CompatUIControllerTest

Change-Id: I41ca2f92e566b39e41d0fdd8ff4d449d486add88
parent 2e4ab661
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import android.view.InsetsState;
import android.view.accessibility.AccessibilityManager;

import com.android.internal.annotations.VisibleForTesting;
import com.android.window.flags.Flags;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.common.DisplayController;
import com.android.wm.shell.common.DisplayController.OnDisplaysChangedListener;
@@ -67,6 +68,7 @@ import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.IntPredicate;
import java.util.function.Predicate;

/**
@@ -189,6 +191,9 @@ public class CompatUIController implements OnDisplaysChangedListener,
    @NonNull
    private final CompatUIStatusManager mCompatUIStatusManager;

    @NonNull
    private final IntPredicate mInDesktopModePredicate;

    public CompatUIController(@NonNull Context context,
            @NonNull ShellInit shellInit,
            @NonNull ShellController shellController,
@@ -202,7 +207,8 @@ public class CompatUIController implements OnDisplaysChangedListener,
            @NonNull CompatUIConfiguration compatUIConfiguration,
            @NonNull CompatUIShellCommandHandler compatUIShellCommandHandler,
            @NonNull AccessibilityManager accessibilityManager,
            @NonNull CompatUIStatusManager compatUIStatusManager) {
            @NonNull CompatUIStatusManager compatUIStatusManager,
            @NonNull IntPredicate isDesktopModeEnablePredicate) {
        mContext = context;
        mShellController = shellController;
        mDisplayController = displayController;
@@ -218,6 +224,7 @@ public class CompatUIController implements OnDisplaysChangedListener,
        mDisappearTimeSupplier = flags -> accessibilityManager.getRecommendedTimeoutMillis(
                DISAPPEAR_DELAY_MS, flags);
        mCompatUIStatusManager = compatUIStatusManager;
        mInDesktopModePredicate = isDesktopModeEnablePredicate;
        shellInit.addInitCallback(this::onInit, this);
    }

@@ -251,7 +258,9 @@ public class CompatUIController implements OnDisplaysChangedListener,
            updateActiveTaskInfo(taskInfo);
        }

        if (taskInfo.configuration == null || taskListener == null) {
        // We close all the Compat UI educations in case we're in desktop mode.
        if (taskInfo.configuration == null || taskListener == null
                || isInDesktopMode(taskInfo.displayId)) {
            // Null token means the current foreground activity is not in compatibility mode.
            removeLayouts(taskInfo.taskId);
            return;
@@ -350,7 +359,6 @@ public class CompatUIController implements OnDisplaysChangedListener,
        mOnInsetsChangedListeners.remove(displayId);
    }


    @Override
    public void onDisplayConfigurationChanged(int displayId, Configuration newConfig) {
        updateDisplayLayout(displayId);
@@ -692,7 +700,8 @@ public class CompatUIController implements OnDisplaysChangedListener,
        mContext.startActivityAsUser(intent, userHandle);
    }

    private void removeLayouts(int taskId) {
    @VisibleForTesting
    void removeLayouts(int taskId) {
        final CompatUIWindowManager compatLayout = mActiveCompatLayouts.get(taskId);
        if (compatLayout != null) {
            compatLayout.release();
@@ -825,4 +834,9 @@ public class CompatUIController implements OnDisplaysChangedListener,
        boolean mHasShownCameraCompatHint;
        boolean mHasShownUserAspectRatioSettingsButtonHint;
    }

    private boolean isInDesktopMode(int displayId) {
        return Flags.skipCompatUiEducationInDesktopMode()
                && mInDesktopModePredicate.test(displayId);
    }
}
+8 −1
Original line number Diff line number Diff line
@@ -137,6 +137,7 @@ import dagger.Module;
import dagger.Provides;

import java.util.Optional;
import java.util.function.IntPredicate;

/**
 * Provides basic dependencies from {@link com.android.wm.shell}, these dependencies are only
@@ -261,6 +262,7 @@ public abstract class WMShellBaseModule {
            Lazy<CompatUIShellCommandHandler> compatUIShellCommandHandler,
            Lazy<AccessibilityManager> accessibilityManager,
            CompatUIRepository compatUIRepository,
            Optional<DesktopModeTaskRepository> desktopModeTaskRepository,
            @NonNull CompatUIState compatUIState,
            @NonNull CompatUIComponentIdGenerator componentIdGenerator,
            @NonNull CompatUIComponentFactory compatUIComponentFactory,
@@ -273,6 +275,10 @@ public abstract class WMShellBaseModule {
                    new DefaultCompatUIHandler(compatUIRepository, compatUIState,
                            componentIdGenerator, compatUIComponentFactory, mainExecutor));
        }
        final IntPredicate inDesktopModePredicate =
                desktopModeTaskRepository.<IntPredicate>map(modeTaskRepository -> displayId ->
                        modeTaskRepository.getVisibleTaskCount(displayId) > 0)
                            .orElseGet(() -> displayId -> false);
        return Optional.of(
                new CompatUIController(
                        context,
@@ -288,7 +294,8 @@ public abstract class WMShellBaseModule {
                        compatUIConfiguration.get(),
                        compatUIShellCommandHandler.get(),
                        accessibilityManager.get(),
                        compatUIStatusManager));
                        compatUIStatusManager,
                        inDesktopModePredicate));
    }

    @WMSingleton
+38 −2
Original line number Diff line number Diff line
@@ -35,9 +35,12 @@ import android.app.ActivityManager.RunningTaskInfo;
import android.app.TaskInfo;
import android.content.Context;
import android.content.res.Configuration;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import android.platform.test.flag.junit.SetFlagsRule;
import android.testing.AndroidTestingRunner;
import android.view.InsetsSource;
import android.view.InsetsState;
@@ -90,6 +93,9 @@ public class CompatUIControllerTest extends ShellTestCase {
    public final CheckFlagsRule mCheckFlagsRule =
            DeviceFlagsValueProvider.createCheckFlagsRule();

    @Rule
    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();

    private CompatUIController mController;
    private ShellInit mShellInit;
    @Mock
@@ -122,7 +128,6 @@ public class CompatUIControllerTest extends ShellTestCase {
    private CompatUIConfiguration mCompatUIConfiguration;
    @Mock
    private CompatUIShellCommandHandler mCompatUIShellCommandHandler;

    @Mock
    private AccessibilityManager mAccessibilityManager;

@@ -132,6 +137,8 @@ public class CompatUIControllerTest extends ShellTestCase {
    @NonNull
    private CompatUIStatusManager mCompatUIStatusManager;

    private boolean mInDesktopModePredicateResult;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
@@ -157,7 +164,7 @@ public class CompatUIControllerTest extends ShellTestCase {
                mMockDisplayController, mMockDisplayInsetsController, mMockImeController,
                mMockSyncQueue, mMockExecutor, mMockTransitionsLazy, mDockStateReader,
                mCompatUIConfiguration, mCompatUIShellCommandHandler, mAccessibilityManager,
                mCompatUIStatusManager) {
                mCompatUIStatusManager, i -> mInDesktopModePredicateResult) {
            @Override
            CompatUIWindowManager createCompatUiWindowManager(Context context, TaskInfo taskInfo,
                    ShellTaskOrganizer.TaskListener taskListener) {
@@ -685,6 +692,7 @@ public class CompatUIControllerTest extends ShellTestCase {
    }

    @Test
    @RequiresFlagsDisabled(Flags.FLAG_APP_COMPAT_UI_FRAMEWORK)
    public void testLetterboxEduLayout_notCreatedWhenLetterboxEducationIsDisabled() {
        TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, /* hasSizeCompat= */ true);
        taskInfo.appCompatTaskInfo.setLetterboxEducationEnabled(false);
@@ -695,6 +703,34 @@ public class CompatUIControllerTest extends ShellTestCase {
                eq(mMockTaskListener));
    }

    @Test
    @RequiresFlagsDisabled(Flags.FLAG_APP_COMPAT_UI_FRAMEWORK)
    @EnableFlags(Flags.FLAG_SKIP_COMPAT_UI_EDUCATION_IN_DESKTOP_MODE)
    public void testUpdateActiveTaskInfo_removeAllComponentWhenInDesktopModeFlagEnabled() {
        mInDesktopModePredicateResult = false;
        TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, /* hasSizeCompat= */ true);
        mController.onCompatInfoChanged(new CompatUIInfo(taskInfo, mMockTaskListener));
        verify(mController, never()).removeLayouts(taskInfo.taskId);

        mInDesktopModePredicateResult = true;
        mController.onCompatInfoChanged(new CompatUIInfo(taskInfo, mMockTaskListener));
        verify(mController).removeLayouts(taskInfo.taskId);
    }

    @Test
    @RequiresFlagsDisabled(Flags.FLAG_APP_COMPAT_UI_FRAMEWORK)
    @DisableFlags(Flags.FLAG_SKIP_COMPAT_UI_EDUCATION_IN_DESKTOP_MODE)
    public void testUpdateActiveTaskInfo_removeAllComponentWhenInDesktopModeFlagDisabled() {
        mInDesktopModePredicateResult = false;
        TaskInfo taskInfo = createTaskInfo(DISPLAY_ID, TASK_ID, /* hasSizeCompat= */ true);
        mController.onCompatInfoChanged(new CompatUIInfo(taskInfo, mMockTaskListener));
        verify(mController, never()).removeLayouts(taskInfo.taskId);

        mInDesktopModePredicateResult = true;
        mController.onCompatInfoChanged(new CompatUIInfo(taskInfo, mMockTaskListener));
        verify(mController, never()).removeLayouts(taskInfo.taskId);
    }

    private static TaskInfo createTaskInfo(int displayId, int taskId, boolean hasSizeCompat) {
        return createTaskInfo(displayId, taskId, hasSizeCompat, /* isVisible */ false,
                /* isFocused */ false, /* isTopActivityTransparent */ false);