• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14 
15 package com.example.android.pingme;
16 
17 import android.app.IntentService;
18 import android.app.Notification;
19 import android.app.NotificationManager;
20 import android.app.PendingIntent;
21 import android.content.Intent;
22 import android.support.v4.app.NotificationCompat;
23 import android.util.Log;
24 
25 /**
26  * PingService creates a notification that includes 2 buttons: one to snooze the
27  * notification, and one to dismiss it.
28  */
29 public class PingService extends IntentService {
30 
31     private NotificationManager mNotificationManager;
32     private String mMessage;
33     private int mMillis;
34     NotificationCompat.Builder builder;
35 
PingService()36     public PingService() {
37 
38         // The super call is required. The background thread that IntentService
39         // starts is labeled with the string argument you pass.
40         super("com.example.android.pingme");
41     }
42 
43     @Override
onHandleIntent(Intent intent)44     protected void onHandleIntent(Intent intent) {
45         // The reminder message the user set.
46         mMessage = intent.getStringExtra(CommonConstants.EXTRA_MESSAGE);
47         // The timer duration the user set. The default is 10 seconds.
48         mMillis = intent.getIntExtra(CommonConstants.EXTRA_TIMER,
49                 CommonConstants.DEFAULT_TIMER_DURATION);
50         NotificationManager nm = (NotificationManager)
51                 getSystemService(NOTIFICATION_SERVICE);
52 
53         String action = intent.getAction();
54         // This section handles the 3 possible actions:
55         // ping, snooze, and dismiss.
56         if(action.equals(CommonConstants.ACTION_PING)) {
57             issueNotification(intent, mMessage);
58         } else if (action.equals(CommonConstants.ACTION_SNOOZE)) {
59             nm.cancel(CommonConstants.NOTIFICATION_ID);
60             Log.d(CommonConstants.DEBUG_TAG, getString(R.string.snoozing));
61             // Sets a snooze-specific "done snoozing" message.
62             issueNotification(intent, getString(R.string.done_snoozing));
63 
64         } else if (action.equals(CommonConstants.ACTION_DISMISS)) {
65             nm.cancel(CommonConstants.NOTIFICATION_ID);
66         }
67     }
68 
issueNotification(Intent intent, String msg)69     private void issueNotification(Intent intent, String msg) {
70         mNotificationManager = (NotificationManager)
71                 getSystemService(NOTIFICATION_SERVICE);
72 
73         // Sets up the Snooze and Dismiss action buttons that will appear in the
74         // expanded view of the notification.
75         Intent dismissIntent = new Intent(this, PingService.class);
76         dismissIntent.setAction(CommonConstants.ACTION_DISMISS);
77         PendingIntent piDismiss = PendingIntent.getService(this, 0, dismissIntent, 0);
78 
79         Intent snoozeIntent = new Intent(this, PingService.class);
80         snoozeIntent.setAction(CommonConstants.ACTION_SNOOZE);
81         PendingIntent piSnooze = PendingIntent.getService(this, 0, snoozeIntent, 0);
82 
83         // Constructs the Builder object.
84         builder =
85                 new NotificationCompat.Builder(this)
86                 .setSmallIcon(R.drawable.ic_stat_notification)
87                 .setContentTitle(getString(R.string.notification))
88                 .setContentText(getString(R.string.ping))
89                 .setDefaults(Notification.DEFAULT_ALL) // requires VIBRATE permission
90                 /*
91                  * Sets the big view "big text" style and supplies the
92                  * text (the user's reminder message) that will be displayed
93                  * in the detail area of the expanded notification.
94                  * These calls are ignored by the support library for
95                  * pre-4.1 devices.
96                  */
97                 .setStyle(new NotificationCompat.BigTextStyle()
98                      .bigText(msg))
99                 .addAction (R.drawable.ic_stat_dismiss,
100                         getString(R.string.dismiss), piDismiss)
101                 .addAction (R.drawable.ic_stat_snooze,
102                         getString(R.string.snooze), piSnooze);
103 
104         /*
105          * Clicking the notification itself displays ResultActivity, which provides
106          * UI for snoozing or dismissing the notification.
107          * This is available through either the normal view or big view.
108          */
109          Intent resultIntent = new Intent(this, ResultActivity.class);
110          resultIntent.putExtra(CommonConstants.EXTRA_MESSAGE, msg);
111          resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
112 
113          // Because clicking the notification opens a new ("special") activity, there's
114          // no need to create an artificial back stack.
115          PendingIntent resultPendingIntent =
116                  PendingIntent.getActivity(
117                  this,
118                  0,
119                  resultIntent,
120                  PendingIntent.FLAG_UPDATE_CURRENT
121          );
122 
123          builder.setContentIntent(resultPendingIntent);
124          startTimer(mMillis);
125     }
126 
issueNotification(NotificationCompat.Builder builder)127     private void issueNotification(NotificationCompat.Builder builder) {
128         mNotificationManager = (NotificationManager)
129                 getSystemService(NOTIFICATION_SERVICE);
130         // Including the notification ID allows you to update the notification later on.
131         mNotificationManager.notify(CommonConstants.NOTIFICATION_ID, builder.build());
132     }
133 
134  // Starts the timer according to the number of seconds the user specified.
startTimer(int millis)135     private void startTimer(int millis) {
136         Log.d(CommonConstants.DEBUG_TAG, getString(R.string.timer_start));
137         try {
138             Thread.sleep(millis);
139 
140         } catch (InterruptedException e) {
141             Log.d(CommonConstants.DEBUG_TAG, getString(R.string.sleep_error));
142         }
143         Log.d(CommonConstants.DEBUG_TAG, getString(R.string.timer_finished));
144         issueNotification(builder);
145     }
146 }
147