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

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

Merge "[3/n] Integrate CompatUIStatusManager" into main

parents 4ac43d40 8ff268e0
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -186,6 +186,9 @@ public class CompatUIController implements OnDisplaysChangedListener,
     */
    private boolean mIsFirstReachabilityEducationRunning;

    @NonNull
    private final CompatUIStatusManager mCompatUIStatusManager;

    public CompatUIController(@NonNull Context context,
            @NonNull ShellInit shellInit,
            @NonNull ShellController shellController,
@@ -198,7 +201,8 @@ public class CompatUIController implements OnDisplaysChangedListener,
            @NonNull DockStateReader dockStateReader,
            @NonNull CompatUIConfiguration compatUIConfiguration,
            @NonNull CompatUIShellCommandHandler compatUIShellCommandHandler,
            @NonNull AccessibilityManager accessibilityManager) {
            @NonNull AccessibilityManager accessibilityManager,
            @NonNull CompatUIStatusManager compatUIStatusManager) {
        mContext = context;
        mShellController = shellController;
        mDisplayController = displayController;
@@ -213,6 +217,7 @@ public class CompatUIController implements OnDisplaysChangedListener,
        mCompatUIShellCommandHandler = compatUIShellCommandHandler;
        mDisappearTimeSupplier = flags -> accessibilityManager.getRecommendedTimeoutMillis(
                DISAPPEAR_DELAY_MS, flags);
        mCompatUIStatusManager = compatUIStatusManager;
        shellInit.addInitCallback(this::onInit, this);
    }

