Migrate DND related apis to permissionhelper

Test: atest FrameworksUiServicesTests
Bug: 194833441
Change-Id: I0e70264123dbc1b5ec50e89b0ddde7b6e4dbde67
This commit is contained in:
Julia Reynolds
2021-10-20 10:15:04 -04:00
parent 85a82f4532
commit 84c4440052
9 changed files with 354 additions and 226 deletions

View File

@@ -115,7 +115,6 @@ interface INotificationManager
ParceledListSlice getNotificationChannelGroups(String pkg);
boolean onlyHasDefaultChannel(String pkg, int uid);
boolean areChannelsBypassingDnd();
int getAppsBypassingDndCount(int uid);
ParceledListSlice getNotificationChannelsBypassingDnd(String pkg, int userId);
boolean isPackagePaused(String pkg);
void deleteNotificationHistoryItem(String pkg, int uid, long postedTime);

View File

@@ -479,6 +479,7 @@ public class NotificationManagerService extends SystemService {
private ActivityManagerInternal mAmi;
private IPackageManager mPackageManager;
private PackageManager mPackageManagerClient;
private PackageManagerInternal mPackageManagerInternal;
AudioManager mAudioManager;
AudioManagerInternal mAudioManagerInternal;
// Can be null for wear
@@ -2212,6 +2213,7 @@ public class NotificationManagerService extends SystemService {
mUgmInternal = ugmInternal;
mPackageManager = packageManager;
mPackageManagerClient = packageManagerClient;
mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
mAppOps = appOps;
mAppOpsService = iAppOps;
try {
@@ -2292,10 +2294,12 @@ public class NotificationManagerService extends SystemService {
});
}
});
mPermissionHelper = permissionHelper;
mPreferencesHelper = new PreferencesHelper(getContext(),
mPackageManagerClient,
mRankingHandler,
mZenModeHelper,
mPermissionHelper,
new NotificationChannelLoggerImpl(),
mAppOps,
new SysUiStatsEvent.BuilderFactory());
@@ -2309,7 +2313,6 @@ public class NotificationManagerService extends SystemService {
mGroupHelper = groupHelper;
mVibratorHelper = new VibratorHelper(getContext());
mHistoryManager = historyManager;
mPermissionHelper = permissionHelper;
// This is a ManagedServices object that keeps track of the listeners.
mListeners = notificationListeners;
@@ -3481,7 +3484,7 @@ public class NotificationManagerService extends SystemService {
mPreferencesHelper.setEnabled(pkg, uid, enabled);
// TODO (b/194833441): this is being ignored by app ops now that the permission
// exists
// exists, so send the broadcast manually
mAppOps.setMode(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg,
enabled ? MODE_ALLOWED : AppOpsManager.MODE_IGNORED);
@@ -4081,16 +4084,14 @@ public class NotificationManagerService extends SystemService {
+ " cannot read channels for " + targetPkg + " in " + userId);
}
@Override
public int getAppsBypassingDndCount(int userId) {
checkCallerIsSystem();
return mPreferencesHelper.getAppsBypassingDndCount(userId);
}
@Override
public ParceledListSlice<NotificationChannel> getNotificationChannelsBypassingDnd(
String pkg, int userId) {
checkCallerIsSystem();
if (!areNotificationsEnabledForPackage(pkg,
mPackageManagerInternal.getPackageUid(pkg, 0, userId))) {
return ParceledListSlice.emptyList();
}
return mPreferencesHelper.getNotificationChannelsBypassingDnd(pkg, userId);
}

View File

@@ -58,6 +58,10 @@ public final class PermissionHelper {
mMigrationEnabled = migrationEnabled;
}
public boolean isMigrationEnabled() {
return mMigrationEnabled;
}
/**
* Returns whether the given uid holds the notification permission. Must not be called
* with a lock held.

View File

@@ -169,6 +169,7 @@ public class PreferencesHelper implements RankingConfig {
private final PackageManager mPm;
private final RankingHandler mRankingHandler;
private final ZenModeHelper mZenModeHelper;
private final PermissionHelper mPermissionHelper;
private final NotificationChannelLogger mNotificationChannelLogger;
private final AppOpsManager mAppOps;
@@ -187,12 +188,14 @@ public class PreferencesHelper implements RankingConfig {
private int mCurrentUserId = UserHandle.USER_NULL;
public PreferencesHelper(Context context, PackageManager pm, RankingHandler rankingHandler,
ZenModeHelper zenHelper, NotificationChannelLogger notificationChannelLogger,
ZenModeHelper zenHelper, PermissionHelper permHelper,
NotificationChannelLogger notificationChannelLogger,
AppOpsManager appOpsManager,
SysUiStatsEvent.BuilderFactory statsEventBuilderFactory) {
mContext = context;
mZenModeHelper = zenHelper;
mRankingHandler = rankingHandler;
mPermissionHelper = permHelper;
mPm = pm;
mNotificationChannelLogger = notificationChannelLogger;
mAppOps = appOpsManager;
@@ -791,6 +794,7 @@ public class PreferencesHelper implements RankingConfig {
Objects.requireNonNull(group);
Objects.requireNonNull(group.getId());
Objects.requireNonNull(!TextUtils.isEmpty(group.getName()));
boolean needsDndChange = false;
synchronized (mPackagePreferences) {
PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid);
if (r == null) {
@@ -809,7 +813,7 @@ public class PreferencesHelper implements RankingConfig {
// but the system can
if (group.isBlocked() != oldGroup.isBlocked()) {
group.lockFields(NotificationChannelGroup.USER_LOCKED_BLOCKED_STATE);
updateChannelsBypassingDnd();
needsDndChange = true;
}
}
}
@@ -822,6 +826,9 @@ public class PreferencesHelper implements RankingConfig {
}
r.groups.put(group.getId(), group);
}
if (needsDndChange) {
updateChannelsBypassingDnd();
}
}
@Override
@@ -831,7 +838,7 @@ public class PreferencesHelper implements RankingConfig {
Objects.requireNonNull(channel);
Objects.requireNonNull(channel.getId());
Preconditions.checkArgument(!TextUtils.isEmpty(channel.getName()));
boolean needsPolicyFileChange = false, wasUndeleted = false;
boolean needsPolicyFileChange = false, wasUndeleted = false, needsDndChange = false;
synchronized (mPackagePreferences) {
PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid);
if (r == null) {
@@ -897,7 +904,7 @@ public class PreferencesHelper implements RankingConfig {
if (bypassDnd != mAreChannelsBypassingDnd
|| previousExistingImportance != existing.getImportance()) {
updateChannelsBypassingDnd();
needsDndChange = true;
}
}
}
@@ -912,60 +919,64 @@ public class PreferencesHelper implements RankingConfig {
mNotificationChannelLogger.logNotificationChannelModified(existing, uid, pkg,
previousLoggingImportance, false);
}
return needsPolicyFileChange;
}
if (r.channels.size() >= NOTIFICATION_CHANNEL_COUNT_LIMIT) {
throw new IllegalStateException("Limit exceed; cannot create more channels");
}
needsPolicyFileChange = true;
if (channel.getImportance() < IMPORTANCE_NONE
|| channel.getImportance() > NotificationManager.IMPORTANCE_MAX) {
throw new IllegalArgumentException("Invalid importance level");
}
// Reset fields that apps aren't allowed to set.
if (fromTargetApp && !hasDndAccess) {
channel.setBypassDnd(r.priority == Notification.PRIORITY_MAX);
}
if (fromTargetApp) {
channel.setLockscreenVisibility(r.visibility);
channel.setAllowBubbles(existing != null
? existing.getAllowBubbles()
: NotificationChannel.DEFAULT_ALLOW_BUBBLE);
}
clearLockedFieldsLocked(channel);
channel.setImportanceLockedByOEM(r.oemLockedImportance);
if (!channel.isImportanceLockedByOEM()) {
if (r.oemLockedChannels.contains(channel.getId())) {
channel.setImportanceLockedByOEM(true);
} else {
if (r.channels.size() >= NOTIFICATION_CHANNEL_COUNT_LIMIT) {
throw new IllegalStateException("Limit exceed; cannot create more channels");
}
}
channel.setImportanceLockedByCriticalDeviceFunction(r.defaultAppLockedImportance);
if (channel.getLockscreenVisibility() == Notification.VISIBILITY_PUBLIC) {
channel.setLockscreenVisibility(
NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE);
}
if (!r.showBadge) {
channel.setShowBadge(false);
}
channel.setOriginalImportance(channel.getImportance());
// validate parent
if (channel.getParentChannelId() != null) {
Preconditions.checkArgument(r.channels.containsKey(channel.getParentChannelId()),
"Tried to create a conversation channel without a preexisting parent");
}
needsPolicyFileChange = true;
r.channels.put(channel.getId(), channel);
if (channel.canBypassDnd() != mAreChannelsBypassingDnd) {
updateChannelsBypassingDnd();
if (channel.getImportance() < IMPORTANCE_NONE
|| channel.getImportance() > NotificationManager.IMPORTANCE_MAX) {
throw new IllegalArgumentException("Invalid importance level");
}
// Reset fields that apps aren't allowed to set.
if (fromTargetApp && !hasDndAccess) {
channel.setBypassDnd(r.priority == Notification.PRIORITY_MAX);
}
if (fromTargetApp) {
channel.setLockscreenVisibility(r.visibility);
channel.setAllowBubbles(existing != null
? existing.getAllowBubbles()
: NotificationChannel.DEFAULT_ALLOW_BUBBLE);
}
clearLockedFieldsLocked(channel);
channel.setImportanceLockedByOEM(r.oemLockedImportance);
if (!channel.isImportanceLockedByOEM()) {
if (r.oemLockedChannels.contains(channel.getId())) {
channel.setImportanceLockedByOEM(true);
}
}
channel.setImportanceLockedByCriticalDeviceFunction(r.defaultAppLockedImportance);
if (channel.getLockscreenVisibility() == Notification.VISIBILITY_PUBLIC) {
channel.setLockscreenVisibility(
NotificationListenerService.Ranking.VISIBILITY_NO_OVERRIDE);
}
if (!r.showBadge) {
channel.setShowBadge(false);
}
channel.setOriginalImportance(channel.getImportance());
// validate parent
if (channel.getParentChannelId() != null) {
Preconditions.checkArgument(
r.channels.containsKey(channel.getParentChannelId()),
"Tried to create a conversation channel without a preexisting parent");
}
r.channels.put(channel.getId(), channel);
if (channel.canBypassDnd() != mAreChannelsBypassingDnd) {
needsDndChange = true;
}
MetricsLogger.action(getChannelLog(channel, pkg).setType(
com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_OPEN));
mNotificationChannelLogger.logNotificationChannelCreated(channel, uid, pkg);
}
MetricsLogger.action(getChannelLog(channel, pkg).setType(
com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_OPEN));
mNotificationChannelLogger.logNotificationChannelCreated(channel, uid, pkg);
}
if (needsDndChange) {
updateChannelsBypassingDnd();
}
return needsPolicyFileChange;
@@ -997,6 +1008,7 @@ public class PreferencesHelper implements RankingConfig {
boolean fromUser) {
Objects.requireNonNull(updatedChannel);
Objects.requireNonNull(updatedChannel.getId());
boolean needsDndChange = false;
synchronized (mPackagePreferences) {
PackagePreferences r = getOrCreatePackagePreferencesLocked(pkg, uid);
if (r == null) {
@@ -1050,9 +1062,12 @@ public class PreferencesHelper implements RankingConfig {
if (updatedChannel.canBypassDnd() != mAreChannelsBypassingDnd
|| channel.getImportance() != updatedChannel.getImportance()) {
updateChannelsBypassingDnd();
needsDndChange = true;
}
}
if (needsDndChange) {
updateChannelsBypassingDnd();
}
updateConfig();
}
@@ -1126,6 +1141,8 @@ public class PreferencesHelper implements RankingConfig {
@Override
public boolean deleteNotificationChannel(String pkg, int uid, String channelId) {
boolean deletedChannel = false;
boolean channelBypassedDnd = false;
synchronized (mPackagePreferences) {
PackagePreferences r = getPackagePreferencesLocked(pkg, uid);
if (r == null) {
@@ -1133,13 +1150,18 @@ public class PreferencesHelper implements RankingConfig {
}
NotificationChannel channel = r.channels.get(channelId);
if (channel != null) {
return deleteNotificationChannelLocked(channel, pkg, uid);
channelBypassedDnd = channel.canBypassDnd();
deletedChannel = deleteNotificationChannelLocked(channel, pkg, uid);
}
return false;
}
if (channelBypassedDnd) {
updateChannelsBypassingDnd();
}
return deletedChannel;
}
private boolean deleteNotificationChannelLocked(NotificationChannel channel, String pkg, int uid) {
private boolean deleteNotificationChannelLocked(NotificationChannel channel, String pkg,
int uid) {
if (!channel.isDeleted()) {
channel.setDeleted(true);
channel.setDeletedTimeMs(System.currentTimeMillis());
@@ -1147,10 +1169,6 @@ public class PreferencesHelper implements RankingConfig {
lm.setType(com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_CLOSE);
MetricsLogger.action(lm);
mNotificationChannelLogger.logNotificationChannelDeleted(channel, uid, pkg);
if (mAreChannelsBypassingDnd && channel.canBypassDnd()) {
updateChannelsBypassingDnd();
}
return true;
}
return false;
@@ -1352,6 +1370,7 @@ public class PreferencesHelper implements RankingConfig {
public List<NotificationChannel> deleteNotificationChannelGroup(String pkg, int uid,
String groupId) {
List<NotificationChannel> deletedChannels = new ArrayList<>();
boolean groupBypassedDnd = false;
synchronized (mPackagePreferences) {
PackagePreferences r = getPackagePreferencesLocked(pkg, uid);
if (r == null || TextUtils.isEmpty(groupId)) {
@@ -1368,11 +1387,15 @@ public class PreferencesHelper implements RankingConfig {
for (int i = 0; i < N; i++) {
final NotificationChannel nc = r.channels.valueAt(i);
if (groupId.equals(nc.getGroup())) {
groupBypassedDnd |= nc.canBypassDnd();
deleteNotificationChannelLocked(nc, pkg, uid);
deletedChannels.add(nc);
}
}
}
if (groupBypassedDnd) {
updateChannelsBypassingDnd();
}
return deletedChannels;
}
@@ -1495,8 +1518,8 @@ public class PreferencesHelper implements RankingConfig {
public @NonNull List<String> deleteConversations(String pkg, int uid,
Set<String> conversationIds) {
List<String> deletedChannelIds = new ArrayList<>();
synchronized (mPackagePreferences) {
List<String> deletedChannelIds = new ArrayList<>();
PackagePreferences r = getPackagePreferencesLocked(pkg, uid);
if (r == null) {
return deletedChannelIds;
@@ -1517,11 +1540,11 @@ public class PreferencesHelper implements RankingConfig {
deletedChannelIds.add(nc.getId());
}
}
if (!deletedChannelIds.isEmpty() && mAreChannelsBypassingDnd) {
updateChannelsBypassingDnd();
}
return deletedChannelIds;
}
if (!deletedChannelIds.isEmpty() && mAreChannelsBypassingDnd) {
updateChannelsBypassingDnd();
}
return deletedChannelIds;
}
@Override
@@ -1554,8 +1577,7 @@ public class PreferencesHelper implements RankingConfig {
synchronized (mPackagePreferences) {
final PackagePreferences r = mPackagePreferences.get(
packagePreferencesKey(pkg, userId));
// notifications from this package aren't blocked
if (r != null && r.importance != IMPORTANCE_NONE) {
if (r != null) {
for (NotificationChannel channel : r.channels.values()) {
if (channelIsLiveLocked(r, channel) && channel.canBypassDnd()) {
channels.add(channel);
@@ -1621,33 +1643,6 @@ public class PreferencesHelper implements RankingConfig {
}
}
/**
* Returns the number of apps that have at least one notification channel that can bypass DND
* for given particular user
*/
public int getAppsBypassingDndCount(int userId) {
int count = 0;
synchronized (mPackagePreferences) {
final int numPackagePreferences = mPackagePreferences.size();
for (int i = 0; i < numPackagePreferences; i++) {
final PackagePreferences r = mPackagePreferences.valueAt(i);
// Package isn't associated with this userId or notifications from this package are
// blocked
if (userId != UserHandle.getUserId(r.uid) || r.importance == IMPORTANCE_NONE) {
continue;
}
for (NotificationChannel channel : r.channels.values()) {
if (channelIsLiveLocked(r, channel) && channel.canBypassDnd()) {
count++;
break;
}
}
}
}
return count;
}
/**
* Syncs {@link #mAreChannelsBypassingDnd} with the current user's notification policy before
* updating
@@ -1655,41 +1650,56 @@ public class PreferencesHelper implements RankingConfig {
private void syncChannelsBypassingDnd() {
mAreChannelsBypassingDnd = (mZenModeHelper.getNotificationPolicy().state
& NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND) == 1;
updateChannelsBypassingDnd();
}
/**
* Updates the user's NotificationPolicy based on whether the current userId
* has channels bypassing DND
* @param userId
*/
private void updateChannelsBypassingDnd() {
ArraySet<Pair<String, Integer>> candidatePkgs = new ArraySet<>();
synchronized (mPackagePreferences) {
final int numPackagePreferences = mPackagePreferences.size();
for (int i = 0; i < numPackagePreferences; i++) {
final PackagePreferences r = mPackagePreferences.valueAt(i);
// Package isn't associated with the current userId or notifications from this
// package are blocked
if (mCurrentUserId != UserHandle.getUserId(r.uid)
|| r.importance == IMPORTANCE_NONE) {
// Package isn't associated with the current userId
if (mCurrentUserId != UserHandle.getUserId(r.uid)) {
continue;
}
for (NotificationChannel channel : r.channels.values()) {
if (channelIsLiveLocked(r, channel) && channel.canBypassDnd()) {
if (!mAreChannelsBypassingDnd) {
mAreChannelsBypassingDnd = true;
updateZenPolicy(true);
}
return;
candidatePkgs.add(new Pair(r.pkg, r.uid));
break;
}
}
}
}
// If no channels bypass DND, update the zen policy once to disable DND bypass.
if (mAreChannelsBypassingDnd) {
mAreChannelsBypassingDnd = false;
updateZenPolicy(false);
for (int i = candidatePkgs.size() - 1; i >= 0; i--) {
Pair<String, Integer> app = candidatePkgs.valueAt(i);
if (mPermissionHelper.isMigrationEnabled()) {
if (!mPermissionHelper.hasPermission(app.second)) {
candidatePkgs.removeAt(i);
}
} else {
synchronized (mPackagePreferences) {
PackagePreferences r = getPackagePreferencesLocked(app.first, app.second);
if (r == null) {
continue;
}
if (r.importance == IMPORTANCE_NONE) {
candidatePkgs.removeAt(i);
}
}
}
}
boolean haveBypassingApps = candidatePkgs.size() > 0;
if (mAreChannelsBypassingDnd != haveBypassingApps) {
mAreChannelsBypassingDnd = haveBypassingApps;
updateZenPolicy(mAreChannelsBypassingDnd);
}
}

View File

@@ -132,6 +132,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ParceledListSlice;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutServiceInternal;
@@ -248,6 +249,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Mock
private PackageManager mPackageManagerClient;
@Mock
private PackageManagerInternal mPackageManagerInternal;
@Mock
private WindowManagerInternal mWindowManagerInternal;
@Mock
private PermissionHelper mPermissionHelper;
@@ -375,6 +378,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
LocalServices.addService(DeviceIdleInternal.class, deviceIdleInternal);
LocalServices.removeServiceForTest(ActivityManagerInternal.class);
LocalServices.addService(ActivityManagerInternal.class, mAmi);
LocalServices.removeServiceForTest(PackageManagerInternal.class);
LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal);
mContext.addMockSystemService(Context.ALARM_SERVICE, mAlarmManager);
doNothing().when(mContext).sendBroadcastAsUser(any(), any(), any());
@@ -8307,4 +8312,15 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
public void testMigrationDisabledByDefault() {
assertThat(mService.mEnableAppSettingMigration).isFalse();
}
@Test
public void testGetNotificationChannelsBypassingDnd_blocked() throws RemoteException {
mService.setPreferencesHelper(mPreferencesHelper);
when(mPreferencesHelper.getImportance(PKG, mUid)).thenReturn(IMPORTANCE_NONE);
assertThat(mBinderService.getNotificationChannelsBypassingDnd(PKG, mUid).getList())
.isEmpty();
verify(mPermissionHelper, never()).hasPermission(anyInt());
verify(mPreferencesHelper, never()).getNotificationChannelsBypassingDnd(PKG, mUid);
}
}

View File

@@ -76,6 +76,7 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ParceledListSlice;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutServiceInternal;
@@ -86,6 +87,7 @@ import android.os.Build;
import android.os.IBinder;
import android.os.Looper;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.Settings;
@@ -159,6 +161,8 @@ public class NotificationPermissionMigrationTest extends UiServiceTestCase {
@Mock
private PackageManager mPackageManagerClient;
@Mock
private PackageManagerInternal mPackageManagerInternal;
@Mock
private WindowManagerInternal mWindowManagerInternal;
@Mock
private PermissionHelper mPermissionHelper;
@@ -279,6 +283,8 @@ public class NotificationPermissionMigrationTest extends UiServiceTestCase {
LocalServices.addService(DeviceIdleInternal.class, deviceIdleInternal);
LocalServices.removeServiceForTest(ActivityManagerInternal.class);
LocalServices.addService(ActivityManagerInternal.class, mAmi);
LocalServices.removeServiceForTest(PackageManagerInternal.class);
LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal);
mContext.addMockSystemService(Context.ALARM_SERVICE, mAlarmManager);
doNothing().when(mContext).sendBroadcastAsUser(any(), any(), any());
@@ -612,4 +618,16 @@ public class NotificationPermissionMigrationTest extends UiServiceTestCase {
assertEquals(PKG, captor.getValue().getPackage());
assertFalse(captor.getValue().getBooleanExtra(EXTRA_BLOCKED_STATE, true));
}
@Test
public void testGetNotificationChannelsBypassingDnd_blocked() throws RemoteException {
mService.setPreferencesHelper(mPreferencesHelper);
when(mPermissionHelper.hasPermission(mUid)).thenReturn(false);
assertThat(mBinderService.getNotificationChannelsBypassingDnd(PKG, mUid).getList())
.isEmpty();
verify(mPreferencesHelper, never()).getImportance(anyString(), anyInt());
verify(mPreferencesHelper, never()).getNotificationChannelsBypassingDnd(PKG, mUid);
}
}

View File

@@ -62,6 +62,7 @@ import java.lang.reflect.Parameter;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -91,7 +92,8 @@ public class PermissionHelperTest extends UiServiceTestCase {
Method[] allMethods = PermissionHelper.class.getDeclaredMethods();
for (Method method : allMethods) {
if (Modifier.isPublic(method.getModifiers())) {
if (Modifier.isPublic(method.getModifiers()) &&
!Objects.equals("isMigrationEnabled", method.getName())) {
Parameter[] params = method.getParameters();
List<Object> args = Lists.newArrayListWithCapacity(params.length);
for (int i = 0; i < params.length; i++) {

View File

@@ -153,7 +153,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
Uri.parse("content://" + TEST_AUTHORITY
+ "/internal/audio/media/10?title=Test&canonical=1");
@Mock NotificationUsageStats mUsageStats;
@Mock PermissionHelper mPermissionHelper;
@Mock RankingHandler mHandler;
@Mock PackageManager mPm;
IContentProvider mTestIContentProvider;
@@ -269,8 +269,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mStatsEventBuilderFactory = new WrappedSysUiStatsEvent.WrappedBuilderFactory();
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger, mAppOpsManager, mStatsEventBuilderFactory);
resetZenModeHelper();
mAudioAttributes = new AudioAttributes.Builder()
@@ -1393,16 +1393,6 @@ public class PreferencesHelperTest extends UiServiceTestCase {
assertEquals(3, mHelper.getNotificationChannelsBypassingDnd(PKG_N_MR1,
user).getList().size());
// block notifications from this app
mHelper.setEnabled(PKG_N_MR1, user, false);
assertEquals(0, mHelper.getNotificationChannelsBypassingDnd(PKG_N_MR1,
user).getList().size());
// re-enable notifications from this app
mHelper.setEnabled(PKG_N_MR1, user, true);
assertEquals(3, mHelper.getNotificationChannelsBypassingDnd(PKG_N_MR1,
user).getList().size());
// setBypassDnd false for some channels
channel1.setBypassDnd(false);
channel2.setBypassDnd(false);
@@ -1416,78 +1406,7 @@ public class PreferencesHelperTest extends UiServiceTestCase {
}
@Test
public void testGetAppsBypassingDndCount_noAppsBypassing() throws Exception {
assertEquals(0, mHelper.getAppsBypassingDndCount(USER.getIdentifier()));
}
@Test
public void testGetAppsBypassingDndCount_noAppsForUserIdBypassing() throws Exception {
int user = 9;
NotificationChannel channel = new NotificationChannel("id", "name",
NotificationManager.IMPORTANCE_MAX);
channel.setBypassDnd(true);
mHelper.createNotificationChannel(PKG_N_MR1, 111, channel, true, true);
assertEquals(0, mHelper.getAppsBypassingDndCount(user));
}
@Test
public void testGetAppsBypassingDndCount_oneChannelBypassing_groupBlocked() {
int user = USER.getIdentifier();
NotificationChannelGroup ncg = new NotificationChannelGroup("group1", "name1");
NotificationChannel channel1 = new NotificationChannel("id1", "name1",
NotificationManager.IMPORTANCE_MAX);
channel1.setBypassDnd(true);
channel1.setGroup(ncg.getId());
mHelper.createNotificationChannelGroup(PKG_N_MR1, user, ncg, /* fromTargetApp */ true);
mHelper.createNotificationChannel(PKG_N_MR1, user, channel1, true, /*has DND access*/ true);
assertEquals(1, mHelper.getAppsBypassingDndCount(user));
// disable group
ncg.setBlocked(true);
mHelper.createNotificationChannelGroup(PKG_N_MR1, user, ncg, /* fromTargetApp */ false);
assertEquals(0, mHelper.getAppsBypassingDndCount(user));
}
@Test
public void testGetAppsBypassingDndCount_oneAppBypassing() {
int user = USER.getIdentifier();
NotificationChannel channel1 = new NotificationChannel("id1", "name1",
NotificationManager.IMPORTANCE_MAX);
NotificationChannel channel2 = new NotificationChannel("id2", "name2",
NotificationManager.IMPORTANCE_MAX);
NotificationChannel channel3 = new NotificationChannel("id3", "name3",
NotificationManager.IMPORTANCE_MAX);
channel1.setBypassDnd(true);
channel2.setBypassDnd(true);
channel3.setBypassDnd(true);
// has DND access, so can set bypassDnd attribute
mHelper.createNotificationChannel(PKG_N_MR1, user, channel1, true, /*has DND access*/ true);
mHelper.createNotificationChannel(PKG_N_MR1, user, channel2, true, true);
mHelper.createNotificationChannel(PKG_N_MR1, user, channel3, true, true);
assertEquals(1, mHelper.getAppsBypassingDndCount(user));
// block notifications from this app
mHelper.setEnabled(PKG_N_MR1, user, false);
assertEquals(0, mHelper.getAppsBypassingDndCount(user)); // no apps can bypass dnd
// re-enable notifications from this app
mHelper.setEnabled(PKG_N_MR1, user, true);
assertEquals(1, mHelper.getAppsBypassingDndCount(user));
// setBypassDnd false for some channels
channel1.setBypassDnd(false);
channel2.setBypassDnd(false);
assertEquals(1, mHelper.getAppsBypassingDndCount(user));
// setBypassDnd false for rest of the channels
channel3.setBypassDnd(false);
assertEquals(0, mHelper.getAppsBypassingDndCount(user));
}
@Test
public void testCreateAndDeleteCanChannelsBypassDnd() throws Exception {
public void testCreateAndDeleteCanChannelsBypassDnd_localSettings() throws Exception {
int uid = UserManager.isHeadlessSystemUserMode() ? UID_HEADLESS : UID_N_MR1;
// create notification channel that can't bypass dnd
@@ -1501,6 +1420,70 @@ public class PreferencesHelperTest extends UiServiceTestCase {
// create notification channel that can bypass dnd
// expected result: areChannelsBypassingDnd = true
assertTrue(mHelper.getImportance(PKG_N_MR1, uid) != IMPORTANCE_NONE);
NotificationChannel channel2 = new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
channel2.setBypassDnd(true);
mHelper.createNotificationChannel(PKG_N_MR1, uid, channel2, true, true);
assertTrue(mHelper.areChannelsBypassingDnd());
verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
resetZenModeHelper();
// delete channels
mHelper.deleteNotificationChannel(PKG_N_MR1, uid, channel.getId());
assertTrue(mHelper.areChannelsBypassingDnd()); // channel2 can still bypass DND
verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
resetZenModeHelper();
mHelper.deleteNotificationChannel(PKG_N_MR1, uid, channel2.getId());
assertFalse(mHelper.areChannelsBypassingDnd());
verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
resetZenModeHelper();
}
@Test
public void testCreateAndUpdateChannelsBypassingDnd_permissionHelper() {
int uid = UserManager.isHeadlessSystemUserMode() ? UID_HEADLESS : UID_N_MR1;
when(mPermissionHelper.isMigrationEnabled()).thenReturn(true);
when(mPermissionHelper.hasPermission(uid)).thenReturn(true);
// create notification channel that can't bypass dnd
// expected result: areChannelsBypassingDnd = false
// setNotificationPolicy isn't called since areChannelsBypassingDnd was already false
NotificationChannel channel = new NotificationChannel("id1", "name1", IMPORTANCE_LOW);
mHelper.createNotificationChannel(PKG_N_MR1, uid, channel, true, false);
assertFalse(mHelper.areChannelsBypassingDnd());
verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
resetZenModeHelper();
// Recreate a channel & now the app has dnd access granted and can set the bypass dnd field
NotificationChannel update = new NotificationChannel("id1", "name1", IMPORTANCE_LOW);
update.setBypassDnd(true);
mHelper.createNotificationChannel(PKG_N_MR1, uid, update, true, true);
assertTrue(mHelper.areChannelsBypassingDnd());
verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
resetZenModeHelper();
}
@Test
public void testCreateAndDeleteCanChannelsBypassDnd_permissionHelper() throws Exception {
int uid = UserManager.isHeadlessSystemUserMode() ? UID_HEADLESS : UID_N_MR1;
when(mPermissionHelper.isMigrationEnabled()).thenReturn(true);
when(mPermissionHelper.hasPermission(uid)).thenReturn(true);
// create notification channel that can't bypass dnd
// expected result: areChannelsBypassingDnd = false
// setNotificationPolicy isn't called since areChannelsBypassingDnd was already false
NotificationChannel channel = new NotificationChannel("id1", "name1", IMPORTANCE_LOW);
mHelper.createNotificationChannel(PKG_N_MR1, uid, channel, true, false);
assertFalse(mHelper.areChannelsBypassingDnd());
verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
resetZenModeHelper();
// create notification channel that can bypass dnd, using local app level settings
// expected result: areChannelsBypassingDnd = true
NotificationChannel channel2 = new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
channel2.setBypassDnd(true);
mHelper.createNotificationChannel(PKG_N_MR1, uid, channel2, true, true);
@@ -1520,6 +1503,79 @@ public class PreferencesHelperTest extends UiServiceTestCase {
resetZenModeHelper();
}
@Test
public void testBlockedGroupDoesNotBypassDnd() throws Exception {
int uid = UserManager.isHeadlessSystemUserMode() ? UID_HEADLESS : UID_N_MR1;
// start in a 'allowed to bypass dnd state'
mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
// create notification channel that can bypass dnd, but app is blocked
// expected result: areChannelsBypassingDnd = false
NotificationChannelGroup group = new NotificationChannelGroup("group", "group");
group.setBlocked(true);
mHelper.createNotificationChannelGroup(PKG_N_MR1, uid, group, false);
NotificationChannel channel2 = new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
channel2.setGroup("group");
channel2.setBypassDnd(true);
mHelper.createNotificationChannel(PKG_N_MR1, uid, channel2, true, true);
assertFalse(mHelper.areChannelsBypassingDnd());
verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
resetZenModeHelper();
}
@Test
public void testBlockedAppsDoNotBypassDnd_localSettings() throws Exception {
int uid = UserManager.isHeadlessSystemUserMode() ? UID_HEADLESS : UID_N_MR1;
// start in a 'allowed to bypass dnd state'
mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
mHelper.setImportance(PKG_N_MR1, uid, IMPORTANCE_NONE);
// create notification channel that can bypass dnd, but app is blocked
// expected result: areChannelsBypassingDnd = false
NotificationChannel channel2 = new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
channel2.setBypassDnd(true);
mHelper.createNotificationChannel(PKG_N_MR1, uid, channel2, true, true);
assertFalse(mHelper.areChannelsBypassingDnd());
verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
resetZenModeHelper();
}
@Test
public void testBlockedAppsDoNotBypassDnd_permissionHelper() throws Exception {
int uid = UserManager.isHeadlessSystemUserMode() ? UID_HEADLESS : UID_N_MR1;
when(mPermissionHelper.isMigrationEnabled()).thenReturn(true);
when(mPermissionHelper.hasPermission(uid)).thenReturn(false);
// start in a 'allowed to bypass dnd state'
mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
// create notification channel that can bypass dnd, but app is blocked
// expected result: areChannelsBypassingDnd = false
NotificationChannel channel2 = new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
channel2.setBypassDnd(true);
mHelper.createNotificationChannel(PKG_N_MR1, uid, channel2, true, true);
assertFalse(mHelper.areChannelsBypassingDnd());
verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
resetZenModeHelper();
}
@Test
public void testUpdateCanChannelsBypassDnd() throws Exception {
int uid = UserManager.isHeadlessSystemUserMode() ? UID_HEADLESS : UID_N_MR1;
@@ -1557,7 +1613,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0,
NotificationManager.Policy.STATE_CHANNELS_BYPASSING_DND, 0);
when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
assertFalse(mHelper.areChannelsBypassingDnd());
verify(mMockZenModeHelper, times(1)).setNotificationPolicy(any());
@@ -1569,7 +1626,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
// start notification policy off with mAreChannelsBypassingDnd = false
mTestNotificationPolicy = new NotificationManager.Policy(0, 0, 0, 0, 0, 0);
when(mMockZenModeHelper.getNotificationPolicy()).thenReturn(mTestNotificationPolicy);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
assertFalse(mHelper.areChannelsBypassingDnd());
verify(mMockZenModeHelper, never()).setNotificationPolicy(any());
@@ -2355,7 +2413,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
+ "content_type=\"4\" flags=\"0\" show_badge=\"true\" />\n"
+ "</package>\n"
+ "</ranking>\n";
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
loadByteArrayXml(preQXml.getBytes(), true, UserHandle.USER_SYSTEM);
@@ -2368,7 +2427,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.setHideSilentStatusIcons(!PreferencesHelper.DEFAULT_HIDE_SILENT_STATUS_BAR_ICONS);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
loadStreamXml(baos, false, UserHandle.USER_ALL);
@@ -2465,7 +2525,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.setImportance(PKG_O, UID_O, IMPORTANCE_UNSPECIFIED);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
loadStreamXml(baos, false, UserHandle.USER_ALL);
@@ -2477,7 +2538,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.setNotificationDelegate(PKG_O, UID_O, "other", 53);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
loadStreamXml(baos, false, UserHandle.USER_ALL);
@@ -2490,7 +2552,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.revokeNotificationDelegate(PKG_O, UID_O);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
loadStreamXml(baos, false, UserHandle.USER_ALL);
@@ -2503,7 +2566,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.toggleNotificationDelegate(PKG_O, UID_O, false);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
loadStreamXml(baos, false, UserHandle.USER_ALL);
@@ -2522,7 +2586,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.revokeNotificationDelegate(PKG_O, UID_O);
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
loadStreamXml(baos, false, UserHandle.USER_ALL);
@@ -2541,7 +2606,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
assertEquals(BUBBLE_PREFERENCE_NONE, mHelper.getBubblePreference(PKG_O, UID_O));
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
loadStreamXml(baos, false, UserHandle.USER_ALL);
@@ -2596,7 +2662,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.getAppLockedFields(PKG_O, UID_O));
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
loadStreamXml(baos, false, UserHandle.USER_ALL);
@@ -2633,7 +2700,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
mHelper.getAppLockedFields(PKG_O, UID_O));
ByteArrayOutputStream baos = writeXmlAndPurge(PKG_O, UID_O, false, UserHandle.USER_ALL);
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
loadStreamXml(baos, false, UserHandle.USER_ALL);
@@ -3235,7 +3303,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
@Test
public void testPlaceholderConversationId_shortcutRequired() throws Exception {
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
final String xml = "<ranking version=\"1\">\n"
@@ -3254,7 +3323,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
@Test
public void testNormalConversationId_shortcutRequired() throws Exception {
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
final String xml = "<ranking version=\"1\">\n"
@@ -3273,7 +3343,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
@Test
public void testNoConversationId_shortcutRequired() throws Exception {
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
final String xml = "<ranking version=\"1\">\n"
@@ -3292,7 +3363,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
@Test
public void testDeleted_noTime() throws Exception {
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
final String xml = "<ranking version=\"1\">\n"
@@ -3311,7 +3383,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
@Test
public void testDeleted_twice() throws Exception {
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
mHelper.createNotificationChannel(
@@ -3322,7 +3395,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
@Test
public void testDeleted_recentTime() throws Exception {
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
mHelper.createNotificationChannel(
@@ -3339,7 +3413,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
parser.setInput(new BufferedInputStream(new ByteArrayInputStream(baos.toByteArray())),
null);
parser.nextTag();
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
mHelper.readXml(parser, true, UserHandle.USER_SYSTEM);
@@ -3350,7 +3425,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
@Test
public void testUnDelete_time() throws Exception {
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
mHelper.createNotificationChannel(
@@ -3369,7 +3445,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
@Test
public void testDeleted_longTime() throws Exception {
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper, mLogger,
mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
mPermissionHelper, mLogger,
mAppOpsManager, mStatsEventBuilderFactory);
long time = System.currentTimeMillis() - (DateUtils.DAY_IN_MILLIS * 30);

View File

@@ -48,6 +48,7 @@ import android.companion.ICompanionDeviceManager;
import android.content.Context;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.os.Looper;
import android.os.UserHandle;
import android.os.UserManager;