| /* |
| * Copyright (C) 2012 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.example.android.pingme; |
| |
| import android.app.IntentService; |
| import android.app.Notification; |
| import android.app.NotificationManager; |
| import android.app.PendingIntent; |
| import android.content.Intent; |
| import android.support.v4.app.NotificationCompat; |
| import android.util.Log; |
| |
| /** |
| * PingService creates a notification that includes 2 buttons: one to snooze the |
| * notification, and one to dismiss it. |
| */ |
| public class PingService extends IntentService { |
| |
| private NotificationManager mNotificationManager; |
| private String mMessage; |
| private int mMillis; |
| NotificationCompat.Builder builder; |
| |
| public PingService() { |
| |
| // The super call is required. The background thread that IntentService |
| // starts is labeled with the string argument you pass. |
| super("com.example.android.pingme"); |
| } |
| |
| @Override |
| protected void onHandleIntent(Intent intent) { |
| // The reminder message the user set. |
| mMessage = intent.getStringExtra(CommonConstants.EXTRA_MESSAGE); |
| // The timer duration the user set. The default is 10 seconds. |
| mMillis = intent.getIntExtra(CommonConstants.EXTRA_TIMER, |
| CommonConstants.DEFAULT_TIMER_DURATION); |
| NotificationManager nm = (NotificationManager) |
| getSystemService(NOTIFICATION_SERVICE); |
| |
| String action = intent.getAction(); |
| // This section handles the 3 possible actions: |
| // ping, snooze, and dismiss. |
| if(action.equals(CommonConstants.ACTION_PING)) { |
| issueNotification(intent, mMessage); |
| } else if (action.equals(CommonConstants.ACTION_SNOOZE)) { |
| nm.cancel(CommonConstants.NOTIFICATION_ID); |
| Log.d(CommonConstants.DEBUG_TAG, getString(R.string.snoozing)); |
| // Sets a snooze-specific "done snoozing" message. |
| issueNotification(intent, getString(R.string.done_snoozing)); |
| |
| } else if (action.equals(CommonConstants.ACTION_DISMISS)) { |
| nm.cancel(CommonConstants.NOTIFICATION_ID); |
| } |
| } |
| |
| private void issueNotification(Intent intent, String msg) { |
| mNotificationManager = (NotificationManager) |
| getSystemService(NOTIFICATION_SERVICE); |
| |
| // Sets up the Snooze and Dismiss action buttons that will appear in the |
| // expanded view of the notification. |
| Intent dismissIntent = new Intent(this, PingService.class); |
| dismissIntent.setAction(CommonConstants.ACTION_DISMISS); |
| PendingIntent piDismiss = PendingIntent.getService(this, 0, dismissIntent, 0); |
| |
| Intent snoozeIntent = new Intent(this, PingService.class); |
| snoozeIntent.setAction(CommonConstants.ACTION_SNOOZE); |
| PendingIntent piSnooze = PendingIntent.getService(this, 0, snoozeIntent, 0); |
| |
| // Constructs the Builder object. |
| builder = |
| new NotificationCompat.Builder(this) |
| .setSmallIcon(R.drawable.ic_stat_notification) |
| .setContentTitle(getString(R.string.notification)) |
| .setContentText(getString(R.string.ping)) |
| .setDefaults(Notification.DEFAULT_ALL) // requires VIBRATE permission |
| /* |
| * Sets the big view "big text" style and supplies the |
| * text (the user's reminder message) that will be displayed |
| * in the detail area of the expanded notification. |
| * These calls are ignored by the support library for |
| * pre-4.1 devices. |
| */ |
| .setStyle(new NotificationCompat.BigTextStyle() |
| .bigText(msg)) |
| .addAction (R.drawable.ic_stat_dismiss, |
| getString(R.string.dismiss), piDismiss) |
| .addAction (R.drawable.ic_stat_snooze, |
| getString(R.string.snooze), piSnooze); |
| |
| /* |
| * Clicking the notification itself displays ResultActivity, which provides |
| * UI for snoozing or dismissing the notification. |
| * This is available through either the normal view or big view. |
| */ |
| Intent resultIntent = new Intent(this, ResultActivity.class); |
| resultIntent.putExtra(CommonConstants.EXTRA_MESSAGE, msg); |
| resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); |
| |
| // Because clicking the notification opens a new ("special") activity, there's |
| // no need to create an artificial back stack. |
| PendingIntent resultPendingIntent = |
| PendingIntent.getActivity( |
| this, |
| 0, |
| resultIntent, |
| PendingIntent.FLAG_UPDATE_CURRENT |
| ); |
| |
| builder.setContentIntent(resultPendingIntent); |
| startTimer(mMillis); |
| } |
| |
| private void issueNotification(NotificationCompat.Builder builder) { |
| mNotificationManager = (NotificationManager) |
| getSystemService(NOTIFICATION_SERVICE); |
| // Including the notification ID allows you to update the notification later on. |
| mNotificationManager.notify(CommonConstants.NOTIFICATION_ID, builder.build()); |
| } |
| |
| // Starts the timer according to the number of seconds the user specified. |
| private void startTimer(int millis) { |
| Log.d(CommonConstants.DEBUG_TAG, getString(R.string.timer_start)); |
| try { |
| Thread.sleep(millis); |
| |
| } catch (InterruptedException e) { |
| Log.d(CommonConstants.DEBUG_TAG, getString(R.string.sleep_error)); |
| } |
| Log.d(CommonConstants.DEBUG_TAG, getString(R.string.timer_finished)); |
| issueNotification(builder); |
| } |
| } |