Skip to content

Most visited

Recently visited

navigation
Notifications / Wearable / src / com.example.android.support.wearable.notifications /

NotificationPresets.java

1
/*
2
 * Copyright (C) 2014 The Android Open Source Project
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 *      http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
 
17
package com.example.android.support.wearable.notifications;
18
 
19
import android.app.Notification;
20
import android.app.PendingIntent;
21
import android.app.RemoteInput;
22
import android.content.Context;
23
import android.content.Intent;
24
import android.graphics.BitmapFactory;
25
import android.graphics.Color;
26
import android.graphics.Typeface;
27
import android.net.Uri;
28
import android.text.SpannableStringBuilder;
29
import android.text.style.ForegroundColorSpan;
30
import android.text.style.RelativeSizeSpan;
31
import android.text.style.StrikethroughSpan;
32
import android.text.style.StyleSpan;
33
import android.text.style.SubscriptSpan;
34
import android.text.style.SuperscriptSpan;
35
import android.text.style.TypefaceSpan;
36
import android.text.style.UnderlineSpan;
37
import android.util.TypedValue;
38
import android.view.Gravity;
39
 
40
/**
41
 * Collection of notification builder presets.
42
 */
43
public class NotificationPresets {
44
    public static final NotificationPreset[] PRESETS = new NotificationPreset[] {
45
            new BasicPreset(),
46
            new StylizedTextPreset(),
47
            new DisplayIntentPreset(),
48
            new MultiSizeDisplayIntentPreset(),
49
            new AnimatedDisplayIntentPreset(),
50
            new ContentIconPreset()
51
    };
52
 
53
    private static Notification.Builder buildBasicNotification(Context context) {
54
        return new Notification.Builder(context)
55
                .setContentTitle(context.getString(R.string.example_content_title))
56
                .setContentText(context.getString(R.string.example_content_text))
57
                // Set a content intent to return to this sample
58
                .setContentIntent(PendingIntent.getActivity(context, 0,
59
                        new Intent(context, MainActivity.class), 0))
60
                .setSmallIcon(R.mipmap.ic_launcher);
61
    }
62
 
63
    private static class BasicPreset extends NotificationPreset {
64
        public BasicPreset() {
65
            super(R.string.basic_example);
66
        }
67
 
68
        @Override
69
        public Notification buildNotification(Context context) {
70
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
71
                    new Intent(context, MainActivity.class), 0);
72
 
73
            Notification page2 = buildBasicNotification(context)
74
                    .extend(new Notification.WearableExtender()
75
                            .setHintShowBackgroundOnly(true)
76
                            .setBackground(BitmapFactory.decodeResource(context.getResources(),
77
                                    R.drawable.example_big_picture)))
78
                    .build();
79
 
80
            Notification page3 = buildBasicNotification(context)
81
                    .setContentTitle(context.getString(R.string.third_page))
82
                    .setContentText(null)
83
                    .extend(new Notification.WearableExtender()
84
                            .setContentAction(0 /* action A */))
85
                    .build();
86
 
87
            SpannableStringBuilder choice2 = new SpannableStringBuilder(
88
                    "This choice is best");
89
            choice2.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 5, 11, 0);
90
 
91
            return buildBasicNotification(context)
92
                    .extend(new Notification.WearableExtender()
93
                            .addAction(new Notification.Action(R.mipmap.ic_launcher,
94
                                    context.getString(R.string.action_a), pendingIntent))
95
                            .addAction(new Notification.Action.Builder(R.mipmap.ic_launcher,
96
                                    context.getString(R.string.reply), pendingIntent)
97
                                    .addRemoteInput(new RemoteInput.Builder(MainActivity.KEY_REPLY)
98
                                            .setChoices(new CharSequence[] {
99
                                                    context.getString(R.string.choice_1),
100
                                                    choice2 })
101
                                            .build())
102
                                    .build())
103
                            .addPage(page2)
104
                            .addPage(page3))
105
                    .build();
106
        }
107
    }
108
 
