511 lines
25 KiB
Java
511 lines
25 KiB
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 com.example.android.support.wearable.notifications;
|
|
|
|
import android.app.Notification;
|
|
import android.content.Context;
|
|
import android.graphics.BitmapFactory;
|
|
import android.graphics.Color;
|
|
import android.graphics.Typeface;
|
|
import android.support.v4.app.NotificationCompat;
|
|
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.view.Gravity;
|
|
|
|
/**
|
|
* Collection of notification builder presets.
|
|
*/
|
|
public class NotificationPresets {
|
|
private static final String EXAMPLE_GROUP_KEY = "example";
|
|
|
|
public static final NotificationPreset BASIC = new BasicNotificationPreset();
|
|
public static final NotificationPreset STYLIZED_TEXT = new StylizedTextNotificationPreset();
|
|
public static final NotificationPreset INBOX = new InboxNotificationPreset();
|
|
public static final NotificationPreset BIG_PICTURE = new BigPictureNotificationPreset();
|
|
public static final NotificationPreset BIG_TEXT = new BigTextNotificationPreset();
|
|
public static final NotificationPreset BOTTOM_ALIGNED = new BottomAlignedNotificationPreset();
|
|
public static final NotificationPreset GRAVITY = new GravityNotificationPreset();
|
|
public static final NotificationPreset CONTENT_ACTION = new ContentActionNotificationPreset();
|
|
public static final NotificationPreset CONTENT_ICON = new ContentIconNotificationPreset();
|
|
public static final NotificationPreset MULTIPLE_PAGE = new MultiplePageNotificationPreset();
|
|
public static final NotificationPreset BUNDLE = new NotificationBundlePreset();
|
|
public static final NotificationPreset BARCODE = new NotificationBarcodePreset();
|
|
|
|
public static final NotificationPreset[] PRESETS = new NotificationPreset[] {
|
|
BASIC,
|
|
STYLIZED_TEXT,
|
|
INBOX,
|
|
BIG_PICTURE,
|
|
BIG_TEXT,
|
|
BOTTOM_ALIGNED,
|
|
GRAVITY,
|
|
CONTENT_ACTION,
|
|
CONTENT_ICON,
|
|
MULTIPLE_PAGE,
|
|
BUNDLE,
|
|
BARCODE
|
|
};
|
|
|
|
private static NotificationCompat.Builder applyBasicOptions(Context context,
|
|
NotificationCompat.Builder builder, NotificationCompat.WearableExtender wearableOptions,
|
|
NotificationPreset.BuildOptions options) {
|
|
builder.setContentTitle(options.titlePreset)
|
|
.setContentText(options.textPreset)
|
|
.setSmallIcon(R.mipmap.ic_launcher)
|
|
.setDeleteIntent(NotificationUtil.getExamplePendingIntent(
|
|
context, R.string.example_notification_deleted));
|
|
options.actionsPreset.apply(context, builder, wearableOptions);
|
|
options.priorityPreset.apply(builder, wearableOptions);
|
|
if (options.includeLargeIcon) {
|
|
builder.setLargeIcon(BitmapFactory.decodeResource(
|
|
context.getResources(), R.drawable.example_large_icon));
|
|
}
|
|
if (options.isLocalOnly) {
|
|
builder.setLocalOnly(true);
|
|
}
|
|
if (options.hasContentIntent) {
|
|
builder.setContentIntent(NotificationUtil.getExamplePendingIntent(context,
|
|
R.string.content_intent_clicked));
|
|
}
|
|
if (options.vibrate) {
|
|
builder.setVibrate(new long[] {0, 100, 50, 100} );
|
|
}
|
|
return builder;
|
|
}
|
|
|
|
private static class BasicNotificationPreset extends NotificationPreset {
|
|
public BasicNotificationPreset() {
|
|
super(R.string.basic_example, R.string.example_content_title,
|
|
R.string.example_content_text);
|
|
}
|
|
|
|
@Override
|
|
public Notification[] buildNotifications(Context context, BuildOptions options) {
|
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
|
|
NotificationCompat.WearableExtender wearableOptions =
|
|
new NotificationCompat.WearableExtender();
|
|
applyBasicOptions(context, builder, wearableOptions, options);
|
|
builder.extend(wearableOptions);
|
|
return new Notification[] { builder.build() };
|
|
}
|
|
}
|
|
|
|
private static class StylizedTextNotificationPreset extends NotificationPreset {
|
|
public StylizedTextNotificationPreset() {
|
|
super(R.string.stylized_text_example, R.string.example_content_title,
|
|
R.string.example_content_text);
|
|
}
|
|
|
|
@Override
|
|
public Notification[] buildNotifications(Context context, BuildOptions options) {
|
|
NotificationCompat.BigTextStyle style = new NotificationCompat.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);
|
|
|
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
|
|
.setStyle(style);
|
|
NotificationCompat.WearableExtender wearableOptions =
|
|
new NotificationCompat.WearableExtender();
|
|
applyBasicOptions(context, builder, wearableOptions, options);
|
|
builder.extend(wearableOptions);
|
|
return new Notification[] { 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 InboxNotificationPreset extends NotificationPreset {
|
|
public InboxNotificationPreset() {
|
|
super(R.string.inbox_example, R.string.example_content_title,
|
|
R.string.example_content_text);
|
|
}
|
|
|
|
@Override
|
|
public Notification[] buildNotifications(Context context, BuildOptions options) {
|
|
NotificationCompat.InboxStyle style = new NotificationCompat.InboxStyle();
|
|
style.addLine(context.getString(R.string.inbox_style_example_line1));
|
|
style.addLine(context.getString(R.string.inbox_style_example_line2));
|
|
style.addLine(context.getString(R.string.inbox_style_example_line3));
|
|
style.setBigContentTitle(context.getString(R.string.inbox_style_example_title));
|
|
style.setSummaryText(context.getString(R.string.inbox_style_example_summary_text));
|
|
|
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
|
|
.setStyle(style);
|
|
NotificationCompat.WearableExtender wearableOptions =
|
|
new NotificationCompat.WearableExtender();
|
|
applyBasicOptions(context, builder, wearableOptions, options);
|
|
builder.extend(wearableOptions);
|
|
return new Notification[] { builder.build() };
|
|
}
|
|
}
|
|
|
|
private static class BigPictureNotificationPreset extends NotificationPreset {
|
|
public BigPictureNotificationPreset() {
|
|
super(R.string.big_picture_example, R.string.example_content_title,
|
|
R.string.example_content_text);
|
|
}
|
|
|
|
@Override
|
|
public Notification[] buildNotifications(Context context, BuildOptions options) {
|
|
NotificationCompat.BigPictureStyle style = new NotificationCompat.BigPictureStyle();
|
|
style.bigPicture(BitmapFactory.decodeResource(context.getResources(),
|
|
R.drawable.example_big_picture));
|
|
style.setBigContentTitle(context.getString(R.string.big_picture_style_example_title));
|
|
style.setSummaryText(context.getString(
|
|
R.string.big_picture_style_example_summary_text));
|
|
|
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
|
|
.setStyle(style);
|
|
NotificationCompat.WearableExtender wearableOptions =
|
|
new NotificationCompat.WearableExtender();
|
|
applyBasicOptions(context, builder, wearableOptions, options);
|
|
builder.extend(wearableOptions);
|
|
return new Notification[] { builder.build() };
|
|
}
|
|
}
|
|
|
|
private static class BigTextNotificationPreset extends NotificationPreset {
|
|
public BigTextNotificationPreset() {
|
|
super(R.string.big_text_example, R.string.example_content_title,
|
|
R.string.example_content_text);
|
|
}
|
|
|
|
@Override
|
|
public Notification[] buildNotifications(Context context, BuildOptions options) {
|
|
NotificationCompat.BigTextStyle style = new NotificationCompat.BigTextStyle();
|
|
style.bigText(context.getString(R.string.big_text_example_big_text));
|
|
style.setBigContentTitle(context.getString(R.string.big_text_example_title));
|
|
style.setSummaryText(context.getString(R.string.big_text_example_summary_text));
|
|
|
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
|
|
.setStyle(style);
|
|
NotificationCompat.WearableExtender wearableOptions =
|
|
new NotificationCompat.WearableExtender();
|
|
applyBasicOptions(context, builder, wearableOptions, options);
|
|
builder.extend(wearableOptions);
|
|
return new Notification[] { builder.build() };
|
|
}
|
|
}
|
|
|
|
private static class BottomAlignedNotificationPreset extends NotificationPreset {
|
|
public BottomAlignedNotificationPreset() {
|
|
super(R.string.bottom_aligned_example, R.string.example_content_title,
|
|
R.string.example_content_text);
|
|
}
|
|
|
|
@Override
|
|
public Notification[] buildNotifications(Context context, BuildOptions options) {
|
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
|
|
NotificationCompat.WearableExtender wearableOptions =
|
|
new NotificationCompat.WearableExtender();
|
|
applyBasicOptions(context, builder, wearableOptions, options);
|
|
|
|
NotificationCompat.Builder secondPageBuilder = new NotificationCompat.Builder(context);
|
|
secondPageBuilder.setContentTitle(
|
|
context.getString(R.string.second_page_content_title));
|
|
secondPageBuilder.setContentText(context.getString(R.string.big_text_example_big_text));
|
|
secondPageBuilder.extend(new NotificationCompat.WearableExtender()
|
|
.setStartScrollBottom(true));
|
|
|
|
wearableOptions.addPage(secondPageBuilder.build());
|
|
builder.extend(wearableOptions);
|
|
return new Notification[] { builder.build() };
|
|
}
|
|
}
|
|
|
|
private static class GravityNotificationPreset extends NotificationPreset {
|
|
public GravityNotificationPreset() {
|
|
super(R.string.gravity_example, R.string.example_content_title,
|
|
R.string.example_content_text);
|
|
}
|
|
|
|
@Override
|
|
public Notification[] buildNotifications(Context context, BuildOptions options) {
|
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
|
|
NotificationCompat.WearableExtender wearableOptions =
|
|
new NotificationCompat.WearableExtender();
|
|
applyBasicOptions(context, builder, wearableOptions, options);
|
|
|
|
NotificationCompat.Builder secondPageBuilder = new NotificationCompat.Builder(context)
|
|
.setContentTitle(options.titlePreset)
|
|
.setContentText(options.textPreset)
|
|
.extend(new NotificationCompat.WearableExtender()
|
|
.setGravity(Gravity.CENTER_VERTICAL));
|
|
wearableOptions.addPage(secondPageBuilder.build());
|
|
|
|
NotificationCompat.Builder thirdPageBuilder = new NotificationCompat.Builder(context)
|
|
.setContentTitle(options.titlePreset)
|
|
.setContentText(options.textPreset)
|
|
.extend(new NotificationCompat.WearableExtender()
|
|
.setGravity(Gravity.TOP));
|
|
wearableOptions.addPage(thirdPageBuilder.build());
|
|
|
|
wearableOptions.setGravity(Gravity.BOTTOM);
|
|
builder.extend(wearableOptions);
|
|
return new Notification[] { builder.build() };
|
|
}
|
|
}
|
|
|
|
private static class ContentActionNotificationPreset extends NotificationPreset {
|
|
public ContentActionNotificationPreset() {
|
|
super(R.string.content_action_example, R.string.example_content_title,
|
|
R.string.example_content_text);
|
|
}
|
|
|
|
@Override
|
|
public Notification[] buildNotifications(Context context, BuildOptions options) {
|
|
Notification secondPage = new NotificationCompat.Builder(context)
|
|
.setContentTitle(context.getString(R.string.second_page_content_title))
|
|
.setContentText(context.getString(R.string.second_page_content_text))
|
|
.extend(new NotificationCompat.WearableExtender()
|
|
.setContentAction(1))
|
|
.build();
|
|
|
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
|
|
NotificationCompat.Action action = new NotificationCompat.Action.Builder(
|
|
R.drawable.ic_result_open, null, NotificationUtil.getExamplePendingIntent(
|
|
context, R.string.example_content_action_clicked)).build();
|
|
NotificationCompat.Action action2 = new NotificationCompat.Action.Builder(
|
|
R.drawable.ic_result_open, null, NotificationUtil.getExamplePendingIntent(
|
|
context, R.string.example_content_action2_clicked)).build();
|
|
NotificationCompat.WearableExtender wearableOptions =
|
|
new NotificationCompat.WearableExtender()
|
|
.addAction(action)
|
|
.addAction(action2)
|
|
.addPage(secondPage)
|
|
.setContentAction(0)
|
|
.setHintHideIcon(true);
|
|
applyBasicOptions(context, builder, wearableOptions, options);
|
|
builder.extend(wearableOptions);
|
|
return new Notification[] { builder.build() };
|
|
}
|
|
|
|
@Override
|
|
public boolean actionsRequired() {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
private static class ContentIconNotificationPreset extends NotificationPreset {
|
|
public ContentIconNotificationPreset() {
|
|
super(R.string.content_icon_example, R.string.example_content_title,
|
|
R.string.example_content_text);
|
|
}
|
|
|
|
@Override
|
|
public Notification[] buildNotifications(Context context, BuildOptions options) {
|
|
Notification secondPage = new NotificationCompat.Builder(context)
|
|
.setContentTitle(context.getString(R.string.second_page_content_title))
|
|
.setContentText(context.getString(R.string.second_page_content_text))
|
|
.extend(new NotificationCompat.WearableExtender()
|
|
.setContentIcon(R.drawable.content_icon_small)
|
|
.setContentIconGravity(Gravity.START))
|
|
.build();
|
|
|
|
Notification thirdPage = new NotificationCompat.Builder(context)
|
|
.setContentTitle(context.getString(R.string.third_page_content_title))
|
|
.setContentText(context.getString(R.string.third_page_content_text))
|
|
.extend(new NotificationCompat.WearableExtender()
|
|
.setContentIcon(R.drawable.content_icon_large))
|
|
.build();
|
|
|
|
Notification fourthPage = new NotificationCompat.Builder(context)
|
|
.setContentTitle(context.getString(R.string.fourth_page_content_title))
|
|
.setContentText(context.getString(R.string.fourth_page_content_text))
|
|
.extend(new NotificationCompat.WearableExtender()
|
|
.setContentIcon(R.drawable.content_icon_large)
|
|
.setContentIconGravity(Gravity.START))
|
|
.build();
|
|
|
|
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
|
|
NotificationCompat.WearableExtender wearableOptions =
|
|
new NotificationCompat.WearableExtender()
|
|
.setHintHideIcon(true)
|
|
.setContentIcon(R.drawable.content_icon_small)
|
|
.addPage(secondPage)
|
|
.addPage(thirdPage)
|
|
.addPage(fourthPage);
|
|
applyBasicOptions(context, builder, wearableOptions, options);
|
|
builder.extend(wearableOptions);
|
|
return new Notification[] { builder.build() };
|
|
}
|
|
}
|
|
|
|
private static class MultiplePageNotificationPreset extends NotificationPreset {
|
|
public MultiplePageNotificationPreset() {
|
|
super(R.string.multiple_page_example, R.string.example_content_title,
|
|
R.string.example_content_text);
|
|
}
|
|
|
|
@Override
|
|
public Notification[] buildNotifications(Context context, BuildOptions options) {
|
|
NotificationCompat.Builder secondPageBuilder = new NotificationCompat.Builder(context)
|
|
.setContentTitle(context.getString(R.string.second_page_content_title))
|
|
.setContentText(context.getString(R.string.second_page_content_text));
|
|
|
|
NotificationCompat.Builder firstPageBuilder = new NotificationCompat.Builder(context);
|
|
NotificationCompat.WearableExtender firstPageWearableOptions =
|
|
new NotificationCompat.WearableExtender();
|
|
applyBasicOptions(context, firstPageBuilder, firstPageWearableOptions, options);
|
|
|
|
Integer firstBackground = options.backgroundIds == null
|
|
? null : options.backgroundIds[0];
|
|
if (firstBackground != null) {
|
|
NotificationCompat.BigPictureStyle style =
|
|
new NotificationCompat.BigPictureStyle();
|
|
style.bigPicture(BitmapFactory.decodeResource(context.getResources(),
|
|
firstBackground));
|
|
firstPageBuilder.setStyle(style);
|
|
}
|
|
|
|
Integer secondBackground = options.backgroundIds == null
|
|
? null : options.backgroundIds[1];
|
|
if (secondBackground != null) {
|
|
NotificationCompat.BigPictureStyle style = new NotificationCompat.BigPictureStyle();
|
|
style.bigPicture(BitmapFactory.decodeResource(context.getResources(),
|
|
secondBackground));
|
|
secondPageBuilder.setStyle(style);
|
|
}
|
|
|
|
firstPageBuilder.extend(
|
|
firstPageWearableOptions.addPage(secondPageBuilder.build()));
|
|
|
|
return new Notification[]{ firstPageBuilder.build() };
|
|
}
|
|
|
|
@Override
|
|
public int countBackgroundPickersRequired() {
|
|
return 2; // This sample does 2 pages notifications.
|
|
}
|
|
}
|
|
|
|
private static class NotificationBundlePreset extends NotificationPreset {
|
|
public NotificationBundlePreset() {
|
|
super(R.string.bundle_example, R.string.example_content_title,
|
|
R.string.example_content_text);
|
|
}
|
|
|
|
@Override
|
|
public Notification[] buildNotifications(Context context, BuildOptions options) {
|
|
NotificationCompat.Builder childBuilder1 = new NotificationCompat.Builder(context)
|
|
.setContentTitle(context.getString(R.string.first_child_content_title))
|
|
.setContentText(context.getString(R.string.first_child_content_text))
|
|
.setSmallIcon(R.mipmap.ic_launcher)
|
|
.setLocalOnly(options.isLocalOnly)
|
|
.setGroup(EXAMPLE_GROUP_KEY)
|
|
.setSortKey("0");
|
|
|
|
NotificationCompat.Builder childBuilder2 = new NotificationCompat.Builder(context)
|
|
.setContentTitle(context.getString(R.string.second_child_content_title))
|
|
.setContentText(context.getString(R.string.second_child_content_text))
|
|
.setSmallIcon(R.mipmap.ic_launcher)
|
|
.addAction(R.mipmap.ic_launcher,
|
|
context.getString(R.string.second_child_action),
|
|
NotificationUtil.getExamplePendingIntent(
|
|
context, R.string.second_child_action_clicked))
|
|
.setLocalOnly(options.isLocalOnly)
|
|
.setGroup(EXAMPLE_GROUP_KEY)
|
|
.setSortKey("1");
|
|
|
|
NotificationCompat.Builder summaryBuilder = new NotificationCompat.Builder(context)
|
|
.setGroup(EXAMPLE_GROUP_KEY)
|
|
.setGroupSummary(true);
|
|
|
|
NotificationCompat.WearableExtender summaryWearableOptions =
|
|
new NotificationCompat.WearableExtender();
|
|
applyBasicOptions(context, summaryBuilder, summaryWearableOptions, options);
|
|
summaryBuilder.extend(summaryWearableOptions);
|
|
|
|
return new Notification[] { summaryBuilder.build(), childBuilder1.build(),
|
|
childBuilder2.build() };
|
|
}
|
|
}
|
|
|
|
private static class NotificationBarcodePreset extends NotificationPreset {
|
|
public NotificationBarcodePreset() {
|
|
super(R.string.barcode_example, R.string.barcode_content_title,
|
|
R.string.barcode_content_text);
|
|
}
|
|
|
|
@Override
|
|
public Notification[] buildNotifications(Context context, BuildOptions options) {
|
|
NotificationCompat.Builder secondPageBuilder = new NotificationCompat.Builder(context)
|
|
.extend(new NotificationCompat.WearableExtender()
|
|
.setHintShowBackgroundOnly(true)
|
|
.setBackground(BitmapFactory.decodeResource(context.getResources(),
|
|
R.drawable.qr_code))
|
|
.setHintAvoidBackgroundClipping(true)
|
|
.setHintScreenTimeout(
|
|
NotificationCompat.WearableExtender.SCREEN_TIMEOUT_LONG));
|
|
|
|
NotificationCompat.Builder firstPageBuilder = new NotificationCompat.Builder(context);
|
|
NotificationCompat.WearableExtender firstPageWearableOptions =
|
|
new NotificationCompat.WearableExtender();
|
|
applyBasicOptions(context, firstPageBuilder, firstPageWearableOptions, options);
|
|
|
|
firstPageBuilder.extend(
|
|
firstPageWearableOptions.addPage(secondPageBuilder.build()));
|
|
|
|
return new Notification[]{ firstPageBuilder.build() };
|
|
}
|
|
}
|
|
}
|