| /* |
| * Copyright (C) 2010 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.android.statusbartest; |
| |
| import java.util.GregorianCalendar; |
| |
| import android.app.Activity; |
| import android.app.Notification; |
| import android.app.NotificationManager; |
| import android.app.PendingIntent; |
| import android.content.Context; |
| import android.content.ContentResolver; |
| import android.content.Intent; |
| import android.graphics.Bitmap; |
| import android.graphics.drawable.BitmapDrawable; |
| import android.net.Uri; |
| import android.os.Bundle; |
| import android.os.Environment; |
| import android.os.Handler; |
| import android.os.Vibrator; |
| import android.os.Handler; |
| import android.text.SpannableStringBuilder; |
| import android.text.TextUtils; |
| import android.util.Log; |
| import android.net.Uri; |
| import android.os.SystemClock; |
| import android.view.View; |
| import android.widget.CompoundButton; |
| import android.widget.RadioButton; |
| import android.widget.RadioGroup; |
| import android.widget.RemoteViews; |
| import android.os.PowerManager; |
| |
| public class NotificationBuilderTest extends Activity |
| { |
| private final static String TAG = "NotificationTestList"; |
| |
| private final static String NOTIFY_TAG = "foo"; |
| |
| NotificationManager mNM; |
| Handler mHandler; |
| int mStartDelay; |
| |
| @Override |
| public void onCreate(Bundle icicle) { |
| super.onCreate(icicle); |
| mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); |
| mHandler = new Handler(); |
| setContentView(R.layout.notification_builder_test); |
| if (icicle == null) { |
| setDefaults(); |
| } |
| for (int id: new int[] { |
| R.id.clear_1, |
| R.id.clear_2, |
| R.id.clear_3, |
| R.id.clear_4, |
| R.id.clear_5, |
| R.id.clear_6, |
| R.id.clear_7, |
| R.id.clear_8, |
| R.id.clear_9, |
| R.id.clear_10, |
| R.id.notify_1, |
| R.id.notify_2, |
| R.id.notify_3, |
| R.id.notify_4, |
| R.id.notify_5, |
| R.id.notify_6, |
| R.id.notify_7, |
| R.id.notify_8, |
| R.id.notify_9, |
| R.id.notify_10, |
| R.id.ten, |
| R.id.clear_all, |
| }) { |
| findViewById(id).setOnClickListener(mClickListener); |
| } |
| } |
| |
| private void setDefaults() { |
| setChecked(R.id.when_now); |
| setChecked(R.id.icon_surprise); |
| setChecked(R.id.title_medium); |
| setChecked(R.id.text_medium); |
| setChecked(R.id.info_none); |
| setChecked(R.id.number_0); |
| setChecked(R.id.intent_alert); |
| setChecked(R.id.delete_none); |
| setChecked(R.id.full_screen_none); |
| setChecked(R.id.ticker_none); |
| setChecked(R.id.large_icon_none); |
| setChecked(R.id.sound_none); |
| setChecked(R.id.vibrate_none); |
| setChecked(R.id.pri_default); |
| setChecked(R.id.lights_red); |
| setChecked(R.id.lights_off); |
| setChecked(R.id.delay_none); |
| // setChecked(R.id.default_vibrate); |
| // setChecked(R.id.default_sound); |
| // setChecked(R.id.default_lights); |
| } |
| |
| private View.OnClickListener mClickListener = new View.OnClickListener() { |
| public void onClick(View v) { |
| switch (v.getId()) { |
| case R.id.clear_1: |
| cancelNotification(1); |
| break; |
| case R.id.clear_2: |
| cancelNotification(2); |
| break; |
| case R.id.clear_3: |
| cancelNotification(3); |
| break; |
| case R.id.clear_4: |
| cancelNotification(4); |
| break; |
| case R.id.clear_5: |
| cancelNotification(5); |
| break; |
| case R.id.clear_6: |
| cancelNotification(6); |
| break; |
| case R.id.clear_7: |
| cancelNotification(7); |
| break; |
| case R.id.clear_8: |
| cancelNotification(8); |
| break; |
| case R.id.clear_9: |
| cancelNotification(9); |
| break; |
| case R.id.clear_10: |
| cancelNotification(10); |
| break; |
| case R.id.notify_1: |
| sendNotification(1); |
| break; |
| case R.id.notify_2: |
| sendNotification(2); |
| break; |
| case R.id.notify_3: |
| sendNotification(3); |
| break; |
| case R.id.notify_4: |
| sendNotification(4); |
| break; |
| case R.id.notify_5: |
| sendNotification(5); |
| break; |
| case R.id.notify_6: |
| sendNotification(6); |
| break; |
| case R.id.notify_7: |
| sendNotification(7); |
| break; |
| case R.id.notify_8: |
| sendNotification(8); |
| break; |
| case R.id.notify_9: |
| sendNotification(9); |
| break; |
| case R.id.notify_10: |
| sendNotification(10); |
| break; |
| case R.id.ten: { |
| for (int id=1; id<=10; id++) { |
| sendNotification(id); |
| } |
| break; |
| } |
| case R.id.clear_all: { |
| for (int id=1; id<=10; id++) { |
| mNM.cancel(id); |
| } |
| break; |
| } |
| } |
| } |
| }; |
| |
| private void sendNotification(final int id) { |
| final Notification n = buildNotification(id); |
| mHandler.postDelayed(new Runnable() { |
| public void run() { |
| mNM.notify(NOTIFY_TAG, id, n); |
| } |
| }, mStartDelay); |
| } |
| |
| private void cancelNotification(final int id) { |
| mNM.cancel(NOTIFY_TAG, id); |
| } |
| |
| private static CharSequence subst(CharSequence in, char ch, CharSequence sub) { |
| int i=0; |
| SpannableStringBuilder edit = new SpannableStringBuilder(in); |
| while (i<edit.length()) { |
| if (edit.charAt(i) == ch) { |
| edit.replace(i, i+1, sub); |
| i += sub.length(); |
| } else { |
| i ++; |
| } |
| } |
| return edit; |
| } |
| |
| private Notification buildNotification(int id) { |
| Notification.Builder b = new Notification.Builder(this); |
| |
| // when |
| switch (getRadioChecked(R.id.group_when)) { |
| case R.id.when_midnight: { |
| GregorianCalendar c = new GregorianCalendar(); |
| c.set(GregorianCalendar.HOUR_OF_DAY, 0); |
| c.set(GregorianCalendar.MINUTE, 0); |
| c.set(GregorianCalendar.SECOND, 0); |
| b.setWhen(c.getTimeInMillis()); |
| break; |
| } |
| case R.id.when_now: |
| b.setWhen(System.currentTimeMillis()); |
| break; |
| case R.id.when_now_plus_1h: |
| break; |
| case R.id.when_tomorrow: |
| break; |
| } |
| |
| // icon |
| switch (getRadioChecked(R.id.group_icon)) { |
| case R.id.icon_im: |
| b.setSmallIcon(R.drawable.icon1); |
| break; |
| case R.id.icon_alert: |
| b.setSmallIcon(R.drawable.icon2); |
| break; |
| case R.id.icon_surprise: |
| b.setSmallIcon(R.drawable.emo_im_kissing); |
| break; |
| } |
| |
| // title |
| final CharSequence title = getRadioTag(R.id.group_title); |
| if (!TextUtils.isEmpty(title)) { |
| b.setContentTitle(title); |
| } |
| |
| // text |
| final CharSequence text = getRadioTag(R.id.group_text); |
| if (!TextUtils.isEmpty(text)) { |
| if (getRadioChecked(R.id.group_text) == R.id.text_emoji) { |
| // UTF-16 for +1F335 |
| b.setContentText(subst(text, |
| '_', "\ud83c\udf35")); |
| } else { |
| b.setContentText(text); |
| } |
| } |
| |
| // info |
| final CharSequence info = getRadioTag(R.id.group_info); |
| if (!TextUtils.isEmpty(info)) { |
| b.setContentInfo(info); |
| } |
| |
| // number |
| b.setNumber(getRadioInt(R.id.group_number, 0)); |
| |
| // contentIntent |
| switch (getRadioChecked(R.id.group_intent)) { |
| case R.id.intent_none: |
| break; |
| case R.id.intent_alert: |
| b.setContentIntent(makeContentIntent(id)); |
| break; |
| } |
| |
| // deleteIntent |
| switch (getRadioChecked(R.id.group_delete)) { |
| case R.id.delete_none: |
| break; |
| case R.id.delete_alert: |
| b.setDeleteIntent(makeDeleteIntent(id)); |
| break; |
| } |
| |
| // fullScreenIntent TODO |
| |
| // ticker |
| switch (getRadioChecked(R.id.group_ticker)) { |
| case R.id.ticker_none: |
| break; |
| case R.id.ticker_short: |
| case R.id.ticker_wrap: |
| case R.id.ticker_haiku: |
| b.setTicker(getRadioTag(R.id.group_ticker)); |
| break; |
| case R.id.ticker_emoji: |
| // UTF-16 for +1F335 |
| b.setTicker(subst(getRadioTag(R.id.group_ticker), |
| '_', "\ud83c\udf35")); |
| break; |
| case R.id.ticker_custom: |
| // TODO |
| break; |
| } |
| |
| // largeIcon |
| switch (getRadioChecked(R.id.group_large_icon)) { |
| case R.id.large_icon_none: |
| break; |
| case R.id.large_icon_pineapple: |
| b.setLargeIcon(loadBitmap(R.drawable.pineapple)); |
| break; |
| case R.id.large_icon_pineapple2: |
| b.setLargeIcon(loadBitmap(R.drawable.pineapple2)); |
| break; |
| case R.id.large_icon_small: |
| b.setLargeIcon(loadBitmap(R.drawable.icon2)); |
| break; |
| } |
| |
| // sound TODO |
| |
| // vibrate |
| switch (getRadioChecked(R.id.group_vibrate)) { |
| case R.id.vibrate_none: |
| b.setVibrate(null); |
| break; |
| case R.id.vibrate_zero: |
| b.setVibrate(new long[] { 0 }); |
| break; |
| case R.id.vibrate_short: |
| b.setVibrate(new long[] { 0, 100 }); |
| break; |
| case R.id.vibrate_long: |
| b.setVibrate(new long[] { 0, 1000 }); |
| break; |
| case R.id.vibrate_pattern: |
| b.setVibrate(new long[] { 0, 50, 200, 50, 200, 50, 500, |
| 500, 200, 500, 200, 500, 500, |
| 50, 200, 50, 200, 50 }); |
| break; |
| } |
| |
| // lights |
| final int color = getRadioHex(R.id.group_lights_color, 0xff0000); |
| int onMs; |
| int offMs; |
| switch (getRadioChecked(R.id.group_lights_blink)) { |
| case R.id.lights_slow: |
| onMs = 1300; |
| offMs = 1300; |
| break; |
| case R.id.lights_fast: |
| onMs = 300; |
| offMs = 300; |
| break; |
| case R.id.lights_on: |
| onMs = 1; |
| offMs = 0; |
| break; |
| case R.id.lights_off: |
| default: |
| onMs = 0; |
| offMs = 0; |
| break; |
| } |
| if (onMs != 0 && offMs != 0) { |
| b.setLights(color, onMs, offMs); |
| } |
| |
| // priority |
| switch (getRadioChecked(R.id.group_priority)) { |
| case R.id.pri_min: |
| b.setPriority(Notification.PRIORITY_MIN); |
| break; |
| case R.id.pri_low: |
| b.setPriority(Notification.PRIORITY_LOW); |
| break; |
| case R.id.pri_default: |
| b.setPriority(Notification.PRIORITY_DEFAULT); |
| break; |
| case R.id.pri_high: |
| b.setPriority(Notification.PRIORITY_HIGH); |
| break; |
| case R.id.pri_max: |
| b.setPriority(Notification.PRIORITY_MAX); |
| break; |
| } |
| |
| // start delay |
| switch (getRadioChecked(R.id.group_delay)) { |
| case R.id.delay_none: |
| mStartDelay = 0; |
| break; |
| case R.id.delay_5: |
| mStartDelay = 5000; |
| break; |
| } |
| |
| // flags |
| b.setOngoing(getChecked(R.id.flag_ongoing)); |
| b.setOnlyAlertOnce(getChecked(R.id.flag_once)); |
| b.setAutoCancel(getChecked(R.id.flag_auto_cancel)); |
| |
| // defaults |
| int defaults = 0; |
| if (getChecked(R.id.default_sound)) { |
| defaults |= Notification.DEFAULT_SOUND; |
| } |
| if (getChecked(R.id.default_vibrate)) { |
| defaults |= Notification.DEFAULT_VIBRATE; |
| } |
| if (getChecked(R.id.default_lights)) { |
| defaults |= Notification.DEFAULT_LIGHTS; |
| } |
| b.setDefaults(defaults); |
| |
| return b.build(); |
| } |
| |
| private void setChecked(int id) { |
| final CompoundButton b = (CompoundButton)findViewById(id); |
| b.setChecked(true); |
| } |
| |
| private int getRadioChecked(int id) { |
| final RadioGroup g = (RadioGroup)findViewById(id); |
| return g.getCheckedRadioButtonId(); |
| } |
| |
| private String getRadioTag(int id) { |
| final RadioGroup g = (RadioGroup)findViewById(id); |
| final View v = findViewById(g.getCheckedRadioButtonId()); |
| return (String) v.getTag(); |
| } |
| |
| private int getRadioInt(int id, int def) { |
| String str = getRadioTag(id); |
| if (TextUtils.isEmpty(str)) { |
| return def; |
| } else { |
| try { |
| return Integer.parseInt(str.toString()); |
| } catch (NumberFormatException ex) { |
| return def; |
| } |
| } |
| } |
| |
| private int getRadioHex(int id, int def) { |
| String str = getRadioTag(id); |
| if (TextUtils.isEmpty(str)) { |
| return def; |
| } else { |
| if (str.startsWith("0x")) { |
| str = str.substring(2); |
| } |
| try { |
| return Integer.parseInt(str.toString(), 16); |
| } catch (NumberFormatException ex) { |
| return def; |
| } |
| } |
| } |
| |
| private boolean getChecked(int id) { |
| final CompoundButton b = (CompoundButton)findViewById(id); |
| return b.isChecked(); |
| } |
| |
| private Bitmap loadBitmap(int id) { |
| final BitmapDrawable bd = (BitmapDrawable)getResources().getDrawable(id); |
| return Bitmap.createBitmap(bd.getBitmap()); |
| } |
| |
| private PendingIntent makeDeleteIntent(int id) { |
| Intent intent = new Intent(this, ConfirmationActivity.class); |
| intent.setData(Uri.fromParts("content", "//status_bar_test/delete/" + id, null)); |
| intent.putExtra(ConfirmationActivity.EXTRA_TITLE, "Delete intent"); |
| intent.putExtra(ConfirmationActivity.EXTRA_TEXT, "id: " + id); |
| return PendingIntent.getActivity(this, 0, intent, 0); |
| } |
| |
| private PendingIntent makeContentIntent(int id) { |
| Intent intent = new Intent(this, ConfirmationActivity.class); |
| intent.setData(Uri.fromParts("content", "//status_bar_test/content/" + id, null)); |
| intent.putExtra(ConfirmationActivity.EXTRA_TITLE, "Content intent"); |
| intent.putExtra(ConfirmationActivity.EXTRA_TEXT, "id: " + id); |
| return PendingIntent.getActivity(this, 0, intent, 0); |
| } |
| } |
| |