blob: de2e6bfc8620e4c95f4cdbd04837b89cdd706eee [file] [log] [blame]
/*
* Copyright (C) 2017 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.systemui.statusbar;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.Instrumentation;
import android.app.Notification;
import android.content.Context;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.support.test.InstrumentationRegistry;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.widget.RemoteViews;
import com.android.systemui.R;
import com.android.systemui.statusbar.notification.NotificationInflaterTest;
import com.android.systemui.statusbar.phone.HeadsUpManagerPhone;
import com.android.systemui.statusbar.phone.NotificationGroupManager;
import com.android.systemui.statusbar.policy.HeadsUpManager;
/**
* A helper class to create {@link ExpandableNotificationRow} (for both individual and group
* notifications).
*/
public class NotificationTestHelper {
static final String PKG = "com.android.systemui";
static final int UID = 1000;
private static final String GROUP_KEY = "gruKey";
private final Context mContext;
private final Instrumentation mInstrumentation;
private int mId;
private final NotificationGroupManager mGroupManager = new NotificationGroupManager();
private ExpandableNotificationRow mRow;
private HeadsUpManager mHeadsUpManager;
public NotificationTestHelper(Context context) {
mContext = context;
mInstrumentation = InstrumentationRegistry.getInstrumentation();
mHeadsUpManager = new HeadsUpManagerPhone(mContext, null, mGroupManager, null, null);
}
public ExpandableNotificationRow createRow() throws Exception {
return createRow(PKG, UID);
}
public ExpandableNotificationRow createRow(String pkg, int uid) throws Exception {
return createRow(pkg, uid, false /* isGroupSummary */, null /* groupKey */);
}
public ExpandableNotificationRow createRow(Notification notification) throws Exception {
return generateRow(notification, PKG, UID, false /* isGroupRow */);
}
/**
* Returns an {@link ExpandableNotificationRow} group with the given number of child
* notifications.
*/
public ExpandableNotificationRow createGroup(int numChildren) throws Exception {
ExpandableNotificationRow row = createGroupSummary(GROUP_KEY);
for (int i = 0; i < numChildren; i++) {
ExpandableNotificationRow childRow = createGroupChild(GROUP_KEY);
row.addChildNotification(childRow);
}
return row;
}
/** Returns a group notification with 2 child notifications. */
public ExpandableNotificationRow createGroup() throws Exception {
return createGroup(2);
}
private ExpandableNotificationRow createGroupSummary(String groupkey) throws Exception {
return createRow(PKG, UID, true /* isGroupSummary */, groupkey);
}
private ExpandableNotificationRow createGroupChild(String groupkey) throws Exception {
return createRow(PKG, UID, false /* isGroupSummary */, groupkey);
}
/**
* Creates a notification row with the given details.
*
* @param pkg package used for creating a {@link StatusBarNotification}
* @param uid uid used for creating a {@link StatusBarNotification}
* @param isGroupSummary whether the notification row is a group summary
* @param groupKey the group key for the notification group used across notifications
* @return a row with that's either a standalone notification or a group notification if the
* groupKey is non-null
* @throws Exception
*/
private ExpandableNotificationRow createRow(
String pkg,
int uid,
boolean isGroupSummary,
@Nullable String groupKey)
throws Exception {
Notification publicVersion = new Notification.Builder(mContext).setSmallIcon(
R.drawable.ic_person)
.setCustomContentView(new RemoteViews(mContext.getPackageName(),
R.layout.custom_view_dark))
.build();
Notification.Builder notificationBuilder =
new Notification.Builder(mContext)
.setSmallIcon(R.drawable.ic_person)
.setContentTitle("Title")
.setContentText("Text")
.setPublicVersion(publicVersion);
// Group notification setup
if (isGroupSummary) {
notificationBuilder.setGroupSummary(true);
}
if (!TextUtils.isEmpty(groupKey)) {
notificationBuilder.setGroup(groupKey);
}
return generateRow(notificationBuilder.build(), pkg, uid, !TextUtils.isEmpty(groupKey));
}
private ExpandableNotificationRow generateRow(
Notification notification,
String pkg,
int uid,
boolean isGroupRow)
throws Exception {
LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(
mContext.LAYOUT_INFLATER_SERVICE);
mInstrumentation.runOnMainSync(() ->
mRow = (ExpandableNotificationRow) inflater.inflate(
R.layout.status_bar_notification_row,
null /* root */,
false /* attachToRoot */)
);
ExpandableNotificationRow row = mRow;
row.setGroupManager(mGroupManager);
row.setHeadsUpManager(mHeadsUpManager);
row.setAboveShelfChangedListener(aboveShelf -> {});
UserHandle mUser = UserHandle.of(ActivityManager.getCurrentUser());
StatusBarNotification sbn = new StatusBarNotification(
pkg,
pkg,
mId++,
null /* tag */,
uid,
2000 /* initialPid */,
notification,
mUser,
null /* overrideGroupKey */,
System.currentTimeMillis());
NotificationData.Entry entry = new NotificationData.Entry(sbn);
entry.row = row;
entry.createIcons(mContext, sbn);
NotificationInflaterTest.runThenWaitForInflation(
() -> row.updateNotification(entry),
row.getNotificationInflater());
// This would be done as part of onAsyncInflationFinished, but we skip large amounts of
// the callback chain, so we need to make up for not adding it to the group manager
// here.
mGroupManager.onEntryAdded(entry);
return row;
}
}