109
    private static class StylizedTextPreset extends NotificationPreset {
110
        public StylizedTextPreset() {
111
            super(R.string.stylized_text_example);
112
        }
113
 
114
        @Override
115
        public Notification buildNotification(Context context) {
116
            Notification.Builder builder = buildBasicNotification(context);
117
 
118
            Notification.BigTextStyle style = new Notification.BigTextStyle();
119
 
120
            SpannableStringBuilder title = new SpannableStringBuilder();
121
            appendStyled(title, "Stylized", new StyleSpan(Typeface.BOLD_ITALIC));
122
            title.append(" title");
123
            SpannableStringBuilder text = new SpannableStringBuilder("Stylized text: ");
124
            appendStyled(text, "C", new ForegroundColorSpan(Color.RED));
125
            appendStyled(text, "O", new ForegroundColorSpan(Color.GREEN));
126
            appendStyled(text, "L", new ForegroundColorSpan(Color.BLUE));
127
            appendStyled(text, "O", new ForegroundColorSpan(Color.YELLOW));
128
            appendStyled(text, "R", new ForegroundColorSpan(Color.MAGENTA));
129
            appendStyled(text, "S", new ForegroundColorSpan(Color.CYAN));
130
            text.append("; ");
131
            appendStyled(text, "1.25x size", new RelativeSizeSpan(1.25f));
132
            text.append("; ");
133
            appendStyled(text, "0.75x size", new RelativeSizeSpan(0.75f));
134
            text.append("; ");
135
            appendStyled(text, "underline", new UnderlineSpan());
136
            text.append("; ");
137
            appendStyled(text, "strikethrough", new StrikethroughSpan());
138
            text.append("; ");
139
            appendStyled(text, "bold", new StyleSpan(Typeface.BOLD));
140
            text.append("; ");
141
            appendStyled(text, "italic", new StyleSpan(Typeface.ITALIC));
142
            text.append("; ");
143
            appendStyled(text, "sans-serif-thin", new TypefaceSpan("sans-serif-thin"));
144
            text.append("; ");
145
            appendStyled(text, "monospace", new TypefaceSpan("monospace"));
146
            text.append("; ");
147
            appendStyled(text, "sub", new SubscriptSpan());
148
            text.append("script");
149
            appendStyled(text, "super", new SuperscriptSpan());
150
 
151
            style.setBigContentTitle(title);
152
            style.bigText(text);
153
 
154
            builder.setStyle(style);
155
            return builder.build();
156
        }
157
 
158
        private void appendStyled(SpannableStringBuilder builder, String str, Object... spans) {
159
            builder.append(str);
160
            for (Object span : spans) {
161
                builder.setSpan(span, builder.length() - str.length(), builder.length(), 0);
162
            }
163
        }
164
    }
165
 
166
    private static class DisplayIntentPreset extends NotificationPreset {
167
        public DisplayIntentPreset() {
168
            super(R.string.display_intent_example);
169
        }
170
 
171
        @Override
172
        public Notification buildNotification(Context context) {
173
            Intent displayIntent = new Intent(context, BasicNotificationDisplayActivity.class);
174
            displayIntent.putExtra(BasicNotificationDisplayActivity.EXTRA_TITLE,
175
                    context.getString(nameResId));
176
            PendingIntent displayPendingIntent = PendingIntent.getActivity(context,
177
                    0, displayIntent, PendingIntent.FLAG_UPDATE_CURRENT);
178
            return buildBasicNotification(context)
179
                    .extend(new Notification.WearableExtender()
180
                            .setDisplayIntent(displayPendingIntent))
181
                    .build();
182
        }
183
    }
184
 
