FileDocCategorySizeDatePackage
NotificationCompatActionWearableExtenderTest.javaAPI DocAndroid 5.1 API13775Thu Mar 12 22:22:56 GMT 2015android.support.v4.app

NotificationCompatActionWearableExtenderTest.java

/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.support.v4.app;

import android.app.Notification;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.support.tests.R;
import android.test.AndroidTestCase;

import java.util.Arrays;
import java.util.List;

/**
 * Tests for {@link android.support.v4.app.NotificationCompat.Action.WearableExtender}.
 */
public class NotificationCompatActionWearableExtenderTest extends AndroidTestCase {

    private int mIcon;
    private String mTitle = "Test Title";
    private PendingIntent mPendingIntent;

    private String mInProgress = "In Progress Label";
    private String mConfirm = "Confirmation Label";
    private String mCancel = "Cancelation Label";

    @Override
    protected void setUp() throws Exception {
        super.setUp();

        mIcon = R.drawable.action_icon;
        mPendingIntent = PendingIntent.getActivity(getContext(), 0, new Intent(), 0);
    }

    // Test that the default empty Extender is equal to the compat version.
    public void testEmptyEquals() throws Exception {
        assertExtendersEqual(new Notification.Action.WearableExtender(),
                new NotificationCompat.Action.WearableExtender());
    }

    // Test that the fully populated Extender is equal to the compat version.
    public void testFullEquals() throws Exception {
        Notification.Action.WearableExtender baseExtender =
            new Notification.Action.WearableExtender()
                .setAvailableOffline(true)
                .setInProgressLabel(mInProgress)
                .setConfirmLabel(mConfirm)
                .setCancelLabel(mCancel);
        NotificationCompat.Action.WearableExtender compatExtender =
            new NotificationCompat.Action.WearableExtender()
                .setAvailableOffline(true)
                .setInProgressLabel(mInProgress)
                .setConfirmLabel(mConfirm)
                .setCancelLabel(mCancel);
        assertExtendersEqual(baseExtender, compatExtender);
    }

    // Test that the base WearableExtender from an empty Notification is equal to the compat.
    public void testEmptyNotification() throws Exception {
        Notification baseNotif = new Notification.Builder(getContext())
                .build();
        Notification compatNotif = new NotificationCompat.Builder(getContext())
                .build();

        assertExtendersFromNotificationEqual(baseNotif, baseNotif);
        assertExtendersFromNotificationEqual(compatNotif, compatNotif);
        assertExtendersFromNotificationEqual(baseNotif, compatNotif);
        assertExtendersFromNotificationEqual(compatNotif, baseNotif);
    }

    public void testDefaultActionNotification() throws Exception {
        Notification.Action.Builder baseAction =
            new Notification.Action.Builder(mIcon, mTitle, mPendingIntent);
        NotificationCompat.Action.Builder compatAction =
            new NotificationCompat.Action.Builder(mIcon, mTitle, mPendingIntent);

        Notification.WearableExtender baseNoteExtender =
                new Notification.WearableExtender()
                        .addAction(baseAction.build());
        NotificationCompat.WearableExtender compatNoteExtender =
                new NotificationCompat.WearableExtender()
                        .addAction(compatAction.build());

        Notification baseNotif = new Notification.Builder(getContext())
                .extend(baseNoteExtender).build();
        Notification compatNotif = new NotificationCompat.Builder(getContext())
                .extend(compatNoteExtender).build();

        assertExtendersFromNotificationEqual(baseNotif, baseNotif);
        assertExtendersFromNotificationEqual(compatNotif, compatNotif);
        assertExtendersFromNotificationEqual(baseNotif, compatNotif);
        assertExtendersFromNotificationEqual(compatNotif, baseNotif);
    }

