Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5f20e9fe authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Use TVExtender channel on tv platforms.

Test: runtest sytemui-notification
Change-Id: I107bba298034778f1d7c0ba31896c4cbbc3fabe9
parent e0f2dc35
Loading
Loading
Loading
Loading
+21 −1
Original line number Diff line number Diff line
@@ -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());
+51 −17
Original line number Diff line number Diff line
@@ -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());
    }
}