Add NotificationTest.

NotificationTest tests IME visibility with inline reply.

Bug: 195468725
Test: atest InputMethodStressTest
Change-Id: I9c96d731ff80ec289cee1b62c081c250545b4a35
This commit is contained in:
Kohsuke Yatoh
2022-02-23 23:37:16 -08:00
parent 861759636b
commit f2f9272e3e

View File

@@ -0,0 +1,140 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.inputmethod.stresstest;
import static android.app.NotificationManager.IMPORTANCE_HIGH;
import static com.google.common.truth.Truth.assertThat;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.RemoteInput;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.Icon;
import android.platform.test.annotations.RootPermissionTest;
import android.provider.Settings;
import android.view.KeyEvent;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.uiautomator.By;
import androidx.test.uiautomator.BySelector;
import androidx.test.uiautomator.UiDevice;
import androidx.test.uiautomator.Until;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.concurrent.TimeUnit;
@RootPermissionTest
@RunWith(AndroidJUnit4.class)
public final class NotificationTest {
private static final long TIMEOUT = TimeUnit.SECONDS.toMillis(10);
private static final String CHANNEL_ID = "TEST_CHANNEL";
private static final String CHANNEL_NAME = "Test channel";
private static final String REPLY_INPUT_KEY = "REPLY_KEY";
private static final String REPLY_INPUT_LABEL = "Test reply label";
private static final String ACTION_REPLY = "com.android.inputmethod.stresstest.ACTION_REPLY";
private static final String REPLY_ACTION_LABEL = "Test reply";
private static final int REPLY_REQUEST_CODE = 1;
private static final String NOTIFICATION_TITLE = "Test notification";
private static final String NOTIFICATION_CONTENT = "Test notification content";
private static final int NOTIFICATION_ID = 2000;
// This is for AOSP System UI for phones. When testing customized System UI, please modify here.
private static final BySelector REPLY_SEND_BUTTON_SELECTOR =
By.res("com.android.systemui", "remote_input_send");
private Context mContext;
private NotificationManager mNotificationManager;
private UiDevice mUiDevice;
@Before
public void setUp() {
mContext = InstrumentationRegistry.getInstrumentation().getContext();
mUiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
mNotificationManager = mContext.getSystemService(NotificationManager.class);
}
@After
public void tearDown() {
mNotificationManager.cancelAll();
}
@Test
public void testDirectReply() {
postMessagingNotification();
mUiDevice.openNotification();
mUiDevice.wait(Until.findObject(By.text(REPLY_ACTION_LABEL)), TIMEOUT).click();
// Verify that IME is visible.
assertThat(mUiDevice.wait(Until.findObject(By.pkg(getImePackage(mContext))), TIMEOUT))
.isNotNull();
// Type something, which enables the Send button, then click the Send button.
mUiDevice.pressKeyCode(KeyEvent.KEYCODE_A);
mUiDevice.pressKeyCode(KeyEvent.KEYCODE_B);
mUiDevice.pressKeyCode(KeyEvent.KEYCODE_C);
mUiDevice.wait(Until.findObject(REPLY_SEND_BUTTON_SELECTOR.enabled(true)), TIMEOUT).click();
// Verify that IME is gone.
assertThat(mUiDevice.wait(Until.gone(By.pkg(getImePackage(mContext))), TIMEOUT)).isTrue();
}
private void postMessagingNotification() {
// Register the channel. It's safe to register the same channel again and again.
NotificationChannel channel =
new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, IMPORTANCE_HIGH);
mNotificationManager.createNotificationChannel(channel);
// Post inline reply notification.
PendingIntent pendingIntent = PendingIntent.getBroadcast(
mContext, REPLY_REQUEST_CODE, new Intent().setAction(ACTION_REPLY),
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE);
RemoteInput remoteInput = new RemoteInput.Builder(REPLY_INPUT_KEY)
.setLabel(REPLY_INPUT_LABEL)
.build();
Icon icon = Icon.createWithResource(mContext, android.R.drawable.ic_menu_edit);
Notification.Action action =
new Notification.Action.Builder(icon, REPLY_ACTION_LABEL, pendingIntent)
.addRemoteInput(remoteInput)
.build();
Notification notification = new Notification.Builder(mContext, CHANNEL_ID)
.setSmallIcon(android.R.drawable.ic_menu_edit)
.setContentTitle(NOTIFICATION_TITLE)
.setContentText(NOTIFICATION_CONTENT)
.addAction(action)
.build();
mNotificationManager.notify(NOTIFICATION_ID, notification);
}
private static String getImePackage(Context context) {
String imeId = Settings.Secure.getString(
context.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD);
ComponentName cn = ComponentName.unflattenFromString(imeId);
assertThat(cn).isNotNull();
return cn.getPackageName();
}
}