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

Commit dbd64281 authored by tomnatan's avatar tomnatan
Browse files

Mark compat UI hints as shown only if they are actually shown

Fix: 218304113
Test: atest WMShellUnitTests:CompatUIWindowManagerTest
Change-Id: Ie6e0b76b1e0d6744a5f397521ba1da7100b6a1c4
parent b48721f9
Loading
Loading
Loading
Loading
+6 −15
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.ShellExecutor;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.common.annotations.ExternalThread;
import com.android.wm.shell.compatui.CompatUIWindowManager.CompatUIHintsState;
import com.android.wm.shell.compatui.letterboxedu.LetterboxEduWindowManager;

import java.lang.ref.WeakReference;
@@ -105,9 +106,8 @@ public class CompatUIController implements OnDisplaysChangedListener,

    private CompatUICallback mCallback;

    // Only show once automatically in the process life.
    private boolean mHasShownSizeCompatHint;
    private boolean mHasShownCameraCompatHint;
    // Only show each hint once automatically in the process life.
    private final CompatUIHintsState mCompatUIHintsState;

    // Indicates if the keyguard is currently occluded, in which case compat UIs shouldn't
    // be shown.
@@ -127,6 +127,7 @@ public class CompatUIController implements OnDisplaysChangedListener,
        mMainExecutor = mainExecutor;
        mDisplayController.addDisplayWindowListener(this);
        mImeController.addPositionProcessor(this);
        mCompatUIHintsState = new CompatUIHintsState();
    }

    /** Returns implementation of {@link CompatUI}. */
