18a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds/*
28a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds * Copyright (C) 2017 The Android Open Source Project
38a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds *
48a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds * Licensed under the Apache License, Version 2.0 (the "License");
58a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds * you may not use this file except in compliance with the License.
68a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds * You may obtain a copy of the License at
78a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds *
88a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds *      http://www.apache.org/licenses/LICENSE-2.0
98a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds *
108a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds * Unless required by applicable law or agreed to in writing, software
118a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds * distributed under the License is distributed on an "AS IS" BASIS,
128a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds * See the License for the specific language governing permissions and
148a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds * limitations under the License
158a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds */
168a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
178a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldspackage com.android.server.notification;
188a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
198a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport static junit.framework.Assert.assertEquals;
208a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport static junit.framework.Assert.assertNotNull;
218a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport static junit.framework.Assert.assertNull;
228a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
237217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynoldsimport static org.junit.Assert.assertFalse;
248a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport static org.junit.Assert.assertTrue;
257217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynoldsimport static org.mockito.Mockito.mock;
268a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport static org.mockito.Mockito.spy;
278a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport static org.mockito.Mockito.when;
2830f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsenimport static org.mockito.Matchers.any;
2930f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsenimport static org.mockito.Matchers.anyInt;
308a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
318a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport android.app.ActivityManager;
328a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport android.app.Notification;
339acd673c0deb2652a55c52b9b80515d84b1945dcSelim Cinekimport android.app.Person;
347217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynoldsimport android.app.PendingIntent;
357217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynoldsimport android.app.RemoteInput;
368a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport android.content.Context;
378a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport android.content.pm.ApplicationInfo;
3830f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsenimport android.content.pm.PackageManager;
3930f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsenimport android.content.res.Resources;
407217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynoldsimport android.graphics.Bitmap;
418a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport android.graphics.Color;
42a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynoldsimport android.graphics.Typeface;
437217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynoldsimport android.graphics.drawable.Icon;
447217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynoldsimport android.net.Uri;
458a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport android.os.Build;
468a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport android.support.test.filters.SmallTest;
478a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport android.support.test.runner.AndroidJUnit4;
48a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynoldsimport android.text.SpannableStringBuilder;
49a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynoldsimport android.text.Spanned;
50a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynoldsimport android.text.style.StyleSpan;
517217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynoldsimport android.widget.RemoteViews;
528a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
5374f5e36f49b32baef90bf31bbbaf487c18002944Jason Monkimport com.android.server.UiServiceTestCase;
5474f5e36f49b32baef90bf31bbbaf487c18002944Jason Monk
558a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport org.junit.Before;
568a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport org.junit.Test;
578a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport org.junit.runner.RunWith;
588a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport org.mockito.Mock;
598a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynoldsimport org.mockito.MockitoAnnotations;
608a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
618a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds@RunWith(AndroidJUnit4.class)
628a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds@SmallTest
6374f5e36f49b32baef90bf31bbbaf487c18002944Jason Monkpublic class NotificationTest extends UiServiceTestCase {
648a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
658a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds    @Mock
668a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds    ActivityManager mAm;
678a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
6830f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen    @Mock
6930f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen    Resources mResources;
7030f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen
718a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds    @Before
728a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds    public void setUp() {
738a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        MockitoAnnotations.initMocks(this);
748a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds    }
758a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
768a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds    @Test
7730f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen    public void testStripsExtendersInLowRamModeNoWhitelistNoTv() {
788a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        Notification.Builder nb = new Notification.Builder(mContext, "channel");
798a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        nb.extend(new Notification.CarExtender().setColor(Color.RED));
808a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        nb.extend(new Notification.TvExtender().setChannelId("different channel"));
818a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        nb.extend(new Notification.WearableExtender().setDismissalId("dismiss"));
828a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        Notification before = nb.build();
838a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
8430f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        // No whitelist
8530f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        Context context = spy(getContext());
8630f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        when(context.getResources()).thenReturn(mResources);
8730f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        when(mResources.getStringArray(anyInt())).thenReturn(new String[0]);
8830f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen
8930f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, true,
9030f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen                context);
918a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
928a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertEquals("different channel", new Notification.TvExtender(before).getChannelId());
938a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertNull(new Notification.TvExtender(after).getChannelId());
948a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
958a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertEquals(Color.RED, new Notification.CarExtender(before).getColor());
968a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertEquals(Notification.COLOR_DEFAULT, new Notification.CarExtender(after).getColor());
978a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
988a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertEquals("dismiss", new Notification.WearableExtender(before).getDismissalId());
998a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertNull(new Notification.WearableExtender(after).getDismissalId());
1008a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds    }
1018a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
1028a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds    @Test
10330f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen    public void testStripsExtendersInLowRamModeHasWhitelist() {
10430f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        Notification.Builder nb = new Notification.Builder(mContext, "channel");
10530f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        nb.extend(new Notification.CarExtender().setColor(Color.RED));
10630f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        nb.extend(new Notification.TvExtender().setChannelId("different channel"));
10730f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        nb.extend(new Notification.WearableExtender().setDismissalId("dismiss"));
10830f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        Notification before = nb.build();
10930f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen
11030f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        // Has whitelist
11130f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        Context context = spy(mContext);
11230f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        when(context.getResources()).thenReturn(mResources);
11330f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        when(mResources.getStringArray(anyInt())).thenReturn(new String[1]);
11430f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen
11530f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, true,
11630f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen                context);
11730f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen
11830f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        assertEquals("different channel", new Notification.TvExtender(before).getChannelId());
11930f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        assertEquals("different channel", new Notification.TvExtender(after).getChannelId());
12030f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen
12130f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        assertEquals(Color.RED, new Notification.CarExtender(before).getColor());
12230f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        assertEquals(Color.RED, new Notification.CarExtender(after).getColor());
12330f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen
12430f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        assertEquals("dismiss", new Notification.WearableExtender(before).getDismissalId());
12530f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        assertEquals("dismiss", new Notification.WearableExtender(after).getDismissalId());
12630f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen    }
12730f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen
12830f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen    @Test
1298a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds    public void testStripsRemoteViewsInLowRamMode() {
13030f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        Context context = spy(mContext);
1318a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        ApplicationInfo ai = new ApplicationInfo();
1328a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        ai.targetSdkVersion = Build.VERSION_CODES.M;
1338a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        when(context.getApplicationInfo()).thenReturn(ai);
1348a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
1358a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        final Notification.BigTextStyle style = new Notification.BigTextStyle()
1368a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds                .bigText("hello")
1378a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds                .setSummaryText("And the summary");
1388a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        Notification before = new Notification.Builder(context, "channel")
1398a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds                .setContentText("hi")
1408a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds                .setStyle(style)
1418a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds                .build();
1428a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
14330f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, true,
14430f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen                mContext);
1458a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertNotNull(before.contentView);
1468a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertNotNull(before.bigContentView);
1478a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertNotNull(before.headsUpContentView);
1488a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertNull(after.contentView);
1498a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertNull(after.bigContentView);
1508a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertNull(after.headsUpContentView);
1518a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds    }
1528a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
1538a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds    @Test
1548a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds    public void testDoesNotStripsExtendersInNormalRamMode() {
1558a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        Notification.Builder nb = new Notification.Builder(mContext, "channel");
1568a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        nb.extend(new Notification.CarExtender().setColor(Color.RED));
1578a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        nb.extend(new Notification.TvExtender().setChannelId("different channel"));
1588a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        nb.extend(new Notification.WearableExtender().setDismissalId("dismiss"));
1598a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        Notification before = nb.build();
16030f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen        Notification after = Notification.Builder.maybeCloneStrippedForDelivery(before, false,
16130f59b26356f59a1e38b8b7b4879b19532ff085cKristian Monsen                mContext);
1628a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
1638a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertTrue(before == after);
1648a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
1658a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertEquals("different channel", new Notification.TvExtender(before).getChannelId());
1668a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertEquals(Color.RED, new Notification.CarExtender(before).getColor());
1678a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds        assertEquals("dismiss", new Notification.WearableExtender(before).getDismissalId());
1688a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds    }
1697217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
1707217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
1717217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testStyleChangeVisiblyDifferent_noStyles() {
1727217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder n1 = new Notification.Builder(mContext, "test");
1737217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder n2 = new Notification.Builder(mContext, "test");
1747217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
1757217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertFalse(Notification.areStyledNotificationsVisiblyDifferent(n1, n2));
1767217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
1777217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
1787217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
1797217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testStyleChangeVisiblyDifferent_noStyleToStyle() {
1807217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder n1 = new Notification.Builder(mContext, "test");
1817217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder n2 = new Notification.Builder(mContext, "test")
1827217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.BigTextStyle());
1837217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
1847217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areStyledNotificationsVisiblyDifferent(n1, n2));
1857217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
1867217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
1877217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
1887217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testStyleChangeVisiblyDifferent_styleToNoStyle() {
1897217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder n2 = new Notification.Builder(mContext, "test");
1907217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder n1 = new Notification.Builder(mContext, "test")
1917217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.BigTextStyle());
1927217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
1937217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areStyledNotificationsVisiblyDifferent(n1, n2));
1947217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
1957217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
1967217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
1977217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testStyleChangeVisiblyDifferent_changeStyle() {
1987217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder n1 = new Notification.Builder(mContext, "test")
1997217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.InboxStyle());
2007217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder n2 = new Notification.Builder(mContext, "test")
2017217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.BigTextStyle());
2027217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2037217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areStyledNotificationsVisiblyDifferent(n1, n2));
2047217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
2057217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2067217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
2077217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testInboxTextChange() {
2087217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nInbox1 = new Notification.Builder(mContext, "test")
2097217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.InboxStyle().addLine("a").addLine("b"));
2107217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nInbox2 = new Notification.Builder(mContext, "test")
2117217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.InboxStyle().addLine("b").addLine("c"));
2127217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2137217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nInbox1, nInbox2));
2147217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
2157217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2167217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
2177217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testBigTextTextChange() {
2187217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nBigText1 = new Notification.Builder(mContext, "test")
2197217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.BigTextStyle().bigText("something"));
2207217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nBigText2 = new Notification.Builder(mContext, "test")
2217217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.BigTextStyle().bigText("else"));
2227217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2237217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nBigText1, nBigText2));
2247217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
2257217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2267217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
2277217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testBigPictureChange() {
2287d67bd4fd7fb6810edebd1c61a96530077c74edaDan Sandler        Bitmap bitA = mock(Bitmap.class);
2297d67bd4fd7fb6810edebd1c61a96530077c74edaDan Sandler        when(bitA.getGenerationId()).thenReturn(100);
2307d67bd4fd7fb6810edebd1c61a96530077c74edaDan Sandler        Bitmap bitB = mock(Bitmap.class);
2317d67bd4fd7fb6810edebd1c61a96530077c74edaDan Sandler        when(bitB.getGenerationId()).thenReturn(200);
2327d67bd4fd7fb6810edebd1c61a96530077c74edaDan Sandler
2337217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nBigPic1 = new Notification.Builder(mContext, "test")
2347d67bd4fd7fb6810edebd1c61a96530077c74edaDan Sandler                .setStyle(new Notification.BigPictureStyle().bigPicture(bitA));
2357217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nBigPic2 = new Notification.Builder(mContext, "test")
2367d67bd4fd7fb6810edebd1c61a96530077c74edaDan Sandler                .setStyle(new Notification.BigPictureStyle().bigPicture(bitB));
2377217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2387217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nBigPic1, nBigPic2));
2397217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
2407217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2417217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
2427217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testMessagingChange_text() {
2437217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nM1 = new Notification.Builder(mContext, "test")
2447217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.MessagingStyle("")
2457217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .addMessage(new Notification.MessagingStyle.Message(
2469acd673c0deb2652a55c52b9b80515d84b1945dcSelim Cinek                                "a", 100, mock(Person.class))));
2477217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nM2 = new Notification.Builder(mContext, "test")
2487217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.MessagingStyle("")
2497217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .addMessage(new Notification.MessagingStyle.Message(
2509acd673c0deb2652a55c52b9b80515d84b1945dcSelim Cinek                                "a", 100, mock(Person.class)))
2517217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .addMessage(new Notification.MessagingStyle.Message(
2529acd673c0deb2652a55c52b9b80515d84b1945dcSelim Cinek                                "b", 100, mock(Person.class)))
2537217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                );
2547217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2557217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nM1, nM2));
2567217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
2577217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2587217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
2597217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testMessagingChange_data() {
2607217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nM1 = new Notification.Builder(mContext, "test")
2617217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.MessagingStyle("")
2627217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .addMessage(new Notification.MessagingStyle.Message(
2637217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                                "a", 100, mock(Person.class))
2647217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                                .setData("text", mock(Uri.class))));
2657217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nM2 = new Notification.Builder(mContext, "test")
2667217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.MessagingStyle("")
2677217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .addMessage(new Notification.MessagingStyle.Message(
2687217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                                "a", 100, mock(Person.class))));
2697217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2707217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nM1, nM2));
2717217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
2727217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2737217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
2747217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testMessagingChange_sender() {
2757217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Person a = mock(Person.class);
2767217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        when(a.getName()).thenReturn("A");
2777217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Person b = mock(Person.class);
2787217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        when(b.getName()).thenReturn("b");
2797217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nM1 = new Notification.Builder(mContext, "test")
2807217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.MessagingStyle("")
2817217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .addMessage(new Notification.MessagingStyle.Message("a", 100, b)));
2827217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nM2 = new Notification.Builder(mContext, "test")
2837217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.MessagingStyle("")
2847217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .addMessage(new Notification.MessagingStyle.Message("a", 100, a)));
2857217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2867217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nM1, nM2));
2877217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
2887217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
2897217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
2907217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testMessagingChange_key() {
2917217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Person a = mock(Person.class);
2927217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        when(a.getKey()).thenReturn("A");
2937217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Person b = mock(Person.class);
2947217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        when(b.getKey()).thenReturn("b");
2957217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nM1 = new Notification.Builder(mContext, "test")
2967217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.MessagingStyle("")
2977217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .addMessage(new Notification.MessagingStyle.Message("a", 100, a)));
2987217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nM2 = new Notification.Builder(mContext, "test")
2997217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.MessagingStyle("")
3007217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .addMessage(new Notification.MessagingStyle.Message("a", 100, b)));
3017217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
3027217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areStyledNotificationsVisiblyDifferent(nM1, nM2));
3037217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
3047217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
3057217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
3067217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testMessagingChange_ignoreTimeChange() {
3077217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nM1 = new Notification.Builder(mContext, "test")
3087217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.MessagingStyle("")
3097217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .addMessage(new Notification.MessagingStyle.Message(
3109acd673c0deb2652a55c52b9b80515d84b1945dcSelim Cinek                                "a", 100, mock(Person.class))));
3117217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder nM2 = new Notification.Builder(mContext, "test")
3127217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setStyle(new Notification.MessagingStyle("")
3137217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .addMessage(new Notification.MessagingStyle.Message(
3149acd673c0deb2652a55c52b9b80515d84b1945dcSelim Cinek                                "a", 1000, mock(Person.class)))
3157217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                );
3167217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
3177217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertFalse(Notification.areStyledNotificationsVisiblyDifferent(nM1, nM2));
3187217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
3197217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
3207217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
3217217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testRemoteViews_nullChange() {
3227217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder n1 = new Notification.Builder(mContext, "test")
3237217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setContent(mock(RemoteViews.class));
3247217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification.Builder n2 = new Notification.Builder(mContext, "test");
3257217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areRemoteViewsChanged(n1, n2));
3267217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
3277217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        n1 = new Notification.Builder(mContext, "test");
3287217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        n2 = new Notification.Builder(mContext, "test")
3297217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setContent(mock(RemoteViews.class));
3307217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areRemoteViewsChanged(n1, n2));
3317217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
3327217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        n1 = new Notification.Builder(mContext, "test")
3337217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setCustomBigContentView(mock(RemoteViews.class));
3347217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        n2 = new Notification.Builder(mContext, "test");
3357217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areRemoteViewsChanged(n1, n2));
3367217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
3377217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        n1 = new Notification.Builder(mContext, "test");
3387217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        n2 = new Notification.Builder(mContext, "test")
3397217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .setCustomBigContentView(mock(RemoteViews.class));
3407217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areRemoteViewsChanged(n1, n2));
3417217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
3427217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        n1 = new Notification.Builder(mContext, "test");
3437217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        n2 = new Notification.Builder(mContext, "test");
3447217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertFalse(Notification.areRemoteViewsChanged(n1, n2));
3457217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
3467217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
3477217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
348e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds    public void testRemoteViews_layoutChange() {
349e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        RemoteViews a = mock(RemoteViews.class);
350e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        when(a.getLayoutId()).thenReturn(234);
351e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        RemoteViews b = mock(RemoteViews.class);
352e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        when(b.getLayoutId()).thenReturn(189);
353e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
354e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        Notification.Builder n1 = new Notification.Builder(mContext, "test").setContent(a);
355e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        Notification.Builder n2 = new Notification.Builder(mContext, "test").setContent(b);
356e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        assertTrue(Notification.areRemoteViewsChanged(n1, n2));
357e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
358e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n1 = new Notification.Builder(mContext, "test").setCustomBigContentView(a);
359e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n2 = new Notification.Builder(mContext, "test").setCustomBigContentView(b);
360e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        assertTrue(Notification.areRemoteViewsChanged(n1, n2));
361e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
362e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n1 = new Notification.Builder(mContext, "test").setCustomHeadsUpContentView(a);
363e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n2 = new Notification.Builder(mContext, "test").setCustomHeadsUpContentView(b);
364e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        assertTrue(Notification.areRemoteViewsChanged(n1, n2));
365e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds    }
366e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
367e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds    @Test
368e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds    public void testRemoteViews_layoutSame() {
369e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        RemoteViews a = mock(RemoteViews.class);
370e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        when(a.getLayoutId()).thenReturn(234);
371e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        RemoteViews b = mock(RemoteViews.class);
372e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        when(b.getLayoutId()).thenReturn(234);
373e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
374e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        Notification.Builder n1 = new Notification.Builder(mContext, "test").setContent(a);
375e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        Notification.Builder n2 = new Notification.Builder(mContext, "test").setContent(b);
376e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        assertFalse(Notification.areRemoteViewsChanged(n1, n2));
377e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
378e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n1 = new Notification.Builder(mContext, "test").setCustomBigContentView(a);
379e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n2 = new Notification.Builder(mContext, "test").setCustomBigContentView(b);
380e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        assertFalse(Notification.areRemoteViewsChanged(n1, n2));
381e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
382e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n1 = new Notification.Builder(mContext, "test").setCustomHeadsUpContentView(a);
383e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n2 = new Notification.Builder(mContext, "test").setCustomHeadsUpContentView(b);
384e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        assertFalse(Notification.areRemoteViewsChanged(n1, n2));
385e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds    }
386e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
387e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds    @Test
388e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds    public void testRemoteViews_sequenceChange() {
389e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        RemoteViews a = mock(RemoteViews.class);
390e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        when(a.getLayoutId()).thenReturn(234);
391e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        when(a.getSequenceNumber()).thenReturn(1);
392e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        RemoteViews b = mock(RemoteViews.class);
393e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        when(b.getLayoutId()).thenReturn(234);
394e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        when(b.getSequenceNumber()).thenReturn(2);
395e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
396e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        Notification.Builder n1 = new Notification.Builder(mContext, "test").setContent(a);
397e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        Notification.Builder n2 = new Notification.Builder(mContext, "test").setContent(b);
398e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        assertTrue(Notification.areRemoteViewsChanged(n1, n2));
399e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
400e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n1 = new Notification.Builder(mContext, "test").setCustomBigContentView(a);
401e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n2 = new Notification.Builder(mContext, "test").setCustomBigContentView(b);
402e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        assertTrue(Notification.areRemoteViewsChanged(n1, n2));
403e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
404e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n1 = new Notification.Builder(mContext, "test").setCustomHeadsUpContentView(a);
405e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n2 = new Notification.Builder(mContext, "test").setCustomHeadsUpContentView(b);
406e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        assertTrue(Notification.areRemoteViewsChanged(n1, n2));
407e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds    }
408e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
409e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds    @Test
410e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds    public void testRemoteViews_sequenceSame() {
411e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        RemoteViews a = mock(RemoteViews.class);
412e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        when(a.getLayoutId()).thenReturn(234);
413e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        when(a.getSequenceNumber()).thenReturn(1);
414e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        RemoteViews b = mock(RemoteViews.class);
415e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        when(b.getLayoutId()).thenReturn(234);
416e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        when(b.getSequenceNumber()).thenReturn(1);
417e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
418e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        Notification.Builder n1 = new Notification.Builder(mContext, "test").setContent(a);
419e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        Notification.Builder n2 = new Notification.Builder(mContext, "test").setContent(b);
420e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        assertFalse(Notification.areRemoteViewsChanged(n1, n2));
421e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
422e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n1 = new Notification.Builder(mContext, "test").setCustomBigContentView(a);
423e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n2 = new Notification.Builder(mContext, "test").setCustomBigContentView(b);
424e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        assertFalse(Notification.areRemoteViewsChanged(n1, n2));
425e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
426e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n1 = new Notification.Builder(mContext, "test").setCustomHeadsUpContentView(a);
427e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        n2 = new Notification.Builder(mContext, "test").setCustomHeadsUpContentView(b);
428e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds        assertFalse(Notification.areRemoteViewsChanged(n1, n2));
429e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds    }
430e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds
431e5c6045070adcac613f4581c9ac010d4313423beJulia Reynolds    @Test
4327217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testActionsDifferent_null() {
4337217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification n1 = new Notification.Builder(mContext, "test")
4347217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .build();
4357217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification n2 = new Notification.Builder(mContext, "test")
4367217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .build();
4377217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
4387217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertFalse(Notification.areActionsVisiblyDifferent(n1, n2));
4397217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
4407217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
4417217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
4427217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testActionsDifferentSame() {
4437217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        PendingIntent intent = mock(PendingIntent.class);
4447217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Icon icon = mock(Icon.class);
4457217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
4467217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification n1 = new Notification.Builder(mContext, "test")
4477217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent).build())
4487217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .build();
4497217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification n2 = new Notification.Builder(mContext, "test")
4507217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent).build())
4517217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .build();
4527217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
4537217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertFalse(Notification.areActionsVisiblyDifferent(n1, n2));
4547217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
4557217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
4567217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
4577217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    public void testActionsDifferentText() {
4587217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        PendingIntent intent = mock(PendingIntent.class);
4597217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Icon icon = mock(Icon.class);
4607217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
4617217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification n1 = new Notification.Builder(mContext, "test")
4627217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent).build())
4637217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .build();
4647217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification n2 = new Notification.Builder(mContext, "test")
4657217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .addAction(new Notification.Action.Builder(icon, "TEXT 2", intent).build())
4667217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .build();
4677217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
4687217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        assertTrue(Notification.areActionsVisiblyDifferent(n1, n2));
4697217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
4707217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
4717217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
472a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds    public void testActionsDifferentSpannables() {
4737217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        PendingIntent intent = mock(PendingIntent.class);
4747217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Icon icon = mock(Icon.class);
4757217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
4767217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification n1 = new Notification.Builder(mContext, "test")
477a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds                .addAction(new Notification.Action.Builder(icon,
478a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds                        new SpannableStringBuilder().append("test1",
479a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds                                new StyleSpan(Typeface.BOLD),
480a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds                                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE),
481a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds                        intent).build())
4827217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .build();
4837217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification n2 = new Notification.Builder(mContext, "test")
484a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds                .addAction(new Notification.Action.Builder(icon, "test1", intent).build())
4857217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .build();
4867217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
487a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds        assertFalse(Notification.areActionsVisiblyDifferent(n1, n2));
4887217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
4897217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
4907217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
491a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds    public void testActionsDifferentNumber() {
492a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds        PendingIntent intent = mock(PendingIntent.class);
4937217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Icon icon = mock(Icon.class);
4947217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
4957217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification n1 = new Notification.Builder(mContext, "test")
496a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds                .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent).build())
4977217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .build();
4987217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification n2 = new Notification.Builder(mContext, "test")
499a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds                .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent).build())
500a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds                .addAction(new Notification.Action.Builder(icon, "TEXT 2", intent).build())
5017217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .build();
5027217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
503a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds        assertTrue(Notification.areActionsVisiblyDifferent(n1, n2));
5047217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
5057217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
5067217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    @Test
507a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds    public void testActionsDifferentIntent() {
5085a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds        PendingIntent intent1 = mock(PendingIntent.class);
5095a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds        PendingIntent intent2 = mock(PendingIntent.class);
5105a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds        Icon icon = mock(Icon.class);
5115a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds
5125a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds        Notification n1 = new Notification.Builder(mContext, "test")
5135a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds                .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent1).build())
5145a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds                .build();
5155a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds        Notification n2 = new Notification.Builder(mContext, "test")
5165a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds                .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent2).build())
5175a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds                .build();
5185a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds
519a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds        assertFalse(Notification.areActionsVisiblyDifferent(n1, n2));
5205a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds    }
5215a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds
5225a366fbd819e17b420f8eb61f8b96434b71b8bb7Julia Reynolds    @Test
523a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds    public void testActionsIgnoresRemoteInputs() {
5247217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        PendingIntent intent = mock(PendingIntent.class);
5257217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Icon icon = mock(Icon.class);
5267217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
5277217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification n1 = new Notification.Builder(mContext, "test")
5287217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent)
5297217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .addRemoteInput(new RemoteInput.Builder("a")
5307217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                                .setChoices(new CharSequence[] {"i", "m"})
5317217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                                .build())
5327217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .build())
5337217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .build();
5347217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds        Notification n2 = new Notification.Builder(mContext, "test")
5357217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .addAction(new Notification.Action.Builder(icon, "TEXT 1", intent)
5367217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .addRemoteInput(new RemoteInput.Builder("a")
5377217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                                .setChoices(new CharSequence[] {"t", "m"})
5387217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                                .build())
5397217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                        .build())
5407217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds                .build();
5417217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds
542a4fb9da87950bd60d725c9a8777fd4accd723fd2Julia Reynolds        assertFalse(Notification.areActionsVisiblyDifferent(n1, n2));
5437217dc9f769ccb6e4351011ea9887871c2a4ffb4Julia Reynolds    }
5448a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds}
5458a3b45976542d8a52f8135875186f7bc9e8534cbJulia Reynolds
546