Merge "Remove assistant tests" into oc-dev
diff --git a/apps/CtsVerifier/AndroidManifest.xml b/apps/CtsVerifier/AndroidManifest.xml
index 545fcdf..ac037b5 100644
--- a/apps/CtsVerifier/AndroidManifest.xml
+++ b/apps/CtsVerifier/AndroidManifest.xml
@@ -1749,15 +1749,6 @@
<meta-data android:name="test_category" android:value="@string/test_category_notifications" />
</activity>
- <activity android:name=".notifications.NotificationAssistantVerifierActivity"
- android:label="@string/nas_test">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.cts.intent.category.MANUAL_TEST" />
- </intent-filter>
- <meta-data android:name="test_category" android:value="@string/test_category_notifications" />
- </activity>
-
<activity android:name=".notifications.ConditionProviderVerifierActivity"
android:label="@string/cp_test">
<intent-filter>
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/notifications/MockAssistant.java b/apps/CtsVerifier/src/com/android/cts/verifier/notifications/MockAssistant.java
deleted file mode 100644
index 5150a26..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/notifications/MockAssistant.java
+++ /dev/null
@@ -1,555 +0,0 @@
-/*
- * Copyright (C) 2016 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.cts.verifier.notifications;
-
-import android.app.Activity;
-import android.app.NotificationChannel;
-import android.app.NotificationManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.service.notification.Adjustment;
-import android.service.notification.NotificationAssistantService;
-import android.service.notification.SnoozeCriterion;
-import android.service.notification.StatusBarNotification;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.util.Pair;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class MockAssistant extends NotificationAssistantService {
- static final String TAG = "MockAssistant";
-
- static final String SERVICE_BASE = "android.service.notification.cts.";
- static final String SERVICE_CHECK = SERVICE_BASE + "SERVICE_CHECK";
- static final String SERVICE_ENQUEUED = SERVICE_BASE + "SERVICE_ENQUEUED";
- static final String SERVICE_POSTED = SERVICE_BASE + "SERVICE_POSTED";
- static final String SERVICE_PAYLOADS = SERVICE_BASE + "SERVICE_PAYLOADS";
- static final String SERVICE_REMOVED = SERVICE_BASE + "SERVICE_REMOVED";
- static final String SERVICE_REMOVED_REASON = SERVICE_BASE + "SERVICE_REMOVED_REASON";
- static final String SERVICE_RESET = SERVICE_BASE + "SERVICE_RESET";
- static final String SERVICE_CLEAR_ONE = SERVICE_BASE + "SERVICE_CLEAR_ONE";
- static final String SERVICE_CLEAR_ALL = SERVICE_BASE + "SERVICE_CLEAR_ALL";
- public static final String SERVICE_ORDER = SERVICE_BASE + "SERVICE_ORDER";
- public static final String SERVICE_DND = SERVICE_BASE + "SERVICE_DND";
- public static final String SERVICE_ADJUSTMENT = SERVICE_BASE + "SERVICE_ADJUSTMENT";
- public static final String SERVICE_CREATE_CHANNEL = SERVICE_BASE + "CREATE_CHANNEL";
- public static final String SERVICE_UPDATE_CHANNEL = SERVICE_BASE + "UPDATE_CHANNEL";
- public static final String SERVICE_DELETE_CHANNEL = SERVICE_BASE + "DELETE_CHANNEL";
- public static final String SERVICE_CHECK_CHANNELS = SERVICE_BASE + "CHECK_CHANNELS";
- public static final String SERVICE_ADJUST_ENQUEUE = SERVICE_BASE + "ADJUST_ENQUEUE";
- public static final String SERVICE_SNOOZE_UNTIL_CONTEXT = SERVICE_BASE + "CONTEXT_SNOOZE";
- public static final String SERVICE_SNOOZED = SERVICE_BASE + "SNOOZED_UNTIL_CONTEXT";
- public static final String SERVICE_UNSNOOZE_ONE = SERVICE_BASE + "SERVICE_UNSNOOZE_ONE";
-
- static final String EXTRA_PAYLOAD = "PAYLOAD";
- static final String EXTRA_INT = "INT";
- static final String EXTRA_TAG = "TAG";
- static final String EXTRA_CODE = "CODE";
- static final String EXTRA_BUNDLE = "BUNDLE";
- static final String EXTRA_PKG = "PKG";
- static final String EXTRA_CHANNEL = "CHANNEL";
-
- static final int RESULT_NO_SERVER = Activity.RESULT_FIRST_USER + 1;
-
- public static final String KEY_FLAGS = "flag";
- public static final String KEY_ICON = "icon";
- public static final String KEY_ID = "id";
- public static final String KEY_PACKAGE = "pkg";
- public static final String KEY_WHEN = "when";
- public static final String KEY_TAG = "tag";
- public static final String KEY_RANK = "rank";
- public static final String KEY_AMBIENT = "ambient";
- public static final String KEY_MATCHES_ZEN_FILTER = "matches_zen_filter";
- public static final String KEY_REASON = "reason";
- public static final String KEY_PEOPLE = "people";
- public static final String KEY_CHANNEL = "channel";
- public static final String KEY_SNOOZE_CRITERIA = "snooze";
-
- private ArrayList<String> mEnqueued = new ArrayList<>();
- private ArrayList<String> mPosted = new ArrayList<>();
- private ArrayMap<String, Bundle> mNotifications = new ArrayMap<>();
- private ArrayMap<String, String> mNotificationKeys = new ArrayMap<>();
- private ArrayList<String> mRemoved = new ArrayList<String>();
- private ArrayMap<String, Bundle> mRemovedReason = new ArrayMap<>();
- private ArrayMap<String, String> mSnoozedUntilContext = new ArrayMap<>();
- private ArrayList<String> mOrder = new ArrayList<>();
- private Set<String> mTestPackages = new HashSet<>();
- private BroadcastReceiver mReceiver;
- private int mDND = -1;
- private boolean adjustEnqueue = false;
-
- @Override
- public void onCreate() {
- super.onCreate();
- Log.d(TAG, "created");
-
- mTestPackages.add("com.android.cts.verifier");
- mTestPackages.add("com.android.cts.robot");
-
- mEnqueued = new ArrayList<String>();
- mPosted = new ArrayList<String>();
- mRemoved = new ArrayList<String>();
- mRemovedReason = new ArrayMap<>();
-
- mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- Log.d(TAG, action);
- if (SERVICE_CHECK.equals(action)) {
- setResultCode(Activity.RESULT_OK);
- } else if (SERVICE_ENQUEUED.equals(action)) {
- Bundle bundle = new Bundle();
- bundle.putStringArrayList(EXTRA_PAYLOAD, mEnqueued);
- setResultExtras(bundle);
- setResultCode(Activity.RESULT_OK);
- } else if (SERVICE_POSTED.equals(action)) {
- Bundle bundle = new Bundle();
- bundle.putStringArrayList(EXTRA_PAYLOAD, mPosted);
- setResultExtras(bundle);
- setResultCode(Activity.RESULT_OK);
- } else if (SERVICE_DND.equals(action)) {
- Bundle bundle = new Bundle();
- bundle.putInt(EXTRA_INT, mDND);
- setResultExtras(bundle);
- setResultCode(Activity.RESULT_OK);
- } else if (SERVICE_ORDER.equals(action)) {
- Bundle bundle = new Bundle();
- bundle.putStringArrayList(EXTRA_PAYLOAD, mOrder);
- setResultExtras(bundle);
- setResultCode(Activity.RESULT_OK);
- } else if (SERVICE_PAYLOADS.equals(action)) {
- Bundle bundle = new Bundle();
- ArrayList<Bundle> payloadData = new ArrayList<>(mNotifications.size());
- for (Bundle notiStats : mNotifications.values()) {
- payloadData.add(notiStats);
- }
- bundle.putParcelableArrayList(EXTRA_PAYLOAD, payloadData);
- setResultExtras(bundle);
- setResultCode(Activity.RESULT_OK);
- } else if (SERVICE_REMOVED.equals(action)) {
- Bundle bundle = new Bundle();
- bundle.putStringArrayList(EXTRA_PAYLOAD, mRemoved);
- setResultExtras(bundle);
- setResultCode(Activity.RESULT_OK);
- } else if (SERVICE_REMOVED_REASON.equals(action)) {
- Bundle bundle = new Bundle();
- ArrayList<Bundle> payloadData = new ArrayList<>(mRemovedReason.size());
- for (Bundle notiStats : mRemovedReason.values()) {
- payloadData.add(notiStats);
- }
- bundle.putParcelableArrayList(EXTRA_PAYLOAD, payloadData);
- setResultExtras(bundle);
- setResultCode(Activity.RESULT_OK);
- } else if (SERVICE_SNOOZED.equals(action)) {
- Bundle bundle = new Bundle();
- ArrayList<Bundle> payloadData = new ArrayList<>(mSnoozedUntilContext.size());
- for (String tag : mSnoozedUntilContext.keySet()) {
- Bundle b = new Bundle();
- b.putString(EXTRA_TAG, tag);
- b.putString(EXTRA_PAYLOAD, mSnoozedUntilContext.get(tag));
- payloadData.add(b);
- }
- bundle.putParcelableArrayList(EXTRA_PAYLOAD, payloadData);
- setResultExtras(bundle);
- setResultCode(Activity.RESULT_OK);
- } else if (SERVICE_CLEAR_ONE.equals(action)) {
- String tag = intent.getStringExtra(EXTRA_TAG);
- String key = mNotificationKeys.get(tag);
- if (key != null) {
- MockAssistant.this.cancelNotification(key);
- } else {
- Log.w(TAG, "Notification does not exist: " + tag);
- }
- } else if (SERVICE_CLEAR_ALL.equals(action)) {
- MockAssistant.this.cancelAllNotifications();
- } else if (SERVICE_RESET.equals(action)) {
- resetData();
- } else if (SERVICE_ADJUSTMENT.equals(action)) {
- String tag = intent.getStringExtra(EXTRA_TAG);
- String key = mNotificationKeys.get(tag);
- Bundle signals = intent.getBundleExtra(EXTRA_BUNDLE);
- Adjustment adjustment = new Adjustment(context.getPackageName(),
- key, signals, "", 0);
- MockAssistant.this.adjustNotification(adjustment);
- } else if (SERVICE_CHECK_CHANNELS.equals(action)) {
- String pkg = intent.getStringExtra(EXTRA_PKG);
- Bundle bundle = new Bundle();
- List<NotificationChannel> channels =
- MockAssistant.this.getNotificationChannels(pkg);
- bundle.putParcelableArrayList(EXTRA_PAYLOAD,
- new ArrayList<NotificationChannel>(channels));
- setResultExtras(bundle);
- setResultCode(Activity.RESULT_OK);
- } else if (SERVICE_CREATE_CHANNEL.equals(action)) {
- String pkg = intent.getStringExtra(EXTRA_PKG);
- NotificationChannel channel = intent.getParcelableExtra(EXTRA_CHANNEL);
- try {
- MockAssistant.this.createNotificationChannel(pkg, channel);
- } catch (Exception e) {
- Log.e(TAG, "creation failed", e);
- }
- } else if (SERVICE_UPDATE_CHANNEL.equals(action)) {
- String pkg = intent.getStringExtra(EXTRA_PKG);
- NotificationChannel channel = intent.getParcelableExtra(EXTRA_CHANNEL);
- MockAssistant.this.updateNotificationChannel(pkg, channel);
- } else if (SERVICE_DELETE_CHANNEL.equals(action)) {
- String pkg = intent.getStringExtra(EXTRA_PKG);
- String id = intent.getStringExtra(EXTRA_TAG);
- MockAssistant.this.deleteNotificationChannel(pkg, id);
- } else if (SERVICE_ADJUST_ENQUEUE.equals(action)) {
- adjustEnqueue = true;
- } else if (SERVICE_SNOOZE_UNTIL_CONTEXT.equals(action)) {
- String tag = intent.getStringExtra(EXTRA_TAG);
- String snoozeCriterionId = intent.getStringExtra(EXTRA_PAYLOAD);
- MockAssistant.this.snoozeNotification(
- mNotificationKeys.get(tag), snoozeCriterionId);
- } else if (SERVICE_UNSNOOZE_ONE.equals(action)) {
- String tag = intent.getStringExtra(EXTRA_TAG);
- String key = mNotificationKeys.get(tag);
- MockAssistant.this.unsnoozeNotification(key);
- } else {
- Log.w(TAG, "unknown action");
- setResultCode(Activity.RESULT_CANCELED);
- }
- }
- };
- IntentFilter filter = new IntentFilter();
- filter.addAction(SERVICE_CHECK);
- filter.addAction(SERVICE_DND);
- filter.addAction(SERVICE_ENQUEUED);
- filter.addAction(SERVICE_POSTED);
- filter.addAction(SERVICE_ORDER);
- filter.addAction(SERVICE_PAYLOADS);
- filter.addAction(SERVICE_REMOVED);
- filter.addAction(SERVICE_REMOVED_REASON);
- filter.addAction(SERVICE_CLEAR_ONE);
- filter.addAction(SERVICE_CLEAR_ALL);
- filter.addAction(SERVICE_RESET);
- filter.addAction(SERVICE_ADJUSTMENT);
- filter.addAction(SERVICE_CHECK_CHANNELS);
- filter.addAction(SERVICE_CREATE_CHANNEL);
- filter.addAction(SERVICE_DELETE_CHANNEL);
- filter.addAction(SERVICE_UPDATE_CHANNEL);
- filter.addAction(SERVICE_ADJUST_ENQUEUE);
- filter.addAction(SERVICE_SNOOZE_UNTIL_CONTEXT);
- filter.addAction(SERVICE_SNOOZED);
- filter.addAction(SERVICE_UNSNOOZE_ONE);
- registerReceiver(mReceiver, filter);
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- unregisterReceiver(mReceiver);
- mReceiver = null;
- Log.d(TAG, "destroyed");
- }
-
- @Override
- public void onListenerConnected() {
- super.onListenerConnected();
- mDND = getCurrentInterruptionFilter();
- Log.d(TAG, "initial value of CurrentInterruptionFilter is " + mDND);
- }
-
- @Override
- public void onInterruptionFilterChanged(int interruptionFilter) {
- super.onInterruptionFilterChanged(interruptionFilter);
- mDND = interruptionFilter;
- Log.d(TAG, "value of CurrentInterruptionFilter changed to " + mDND);
- }
-
- public void resetData() {
- mEnqueued.clear();
- mPosted.clear();
- mNotifications.clear();
- mRemoved.clear();
- mRemovedReason.clear();
- mOrder.clear();
- mSnoozedUntilContext.clear();
- }
-
- @Override
- public void onNotificationRankingUpdate(RankingMap rankingMap) {
- String[] orderedKeys = rankingMap.getOrderedKeys();
- mOrder.clear();
- Ranking rank = new Ranking();
- for( int i = 0; i < orderedKeys.length; i++) {
- String key = orderedKeys[i];
- mOrder.add(key);
- rankingMap.getRanking(key, rank);
- Bundle note = mNotifications.get(key);
- if (note != null) {
- note.putInt(KEY_RANK, rank.getRank());
- note.putBoolean(KEY_AMBIENT, rank.isAmbient());
- note.putBoolean(KEY_MATCHES_ZEN_FILTER, rank.matchesInterruptionFilter());
- note.putParcelable(KEY_CHANNEL, rank.getChannel());
- note.putStringArray(KEY_PEOPLE, rank.getAdditionalPeople() == null ? null
- : rank.getAdditionalPeople().toArray(new String[]{}));
- note.putParcelableArray(KEY_SNOOZE_CRITERIA, rank.getSnoozeCriteria() == null
- ? null
- : rank.getSnoozeCriteria().toArray(new SnoozeCriterion[] {}));
- }
- }
- }
-
- @Override
- public Adjustment onNotificationEnqueued(StatusBarNotification sbn) {
- if (!mTestPackages.contains(sbn.getPackageName())) { return null; }
- Log.d(TAG, "enqueued: " + sbn.getTag());
- mEnqueued.add(sbn.getTag());
-
- if (adjustEnqueue) {
- Map<String, Bundle> adjustments =
- NotificationAssistantVerifierActivity.getAdjustments();
- Bundle signals = adjustments.get(sbn.getNotification().getSortKey());
- Adjustment adjustment = new Adjustment(sbn.getPackageName(),
- sbn.getKey(), signals, "", 0);
- return adjustment;
- }
- return null;
- }
-
- @Override
- public void onNotificationPosted(StatusBarNotification sbn, RankingMap rankingMap) {
- if (!mTestPackages.contains(sbn.getPackageName())) { return; }
- Log.d(TAG, "posted: " + sbn.getTag());
- mPosted.add(sbn.getTag());
- mNotifications.put(sbn.getKey(), packNotification(sbn));
- mNotificationKeys.put(sbn.getTag(), sbn.getKey());
- onNotificationRankingUpdate(rankingMap);
- }
-
- @Override
- public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap) {
- Log.d(TAG, "removed: " + sbn.getTag());
- mRemoved.add(sbn.getTag());
- mNotifications.remove(sbn.getKey());
- mNotificationKeys.remove(sbn.getTag());
- onNotificationRankingUpdate(rankingMap);
- }
-
- @Override
- public void onNotificationRemoved(StatusBarNotification sbn, RankingMap rankingMap,
- int reason) {
- if (!mTestPackages.contains(sbn.getPackageName())) { return; }
- Log.d(TAG, "removed: " + sbn.getTag());
- mRemoved.add(sbn.getTag());
- Bundle removed = new Bundle();
- removed.putString(KEY_TAG, sbn.getTag());
- removed.putInt(KEY_REASON, reason);
-
- mNotifications.remove(sbn.getKey());
- mNotificationKeys.remove(sbn.getTag());
- mRemovedReason.put(sbn.getTag(), removed);
- onNotificationRankingUpdate(rankingMap);
- }
-
- @Override
- public void onNotificationSnoozedUntilContext(StatusBarNotification sbn,
- String snoozeCriteriaId) {
- if (!mTestPackages.contains(sbn.getPackageName())) { return; }
- Log.d(TAG, "snooze until criteria " + sbn.getKey());
- mSnoozedUntilContext.put(sbn.getTag(), snoozeCriteriaId);
- }
-
- private Bundle packNotification(StatusBarNotification sbn) {
- Bundle notification = new Bundle();
- notification.putString(KEY_TAG, sbn.getTag());
- notification.putInt(KEY_ID, sbn.getId());
- notification.putString(KEY_PACKAGE, sbn.getPackageName());
- notification.putLong(KEY_WHEN, sbn.getNotification().when);
- notification.putInt(KEY_ICON, sbn.getNotification().icon);
- notification.putInt(KEY_FLAGS, sbn.getNotification().flags);
- return notification;
- }
-
- public static void resetListenerData(Context context) {
- sendCommand(context, SERVICE_RESET, null, 0);
- }
-
- public static void probeListenerStatus(Context context, StatusCatcher catcher) {
- requestStatus(context, SERVICE_CHECK, catcher);
- }
-
- public static void probeFilter(Context context, IntegerResultCatcher catcher) {
- requestIntegerResult(context, SERVICE_DND, catcher);
- }
-
- public static void probeListenerEnqueued(Context context, StringListResultCatcher catcher) {
- requestStringListResult(context, SERVICE_ENQUEUED, catcher);
- }
-
- public static void probeListenerPosted(Context context, StringListResultCatcher catcher) {
- requestStringListResult(context, SERVICE_POSTED, catcher);
- }
-
- public static void probeListenerPayloads(Context context, BundleListResultCatcher catcher) {
- requestBundleListResult(context, SERVICE_PAYLOADS, catcher);
- }
-
- public static void probeListenerRemoved(Context context, StringListResultCatcher catcher) {
- requestStringListResult(context, SERVICE_REMOVED, catcher);
- }
-
- public static void probeListenerRemovedWithReason(Context context,
- BundleListResultCatcher catcher) {
- requestBundleListResult(context, SERVICE_REMOVED_REASON, catcher);
- }
-
- public static void probeAssistantSnoozeContext(Context context,
- BundleListResultCatcher catcher) {
- requestBundleListResult(context, SERVICE_SNOOZED, catcher);
- }
-
- public static void probeChannels(Context context, String pkg, BundleListResultCatcher catcher) {
- Intent broadcast = new Intent(SERVICE_CHECK_CHANNELS);
- broadcast.putExtra(EXTRA_PKG, pkg);
- context.sendOrderedBroadcast(broadcast, null, catcher, null, RESULT_NO_SERVER, null, null);
- }
-
- public static void adjustEnqueue(Context context) {
- sendCommand(context, SERVICE_ADJUST_ENQUEUE, null, 0);
- }
-
- public static void clearOne(Context context, String tag, int code) {
- sendCommand(context, SERVICE_CLEAR_ONE, tag, code);
- }
-
- public static void clearAll(Context context) {
- sendCommand(context, SERVICE_CLEAR_ALL, null, 0);
- }
-
- public static void createChannel(Context context, String pkg, NotificationChannel channel) {
- Intent broadcast = new Intent(SERVICE_CREATE_CHANNEL);
- broadcast.putExtra(EXTRA_PKG, pkg);
- broadcast.putExtra(EXTRA_CHANNEL, channel);
- context.sendBroadcast(broadcast);
- }
-
- public static void updateChannel(Context context, String pkg, NotificationChannel channel) {
- Intent broadcast = new Intent(SERVICE_UPDATE_CHANNEL);
- broadcast.putExtra(EXTRA_PKG, pkg);
- broadcast.putExtra(EXTRA_CHANNEL, channel);
- context.sendBroadcast(broadcast);
- }
-
- public static void deleteChannel(Context context, String pkg, String id) {
- Intent broadcast = new Intent(SERVICE_DELETE_CHANNEL);
- broadcast.putExtra(EXTRA_PKG, pkg);
- broadcast.putExtra(EXTRA_TAG, id);
- context.sendBroadcast(broadcast);
- }
-
- public static void applyAdjustment(Context context, String tag, Bundle signals) {
- Intent broadcast = new Intent(SERVICE_ADJUSTMENT);
- broadcast.putExtra(EXTRA_TAG, tag);
- broadcast.putExtra(EXTRA_BUNDLE, signals);
- context.sendBroadcast(broadcast);
- }
-
- public static void snoozeUntilContext(Context context, String tag, String id) {
- Intent broadcast = new Intent(SERVICE_SNOOZE_UNTIL_CONTEXT);
- broadcast.putExtra(EXTRA_TAG, tag);
- broadcast.putExtra(EXTRA_PAYLOAD, id);
- context.sendBroadcast(broadcast);
- }
-
- private static void sendCommand(Context context, String action, String tag, int code) {
- Intent broadcast = new Intent(action);
- if (tag != null) {
- broadcast.putExtra(EXTRA_TAG, tag);
- broadcast.putExtra(EXTRA_CODE, code);
- }
- context.sendBroadcast(broadcast);
- }
-
- public static void unsnoozeOne(Context context, String tag) {
- sendCommand(context, SERVICE_UNSNOOZE_ONE, tag, 0);
- }
-
- public abstract static class StatusCatcher extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- accept(Integer.valueOf(getResultCode()));
- }
-
- abstract public void accept(int result);
- }
-
- private static void requestStatus(Context context, String action,
- StatusCatcher catcher) {
- Intent broadcast = new Intent(action);
- context.sendOrderedBroadcast(broadcast, null, catcher, null, RESULT_NO_SERVER, null, null);
- }
-
- public abstract static class IntegerResultCatcher extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- accept(getResultExtras(true).getInt(EXTRA_INT, -1));
- }
-
- abstract public void accept(int result);
- }
-
- private static void requestIntegerResult(Context context, String action,
- IntegerResultCatcher catcher) {
- Intent broadcast = new Intent(action);
- context.sendOrderedBroadcast(broadcast, null, catcher, null, RESULT_NO_SERVER, null, null);
- }
-
- public abstract static class StringListResultCatcher extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- accept(getResultExtras(true).getStringArrayList(EXTRA_PAYLOAD));
- }
-
- abstract public void accept(List<String> result);
- }
-
- private static void requestStringListResult(Context context, String action,
- StringListResultCatcher catcher) {
- Intent broadcast = new Intent(action);
- context.sendOrderedBroadcast(broadcast, null, catcher, null, RESULT_NO_SERVER, null, null);
- }
-
-
- public abstract static class BundleListResultCatcher extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- accept(getResultExtras(true).getParcelableArrayList(EXTRA_PAYLOAD));
- }
-
- abstract public void accept(ArrayList<Parcelable> result);
- }
-
- private static void requestBundleListResult(Context context, String action,
- BundleListResultCatcher catcher) {
- Intent broadcast = new Intent(action);
- context.sendOrderedBroadcast(broadcast, null, catcher, null, RESULT_NO_SERVER, null, null);
- }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/notifications/NotificationAssistantVerifierActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/notifications/NotificationAssistantVerifierActivity.java
deleted file mode 100644
index 191d0f1..0000000
--- a/apps/CtsVerifier/src/com/android/cts/verifier/notifications/NotificationAssistantVerifierActivity.java
+++ /dev/null
@@ -1,1524 +0,0 @@
-/*
- * Copyright (C) 2016 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.cts.verifier.notifications;
-
-import static android.service.notification.NotificationListenerService.REASON_LISTENER_CANCEL;
-
-import static com.android.cts.verifier.notifications.MockAssistant.EXTRA_PAYLOAD;
-import static com.android.cts.verifier.notifications.MockAssistant.EXTRA_TAG;
-import static com.android.cts.verifier.notifications.MockAssistant.KEY_CHANNEL;
-import static com.android.cts.verifier.notifications.MockAssistant.KEY_FLAGS;
-import static com.android.cts.verifier.notifications.MockAssistant.KEY_ICON;
-import static com.android.cts.verifier.notifications.MockAssistant.KEY_ID;
-import static com.android.cts.verifier.notifications.MockAssistant.KEY_PACKAGE;
-import static com.android.cts.verifier.notifications.MockAssistant.KEY_PEOPLE;
-import static com.android.cts.verifier.notifications.MockAssistant.KEY_REASON;
-import static com.android.cts.verifier.notifications.MockAssistant.KEY_SNOOZE_CRITERIA;
-import static com.android.cts.verifier.notifications.MockAssistant.KEY_TAG;
-import static com.android.cts.verifier.notifications.MockAssistant.KEY_WHEN;
-import static com.android.cts.verifier.notifications.MockAssistant.StatusCatcher;
-import static com.android.cts.verifier.notifications.MockAssistant.StringListResultCatcher;
-
-import android.annotation.SuppressLint;
-import android.app.Activity;
-import android.app.Notification;
-import android.app.NotificationChannel;
-import android.app.NotificationManager;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Parcelable;
-import android.provider.Settings;
-import android.provider.Settings.Secure;
-import android.service.notification.Adjustment;
-import android.service.notification.SnoozeCriterion;
-import android.util.ArrayMap;
-import android.util.Log;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.cts.verifier.R;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-
-public class NotificationAssistantVerifierActivity extends InteractiveVerifierActivity
- implements Runnable {
- private static final String TAG = "NoAssistantVerifier";
-
- protected static final String ASSISTANT_PATH = "com.android.cts.verifier/" +
- "com.android.cts.verifier.notifications.MockAssistant";
- private static final String ENABLED_NOTIFICATION_ASSISTANT_SETTING =
- "enabled_notification_assistant";
- private static final String THIS_PKG = "com.android.cts.verifier";
- private static final String OTHER_PKG = "android";
-
- public static final String ORIGINAL_CHANNEL_ID = TAG + ": original";
- public static final String NEW_CHANNEL_ID = TAG + ": new";
-
- private String mTag1;
- private String mTag2;
- private String mTag3;
- private int mIcon1;
- private int mIcon2;
- private int mIcon3;
- private int mId1;
- private int mId2;
- private int mId3;
- private long mWhen1;
- private long mWhen2;
- private long mWhen3;
- private int mFlag1;
- private int mFlag2;
- private int mFlag3;
-
- @Override
- int getTitleResource() {
- return R.string.nas_test;
- }
-
- @Override
- int getInstructionsResource() {
- return R.string.nas_info;
- }
-
- // Test Setup
-
- @Override
- protected List<InteractiveTestCase> createTestItems() {
- List<InteractiveTestCase> tests = new ArrayList<>();
- tests.add(new IsEnabledTest());
- tests.add(new ServiceStartedTest());
- tests.add(new NotificationEnqueuedTest());
- tests.add(new NotificationReceivedTest());
- tests.add(new DataIntactTest());
- tests.add(new DismissOneTest());
- tests.add(new DismissOneWithReasonTest());
- tests.add(new DismissAllTest());
- tests.add(new CreateChannelTest());
- tests.add(new UpdateChannelTest());
- tests.add(new DeleteChannelTest());
- tests.add(new UpdateLiveChannelTest());
- tests.add(new AdjustNotificationTest());
- tests.add(new AdjustEnqueuedNotificationTest());
- tests.add(new SnoozeNotificationUntilContextTest());
- tests.add(new UnsnoozeNotificationTest());
- tests.add(new IsDisabledTest());
- tests.add(new ServiceStoppedTest());
- tests.add(new NotificationNotEnqueuedTest());
- tests.add(new NotificationNotReceivedTest());
- return tests;
- }
-
- @SuppressLint("NewApi")
- private void sendNotifications(String channelId) {
- mTag1 = UUID.randomUUID().toString();
- mTag2 = UUID.randomUUID().toString();
- mTag3 = UUID.randomUUID().toString();
-
- mNm.cancelAll();
-
- mWhen1 = System.currentTimeMillis() + 1;
- mWhen2 = System.currentTimeMillis() + 2;
- mWhen3 = System.currentTimeMillis() + 3;
-
- mIcon1 = R.drawable.ic_stat_alice;
- mIcon2 = R.drawable.ic_stat_bob;
- mIcon3 = R.drawable.ic_stat_charlie;
-
- mId1 = NOTIFICATION_ID + 1;
- mId2 = NOTIFICATION_ID + 2;
- mId3 = NOTIFICATION_ID + 3;
-
- mPackageString = "com.android.cts.verifier";
-
- Notification n1 = new Notification.Builder(mContext, channelId)
- .setContentTitle("One")
- .setSortKey(Adjustment.KEY_CHANNEL_ID)
- .setContentText(mTag1.toString())
- .setPriority(Notification.PRIORITY_LOW)
- .setSmallIcon(mIcon1)
- .setWhen(mWhen1)
- .setDeleteIntent(makeIntent(1, mTag1))
- .setOnlyAlertOnce(true)
- .build();
- mNm.notify(mTag1, mId1, n1);
- mFlag1 = Notification.FLAG_ONLY_ALERT_ONCE;
-
- Notification n2 = new Notification.Builder(mContext, channelId)
- .setContentTitle("Two")
- .setSortKey(Adjustment.KEY_PEOPLE)
- .setContentText(mTag2.toString())
- .setPriority(Notification.PRIORITY_HIGH)
- .setSmallIcon(mIcon2)
- .setWhen(mWhen2)
- .setDeleteIntent(makeIntent(2, mTag2))
- .setAutoCancel(true)
- .build();
- mNm.notify(mTag2, mId2, n2);
- mFlag2 = Notification.FLAG_AUTO_CANCEL;
-
- Notification n3 = new Notification.Builder(mContext, channelId)
- .setContentTitle("Three")
- .setSortKey(Adjustment.KEY_SNOOZE_CRITERIA)
- .setContentText(mTag3.toString())
- .setPriority(Notification.PRIORITY_LOW)
- .setSmallIcon(mIcon3)
- .setWhen(mWhen3)
- .setDeleteIntent(makeIntent(3, mTag3))
- .setAutoCancel(true)
- .setOnlyAlertOnce(true)
- .build();
- mNm.notify(mTag3, mId3, n3);
- mFlag3 = Notification.FLAG_ONLY_ALERT_ONCE | Notification.FLAG_AUTO_CANCEL;
- }
-
- private void createChannels() {
- try {
- NotificationChannel newChannel = new NotificationChannel(
- NEW_CHANNEL_ID, NEW_CHANNEL_ID, NotificationManager.IMPORTANCE_LOW);
- mNm.createNotificationChannel(newChannel);
- } catch (Exception e) {
- Log.e(TAG, "failed to create channel", e);
- }
- try {
- NotificationChannel originalChannel = new NotificationChannel(ORIGINAL_CHANNEL_ID,
- ORIGINAL_CHANNEL_ID, NotificationManager.IMPORTANCE_LOW);
- mNm.createNotificationChannel(originalChannel);
- } catch (Exception e) {
- Log.e(TAG, "failed to create channel", e);
- }
- }
-
- private void deleteChannels() {
- mNm.cancelAll();
- mNm.deleteNotificationChannel(ORIGINAL_CHANNEL_ID);
- mNm.deleteNotificationChannel(NEW_CHANNEL_ID);
- }
-
- // Tests
-
- protected class IsEnabledTest extends InteractiveTestCase {
- @Override
- View inflate(ViewGroup parent) {
- return createSettingsItem(parent, R.string.nas_enable_service);
- }
-
- @Override
- boolean autoStart() {
- return true;
- }
-
- @Override
- void test() {
- mNm.cancelAll();
- Intent settings = new Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS);
- if (settings.resolveActivity(mPackageManager) == null) {
- logFail("no settings activity");
- status = FAIL;
- } else {
- String listeners = Secure.getString(getContentResolver(),
- ENABLED_NOTIFICATION_ASSISTANT_SETTING);
- if (listeners != null && listeners.equals(ASSISTANT_PATH)) {
- status = PASS;
- } else {
- status = WAIT_FOR_USER;
- }
- next();
- }
- }
-
- void tearDown() {
- // wait for the service to start
- delay();
- }
- }
-
- protected class ServiceStartedTest extends InteractiveTestCase {
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nls_service_started);
- }
-
- @Override
- void test() {
- MockAssistant.probeListenerStatus(mContext,
- new MockAssistant.StatusCatcher() {
- @Override
- public void accept(int result) {
- if (result == Activity.RESULT_OK) {
- status = PASS;
- next();
- } else {
- logFail();
- status = RETEST;
- delay();
- }
- }
- });
- delay(); // in case the catcher never returns
- }
-
- @Override
- void tearDown() {
- MockListener.resetListenerData(mContext);
- delay();
- }
- }
-
- private class NotificationEnqueuedTest extends InteractiveTestCase {
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nas_note_enqueued_received);
-
- }
-
- @Override
- void setUp() {
- createChannels();
- sendNotifications(ORIGINAL_CHANNEL_ID);
- status = READY;
- // wait for notifications to move through the system
- delay();
- }
-
- @Override
- void tearDown() {
- deleteChannels();
- }
-
- @Override
- void test() {
- MockAssistant.probeListenerEnqueued(mContext,
- new StringListResultCatcher() {
- @Override
- public void accept(List<String> result) {
- if (result != null && result.size() > 0 && result.contains(mTag1)) {
- status = PASS;
- } else {
- logFail();
- status = FAIL;
- }
- next();
- }
- });
- delay(); // in case the catcher never returns
- }
- }
-
- private class NotificationReceivedTest extends InteractiveTestCase {
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nls_note_received);
- }
-
- @Override
- void setUp() {
- createChannels();
- sendNotifications(ORIGINAL_CHANNEL_ID);
- status = READY;
- // wait for notifications to move through the system
- delay();
- }
-
- @Override
- void tearDown() {
- deleteChannels();
- }
-
- @Override
- void test() {
- MockAssistant.probeListenerPosted(mContext,
- new StringListResultCatcher() {
- @Override
- public void accept(List<String> result) {
- if (result != null && result.size() > 0 && result.contains(mTag1)) {
- status = PASS;
- } else {
- logFail();
- status = FAIL;
- }
- next();
- }
- });
- delay(); // in case the catcher never returns
- }
- }
-
- private class DataIntactTest extends InteractiveTestCase {
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nls_payload_intact);
- }
-
- @Override
- void test() {
- MockAssistant.probeListenerPayloads(mContext,
- new MockAssistant.BundleListResultCatcher() {
- @Override
- public void accept(ArrayList<Parcelable> result) {
- Set<String> found = new HashSet<String>();
- if (result == null || result.size() == 0) {
- status = FAIL;
- return;
- }
- boolean pass = true;
- for (Parcelable payloadData : result) {
- Bundle payload = (Bundle) payloadData;
- pass &= checkEquals(mPackageString,
- payload.getString(KEY_PACKAGE),
- "data integrity test: notification package (%s, %s)");
- String tag = payload.getString(KEY_TAG);
- if (mTag1.equals(tag)) {
- found.add(mTag1);
- pass &= checkEquals(mIcon1, payload.getInt(KEY_ICON),
- "data integrity test: notification icon (%d, %d)");
- pass &= checkFlagSet(mFlag1, payload.getInt(KEY_FLAGS),
- "data integrity test: notification flags (%d, %d)");
- pass &= checkEquals(mId1, payload.getInt(KEY_ID),
- "data integrity test: notification ID (%d, %d)");
- pass &= checkEquals(mWhen1, payload.getLong(KEY_WHEN),
- "data integrity test: notification when (%d, %d)");
- } else if (mTag2.equals(tag)) {
- found.add(mTag2);
- pass &= checkEquals(mIcon2, payload.getInt(KEY_ICON),
- "data integrity test: notification icon (%d, %d)");
- pass &= checkFlagSet(mFlag2, payload.getInt(KEY_FLAGS),
- "data integrity test: notification flags (%d, %d)");
- pass &= checkEquals(mId2, payload.getInt(KEY_ID),
- "data integrity test: notification ID (%d, %d)");
- pass &= checkEquals(mWhen2, payload.getLong(KEY_WHEN),
- "data integrity test: notification when (%d, %d)");
- } else if (mTag3.equals(tag)) {
- found.add(mTag3);
- pass &= checkEquals(mIcon3, payload.getInt(KEY_ICON),
- "data integrity test: notification icon (%d, %d)");
- pass &= checkFlagSet(mFlag3, payload.getInt(KEY_FLAGS),
- "data integrity test: notification flags (%d, %d)");
- pass &= checkEquals(mId3, payload.getInt(KEY_ID),
- "data integrity test: notification ID (%d, %d)");
- pass &= checkEquals(mWhen3, payload.getLong(KEY_WHEN),
- "data integrity test: notification when (%d, %d)");
- } else {
- pass = false;
- logFail("unexpected notification tag: " + tag);
- }
- }
-
- pass &= found.size() == 3;
- status = pass ? PASS : FAIL;
- next();
- }
- });
- delay(); // in case the catcher never returns
- }
-
- @Override
- void tearDown() {
- mNm.cancelAll();
- sleep(1000);
- MockAssistant.resetListenerData(mContext);
- delay();
- }
- }
-
- private class DismissOneTest extends InteractiveTestCase {
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nls_clear_one);
- }
-
- @Override
- void setUp() {
- createChannels();
- sendNotifications(ORIGINAL_CHANNEL_ID);
- status = READY;
- delay();
- }
-
- @Override
- void test() {
- if (status == READY) {
- MockAssistant.clearOne(mContext, mTag1, mId1);
- status = RETEST;
- } else {
- MockAssistant.probeListenerRemoved(mContext,
- new StringListResultCatcher() {
- @Override
- public void accept(List<String> result) {
- if (result != null && result.size() != 0
- && result.contains(mTag1)
- && !result.contains(mTag2)
- && !result.contains(mTag3)) {
- status = PASS;
- } else {
- logFail();
- status = FAIL;
- }
- next();
- }
- });
- }
- delay();
- }
-
- @Override
- void tearDown() {
- deleteChannels();
- sleep(1000);
- MockAssistant.resetListenerData(mContext);
- delay();
- }
- }
-
- private class DismissOneWithReasonTest extends InteractiveTestCase {
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nls_clear_one_reason);
- }
-
- @Override
- void setUp() {
- createChannels();
- sendNotifications(ORIGINAL_CHANNEL_ID);
- status = READY;
- delay();
- }
-
- @Override
- void test() {
- if (status == READY) {
- MockAssistant.clearOne(mContext, mTag2, mId2);
- status = RETEST;
- } else {
- MockAssistant.probeListenerRemovedWithReason(mContext,
- new MockAssistant.BundleListResultCatcher() {
- @Override
- public void accept(ArrayList<Parcelable> result) {
- if (result == null || result.size() == 0) {
- status = FAIL;
- return;
- }
- boolean pass = true;
- for (Parcelable payloadData : result) {
- Bundle payload = (Bundle) payloadData;
- pass &= checkEquals(mTag2,
- payload.getString(KEY_TAG),
- "data dismissal test: notification tag (%s, %s)");
- pass &= checkEquals(REASON_LISTENER_CANCEL,
- payload.getInt(KEY_REASON),
- "data dismissal test: reason (%d, %d)");
- }
- status = pass ? PASS : FAIL;
- next();
- }
- });
- }
- delay();
- }
-
- @Override
- void tearDown() {
- deleteChannels();
- sleep(1000);
- MockAssistant.resetListenerData(mContext);
- delay();
- }
- }
-
- private class DismissAllTest extends InteractiveTestCase {
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nls_clear_all);
- }
-
- @Override
- void setUp() {
- createChannels();
- sendNotifications(ORIGINAL_CHANNEL_ID);
- status = READY;
- delay();
- }
-
- @Override
- void test() {
- if (status == READY) {
- MockAssistant.clearAll(mContext);
- status = RETEST;
- } else {
- MockAssistant.probeListenerRemoved(mContext,
- new StringListResultCatcher() {
- @Override
- public void accept(List<String> result) {
- if (result != null && result.size() != 0
- && result.contains(mTag1)
- && result.contains(mTag2)
- && result.contains(mTag3)) {
- status = PASS;
- } else {
- logFail();
- status = FAIL;
- }
- next();
- }
- });
- }
- delay(); // in case the catcher never returns
- }
-
- @Override
- void tearDown() {
- deleteChannels();
- sleep(1000);
- MockAssistant.resetListenerData(mContext);
- delay();
- }
- }
-
- private class IsDisabledTest extends InteractiveTestCase {
- @Override
- View inflate(ViewGroup parent) {
- return createSettingsItem(parent, R.string.nas_disable_service);
- }
-
- @Override
- boolean autoStart() {
- return true;
- }
-
- @Override
- void test() {
- String listeners = Secure.getString(getContentResolver(),
- ENABLED_NOTIFICATION_ASSISTANT_SETTING);
- if (listeners == null || !listeners.equals(ASSISTANT_PATH)) {
- status = PASS;
- } else {
- status = WAIT_FOR_USER;
- }
- next();
- }
-
- @Override
- void tearDown() {
- MockAssistant.resetListenerData(mContext);
- delay();
- }
- }
-
- private class ServiceStoppedTest extends InteractiveTestCase {
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nls_service_stopped);
- }
-
- @Override
- void test() {
- MockAssistant.probeListenerStatus(mContext,
- new StatusCatcher() {
- @Override
- public void accept(int result) {
- if (result == Activity.RESULT_OK) {
- logFail();
- status = FAIL;
- } else {
- status = PASS;
- }
- next();
- }
- });
- delay(); // in case the catcher never returns
- }
-
- @Override
- void tearDown() {
- // wait for intent to move through the system
- delay();
- }
- }
-
- private class NotificationNotEnqueuedTest extends InteractiveTestCase {
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nas_note_missed_enqueued);
-
- }
-
- @Override
- void setUp() {
- createChannels();
- sendNotifications(ORIGINAL_CHANNEL_ID);
- status = READY;
- delay();
- }
-
- @Override
- void test() {
- MockAssistant.probeListenerEnqueued(mContext,
- new StringListResultCatcher() {
- @Override
- public void accept(List<String> result) {
- if (result == null || result.size() == 0) {
- status = PASS;
- } else {
- logFail();
- status = FAIL;
- }
- next();
- }
- });
- delay(); // in case the catcher never returns
- }
-
- @Override
- void tearDown() {
- deleteChannels();
- sleep(1000);
- MockAssistant.resetListenerData(mContext);
- delay();
- }
- }
-
- private class NotificationNotReceivedTest extends InteractiveTestCase {
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nls_note_missed);
-
- }
-
- @Override
- void setUp() {
- createChannels();
- sendNotifications(ORIGINAL_CHANNEL_ID);
- status = READY;
- delay();
- }
-
- @Override
- void test() {
- MockAssistant.probeListenerPosted(mContext,
- new StringListResultCatcher() {
- @Override
- public void accept(List<String> result) {
- if (result == null || result.size() == 0) {
- status = PASS;
- } else {
- logFail();
- status = FAIL;
- }
- next();
- }
- });
- delay(); // in case the catcher never returns
- }
-
- @Override
- void tearDown() {
- deleteChannels();
- sleep(1000);
- MockAssistant.resetListenerData(mContext);
- delay();
- }
- }
-
- private class AdjustNotificationTest extends InteractiveTestCase {
- private ArrayList<String> people;
- private ArrayList<SnoozeCriterion> snooze;
- private Map<String, Bundle> adjustments;
-
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nas_adjustment_payload_intact);
- }
-
- @Override
- void setUp() {
- createChannels();
- adjustments = getAdjustments();
- snooze = adjustments.get(Adjustment.KEY_SNOOZE_CRITERIA).getParcelableArrayList(
- Adjustment.KEY_SNOOZE_CRITERIA);
- people = adjustments.get(Adjustment.KEY_PEOPLE).getStringArrayList(
- Adjustment.KEY_PEOPLE);
- sendNotifications(ORIGINAL_CHANNEL_ID);
- status = READY;
- delay();
- }
-
- @Override
- void test() {
- if (status == READY) {
- MockAssistant.probeListenerPosted(mContext,
- new StringListResultCatcher() {
- @Override
- public void accept(List<String> result) {
- if (result != null && result.size() > 0 && result.contains(mTag1)) {
- MockAssistant.applyAdjustment(mContext, mTag1,
- adjustments.get(Adjustment.KEY_CHANNEL_ID));
- MockAssistant.applyAdjustment(mContext, mTag2,
- adjustments.get(Adjustment.KEY_PEOPLE));
- MockAssistant.applyAdjustment(mContext, mTag3,
- adjustments.get(Adjustment.KEY_SNOOZE_CRITERIA));
- status = RETEST;
- } else {
- logFail();
- status = FAIL;
- }
- delay(3000);
- }
- });
- } else {
- MockAssistant.probeListenerPayloads(mContext,
- new MockAssistant.BundleListResultCatcher() {
- @Override
- public void accept(ArrayList<Parcelable> result) {
- Set<String> found = new HashSet<>();
- if (result == null || result.size() == 0) {
- status = FAIL;
- return;
- }
- boolean pass = true;
- for (Parcelable payloadData : result) {
- Bundle payload = (Bundle) payloadData;
- pass &= checkEquals(mPackageString,
- payload.getString(KEY_PACKAGE),
- "data integrity test: notification package (%s, %s)");
-
- String tag = payload.getString(KEY_TAG);
- if (mTag1.equals(tag)) {
- found.add(mTag1);
- pass &= checkEquals(NEW_CHANNEL_ID,
- ((NotificationChannel) payload.getParcelable(
- KEY_CHANNEL)).getId(),
- "data integrity test: notification channel ("
- + "%s, %s)");
- pass &= checkEquals(null,
- payload.getStringArray(KEY_PEOPLE),
- "data integrity test, notification people ("
- + "%s, %s)");
- pass &= checkEquals(null,
- payload.getParcelableArray(KEY_SNOOZE_CRITERIA),
- "data integrity test, notification snooze ("
- + "%s, %s)");
- } else if (mTag2.equals(tag)) {
- found.add(mTag2);
- pass &= checkEquals(ORIGINAL_CHANNEL_ID,
- ((NotificationChannel) payload.getParcelable(
- KEY_CHANNEL)).getId(),
- "data integrity test: notification channel ("
- + "%s, %s)");
- pass &= checkEquals(people.toArray(new String[]{}),
- payload.getStringArray(KEY_PEOPLE),
- "data integrity test, notification people ("
- + "%s, %s)");
- pass &= checkEquals(null,
- payload.getParcelableArray(KEY_SNOOZE_CRITERIA),
- "data integrity test, notification snooze ("
- + "%s, %s)");
- } else if (mTag3.equals(tag)) {
- found.add(mTag3);
- pass &= checkEquals(ORIGINAL_CHANNEL_ID,
- ((NotificationChannel) payload.getParcelable(
- KEY_CHANNEL)).getId(),
- "data integrity test: notification channel ("
- + "%s, %s)");
- pass &= checkEquals(null,
- payload.getStringArray(KEY_PEOPLE),
- "data integrity test, notification people ("
- + "%s, %s)");;
- pass &= checkEquals(snooze.toArray(new SnoozeCriterion[]{}),
- payload.getParcelableArray(KEY_SNOOZE_CRITERIA),
- "data integrity test, notification snooze ("
- + "%s, %s)");
- } else {
- pass = false;
- logFail("unexpected notification tag: " + tag);
- }
- }
-
- pass &= found.size() == 3;
- status = pass ? PASS : FAIL;
- next();
- }
- });
- }
- delay(6000); // in case the catcher never returns
- }
-
- @Override
- void tearDown() {
- deleteChannels();
- sleep(1000);
- MockAssistant.resetListenerData(mContext);
- delay();
- }
- }
-
- private class AdjustEnqueuedNotificationTest extends InteractiveTestCase {
- private ArrayList<String> people;
- private ArrayList<SnoozeCriterion> snooze;
- private Map<String, Bundle> adjustments;
-
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nas_adjustment_enqueue_payload_intact);
- }
-
- @Override
- void setUp() {
- MockAssistant.adjustEnqueue(mContext);
- createChannels();
- adjustments = getAdjustments();
- snooze = adjustments.get(Adjustment.KEY_SNOOZE_CRITERIA).getParcelableArrayList(
- Adjustment.KEY_SNOOZE_CRITERIA);
- people = adjustments.get(Adjustment.KEY_PEOPLE).getStringArrayList(
- Adjustment.KEY_PEOPLE);
- sendNotifications(ORIGINAL_CHANNEL_ID);
- status = READY;
- delay();
- }
-
- @Override
- void test() {
- if (status == READY) {
- MockAssistant.probeListenerEnqueued(mContext,
- new StringListResultCatcher() {
- @Override
- public void accept(List<String> result) {
- if (result != null && result.size() > 0 && result.contains(mTag1)) {
- status = RETEST;
- } else {
- logFail();
- status = FAIL;
- }
- next();
- }
- });
- } else {
- MockAssistant.probeListenerPayloads(mContext,
- new MockAssistant.BundleListResultCatcher() {
- @Override
- public void accept(ArrayList<Parcelable> result) {
- Set<String> found = new HashSet<>();
- if (result == null || result.size() == 0) {
- status = FAIL;
- return;
- }
- boolean pass = true;
- for (Parcelable payloadData : result) {
- Bundle payload = (Bundle) payloadData;
- pass &= checkEquals(mPackageString,
- payload.getString(KEY_PACKAGE),
- "data integrity test: notification package (%s, %s)");
-
- String tag = payload.getString(KEY_TAG);
- if (mTag1.equals(tag)) {
- found.add(mTag1);
- pass &= checkEquals(NEW_CHANNEL_ID,
- ((NotificationChannel) payload.getParcelable(
- KEY_CHANNEL)).getId(),
- "data integrity test: notification channel ("
- + "%s, %s)");
- pass &= checkEquals(null,
- payload.getStringArray(KEY_PEOPLE),
- "data integrity test, notification people ("
- + "%s, %s)");
- pass &= checkEquals(null,
- payload.getParcelableArray(KEY_SNOOZE_CRITERIA),
- "data integrity test, notification snooze ("
- + "%s, %s)");
- } else if (mTag2.equals(tag)) {
- found.add(mTag2);
- pass &= checkEquals(ORIGINAL_CHANNEL_ID,
- ((NotificationChannel) payload.getParcelable(
- KEY_CHANNEL)).getId(),
- "data integrity test: notification channel ("
- + "%s, %s)");
- pass &= checkEquals(people.toArray(new String[]{}),
- payload.getStringArray(KEY_PEOPLE),
- "data integrity test, notification people ("
- + "%s, %s)");
- pass &= checkEquals(null,
- payload.getParcelableArray(KEY_SNOOZE_CRITERIA),
- "data integrity test, notification snooze ("
- + "%s, %s)");
- } else if (mTag3.equals(tag)) {
- found.add(mTag3);
- pass &= checkEquals(ORIGINAL_CHANNEL_ID,
- ((NotificationChannel) payload.getParcelable(
- KEY_CHANNEL)).getId(),
- "data integrity test: notification channel ("
- + "%s, %s)");
- pass &= checkEquals(null,
- payload.getStringArray(KEY_PEOPLE),
- "data integrity test, notification people ("
- + "%s, %s)");;
- pass &= checkEquals(snooze.toArray(new SnoozeCriterion[]{}),
- payload.getParcelableArray(KEY_SNOOZE_CRITERIA),
- "data integrity test, notification snooze ("
- + "%s, %s)");
- } else {
- pass = false;
- logFail("unexpected notification tag: " + tag);
- }
- }
-
- pass &= found.size() == 3;
- status = pass ? PASS : FAIL;
- next();
- }
- });
- }
- delay(6000); // in case the catcher never returns
- }
-
- @Override
- void tearDown() {
- deleteChannels();
- sleep(1000);
- MockAssistant.resetListenerData(mContext);
- delay();
- }
- }
-
- public static Map<String, Bundle> getAdjustments() {
- Map<String, Bundle> adjustments = new ArrayMap<>();
- Bundle bundle1 = new Bundle();
- Bundle bundle2 = new Bundle();
- Bundle bundle3 = new Bundle();
- SnoozeCriterion snooze1 = new SnoozeCriterion("id1", "1", "2");
- SnoozeCriterion snooze2 = new SnoozeCriterion("id2", "2", "3");
- String people1 = "people1";
- String people2 = "people2";
- ArrayList<String> people = new ArrayList<>();
- ArrayList<SnoozeCriterion> snooze = new ArrayList<>();
- NotificationChannel newChannel = new NotificationChannel("new", "new",
- NotificationManager.IMPORTANCE_LOW);
-
- bundle1.putString(Adjustment.KEY_CHANNEL_ID, newChannel.getId());
- adjustments.put(Adjustment.KEY_CHANNEL_ID, bundle1);
-
- people.add(people1);
- people.add(people2);
- bundle2.putStringArrayList(Adjustment.KEY_PEOPLE, people);
- adjustments.put(Adjustment.KEY_PEOPLE, bundle2);
-
- snooze.add(snooze1);
- snooze.add(snooze2);
- bundle3.putParcelableArrayList(Adjustment.KEY_SNOOZE_CRITERIA, snooze);
- adjustments.put(Adjustment.KEY_SNOOZE_CRITERIA, bundle3);
- return adjustments;
- }
-
- private class CreateChannelTest extends InteractiveTestCase {
- private NotificationChannel channel = new NotificationChannel(UUID.randomUUID().toString(),
- "new", NotificationManager.IMPORTANCE_LOW);
-
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nas_create_channel);
- }
-
- @Override
- void setUp() {
- MockAssistant.createChannel(mContext, OTHER_PKG, channel);
- status = READY;
- delay();
- }
-
- @Override
- void test() {
- MockAssistant.probeChannels(mContext, OTHER_PKG,
- new MockAssistant.BundleListResultCatcher() {
- @Override
- public void accept(ArrayList<Parcelable> result) {
- if (result == null || result.size() == 0) {
- logFail(result == null ? "no results"
- : String.format("%d results returned", result.size()));
- status = FAIL;
- return;
- }
- boolean pass = false;
- for (Parcelable payloadData : result) {
- NotificationChannel payload = (NotificationChannel) payloadData;
- pass |= compareChannels(payload, channel);
- }
- status = pass ? PASS : FAIL;
- next();
- }
- });
-
- delay(); // in case the catcher never returns
- }
-
- @Override
- void tearDown() {
- MockAssistant.deleteChannel(
- mContext, OTHER_PKG, channel.getId());
- delay();
- }
- }
-
- private class DeleteChannelTest extends InteractiveTestCase {
- private NotificationChannel channel = new NotificationChannel(UUID.randomUUID().toString(),
- "new", NotificationManager.IMPORTANCE_LOW);
-
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nas_delete_channel);
- }
-
- @Override
- void setUp() {
- MockAssistant.createChannel(mContext, OTHER_PKG, channel);
- status = READY;
- delay();
- }
-
- @Override
- void test() {
- if (status == READY) {
- MockAssistant.probeChannels(mContext, OTHER_PKG,
- new MockAssistant.BundleListResultCatcher() {
- @Override
- public void accept(ArrayList<Parcelable> result) {
- if (result == null || result.size() == 0) {
- status = FAIL;
- logFail();
- return;
- }
- boolean pass = false;
- for (Parcelable payloadData : result) {
- NotificationChannel payload = (NotificationChannel) payloadData;
- pass |= compareChannels(channel, payload);
- }
- if (pass) {
- MockAssistant.deleteChannel(
- mContext, OTHER_PKG, channel.getId());
- status = RETEST;
- }
- delay();
- }
- });
- } else if (status == RETEST) {
- MockAssistant.probeChannels(mContext, OTHER_PKG,
- new MockAssistant.BundleListResultCatcher() {
- @Override
- public void accept(ArrayList<Parcelable> result) {
- if (result == null || result.size() <= 1) {
- status = PASS;
- } else {
- boolean fail = false;
- for (Parcelable payloadData : result) {
- NotificationChannel payload =
- (NotificationChannel) payloadData;
- fail |= compareChannels(channel, payload);
- }
- if (fail) {
- logFail();
- status = FAIL;
- } else {
- status = PASS;
- }
- }
- next();
- }
- });
- }
-
- delay(); // in case the catcher never returns
- }
-
- @Override
- void tearDown() {
- MockAssistant.deleteChannel(
- mContext, OTHER_PKG, channel.getId());
- delay();
- }
- }
-
- private class UpdateChannelTest extends InteractiveTestCase {
- private String id = UUID.randomUUID().toString();
- private NotificationChannel channel = new NotificationChannel(id, "new",
- NotificationManager.IMPORTANCE_LOW);
- private NotificationChannel updatedChannel = new NotificationChannel(id, "new",
- NotificationManager.IMPORTANCE_MIN);
-
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nas_update_channel);
- }
-
- @Override
- void setUp() {
- updatedChannel.setVibrationPattern(new long[] {467, 2478, 24738});
- updatedChannel.setSound(new Uri.Builder().appendPath("sound").build(), null);
- updatedChannel.enableLights(true);
- updatedChannel.enableVibration(true);
- updatedChannel.setBypassDnd(true);
- updatedChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
- MockAssistant.createChannel(mContext, OTHER_PKG, channel);
- status = READY;
- delay();
- }
-
- @Override
- void test() {
- if (status == READY) {
- MockAssistant.probeChannels(mContext, OTHER_PKG,
- new MockAssistant.BundleListResultCatcher() {
- @Override
- public void accept(ArrayList<Parcelable> result) {
- if (result == null || result.size() == 0) {
- status = FAIL;
- next();
- return;
- }
- boolean pass = false;
- for (Parcelable payloadData : result) {
- NotificationChannel payload = (NotificationChannel) payloadData;
- pass |= compareChannels(channel, payload);
- }
- if (pass) {
- MockAssistant.updateChannel(
- mContext, OTHER_PKG, updatedChannel);
- status = RETEST;
- } else {
- status = FAIL;
- next();
- }
- }
- });
- } else if (status == RETEST) {
- MockAssistant.probeChannels(mContext, OTHER_PKG,
- new MockAssistant.BundleListResultCatcher() {
- @Override
- public void accept(ArrayList<Parcelable> result) {
- if (result == null || result.size() == 0) {
- status = FAIL;
- next();
- return;
- }
- boolean pass = false;
- for (Parcelable payloadData : result) {
- NotificationChannel payload = (NotificationChannel) payloadData;
- pass |= compareChannels(updatedChannel, payload);
- }
- status = pass ? PASS : FAIL;
- next();
- }
- });
- }
-
- delay(); // in case the catcher never returns
- }
-
- @Override
- void tearDown() {
- MockAssistant.deleteChannel(
- mContext, OTHER_PKG, channel.getId());
- delay();
- }
- }
-
- private class UpdateLiveChannelTest extends InteractiveTestCase {
- private String id = "channelToBlock-" + System.currentTimeMillis();
- private NotificationChannel channel = new NotificationChannel(id, "new",
- NotificationManager.IMPORTANCE_LOW);
-
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nas_block_channel);
- }
-
- @Override
- void setUp() {
- try {
- mNm.createNotificationChannel(channel);
- } catch (Exception e) {
- Log.e(TAG, "failed to create channel", e);
- }
- sendNotifications(channel.getId());
- status = READY;
- delay(6000);
- }
-
- @Override
- void test() {
- if (status == READY) {
- MockAssistant.probeListenerPosted(mContext,
- new StringListResultCatcher() {
- @Override
- public void accept(List<String> result) {
- if (result != null && result.size() > 0 && result.contains(mTag1)) {
- channel.setImportance(NotificationManager.IMPORTANCE_NONE);
- MockAssistant.updateChannel(mContext, THIS_PKG, channel);
- status = RETEST;
- } else {
- logFail();
- status = FAIL;
- }
- delay(3000);
- }
- });
- } else if (status == RETEST) {
- MockAssistant.probeListenerRemoved(mContext,
- new StringListResultCatcher() {
- @Override
- public void accept(List<String> result) {
- if (result != null && result.size() == 3) {
- status = PASS;
- } else {
- logFail();
- status = FAIL;
- }
- next();
- }
- });
- }
- delay(); // in case the catcher never returns
- }
-
- @Override
- void tearDown() {
- MockAssistant.deleteChannel(mContext, THIS_PKG, channel.getId());
- mNm.cancel(mTag1, mId1);
- mNm.cancel(mTag2, mId2);
- mNm.cancel(mTag2, mId3);
- MockAssistant.resetListenerData(mContext);
- delay();
- }
- }
-
- private class SnoozeNotificationUntilContextTest extends InteractiveTestCase {
- String snoozeContextId1 = "hello1";
- String snoozeContextId3 = "hello3";
-
- boolean queryIds = false;
-
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nas_snooze_context);
- }
-
- @Override
- void setUp() {
- createChannels();
- sendNotifications(ORIGINAL_CHANNEL_ID);
- status = READY;
- delay();
- }
-
- @Override
- void test() {
- if (status == READY) {
- MockAssistant.snoozeUntilContext(mContext, mTag1, snoozeContextId1);
- MockAssistant.snoozeUntilContext(mContext, mTag3, snoozeContextId3);
- status = RETEST;
- } else {
- if (queryIds) {
- MockAssistant.probeAssistantSnoozeContext(mContext,
- new MockAssistant.BundleListResultCatcher() {
- @Override
- public void accept(ArrayList<Parcelable> result) {
- boolean foundOne = false;
- boolean foundTwo = false;
- boolean foundThree = false;
- for (Parcelable payloadData : result) {
- Bundle payload = (Bundle) payloadData;
- String tag = payload.getString(EXTRA_TAG);
- String snoozeCriterionId = payload.getString(EXTRA_PAYLOAD);
- if (mTag1.equals(tag)
- && snoozeContextId1.equals(snoozeCriterionId)) {
- foundOne = true;
- }
- if (mTag2.equals(tag)) {
- foundTwo = true;
- }
- if (mTag3.equals(tag)
- && snoozeContextId3.equals(snoozeCriterionId)) {
- foundThree = true;
- }
- }
- if (foundOne && foundThree && !foundTwo) {
- status = PASS;
- } else {
- logFail();
- status = FAIL;
- }
- delay();
- }
- });
- } else {
- MockAssistant.probeListenerRemoved(mContext,
- new StringListResultCatcher() {
- @Override
- public void accept(List<String> result) {
- if (result != null && result.size() != 0
- && result.contains(mTag1)
- && !result.contains(mTag2)
- && result.contains(mTag3)) {
- status = RETEST;
- queryIds = true;
- } else {
- logFail();
- status = FAIL;
- }
- delay();
- }
- });
- }
- }
- delay();
- }
-
- @Override
- void tearDown() {
- mNm.cancel(mTag1, mId1);
- mNm.cancel(mTag2, mId2);
- mNm.cancel(mTag2, mId3);
- deleteChannels();
- MockAssistant.resetListenerData(mContext);
- delay();
- }
- }
-
- private class UnsnoozeNotificationTest extends InteractiveTestCase {
- final static int READY_TO_SNOOZE = 0;
- final static int SNOOZED = 1;
- final static int READY_TO_UNSNOOZE = 2;
- final static int UNSNOOZED = 3;
- int state = -1;
- @Override
- View inflate(ViewGroup parent) {
- return createAutoItem(parent, R.string.nls_unsnooze_one);
- }
-
- @Override
- void setUp() {
- createChannels();
- sendNotifications(ORIGINAL_CHANNEL_ID);
- status = READY;
- delay();
- }
-
- @Override
- void test() {
- status = RETEST;
-
- if (state == READY_TO_SNOOZE) {
- MockAssistant.snoozeUntilContext(mContext, mTag1, "hello");
- state = SNOOZED;
- } else if (state == SNOOZED) {
- MockAssistant.probeListenerRemovedWithReason(mContext,
- new MockAssistant.BundleListResultCatcher() {
- @Override
- public void accept(ArrayList<Parcelable> result) {
- if (result == null || result.size() == 0) {
- status = FAIL;
- return;
- }
- boolean pass = true;
- for (Parcelable payloadData : result) {
- Bundle payload = (Bundle) payloadData;
- pass &= checkEquals(mTag1,
- payload.getString(KEY_TAG),
- "data dismissal test: notification tag (%s, %s)");
- pass &= checkEquals(MockAssistant.REASON_SNOOZED,
- payload.getInt(KEY_REASON),
- "data dismissal test: reason (%d, %d)");
- }
- status = pass ? PASS : FAIL;
- next();
- }
- });
- } else if (state == READY_TO_UNSNOOZE) {
- MockAssistant.unsnoozeOne(mContext, mTag1);
- state = UNSNOOZED;
- } else {
- MockAssistant.probeListenerPosted(mContext,
- new MockAssistant.StringListResultCatcher() {
- @Override
- public void accept(List<String> result) {
- if (result != null && result.size() != 0
- && result.contains(mTag1)) {
- status = PASS;
- } else {
- logFail();
- status = FAIL;
- }
- next();
- }
- });
- }
- }
-
- @Override
- void tearDown() {
- deleteChannels();
- MockAssistant.resetListenerData(mContext);
- delay();
- }
- }
-
- private boolean compareChannels(NotificationChannel expected, NotificationChannel actual) {
- boolean pass = true;
- String msg = "Channel mismatch (%s, %s)";
- if (actual == null || expected == null) {
- logWithStack(String.format("Channel mismatch (%s, %s)", expected, actual));
- return false;
- }
- pass &= checkEquals(expected.getId(), actual.getId(), msg);
- pass &= checkEquals(expected.getName(), actual.getName(), msg);
- pass &= checkEquals(expected.canShowBadge(), actual.canShowBadge(), msg);
- pass &= checkEquals(expected.shouldVibrate(), actual.shouldVibrate(), msg);
- pass &= checkEquals(expected.shouldShowLights(), actual.shouldShowLights(), msg);
- pass &= checkEquals(expected.getImportance(), actual.getImportance(), msg);
- pass &= checkEquals(
- expected.getLockscreenVisibility(), actual.getLockscreenVisibility(), msg);
- pass &= checkEquals(expected.getSound(), actual.getSound(), msg);
- pass &= checkEquals(expected.canBypassDnd(), actual.canBypassDnd(), msg);
- pass &= checkEquals(expected.getVibrationPattern(), actual.getVibrationPattern(), msg);
- pass &= checkEquals(expected.getAudioAttributes(), actual.getAudioAttributes(), msg);
- return pass;
- }
-
- protected View createSettingsItem(ViewGroup parent, int messageId) {
- return createUserItem(parent, R.string.nls_start_settings, messageId);
- }
-
- @Override
- public void launchSettings() {
- startActivity(new Intent(Settings.ACTION_MANAGE_DEFAULT_APPS_SETTINGS));
- }
-
- @Override
- public void actionPressed(View v) {
- Object tag = v.getTag();
- if (tag instanceof Integer) {
- int id = ((Integer) tag).intValue();
- if (id == R.string.nls_start_settings) {
- launchSettings();
- } else if (id == R.string.attention_ready) {
- mCurrentTest.status = READY;
- next();
- }
- }
- }
-}
diff --git a/apps/CtsVerifier/src/com/android/cts/verifier/notifications/NotificationListenerVerifierActivity.java b/apps/CtsVerifier/src/com/android/cts/verifier/notifications/NotificationListenerVerifierActivity.java
index 79295d8..5bad113 100644
--- a/apps/CtsVerifier/src/com/android/cts/verifier/notifications/NotificationListenerVerifierActivity.java
+++ b/apps/CtsVerifier/src/com/android/cts/verifier/notifications/NotificationListenerVerifierActivity.java
@@ -403,7 +403,7 @@
void tearDown() {
mNm.cancelAll();
deleteChannel();
- MockAssistant.resetListenerData(mContext);
+ MockListener.resetListenerData(mContext);
delay();
}
}