/* * context source is part of the * _____ ___ ____ * __ / / _ \/ _ | / __/___ _______ _ * / // / , _/ __ |/ _/_/ _ \/ __/ _ `/ * \___/_/|_/_/ |_/_/ (_)___/_/ \_, / * /___/ * repository. * * Copyright (C) 2013 Benoit 'BoD' Lubek (BoD@JRAF.org) * Copyright (C) 2014-2015 Carmen Alvarez (c@rmen.ca) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use context 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 ca.rmen.android.networkmonitor.app.service; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.support.v4.app.ActivityCompat; import android.support.v4.app.NotificationCompat; import ca.rmen.android.networkmonitor.Constants; import ca.rmen.android.networkmonitor.R; import ca.rmen.android.networkmonitor.app.email.EmailPreferencesActivity; import ca.rmen.android.networkmonitor.app.log.LogActivity; import ca.rmen.android.networkmonitor.app.main.MainActivity; import ca.rmen.android.networkmonitor.app.prefs.NetMonPreferences; import ca.rmen.android.networkmonitor.util.Log; public class NetMonNotification { private static final String TAG = Constants.TAG + NetMonNotification.class.getSimpleName(); private static final String PREFIX = NetMonService.class.getName() + "."; private static final String ACTION_DISABLE = PREFIX + "ACTION_DISABLE"; private static final int NOTIFICATION_ID_FAILED_EMAIL = 456; private static final int NOTIFICATION_ID_FAILED_TEST = 567; static final int NOTIFICATION_ID_ONGOING = 1; /** * A notification which has the following functionalities: * 1) Tapping on the notification opens the app in the main activity * 2) Tapping on the stop button of the notification stops the service * 3) Tapping on the logs button of the notification opens the log activity */ static Notification createOngoingNotification(Context context) { Log.v(TAG, "createNotification"); context.registerReceiver(sDisableBroadcastReceiver, new IntentFilter(ACTION_DISABLE)); NotificationCompat.Builder builder = new NotificationCompat.Builder(context); builder.setOngoing(true); builder.setPriority(NetMonPreferences.getInstance(context).getNotificationPriority()); builder.setSmallIcon(R.drawable.ic_stat_service_running); builder.setTicker(context.getString(R.string.service_notification_ticker)); builder.setContentTitle(context.getString(R.string.app_name)); builder.setContentText(context.getString(R.string.service_notification_text)); builder.setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT)); builder.addAction(R.drawable.ic_action_stop, context.getString(R.string.service_notification_action_stop), PendingIntent.getBroadcast(context, 0, new Intent(ACTION_DISABLE), PendingIntent.FLAG_CANCEL_CURRENT)); builder.addAction(R.drawable.ic_action_logs, context.getString(R.string.service_notification_action_logs), PendingIntent.getActivity(context, 0, new Intent(context, LogActivity.class), PendingIntent.FLAG_UPDATE_CURRENT)); builder.setColor(ActivityCompat.getColor(context, R.color.netmon_color)); return builder.build(); } static void dismissNotifications(Context context) { Log.v(TAG, "dismissNotification"); context.unregisterReceiver(sDisableBroadcastReceiver); NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancel(NOTIFICATION_ID_ONGOING); notificationManager.cancel(NOTIFICATION_ID_FAILED_EMAIL); notificationManager.cancel(NOTIFICATION_ID_FAILED_TEST); } public static void showEmailFailureNotification(Context context) { showNotification(context, NOTIFICATION_ID_FAILED_EMAIL, R.string.warning_notification_ticker_email_failed, R.string.warning_notification_message_email_failed, EmailPreferencesActivity.class); } public static void dismissEmailFailureNotification(Context context) { NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancel(NOTIFICATION_ID_FAILED_EMAIL); } public static void showFailedTestNotification(Context context) { // Only show this notification if the preference is set to enabled. if (NetMonPreferences.getInstance(context).getShowNotificationOnTestFailure()) { showNotification(context, NOTIFICATION_ID_FAILED_TEST, R.string.warning_notification_ticker_test_failed, R.string.warning_notification_message_test_failed, LogActivity.class); } } public static void dismissFailedTestNotification(Context context) { NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancel(NOTIFICATION_ID_FAILED_TEST); } /** * Shows a notification with the given ticker text and content text. The icon is a warning icon, and the notification title is the app name. Tapping on the * notification opens the given activity. */ private static void showNotification(Context context, int notificationId, int tickerTextId, int contentTextId, Class<?> activityClass) { NotificationCompat.Builder builder = new NotificationCompat.Builder(context); builder.setSmallIcon(R.drawable.ic_stat_warning); builder.setAutoCancel(true); builder.setTicker(context.getString(tickerTextId)); builder.setContentTitle(context.getString(R.string.app_name)); builder.setContentText(context.getString(contentTextId)); builder.setAutoCancel(false); Uri uri = NetMonPreferences.getInstance(context).getNotificationSoundUri(); builder.setSound(uri); builder.setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, activityClass), PendingIntent.FLAG_UPDATE_CURRENT)); Notification notification = builder.build(); notification.flags |= Notification.FLAG_SHOW_LIGHTS | Notification.FLAG_ONLY_ALERT_ONCE; notification.ledARGB = 0xFFffff00; notification.ledOnMS = 300; notification.ledOffMS = 2000; NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(notificationId, notification); } /** * This class receives the ACTION_DISABLE broadcast (sent when the user taps on the stop button in the notification), and updates the shared preference to * disable the service */ private static final BroadcastReceiver sDisableBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.v(TAG, "onReceive: " + intent); if (ACTION_DISABLE.equals(intent.getAction())) NetMonPreferences.getInstance(context).setServiceEnabled(false); } }; }