    public void testDefaultActionExtenderNotification() throws Exception {
        Notification.Action.WearableExtender baseExtender =
            new Notification.Action.WearableExtender();
        NotificationCompat.Action.WearableExtender compatExtender =
            new NotificationCompat.Action.WearableExtender();

        Notification.Action.Builder baseAction =
            new Notification.Action.Builder(mIcon, mTitle, mPendingIntent)
                .extend(baseExtender);
        NotificationCompat.Action.Builder compatAction =
            new NotificationCompat.Action.Builder(mIcon, mTitle, mPendingIntent)
                .extend(compatExtender);

        Notification.WearableExtender baseNoteExtender =
                new Notification.WearableExtender()
                        .addAction(baseAction.build());
        NotificationCompat.WearableExtender compatNoteExtender =
                new NotificationCompat.WearableExtender()
                        .addAction(compatAction.build());

        Notification baseNotif = new Notification.Builder(getContext())
                .extend(baseNoteExtender).build();
        Notification compatNotif = new NotificationCompat.Builder(getContext())
                .extend(compatNoteExtender).build();

        assertExtendersFromNotificationEqual(baseNotif, baseNotif);
        assertExtendersFromNotificationEqual(compatNotif, compatNotif);
        assertExtendersFromNotificationEqual(baseNotif, compatNotif);
        assertExtendersFromNotificationEqual(compatNotif, baseNotif);
    }

    public void testFullNotification() throws Exception {
        Notification.Action.WearableExtender baseExtender =
            new Notification.Action.WearableExtender()
                .setAvailableOffline(true)
                .setInProgressLabel(mInProgress)
                .setConfirmLabel(mConfirm)
                .setCancelLabel(mCancel);
        NotificationCompat.Action.WearableExtender compatExtender =
            new NotificationCompat.Action.WearableExtender()
                .setAvailableOffline(true)
                .setInProgressLabel(mInProgress)
                .setConfirmLabel(mConfirm)
                .setCancelLabel(mCancel);

        Notification.Action.Builder baseAction =
            new Notification.Action.Builder(mIcon, mTitle, mPendingIntent)
                .extend(baseExtender);
        NotificationCompat.Action.Builder compatAction =
            new NotificationCompat.Action.Builder(mIcon, mTitle, mPendingIntent)
                .extend(compatExtender);

        Notification.WearableExtender baseNoteExtender =
                new Notification.WearableExtender()
                        .addAction(baseAction.build());
        NotificationCompat.WearableExtender compatNoteExtender =
                new NotificationCompat.WearableExtender()
                        .addAction(compatAction.build());

        Notification baseNotif = new Notification.Builder(getContext())
                .extend(baseNoteExtender).build();
        Notification compatNotif = new NotificationCompat.Builder(getContext())
                .extend(compatNoteExtender).build();

        assertExtendersFromNotificationEqual(baseNotif, baseNotif);
        assertExtendersFromNotificationEqual(compatNotif, compatNotif);
        assertExtendersFromNotificationEqual(baseNotif, compatNotif);
        assertExtendersFromNotificationEqual(compatNotif, baseNotif);
    }