185
    private static class MultiSizeDisplayIntentPreset extends NotificationPreset {
186
        public MultiSizeDisplayIntentPreset() {
187
            super(R.string.multisize_display_intent_example);
188
        }
189
 
190
        @Override
191
        public Notification buildNotification(Context context) {
192
           PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
193
                                   new Intent(context, MainActivity.class), 0);
194
             Intent displayIntent = new Intent(context, BasicNotificationDisplayActivity.class)
195
                    .putExtra(BasicNotificationDisplayActivity.EXTRA_TITLE,
196
                            context.getString(R.string.xsmall_sized_display));
197
            return buildBasicNotification(context)
198
                    .extend(new Notification.WearableExtender()
199
                            .setDisplayIntent(PendingIntent.getActivity(context, 0, displayIntent,
200
                                    PendingIntent.FLAG_UPDATE_CURRENT))
201
                            .addPage(createPageForSizePreset(context,
202
                                    Notification.WearableExtender.SIZE_SMALL,
203
                                    R.string.small_sized_display, 0))
204
                            .addPage(createPageForSizePreset(context,
205
                                    Notification.WearableExtender.SIZE_MEDIUM,
206
                                    R.string.medium_sized_display, 1))
207
                            .addPage(createPageForSizePreset(context,
208
                                    Notification.WearableExtender.SIZE_LARGE,
209
                                    R.string.large_sized_display, 2))
210
                            .addPage(createPageForSizePreset(context,
211
                                    Notification.WearableExtender.SIZE_FULL_SCREEN,
212
                                    R.string.full_screen_display, 3))
213
                             .addPage(createPageForCustomHeight(context, 256,
214
                                    R.string.dp256_height_display))
215
                            .addPage(createPageForCustomHeight(context, 512,
216
                                    R.string.dp512_height_display))
217
                            .addAction(new Notification.Action(R.mipmap.ic_launcher,
218
                                    context.getString(R.string.action_a), pendingIntent))
219
                            .addAction(new Notification.Action(R.mipmap.ic_launcher,
220
                                    context.getString(R.string.action_b), pendingIntent))
221
                            .addAction(new Notification.Action(R.mipmap.ic_launcher,
222
                                    context.getString(R.string.action_c), pendingIntent))
223
                            .addAction(new Notification.Action(R.mipmap.ic_launcher,
224
                                    context.getString(R.string.action_d), pendingIntent))
225
                            .setCustomSizePreset(Notification.WearableExtender.SIZE_XSMALL))
226
                    .build();
227
        }
228
 
229
        private Notification createPageForCustomHeight(Context context, int heightDisplayDp,
230
                int pageNameResId) {
231
            int contentHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
232
                    heightDisplayDp, context.getResources().getDisplayMetrics());
233
            Intent displayIntent = new Intent(context, BasicNotificationDisplayActivity.class)
234
                    .setData(Uri.fromParts("example", "height/" + heightDisplayDp, null))
235
                    .putExtra(BasicNotificationDisplayActivity.EXTRA_TITLE,
236
                            context.getString(pageNameResId));
237
            return buildBasicNotification(context)
238
                    .extend(new Notification.WearableExtender()
239
                            .setDisplayIntent(PendingIntent.getActivity(context, 0, displayIntent,
240
                                    PendingIntent.FLAG_UPDATE_CURRENT))
241
                            .setCustomContentHeight(contentHeight))
242
                    .build();
243
        }
244
 
245
        private Notification createPageForSizePreset(Context context, int sizePreset,
246
                int pageNameResId, int contentAction) {
247
           Intent displayIntent = new Intent(context, BasicNotificationDisplayActivity.class)
248
                    .setData(Uri.fromParts("example", "size/" + sizePreset, null))
249
                    .putExtra(BasicNotificationDisplayActivity.EXTRA_TITLE,
250
                            context.getString(pageNameResId));
251
            return buildBasicNotification(context)
252
                    .extend(new Notification.WearableExtender()
253
                            .setDisplayIntent(PendingIntent.getActivity(context, 0, displayIntent,
254
                                    PendingIntent.FLAG_UPDATE_CURRENT))
255
                            .setCustomSizePreset(sizePreset)
256
                            .setContentAction(contentAction))
257
                    .build();
258
        }
259
    }
260
 
261
    private static class AnimatedDisplayIntentPreset extends NotificationPreset {
262
        public AnimatedDisplayIntentPreset() {
263
            super(R.string.animated_display_intent_example);
264
        }
265
 
266
        @Override
267
        public Notification buildNotification(Context context) {
268
            Intent displayIntent = new Intent(context, AnimatedNotificationDisplayActivity.class);
269
            displayIntent.putExtra(BasicNotificationDisplayActivity.EXTRA_TITLE,
270
                    context.getString(nameResId));
271
            PendingIntent displayPendingIntent = PendingIntent.getActivity(context,
272
                    0, displayIntent, 0);
273
            return buildBasicNotification(context)
274
                    .extend(new Notification.WearableExtender()
275
                            .setDisplayIntent(displayPendingIntent))
276
                    .build();
277
        }
278
    }
279
 
280
    private static class ContentIconPreset extends NotificationPreset {
281
        public ContentIconPreset() {
282
            super(R.string.content_icon_example);
283
        }
284
 
285
        @Override
286
        public Notification buildNotification(Context context) {
287
            Notification page2 = buildBasicNotification(context)
288
                    .extend(new Notification.WearableExtender()
289
                            .setContentIcon(R.drawable.content_icon_small)
290
                            .setContentIconGravity(Gravity.START))
291
                    .build();
292
 
293