1 /*
2  * Copyright (C) 2007 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.apis.app;
18 
19 import com.example.android.apis.R;
20 
21 import android.app.Activity;
22 import android.app.Notification;
23 import android.app.NotificationManager;
24 import android.app.PendingIntent;
25 import android.content.ComponentName;
26 import android.content.Intent;
27 import android.os.Bundle;
28 import android.view.View;
29 import android.widget.Button;
30 import android.widget.RemoteViews;
31 
32 /**
33  * Demonstrates adding notifications to the status bar
34  */
35 public class StatusBarNotifications extends Activity {
36 
37     private NotificationManager mNotificationManager;
38 
39     // Use our layout id for a unique identifier
40     private static int MOOD_NOTIFICATIONS = R.layout.status_bar_notifications;
41 
42     @Override
onCreate(Bundle savedInstanceState)43     protected void onCreate(Bundle savedInstanceState) {
44         super.onCreate(savedInstanceState);
45 
46         setContentView(R.layout.status_bar_notifications);
47 
48         Button button;
49 
50         // Get the notification manager serivce.
51         mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
52 
53         button = (Button) findViewById(R.id.happy);
54         button.setOnClickListener(new Button.OnClickListener() {
55             public void onClick(View v) {
56                 setMood(R.drawable.stat_happy, R.string.status_bar_notifications_happy_message,
57                         false);
58             }
59         });
60 
61         button = (Button) findViewById(R.id.neutral);
62         button.setOnClickListener(new Button.OnClickListener() {
63             public void onClick(View v) {
64                 setMood(R.drawable.stat_neutral, R.string.status_bar_notifications_ok_message,
65                         false);
66             }
67         });
68 
69         button = (Button) findViewById(R.id.sad);
70         button.setOnClickListener(new Button.OnClickListener() {
71             public void onClick(View v) {
72                 setMood(R.drawable.stat_sad, R.string.status_bar_notifications_sad_message, false);
73             }
74         });
75 
76         button = (Button) findViewById(R.id.happyMarquee);
77         button.setOnClickListener(new Button.OnClickListener() {
78             public void onClick(View v) {
79                 setMood(R.drawable.stat_happy, R.string.status_bar_notifications_happy_message,
80                         true);
81             }
82         });
83 
84         button = (Button) findViewById(R.id.neutralMarquee);
85         button.setOnClickListener(new Button.OnClickListener() {
86             public void onClick(View v) {
87                 setMood(R.drawable.stat_neutral, R.string.status_bar_notifications_ok_message, true);
88             }
89         });
90 
91         button = (Button) findViewById(R.id.sadMarquee);
92         button.setOnClickListener(new Button.OnClickListener() {
93             public void onClick(View v) {
94                 setMood(R.drawable.stat_sad, R.string.status_bar_notifications_sad_message, true);
95             }
96         });
97 
98         button = (Button) findViewById(R.id.happyViews);
99         button.setOnClickListener(new Button.OnClickListener() {
100             public void onClick(View v) {
101                 setMoodView(R.drawable.stat_happy, R.string.status_bar_notifications_happy_message);
102             }
103         });
104 
105         button = (Button) findViewById(R.id.neutralViews);
106         button.setOnClickListener(new Button.OnClickListener() {
107             public void onClick(View v) {
108                 setMoodView(R.drawable.stat_neutral, R.string.status_bar_notifications_ok_message);
109             }
110         });
111 
112         button = (Button) findViewById(R.id.sadViews);
113         button.setOnClickListener(new Button.OnClickListener() {
114             public void onClick(View v) {
115                 setMoodView(R.drawable.stat_sad, R.string.status_bar_notifications_sad_message);
116             }
117         });
118 
119         button = (Button) findViewById(R.id.defaultSound);
120         button.setOnClickListener(new Button.OnClickListener() {
121             public void onClick(View v) {
122                 setDefault(Notification.DEFAULT_SOUND);
123             }
124         });
125 
126         button = (Button) findViewById(R.id.defaultVibrate);
127         button.setOnClickListener(new Button.OnClickListener() {
128             public void onClick(View v) {
129                 setDefault(Notification.DEFAULT_VIBRATE);
130             }
131         });
132 
133         button = (Button) findViewById(R.id.defaultAll);
134         button.setOnClickListener(new Button.OnClickListener() {
135             public void onClick(View v) {
136                 setDefault(Notification.DEFAULT_ALL);
137             }
138         });
139 
140         button = (Button) findViewById(R.id.clear);
141         button.setOnClickListener(new Button.OnClickListener() {
142             public void onClick(View v) {
143                 mNotificationManager.cancel(R.layout.status_bar_notifications);
144             }
145         });
146     }
147 
makeMoodIntent(int moodId)148     private PendingIntent makeMoodIntent(int moodId) {
149         // The PendingIntent to launch our activity if the user selects this
150         // notification.  Note the use of FLAG_UPDATE_CURRENT so that if there
151         // is already an active matching pending intent, we will update its
152         // extras (and other Intents in the array) to be the ones passed in here.
153         PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
154                 new Intent(this, NotificationDisplay.class).putExtra("moodimg", moodId),
155                 PendingIntent.FLAG_UPDATE_CURRENT);
156         return contentIntent;
157     }
158 
159 //BEGIN_INCLUDE(intent_array)
makeDefaultIntent()160     private PendingIntent makeDefaultIntent() {
161         // A typical convention for notifications is to launch the user deeply
162         // into an application representing the data in the notification; to
163         // accomplish this, we can build an array of intents to insert the back
164         // stack stack history above the item being displayed.
165         Intent[] intents = new Intent[4];
166 
167         // First: root activity of ApiDemos.
168         // This is a convenient way to make the proper Intent to launch and
169         // reset an application's task.
170         intents[0] = Intent.makeRestartActivityTask(new ComponentName(this,
171                 com.example.android.apis.ApiDemos.class));
172 
173         // "App"
174         intents[1] = new Intent(this, com.example.android.apis.ApiDemos.class);
175         intents[1].putExtra("com.example.android.apis.Path", "App");
176         // "App/Notification"
177         intents[2] = new Intent(this, com.example.android.apis.ApiDemos.class);
178         intents[2].putExtra("com.example.android.apis.Path", "App/Notification");
179 
180         // Now the activity to display to the user.
181         intents[3] = new Intent(this, StatusBarNotifications.class);
182 
183         // The PendingIntent to launch our activity if the user selects this
184         // notification.  Note the use of FLAG_UPDATE_CURRENT so that if there
185         // is already an active matching pending intent, we will update its
186         // extras (and other Intents in the array) to be the ones passed in here.
187         PendingIntent contentIntent = PendingIntent.getActivities(this, 0,
188                 intents, PendingIntent.FLAG_UPDATE_CURRENT);
189         return contentIntent;
190     }
191 //END_INCLUDE(intent_array)
192 
setMood(int moodId, int textId, boolean showTicker)193     private void setMood(int moodId, int textId, boolean showTicker) {
194         // In this sample, we'll use the same text for the ticker and the expanded notification
195         CharSequence text = getText(textId);
196 
197         // In this sample, we'll use this text for the title of the notification
198         CharSequence title = getText(R.string.status_bar_notifications_mood_title);
199 
200         // Set the info for the views that show in the notification panel.
201         Notification.Builder notifBuidler = new Notification.Builder(this) // the context to use
202                 .setSmallIcon(moodId)  // the status icon
203                 .setWhen(System.currentTimeMillis())  // the timestamp for the notification
204                 .setContentTitle(title)  // the title for the notification
205                 .setContentText(text)  // the details to display in the notification
206                 .setContentIntent(makeMoodIntent(moodId));  // The intent to send clicked
207 
208         if (showTicker) {
209             // include the ticker text
210             notifBuidler.setTicker(getString(textId));
211         }
212 
213         // Send the notification.
214         // We use a layout id because it is a unique number.  We use it later to cancel.
215         mNotificationManager.notify(MOOD_NOTIFICATIONS, notifBuidler.build());
216     }
217 
setMoodView(int moodId, int textId)218     private void setMoodView(int moodId, int textId) {
219         // Instead of the normal constructor, we're going to use the one with no args and fill
220         // in all of the data ourselves.  The normal one uses the default layout for notifications.
221         // You probably want that in most cases, but if you want to do something custom, you
222         // can set the contentView field to your own RemoteViews object.
223         Notification notif = new Notification();
224 
225         // This is who should be launched if the user selects our notification.
226         notif.contentIntent = makeMoodIntent(moodId);
227 
228         // In this sample, we'll use the same text for the ticker and the expanded notification
229         CharSequence text = getText(textId);
230         notif.tickerText = text;
231 
232         // the icon for the status bar
233         notif.icon = moodId;
234 
235         // our custom view
236         RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.status_bar_balloon);
237         contentView.setTextViewText(R.id.text, text);
238         contentView.setImageViewResource(R.id.icon, moodId);
239         notif.contentView = contentView;
240 
241         // we use a string id because is a unique number.  we use it later to cancel the
242         // notification
243         mNotificationManager.notify(MOOD_NOTIFICATIONS, notif);
244     }
245 
setDefault(int defaults)246     private void setDefault(int defaults) {
247 
248         // This is who should be launched if the user selects our notification.
249         PendingIntent contentIntent = makeDefaultIntent();
250 
251         // In this sample, we'll use the same text for the ticker and the expanded notification
252         CharSequence text = getText(R.string.status_bar_notifications_happy_message);
253 
254         // In this sample, we'll use this text for the title of the notification
255         CharSequence title = getText(R.string.status_bar_notifications_mood_title);
256 
257         // Set the info for the views that show in the notification panel.
258         Notification notification = new Notification.Builder(this) // the context to use
259                 .setSmallIcon(R.drawable.stat_happy)  // the status icon
260                 .setTicker(text)  // the text to display in the ticker
261                 .setWhen(System.currentTimeMillis())  // the timestamp for the notification
262                 .setContentTitle(title)  // the title for the notification
263                 .setContentText(text)  // the details to display in the notification
264                 .setContentIntent(contentIntent)  // The intent to send when the entry is clicked
265                 .setDefaults(defaults)
266                 .build();
267 
268         mNotificationManager.notify(
269                 MOOD_NOTIFICATIONS, // we use a string id because it is a unique
270                                     // number.  we use it later to cancel the notification
271                 notification);
272     }
273 }
274