    public void testMultipleActionsInANotification() throws Exception {
        Notification.Action.WearableExtender baseExtender1 =
            new Notification.Action.WearableExtender()
                .setAvailableOffline(true)
                .setInProgressLabel(mInProgress)
                .setConfirmLabel(mConfirm)
                .setCancelLabel(mCancel);
        NotificationCompat.Action.WearableExtender compatExtender1 =
            new NotificationCompat.Action.WearableExtender()
                .setAvailableOffline(true)
                .setInProgressLabel(mInProgress)
                .setConfirmLabel(mConfirm)
                .setCancelLabel(mCancel);

        Notification.Action.Builder baseAction1 =
            new Notification.Action.Builder(mIcon, mTitle, mPendingIntent)
                .extend(baseExtender1);
        NotificationCompat.Action.Builder compatAction1 =
            new NotificationCompat.Action.Builder(mIcon, mTitle, mPendingIntent)
                .extend(compatExtender1);

        Notification.Action.WearableExtender baseExtender2 =
            new Notification.Action.WearableExtender()
                .setAvailableOffline(false)
                .setInProgressLabel("Alternate Label")
                .setConfirmLabel("Duplicated Label")
                .setCancelLabel("Duplicated Label");
        NotificationCompat.Action.WearableExtender compatExtender2 =
            new NotificationCompat.Action.WearableExtender()
                .setAvailableOffline(false)
                .setInProgressLabel("Alternate Label")
                .setConfirmLabel("Duplicated Label")
                .setCancelLabel("Duplicated Label");

        Notification.Action.Builder baseAction2 =
            new Notification.Action.Builder(mIcon, mTitle, mPendingIntent)
                .extend(baseExtender2);
        NotificationCompat.Action.Builder compatAction2 =
            new NotificationCompat.Action.Builder(mIcon, mTitle, mPendingIntent)
                .extend(compatExtender2);

        Notification.WearableExtender baseNoteExtender =
                new Notification.WearableExtender()
                        .addAction(baseAction1.build())
                        .addAction(new Notification.Action(R.drawable.action_icon2, "Action1",
                                mPendingIntent))
                        .addAction(baseAction2.build());
        NotificationCompat.WearableExtender compatNoteExtender =
                new NotificationCompat.WearableExtender()
                        .addAction(compatAction1.build())
                        .addAction(new NotificationCompat.Action(R.drawable.action_icon2,
                                "Action1", mPendingIntent))
                        .addAction(compatAction2.build());

        Notification baseNotif = new Notification.Builder(getContext())
                .extend(baseNoteExtender).build();
        Notification compatNotif = new NotificationCompat.Builder(getContext())
                .extend(compatNoteExtender).build();

        assertExtendersFromNotificationEqual(baseNotif, baseNotif);
        assertExtendersFromNotificationEqual(compatNotif, compatNotif);
        assertExtendersFromNotificationEqual(baseNotif, compatNotif);
        assertExtendersFromNotificationEqual(compatNotif, baseNotif);
    }

    private void assertExtendersEqual(Notification.Action.WearableExtender base,
            NotificationCompat.Action.WearableExtender compat) {
        assertEquals(base.isAvailableOffline(), compat.isAvailableOffline());
        assertEquals(base.getInProgressLabel(), compat.getInProgressLabel());
        assertEquals(base.getConfirmLabel(), compat.getConfirmLabel());
        assertEquals(base.getCancelLabel(), compat.getCancelLabel());
    }

    // Parse the Notification using the base parser and the compat parser and confirm
    // that the WearableExtender bundles are equivelent.
    private void assertExtendersFromNotificationEqual(Notification first,
                                                      Notification second) {
        Notification.WearableExtender baseExtender = new Notification.WearableExtender(first);
        NotificationCompat.WearableExtender compatExtender =
            new NotificationCompat.WearableExtender(second);
        List<Notification.Action> baseArray = baseExtender.getActions();
        List<NotificationCompat.Action> compatArray = compatExtender.getActions();
        assertEquals(baseArray.size(), compatArray.size());
        for (int i = 0; i < baseArray.size(); i++) {
            // Verify that the key value pairs are equal. We only care about
            // the bundle in getExtras().getBundle("android.wearable.EXTENSIONS"),
            // but it doesn't hurt to check them all as long we recurse.
            assertBundlesEqual(baseArray.get(i).getExtras(),
                               compatArray.get(i).getExtras());
            // Verify that the parsed WearableExtentions are equal
            Notification.Action.WearableExtender base =
                new Notification.Action.WearableExtender(baseArray.get(i));
            NotificationCompat.Action.WearableExtender compat =
                new NotificationCompat.Action.WearableExtender(compatArray.get(i));
            assertExtendersEqual(base, compat);
        }
    }

    private void assertBundlesEqual(Bundle bundle1, Bundle bundle2) {
        assertEquals(bundle1.size(), bundle2.size());
        for (String key : bundle1.keySet()) {
            Object value1 = bundle1.get(key);
            Object value2 = bundle2.get(key);
            if (value1 instanceof Bundle && value2 instanceof Bundle) {
                assertBundlesEqual((Bundle) value1, (Bundle) value2);
            } else {
                assertEquals(value1, value2);
            }
        }
    }
}