• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013 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.android.example.notificationshowcase;
18 
19 import android.app.IntentService;
20 import android.app.Notification;
21 import android.app.NotificationManager;
22 import android.app.PendingIntent;
23 import android.content.Context;
24 import android.content.Intent;
25 import android.graphics.Bitmap;
26 import android.graphics.Canvas;
27 import android.graphics.Typeface;
28 import android.graphics.drawable.BitmapDrawable;
29 import android.graphics.drawable.Drawable;
30 import android.net.Uri;
31 import android.support.v4.app.NotificationCompat;
32 import android.text.SpannableString;
33 import android.text.style.StyleSpan;
34 import android.view.View;
35 
36 import java.util.ArrayList;
37 
38 public class NotificationService extends IntentService {
39 
40     private static final String TAG = "NotificationService";
41 
42     public static final String ACTION_CREATE = "create";
43     public static final int NOTIFICATION_ID = 31338;
44 
NotificationService()45     public NotificationService() {
46         super(TAG);
47     }
48 
NotificationService(String name)49     public NotificationService(String name) {
50         super(name);
51     }
52 
getBitmap(Context context, int resId)53     private static Bitmap getBitmap(Context context, int resId) {
54         int largeIconWidth = (int) context.getResources()
55                 .getDimension(R.dimen.notification_large_icon_width);
56         int largeIconHeight = (int) context.getResources()
57                 .getDimension(R.dimen.notification_large_icon_height);
58         Drawable d = context.getResources().getDrawable(resId);
59         Bitmap b = Bitmap.createBitmap(largeIconWidth, largeIconHeight, Bitmap.Config.ARGB_8888);
60         Canvas c = new Canvas(b);
61         d.setBounds(0, 0, largeIconWidth, largeIconHeight);
62         d.draw(c);
63         return b;
64     }
65 
makeEmailIntent(Context context, String who)66     private static PendingIntent makeEmailIntent(Context context, String who) {
67         final Intent intent = new Intent(android.content.Intent.ACTION_SENDTO,
68                 Uri.parse("mailto:" + who));
69         return PendingIntent.getActivity(
70                 context, 0, intent,
71                 PendingIntent.FLAG_CANCEL_CURRENT);
72     }
73 
makeBigTextNotification(Context context, int update, int id, long when)74     public static Notification makeBigTextNotification(Context context, int update, int id,
75             long when) {
76         String addendum = update > 0 ? "(updated) " : "";
77         String longSmsText = "Hey, looks like\nI'm getting kicked out of this conference" +
78                 " room";
79         if (update > 1) {
80             longSmsText += ", so stay in the hangout and I'll rejoin in about 5-10 minutes" +
81                     ". If you don't see me, assume I got pulled into another meeting. And" +
82                     " now \u2026 I have to find my shoes.";
83         }
84         if (update > 2) {
85             when = System.currentTimeMillis();
86         }
87         NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle();
88         bigTextStyle.bigText(addendum + longSmsText);
89         NotificationCompat.Builder bigTextNotification = new NotificationCompat.Builder(context)
90                 .setContentTitle(addendum + "Mike Cleron")
91                 .setContentIntent(ToastService.getPendingIntent(context, "Clicked on bigText"))
92                 .setContentText(addendum + longSmsText)
93                 .setTicker(addendum + "Mike Cleron: " + longSmsText)
94                 .setWhen(when)
95                 .setLargeIcon(getBitmap(context, R.drawable.bucket))
96                 .setPriority(NotificationCompat.PRIORITY_HIGH)
97                 .addAction(R.drawable.ic_media_next,
98                         "update: " + update,
99                         UpdateService.getPendingIntent(context, update + 1, id, when))
100                 .setSmallIcon(R.drawable.stat_notify_talk_text)
101                 .setStyle(bigTextStyle);
102         return bigTextNotification.build();
103     }
104 
makeUploadNotification(Context context, int progress, long when)105     public static Notification makeUploadNotification(Context context, int progress, long when) {
106         NotificationCompat.Builder uploadNotification = new NotificationCompat.Builder(context)
107                 .setContentTitle("File Upload")
108                 .setContentText("foo.txt")
109                 .setPriority(NotificationCompat.PRIORITY_MIN)
110                 .setContentIntent(ToastService.getPendingIntent(context, "Clicked on Upload"))
111                 .setWhen(when)
112                 .setSmallIcon(R.drawable.ic_menu_upload)
113                 .setProgress(100, Math.min(progress, 100), false);
114         return uploadNotification.build();
115     }
116 
117     @Override
onHandleIntent(Intent intent)118     protected void onHandleIntent(Intent intent) {
119         ArrayList<Notification> mNotifications = new ArrayList<Notification>();
120         NotificationManager noMa =
121                 (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
122 
123         int bigtextId = mNotifications.size();
124         mNotifications.add(makeBigTextNotification(this, 0, bigtextId, System.currentTimeMillis()));
125 
126         int uploadId = mNotifications.size();
127         long uploadWhen = System.currentTimeMillis();
128         mNotifications.add(makeUploadNotification(this, 10, uploadWhen));
129 
130         Notification phoneCall = new NotificationCompat.Builder(this)
131                 .setContentTitle("Incoming call")
132                 .setContentText("Matias Duarte")
133                 .setLargeIcon(getBitmap(this, R.drawable.matias_hed))
134                 .setSmallIcon(R.drawable.stat_sys_phone_call)
135                 .setDefaults(Notification.DEFAULT_SOUND)
136                 .setPriority(NotificationCompat.PRIORITY_MAX)
137                 .setContentIntent(ToastService.getPendingIntent(this, "Clicked on Matias"))
138                 .addAction(R.drawable.ic_dial_action_call, "Answer",
139                         ToastService.getPendingIntent(this, "call answered"))
140                 .addAction(R.drawable.ic_end_call, "Ignore",
141                         ToastService.getPendingIntent(this, "call ignored"))
142                 .setAutoCancel(true)
143                 .build();
144         phoneCall.flags |= Notification.FLAG_INSISTENT;
145         mNotifications.add(phoneCall);
146 
147         mNotifications.add(new NotificationCompat.Builder(this)
148                 .setContentTitle("Stopwatch PRO")
149                 .setContentText("Counting up")
150                 .setContentIntent(ToastService.getPendingIntent(this, "Clicked on Stopwatch"))
151                 .setSmallIcon(R.drawable.stat_notify_alarm)
152                 .setUsesChronometer(true)
153                 .build());
154 
155         mNotifications.add(new NotificationCompat.Builder(this)
156                 .setContentTitle("J Planning")
157                 .setContentText("The Botcave")
158                 .setWhen(System.currentTimeMillis())
159                 .setSmallIcon(R.drawable.stat_notify_calendar)
160                 .setContentIntent(ToastService.getPendingIntent(this, "Clicked on calendar event"))
161                 .setContentInfo("7PM")
162                 .addAction(R.drawable.stat_notify_snooze, "+10 min",
163                         ToastService.getPendingIntent(this, "snoozed 10 min"))
164                 .addAction(R.drawable.stat_notify_snooze_longer, "+1 hour",
165                         ToastService.getPendingIntent(this, "snoozed 1 hr"))
166                 .addAction(R.drawable.stat_notify_email, "Email",
167                         makeEmailIntent(this,
168                                 "gabec@example.com,mcleron@example.com,dsandler@example.com"))
169                 .build());
170 
171         BitmapDrawable d =
172                 (BitmapDrawable) getResources().getDrawable(R.drawable.romainguy_rockaway);
173         mNotifications.add(new NotificationCompat.BigPictureStyle(
174                 new NotificationCompat.Builder(this)
175                         .setContentTitle("Romain Guy")
176                         .setContentText("I was lucky to find a Canon 5D Mk III at a local Bay Area "
177                                 + "store last week but I had not been able to try it in the field "
178                                 + "until tonight. After a few days of rain the sky finally cleared "
179                                 + "up. Rockaway Beach did not disappoint and I was finally able to "
180                                 + "see what my new camera feels like when shooting landscapes.")
181                         .setSmallIcon(R.drawable.ic_stat_gplus)
182                         .setContentIntent(
183                                 ToastService.getPendingIntent(this, "Clicked on bigPicture"))
184                         .setLargeIcon(getBitmap(this, R.drawable.romainguy_hed))
185                         .addAction(R.drawable.add, "Add to Gallery",
186                                 ToastService.getPendingIntent(this, "added! (just kidding)"))
187                         .setSubText("talk rocks!"))
188                 .bigPicture(d.getBitmap())
189                 .build());
190 
191         // Note: this may conflict with real email notifications
192         StyleSpan bold = new StyleSpan(Typeface.BOLD);
193         SpannableString line1 = new SpannableString("Alice: hey there!");
194         line1.setSpan(bold, 0, 5, 0);
195         SpannableString line2 = new SpannableString("Bob: hi there!");
196         line2.setSpan(bold, 0, 3, 0);
197         SpannableString line3 = new SpannableString("Charlie: Iz IN UR EMAILZ!!");
198         line3.setSpan(bold, 0, 7, 0);
199         mNotifications.add(new NotificationCompat.InboxStyle(
200                 new NotificationCompat.Builder(this)
201                         .setContentTitle("24 new messages")
202                         .setContentText("You have mail!")
203                         .setSubText("test.hugo2@gmail.com")
204                         .setContentIntent(ToastService.getPendingIntent(this, "Clicked on Email"))
205                         .setSmallIcon(R.drawable.stat_notify_email))
206                 .setSummaryText("+21 more")
207                 .addLine(line1)
208                 .addLine(line2)
209                 .addLine(line3)
210                 .build());
211 
212         mNotifications.add(new NotificationCompat.Builder(this)
213                 .setContentTitle("Twitter")
214                 .setContentText("New mentions")
215                 .setContentIntent(ToastService.getPendingIntent(this, "Clicked on Twitter"))
216                 .setSmallIcon(R.drawable.twitter_icon)
217                 .setNumber(15)
218                 .setPriority(NotificationCompat.PRIORITY_LOW)
219                 .build());
220 
221 
222         for (int i=0; i<mNotifications.size(); i++) {
223             noMa.notify(NOTIFICATION_ID + i, mNotifications.get(i));
224         }
225 
226         ProgressService.startProgressUpdater(this, uploadId, uploadWhen, 0);
227     }
228 }
229