Synced to commit df5e5013422b81b4fd05c0ac9fd964b13624847a. Includes new samples for Android Auto. Change-Id: I3fec46e2a6b3f196682a92f1afd91eb682dc2dc1
315 lines
15 KiB
Java
315 lines
15 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.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();
|
|
}
|
|
}
|
|
}
|