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

Fix: 218304113
Test: atest WMShellUnitTests:CompatUIWindowManagerTest
Change-Id: Ie6e0b76b1e0d6744a5f397521ba1da7100b6a1c4
This commit is contained in:
tomnatan
2022-02-17 10:45:05 +00:00
parent b48721f9fc
commit dbd6428150
4 changed files with 39 additions and 40 deletions

View File

@@ -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,

View File

@@ -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) {
// Only show by default for the first time.
if (mHasSizeCompat && !mCompatUIHintsState.mHasShownSizeCompatHint) {
mLayout.setSizeCompatHintVisibility(/* show= */ true);
// Only show by default for the first time.
mShouldShowSizeCompatHint = false;
mCompatUIHintsState.mHasShownSizeCompatHint = true;
}
// Camera control for stretched issues.
mLayout.setCameraControlVisibility(shouldShowCameraControl());
if (shouldShowCameraControl() && mShouldShowCameraCompatHint) {
// Only show by default for the first time.
if (shouldShowCameraControl() && !mCompatUIHintsState.mHasShownCameraCompatHint) {
mLayout.setCameraCompatHintVisibility(/* show= */ true);
// Only show by default for the first time.
mShouldShowCameraCompatHint = false;
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;
}
}

View File

@@ -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);

View File

@@ -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();