소스 검색

Cleanup and added launch flag for Android

Sebastián Katzer 8 년 전
부모
커밋
452e572bbf

+ 7 - 19
plugin.xml

@@ -166,11 +166,15 @@
             target-dir="src/de/appplant/cordova/plugin/localnotification" />
  -->
         <source-file
-            src="src/android/notification/activity/AbstractClickActivity.java"
-            target-dir="src/de/appplant/cordova/plugin/notification/activity" />
+            src="src/android/notification/action/Action.java"
+            target-dir="src/de/appplant/cordova/plugin/notification/action" />
 
         <source-file
-            src="src/android/notification/activity/ClickActivity.java"
+            src="src/android/notification/action/ActionGroup.java"
+            target-dir="src/de/appplant/cordova/plugin/notification/action" />
+
+        <source-file
+            src="src/android/notification/activity/AbstractClickActivity.java"
             target-dir="src/de/appplant/cordova/plugin/notification/activity" />
 
         <source-file
@@ -185,14 +189,6 @@
             src="src/android/notification/receiver/AbstractTriggerReceiver.java"
             target-dir="src/de/appplant/cordova/plugin/notification/receiver" />
 
-        <source-file
-            src="src/android/notification/receiver/ClearReceiver.java"
-            target-dir="src/de/appplant/cordova/plugin/notification/receiver" />
-
-        <source-file
-            src="src/android/notification/receiver/TriggerReceiver.java"
-            target-dir="src/de/appplant/cordova/plugin/notification/receiver" />
-
         <source-file
             src="src/android/notification/trigger/DateTrigger.java"
             target-dir="src/de/appplant/cordova/plugin/notification/trigger" />
@@ -213,14 +209,6 @@
             src="src/android/notification/util/AssetUtil.java"
             target-dir="src/de/appplant/cordova/plugin/notification/util" />
 
-        <source-file
-            src="src/android/notification/Action.java"
-            target-dir="src/de/appplant/cordova/plugin/notification" />
-
-        <source-file
-            src="src/android/notification/ActionGroup.java"
-            target-dir="src/de/appplant/cordova/plugin/notification" />
-
         <source-file
             src="src/android/notification/Builder.java"
             target-dir="src/de/appplant/cordova/plugin/notification" />

+ 3 - 2
src/android/ClearReceiver.java

@@ -22,6 +22,7 @@
 package de.appplant.cordova.plugin.localnotification;
 
 import de.appplant.cordova.plugin.notification.Notification;
+import de.appplant.cordova.plugin.notification.receiver.AbstractClearReceiver;
 
 
 /**
@@ -29,7 +30,7 @@ import de.appplant.cordova.plugin.notification.Notification;
  * notification manually. It un-persists the cleared notification from the
  * shared preferences.
  */
