NotificationService.java revision fcb0b151aa75dfe1545057f9b513fce14e4b0d44
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
17package com.android.example.notificationshowcase;
18
19import android.app.IntentService;
20import android.app.Notification;
21import android.app.NotificationManager;
22import android.app.PendingIntent;
23import android.content.Context;
24import android.content.Intent;
25import android.graphics.Bitmap;
26import android.graphics.Canvas;
27import android.graphics.Typeface;
28import android.graphics.drawable.BitmapDrawable;
29import android.graphics.drawable.Drawable;
30import android.net.Uri;
31import android.support.v4.app.NotificationCompat;
32import android.text.SpannableString;
33import android.text.style.StyleSpan;
34import android.view.View;
35
36import java.util.ArrayList;
37
38public 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
45    public NotificationService() {
46        super(TAG);
47    }
48
49    public NotificationService(String name) {
50        super(name);
51    }
52
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
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
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
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
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