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

Commit 0711bba4 authored by Tom Natan's avatar Tom Natan Committed by Android (Google) Code Review
Browse files

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

parents 756486d5 dbd64281
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();