-public class ClearReceiver extends de.appplant.cordova.plugin.notification.receiver.ClearReceiver {
+public class ClearReceiver extends AbstractClearReceiver {
 
     /**
      * Called when a local notification was cleared from outside of the app.
@@ -38,7 +39,7 @@ public class ClearReceiver extends de.appplant.cordova.plugin.notification.recei
      */
     @Override
     public void onClear (Notification notification) {
-        super.onClear(notification);
+        notification.clear();
         LocalNotification.fireEvent("clear", notification);
     }
 

+ 21 - 4
src/android/ClickActivity.java

@@ -21,6 +21,7 @@
 
 package de.appplant.cordova.plugin.localnotification;
 
+import android.content.Intent;
 import android.os.Bundle;
 import android.support.v4.app.RemoteInput;
 
@@ -28,13 +29,15 @@ import org.json.JSONException;
 import org.json.JSONObject;
 
 import de.appplant.cordova.plugin.notification.Notification;
+import de.appplant.cordova.plugin.notification.Options;
+import de.appplant.cordova.plugin.notification.activity.AbstractClickActivity;
 
 /**
  * The receiver activity is triggered when a notification is clicked by a user.
  * The activity calls the background callback and brings the launch intent
  * up to foreground.
  */
-public class ClickActivity extends de.appplant.cordova.plugin.notification.activity.ClickActivity {
+public class ClickActivity extends AbstractClickActivity {
 
     /**
      * Called when local notification was clicked by the user.
@@ -44,8 +47,11 @@ public class ClickActivity extends de.appplant.cordova.plugin.notification.activ
      */
     @Override
     public void onClick(String action, Notification notification) {
-        JSONObject data = new JSONObject();
-        Bundle input    = RemoteInput.getResultsFromIntent(getIntent());
+        JSONObject data  = new JSONObject();
+        Intent intent    = getIntent();
+        Bundle bundle    = intent.getExtras();
+        Bundle input     = RemoteInput.getResultsFromIntent(intent);
+        boolean doLaunch = bundle.getBoolean(Options.EXTRA_LAUNCH, true);
 
         if (input != null) {
             try {
@@ -55,9 +61,20 @@ public class ClickActivity extends de.appplant.cordova.plugin.notification.activ
             }
         }
 
+        if (doLaunch) {
+            launchApp();
+        }
+
         LocalNotification.fireEvent(action, notification, data);
 
-        super.onClick(action, notification);
+        if (notification.getOptions().isSticky())
+            return;
+
+        if (notification.isRepeating()) {
+            notification.clear();
+        } else {
+            notification.cancel();
+        }
     }
 
 }

+ 1 - 2
src/android/LocalNotification.java

@@ -34,10 +34,9 @@ import org.json.JSONObject;
 
 import java.lang.reflect.Method;
 import java.util.ArrayList;
-import java.util.List;
 import java.lang.Exception;
 
-import de.appplant.cordova.plugin.notification.ActionGroup;
+import de.appplant.cordova.plugin.notification.action.ActionGroup;
 import de.appplant.cordova.plugin.notification.Manager;
 import de.appplant.cordova.plugin.notification.Notification;
 import de.appplant.cordova.plugin.notification.Options;

+ 3 - 2
src/android/TriggerReceiver.java

@@ -23,6 +23,7 @@ package de.appplant.cordova.plugin.localnotification;
 
 import de.appplant.cordova.plugin.notification.Builder;
 import de.appplant.cordova.plugin.notification.Notification;
+import de.appplant.cordova.plugin.notification.receiver.AbstractTriggerReceiver;
 
 /**
  * The alarm receiver is triggered when a scheduled alarm is fired. This class
@@ -30,7 +31,7 @@ import de.appplant.cordova.plugin.notification.Notification;
  * Android notification bar. The notification uses the default notification
  * sound and it vibrates the phone.
  */
-public class TriggerReceiver extends de.appplant.cordova.plugin.notification.receiver.TriggerReceiver {
+public class TriggerReceiver extends AbstractTriggerReceiver {
 
     /**
      * Called when a local notification was triggered. Does present the local
@@ -41,7 +42,7 @@ public class TriggerReceiver extends de.appplant.cordova.plugin.notification.rec
      */
     @Override
     public void onTrigger (Notification notification, boolean updated) {
-        super.onTrigger(notification, updated);
+        notification.show();
 
         if (!updated) {
             LocalNotification.fireEvent("trigger", notification);

+ 9 - 7
src/android/notification/Builder.java

@@ -33,8 +33,7 @@ import android.support.v4.app.NotificationCompat.MessagingStyle.Message;
 import java.util.List;
 import java.util.Random;
 
-import de.appplant.cordova.plugin.notification.activity.ClickActivity;
-import de.appplant.cordova.plugin.notification.receiver.ClearReceiver;
+import de.appplant.cordova.plugin.notification.action.Action;
 
 /**
  * Builder class for local notifications. Build fully configured local
@@ -49,10 +48,10 @@ public final class Builder {
     private final Options options;
 
     // Receiver to handle the clear event
-    private Class<?> clearReceiver = ClearReceiver.class;
+    private Class<?> clearReceiver;
 
     // Activity to handle the click event
-    private Class<?> clickActivity = ClickActivity.class;
+    private Class<?> clickActivity;
 
     /**
      * Constructor
@@ -101,11 +100,12 @@ public final class Builder {
         Bundle extras = new Bundle();
 
         extras.putString(Options.EXTRA, options.toString());
-        extras.putString(Options.SOUND_EXTRA, sound.toString());
+        extras.putString(Options.EXTRA_SOUND, sound.toString());
 
         builder = new NotificationCompat.Builder(context, Manager.CHANNEL_ID)
                 .setDefaults(options.getDefaults())
                 .setExtras(extras)
+                .setOnlyAlertOnce(true)
                 .setChannelId(options.getChannel())
                 .setContentTitle(options.getTitle())
                 .setContentText(options.getText())
@@ -288,7 +288,8 @@ public final class Builder {
 
         Intent intent = new Intent(context, clickActivity)
                 .putExtra(Options.EXTRA, options.toString())
-                .putExtra(Action.EXTRA, Action.CLICK_ACTION_ID)
+                .putExtra(Options.EXTRA_LAUNCH, options.isLaunchingApp())
+                .putExtra(Action.EXTRA_ID, Action.CLICK_ACTION_ID)
                 .setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
 
         int reqCode = new Random().nextInt();
@@ -333,7 +334,8 @@ public final class Builder {
     private PendingIntent getPendingIntentForAction (Action action) {
         Intent intent = new Intent(context, clickActivity)
                 .putExtra(Options.EXTRA, options.toString())
-                .putExtra(Action.EXTRA, action.getId())
+                .putExtra(Options.EXTRA_LAUNCH, action.isLaunchingApp())
+                .putExtra(Action.EXTRA_ID, action.getId())
                 .setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
 
         int requestCode = new Random().nextInt();

+ 0 - 13
src/android/notification/Manager.java

@@ -28,22 +28,9 @@ import android.app.PendingIntent;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
-import android.content.SharedPreferences;
-import android.graphics.Color;
-import android.os.Build;
 import android.support.v4.app.NotificationManagerCompat;
 
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.util.ArrayList;
 import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import de.appplant.cordova.plugin.notification.receiver.TriggerReceiver;
 
 import static android.os.Build.VERSION.SDK_INT;
 import static android.os.Build.VERSION_CODES.O;

+ 1 - 8
src/android/notification/Notification.java

@@ -23,23 +23,16 @@ package de.appplant.cordova.plugin.notification;
 
 
 import android.app.AlarmManager;
-import android.app.NotificationChannelGroup;
 import android.app.NotificationManager;
-import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.net.Uri;
-import android.os.Build;
 import android.support.v4.app.NotificationCompat;
 
 import org.json.JSONException;
 import org.json.JSONObject;
 
-import java.util.Date;
-
-import de.appplant.cordova.plugin.notification.receiver.TriggerReceiver;
-
 /**
  * Wrapper class around OS notification class. Handles basic operations
  * like show, delete, cancel for a single local notification instance.
@@ -193,7 +186,7 @@ public final class Notification {
         if (builder == null)
             return;
 
-        String sound = builder.getExtras().getString(Options.SOUND_EXTRA);
+        String sound = builder.getExtras().getString(Options.EXTRA_SOUND);
         Uri soundUri = Uri.parse(sound);
 
         context.grantUriPermission("com.android.systemui", soundUri,

+ 13 - 1
src/android/notification/Options.java

@@ -36,6 +36,8 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
+import de.appplant.cordova.plugin.notification.action.Action;
+import de.appplant.cordova.plugin.notification.action.ActionGroup;
 import de.appplant.cordova.plugin.notification.util.AssetUtil;
 
 import static android.support.v4.app.NotificationCompat.DEFAULT_LIGHTS;
@@ -57,7 +59,10 @@ public final class Options {
     public static final String EXTRA = "NOTIFICATION_OPTIONS";
 
     // Key name for bundled sound extra
-    public static final String SOUND_EXTRA = "NOTIFICATION_SOUND";
+    static final String EXTRA_SOUND = "NOTIFICATION_SOUND";
+
+    // Key name for bundled launch extra
+    public static final String EXTRA_LAUNCH = "NOTIFICATION_LAUNCH";
 
     // Default icon path
     private static final String DEFAULT_ICON = "res://icon";
@@ -175,6 +180,13 @@ public final class Options {
         return options.optString("group", null);
     }
 
+    /**
+     * launch flag for the notification.
+     */
+    boolean isLaunchingApp() {
+        return options.optBoolean("launch", true);
+    }
+
     /**
      * The channel id of that notification.
      */

+ 5 - 1
src/android/notification/Request.java

@@ -30,12 +30,16 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
 
-import de.appplant.cordova.plugin.notification.trigger.MatchTrigger;
 import de.appplant.cordova.plugin.notification.trigger.DateTrigger;
 import de.appplant.cordova.plugin.notification.trigger.IntervalTrigger;
+import de.appplant.cordova.plugin.notification.trigger.MatchTrigger;
 
 import static de.appplant.cordova.plugin.notification.trigger.IntervalTrigger.Unit;
 
+/**
+ * An object you use to specify a notification’s content and the condition
+ * that triggers its delivery.
+ */
 public final class Request {
 
     // Key name for bundled extras

+ 4 - 4
src/android/notification/Action.java → src/android/notification/action/Action.java

@@ -19,7 +19,7 @@
  * limitations under the License.
  */
 
-package de.appplant.cordova.plugin.notification;
+package de.appplant.cordova.plugin.notification.action;
 
 import android.content.Context;
 import android.support.v4.app.RemoteInput;
@@ -38,7 +38,7 @@ import de.appplant.cordova.plugin.notification.util.AssetUtil;
 public final class Action {
 
     // Key name for bundled extras
-    public static final String EXTRA = "NOTIFICATION_ACTION_ID";
+    public static final String EXTRA_ID = "NOTIFICATION_ACTION_ID";
 
     // The id for the click action
     public static final String CLICK_ACTION_ID = "click";
@@ -100,7 +100,7 @@ public final class Action {
     /**
      * Gets the type for the action.
      */
-    boolean isWithInput() {
+    public boolean isWithInput() {
         String type = options.optString("type");
         return type.equals("input");
     }
@@ -108,7 +108,7 @@ public final class Action {
     /**
      * Gets the input config in case of the action is of type input.
      */
-    RemoteInput getInput() {
+    public RemoteInput getInput() {
         return new RemoteInput.Builder(getId())
                 .setLabel(options.optString("emptyText"))
                 .setAllowFreeFormInput(options.optBoolean("editable", true))

+ 2 - 2
src/android/notification/ActionGroup.java → src/android/notification/action/ActionGroup.java

@@ -19,7 +19,7 @@
  * limitations under the License.
  */
 
-package de.appplant.cordova.plugin.notification;
+package de.appplant.cordova.plugin.notification.action;
 
 import android.content.Context;
 import android.util.Log;
@@ -57,7 +57,7 @@ public final class ActionGroup {
      *
      * @return Null if no group was found.
      */
-    static ActionGroup lookup (String id) {
+    public static ActionGroup lookup(String id) {
         return groups.get(id);
     }
 

+ 3 - 3
src/android/notification/activity/AbstractClickActivity.java

@@ -29,11 +29,11 @@ import android.os.Bundle;
 import org.json.JSONException;
 import org.json.JSONObject;
 
-import de.appplant.cordova.plugin.notification.Action;
+import de.appplant.cordova.plugin.notification.action.Action;
 import de.appplant.cordova.plugin.notification.Notification;
 import de.appplant.cordova.plugin.notification.Options;
 
-import static de.appplant.cordova.plugin.notification.Action.CLICK_ACTION_ID;
+import static de.appplant.cordova.plugin.notification.action.Action.CLICK_ACTION_ID;
 
 /**
  * Abstract content receiver activity for local notifications. Creates the
@@ -55,7 +55,7 @@ abstract public class AbstractClickActivity extends Activity {
         Context context = getApplicationContext();
 
         try {
-            String action   = bundle.getString(Action.EXTRA, CLICK_ACTION_ID);
+            String action   = bundle.getString(Action.EXTRA_ID, CLICK_ACTION_ID);
             String data     = bundle.getString(Options.EXTRA);
             JSONObject dict = new JSONObject(data);
             Options options = new Options(context, dict);

+ 1 - 0
www/local-notification-util.js

@@ -67,6 +67,7 @@ exports.applyPlatformSpecificOptions = function () {
         defaults.defaults     = 0;
         defaults.priority     = 0;
         defaults.channel      = undefined;
+        defaults.launch       = true;
         break;
     }
 };