blob: 2f0c17365c2e9e9683c73d3b8bb8767abc953247 [file] [log] [blame]
Joe Onorato46439ce2010-11-19 13:56:21 -08001/*
2 * Copyright (C) 2010 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
17package com.android.statusbartest;
18
Joe Onorato80a44402011-01-15 16:22:24 -080019import java.util.GregorianCalendar;
20
Joe Onorato8d0b6552010-11-22 16:09:29 -080021import android.app.Activity;
Joe Onorato46439ce2010-11-19 13:56:21 -080022import android.app.Notification;
23import android.app.NotificationManager;
24import android.app.PendingIntent;
25import android.content.Context;
26import android.content.ContentResolver;
27import android.content.Intent;
28import android.graphics.Bitmap;
29import android.graphics.drawable.BitmapDrawable;
30import android.net.Uri;
Joe Onorato8d0b6552010-11-22 16:09:29 -080031import android.os.Bundle;
Joe Onorato46439ce2010-11-19 13:56:21 -080032import android.os.Environment;
33import android.os.Vibrator;
34import android.os.Handler;
Daniel Sandlerb9d36642012-10-19 13:36:58 -040035import android.text.SpannableStringBuilder;
Joe Onorato8d0b6552010-11-22 16:09:29 -080036import android.text.TextUtils;
Joe Onorato46439ce2010-11-19 13:56:21 -080037import android.util.Log;
38import android.net.Uri;
39import android.os.SystemClock;
Joe Onorato8d0b6552010-11-22 16:09:29 -080040import android.view.View;
41import android.widget.CompoundButton;
42import android.widget.RadioButton;
43import android.widget.RadioGroup;
Joe Onorato46439ce2010-11-19 13:56:21 -080044import android.widget.RemoteViews;
45import android.os.PowerManager;
46
Joe Onorato8d0b6552010-11-22 16:09:29 -080047public class NotificationBuilderTest extends Activity
Joe Onorato46439ce2010-11-19 13:56:21 -080048{
49 private final static String TAG = "NotificationTestList";
50
51 NotificationManager mNM;
52
53 @Override
Joe Onorato8d0b6552010-11-22 16:09:29 -080054 public void onCreate(Bundle icicle) {
55 super.onCreate(icicle);
Joe Onorato46439ce2010-11-19 13:56:21 -080056 mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
Joe Onorato8d0b6552010-11-22 16:09:29 -080057 setContentView(R.layout.notification_builder_test);
58 if (icicle == null) {
59 setDefaults();
60 }
61 for (int id: new int[] {
62 R.id.clear_1,
63 R.id.clear_2,
64 R.id.clear_3,
65 R.id.clear_4,
66 R.id.clear_5,
67 R.id.clear_6,
68 R.id.clear_7,
69 R.id.clear_8,
70 R.id.clear_9,
71 R.id.clear_10,
72 R.id.notify_1,
73 R.id.notify_2,
74 R.id.notify_3,
75 R.id.notify_4,
76 R.id.notify_5,
77 R.id.notify_6,
78 R.id.notify_7,
79 R.id.notify_8,
80 R.id.notify_9,
81 R.id.notify_10,
82 R.id.ten,
83 R.id.clear_all,
84 }) {
85 findViewById(id).setOnClickListener(mClickListener);
86 }
Joe Onorato46439ce2010-11-19 13:56:21 -080087 }
88
Joe Onorato8d0b6552010-11-22 16:09:29 -080089 private void setDefaults() {
90 setChecked(R.id.when_now);
91 setChecked(R.id.icon_surprise);
92 setChecked(R.id.title_medium);
93 setChecked(R.id.text_medium);
94 setChecked(R.id.info_none);
95 setChecked(R.id.number_0);
96 setChecked(R.id.intent_alert);
97 setChecked(R.id.delete_none);
98 setChecked(R.id.full_screen_none);
99 setChecked(R.id.ticker_none);
100 setChecked(R.id.large_icon_none);
101 setChecked(R.id.sound_none);
102 setChecked(R.id.vibrate_none);
103 setChecked(R.id.lights_red);
104 setChecked(R.id.lights_off);
105 }
106
107 private View.OnClickListener mClickListener = new View.OnClickListener() {
108 public void onClick(View v) {
109 switch (v.getId()) {
110 case R.id.clear_1:
111 mNM.cancel(1);
112 break;
113 case R.id.clear_2:
114 mNM.cancel(2);
115 break;
116 case R.id.clear_3:
117 mNM.cancel(3);
118 break;
119 case R.id.clear_4:
120 mNM.cancel(4);
121 break;
122 case R.id.clear_5:
123 mNM.cancel(5);
124 break;
125 case R.id.clear_6:
126 mNM.cancel(6);
127 break;
128 case R.id.clear_7:
129 mNM.cancel(7);
130 break;
131 case R.id.clear_8:
132 mNM.cancel(8);
133 break;
134 case R.id.clear_9:
135 mNM.cancel(9);
136 break;
137 case R.id.clear_10:
138 mNM.cancel(10);
139 break;
140 case R.id.notify_1:
141 sendNotification(1);
142 break;
143 case R.id.notify_2:
144 sendNotification(2);
145 break;
146 case R.id.notify_3:
147 sendNotification(3);
148 break;
149 case R.id.notify_4:
150 sendNotification(4);
151 break;
152 case R.id.notify_5:
153 sendNotification(5);
154 break;
155 case R.id.notify_6:
156 sendNotification(6);
157 break;
158 case R.id.notify_7:
159 sendNotification(7);
160 break;
161 case R.id.notify_8:
162 sendNotification(8);
163 break;
164 case R.id.notify_9:
165 sendNotification(9);
166 break;
167 case R.id.notify_10:
168 sendNotification(10);
169 break;
170 case R.id.ten: {
171 for (int id=1; id<=10; id++) {
172 sendNotification(id);
173 }
174 break;
175 }
176 case R.id.clear_all: {
177 for (int id=1; id<=10; id++) {
178 mNM.cancel(id);
179 }
180 break;
181 }
Joe Onorato46439ce2010-11-19 13:56:21 -0800182 }
Joe Onorato8d0b6552010-11-22 16:09:29 -0800183 }
Joe Onorato46439ce2010-11-19 13:56:21 -0800184 };
185
Joe Onorato8d0b6552010-11-22 16:09:29 -0800186 private void sendNotification(int id) {
187 final Notification n = buildNotification(id);
188 mNM.notify(id, n);
Joe Onorato561d3852010-11-20 18:09:34 -0800189 }
190
Daniel Sandlerb9d36642012-10-19 13:36:58 -0400191 private static CharSequence subst(CharSequence in, char ch, CharSequence sub) {
192 int i=0;
193 SpannableStringBuilder edit = new SpannableStringBuilder(in);
194 while (i<edit.length()) {
195 if (edit.charAt(i) == ch) {
196 edit.replace(i, i+1, sub);
197 i += sub.length();
198 } else {
199 i ++;
200 }
201 }
202 return edit;
203 }
204
Joe Onorato8d0b6552010-11-22 16:09:29 -0800205 private Notification buildNotification(int id) {
206 Notification.Builder b = new Notification.Builder(this);
207
208 // when
209 switch (getRadioChecked(R.id.group_when)) {
Joe Onorato80a44402011-01-15 16:22:24 -0800210 case R.id.when_midnight: {
211 GregorianCalendar c = new GregorianCalendar();
212 c.set(GregorianCalendar.HOUR_OF_DAY, 0);
213 c.set(GregorianCalendar.MINUTE, 0);
214 c.set(GregorianCalendar.SECOND, 0);
215 b.setWhen(c.getTimeInMillis());
Joe Onorato8d0b6552010-11-22 16:09:29 -0800216 break;
Joe Onorato80a44402011-01-15 16:22:24 -0800217 }
Joe Onorato8d0b6552010-11-22 16:09:29 -0800218 case R.id.when_now:
219 b.setWhen(System.currentTimeMillis());
220 break;
221 case R.id.when_now_plus_1h:
222 break;
223 case R.id.when_tomorrow:
224 break;
225 }
226
227 // icon
228 switch (getRadioChecked(R.id.group_icon)) {
229 case R.id.icon_im:
230 b.setSmallIcon(R.drawable.icon1);
231 break;
232 case R.id.icon_alert:
233 b.setSmallIcon(R.drawable.icon2);
234 break;
235 case R.id.icon_surprise:
236 b.setSmallIcon(R.drawable.emo_im_kissing);
237 break;
238 }
239
240 // title
Daniel Sandlerb9d36642012-10-19 13:36:58 -0400241 final CharSequence title = getRadioTag(R.id.group_title);
Joe Onorato8d0b6552010-11-22 16:09:29 -0800242 if (!TextUtils.isEmpty(title)) {
243 b.setContentTitle(title);
244 }
245
246 // text
Daniel Sandlerb9d36642012-10-19 13:36:58 -0400247 final CharSequence text = getRadioTag(R.id.group_text);
Joe Onorato8d0b6552010-11-22 16:09:29 -0800248 if (!TextUtils.isEmpty(text)) {
Daniel Sandlerb9d36642012-10-19 13:36:58 -0400249 if (getRadioChecked(R.id.group_text) == R.id.text_emoji) {
250 // UTF-16 for +1F335
251 b.setContentText(subst(text,
252 '_', "\ud83c\udf35"));
253 } else {
254 b.setContentText(text);
255 }
Joe Onorato8d0b6552010-11-22 16:09:29 -0800256 }
257
258 // info
Daniel Sandlerb9d36642012-10-19 13:36:58 -0400259 final CharSequence info = getRadioTag(R.id.group_info);
Joe Onorato8d0b6552010-11-22 16:09:29 -0800260 if (!TextUtils.isEmpty(info)) {
261 b.setContentInfo(info);
262 }
263
264 // number
265 b.setNumber(getRadioInt(R.id.group_number, 0));
266
267 // contentIntent
268 switch (getRadioChecked(R.id.group_intent)) {
269 case R.id.intent_none:
270 break;
271 case R.id.intent_alert:
272 b.setContentIntent(makeContentIntent(id));
273 break;
274 }
275
276 // deleteIntent
277 switch (getRadioChecked(R.id.group_delete)) {
278 case R.id.delete_none:
279 break;
280 case R.id.delete_alert:
281 b.setDeleteIntent(makeDeleteIntent(id));
282 break;
283 }
284
285 // fullScreenIntent TODO
286
287 // ticker
288 switch (getRadioChecked(R.id.group_ticker)) {
289 case R.id.ticker_none:
290 break;
291 case R.id.ticker_short:
292 case R.id.ticker_wrap:
293 case R.id.ticker_haiku:
294 b.setTicker(getRadioTag(R.id.group_ticker));
295 break;
Daniel Sandlerb9d36642012-10-19 13:36:58 -0400296 case R.id.ticker_emoji:
297 // UTF-16 for +1F335
298 b.setTicker(subst(getRadioTag(R.id.group_ticker),
299 '_', "\ud83c\udf35"));
300 break;
Joe Onorato8d0b6552010-11-22 16:09:29 -0800301 case R.id.ticker_custom:
302 // TODO
303 break;
304 }
305
306 // largeIcon
307 switch (getRadioChecked(R.id.group_large_icon)) {
308 case R.id.large_icon_none:
309 break;
310 case R.id.large_icon_pineapple:
311 b.setLargeIcon(loadBitmap(R.drawable.pineapple));
312 break;
Joe Onorato80a44402011-01-15 16:22:24 -0800313 case R.id.large_icon_pineapple2:
314 b.setLargeIcon(loadBitmap(R.drawable.pineapple2));
315 break;
Daniel Sandlera3850b62011-12-06 13:36:03 -0500316 case R.id.large_icon_small:
317 b.setLargeIcon(loadBitmap(R.drawable.icon2));
318 break;
Joe Onorato8d0b6552010-11-22 16:09:29 -0800319 }
320
321 // sound TODO
322
323 // vibrate
324 switch (getRadioChecked(R.id.group_vibrate)) {
325 case R.id.vibrate_none:
326 break;
327 case R.id.vibrate_short:
328 b.setVibrate(new long[] { 0, 200 });
329 break;
330 case R.id.vibrate_medium:
331 b.setVibrate(new long[] { 0, 500 });
332 break;
333 case R.id.vibrate_long:
334 b.setVibrate(new long[] { 0, 1000 });
335 break;
336 case R.id.vibrate_pattern:
337 b.setVibrate(new long[] { 0, 250, 250, 250, 250, 250, 250, 250 });
338 break;
339 }
340
341 // lights
342 final int color = getRadioInt(R.id.group_lights_color, 0xff0000);
343 int onMs;
344 int offMs;
345 switch (getRadioChecked(R.id.group_lights_blink)) {
346 case R.id.lights_slow:
347 onMs = 1300;
348 offMs = 1300;
349 break;
350 case R.id.lights_fast:
351 onMs = 300;
352 offMs = 300;
353 break;
354 case R.id.lights_on:
355 onMs = 1;
356 offMs = 0;
357 break;
358 case R.id.lights_off:
359 default:
360 onMs = 0;
361 offMs = 0;
362 break;
363 }
364 if (onMs != 0 && offMs != 0) {
365 b.setLights(color, onMs, offMs);
366 }
367
368 // flags
369 b.setOngoing(getChecked(R.id.flag_ongoing));
370 b.setOnlyAlertOnce(getChecked(R.id.flag_once));
371 b.setAutoCancel(getChecked(R.id.flag_auto_cancel));
372
373 // defaults
374 int defaults = 0;
375 if (getChecked(R.id.default_sound)) {
376 defaults |= Notification.DEFAULT_SOUND;
377 }
378 if (getChecked(R.id.default_vibrate)) {
379 defaults |= Notification.DEFAULT_VIBRATE;
380 }
381 if (getChecked(R.id.default_lights)) {
382 defaults |= Notification.DEFAULT_LIGHTS;
383 }
384 b.setDefaults(defaults);
385
386 return b.getNotification();
387 }
388
389 private void setChecked(int id) {
390 final CompoundButton b = (CompoundButton)findViewById(id);
391 b.setChecked(true);
392 }
393
394 private int getRadioChecked(int id) {
395 final RadioGroup g = (RadioGroup)findViewById(id);
396 return g.getCheckedRadioButtonId();
397 }
398
Daniel Sandlerb9d36642012-10-19 13:36:58 -0400399 private CharSequence getRadioTag(int id) {
Joe Onorato8d0b6552010-11-22 16:09:29 -0800400 final RadioGroup g = (RadioGroup)findViewById(id);
401 final View v = findViewById(g.getCheckedRadioButtonId());
Daniel Sandlerb9d36642012-10-19 13:36:58 -0400402 return (CharSequence) v.getTag();
Joe Onorato8d0b6552010-11-22 16:09:29 -0800403 }
404
405 private int getRadioInt(int id, int def) {
Daniel Sandlerb9d36642012-10-19 13:36:58 -0400406 CharSequence str = getRadioTag(id);
Joe Onorato8d0b6552010-11-22 16:09:29 -0800407 if (TextUtils.isEmpty(str)) {
408 return def;
409 } else {
410 try {
Daniel Sandlerb9d36642012-10-19 13:36:58 -0400411 return Integer.parseInt(str.toString());
Joe Onorato8d0b6552010-11-22 16:09:29 -0800412 } catch (NumberFormatException ex) {
413 return def;
414 }
415 }
416 }
417
418 private boolean getChecked(int id) {
419 final CompoundButton b = (CompoundButton)findViewById(id);
420 return b.isChecked();
421 }
422
423 private Bitmap loadBitmap(int id) {
424 final BitmapDrawable bd = (BitmapDrawable)getResources().getDrawable(id);
425 return Bitmap.createBitmap(bd.getBitmap());
Joe Onorato46439ce2010-11-19 13:56:21 -0800426 }
427
428 private PendingIntent makeDeleteIntent(int id) {
429 Intent intent = new Intent(this, ConfirmationActivity.class);
430 intent.setData(Uri.fromParts("content", "//status_bar_test/delete/" + id, null));
431 intent.putExtra(ConfirmationActivity.EXTRA_TITLE, "Delete intent");
432 intent.putExtra(ConfirmationActivity.EXTRA_TEXT, "id: " + id);
433 return PendingIntent.getActivity(this, 0, intent, 0);
434 }
Joe Onorato8d0b6552010-11-22 16:09:29 -0800435
436 private PendingIntent makeContentIntent(int id) {
437 Intent intent = new Intent(this, ConfirmationActivity.class);
438 intent.setData(Uri.fromParts("content", "//status_bar_test/content/" + id, null));
439 intent.putExtra(ConfirmationActivity.EXTRA_TITLE, "Content intent");
440 intent.putExtra(ConfirmationActivity.EXTRA_TEXT, "id: " + id);
441 return PendingIntent.getActivity(this, 0, intent, 0);
442 }
Joe Onorato46439ce2010-11-19 13:56:21 -0800443}
444