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

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

Migrate typing logic from UiBench app to UiBenchMicrobenchmark test

With CL[1], we can simply remove the typing logic in
EditTextTypeActivity and also revert CL[2] logic without worrying the
apk signing problem and permission check for injectInputEvent.

[1]: I443f67748dfd3db0deb4cd12ac068975fbebc2c3
[2]: Id3c3490d7ab98a17da4e07d8d62d048c98ff1ec4

Bug: 289210988
Test: atest UiBenchEditTextTypingMicrobenchmark
Test: pts-tradefed run commandAndExit pts-postsubmit-very-long -m PtsUiBench \
   --fastboot-command-preparer:disable  \
   --log-level-display verbose -l VERBOSE \
   --test-arg com.android.tradefed.testtype.AndroidJUnitTest:instrumentation-arg:iterations:=1 \
   --test-arg com.android.tradefed.testtype.AndroidJUnitTest:class:\
   com.android.uibench.microbenchmark.UiBenchEditTextTypingMicrobenchmark#testEditTextTyping

Change-Id: I9a3b6a2a3df101bbd4dba9880944e8b83eb14610
parent a462cc2b
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -24,6 +24,5 @@ android_test {
        "androidx.recyclerview_recyclerview",
        "androidx.leanback_leanback",
    ],
    certificate: "platform",
    test_suites: ["device-tests"],
}
+0 −1
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     package="com.android.test.uibench">
    <uses-permission android:name="android.permission.INJECT_EVENTS" />

    <application android:allowBackup="false"
         android:theme="@style/Theme.AppCompat.Light.DarkActionBar"
+12 −55
Original line number Diff line number Diff line
@@ -15,15 +15,11 @@
 */
package com.android.test.uibench;

import android.app.Instrumentation;
import android.content.Intent;
import android.os.Bundle;
import android.os.Looper;
import android.os.MessageQueue;
import androidx.appcompat.app.AppCompatActivity;
import android.view.KeyEvent;
import android.widget.EditText;

import java.util.concurrent.Semaphore;
import androidx.appcompat.app.AppCompatActivity;

/**
 * Note: currently incomplete, complexity of input continuously grows, instead of looping
@@ -32,7 +28,13 @@ import java.util.concurrent.Semaphore;
 * Simulates typing continuously into an EditText.
 */
public class EditTextTypeActivity extends AppCompatActivity {
    Thread mThread;

    /**
     * Broadcast action: Used to notify UiBenchEditTextTypingMicrobenchmark test when the
     * test activity was paused.
     */
    private static final String ACTION_CANCEL_TYPING_CALLBACK =
            "com.android.uibench.action.CANCEL_TYPING_CALLBACK";

    private static String sSeedText = "";
    static {
@@ -46,9 +48,6 @@ public class EditTextTypeActivity extends AppCompatActivity {
        sSeedText = builder.toString();
    }

    final Object mLock = new Object();
    boolean mShouldStop = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
@@ -56,55 +55,13 @@ public class EditTextTypeActivity extends AppCompatActivity {
        EditText editText = new EditText(this);
        editText.setText(sSeedText);
        setContentView(editText);

        final Instrumentation instrumentation = new Instrumentation();
        final Semaphore sem = new Semaphore(0);
        MessageQueue.IdleHandler handler = new MessageQueue.IdleHandler() {
            @Override
            public boolean queueIdle() {
                // TODO: consider other signaling approaches
                sem.release();
                return true;
            }
        };
        Looper.myQueue().addIdleHandler(handler);
        synchronized (mLock) {
            mShouldStop = false;
        }
        mThread = new Thread(new Runnable() {
            int codes[] = { KeyEvent.KEYCODE_H, KeyEvent.KEYCODE_E, KeyEvent.KEYCODE_L,
                    KeyEvent.KEYCODE_L, KeyEvent.KEYCODE_O, KeyEvent.KEYCODE_SPACE };
            int i = 0;
            @Override
            public void run() {
                while (true) {
                    try {
                        sem.acquire();
                    } catch (InterruptedException e) {
                        // TODO, maybe
                    }
                    int code = codes[i % codes.length];
                    if (i % 100 == 99) code = KeyEvent.KEYCODE_ENTER;

                    synchronized (mLock) {
                        if (mShouldStop) break;
                    }

                    // TODO: bit of a race here, since the event can arrive after pause/stop.
                    // (Can't synchronize on key send, since it's synchronous.)
                    instrumentation.sendKeyDownUpSync(code);
                    i++;
                }
            }
        });
        mThread.start();
    }

    @Override
    protected void onPause() {
        synchronized (mLock) {
            mShouldStop = true;
        }
        // Cancel the typing when the test activity was paused.
        sendBroadcast(new Intent(ACTION_CANCEL_TYPING_CALLBACK).addFlags(
                Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER_REGISTERED_ONLY));
        super.onPause();
    }
}