/* * 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 com.example.android.support.wearable.notifications; import android.app.Notification; import android.app.PendingIntent; import android.app.RemoteInput; import android.content.Context; import android.content.Intent; import android.graphics.BitmapFactory; import android.graphics.Color; import android.graphics.Typeface; import android.net.Uri; import android.text.SpannableStringBuilder; import android.text.style.ForegroundColorSpan; import android.text.style.RelativeSizeSpan; import android.text.style.StrikethroughSpan; import android.text.style.StyleSpan; import android.text.style.SubscriptSpan; import android.text.style.SuperscriptSpan; import android.text.style.TypefaceSpan; import android.text.style.UnderlineSpan; import android.util.TypedValue; import android.view.Gravity; /** * Collection of notification builder presets. */ public class NotificationPresets { public static final NotificationPreset[] PRESETS = new NotificationPreset[] { new BasicPreset(), new StylizedTextPreset(), new DisplayIntentPreset(), new MultiSizeDisplayIntentPreset(), new AnimatedDisplayIntentPreset(), new ContentIconPreset() }; private static Notification.Builder buildBasicNotification(Context context) { return new Notification.Builder(context) .setContentTitle(context.getString(R.string.example_content_title)) .setContentText(context.getString(R.string.example_content_text)) // Set a content intent to return to this sample .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0)) .setSmallIcon(R.mipmap.ic_launcher); } private static class BasicPreset extends NotificationPreset { public BasicPreset() { super(R.string.basic_example); } @Override public Notification buildNotification(Context context) { PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0); Notification page2 = buildBasicNotification(context) .extend(new Notification.WearableExtender() .setHintShowBackgroundOnly(true) .setBackground(BitmapFactory.decodeResource(context.getResources(), R.drawable.example_big_picture))) .build(); Notification page3 = buildBasicNotification(context) .setContentTitle(context.getString(R.string.third_page)) .setContentText(null) .extend(new Notification.WearableExtender() .setContentAction(0 /* action A */)) .build(); SpannableStringBuilder choice2 = new SpannableStringBuilder( "This choice is best"); choice2.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 5, 11, 0); return buildBasicNotification(context) .extend(new Notification.WearableExtender() .addAction(new Notification.Action(R.mipmap.ic_launcher, context.getString(R.string.action_a), pendingIntent)) .addAction(new Notification.Action.Builder(R.mipmap.ic_launcher, context.getString(R.string.reply), pendingIntent) .addRemoteInput(new RemoteInput.Builder(MainActivity.KEY_REPLY) .setChoices(new CharSequence[] { context.getString(R.string.choice_1), choice2 }) .build()) .build()) .addPage(page2) .addPage(page3)) .build(); } } private static class StylizedTextPreset extends NotificationPreset { public StylizedTextPreset() { super(R.string.stylized_text_example); } @Override public Notification buildNotification(Context context) { Notification.Builder builder = buildBasicNotification(context); Notification.BigTextStyle style = new Notification.BigTextStyle(); SpannableStringBuilder title = new SpannableStringBuilder(); appendStyled(title, "Stylized", new StyleSpan(Typeface.BOLD_ITALIC)); title.append(" title"); SpannableStringBuilder text = new SpannableStringBuilder("Stylized text: "); appendStyled(text, "C", new ForegroundColorSpan(Color.RED)); appendStyled(text, "O", new ForegroundColorSpan(Color.GREEN)); appendStyled(text, "L", new ForegroundColorSpan(Color.BLUE)); appendStyled(text, "O", new ForegroundColorSpan(Color.YELLOW)); appendStyled(text, "R", new ForegroundColorSpan(Color.MAGENTA)); appendStyled(text, "S", new ForegroundColorSpan(Color.CYAN)); text.append("; "); appendStyled(text, "1.25x size", new RelativeSizeSpan(1.25f)); text.append("; "); appendStyled(text, "0.75x size", new RelativeSizeSpan(0.75f)); text.append("; "); appendStyled(text, "underline", new UnderlineSpan()); text.append("; "); appendStyled(text, "strikethrough", new StrikethroughSpan()); text.append("; "); appendStyled(text, "bold", new StyleSpan(Typeface.BOLD)); text.append("; "); appendStyled(text, "italic", new StyleSpan(Typeface.ITALIC)); text.append("; "); appendStyled(text, "sans-serif-thin", new TypefaceSpan("sans-serif-thin")); text.append("; "); appendStyled(text, "monospace", new TypefaceSpan("monospace")); text.append("; "); appendStyled(text, "sub", new SubscriptSpan()); text.append("script"); appendStyled(text, "super", new SuperscriptSpan()); style.setBigContentTitle(title); style.bigText(text); builder.setStyle(style); return builder.build(); } private void appendStyled(SpannableStringBuilder builder, String str, Object... spans) { builder.append(str); for (Object span : spans) { builder.setSpan(span, builder.length() - str.length(), builder.length(), 0); } } } private static class DisplayIntentPreset extends NotificationPreset { public DisplayIntentPreset() { super(R.string.display_intent_example); } @Override public Notification buildNotification(Context context) { Intent displayIntent = new Intent(context, BasicNotificationDisplayActivity.class); displayIntent.putExtra(BasicNotificationDisplayActivity.EXTRA_TITLE, context.getString(nameResId)); PendingIntent displayPendingIntent = PendingIntent.getActivity(context, 0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT); return buildBasicNotification(context) .extend(new Notification.WearableExtender() .setDisplayIntent(displayPendingIntent)) .build(); } } private static class MultiSizeDisplayIntentPreset extends NotificationPreset { public MultiSizeDisplayIntentPreset() { super(R.string.multisize_display_intent_example); } @Override public Notification buildNotification(Context context) { PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0); Intent displayIntent = new Intent(context, BasicNotificationDisplayActivity.class) .putExtra(BasicNotificationDisplayActivity.EXTRA_TITLE, context.getString(R.string.xsmall_sized_display)); return buildBasicNotification(context) .extend(new Notification.WearableExtender() .setDisplayIntent(PendingIntent.getActivity(context, 0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT)) .addPage(createPageForSizePreset(context, Notification.WearableExtender.SIZE_SMALL, R.string.small_sized_display, 0)) .addPage(createPageForSizePreset(context, Notification.WearableExtender.SIZE_MEDIUM, R.string.medium_sized_display, 1)) .addPage(createPageForSizePreset(context, Notification.WearableExtender.SIZE_LARGE, R.string.large_sized_display, 2)) .addPage(createPageForSizePreset(context, Notification.WearableExtender.SIZE_FULL_SCREEN, R.string.full_screen_display, 3)) .addPage(createPageForCustomHeight(context, 256, R.string.dp256_height_display)) .addPage(createPageForCustomHeight(context, 512, R.string.dp512_height_display)) .addAction(new Notification.Action(R.mipmap.ic_launcher, context.getString(R.string.action_a), pendingIntent)) .addAction(new Notification.Action(R.mipmap.ic_launcher, context.getString(R.string.action_b), pendingIntent)) .addAction(new Notification.Action(R.mipmap.ic_launcher, context.getString(R.string.action_c), pendingIntent)) .addAction(new Notification.Action(R.mipmap.ic_launcher, context.getString(R.string.action_d), pendingIntent)) .setCustomSizePreset(Notification.WearableExtender.SIZE_XSMALL)) .build(); } private Notification createPageForCustomHeight(Context context, int heightDisplayDp, int pageNameResId) { int contentHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, heightDisplayDp, context.getResources().getDisplayMetrics()); Intent displayIntent = new Intent(context, BasicNotificationDisplayActivity.class) .setData(Uri.fromParts("example", "height/" + heightDisplayDp, null)) .putExtra(BasicNotificationDisplayActivity.EXTRA_TITLE, context.getString(pageNameResId)); return buildBasicNotification(context) .extend(new Notification.WearableExtender() .setDisplayIntent(PendingIntent.getActivity(context, 0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT)) .setCustomContentHeight(contentHeight)) .build(); } private Notification createPageForSizePreset(Context context, int sizePreset, int pageNameResId, int contentAction) { Intent displayIntent = new Intent(context, BasicNotificationDisplayActivity.class) .setData(Uri.fromParts("example", "size/" + sizePreset, null)) .putExtra(BasicNotificationDisplayActivity.EXTRA_TITLE, context.getString(pageNameResId)); return buildBasicNotification(context) .extend(new Notification.WearableExtender() .setDisplayIntent(PendingIntent.getActivity(context, 0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT)) .setCustomSizePreset(sizePreset) .setContentAction(contentAction)) .build(); } } private static class AnimatedDisplayIntentPreset extends NotificationPreset { public AnimatedDisplayIntentPreset() { super(R.string.animated_display_intent_example); } @Override public Notification buildNotification(Context context) { Intent displayIntent = new Intent(context, AnimatedNotificationDisplayActivity.class); displayIntent.putExtra(BasicNotificationDisplayActivity.EXTRA_TITLE, context.getString(nameResId)); PendingIntent displayPendingIntent = PendingIntent.getActivity(context, 0, displayIntent, 0); return buildBasicNotification(context) .extend(new Notification.WearableExtender() .setDisplayIntent(displayPendingIntent)) .build(); } } private static class ContentIconPreset extends NotificationPreset { public ContentIconPreset() { super(R.string.content_icon_example); } @Override public Notification buildNotification(Context context) { Notification page2 = buildBasicNotification(context) .extend(new Notification.WearableExtender() .setContentIcon(R.drawable.content_icon_small) .setContentIconGravity(Gravity.START)) .build(); Notification page3 = buildBasicNotification(context) .extend(new Notification.WearableExtender() .setContentIcon(R.drawable.content_icon_large)) .build(); Notification page4 = buildBasicNotification(context) .extend(new Notification.WearableExtender() .setContentIcon(R.drawable.content_icon_large) .setContentIconGravity(Gravity.START)) .build(); return buildBasicNotification(context) .extend(new Notification.WearableExtender() .setHintHideIcon(true) .setContentIcon(R.drawable.content_icon_small) .addPage(page2) .addPage(page3) .addPage(page4)) .build(); } } }