Commit 5d6a0c79 by Sebastián Katzer

Refactored LocalNotification class

parent cf5763c0
package de.appplant.cordova.plugin;
/**
* LocalNotification.java
* Cordova LocalNotification Plugin
*
* Created by Sebastian Katzer (github.com/katzer) on 31/08/2013.
* Copyright 2013 Sebastian Katzer. All rights reserved.
* GPL v2 licensed
*/
import java.util.Calendar;
package de.appplant.cordova.plugin;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.util.Log;
import com.phonegap.api.Plugin;
import com.phonegap.api.PluginResult;
import org.apache.cordova.CordovaPlugin;
import org.apache.cordova.CallbackContext;
/**
* This plugin utilizes the Android AlarmManager in combination with StatusBar
* notifications. When a local notification is scheduled the alarm manager takes
* care of firing the event. When the event is processed, a notification is put
* in the Android status bar.
*
* @author Daniel van 't Oever
*/
public class LocalNotification extends Plugin {
public class LocalNotification extends CordovaPlugin {
public static final String PLUGIN_NAME = "LocalNotification";
......@@ -31,36 +37,40 @@ public class LocalNotification extends Plugin {
private AlarmHelper alarm = null;
@Override
public PluginResult execute(String action, JSONArray optionsArr, String callBackId) {
alarm = new AlarmHelper(this.ctx);
Log.d(PLUGIN_NAME, "Plugin execute called with action: " + action);
PluginResult result = null;
final AlarmOptions alarmOptions = new AlarmOptions();
alarmOptions.parseOptions(optionsArr);
/*
* Determine which action of the plugin needs to be invoked
*/
String alarmId = alarmOptions.getNotificationId();
if (action.equalsIgnoreCase("add")) {
final boolean daily = alarmOptions.isRepeatDaily();
final String title = alarmOptions.getAlarmTitle();
final String subTitle = alarmOptions.getAlarmSubTitle();
final String ticker = alarmOptions.getAlarmTicker();
persistAlarm(alarmId, optionsArr);
return this.add(daily, title, subTitle, ticker, alarmId, alarmOptions.getCal());
} else if (action.equalsIgnoreCase("cancel")) {
unpersistAlarm(alarmId);
return this.cancelNotification(alarmId);
} else if (action.equalsIgnoreCase("cancelall")) {
unpersistAlarmAll();
return this.cancelAllNotifications();
}
return result;
public boolean execute (String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
JSONObject arguments = args.getJSONObject(0);
LocalNotificationOptions options = new LocalNotificationOptions();
options.parse(arguments);
String alarmId = options.getNotificationId();
alarm = new AlarmHelper(cordova.getActivity());
if (action.equalsIgnoreCase("add")) {
persist(alarmId, args);
add(options);
return true;
}
if (action.equalsIgnoreCase("cancel")) {
unpersist(alarmId);
cancel(alarmId);
return true;
}
if (action.equalsIgnoreCase("cancelall")) {
unpersistAll();
cancelAll();
return true;
}
// Returning false results in a "MethodNotFound" error.
return false;
}
/**
......@@ -68,32 +78,19 @@ public class LocalNotification extends Plugin {
*
* @param repeatDaily
* If true, the alarm interval will be set to one day.
* @param alarmTitle
* @param title
* The title of the alarm as shown in the Android notification
* panel
* @param alarmSubTitle
* @param subTitle
* The subtitle of the alarm
* @param alarmId
* The unique ID of the notification
* @param cal
* @param calender
* A calendar object that represents the time at which the alarm
* should first be started
* @return A pluginresult.
*/
public PluginResult add(boolean repeatDaily, String alarmTitle, String alarmSubTitle, String alarmTicker,
String alarmId, Calendar cal) {
final long triggerTime = cal.getTimeInMillis();
final String recurring = repeatDaily ? "daily" : "onetime";
Log.d(PLUGIN_NAME, "Adding " + recurring + " notification: '" + alarmTitle + alarmSubTitle + "' with id: "
+ alarmId + " at timestamp: " + triggerTime);
boolean result = alarm.addAlarm(repeatDaily, alarmTitle, alarmSubTitle, alarmTicker, alarmId, cal);
if (result) {
return new PluginResult(PluginResult.Status.OK);
} else {
return new PluginResult(PluginResult.Status.ERROR);
}
public void add(LocalNotificationOptions options) {
alarm.add(options);
}
/**
......@@ -101,86 +98,66 @@ public class LocalNotification extends Plugin {
*
* @param notificationId
* The original ID of the notification that was used when it was
* registered using addNotification()
* registered using add()
*/
public PluginResult cancelNotification(String notificationId) {
Log.d(PLUGIN_NAME, "cancelNotification: Canceling event with id: " + notificationId);
boolean result = alarm.cancelAlarm(notificationId);
if (result) {
return new PluginResult(PluginResult.Status.OK);
} else {
return new PluginResult(PluginResult.Status.ERROR);
}
public void cancel (String notificationId) {
alarm.cancel(notificationId);
}
/**
* Cancel all notifications that were created by this plugin.
*/
public PluginResult cancelAllNotifications() {
Log.d(PLUGIN_NAME, "cancelAllNotifications: cancelling all events for this application");
/*
* Android can only unregister a specific alarm. There is no such thing
* as cancelAll. Therefore we rely on the Shared Preferences which holds
* all our alarms to loop through these alarms and unregister them one
* by one.
*/
final SharedPreferences alarmSettings = this.ctx.getSharedPreferences(PLUGIN_NAME, Context.MODE_PRIVATE);
final boolean result = alarm.cancelAll(alarmSettings);
if (result) {
return new PluginResult(PluginResult.Status.OK);
} else {
return new PluginResult(PluginResult.Status.ERROR);
}
public void cancelAll() {
/*
* Android can only unregister a specific alarm. There is no such thing
* as cancelAll. Therefore we rely on the Shared Preferences which holds
* all our alarms to loop through these alarms and unregister them one
* by one.
*/
SharedPreferences settings = cordova.getActivity().getSharedPreferences(PLUGIN_NAME, Context.MODE_PRIVATE);
alarm.cancelAll(settings);
}
/**
* Persist the information of this alarm to the Android Shared Preferences.
* This will allow the application to restore the alarm upon device reboot.
* Also this is used by the cancelAllNotifications method.
* Also this is used by the cancelAll method.
*
* @see #cancelAllNotifications()
*
* @param optionsArr
* The assumption is that parseOptions has been called already.
* The assumption is that parse has been called already.
*
* @return true when successfull, otherwise false
*/
private boolean persistAlarm(String alarmId, JSONArray optionsArr) {
final Editor alarmSettingsEditor = this.ctx.getSharedPreferences(PLUGIN_NAME, Context.MODE_PRIVATE).edit();
alarmSettingsEditor.putString(alarmId, optionsArr.toString());
private void persist (String alarmId, JSONArray optionsArr) {
Editor editor = cordova.getActivity().getSharedPreferences(PLUGIN_NAME, Context.MODE_PRIVATE).edit();
return alarmSettingsEditor.commit();
editor.putString(alarmId, optionsArr.toString());
editor.commit();
}
/**
* Remove a specific alarm from the Android shared Preferences
* Remove a specific alarm from the Android shared Preferences.
*
* @param alarmId
* The Id of the notification that must be removed.
*
* @return true when successfull, otherwise false
*/
private boolean unpersistAlarm(String alarmId) {
final Editor alarmSettingsEditor = this.ctx.getSharedPreferences(PLUGIN_NAME, Context.MODE_PRIVATE).edit();
alarmSettingsEditor.remove(alarmId);
private void unpersist (String alarmId) {
Editor editor = cordova.getActivity().getSharedPreferences(PLUGIN_NAME, Context.MODE_PRIVATE).edit();
return alarmSettingsEditor.commit();
editor.remove(alarmId);
editor.commit();
}
/**
* Clear all alarms from the Android shared Preferences
*
* @return true when successfull, otherwise false
* Clear all alarms from the Android shared Preferences.
*/
private boolean unpersistAlarmAll() {
final Editor alarmSettingsEditor = this.ctx.getSharedPreferences(PLUGIN_NAME, Context.MODE_PRIVATE).edit();
alarmSettingsEditor.clear();
private void unpersistAll () {
Editor editor = cordova.getActivity().getSharedPreferences(PLUGIN_NAME, Context.MODE_PRIVATE).edit();
return alarmSettingsEditor.commit();
editor.clear();
editor.commit();
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment