Make DialogThemedActivity main window is not focusable

In case the window may become to IME input target when dismissing the
dialog window to mistakly hide the IME when getting the IME insets
control.

Also, add the SystemBars' insets visibility string on the dialog for the
test to easier track and verify the insets visiblity before thetest.

Bug: 227142436
Test: atest LaunchAppShowImeAndDialogThemeAppTest
      --rerun-until-failure 10
Change-Id: I96b17c78d4bd211a930bc0e4a083168e83f8aae9
This commit is contained in:
Ming-Shin Lu
2022-04-26 11:56:39 +08:00
parent 28b9201e18
commit c3fcf5dbc2
3 changed files with 59 additions and 1 deletions

View File

@@ -16,6 +16,10 @@
package com.android.server.wm.flicker.helpers
import android.view.WindowInsets.Type.ime
import android.view.WindowInsets.Type.navigationBars
import android.view.WindowInsets.Type.statusBars
import android.app.Instrumentation
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiDevice
@@ -25,6 +29,8 @@ import com.android.server.wm.traces.common.FlickerComponentName
import com.android.server.wm.traces.parser.toFlickerComponent
import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper
import java.util.regex.Pattern
class ImeAppAutoFocusHelper @JvmOverloads constructor(
instr: Instrumentation,
private val rotation: Int,
@@ -72,6 +78,7 @@ class ImeAppAutoFocusHelper @JvmOverloads constructor(
wmHelper.waitForAppTransitionIdle()
wmHelper.waitForFullScreenApp(
ActivityOptions.DIALOG_THEMED_ACTIVITY_COMPONENT_NAME.toFlickerComponent())
mInstrumentation.waitForIdleSync()
}
fun dismissDialog(wmHelper: WindowManagerStateHelper) {
val dialog = uiDevice.wait(
@@ -83,4 +90,27 @@ class ImeAppAutoFocusHelper @JvmOverloads constructor(
wmHelper.waitForAppTransitionIdle()
}
}
fun getInsetsVisibleFromDialog(type: Int): Boolean {
var insetsVisibilityTextView = uiDevice.wait(
Until.findObject(By.res("android:id/text1")), FIND_TIMEOUT)
if (insetsVisibilityTextView != null) {
var visibility = insetsVisibilityTextView.text.toString()
val matcher = when (type) {
ime() -> {
Pattern.compile("IME\\: (VISIBLE|INVISIBLE)").matcher(visibility)
}
statusBars() -> {
Pattern.compile("StatusBar\\: (VISIBLE|INVISIBLE)").matcher(visibility)
}
navigationBars() -> {
Pattern.compile("NavBar\\: (VISIBLE|INVISIBLE)").matcher(visibility)
}
else -> null
}
if (matcher != null && matcher.find()) {
return matcher.group(1).equals("VISIBLE")
}
}
return false
}
}

View File

@@ -16,6 +16,10 @@
package com.android.server.wm.flicker.ime
import android.view.WindowInsets.Type.ime
import android.view.WindowInsets.Type.navigationBars
import android.view.WindowInsets.Type.statusBars
import android.app.Instrumentation
import android.platform.test.annotations.Presubmit
import android.view.Surface
@@ -35,6 +39,8 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
import org.junit.runners.Parameterized
import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
/**
* Test IME snapshot mechanism won't apply when transitioning from non-IME focused dialog activity.
@@ -56,6 +62,10 @@ class LaunchAppShowImeAndDialogThemeAppTest(private val testSpec: FlickerTestPar
testApp.launchViaIntent(wmHelper)
wmHelper.waitImeShown()
testApp.startDialogThemedActivity(wmHelper)
// Verify IME insets isn't visible on dialog since it's non-IME focusable window
assertFalse(testApp.getInsetsVisibleFromDialog(ime()))
assertTrue(testApp.getInsetsVisibleFromDialog(statusBars()))
assertTrue(testApp.getInsetsVisibleFromDialog(navigationBars()))
}
}
teardown {

View File

@@ -17,11 +17,16 @@
package com.android.server.wm.flicker.testapp;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.WindowInsets.Type.ime;
import static android.view.WindowInsets.Type.navigationBars;
import static android.view.WindowInsets.Type.statusBars;
import static android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;
import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.graphics.Color;
import android.os.Bundle;
import android.view.WindowManager;
@@ -33,9 +38,12 @@ public class DialogThemedActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_simple);
getWindow().addFlags(FLAG_NOT_FOCUSABLE);
getWindow().getDecorView().setBackgroundColor(Color.TRANSPARENT);
TextView textView = new TextView(this);
textView.setText("This is a test dialog");
// Print SystemBars' insets visibility on this window for demonstrating during the test.
textView.setId(android.R.id.text1);
textView.setText("Insets visibility\n\n");
textView.setTextColor(Color.BLACK);
LinearLayout layout = new LinearLayout(this);
layout.setBackgroundColor(Color.GREEN);
@@ -51,7 +59,17 @@ public class DialogThemedActivity extends Activity {
attrs.flags = FLAG_DIM_BEHIND | FLAG_ALT_FOCUSABLE_IM;
dialog.getWindow().getDecorView().setLayoutParams(attrs);
dialog.setCanceledOnTouchOutside(true);
dialog.setOnShowListener(d -> textView.setText(textView.getText()
+ "IME: " + isInsetsVisible(dialog, ime()) + "\n"
+ "StatusBar: " + isInsetsVisible(dialog, statusBars()) + "\n"
+ "NavBar: " + isInsetsVisible(dialog, navigationBars()) + "\n")
);
dialog.show();
dialog.setOnDismissListener((d) -> finish());
}
private String isInsetsVisible(Dialog d, int type) {
return d.getWindow().getDecorView().getRootWindowInsets().isVisible(type) ? "VISIBLE"
: "INVISIBLE";
}
}