/*
* 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 android.view.Gravity;
import java.util.Arrays;
import java.util.List;
/**
* Tests for {@link android.support.v4.app.NotificationCompat.WearableExtender}.
*/
public class NotificationCompatWearableExtenderTest extends AndroidTestCase {
public static final int CUSTOM_CONTENT_HEIGHT_DP = 256;
private PendingIntent mPendingIntent;
private int mCustomContentHeightPx;
@Override
protected void setUp() throws Exception {
super.setUp();
mPendingIntent = PendingIntent.getActivity(getContext(), 0, new Intent(), 0);
mCustomContentHeightPx = Math.round(getContext().getResources().getDisplayMetrics().density
* CUSTOM_CONTENT_HEIGHT_DP);
}
public void testEmptyEquals() throws Exception {
assertExtendersEqual(new Notification.WearableExtender(),
new NotificationCompat.WearableExtender());
}
public void testRealReadCompatEmptyValue() throws Exception {
NotificationCompat.WearableExtender compatExtender =
new NotificationCompat.WearableExtender();
Notification notif = new NotificationCompat.Builder(getContext())
.extend(compatExtender)
.build();
assertExtendersEqual(new Notification.WearableExtender(notif), compatExtender);
assertExtendersEqual(new Notification.WearableExtender(notif),
new NotificationCompat.WearableExtender(notif));
}
public void testCompatReadRealEmptyValue() throws Exception {
Notification.WearableExtender realExtender =
new Notification.WearableExtender();
Notification notif = new Notification.Builder(getContext())
.extend(realExtender)
.build();
assertExtendersEqual(realExtender, new NotificationCompat.WearableExtender(notif));
assertExtendersEqual(new Notification.WearableExtender(notif),
new NotificationCompat.WearableExtender(notif));
}
public void testRealReadCompatValue() throws Exception {
RemoteInput.Builder remoteInput = new RemoteInput.Builder("result_key1")
.setLabel("label")
.setChoices(new CharSequence[] {"choice 1", "choice 2"});
remoteInput.getExtras().putString("remoteinput_string", "test");
NotificationCompat.Action.Builder action2 = new NotificationCompat.Action.Builder(
R.drawable.action_icon, "Test title", mPendingIntent)
.addRemoteInput(remoteInput.build())
.extend(new NotificationCompat.Action.WearableExtender()
.setAvailableOffline(false)
.setInProgressLabel("In Progress Label")
.setConfirmLabel("Confirmation Label")
.setCancelLabel("Cancelation Label"));
// Add an arbitrary key/value.
action2.getExtras().putFloat("action_float", 10.5f);
Notification page2 = new Notification.Builder(getContext())
.setContentTitle("page2 title")
.extend(new Notification.WearableExtender()
.setContentIcon(R.drawable.content_icon))
.build();
NotificationCompat.WearableExtender compatExtender =
new NotificationCompat.WearableExtender()
.addAction(new NotificationCompat.Action(R.drawable.action_icon2, "Action1",
mPendingIntent))
.addAction(action2.build())
.setContentIntentAvailableOffline(false)
.setHintHideIcon(true)
.setHintShowBackgroundOnly(true)
.setStartScrollBottom(true)
.setDisplayIntent(mPendingIntent)
.addPage(page2)
.setContentIcon(R.drawable.content_icon2)
.setContentIconGravity(Gravity.START)
.setContentAction(5 /* arbitrary content action index */)
.setCustomSizePreset(NotificationCompat.WearableExtender.SIZE_MEDIUM)
.setCustomContentHeight(mCustomContentHeightPx)
.setGravity(Gravity.TOP);
Notification notif = new NotificationCompat.Builder(getContext())
.extend(compatExtender).build();
assertExtendersEqual(new Notification.WearableExtender(notif), compatExtender);
assertExtendersEqual(new Notification.WearableExtender(notif),
new NotificationCompat.WearableExtender(notif));
}
public void testCompatReadRealValue() throws Exception {
android.app.RemoteInput.Builder remoteInput = new android.app.RemoteInput.Builder(
"result_key1")
.setLabel("label")
.setChoices(new CharSequence[] {"choice 1", "choice 2"});
remoteInput.getExtras().putString("remoteinput_string", "test");
Notification.Action.Builder action2 = new Notification.Action.Builder(
R.drawable.action_icon, "Test title", mPendingIntent)
.addRemoteInput(remoteInput.build())
.extend(new Notification.Action.WearableExtender()
.setAvailableOffline(false)
.setInProgressLabel("In Progress Label")
.setConfirmLabel("Confirmation Label")
.setCancelLabel("Cancelation Label"));
// Add an arbitrary key/value.
action2.getExtras().putFloat("action_float", 10.5f);
Notification page2 = new Notification.Builder(getContext())
.setContentTitle("page2 title")
.extend(new Notification.WearableExtender()
.setContentIcon(R.drawable.content_icon))
.build();
Notification.WearableExtender realExtender =
new Notification.WearableExtender()
.addAction(new Notification.Action(R.drawable.action_icon2, "Action1",
mPendingIntent))
.addAction(action2.build())
.setContentIntentAvailableOffline(false)
.setHintHideIcon(true)
.setHintShowBackgroundOnly(true)
.setStartScrollBottom(true)
.setDisplayIntent(mPendingIntent)
.addPage(page2)
.setContentIcon(R.drawable.content_icon2)
.setContentIconGravity(Gravity.START)
.setContentAction(5 /* arbitrary content action index */)
.setCustomSizePreset(NotificationCompat.WearableExtender.SIZE_MEDIUM)
.setCustomContentHeight(mCustomContentHeightPx)
.setGravity(Gravity.TOP);
Notification notif = new Notification.Builder(getContext())
.extend(realExtender).build();
assertExtendersEqual(realExtender, new NotificationCompat.WearableExtender(notif));
assertExtendersEqual(new Notification.WearableExtender(notif),
new NotificationCompat.WearableExtender(notif));
}
private void assertExtendersEqual(Notification.WearableExtender real,
NotificationCompat.WearableExtender compat) {
assertActionsEquals(real.getActions(), compat.getActions());
assertEquals(real.getContentIntentAvailableOffline(),
compat.getContentIntentAvailableOffline());
assertEquals(real.getHintHideIcon(), compat.getHintHideIcon());
assertEquals(real.getHintShowBackgroundOnly(), compat.getHintShowBackgroundOnly());
assertEquals(real.getStartScrollBottom(), compat.getStartScrollBottom());
assertEquals(real.getDisplayIntent(), compat.getDisplayIntent());
assertPagesEquals(real.getPages(), compat.getPages());
assertEquals(real.getBackground(), compat.getBackground());
assertEquals(real.getContentIcon(), compat.getContentIcon());
assertEquals(real.getContentIconGravity(), compat.getContentIconGravity());
assertEquals(real.getContentAction(), compat.getContentAction());
assertEquals(real.getCustomSizePreset(), compat.getCustomSizePreset());
assertEquals(real.getCustomContentHeight(), compat.getCustomContentHeight());
assertEquals(real.getGravity(), compat.getGravity());
}
private void assertPagesEquals(List<Notification> pages1, List<Notification> pages2) {
assertEquals(pages1.size(), pages2.size());
for (int i = 0; i < pages1.size(); i++) {
assertNotificationsEqual(pages1.get(i), pages2.get(i));
}
}
private void assertNotificationsEqual(Notification n1, Notification n2) {
assertEquals(n1.icon, n2.icon);
assertBundlesEqual(n1.extras, n2.extras);
assertExtendersEqual(new Notification.WearableExtender(n1),
new NotificationCompat.WearableExtender(n2));
}
private void assertActionsEquals(List<Notification.Action> realArray,
List<NotificationCompat.Action> compatArray) {
assertEquals(realArray.size(), compatArray.size());
for (int i = 0; i < realArray.size(); i++) {
assertActionsEqual(realArray.get(i), compatArray.get(i));
}
}
private void assertActionsEqual(Notification.Action real, NotificationCompat.Action compat) {
assertEquals(real.icon, compat.icon);
assertEquals(real.title, compat.title);
assertEquals(real.actionIntent, compat.actionIntent);
assertRemoteInputsEquals(real.getRemoteInputs(), compat.getRemoteInputs());
assertBundlesEqual(real.getExtras(), compat.getExtras());
}
private void assertRemoteInputsEquals(android.app.RemoteInput[] realArray,
RemoteInput[] compatArray) {
assertEquals(realArray == null, compatArray == null);
if (realArray != null) {
assertEquals(realArray.length, compatArray.length);
for (int i = 0; i < realArray.length; i++) {
assertRemoteInputsEqual(realArray[i], compatArray[i]);
}
}
}
private void assertRemoteInputsEqual(android.app.RemoteInput real,
RemoteInput compat) {
assertEquals(real.getResultKey(), compat.getResultKey());
assertEquals(real.getLabel(), compat.getLabel());
assertCharSequencesEquals(real.getChoices(), compat.getChoices());
assertEquals(real.getAllowFreeFormInput(), compat.getAllowFreeFormInput());
assertBundlesEqual(real.getExtras(), compat.getExtras());
}
private void assertCharSequencesEquals(CharSequence[] array1, CharSequence[] array2) {
if (!Arrays.deepEquals(array1, array2)) {
fail("Arrays not equal: " + Arrays.toString(array1) + " != " + Arrays.toString(array2));
}
}
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);
}
}
}
}