Launch app unavailable dialog when WP is off

Test: LaunchConversationActivityTest
Bug: 180113387
Change-Id: I35460bd14840ff70654bd15fe65c23f59cb35153
This commit is contained in:
Anna Zappone
2021-04-14 20:14:17 +00:00
parent 8017f4ed5e
commit 6fac9c780a
7 changed files with 240 additions and 199 deletions

View File

@@ -23,18 +23,14 @@ import static com.android.systemui.people.PeopleTileViewHelper.getPersonIconBitm
import static com.android.systemui.people.PeopleTileViewHelper.getSizeInDp;
import android.app.Activity;
import android.app.INotificationManager;
import android.app.people.IPeopleManager;
import android.app.people.PeopleSpaceTile;
import android.content.Context;
import android.content.Intent;
import android.content.pm.LauncherApps;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.Outline;
import android.graphics.drawable.GradientDrawable;
import android.os.Bundle;
import android.os.ServiceManager;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
@@ -43,7 +39,6 @@ import android.widget.LinearLayout;
import com.android.systemui.R;
import com.android.systemui.people.widget.PeopleSpaceWidgetManager;
import com.android.systemui.statusbar.notification.NotificationEntryManager;
import java.util.ArrayList;
import java.util.List;
@@ -56,19 +51,13 @@ public class PeopleSpaceActivity extends Activity {
private static final String TAG = "PeopleSpaceActivity";
private static final boolean DEBUG = PeopleSpaceUtils.DEBUG;
private IPeopleManager mPeopleManager;
private PeopleSpaceWidgetManager mPeopleSpaceWidgetManager;
private INotificationManager mNotificationManager;
private LauncherApps mLauncherApps;
private Context mContext;
private NotificationEntryManager mNotificationEntryManager;
private int mAppWidgetId;
@Inject
public PeopleSpaceActivity(NotificationEntryManager notificationEntryManager,
PeopleSpaceWidgetManager peopleSpaceWidgetManager) {
public PeopleSpaceActivity(PeopleSpaceWidgetManager peopleSpaceWidgetManager) {
super();
mNotificationEntryManager = notificationEntryManager;
mPeopleSpaceWidgetManager = peopleSpaceWidgetManager;
}
@@ -77,11 +66,6 @@ public class PeopleSpaceActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = getApplicationContext();
mNotificationManager = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
mPeopleManager = IPeopleManager.Stub.asInterface(
ServiceManager.getService(Context.PEOPLE_SERVICE));
mLauncherApps = mContext.getSystemService(LauncherApps.class);
mAppWidgetId = getIntent().getIntExtra(EXTRA_APPWIDGET_ID,
INVALID_APPWIDGET_ID);
setResult(RESULT_CANCELED);
@@ -92,10 +76,8 @@ public class PeopleSpaceActivity extends Activity {
List<PeopleSpaceTile> priorityTiles = new ArrayList<>();
List<PeopleSpaceTile> recentTiles = new ArrayList<>();
try {
priorityTiles = PeopleSpaceUtils.getPriorityTiles(mContext, mNotificationManager,
mPeopleManager, mLauncherApps, mNotificationEntryManager);
recentTiles = PeopleSpaceUtils.getRecentTiles(mContext, mNotificationManager,
mPeopleManager, mLauncherApps, mNotificationEntryManager);
priorityTiles = mPeopleSpaceWidgetManager.getPriorityTiles();
recentTiles = mPeopleSpaceWidgetManager.getRecentTiles();
} catch (Exception e) {
Log.e(TAG, "Couldn't retrieve conversations", e);
}

View File

@@ -19,8 +19,6 @@ package com.android.systemui.people;
import static android.app.Notification.CATEGORY_MISSED_CALL;
import static android.app.Notification.EXTRA_MESSAGES;
import android.annotation.NonNull;
import android.app.INotificationManager;
import android.app.Notification;
import android.app.people.ConversationChannel;
import android.app.people.IPeopleManager;
@@ -44,8 +42,8 @@ import android.os.Bundle;
import android.os.Parcelable;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.ContactsContract;
import android.service.notification.ConversationChannelWrapper;
import android.service.notification.StatusBarNotification;
import android.text.TextUtils;
import android.util.Log;
@@ -127,58 +125,6 @@ public class PeopleSpaceUtils {
}
}
/** Returns a list of map entries corresponding to user's priority conversations. */
@NonNull
public static List<PeopleSpaceTile> getPriorityTiles(
Context context, INotificationManager notificationManager, IPeopleManager peopleManager,
LauncherApps launcherApps, NotificationEntryManager notificationEntryManager)
throws Exception {
List<ConversationChannelWrapper> conversations =
notificationManager.getConversations(
false).getList();
// Add priority conversations to tiles list.
Stream<ShortcutInfo> priorityConversations = conversations.stream()
.filter(c -> c.getNotificationChannel() != null
&& c.getNotificationChannel().isImportantConversation())
.map(c -> c.getShortcutInfo());
List<PeopleSpaceTile> priorityTiles = getSortedTiles(peopleManager, launcherApps,
priorityConversations);
priorityTiles = augmentTilesFromVisibleNotifications(
context, priorityTiles, notificationEntryManager);
return priorityTiles;
}
/** Returns a list of map entries corresponding to user's recent conversations. */
@NonNull
public static List<PeopleSpaceTile> getRecentTiles(
Context context, INotificationManager notificationManager, IPeopleManager peopleManager,
LauncherApps launcherApps, NotificationEntryManager notificationEntryManager)
throws Exception {
if (DEBUG) Log.d(TAG, "Add recent conversations");
List<ConversationChannelWrapper> conversations =
notificationManager.getConversations(
false).getList();
Stream<ShortcutInfo> nonPriorityConversations = conversations.stream()
.filter(c -> c.getNotificationChannel() == null
|| !c.getNotificationChannel().isImportantConversation())
.map(c -> c.getShortcutInfo());
List<ConversationChannel> recentConversationsList =
peopleManager.getRecentConversations().getList();
Stream<ShortcutInfo> recentConversations = recentConversationsList
.stream()
.map(c -> c.getShortcutInfo());
Stream<ShortcutInfo> mergedStream = Stream.concat(nonPriorityConversations,
recentConversations);
List<PeopleSpaceTile> recentTiles =
getSortedTiles(peopleManager, launcherApps, mergedStream);
recentTiles = augmentTilesFromVisibleNotifications(
context, recentTiles, notificationEntryManager);
return recentTiles;
}
/** Returns stored widgets for the conversation specified. */
public static Set<String> getStoredWidgetIds(SharedPreferences sp, PeopleTileKey key) {
if (!key.isValid()) {
@@ -255,7 +201,8 @@ public class PeopleSpaceUtils {
return augmentedTile.get(0);
}
static List<PeopleSpaceTile> augmentTilesFromVisibleNotifications(Context context,
/** Adds to {@code tiles} any visible notifications. */
public static List<PeopleSpaceTile> augmentTilesFromVisibleNotifications(Context context,
List<PeopleSpaceTile> tiles, NotificationEntryManager notificationEntryManager) {
if (notificationEntryManager == null) {
Log.w(TAG, "NotificationEntryManager is null");
@@ -356,11 +303,12 @@ public class PeopleSpaceUtils {
}
/** Returns a list sorted by ascending last interaction time from {@code stream}. */
private static List<PeopleSpaceTile> getSortedTiles(IPeopleManager peopleManager,
LauncherApps launcherApps,
public static List<PeopleSpaceTile> getSortedTiles(IPeopleManager peopleManager,
LauncherApps launcherApps, UserManager userManager,
Stream<ShortcutInfo> stream) {
return stream
.filter(Objects::nonNull)
.filter(c -> !userManager.isQuietModeEnabled(c.getUserHandle()))
.map(c -> new PeopleSpaceTile.Builder(c, launcherApps).build())
.filter(c -> shouldKeepConversation(c))
.map(c -> c.toBuilder().setLastInteractionTimestamp(

View File

@@ -23,11 +23,13 @@ import android.content.pm.LauncherApps;
import android.os.Bundle;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.service.notification.NotificationStats;
import android.text.TextUtils;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.UnlaunchableAppActivity;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.logging.UiEventLoggerImpl;
import com.android.internal.statusbar.IStatusBarService;
@@ -48,15 +50,17 @@ public class LaunchConversationActivity extends Activity {
private UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
private NotificationEntryManager mNotificationEntryManager;
private final Optional<BubblesManager> mBubblesManagerOptional;
private final UserManager mUserManager;
private boolean mIsForTesting;
private IStatusBarService mIStatusBarService;
@Inject
public LaunchConversationActivity(NotificationEntryManager notificationEntryManager,
Optional<BubblesManager> bubblesManagerOptional) {
Optional<BubblesManager> bubblesManagerOptional, UserManager userManager) {
super();
mNotificationEntryManager = notificationEntryManager;
mBubblesManagerOptional = bubblesManagerOptional;
mUserManager = userManager;
}
@Override
@@ -80,12 +84,24 @@ public class LaunchConversationActivity extends Activity {
}
mUiEventLogger.log(PeopleSpaceUtils.PeopleSpaceWidgetEvent.PEOPLE_SPACE_WIDGET_CLICKED);
try {
if (mUserManager.isQuietModeEnabled(userHandle)) {
if (DEBUG) Log.d(TAG, "Cannot launch app when quieted");
final Intent dialogIntent =
UnlaunchableAppActivity.createInQuietModeDialogIntent(
userHandle.getIdentifier());
this.getApplicationContext().startActivity(dialogIntent);
finish();
return;
}
NotificationEntry entry = mNotificationEntryManager.getPendingOrActiveNotif(
notificationKey);
if (entry != null && entry.canBubble() && mBubblesManagerOptional.isPresent()) {
if (DEBUG) Log.d(TAG, "Open bubble for conversation");
mBubblesManagerOptional.get().expandStackAndSelectBubble(entry);
// Just opt-out and don't cancel the notification for bubbles.
finish();
return;
}

View File

@@ -31,7 +31,9 @@ import static com.android.systemui.people.PeopleSpaceUtils.getStoredWidgetIds;
import static com.android.systemui.people.PeopleSpaceUtils.updateAppWidgetOptionsAndView;
import static com.android.systemui.people.PeopleSpaceUtils.updateAppWidgetViews;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.INotificationManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.PendingIntent;
@@ -51,7 +53,9 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.preference.PreferenceManager;
import android.service.notification.ConversationChannelWrapper;
import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.util.Log;
@@ -76,6 +80,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Stream;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -96,6 +101,8 @@ public class PeopleSpaceWidgetManager {
private NotificationEntryManager mNotificationEntryManager;
private PackageManager mPackageManager;
private PeopleSpaceWidgetProvider mPeopleSpaceWidgetProvider;
private INotificationManager mINotificationManager;
private UserManager mUserManager;
public UiEventLogger mUiEventLogger = new UiEventLoggerImpl();
@GuardedBy("mLock")
public static Map<PeopleTileKey, PeopleSpaceWidgetProvider.TileConversationListener>
@@ -121,17 +128,21 @@ public class PeopleSpaceWidgetManager {
mNotificationEntryManager = Dependency.get(NotificationEntryManager.class);
mPackageManager = mContext.getPackageManager();
mPeopleSpaceWidgetProvider = new PeopleSpaceWidgetProvider();
mINotificationManager = INotificationManager.Stub.asInterface(
ServiceManager.getService(Context.NOTIFICATION_SERVICE));
mUserManager = context.getSystemService(UserManager.class);
}
/**
* AppWidgetManager setter used for testing.
*/
@VisibleForTesting
protected void setAppWidgetManager(
public void setAppWidgetManager(
AppWidgetManager appWidgetManager, IPeopleManager iPeopleManager,
PeopleManager peopleManager, LauncherApps launcherApps,
NotificationEntryManager notificationEntryManager, PackageManager packageManager,
boolean isForTesting, PeopleSpaceWidgetProvider peopleSpaceWidgetProvider) {
boolean isForTesting, PeopleSpaceWidgetProvider peopleSpaceWidgetProvider,
UserManager userManager, INotificationManager notificationManager) {
mAppWidgetManager = appWidgetManager;
mIPeopleManager = iPeopleManager;
mPeopleManager = peopleManager;
@@ -140,6 +151,8 @@ public class PeopleSpaceWidgetManager {
mPackageManager = packageManager;
mIsForTesting = isForTesting;
mPeopleSpaceWidgetProvider = peopleSpaceWidgetProvider;
mUserManager = userManager;
mINotificationManager = notificationManager;
}
/**
@@ -783,4 +796,52 @@ public class PeopleSpaceWidgetManager {
ComponentName componentName = new ComponentName(mContext, PeopleSpaceWidgetProvider.class);
return mAppWidgetManager.requestPinAppWidget(componentName, extras, successCallback);
}
/** Returns a list of map entries corresponding to user's priority conversations. */
@NonNull
public List<PeopleSpaceTile> getPriorityTiles()
throws Exception {
List<ConversationChannelWrapper> conversations =
mINotificationManager.getConversations(true).getList();
// Add priority conversations to tiles list.
Stream<ShortcutInfo> priorityConversations = conversations.stream()
.filter(c -> c.getNotificationChannel() != null
&& c.getNotificationChannel().isImportantConversation())
.map(c -> c.getShortcutInfo());
List<PeopleSpaceTile> priorityTiles = PeopleSpaceUtils.getSortedTiles(mIPeopleManager,
mLauncherApps, mUserManager,
priorityConversations);
priorityTiles = PeopleSpaceUtils.augmentTilesFromVisibleNotifications(
mContext, priorityTiles, mNotificationEntryManager);
return priorityTiles;
}
/** Returns a list of map entries corresponding to user's recent conversations. */
@NonNull
public List<PeopleSpaceTile> getRecentTiles()
throws Exception {
if (DEBUG) Log.d(TAG, "Add recent conversations");
List<ConversationChannelWrapper> conversations =
mINotificationManager.getConversations(false).getList();
Stream<ShortcutInfo> nonPriorityConversations = conversations.stream()
.filter(c -> c.getNotificationChannel() == null
|| !c.getNotificationChannel().isImportantConversation())
.map(c -> c.getShortcutInfo());
List<ConversationChannel> recentConversationsList =
mIPeopleManager.getRecentConversations().getList();
Stream<ShortcutInfo> recentConversations = recentConversationsList
.stream()
.map(c -> c.getShortcutInfo());
Stream<ShortcutInfo> mergedStream = Stream.concat(nonPriorityConversations,
recentConversations);
List<PeopleSpaceTile> recentTiles =
PeopleSpaceUtils.getSortedTiles(mIPeopleManager, mLauncherApps, mUserManager,
mergedStream);
recentTiles = PeopleSpaceUtils.augmentTilesFromVisibleNotifications(
mContext, recentTiles, mNotificationEntryManager);
return recentTiles;
}
}

View File

@@ -22,8 +22,6 @@ import static com.android.systemui.people.widget.AppWidgetOptionsHelper.OPTIONS_
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
@@ -35,10 +33,7 @@ import static org.mockito.Mockito.when;
import android.app.INotificationManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Person;
import android.app.people.ConversationChannel;
import android.app.people.IPeopleManager;
import android.app.people.PeopleSpaceTile;
import android.appwidget.AppWidgetManager;
@@ -47,7 +42,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.pm.ShortcutInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -57,7 +51,6 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.UserHandle;
import android.provider.ContactsContract;
import android.service.notification.ConversationChannelWrapper;
import android.service.notification.StatusBarNotification;
import android.testing.AndroidTestingRunner;
import android.util.DisplayMetrics;
@@ -81,10 +74,8 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@RunWith(AndroidTestingRunner.class)
@SmallTest
@@ -185,8 +176,6 @@ public class PeopleSpaceUtilsTest extends SysuiTestCase {
@Mock
private IPeopleManager mPeopleManager;
@Mock
private LauncherApps mLauncherApps;
@Mock
private IAppWidgetService mIAppWidgetService;
@Mock
private AppWidgetManager mAppWidgetManager;
@@ -238,84 +227,6 @@ public class PeopleSpaceUtilsTest extends SysuiTestCase {
.thenReturn(List.of(mNotificationEntry1, mNotificationEntry2, mNotificationEntry3));
}
@Test
public void testGetRecentTilesReturnsSortedListWithOnlyRecentConversations() throws Exception {
// Ensure the less-recent Important conversation is before more recent conversations.
ConversationChannelWrapper newerNonImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID_1, false, 3);
ConversationChannelWrapper newerImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID_1 + 1, true, 3);
ConversationChannelWrapper olderImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID_1 + 2,
true, 1);
when(mNotificationManager.getConversations(anyBoolean())).thenReturn(
new ParceledListSlice(Arrays.asList(
newerNonImportantConversation, newerImportantConversation,
olderImportantConversation)));
// Ensure the non-Important conversation is sorted between these recent conversations.
ConversationChannel recentConversationBeforeNonImportantConversation =
getConversationChannel(
SHORTCUT_ID_1 + 3, 4);
ConversationChannel recentConversationAfterNonImportantConversation =
getConversationChannel(SHORTCUT_ID_1 + 4,
2);
when(mPeopleManager.getRecentConversations()).thenReturn(
new ParceledListSlice(Arrays.asList(recentConversationAfterNonImportantConversation,
recentConversationBeforeNonImportantConversation)));
List<String> orderedShortcutIds = PeopleSpaceUtils.getRecentTiles(
mContext, mNotificationManager, mPeopleManager,
mLauncherApps, mNotificationEntryManager)
.stream().map(tile -> tile.getId()).collect(Collectors.toList());
// Check for sorted recent conversations.
assertThat(orderedShortcutIds).containsExactly(
recentConversationBeforeNonImportantConversation.getShortcutInfo().getId(),
newerNonImportantConversation.getShortcutInfo().getId(),
recentConversationAfterNonImportantConversation.getShortcutInfo().getId())
.inOrder();
}
@Test
public void testGetPriorityTilesReturnsSortedListWithOnlyImportantConversations()
throws Exception {
// Ensure the less-recent Important conversation is before more recent conversations.
ConversationChannelWrapper newerNonImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID_1, false, 3);
ConversationChannelWrapper newerImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID_1 + 1, true, 3);
ConversationChannelWrapper olderImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID_1 + 2,
true, 1);
when(mNotificationManager.getConversations(anyBoolean())).thenReturn(
new ParceledListSlice(Arrays.asList(
newerNonImportantConversation, newerImportantConversation,
olderImportantConversation)));
// Ensure the non-Important conversation is sorted between these recent conversations.
ConversationChannel recentConversationBeforeNonImportantConversation =
getConversationChannel(
SHORTCUT_ID_1 + 3, 4);
ConversationChannel recentConversationAfterNonImportantConversation =
getConversationChannel(SHORTCUT_ID_1 + 4,
2);
when(mPeopleManager.getRecentConversations()).thenReturn(
new ParceledListSlice(Arrays.asList(recentConversationAfterNonImportantConversation,
recentConversationBeforeNonImportantConversation)));
List<String> orderedShortcutIds = PeopleSpaceUtils.getPriorityTiles(
mContext, mNotificationManager, mPeopleManager,
mLauncherApps, mNotificationEntryManager)
.stream().map(tile -> tile.getId()).collect(Collectors.toList());
// Check for sorted priority conversations.
assertThat(orderedShortcutIds).containsExactly(
newerImportantConversation.getShortcutInfo().getId(),
olderImportantConversation.getShortcutInfo().getId())
.inOrder();
}
@Test
public void testGetMessagingStyleMessagesNoMessage() {
Notification notification = new Notification.Builder(mContext, "test")
@@ -570,30 +481,4 @@ public class PeopleSpaceUtilsTest extends SysuiTestCase {
verify(mAppWidgetManager, times(1)).updateAppWidget(eq(WIDGET_ID_WITH_SHORTCUT),
any());
}
private ConversationChannelWrapper getConversationChannelWrapper(String shortcutId,
boolean importantConversation, long lastInteractionTimestamp) throws Exception {
ConversationChannelWrapper convo = new ConversationChannelWrapper();
NotificationChannel notificationChannel = new NotificationChannel(shortcutId,
"channel" + shortcutId,
NotificationManager.IMPORTANCE_DEFAULT);
notificationChannel.setImportantConversation(importantConversation);
convo.setNotificationChannel(notificationChannel);
convo.setShortcutInfo(new ShortcutInfo.Builder(mContext, shortcutId).setLongLabel(
"name").build());
when(mPeopleManager.getLastInteraction(anyString(), anyInt(),
eq(shortcutId))).thenReturn(lastInteractionTimestamp);
return convo;
}
private ConversationChannel getConversationChannel(String shortcutId,
long lastInteractionTimestamp) throws Exception {
ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(mContext, shortcutId).setLongLabel(
"name").build();
ConversationChannel convo = new ConversationChannel(shortcutInfo, 0, null, null,
lastInteractionTimestamp, false);
when(mPeopleManager.getLastInteraction(anyString(), anyInt(),
eq(shortcutId))).thenReturn(lastInteractionTimestamp);
return convo;
}
}

View File

@@ -29,6 +29,7 @@ import static org.mockito.Mockito.when;
import android.content.Intent;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
import android.service.notification.NotificationListenerService;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
@@ -83,6 +84,8 @@ public class LaunchConversationActivityTest extends SysuiTestCase {
private BubblesManager mBubblesManager;
@Mock
private NotificationListenerService.Ranking mRanking;
@Mock
private UserManager mUserManager;
@Captor
private ArgumentCaptor<NotificationVisibility> mNotificationVisibilityCaptor;
@@ -93,7 +96,7 @@ public class LaunchConversationActivityTest extends SysuiTestCase {
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mActivity = new LaunchConversationActivity(mNotificationEntryManager,
Optional.of(mBubblesManager));
Optional.of(mBubblesManager), mUserManager);
mActivity.setIsForTesting(true, mIStatusBarService);
mIntent = new Intent();
mIntent.putExtra(PeopleSpaceWidgetProvider.EXTRA_TILE_ID, "tile ID");
@@ -113,6 +116,7 @@ public class LaunchConversationActivityTest extends SysuiTestCase {
when(mNotifEntryCanBubble.canBubble()).thenReturn(true);
when(mNotifEntryNoRanking.getRanking()).thenReturn(null);
when(mRanking.getRank()).thenReturn(NOTIF_RANK);
when(mUserManager.isQuietModeEnabled(any(UserHandle.class))).thenReturn(false);
}
@Test
@@ -176,4 +180,18 @@ public class LaunchConversationActivityTest extends SysuiTestCase {
anyInt(), any(), anyInt(), anyInt(), any());
verify(mBubblesManager, times(1)).expandStackAndSelectBubble(eq(mNotifEntryCanBubble));
}
@Test
public void testQuietModeOpensQuietModeDialog() throws Exception {
mIntent.putExtra(PeopleSpaceWidgetProvider.EXTRA_NOTIFICATION_KEY,
NOTIF_KEY);
when(mUserManager.isQuietModeEnabled(eq(USER_HANDLE))).thenReturn(true);
mActivity.setIntent(mIntent);
mActivity.onCreate(new Bundle());
assertThat(mActivity.isFinishing()).isTrue();
verify(mIStatusBarService, never()).onNotificationClear(any(),
anyInt(), any(), anyInt(), anyInt(), any());
verify(mBubblesManager, never()).expandStackAndSelectBubble(any());
}
}

View File

@@ -35,7 +35,9 @@ import static com.android.systemui.people.widget.AppWidgetOptionsHelper.OPTIONS_
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
@@ -45,8 +47,10 @@ import static org.mockito.Mockito.when;
import static java.util.Objects.requireNonNull;
import android.app.INotificationManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.Person;
import android.app.people.ConversationChannel;
import android.app.people.ConversationStatus;
@@ -59,11 +63,14 @@ import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.pm.ShortcutInfo;
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
import android.service.notification.ConversationChannelWrapper;
import android.service.notification.StatusBarNotification;
import android.testing.AndroidTestingRunner;
@@ -95,6 +102,7 @@ import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@@ -169,6 +177,10 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
private NotificationEntryManager mNotificationEntryManager;
@Mock
private PackageManager mPackageManager;
@Mock
private INotificationManager mNotificationManager;
@Mock
private UserManager mUserManager;
@Captor
private ArgumentCaptor<NotificationHandler> mListenerCaptor;
@@ -189,7 +201,8 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
mProvider = new PeopleSpaceWidgetProvider();
mProvider.setPeopleSpaceWidgetManager(mManager);
mManager.setAppWidgetManager(mAppWidgetManager, mIPeopleManager, mPeopleManager,
mLauncherApps, mNotificationEntryManager, mPackageManager, true, mProvider);
mLauncherApps, mNotificationEntryManager, mPackageManager, true, mProvider,
mUserManager, mNotificationManager);
mManager.attach(mListenerService);
verify(mListenerService).addNotificationHandler(mListenerCaptor.capture());
@@ -201,6 +214,98 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
addTileForWidget(PERSON_TILE_WITH_SAME_URI, WIDGET_ID_WITH_SAME_URI);
when(mAppWidgetManager.getAppWidgetOptions(eq(WIDGET_ID_WITHOUT_SHORTCUT)))
.thenReturn(new Bundle());
when(mUserManager.isQuietModeEnabled(any())).thenReturn(false);
}
@Test
public void testGetRecentTilesReturnsSortedListWithOnlyRecentConversations() throws Exception {
// Ensure the less-recent Important conversation is before more recent conversations.
ConversationChannelWrapper newerNonImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID, false, 3);
ConversationChannelWrapper newerImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID + 1, true, 3);
ConversationChannelWrapper olderImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID + 2,
true, 1);
when(mNotificationManager.getConversations(anyBoolean())).thenReturn(
new ParceledListSlice(Arrays.asList(
newerNonImportantConversation, newerImportantConversation,
olderImportantConversation)));
// Ensure the non-Important conversation is sorted between these recent conversations.
ConversationChannel recentConversationBeforeNonImportantConversation =
getConversationChannel(
SHORTCUT_ID + 3, 4);
ConversationChannel recentConversationAfterNonImportantConversation =
getConversationChannel(SHORTCUT_ID + 4,
2);
when(mIPeopleManager.getRecentConversations()).thenReturn(
new ParceledListSlice(Arrays.asList(recentConversationAfterNonImportantConversation,
recentConversationBeforeNonImportantConversation)));
List<String> orderedShortcutIds = mManager.getRecentTiles()
.stream().map(tile -> tile.getId()).collect(Collectors.toList());
// Check for sorted recent conversations.
assertThat(orderedShortcutIds).containsExactly(
recentConversationBeforeNonImportantConversation.getShortcutInfo().getId(),
newerNonImportantConversation.getShortcutInfo().getId(),
recentConversationAfterNonImportantConversation.getShortcutInfo().getId())
.inOrder();
}
@Test
public void testGetPriorityTilesReturnsSortedListWithOnlyImportantConversations()
throws Exception {
// Ensure the less-recent Important conversation is before more recent conversations.
ConversationChannelWrapper newerNonImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID, false, 3);
ConversationChannelWrapper newerImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID + 1, true, 3);
ConversationChannelWrapper olderImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID + 2,
true, 1);
when(mNotificationManager.getConversations(anyBoolean())).thenReturn(
new ParceledListSlice(Arrays.asList(
newerNonImportantConversation, newerImportantConversation,
olderImportantConversation)));
List<String> orderedShortcutIds = mManager.getPriorityTiles()
.stream().map(tile -> tile.getId()).collect(Collectors.toList());
// Check for sorted priority conversations.
assertThat(orderedShortcutIds).containsExactly(
newerImportantConversation.getShortcutInfo().getId(),
olderImportantConversation.getShortcutInfo().getId())
.inOrder();
}
@Test
public void testGetTilesReturnsNothingInQuietMode()
throws Exception {
// Ensure the less-recent Important conversation is before more recent conversations.
ConversationChannelWrapper newerNonImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID, false, 3);
ConversationChannelWrapper newerImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID + 1, true, 3);
ConversationChannelWrapper olderImportantConversation = getConversationChannelWrapper(
SHORTCUT_ID + 2,
true, 1);
when(mNotificationManager.getConversations(anyBoolean())).thenReturn(
new ParceledListSlice(Arrays.asList(
newerNonImportantConversation, newerImportantConversation,
olderImportantConversation)));
ConversationChannel recentConversation =
getConversationChannel(
SHORTCUT_ID + 3, 4);
when(mIPeopleManager.getRecentConversations()).thenReturn(
new ParceledListSlice(Arrays.asList(recentConversation)));
when(mUserManager.isQuietModeEnabled(any())).thenReturn(true);
// Check nothing returned.
assertThat(mManager.getPriorityTiles()).isEmpty();
assertThat(mManager.getRecentTiles()).isEmpty();
}
@Test
@@ -1208,4 +1313,30 @@ public class PeopleSpaceWidgetManagerTest extends SysuiTestCase {
editor.putStringSet(contactUri.toString(), storedWidgetIdsByUri);
editor.apply();
}
private ConversationChannelWrapper getConversationChannelWrapper(String shortcutId,
boolean importantConversation, long lastInteractionTimestamp) throws Exception {
ConversationChannelWrapper convo = new ConversationChannelWrapper();
NotificationChannel notificationChannel = new NotificationChannel(shortcutId,
"channel" + shortcutId,
NotificationManager.IMPORTANCE_DEFAULT);
notificationChannel.setImportantConversation(importantConversation);
convo.setNotificationChannel(notificationChannel);
convo.setShortcutInfo(new ShortcutInfo.Builder(mContext, shortcutId).setLongLabel(
"name").build());
when(mIPeopleManager.getLastInteraction(anyString(), anyInt(),
eq(shortcutId))).thenReturn(lastInteractionTimestamp);
return convo;
}
private ConversationChannel getConversationChannel(String shortcutId,
long lastInteractionTimestamp) throws Exception {
ShortcutInfo shortcutInfo = new ShortcutInfo.Builder(mContext, shortcutId).setLongLabel(
"name").build();
ConversationChannel convo = new ConversationChannel(shortcutInfo, 0, null, null,
lastInteractionTimestamp, false);
when(mIPeopleManager.getLastInteraction(anyString(), anyInt(),
eq(shortcutId))).thenReturn(lastInteractionTimestamp);
return convo;
}
}