Merge "Add audio attributes to notificationchannel"

This commit is contained in:
Julia Reynolds
2017-01-30 19:37:01 +00:00
committed by Android (Google) Code Review
9 changed files with 191 additions and 108 deletions

View File

@@ -5423,6 +5423,7 @@ package android.app {
method public boolean canShowBadge();
method public int describeContents();
method public void enableVibration(boolean);
method public android.media.AudioAttributes getAudioAttributes();
method public java.lang.String getGroup();
method public java.lang.String getId();
method public int getImportance();
@@ -5436,7 +5437,7 @@ package android.app {
method public void setLights(boolean);
method public void setLockscreenVisibility(int);
method public void setShowBadge(boolean);
method public void setSound(android.net.Uri);
method public void setSound(android.net.Uri, android.media.AudioAttributes);
method public void setVibrationPattern(long[]);
method public boolean shouldShowLights();
method public boolean shouldVibrate();

View File

@@ -5599,6 +5599,7 @@ package android.app {
method public boolean canShowBadge();
method public int describeContents();
method public void enableVibration(boolean);
method public android.media.AudioAttributes getAudioAttributes();
method public java.lang.String getGroup();
method public java.lang.String getId();
method public int getImportance();
@@ -5617,7 +5618,7 @@ package android.app {
method public void setLights(boolean);
method public void setLockscreenVisibility(int);
method public void setShowBadge(boolean);
method public void setSound(android.net.Uri);
method public void setSound(android.net.Uri, android.media.AudioAttributes);
method public void setVibrationPattern(long[]);
method public boolean shouldShowLights();
method public boolean shouldVibrate();
@@ -5628,6 +5629,7 @@ package android.app {
field public static final java.lang.String DEFAULT_CHANNEL_ID = "miscellaneous";
field public static final int[] LOCKABLE_FIELDS;
field public static final int USER_LOCKED_ALLOWED = 64; // 0x40
field public static final int USER_LOCKED_AUDIO_ATTRIBUTES = 256; // 0x100
field public static final int USER_LOCKED_IMPORTANCE = 4; // 0x4
field public static final int USER_LOCKED_LIGHTS = 8; // 0x8
field public static final int USER_LOCKED_PRIORITY = 1; // 0x1

View File

@@ -5433,6 +5433,7 @@ package android.app {
method public boolean canShowBadge();
method public int describeContents();
method public void enableVibration(boolean);
method public android.media.AudioAttributes getAudioAttributes();
method public java.lang.String getGroup();
method public java.lang.String getId();
method public int getImportance();
@@ -5446,7 +5447,7 @@ package android.app {
method public void setLights(boolean);
method public void setLockscreenVisibility(int);
method public void setShowBadge(boolean);
method public void setSound(android.net.Uri);
method public void setSound(android.net.Uri, android.media.AudioAttributes);
method public void setVibrationPattern(long[]);
method public boolean shouldShowLights();
method public boolean shouldVibrate();

View File

@@ -22,6 +22,7 @@ import org.xmlpull.v1.XmlSerializer;
import android.annotation.SystemApi;
import android.app.NotificationManager;
import android.media.AudioAttributes;
import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
@@ -55,8 +56,9 @@ public final class NotificationChannel implements Parcelable {
private static final String ATT_VIBRATION = "vibration";
private static final String ATT_VIBRATION_ENABLED = "vibration_enabled";
private static final String ATT_SOUND = "sound";
//TODO: add audio attributes support
private static final String ATT_AUDIO_ATTRIBUTES = "audio_attributes";
private static final String ATT_USAGE = "usage";
private static final String ATT_FLAGS = "flags";
private static final String ATT_CONTENT_TYPE = "content_type";
private static final String ATT_SHOW_BADGE = "show_badge";
private static final String ATT_USER_LOCKED = "locked";
private static final String ATT_GROUP = "group";
@@ -105,6 +107,12 @@ public final class NotificationChannel implements Parcelable {
@SystemApi
public static final int USER_LOCKED_SHOW_BADGE = 0x00000080;
/**
* @hide
*/
@SystemApi
public static final int USER_LOCKED_AUDIO_ATTRIBUTES = 0x00000100;
/**
* @hide
*/
@@ -117,7 +125,8 @@ public final class NotificationChannel implements Parcelable {
USER_LOCKED_VIBRATION,
USER_LOCKED_SOUND,
USER_LOCKED_ALLOWED,
USER_LOCKED_SHOW_BADGE
USER_LOCKED_SHOW_BADGE,
USER_LOCKED_AUDIO_ATTRIBUTES
};
@@ -141,6 +150,7 @@ public final class NotificationChannel implements Parcelable {
private boolean mShowBadge = DEFAULT_SHOW_BADGE;
private boolean mDeleted = DEFAULT_DELETED;
private String mGroup;
private AudioAttributes mAudioAttributes = Notification.AUDIO_ATTRIBUTES_DEFAULT;
/**
* Creates a notification channel.
@@ -183,6 +193,7 @@ public final class NotificationChannel implements Parcelable {
} else {
mGroup = null;
}
mAudioAttributes = in.readInt() > 0 ? AudioAttributes.CREATOR.createFromParcel(in) : null;
}
@Override
@@ -215,6 +226,12 @@ public final class NotificationChannel implements Parcelable {
} else {
dest.writeByte((byte) 0);
}
if (mAudioAttributes != null) {
dest.writeInt(1);
mAudioAttributes.writeToParcel(dest, 0);
} else {
dest.writeInt(0);
}
}
/**
@@ -275,6 +292,9 @@ public final class NotificationChannel implements Parcelable {
*
* Group information is only used for presentation, not for behavior.
*
* Only modifiable before the channel is submitted to
* {@link NotificationManager#notify(String, int, Notification)}.
*
* @param groupId the id of a group created by
* {@link NotificationManager#createNotificationChannelGroup(NotificationChannelGroup)}.
*/
@@ -293,18 +313,23 @@ public final class NotificationChannel implements Parcelable {
}
/**
* Sets the sound that should be played for notifications posted to this channel if
* the notifications don't supply a sound. Only modifiable before the channel is submitted
* to the NotificationManager.
* Sets the sound that should be played for notifications posted to this channel and its
* audio attributes.
*
* Only modifiable before the channel is submitted to
* {@link NotificationManager#notify(String, int, Notification)}.
*/
public void setSound(Uri sound) {
public void setSound(Uri sound, AudioAttributes audioAttributes) {
this.mSound = sound;
this.mAudioAttributes = audioAttributes;
}
/**
* Sets whether notifications posted to this channel should display notification lights,
* on devices that support that feature. Only modifiable before the channel is submitted to
* the NotificationManager.
* on devices that support that feature.
*
* Only modifiable before the channel is submitted to
* {@link NotificationManager#notify(String, int, Notification)}.
*/
public void setLights(boolean lights) {
this.mLights = lights;
@@ -312,16 +337,20 @@ public final class NotificationChannel implements Parcelable {
/**
* Sets whether notification posted to this channel should vibrate. The vibration pattern can
* be set with {@link #setVibrationPattern(long[])}. Only modifiable before the channel is
* submitted to the NotificationManager.
* be set with {@link #setVibrationPattern(long[])}.
*
* Only modifiable before the channel is submitted to
* {@link NotificationManager#notify(String, int, Notification)}.
*/
public void enableVibration(boolean vibration) {
this.mVibrationEnabled = vibration;
}
/**
* Sets whether notification posted to this channel should vibrate. Only modifiable before the
* channel is submitted to the NotificationManager.
* Sets whether notification posted to this channel should vibrate.
*
* Only modifiable before the channel is submitted to
* {@link NotificationManager#notify(String, int, Notification)}.
*/
public void setVibrationPattern(long[] vibrationPattern) {
this.mVibration = vibrationPattern;
@@ -364,6 +393,13 @@ public final class NotificationChannel implements Parcelable {
return mSound;
}
/**
* Returns the audio attributes for sound played by notifications posted to this channel.
*/
public AudioAttributes getAudioAttributes() {
return mAudioAttributes;
}
/**
* Returns whether notifications posted to this channel trigger notification lights.
*/
@@ -438,7 +474,7 @@ public final class NotificationChannel implements Parcelable {
setBypassDnd(Notification.PRIORITY_DEFAULT
!= safeInt(parser, ATT_PRIORITY, Notification.PRIORITY_DEFAULT));
setLockscreenVisibility(safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY));
setSound(safeUri(parser, ATT_SOUND));
setSound(safeUri(parser, ATT_SOUND), safeAudioAttributes(parser));
setLights(safeBool(parser, ATT_LIGHTS, false));
enableVibration(safeBool(parser, ATT_VIBRATION_ENABLED, false));
setVibrationPattern(safeLongArray(parser, ATT_VIBRATION, null));
@@ -471,6 +507,12 @@ public final class NotificationChannel implements Parcelable {
if (getSound() != null) {
out.attribute(null, ATT_SOUND, getSound().toString());
}
if (getAudioAttributes() != null) {
out.attribute(null, ATT_USAGE, Integer.toString(getAudioAttributes().getUsage()));
out.attribute(null, ATT_CONTENT_TYPE,
Integer.toString(getAudioAttributes().getContentType()));
out.attribute(null, ATT_FLAGS, Integer.toString(getAudioAttributes().getFlags()));
}
if (shouldShowLights()) {
out.attribute(null, ATT_LIGHTS, Boolean.toString(shouldShowLights()));
}
@@ -517,6 +559,12 @@ public final class NotificationChannel implements Parcelable {
if (getSound() != null) {
record.put(ATT_SOUND, getSound().toString());
}
if (getAudioAttributes() != null) {
record.put(ATT_USAGE, Integer.toString(getAudioAttributes().getUsage()));
record.put(ATT_CONTENT_TYPE,
Integer.toString(getAudioAttributes().getContentType()));
record.put(ATT_FLAGS, Integer.toString(getAudioAttributes().getFlags()));
}
record.put(ATT_LIGHTS, Boolean.toString(shouldShowLights()));
record.put(ATT_VIBRATION_ENABLED, Boolean.toString(shouldVibrate()));
record.put(ATT_USER_LOCKED, Integer.toString(getUserLockedFields()));
@@ -527,6 +575,18 @@ public final class NotificationChannel implements Parcelable {
return record;
}
private static AudioAttributes safeAudioAttributes(XmlPullParser parser) {
int usage = safeInt(parser, ATT_USAGE, AudioAttributes.USAGE_NOTIFICATION);
int contentType = safeInt(parser, ATT_CONTENT_TYPE,
AudioAttributes.CONTENT_TYPE_SONIFICATION);
int flags = safeInt(parser, ATT_FLAGS, 0);
return new AudioAttributes.Builder()
.setUsage(usage)
.setContentType(contentType)
.setFlags(flags)
.build();
}
private static Uri safeUri(XmlPullParser parser, String att) {
final String val = parser.getAttributeValue(null, att);
return val == null ? null : Uri.parse(val);
@@ -618,7 +678,11 @@ public final class NotificationChannel implements Parcelable {
return false;
}
if (!Arrays.equals(mVibration, that.mVibration)) return false;
return getGroup() != null ? getGroup().equals(that.getGroup()) : that.getGroup() == null;
if (getGroup() != null ? !getGroup().equals(that.getGroup()) : that.getGroup() != null) {
return false;
}
return getAudioAttributes() != null ? getAudioAttributes().equals(that.getAudioAttributes())
: that.getAudioAttributes() == null;
}
@@ -637,6 +701,7 @@ public final class NotificationChannel implements Parcelable {
result = 31 * result + (mShowBadge ? 1 : 0);
result = 31 * result + (isDeleted() ? 1 : 0);
result = 31 * result + (getGroup() != null ? getGroup().hashCode() : 0);
result = 31 * result + (getAudioAttributes() != null ? getAudioAttributes().hashCode() : 0);
return result;
}
@@ -656,6 +721,7 @@ public final class NotificationChannel implements Parcelable {
", mShowBadge=" + mShowBadge +
", mDeleted=" + mDeleted +
", mGroup='" + mGroup + '\'' +
", mAudioAttributes=" + mAudioAttributes +
'}';
}
}

View File

@@ -205,18 +205,26 @@ public final class NotificationRecord {
private AudioAttributes calculateAttributes() {
final Notification n = sbn.getNotification();
AudioAttributes attributes = Notification.AUDIO_ATTRIBUTES_DEFAULT;
AudioAttributes attributes = getChannel().getAudioAttributes();
if (attributes == null) {
attributes = Notification.AUDIO_ATTRIBUTES_DEFAULT;
}
if (n.audioAttributes != null) {
// prefer audio attributes to stream type
attributes = n.audioAttributes;
} else if (n.audioStreamType >= 0 && n.audioStreamType < AudioSystem.getNumStreamTypes()) {
// the stream type is valid, use it
attributes = new AudioAttributes.Builder()
.setInternalLegacyStreamType(n.audioStreamType)
.build();
} else if (n.audioStreamType != AudioSystem.STREAM_DEFAULT) {
Log.w(TAG, String.format("Invalid stream type: %d", n.audioStreamType));
if (mPreChannelsNotification
&& (getChannel().getUserLockedFields()
& NotificationChannel.USER_LOCKED_SOUND) == 0) {
if (n.audioAttributes != null) {
// prefer audio attributes to stream type
attributes = n.audioAttributes;
} else if (n.audioStreamType >= 0
&& n.audioStreamType < AudioSystem.getNumStreamTypes()) {
// the stream type is valid, use it
attributes = new AudioAttributes.Builder()
.setInternalLegacyStreamType(n.audioStreamType)
.build();
} else if (n.audioStreamType != AudioSystem.STREAM_DEFAULT) {
Log.w(TAG, String.format("Invalid stream type: %d", n.audioStreamType));
}
}
return attributes;
}

View File

@@ -569,7 +569,7 @@ public class RankingHelper implements RankingConfig {
channel.setBypassDnd(updatedChannel.canBypassDnd());
}
if ((channel.getUserLockedFields() & NotificationChannel.USER_LOCKED_SOUND) == 0) {
channel.setSound(updatedChannel.getSound());
channel.setSound(updatedChannel.getSound(), updatedChannel.getAudioAttributes());
}
if ((channel.getUserLockedFields() & NotificationChannel.USER_LOCKED_VIBRATION) == 0) {
channel.enableVibration(updatedChannel.shouldVibrate());

View File

@@ -85,6 +85,10 @@ public class BuzzBeepBlinkTest {
300, 400, 300, 400, 300, 400, 300, 400, 300, 400, 300, 400,
300, 400, 300, 400, 300, 400, 300, 400, 300, 400, 300, 400 };
private static final Uri CUSTOM_SOUND = Settings.System.DEFAULT_ALARM_ALERT_URI;
private static final AudioAttributes CUSTOM_ATTRIBUTES = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN)
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.build();
private static final int CUSTOM_LIGHT_COLOR = Color.BLACK;
private static final int CUSTOM_LIGHT_ON = 10000;
private static final int CUSTOM_LIGHT_OFF = 10000;
@@ -200,10 +204,11 @@ public class BuzzBeepBlinkTest {
if (noisy) {
if (defaultSound) {
defaults |= Notification.DEFAULT_SOUND;
channel.setSound(Settings.System.DEFAULT_NOTIFICATION_URI);
channel.setSound(Settings.System.DEFAULT_NOTIFICATION_URI,
Notification.AUDIO_ATTRIBUTES_DEFAULT);
} else {
builder.setSound(CUSTOM_SOUND);
channel.setSound(CUSTOM_SOUND);
channel.setSound(CUSTOM_SOUND, CUSTOM_ATTRIBUTES);
}
}
if (buzzy) {
@@ -521,6 +526,8 @@ public class BuzzBeepBlinkTest {
verify(mVibrator, times(1)).vibrate(anyInt(), anyString(), eq(FALLBACK_VIBRATION),
eq(-1), (AudioAttributes) anyObject());
verify(mRingtonePlayer, never()).playAsync
(anyObject(), anyObject(), anyBoolean(), anyObject());
}
@Test

View File

@@ -118,6 +118,7 @@ public class NotificationRecordTest {
defaults |= Notification.DEFAULT_SOUND;
} else {
builder.setSound(CUSTOM_SOUND, CUSTOM_ATTRIBUTES);
channel.setSound(CUSTOM_SOUND, CUSTOM_ATTRIBUTES);
}
}
if (buzzy) {
@@ -150,29 +151,31 @@ public class NotificationRecordTest {
@Test
public void testSound_default_preUpgradeUsesNotification() throws Exception {
defaultChannel.setSound(null);
defaultChannel.setSound(null, null);
// pre upgrade, default sound.
StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */);
NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
assertEquals(Settings.System.DEFAULT_NOTIFICATION_URI, record.getSound());
assertEquals(Notification.AUDIO_ATTRIBUTES_DEFAULT, record.getAudioAttributes());
}
@Test
public void testSound_custom_preUpgradeUsesNotification() throws Exception {
defaultChannel.setSound(null);
defaultChannel.setSound(null, null);
// pre upgrade, custom sound.
StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
false /* defaultSound */, false /* buzzy */, false /* defaultBuzz */);
NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
assertEquals(CUSTOM_SOUND, record.getSound());
assertEquals(CUSTOM_ATTRIBUTES, record.getAudioAttributes());
}
@Test
public void testSound_default_userLocked_preUpgrade() throws Exception {
defaultChannel.setSound(CUSTOM_SOUND);
defaultChannel.setSound(CUSTOM_SOUND, CUSTOM_ATTRIBUTES);
defaultChannel.lockFields(NotificationChannel.USER_LOCKED_SOUND);
// pre upgrade, default sound.
StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
@@ -180,17 +183,19 @@ public class NotificationRecordTest {
NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
assertEquals(CUSTOM_SOUND, record.getSound());
assertEquals(CUSTOM_ATTRIBUTES, record.getAudioAttributes());
}
@Test
public void testSound_default_upgradeUsesChannel() throws Exception {
channel.setSound(CUSTOM_SOUND);
channel.setSound(CUSTOM_SOUND, CUSTOM_ATTRIBUTES);
// post upgrade, default sound.
StatusBarNotification sbn = getNotification(false /*preO */, true /* noisy */,
true /* defaultSound */, false /* buzzy */, false /* defaultBuzz */);
NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
assertEquals(CUSTOM_SOUND, record.getSound());
assertEquals(CUSTOM_ATTRIBUTES, record.getAudioAttributes());
}
@Test
@@ -238,28 +243,6 @@ public class NotificationRecordTest {
assertEquals(CUSTOM_CHANNEL_VIBRATION, record.getVibration());
}
@Test
public void testAudioAttributes_preUpgrade() throws Exception {
defaultChannel.setSound(null);
// pre upgrade, default sound.
StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
false /* defaultSound */, false /* buzzy */, false /* defaultBuzz */);
NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
assertEquals(CUSTOM_ATTRIBUTES, record.getAudioAttributes());
}
@Test
public void testAudioAttributes_upgrade() throws Exception {
channel.setSound(null);
// post upgrade, default sound.
StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,
false /* defaultSound */, false /* buzzy */, false /* defaultBuzz */);
NotificationRecord record = new NotificationRecord(mMockContext, sbn, defaultChannel);
assertEquals(CUSTOM_ATTRIBUTES, record.getAudioAttributes());
}
@Test
public void testImportance_preUpgrade() throws Exception {
StatusBarNotification sbn = getNotification(true /*preO */, true /* noisy */,

View File

@@ -36,6 +36,7 @@ import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.media.AudioAttributes;
import android.net.Uri;
import android.os.Build;
import android.os.UserHandle;
@@ -66,9 +67,12 @@ import static org.mockito.Mockito.when;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class RankingHelperTest {
@Mock NotificationUsageStats mUsageStats;
@Mock RankingHandler handler;
@Mock PackageManager mPm;
@Mock
NotificationUsageStats mUsageStats;
@Mock
RankingHandler handler;
@Mock
PackageManager mPm;
private Notification mNotiGroupGSortA;
private Notification mNotiGroupGSortB;
@@ -85,6 +89,7 @@ public class RankingHelperTest {
private final int uid = 0;
private final String pkg2 = "pkg2";
private final int uid2 = 1111111;
private AudioAttributes mAudioAttributes;
private Context getContext() {
return InstrumentationRegistry.getTargetContext();
@@ -96,7 +101,7 @@ public class RankingHelperTest {
UserHandle user = UserHandle.ALL;
mHelper = new RankingHelper(getContext(), mPm, handler, mUsageStats,
new String[] {ImportanceExtractor.class.getName()});
new String[]{ImportanceExtractor.class.getName()});
mNotiGroupGSortA = new Notification.Builder(getContext())
.setContentTitle("A")
@@ -143,6 +148,12 @@ public class RankingHelperTest {
"package", "package", 1, null, 0, 0, mNotiNoGroupSortA, user,
null, System.currentTimeMillis()), getDefaultChannel());
mAudioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_UNKNOWN)
.setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE)
.setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
.build();
final ApplicationInfo legacy = new ApplicationInfo();
legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1;
final ApplicationInfo upgrade = new ApplicationInfo();
@@ -150,7 +161,8 @@ public class RankingHelperTest {
try {
when(mPm.getApplicationInfoAsUser(eq(pkg), anyInt(), anyInt())).thenReturn(legacy);
when(mPm.getApplicationInfoAsUser(eq(pkg2), anyInt(), anyInt())).thenReturn(upgrade);
} catch (PackageManager.NameNotFoundException e) {}
} catch (PackageManager.NameNotFoundException e) {
}
}
private NotificationChannel getDefaultChannel() {
@@ -187,6 +199,7 @@ public class RankingHelperTest {
assertEquals(expected.canBypassDnd(), actual.canBypassDnd());
assertTrue(Arrays.equals(expected.getVibrationPattern(), actual.getVibrationPattern()));
assertEquals(expected.getGroup(), actual.getGroup());
assertEquals(expected.getAudioAttributes(), actual.getAudioAttributes());
}
@Test
@@ -246,13 +259,13 @@ public class RankingHelperTest {
new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
NotificationChannel channel2 =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel2.setSound(new Uri.Builder().scheme("test").build());
channel2.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
channel2.setLights(true);
channel2.setBypassDnd(true);
channel2.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
channel2.enableVibration(true);
channel2.setGroup(ncg.getId());
channel2.setVibrationPattern(new long[] {100, 67, 145, 156});
channel2.setVibrationPattern(new long[]{100, 67, 145, 156});
mHelper.createNotificationChannelGroup(pkg, uid, ncg, true);
mHelper.createNotificationChannel(pkg, uid, channel1, true);
@@ -304,13 +317,13 @@ public class RankingHelperTest {
pkg, uid, NotificationChannel.DEFAULT_CHANNEL_ID, false);
assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, updated.getImportance());
assertFalse(updated.canBypassDnd());
assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE,updated.getLockscreenVisibility());
assertEquals(NotificationManager.VISIBILITY_NO_OVERRIDE, updated.getLockscreenVisibility());
assertEquals(0, updated.getUserLockedFields());
}
@Test
public void testChannelXml_defaultChannelUpdatedApp_userSettings() throws Exception {
NotificationChannel channel1 =
NotificationChannel channel1 =
new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_MIN);
mHelper.createNotificationChannel(pkg, uid, channel1, true);
@@ -335,15 +348,16 @@ public class RankingHelperTest {
@Test
public void testChannelXml_upgradeCreateDefaultChannel() throws Exception {
final String preupgradeXml = "<ranking version=\"1\">\n"
+ "<package name=\"" + pkg + "\" importance=\"" + NotificationManager.IMPORTANCE_HIGH
+ "\" priority=\"" + Notification.PRIORITY_MAX + "\" visibility=\""
+ Notification.VISIBILITY_SECRET + "\"" +" uid=\"" + uid + "\" />\n"
+ "<package name=\"" + pkg2 + "\" uid=\"" + uid2 + "\" visibility=\""
+ Notification.VISIBILITY_PRIVATE + "\" />\n"
+ "</ranking>";
+ "<package name=\"" + pkg + "\" importance=\""
+ NotificationManager.IMPORTANCE_HIGH
+ "\" priority=\"" + Notification.PRIORITY_MAX + "\" visibility=\""
+ Notification.VISIBILITY_SECRET + "\"" + " uid=\"" + uid + "\" />\n"
+ "<package name=\"" + pkg2 + "\" uid=\"" + uid2 + "\" visibility=\""
+ Notification.VISIBILITY_PRIVATE + "\" />\n"
+ "</ranking>";
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new BufferedInputStream(new ByteArrayInputStream(preupgradeXml.getBytes())),
null);
null);
parser.nextTag();
mHelper.readXml(parser, false);
@@ -353,8 +367,8 @@ public class RankingHelperTest {
assertTrue(updated1.canBypassDnd());
assertEquals(Notification.VISIBILITY_SECRET, updated1.getLockscreenVisibility());
assertEquals(NotificationChannel.USER_LOCKED_IMPORTANCE
| NotificationChannel.USER_LOCKED_PRIORITY
| NotificationChannel.USER_LOCKED_VISIBILITY, updated1.getUserLockedFields());
| NotificationChannel.USER_LOCKED_PRIORITY
| NotificationChannel.USER_LOCKED_VISIBILITY, updated1.getUserLockedFields());
final NotificationChannel updated2 = mHelper.getNotificationChannel(
pkg2, uid2, NotificationChannel.DEFAULT_CHANNEL_ID, false);
@@ -382,14 +396,14 @@ public class RankingHelperTest {
public void testUpdate_userLockedImportance() throws Exception {
// all fields locked by user
final NotificationChannel channel =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.lockFields(NotificationChannel.USER_LOCKED_IMPORTANCE);
mHelper.createNotificationChannel(pkg, uid, channel, false);
// same id, try to update
final NotificationChannel channel2 =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
mHelper.updateNotificationChannelFromAssistant(pkg, uid, channel2);
@@ -401,7 +415,7 @@ public class RankingHelperTest {
public void testUpdate_userLockedVisibility() throws Exception {
// all fields locked by user
final NotificationChannel channel =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
channel.lockFields(NotificationChannel.USER_LOCKED_VISIBILITY);
@@ -409,7 +423,7 @@ public class RankingHelperTest {
// same id, try to update
final NotificationChannel channel2 =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
channel2.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
mHelper.updateNotificationChannelFromAssistant(pkg, uid, channel2);
@@ -422,7 +436,7 @@ public class RankingHelperTest {
public void testUpdate_userLockedVibration() throws Exception {
// all fields locked by user
final NotificationChannel channel =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.setLights(false);
channel.lockFields(NotificationChannel.USER_LOCKED_VIBRATION);
@@ -430,9 +444,9 @@ public class RankingHelperTest {
// same id, try to update
final NotificationChannel channel2 =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
channel2.enableVibration(true);
channel2.setVibrationPattern(new long[] {100});
channel2.setVibrationPattern(new long[]{100});
mHelper.updateNotificationChannelFromAssistant(pkg, uid, channel2);
@@ -444,7 +458,7 @@ public class RankingHelperTest {
public void testUpdate_userLockedLights() throws Exception {
// all fields locked by user
final NotificationChannel channel =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.setLights(false);
channel.lockFields(NotificationChannel.USER_LOCKED_LIGHTS);
@@ -452,7 +466,7 @@ public class RankingHelperTest {
// same id, try to update
final NotificationChannel channel2 =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
channel2.setLights(true);
mHelper.updateNotificationChannelFromAssistant(pkg, uid, channel2);
@@ -465,7 +479,7 @@ public class RankingHelperTest {
public void testUpdate_userLockedPriority() throws Exception {
// all fields locked by user
final NotificationChannel channel =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.setBypassDnd(true);
channel.lockFields(NotificationChannel.USER_LOCKED_PRIORITY);
@@ -473,7 +487,7 @@ public class RankingHelperTest {
// same id, try to update all fields
final NotificationChannel channel2 =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
channel2.setBypassDnd(false);
mHelper.updateNotificationChannelFromAssistant(pkg, uid, channel2);
@@ -486,16 +500,16 @@ public class RankingHelperTest {
public void testUpdate_userLockedRingtone() throws Exception {
// all fields locked by user
final NotificationChannel channel =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.setSound(new Uri.Builder().scheme("test").build());
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
channel.lockFields(NotificationChannel.USER_LOCKED_SOUND);
mHelper.createNotificationChannel(pkg, uid, channel, false);
// same id, try to update all fields
final NotificationChannel channel2 =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
channel2.setSound(new Uri.Builder().scheme("test2").build());
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
channel2.setSound(new Uri.Builder().scheme("test2").build(), mAudioAttributes);
mHelper.updateNotificationChannelFromAssistant(pkg, uid, channel2);
@@ -527,7 +541,7 @@ public class RankingHelperTest {
// no fields locked by user
final NotificationChannel channel =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.setSound(new Uri.Builder().scheme("test").build());
channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
channel.setLights(true);
channel.setBypassDnd(true);
channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
@@ -537,7 +551,7 @@ public class RankingHelperTest {
// same id, try to update all fields
final NotificationChannel channel2 =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_HIGH);
channel2.setSound(new Uri.Builder().scheme("test2").build());
channel2.setSound(new Uri.Builder().scheme("test2").build(), mAudioAttributes);
channel2.setLights(false);
channel2.setBypassDnd(false);
channel2.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
@@ -559,7 +573,7 @@ public class RankingHelperTest {
public void testCreateChannel_CannotChangeHiddenFields() throws Exception {
final NotificationChannel channel =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.setSound(new Uri.Builder().scheme("test").build());
channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
channel.setLights(true);
channel.setBypassDnd(true);
channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
@@ -586,7 +600,7 @@ public class RankingHelperTest {
public void testCreateChannel_CannotChangeHiddenFieldsAssistant() throws Exception {
final NotificationChannel channel =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.setSound(new Uri.Builder().scheme("test").build());
channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
channel.setLights(true);
channel.setBypassDnd(true);
channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
@@ -613,12 +627,12 @@ public class RankingHelperTest {
public void testGetDeletedChannel() throws Exception {
NotificationChannel channel =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.setSound(new Uri.Builder().scheme("test").build());
channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
channel.setLights(true);
channel.setBypassDnd(true);
channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
channel.enableVibration(true);
channel.setVibrationPattern(new long[] {100, 67, 145, 156});
channel.setVibrationPattern(new long[]{100, 67, 145, 156});
mHelper.createNotificationChannel(pkg, uid, channel, true);
mHelper.deleteNotificationChannel(pkg, uid, channel.getId());
@@ -639,12 +653,12 @@ public class RankingHelperTest {
Map<String, NotificationChannel> channelMap = new HashMap<>();
NotificationChannel channel =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.setSound(new Uri.Builder().scheme("test").build());
channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
channel.setLights(true);
channel.setBypassDnd(true);
channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
channel.enableVibration(true);
channel.setVibrationPattern(new long[] {100, 67, 145, 156});
channel.setVibrationPattern(new long[]{100, 67, 145, 156});
channelMap.put(channel.getId(), channel);
NotificationChannel channel2 =
new NotificationChannel("id4", "a", NotificationManager.IMPORTANCE_HIGH);
@@ -665,7 +679,7 @@ public class RankingHelperTest {
}
// Returns deleted channels too
channels = mHelper.getNotificationChannels(pkg, uid, true).getList();
channels = mHelper.getNotificationChannels(pkg, uid, true).getList();
assertEquals(3, channels.size()); // Includes default channel
for (NotificationChannel nc : channels) {
if (!NotificationChannel.DEFAULT_CHANNEL_ID.equals(nc.getId())) {
@@ -682,7 +696,7 @@ public class RankingHelperTest {
mHelper.deleteNotificationChannel(pkg, uid, channel.getId());
channel.setSound(new Uri.Builder().scheme("test").build());
channel.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
try {
mHelper.updateNotificationChannel(pkg, uid, channel);
fail("Updated deleted channel");
@@ -700,7 +714,7 @@ public class RankingHelperTest {
@Test
public void testCreateDeletedChannel() throws Exception {
long[] vibration = new long[] {100, 67, 145, 156};
long[] vibration = new long[]{100, 67, 145, 156};
NotificationChannel channel =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.setVibrationPattern(vibration);
@@ -710,7 +724,7 @@ public class RankingHelperTest {
NotificationChannel newChannel = new NotificationChannel(
channel.getId(), channel.getName(), NotificationManager.IMPORTANCE_HIGH);
newChannel.setVibrationPattern(new long[] {100});
newChannel.setVibrationPattern(new long[]{100});
mHelper.createNotificationChannel(pkg, uid, newChannel, true);
@@ -721,7 +735,7 @@ public class RankingHelperTest {
@Test
public void testCreateChannel_alreadyExists() throws Exception {
long[] vibration = new long[] {100, 67, 145, 156};
long[] vibration = new long[]{100, 67, 145, 156};
NotificationChannel channel =
new NotificationChannel("id2", "name2", NotificationManager.IMPORTANCE_LOW);
channel.setVibrationPattern(vibration);
@@ -730,7 +744,7 @@ public class RankingHelperTest {
NotificationChannel newChannel = new NotificationChannel(
channel.getId(), channel.getName(), NotificationManager.IMPORTANCE_HIGH);
newChannel.setVibrationPattern(new long[] {100});
newChannel.setVibrationPattern(new long[]{100});
mHelper.createNotificationChannel(pkg, uid, newChannel, true);
@@ -816,7 +830,8 @@ public class RankingHelperTest {
try {
mHelper.createNotificationChannel(pkg, uid, channel1, true);
fail("Created a channel with a bad group");
} catch (IllegalArgumentException e) {}
} catch (IllegalArgumentException e) {
}
}
@Test
@@ -862,11 +877,11 @@ public class RankingHelperTest {
List<NotificationChannelGroup> actual =
mHelper.getNotificationChannelGroups(pkg, uid, true).getList();
assertEquals(3, actual.size());
for (NotificationChannelGroup group: actual) {
for (NotificationChannelGroup group : actual) {
if (group.getId() == null) {
assertEquals(2, group.getChannels().size()); // misc channel too
assertTrue(channel3.getId().equals(group.getChannels().get(0).getId())
|| channel3.getId().equals(group.getChannels().get(1).getId()));
|| channel3.getId().equals(group.getChannels().get(1).getId()));
} else if (group.getId().equals(ncg.getId())) {
assertEquals(2, group.getChannels().size());
if (group.getChannels().get(0).getId().equals(channel1.getId())) {