(Broken by change I9fae5a4a). Bug: 8564511 Change-Id: I0d5b65e6678018630c812c5616e9b3f068029e66
512 lines
16 KiB
Java
512 lines
16 KiB
Java
/*
|
|
* 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);
|
|
}
|
|
}
|
|
|