Use TVExtender channel on tv platforms.

Test: runtest sytemui-notification
Change-Id: I107bba298034778f1d7c0ba31896c4cbbc3fabe9
This commit is contained in:
Julia Reynolds
2017-01-30 08:54:53 -05:00
parent e0f2dc35df
commit 5f20e9fedf
2 changed files with 72 additions and 18 deletions

View File

@@ -17,6 +17,8 @@
package com.android.server.notification;
import static android.app.NotificationManager.IMPORTANCE_NONE;
import static android.content.pm.PackageManager.FEATURE_LEANBACK;
import static android.content.pm.PackageManager.FEATURE_TELEVISION;
import static android.service.notification.NotificationListenerService.REASON_APP_CANCEL;
import static android.service.notification.NotificationListenerService.REASON_APP_CANCEL_ALL;
import static android.service.notification.NotificationListenerService.REASON_CHANNEL_BANNED;
@@ -328,6 +330,7 @@ public class NotificationManagerService extends SystemService {
private SnoozeHelper mSnoozeHelper;
private GroupHelper mGroupHelper;
private boolean mIsTelevision;
private static class Archive {
final int mBufferSize;
@@ -1001,6 +1004,16 @@ public class NotificationManagerService extends SystemService {
mPackageManager = packageManager;
}
@VisibleForTesting
void setRankingHelper(RankingHelper rankingHelper) {
mRankingHelper = rankingHelper;
}
@VisibleForTesting
void setIsTelevision(boolean isTelevision) {
mIsTelevision = isTelevision;
}
// TODO: Tests should call onStart instead once the methods above are removed.
@VisibleForTesting
void init(Looper looper, IPackageManager packageManager, PackageManager packageManagerClient,
@@ -1191,6 +1204,9 @@ public class NotificationManagerService extends SystemService {
mArchive = new Archive(resources.getInteger(
R.integer.config_notificationServiceArchiveSize));
mIsTelevision = mPackageManagerClient.hasSystemFeature(FEATURE_LEANBACK)
|| mPackageManagerClient.hasSystemFeature(FEATURE_TELEVISION);
}
@Override
@@ -3002,8 +3018,12 @@ public class NotificationManagerService extends SystemService {
throw new IllegalArgumentException("null not allowed: pkg=" + pkg
+ " id=" + id + " notification=" + notification);
}
String channelId = notification.getChannel();
if (mIsTelevision && (new Notification.TvExtender(notification)).getChannel() != null) {
channelId = (new Notification.TvExtender(notification)).getChannel();
}
final NotificationChannel channel = mRankingHelper.getNotificationChannelWithFallback(pkg,
callingUid, notification.getChannel(), false /* includeDeleted */);
callingUid, channelId, false /* includeDeleted */);
final StatusBarNotification n = new StatusBarNotification(
pkg, opPkg, id, tag, callingUid, callingPid, notification,
user, null, System.currentTimeMillis());

View File

@@ -20,13 +20,12 @@ import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -42,25 +41,19 @@ import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.os.Binder;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.MessageQueue;
import android.os.UserHandle;
import android.service.notification.StatusBarNotification;
import android.support.test.annotation.UiThreadTest;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import com.android.server.lights.Light;
import com.android.server.lights.LightsManager;
@@ -71,8 +64,10 @@ public class NotificationManagerServiceTest {
private NotificationManagerService mNotificationManagerService;
private INotificationManager mBinderService;
private IPackageManager mPackageManager = mock(IPackageManager.class);
final PackageManager mPackageManagerClient = mock(PackageManager.class);
private Context mContext;
private HandlerThread mThread;
final RankingHelper mRankingHelper = mock(RankingHelper.class);
@Before
@Test
@@ -86,8 +81,7 @@ public class NotificationManagerServiceTest {
applicationInfo.uid = uid;
when(mPackageManager.getApplicationInfo(any(), anyInt(), anyInt()))
.thenReturn(applicationInfo);
final PackageManager mockPackageManagerClient = mock(PackageManager.class);
when(mockPackageManagerClient.getApplicationInfoAsUser(anyString(), anyInt(), anyInt()))
when(mPackageManagerClient.getApplicationInfoAsUser(anyString(), anyInt(), anyInt()))
.thenReturn(applicationInfo);
final LightsManager mockLightsManager = mock(LightsManager.class);
when(mockLightsManager.getLight(anyInt())).thenReturn(mock(Light.class));
@@ -102,7 +96,7 @@ public class NotificationManagerServiceTest {
new ComponentName(pkg, "test_class"), uid, true, null, 0));
mNotificationManagerService.init(mThread.getLooper(), mPackageManager,
mockPackageManagerClient, mockLightsManager, mockNotificationListeners);
mPackageManagerClient, mockLightsManager, mockNotificationListeners);
// Tests call directly into the Binder.
mBinderService = mNotificationManagerService.getBinderService();
@@ -127,17 +121,25 @@ public class NotificationManagerServiceTest {
}
private NotificationRecord generateNotificationRecord(NotificationChannel channel) {
return generateNotificationRecord(channel, null);
}
private NotificationRecord generateNotificationRecord(NotificationChannel channel,
Notification.TvExtender extender) {
if (channel == null) {
channel = new NotificationChannel("id", "name", NotificationManager.IMPORTANCE_DEFAULT);
}
Notification n = new Notification.Builder(mContext)
Notification.Builder nb = new Notification.Builder(mContext)
.setContentTitle("foo")
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.setPriority(Notification.PRIORITY_HIGH)
.build();
.setChannel(channel.getId())
.setPriority(Notification.PRIORITY_HIGH);
if (extender != null) {
nb.extend(extender);
}
StatusBarNotification sbn = new StatusBarNotification(mContext.getPackageName(),
mContext.getPackageName(), 1, "tag", uid, 0,
n, new UserHandle(uid), null, 0);
nb.build(), new UserHandle(uid), null, 0);
return new NotificationRecord(mContext, sbn, channel);
}
@@ -365,4 +367,36 @@ public class NotificationManagerServiceTest {
mBinderService.getActiveNotifications(sbn.getPackageName());
assertEquals(1, notifs.length);
}
@Test
@UiThreadTest
public void testTvExtenderChannelOverride_onTv() throws Exception {
mNotificationManagerService.setIsTelevision(true);
mNotificationManagerService.setRankingHelper(mRankingHelper);
when(mRankingHelper.getNotificationChannelWithFallback(
anyString(), anyInt(), eq("foo"), anyBoolean())).thenReturn(
new NotificationChannel("foo", "foo", NotificationManager.IMPORTANCE_HIGH));
Notification.TvExtender tv = new Notification.TvExtender().setChannel("foo");
mBinderService.enqueueNotificationWithTag(mContext.getPackageName(), "opPkg", "tag", 0,
generateNotificationRecord(null, tv).getNotification(), new int[1], 0);
verify(mRankingHelper, times(1)).getNotificationChannelWithFallback(
anyString(), anyInt(), eq("foo"), anyBoolean());
}
@Test
@UiThreadTest
public void testTvExtenderChannelOverride_notOnTv() throws Exception {
mNotificationManagerService.setIsTelevision(false);
mNotificationManagerService.setRankingHelper(mRankingHelper);
when(mRankingHelper.getNotificationChannelWithFallback(
anyString(), anyInt(), anyString(), anyBoolean())).thenReturn(
new NotificationChannel("id", "id", NotificationManager.IMPORTANCE_HIGH));
Notification.TvExtender tv = new Notification.TvExtender().setChannel("foo");
mBinderService.enqueueNotificationWithTag(mContext.getPackageName(), "opPkg", "tag", 0,
generateNotificationRecord(null, tv).getNotification(), new int[1], 0);
verify(mRankingHelper, times(1)).getNotificationChannelWithFallback(
anyString(), anyInt(), eq("id"), anyBoolean());
}
}