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

Commit c3fcf5db authored by Ming-Shin Lu's avatar Ming-Shin Lu
Browse files

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
parent 28b9201e
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -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
    }
}
+10 −0
Original line number Diff line number Diff line
@@ -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 {
+19 −1
Original line number Diff line number Diff line
@@ -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";
    }
}