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

Commit 60154cca authored by Kazuki Takise's avatar Kazuki Takise
Browse files

Rewrite DisplayCompatTests using robot pattern

Flag: com.android.window.flags.enable_restart_menu_for_connected_displays
Bug: 410959342
Test: AppCompatDisplayCompatTests
Change-Id: Idbb7e360d2945cc781ddede2a54873dc70651722
parent 35d98993
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -76,6 +76,8 @@ class AppCompatActivityRobot {
    private final int mDisplayWidth;
    private final int mDisplayHeight;
    private DisplayContent mDisplayContent;
    // TODO(b/411245034): Refactor to DisplayRobot.
    private DisplayContent mSecondaryDisplayContent;

    @Nullable
    private Consumer<ActivityRecord> mOnPostActivityCreation;
@@ -169,6 +171,11 @@ class AppCompatActivityRobot {
        return mDisplayContent;
    }

    @NonNull
    DisplayContent secondaryDisplayContent() {
        return mSecondaryDisplayContent;
    }

    @NonNull
    ActivityRecord getFromTop(int fromTop) {
        return mActivityStack.getFromTop(fromTop);
@@ -178,6 +185,11 @@ class AppCompatActivityRobot {
        mTaskStack.top().setWindowingMode(windowingMode);
    }

    void moveTaskToSecondaryDisplay() {
        mTaskStack.top().reparent(mSecondaryDisplayContent.getDefaultTaskDisplayArea(),
                true /* onTop */);
    }

    void setTaskDisplayAreaWindowingMode(@WindowingMode int windowingMode) {
        mTaskStack.top().getDisplayArea().setWindowingMode(windowingMode);
    }
@@ -319,6 +331,13 @@ class AppCompatActivityRobot {
        onPostDisplayContentCreation(mDisplayContent);
    }

    void createSecondaryDisplay() {
        mSecondaryDisplayContent =
                new TestDisplayContent.Builder(mAtm, mDisplayWidth, mDisplayHeight).build();

        onPostDisplayContentCreation(mSecondaryDisplayContent);
    }

    void createNewTask() {
        final Task newTask = new WindowTestsBase.TaskBuilder(mSupervisor)
                .setDisplay(mDisplayContent).build();
+80 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -16,56 +16,65 @@

package com.android.server.wm;

import static android.view.Display.DEFAULT_DISPLAY;

import static com.android.window.flags.Flags.FLAG_ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS;

import static junit.framework.Assert.assertFalse;

import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals;

import android.compat.testing.PlatformCompatChangeRule;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.Presubmit;
import android.view.DisplayInfo;

import androidx.annotation.NonNull;
import androidx.test.filters.MediumTest;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.runner.RunWith;

import java.util.function.Consumer;

/**
 * Tests for display related app-compat behavior.
 *
 * Build/Install/Run:
 *  atest WmTests:DisplayCompatTests
 * atest WmTests:AppCompatDisplayCompatTests
 */
@MediumTest
@Presubmit
@RunWith(WindowTestRunner.class)
public class DisplayCompatTests extends WindowTestsBase {

    @Rule
    public TestRule compatChangeRule = new PlatformCompatChangeRule();
public class AppCompatDisplayCompatTests extends WindowTestsBase {

    @EnableFlags(FLAG_ENABLE_RESTART_MENU_FOR_CONNECTED_DISPLAYS)
    @Test
    public void testFixedMiscConfigurationWhenMovingToDisplay() {
        // Create an app on the default display, at which point the restart menu isn't enabled.
        final Task task = createTask(mDefaultDisplay);
        final ActivityRecord activity = createActivityRecord(task);
        assertFalse(task.getTaskInfo().appCompatTaskInfo.isRestartMenuEnabledForDisplayMove());
    public void testRestartMenuVisibility() {
        runTestScenario((robot) -> {
            robot.activity().createSecondaryDisplay();
            robot.activity().createActivityWithComponent();
            robot.checkRestartMenuVisibility(false);

            robot.activity().moveTaskToSecondaryDisplay();
            robot.checkRestartMenuVisibility(true);

        // Move the app to a secondary display, and the restart menu must get enabled.
        final DisplayInfo displayInfo = new DisplayInfo();
        displayInfo.copyFrom(mDisplayInfo);
        displayInfo.displayId = DEFAULT_DISPLAY + 1;
        final DisplayContent secondaryDisplay = createNewDisplay(displayInfo);
        task.reparent(secondaryDisplay.getDefaultTaskDisplayArea(), true);
        assertTrue(task.getTaskInfo().appCompatTaskInfo.isRestartMenuEnabledForDisplayMove());
            robot.activity().applyToTopActivity(ActivityRecord::restartProcessIfVisible);
            robot.checkRestartMenuVisibility(false);
        });
    }

        // Once the app gets restarted, the restart menu must be gone.
        activity.restartProcessIfVisible();
        assertFalse(task.getTaskInfo().appCompatTaskInfo.isRestartMenuEnabledForDisplayMove());
    void runTestScenario(@NonNull Consumer<DisplayCompatRobotTest> consumer) {
        final DisplayCompatRobotTest robot = new DisplayCompatRobotTest(mWm, mAtm, mSupervisor);
        consumer.accept(robot);
    }

    private static class DisplayCompatRobotTest extends AppCompatRobotBase {

        DisplayCompatRobotTest(@NonNull WindowManagerService wm,
                @NonNull ActivityTaskManagerService atm,
                @NonNull ActivityTaskSupervisor supervisor) {
            super(wm, atm, supervisor);
        }

        void checkRestartMenuVisibility(boolean enabled) {
            activity().applyToTopActivity(activity -> assertEquals(enabled,
                    activity.getTask().getTaskInfo().appCompatTaskInfo
                            .isRestartMenuEnabledForDisplayMove()));
        }
    }
}