@@ -259,19 +260,9 @@ public class CompatUIController implements OnDisplaysChangedListener,
    @VisibleForTesting
    CompatUIWindowManager createCompatUiWindowManager(Context context, TaskInfo taskInfo,
            ShellTaskOrganizer.TaskListener taskListener) {
        final CompatUIWindowManager compatUIWindowManager = new CompatUIWindowManager(context,
        return new CompatUIWindowManager(context,
                taskInfo, mSyncQueue, mCallback, taskListener,
                mDisplayController.getDisplayLayout(taskInfo.displayId), mHasShownSizeCompatHint,
                mHasShownCameraCompatHint);
        // TODO(b/218304113): updates values only if hints are actually shown to the user.
        // Only show hints for the first time.
        if (taskInfo.topActivityInSizeCompat) {
            mHasShownSizeCompatHint = true;
        }
        if (taskInfo.hasCameraCompatControl()) {
            mHasShownCameraCompatHint = true;
        }
        return compatUIWindowManager;
                mDisplayController.getDisplayLayout(taskInfo.displayId), mCompatUIHintsState);
    }

    private void createOrUpdateLetterboxEduLayout(TaskInfo taskInfo,
+20 −12
Original line number Diff line number Diff line
@@ -59,9 +59,7 @@ class CompatUIWindowManager extends CompatUIWindowManagerAbstract {
    int mCameraCompatControlState = CAMERA_COMPAT_CONTROL_HIDDEN;

    @VisibleForTesting
    boolean mShouldShowSizeCompatHint;
    @VisibleForTesting
    boolean mShouldShowCameraCompatHint;
    CompatUIHintsState mCompatUIHintsState;

    @Nullable
    @VisibleForTesting
@@ -70,13 +68,12 @@ class CompatUIWindowManager extends CompatUIWindowManagerAbstract {
    CompatUIWindowManager(Context context, TaskInfo taskInfo,
            SyncTransactionQueue syncQueue, CompatUICallback callback,
            ShellTaskOrganizer.TaskListener taskListener, DisplayLayout displayLayout,
            boolean hasShownSizeCompatHint, boolean hasShownCameraCompatHint) {
            CompatUIHintsState compatUIHintsState) {
        super(context, taskInfo, syncQueue, taskListener, displayLayout);
        mCallback = callback;
        mHasSizeCompat = taskInfo.topActivityInSizeCompat;
        mCameraCompatControlState = taskInfo.cameraCompatControlState;
        mShouldShowSizeCompatHint = !hasShownSizeCompatHint;
        mShouldShowCameraCompatHint = !hasShownCameraCompatHint;
        mCompatUIHintsState = compatUIHintsState;
    }

    @Override
@@ -212,18 +209,18 @@ class CompatUIWindowManager extends CompatUIWindowManagerAbstract {
        }
        // Size Compat mode restart button.
        mLayout.setRestartButtonVisibility(mHasSizeCompat);
        if (mHasSizeCompat && mShouldShowSizeCompatHint) {
            mLayout.setSizeCompatHintVisibility(/* show= */ true);
        // Only show by default for the first time.
            mShouldShowSizeCompatHint = false;
        if (mHasSizeCompat && !mCompatUIHintsState.mHasShownSizeCompatHint) {
            mLayout.setSizeCompatHintVisibility(/* show= */ true);
            mCompatUIHintsState.mHasShownSizeCompatHint = true;
        }

        // Camera control for stretched issues.
        mLayout.setCameraControlVisibility(shouldShowCameraControl());
        if (shouldShowCameraControl() && mShouldShowCameraCompatHint) {
            mLayout.setCameraCompatHintVisibility(/* show= */ true);
        // Only show by default for the first time.
            mShouldShowCameraCompatHint = false;
        if (shouldShowCameraControl() && !mCompatUIHintsState.mHasShownCameraCompatHint) {
            mLayout.setCameraCompatHintVisibility(/* show= */ true);
            mCompatUIHintsState.mHasShownCameraCompatHint = true;
        }
        if (shouldShowCameraControl()) {
            mLayout.updateCameraTreatmentButton(mCameraCompatControlState);
@@ -234,4 +231,15 @@ class CompatUIWindowManager extends CompatUIWindowManagerAbstract {
        return mCameraCompatControlState != CAMERA_COMPAT_CONTROL_HIDDEN
                && mCameraCompatControlState != CAMERA_COMPAT_CONTROL_DISMISSED;
    }

    /**
     * A class holding the state of the compat UI hints, which is shared between all compat UI
     * window managers.
     */
    static class CompatUIHintsState {
        @VisibleForTesting
        boolean mHasShownSizeCompatHint;
        @VisibleForTesting
        boolean mHasShownCameraCompatHint;
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.compatui.CompatUIWindowManager.CompatUIHintsState;

import org.junit.Before;
import org.junit.Test;
@@ -77,8 +78,7 @@ public class CompatUILayoutTest extends ShellTestCase {
        mWindowManager = new CompatUIWindowManager(mContext,
                createTaskInfo(/* hasSizeCompat= */ false, CAMERA_COMPAT_CONTROL_HIDDEN),
                mSyncTransactionQueue, mCallback, mTaskListener,
                new DisplayLayout(), /* hasShownSizeCompatHint= */ false,
                /* hasShownCameraCompatHint= */ false);
                new DisplayLayout(), new CompatUIHintsState());

        mLayout = (CompatUILayout)
                LayoutInflater.from(mContext).inflate(R.layout.compat_ui_layout, null);
+11 −11
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.common.DisplayLayout;
import com.android.wm.shell.common.SyncTransactionQueue;
import com.android.wm.shell.compatui.CompatUIWindowManager.CompatUIHintsState;

import org.junit.Before;
import org.junit.Test;
@@ -85,8 +86,7 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
        mWindowManager = new CompatUIWindowManager(mContext,
                createTaskInfo(/* hasSizeCompat= */ false, CAMERA_COMPAT_CONTROL_HIDDEN),
                mSyncTransactionQueue, mCallback, mTaskListener,
                new DisplayLayout(), /* hasShownSizeCompatHint= */ false,
                /* hasShownCameraCompatHint= */ false);
                new DisplayLayout(), new CompatUIHintsState());

        spyOn(mWindowManager);
        doReturn(mLayout).when(mWindowManager).inflateLayout();
@@ -102,7 +102,7 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
        verify(mWindowManager, never()).inflateLayout();

        // Doesn't create hint popup.
        mWindowManager.mShouldShowSizeCompatHint = false;
        mWindowManager.mCompatUIHintsState.mHasShownSizeCompatHint = true;
        assertTrue(mWindowManager.createLayout(/* canShow= */ true));

        verify(mWindowManager).inflateLayout();
@@ -113,14 +113,14 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
        clearInvocations(mWindowManager);
        clearInvocations(mLayout);
        mWindowManager.release();
        mWindowManager.mShouldShowSizeCompatHint = true;
        mWindowManager.mCompatUIHintsState.mHasShownSizeCompatHint = false;
        assertTrue(mWindowManager.createLayout(/* canShow= */ true));

        verify(mWindowManager).inflateLayout();
        assertNotNull(mLayout);
        verify(mLayout).setRestartButtonVisibility(/* show= */ true);
        verify(mLayout).setSizeCompatHintVisibility(/* show= */ true);
        assertFalse(mWindowManager.mShouldShowSizeCompatHint);
        assertTrue(mWindowManager.mCompatUIHintsState.mHasShownSizeCompatHint);

        // Returns false and doesn't create layout if has Size Compat is false.
        clearInvocations(mWindowManager);
@@ -140,7 +140,7 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
        verify(mWindowManager, never()).inflateLayout();

        // Doesn't create hint popup.
        mWindowManager.mShouldShowCameraCompatHint = false;
        mWindowManager.mCompatUIHintsState.mHasShownCameraCompatHint = true;
        assertTrue(mWindowManager.createLayout(/* canShow= */ true));

        verify(mWindowManager).inflateLayout();
@@ -151,14 +151,14 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
        clearInvocations(mWindowManager);
        clearInvocations(mLayout);
        mWindowManager.release();
        mWindowManager.mShouldShowCameraCompatHint = true;
        mWindowManager.mCompatUIHintsState.mHasShownCameraCompatHint = false;
        assertTrue(mWindowManager.createLayout(/* canShow= */ true));

        verify(mWindowManager).inflateLayout();
        assertNotNull(mLayout);
        verify(mLayout).setCameraControlVisibility(/* show= */ true);
        verify(mLayout).setCameraCompatHintVisibility(/* show= */ true);
        assertFalse(mWindowManager.mShouldShowCameraCompatHint);
        assertTrue(mWindowManager.mCompatUIHintsState.mHasShownCameraCompatHint);

        // Returns false and doesn't create layout if Camera Compat state is hidden
        clearInvocations(mWindowManager);
@@ -411,7 +411,7 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
    public void testOnRestartButtonLongClicked_showHint() {
       // Not create hint popup.
        mWindowManager.mHasSizeCompat = true;
        mWindowManager.mShouldShowSizeCompatHint = false;
        mWindowManager.mCompatUIHintsState.mHasShownSizeCompatHint = true;
        mWindowManager.createLayout(/* canShow= */ true);

        verify(mWindowManager).inflateLayout();
@@ -423,10 +423,10 @@ public class CompatUIWindowManagerTest extends ShellTestCase {
    }

    @Test
    public void testOnCamerControlLongClicked_showHint() {
    public void testOnCameraControlLongClicked_showHint() {
       // Not create hint popup.
        mWindowManager.mCameraCompatControlState = CAMERA_COMPAT_CONTROL_TREATMENT_SUGGESTED;
        mWindowManager.mShouldShowCameraCompatHint = false;
        mWindowManager.mCompatUIHintsState.mHasShownCameraCompatHint = true;
        mWindowManager.createLayout(/* canShow= */ true);

        verify(mWindowManager).inflateLayout();