@@ -520,7 +525,7 @@ public class CompatUIController implements OnDisplaysChangedListener,
                mSyncQueue, taskListener, mDisplayController.getDisplayLayout(taskInfo.displayId),
                mTransitionsLazy.get(),
                stateInfo -> createOrUpdateReachabilityEduLayout(stateInfo.first, stateInfo.second),
                mDockStateReader, mCompatUIConfiguration);
                mDockStateReader, mCompatUIConfiguration, mCompatUIStatusManager);
    }

    private void createOrUpdateRestartDialogLayout(@NonNull TaskInfo taskInfo,
+12 −4
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.wm.shell.compatui;
import static android.provider.Settings.Secure.LAUNCHER_TASKBAR_EDUCATION_SHOWING;
import static android.window.TaskConstants.TASK_CHILD_LAYER_COMPAT_UI;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.TaskInfo;
import android.content.Context;
@@ -76,15 +77,19 @@ class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract {

    private final DockStateReader mDockStateReader;

    @NonNull
    private final CompatUIStatusManager mCompatUIStatusManager;

    LetterboxEduWindowManager(Context context, TaskInfo taskInfo,
            SyncTransactionQueue syncQueue, ShellTaskOrganizer.TaskListener taskListener,
            DisplayLayout displayLayout, Transitions transitions,
            Consumer<Pair<TaskInfo, ShellTaskOrganizer.TaskListener>> onDismissCallback,
            DockStateReader dockStateReader, CompatUIConfiguration compatUIConfiguration) {
            DockStateReader dockStateReader, CompatUIConfiguration compatUIConfiguration,
            @NonNull CompatUIStatusManager compatUIStatusManager) {
        this(context, taskInfo, syncQueue, taskListener, displayLayout, transitions,
                onDismissCallback,
                new DialogAnimationController<>(context, /* tag */ "LetterboxEduWindowManager"),
                dockStateReader, compatUIConfiguration);
                dockStateReader, compatUIConfiguration, compatUIStatusManager);
    }

    @VisibleForTesting
@@ -93,7 +98,8 @@ class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract {
            DisplayLayout displayLayout, Transitions transitions,
            Consumer<Pair<TaskInfo, ShellTaskOrganizer.TaskListener>> onDismissCallback,
            DialogAnimationController<LetterboxEduDialogLayout> animationController,
            DockStateReader dockStateReader, CompatUIConfiguration compatUIConfiguration) {
            DockStateReader dockStateReader, CompatUIConfiguration compatUIConfiguration,
            @NonNull CompatUIStatusManager compatUIStatusManager) {
        super(context, taskInfo, syncQueue, taskListener, displayLayout);
        mTransitions = transitions;
        mOnDismissCallback = onDismissCallback;
@@ -103,6 +109,7 @@ class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract {
                R.dimen.letterbox_education_dialog_margin);
        mDockStateReader = dockStateReader;
        mCompatUIConfiguration = compatUIConfiguration;
        mCompatUIStatusManager = compatUIStatusManager;
        mEligibleForLetterboxEducation =
                taskInfo.appCompatTaskInfo.eligibleForLetterboxEducation();
    }
@@ -139,7 +146,7 @@ class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract {
    protected View createLayout() {
        mLayout = inflateLayout();
        updateDialogMargins();

        mCompatUIStatusManager.onEducationShown();
        // startEnterAnimation will be called immediately if shell-transitions are disabled.
        mTransitions.runOnIdle(this::startEnterAnimation);
        return mLayout;
@@ -199,6 +206,7 @@ class LetterboxEduWindowManager extends CompatUIWindowManagerAbstract {
    @Override
    public void release() {
        mAnimationController.cancelAnimation();
        mCompatUIStatusManager.onEducationHidden();
        super.release();
    }

+23 −2
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.wm.shell.dagger;

import static android.provider.Settings.Secure.COMPAT_UI_EDUCATION_SHOWING;

import static com.android.wm.shell.compatui.CompatUIStatusManager.COMPAT_UI_EDUCATION_HIDDEN;
import static com.android.wm.shell.onehanded.OneHandedController.SUPPORT_ONE_HANDED_MODE;

import android.annotation.NonNull;
@@ -24,6 +27,7 @@ import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.SystemProperties;
import android.provider.Settings;
import android.view.IWindowManager;
import android.view.accessibility.AccessibilityManager;
import android.window.SystemPerformanceHinter;
@@ -72,6 +76,7 @@ import com.android.wm.shell.common.pip.SizeSpecSource;
import com.android.wm.shell.compatui.CompatUIConfiguration;
import com.android.wm.shell.compatui.CompatUIController;
import com.android.wm.shell.compatui.CompatUIShellCommandHandler;
import com.android.wm.shell.compatui.CompatUIStatusManager;
import com.android.wm.shell.compatui.api.CompatUIComponentIdGenerator;
import com.android.wm.shell.compatui.api.CompatUIHandler;
import com.android.wm.shell.compatui.api.CompatUIRepository;
@@ -254,7 +259,8 @@ public abstract class WMShellBaseModule {
            Lazy<AccessibilityManager> accessibilityManager,
            CompatUIRepository compatUIRepository,
            @NonNull CompatUIState compatUIState,
            @NonNull CompatUIComponentIdGenerator componentIdGenerator) {
            @NonNull CompatUIComponentIdGenerator componentIdGenerator,
            CompatUIStatusManager compatUIStatusManager) {
        if (!context.getResources().getBoolean(R.bool.config_enableCompatUIController)) {
            return Optional.empty();
        }
@@ -276,7 +282,22 @@ public abstract class WMShellBaseModule {
                        dockStateReader.get(),
                        compatUIConfiguration.get(),
                        compatUIShellCommandHandler.get(),
                        accessibilityManager.get()));
                        accessibilityManager.get(),
                        compatUIStatusManager));
    }

    @WMSingleton
    @Provides
    static CompatUIStatusManager provideCompatUIStatusManager(@NonNull Context context) {
        if (Flags.enableCompatUiVisibilityStatus()) {
            return new CompatUIStatusManager(
                    newState -> Settings.Secure.putInt(context.getContentResolver(),
                            COMPAT_UI_EDUCATION_SHOWING, newState),
                    () -> Settings.Secure.getInt(context.getContentResolver(),
                            COMPAT_UI_EDUCATION_SHOWING, COMPAT_UI_EDUCATION_HIDDEN));
        } else {
            return new CompatUIStatusManager();
        }
    }

    @WMSingleton
+7 −1
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import android.view.InsetsSource;
import android.view.InsetsState;
import android.view.accessibility.AccessibilityManager;

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

import com.android.window.flags.Flags;
@@ -128,6 +129,9 @@ public class CompatUIControllerTest extends ShellTestCase {
    @Captor
    ArgumentCaptor<OnInsetsChangedListener> mOnInsetsChangedListenerCaptor;

    @NonNull
    private CompatUIStatusManager mCompatUIStatusManager;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
@@ -147,11 +151,13 @@ public class CompatUIControllerTest extends ShellTestCase {
        doReturn(true).when(mMockRestartDialogLayout).createLayout(anyBoolean());
        doReturn(true).when(mMockRestartDialogLayout).updateCompatInfo(any(), any(), anyBoolean());

        mCompatUIStatusManager = new CompatUIStatusManager();
        mShellInit = spy(new ShellInit(mMockExecutor));
        mController = new CompatUIController(mContext, mShellInit, mMockShellController,
                mMockDisplayController, mMockDisplayInsetsController, mMockImeController,
                mMockSyncQueue, mMockExecutor, mMockTransitionsLazy, mDockStateReader,
                mCompatUIConfiguration, mCompatUIShellCommandHandler, mAccessibilityManager) {
                mCompatUIConfiguration, mCompatUIShellCommandHandler, mAccessibilityManager,
                mCompatUIStatusManager) {
            @Override
            CompatUIWindowManager createCompatUiWindowManager(Context context, TaskInfo taskInfo,
                    ShellTaskOrganizer.TaskListener taskListener) {
+28 −1
Original line number Diff line number Diff line
@@ -20,9 +20,13 @@ import static android.content.res.Configuration.UI_MODE_NIGHT_YES;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.window.flags.Flags.FLAG_APP_COMPAT_UI_FRAMEWORK;
import static com.android.wm.shell.compatui.CompatUIStatusManager.COMPAT_UI_EDUCATION_HIDDEN;
import static com.android.wm.shell.compatui.CompatUIStatusManager.COMPAT_UI_EDUCATION_VISIBLE;

import static com.google.common.truth.Truth.assertThat;

import static junit.framework.Assert.assertEquals;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
@@ -38,6 +42,7 @@ import android.app.ActivityManager;
import android.app.TaskInfo;
import android.graphics.Insets;
import android.graphics.Rect;
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;
@@ -54,6 +59,7 @@ import android.view.accessibility.AccessibilityEvent;

import androidx.test.filters.SmallTest;

import com.android.window.flags.Flags;
import com.android.wm.shell.R;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTestCase;
@@ -61,6 +67,7 @@ import com.android.wm.shell.TestShellExecutor;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.DockStateReader;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.compatui.CompatUIStatusManagerTest.FakeCompatUIStatusManagerTest;
import com.android.wm.shell.transition.Transitions;

import org.junit.After;
@@ -120,6 +127,8 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase {

    private CompatUIConfiguration mCompatUIConfiguration;
    private TestShellExecutor mExecutor;
    private FakeCompatUIStatusManagerTest mCompatUIStatus;
    private CompatUIStatusManager mCompatUIStatusManager;

    @Rule
    public final CheckFlagsRule mCheckFlagsRule =
@@ -129,6 +138,9 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase {
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mExecutor = new TestShellExecutor();
        mCompatUIStatus = new FakeCompatUIStatusManagerTest();
        mCompatUIStatusManager = new CompatUIStatusManager(mCompatUIStatus.mWriter,
                mCompatUIStatus.mReader);
        mCompatUIConfiguration = new CompatUIConfiguration(mContext, mExecutor) {

            final Set<Integer> mHasSeenSet = new HashSet<>();
@@ -414,6 +426,21 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase {
        assertFalse(windowManager.needsToBeRecreated(newTaskInfo, mTaskListener));
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_COMPAT_UI_VISIBILITY_STATUS)
    public void testCompatUIStatus_dialogIsShown() {
        // We display the dialog
        LetterboxEduWindowManager windowManager = createWindowManager(/* eligible= */ true,
                USER_ID_1, /* isTaskbarEduShowing= */ false);
        assertTrue(windowManager.createLayout(/* canShow= */ true));
        assertNotNull(windowManager.mLayout);
        assertEquals(/* expected= */ COMPAT_UI_EDUCATION_VISIBLE, mCompatUIStatus.mCurrentStatus);

        // We dismiss
        windowManager.release();
        assertEquals(/* expected= */ COMPAT_UI_EDUCATION_HIDDEN, mCompatUIStatus.mCurrentStatus);
    }

    private void verifyLayout(LetterboxEduDialogLayout layout, ViewGroup.LayoutParams params,
            int expectedWidth, int expectedHeight, int expectedExtraTopMargin,
            int expectedExtraBottomMargin) {
@@ -464,7 +491,7 @@ public class LetterboxEduWindowManagerTest extends ShellTestCase {
                windowManager = new LetterboxEduWindowManager(mContext,
                createTaskInfo(eligible, userId), mSyncTransactionQueue, mTaskListener,
                createDisplayLayout(), mTransitions, mOnDismissCallback, mAnimationController,
                mDockStateReader, mCompatUIConfiguration);
                mDockStateReader, mCompatUIConfiguration, mCompatUIStatusManager);
        spyOn(windowManager);
        doReturn(mViewHost).when(windowManager).createSurfaceViewHost();
        doReturn(isTaskbarEduShowing).when(windowManager).isTaskbarEduShowing();