summaryrefslogtreecommitdiff
path: root/StoneIsland/plugins/phonegap-plugin-push/src
diff options
context:
space:
mode:
Diffstat (limited to 'StoneIsland/plugins/phonegap-plugin-push/src')
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/BackgroundActionButtonHandler.java4
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/FCMService.java (renamed from StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/GCMIntentService.java)139
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PermissionUtils.java4
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushConstants.java16
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushDismissedHandler.java25
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushHandlerActivity.java32
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushInstanceIDListenerService.java19
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushPlugin.java132
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/RegistrationIntentService.java38
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/browser/manifest.json2
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.h17
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.m295
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/js/push.js316
-rw-r--r--StoneIsland/plugins/phonegap-plugin-push/src/windows/PushPluginProxy.js6
14 files changed, 701 insertions, 344 deletions
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/BackgroundActionButtonHandler.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/BackgroundActionButtonHandler.java
index 3ccea6cb..4456f525 100644
--- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/BackgroundActionButtonHandler.java
+++ b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/BackgroundActionButtonHandler.java
@@ -9,7 +9,7 @@ import android.util.Log;
import android.support.v4.app.RemoteInput;
public class BackgroundActionButtonHandler extends BroadcastReceiver implements PushConstants {
- private static String LOG_TAG = "PushPlugin_BackgroundActionButtonHandler";
+ private static String LOG_TAG = "Push_BGActionButton";
@Override
public void onReceive(Context context, Intent intent) {
@@ -19,7 +19,7 @@ public class BackgroundActionButtonHandler extends BroadcastReceiver implements
int notId = intent.getIntExtra(NOT_ID, 0);
Log.d(LOG_TAG, "not id = " + notId);
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
- notificationManager.cancel(GCMIntentService.getAppName(context), notId);
+ notificationManager.cancel(FCMService.getAppName(context), notId);
if (extras != null) {
Bundle originalExtras = extras.getBundle(PUSH_BUNDLE);
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/GCMIntentService.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/FCMService.java
index e1a2b75c..af328fb2 100644
--- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/GCMIntentService.java
+++ b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/FCMService.java
@@ -13,17 +13,23 @@ import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.graphics.Paint;
+import android.graphics.Canvas;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
-import android.support.v4.app.NotificationManagerCompat;
import android.support.v4.app.NotificationCompat.WearableExtender;
import android.support.v4.app.RemoteInput;
import android.text.Html;
import android.text.Spanned;
import android.util.Log;
-import com.google.android.gms.gcm.GcmListenerService;
+import com.google.firebase.messaging.FirebaseMessagingService;
+import com.google.firebase.messaging.RemoteMessage;
import org.json.JSONArray;
import org.json.JSONException;
@@ -36,12 +42,13 @@ import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.Map;
import java.util.Random;
@SuppressLint("NewApi")
-public class GCMIntentService extends GcmListenerService implements PushConstants {
+public class FCMService extends FirebaseMessagingService implements PushConstants {
- private static final String LOG_TAG = "PushPlugin_GCMIntentService";
+ private static final String LOG_TAG = "Push_FCMService";
private static HashMap<Integer, ArrayList<String>> messageMap = new HashMap<Integer, ArrayList<String>>();
public void setNotification(int notId, String message){
@@ -59,17 +66,31 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
}
@Override
- public void onMessageReceived(String from, Bundle extras) {
+ public void onMessageReceived(RemoteMessage message){
+
+ String from = message.getFrom();
Log.d(LOG_TAG, "onMessage - from: " + from);
- if (extras != null) {
+ Bundle extras = new Bundle();
+
+ if (message.getNotification()!=null) {
+ extras.putString(TITLE,message.getNotification().getTitle());
+ extras.putString(MESSAGE,message.getNotification().getBody());
+ }
+ for (Map.Entry<String, String> entry : message.getData().entrySet()) {
+ extras.putString(entry.getKey(), entry.getValue());
+ }
+
+ if (extras != null && isAvailableSender(from)) {
Context applicationContext = getApplicationContext();
SharedPreferences prefs = applicationContext.getSharedPreferences(PushPlugin.COM_ADOBE_PHONEGAP_PUSH, Context.MODE_PRIVATE);
boolean forceShow = prefs.getBoolean(FORCE_SHOW, false);
boolean clearBadge = prefs.getBoolean(CLEAR_BADGE, false);
+ String messageKey = prefs.getString(MESSAGE_KEY, MESSAGE);
+ String titleKey = prefs.getString(TITLE_KEY, TITLE);
- extras = normalizeExtras(applicationContext, extras);
+ extras = normalizeExtras(applicationContext, extras, messageKey, titleKey);
if (clearBadge) {
PushPlugin.setApplicationIconBadgeNumber(getApplicationContext(), 0);
@@ -167,10 +188,10 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
/*
* Replace alternate keys with our canonical value
*/
- private String normalizeKey(String key) {
- if (key.equals(BODY) || key.equals(ALERT) || key.equals(GCM_NOTIFICATION_BODY) || key.equals(TWILIO_BODY)) {
+ private String normalizeKey(String key, String messageKey, String titleKey) {
+ if (key.equals(BODY) || key.equals(ALERT) || key.equals(MP_MESSAGE) || key.equals(GCM_NOTIFICATION_BODY) || key.equals(TWILIO_BODY) || key.equals(messageKey)) {
return MESSAGE;
- } else if (key.equals(TWILIO_TITLE)) {
+ } else if (key.equals(TWILIO_TITLE) || key.equals(SUBJECT) || key.equals(titleKey)) {
return TITLE;
}else if (key.equals(MSGCNT) || key.equals(BADGE)) {
return COUNT;
@@ -191,7 +212,7 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
/*
* Parse bundle into normalized keys.
*/
- private Bundle normalizeExtras(Context context, Bundle extras) {
+ private Bundle normalizeExtras(Context context, Bundle extras, String messageKey, String titleKey) {
Log.d(LOG_TAG, "normalize extras");
Iterator<String> it = extras.keySet().iterator();
Bundle newExtras = new Bundle();
@@ -203,7 +224,7 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
// If normalizeKeythe key is "data" or "message" and the value is a json object extract
// This is to support parse.com and other services. Issue #147 and pull #218
- if (key.equals(PARSE_COM_DATA) || key.equals(MESSAGE)) {
+ if (key.equals(PARSE_COM_DATA) || key.equals(MESSAGE) || key.equals(messageKey)) {
Object json = extras.get(key);
// Make sure data is json object stringified
if ( json instanceof String && ((String) json).startsWith("{") ) {
@@ -211,7 +232,8 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
try {
// If object contains message keys promote each value to the root of the bundle
JSONObject data = new JSONObject((String) json);
- if ( data.has(ALERT) || data.has(MESSAGE) || data.has(BODY) || data.has(TITLE) ) {
+ if ( data.has(ALERT) || data.has(MESSAGE) || data.has(BODY) || data.has(TITLE) ||
+ data.has(messageKey) || data.has(titleKey) ) {
Iterator<String> jsonIter = data.keys();
while (jsonIter.hasNext()) {
String jsonKey = jsonIter.next();
@@ -219,7 +241,7 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
Log.d(LOG_TAG, "key = data/" + jsonKey);
String value = data.getString(jsonKey);
- jsonKey = normalizeKey(jsonKey);
+ jsonKey = normalizeKey(jsonKey, messageKey, titleKey);
value = localizeKey(context, jsonKey, value);
newExtras.putString(jsonKey, value);
@@ -228,6 +250,10 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
} catch( JSONException e) {
Log.e(LOG_TAG, "normalizeExtras: JSON exception");
}
+ } else {
+ String newKey = normalizeKey(key, messageKey, titleKey);
+ Log.d(LOG_TAG, "replace key " + key + " with " + newKey);
+ replaceKey(context, key, newKey, extras, newExtras);
}
} else if (key.equals(("notification"))) {
Bundle value = extras.getBundle(key);
@@ -236,7 +262,7 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
String notifkey = iterator.next();
Log.d(LOG_TAG, "notifkey = " + notifkey);
- String newKey = normalizeKey(notifkey);
+ String newKey = normalizeKey(notifkey, messageKey, titleKey);
Log.d(LOG_TAG, "replace key " + notifkey + " with " + newKey);
String valueData = value.getString(notifkey);
@@ -245,12 +271,17 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
newExtras.putString(newKey, valueData);
}
continue;
+ // In case we weren't working on the payload data node or the notification node,
+ // normalize the key.
+ // This allows to have "message" as the payload data key without colliding
+ // with the other "message" key (holding the body of the payload)
+ // See issue #1663
+ } else {
+ String newKey = normalizeKey(key, messageKey, titleKey);
+ Log.d(LOG_TAG, "replace key " + key + " with " + newKey);
+ replaceKey(context, key, newKey, extras, newExtras);
}
- String newKey = normalizeKey(key);
- Log.d(LOG_TAG, "replace key " + key + " with " + newKey);
- replaceKey(context, key, newKey, extras, newExtras);
-
} // while
return newExtras;
@@ -301,15 +332,15 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
createNotification(context, extras);
}
- if(!PushPlugin.isActive() && "1".equals(forceStart)){
+ if(!PushPlugin.isActive() && "1".equals(forceStart)){
Log.d(LOG_TAG, "app is not running but we should start it and put in background");
- Intent intent = new Intent(this, PushHandlerActivity.class);
+ Intent intent = new Intent(this, PushHandlerActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(PUSH_BUNDLE, extras);
- intent.putExtra(START_IN_BACKGROUND, true);
+ intent.putExtra(START_IN_BACKGROUND, true);
intent.putExtra(FOREGROUND, false);
startActivity(intent);
- } else if ("1".equals(contentAvailable)) {
+ } else if ("1".equals(contentAvailable)) {
Log.d(LOG_TAG, "app is not running and content available true");
Log.d(LOG_TAG, "send notification event");
PushPlugin.sendExtras(extras);
@@ -331,12 +362,22 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
int requestCode = new Random().nextInt();
PendingIntent contentIntent = PendingIntent.getActivity(this, requestCode, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ Intent dismissedNotificationIntent = new Intent(this, PushDismissedHandler.class);
+ dismissedNotificationIntent.putExtra(PUSH_BUNDLE, extras);
+ dismissedNotificationIntent.putExtra(NOT_ID, notId);
+ dismissedNotificationIntent.putExtra(DISMISSED, true);
+ dismissedNotificationIntent.setAction(PUSH_DISMISSED);
+
+ requestCode = new Random().nextInt();
+ PendingIntent deleteIntent = PendingIntent.getBroadcast(this, requestCode, dismissedNotificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);
+
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(context)
.setWhen(System.currentTimeMillis())
.setContentTitle(fromHtml(extras.getString(TITLE)))
.setTicker(fromHtml(extras.getString(TITLE)))
.setContentIntent(contentIntent)
+ .setDeleteIntent(deleteIntent)
.setAutoCancel(true);
SharedPreferences prefs = context.getSharedPreferences(PushPlugin.COM_ADOBE_PHONEGAP_PUSH, Context.MODE_PRIVATE);
@@ -690,11 +731,46 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
}
}
+ private Bitmap getCircleBitmap(Bitmap bitmap) {
+ if (bitmap == null) {
+ return null;
+ }
+
+ final Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
+ final Canvas canvas = new Canvas(output);
+ final int color = Color.RED;
+ final Paint paint = new Paint();
+ final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
+ final RectF rectF = new RectF(rect);
+
+ paint.setAntiAlias(true);
+ canvas.drawARGB(0, 0, 0, 0);
+ paint.setColor(color);
+ float cx = bitmap.getWidth()/2;
+ float cy = bitmap.getHeight()/2;
+ float radius = cx < cy ? cx : cy;
+ canvas.drawCircle(cx,cy,radius,paint);
+
+ paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
+ canvas.drawBitmap(bitmap, rect, rect, paint);
+
+ bitmap.recycle();
+
+ return output;
+ }
+
private void setNotificationLargeIcon(Bundle extras, String packageName, Resources resources, NotificationCompat.Builder mBuilder) {
String gcmLargeIcon = extras.getString(IMAGE); // from gcm
+ String imageType = extras.getString(IMAGE_TYPE, IMAGE_TYPE_SQUARE);
if (gcmLargeIcon != null && !"".equals(gcmLargeIcon)) {
if (gcmLargeIcon.startsWith("http://") || gcmLargeIcon.startsWith("https://")) {
- mBuilder.setLargeIcon(getBitmapFromURL(gcmLargeIcon));
+ Bitmap bitmap = getBitmapFromURL(gcmLargeIcon);
+ if (IMAGE_TYPE_SQUARE.equalsIgnoreCase(imageType)) {
+ mBuilder.setLargeIcon(bitmap);
+ } else {
+ Bitmap bm = getCircleBitmap(bitmap);
+ mBuilder.setLargeIcon(bm);
+ }
Log.d(LOG_TAG, "using remote large-icon from gcm");
} else {
AssetManager assetManager = getAssets();
@@ -702,7 +778,12 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
try {
istr = assetManager.open(gcmLargeIcon);
Bitmap bitmap = BitmapFactory.decodeStream(istr);
- mBuilder.setLargeIcon(bitmap);
+ if (IMAGE_TYPE_SQUARE.equalsIgnoreCase(imageType)) {
+ mBuilder.setLargeIcon(bitmap);
+ } else {
+ Bitmap bm = getCircleBitmap(bitmap);
+ mBuilder.setLargeIcon(bm);
+ }
Log.d(LOG_TAG, "using assets large-icon from gcm");
} catch (IOException e) {
int largeIconId = 0;
@@ -762,6 +843,7 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
try {
URL url = new URL(strURL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ connection.setConnectTimeout(15000);
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
@@ -799,4 +881,11 @@ public class GCMIntentService extends GcmListenerService implements PushConstant
else
return null;
}
+
+ private boolean isAvailableSender(String from) {
+ SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(PushPlugin.COM_ADOBE_PHONEGAP_PUSH, Context.MODE_PRIVATE);
+ String savedSenderID = sharedPref.getString(SENDER_ID, "");
+
+ return from.equals(savedSenderID) || from.startsWith("/topics/");
+ }
}
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PermissionUtils.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PermissionUtils.java
index 6aa5c9bf..41bc6a6f 100644
--- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PermissionUtils.java
+++ b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PermissionUtils.java
@@ -10,8 +10,12 @@ import java.lang.reflect.Method;
public class PermissionUtils {
private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";
+ private static final int MIN_API_LEVEL = 19; // required by AppOpsManager
public static boolean hasPermission(Context appContext, String appOpsServiceId) throws UnknownError {
+ if (android.os.Build.VERSION.SDK_INT < MIN_API_LEVEL) {
+ return true;
+ }
ApplicationInfo appInfo = appContext.getApplicationInfo();
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushConstants.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushConstants.java
index 37874e04..e3aa217c 100644
--- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushConstants.java
+++ b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushConstants.java
@@ -3,6 +3,7 @@ package com.adobe.phonegap.push;
public interface PushConstants {
public static final String COM_ADOBE_PHONEGAP_PUSH = "com.adobe.phonegap.push";
public static final String REGISTRATION_ID = "registrationId";
+ public static final String REGISTRATION_TYPE = "registrationType";
public static final String FOREGROUND = "foreground";
public static final String TITLE = "title";
public static final String NOT_ID = "notId";
@@ -55,10 +56,11 @@ public interface PushConstants {
public static final String FROM = "from";
public static final String COLLAPSE_KEY = "collapse_key";
public static final String FORCE_SHOW = "forceShow";
- public static final String GCM = "GCM";
+ public static final String FCM = "FCM";
public static final String CONTENT_AVAILABLE = "content-available";
public static final String TOPICS = "topics";
public static final String SET_APPLICATION_ICON_BADGE_NUMBER = "setApplicationIconBadgeNumber";
+ public static final String GET_APPLICATION_ICON_BADGE_NUMBER = "getApplicationIconBadgeNumber";
public static final String CLEAR_ALL_NOTIFICATIONS = "clearAllNotifications";
public static final String VISIBILITY = "visibility";
public static final String INLINE_REPLY = "inlineReply";
@@ -67,6 +69,18 @@ public interface PushConstants {
public static final String TWILIO_BODY = "twi_body";
public static final String TWILIO_TITLE = "twi_title";
public static final String TWILIO_SOUND = "twi_sound";
+ public static final String MP_MESSAGE = "mp_message";
public static final String START_IN_BACKGROUND = "cdvStartInBackground";
public static final String FORCE_START = "force-start";
+ public static final String MESSAGE_KEY = "messageKey";
+ public static final String TITLE_KEY = "titleKey";
+ public static final String NO_CACHE = "no-cache";
+ public static final String DISMISSED = "dismissed";
+ public static final String IMAGE_TYPE = "image-type";
+ public static final String IMAGE_TYPE_SQUARE = "square";
+ public static final String IMAGE_TYPE_CIRCLE = "circle";
+ public static final String SUBJECT = "subject";
+ public static final String GOOGLE_APP_ID = "google_app_id";
+ public static final String GCM_DEFAULT_SENDER_ID = "gcm_defaultSenderId";
+ public static final String PUSH_DISMISSED = "push_dismissed";
}
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushDismissedHandler.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushDismissedHandler.java
new file mode 100644
index 00000000..a517bc1e
--- /dev/null
+++ b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushDismissedHandler.java
@@ -0,0 +1,25 @@
+package com.adobe.phonegap.push;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.util.Log;
+
+public class PushDismissedHandler extends BroadcastReceiver implements PushConstants {
+ private static String LOG_TAG = "Push_DismissedHandler";
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Bundle extras = intent.getExtras();
+ FCMService fcm = new FCMService();
+ String action = intent.getAction();
+ int notID = intent.getIntExtra(NOT_ID, 0);
+
+ if (action.equals(PUSH_DISMISSED)) {
+ Log.d(LOG_TAG, "PushDismissedHandler = " + extras);
+ Log.d(LOG_TAG, "not id = " + notID);
+
+ fcm.setNotification(notID, "");
+ }
+ }
+}
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushHandlerActivity.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushHandlerActivity.java
index 23682ac8..0d399a61 100644
--- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushHandlerActivity.java
+++ b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushHandlerActivity.java
@@ -11,7 +11,7 @@ import android.support.v4.app.RemoteInput;
public class PushHandlerActivity extends Activity implements PushConstants {
- private static String LOG_TAG = "PushPlugin_PushHandlerActivity";
+ private static String LOG_TAG = "Push_HandlerActivity";
/*
* this activity will be started if the user touches a notification that we own.
@@ -21,7 +21,7 @@ public class PushHandlerActivity extends Activity implements PushConstants {
*/
@Override
public void onCreate(Bundle savedInstanceState) {
- GCMIntentService gcm = new GCMIntentService();
+ FCMService gcm = new FCMService();
Intent intent = getIntent();
@@ -34,16 +34,18 @@ public class PushHandlerActivity extends Activity implements PushConstants {
Log.d(LOG_TAG, "callback = " + callback);
boolean foreground = getIntent().getExtras().getBoolean("foreground", true);
boolean startOnBackground = getIntent().getExtras().getBoolean(START_IN_BACKGROUND, false);
+ boolean dismissed = getIntent().getExtras().getBoolean(DISMISSED, false);
+ Log.d(LOG_TAG, "dismissed = " + dismissed);
if(!startOnBackground){
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
- notificationManager.cancel(GCMIntentService.getAppName(this), notId);
+ notificationManager.cancel(FCMService.getAppName(this), notId);
}
boolean isPushPluginActive = PushPlugin.isActive();
boolean inline = processPushBundle(isPushPluginActive, intent);
- if(inline && android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N){
+ if(inline && android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.N && !startOnBackground){
foreground = true;
}
@@ -51,15 +53,17 @@ public class PushHandlerActivity extends Activity implements PushConstants {
finish();
- Log.d(LOG_TAG, "isPushPluginActive = " + isPushPluginActive);
- if (!isPushPluginActive && foreground && inline) {
- Log.d(LOG_TAG, "forceMainActivityReload");
- forceMainActivityReload(false);
- } else if(startOnBackground) {
- Log.d(LOG_TAG, "startOnBackgroundTrue");
- forceMainActivityReload(true);
- } else {
- Log.d(LOG_TAG, "don't want main activity");
+ if(!dismissed) {
+ Log.d(LOG_TAG, "isPushPluginActive = " + isPushPluginActive);
+ if (!isPushPluginActive && foreground && inline) {
+ Log.d(LOG_TAG, "forceMainActivityReload");
+ forceMainActivityReload(false);
+ } else if(startOnBackground) {
+ Log.d(LOG_TAG, "startOnBackgroundTrue");
+ forceMainActivityReload(true);
+ } else {
+ Log.d(LOG_TAG, "don't want main activity");
+ }
}
}
@@ -76,7 +80,9 @@ public class PushHandlerActivity extends Activity implements PushConstants {
originalExtras.putBoolean(FOREGROUND, false);
originalExtras.putBoolean(COLDSTART, !isPushPluginActive);
+ originalExtras.putBoolean(DISMISSED, extras.getBoolean(DISMISSED));
originalExtras.putString(ACTION_CALLBACK, extras.getString(CALLBACK));
+ originalExtras.remove(NO_CACHE);
remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput != null) {
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushInstanceIDListenerService.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushInstanceIDListenerService.java
index eaa39a48..176b7419 100644
--- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushInstanceIDListenerService.java
+++ b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushInstanceIDListenerService.java
@@ -5,23 +5,22 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
-import com.google.android.gms.iid.InstanceID;
-import com.google.android.gms.iid.InstanceIDListenerService;
+import com.google.firebase.iid.FirebaseInstanceId;
+import com.google.firebase.iid.FirebaseInstanceIdService;
import org.json.JSONException;
import java.io.IOException;
-public class PushInstanceIDListenerService extends InstanceIDListenerService implements PushConstants {
- public static final String LOG_TAG = "PushPlugin_PushInstanceIDListenerService";
+public class PushInstanceIDListenerService extends FirebaseInstanceIdService implements PushConstants {
+ public static final String LOG_TAG = "Push_InsIdService";
@Override
public void onTokenRefresh() {
- SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(COM_ADOBE_PHONEGAP_PUSH, Context.MODE_PRIVATE);
- String senderID = sharedPref.getString(SENDER_ID, "");
- if (!"".equals(senderID)) {
- Intent intent = new Intent(this, RegistrationIntentService.class);
- startService(intent);
- }
+ // Get updated InstanceID token.
+ String refreshedToken = FirebaseInstanceId.getInstance().getToken();
+ Log.d(LOG_TAG, "Refreshed token: " + refreshedToken);
+ // TODO: Implement this method to send any registration to your app's servers.
+ //sendRegistrationToServer(refreshedToken);
}
}
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushPlugin.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushPlugin.java
index f6faaa2b..32f72bf3 100644
--- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushPlugin.java
+++ b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/PushPlugin.java
@@ -1,13 +1,14 @@
package com.adobe.phonegap.push;
+import android.app.Activity;
import android.app.NotificationManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
-import com.google.android.gms.gcm.GcmPubSub;
-import com.google.android.gms.iid.InstanceID;
+import com.google.firebase.iid.FirebaseInstanceId;
+import com.google.firebase.messaging.FirebaseMessaging;
import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaInterface;
@@ -29,7 +30,7 @@ import me.leolin.shortcutbadger.ShortcutBadger;
public class PushPlugin extends CordovaPlugin implements PushConstants {
- public static final String LOG_TAG = "PushPlugin";
+ public static final String LOG_TAG = "Push_Plugin";
private static CallbackContext pushContext;
private static CordovaWebView gWebView;
@@ -59,6 +60,7 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
Log.v(LOG_TAG, "execute: data=" + data.toString());
SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(COM_ADOBE_PHONEGAP_PUSH, Context.MODE_PRIVATE);
+ String token = null;
String senderID = null;
try {
@@ -66,15 +68,19 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
Log.v(LOG_TAG, "execute: jo=" + jo.toString());
- senderID = jo.getString(SENDER_ID);
+ senderID = getStringResourceByName(GCM_DEFAULT_SENDER_ID);
Log.v(LOG_TAG, "execute: senderID=" + senderID);
- String savedSenderID = sharedPref.getString(SENDER_ID, "");
- registration_id = InstanceID.getInstance(getApplicationContext()).getToken(senderID, GCM);
+ token = FirebaseInstanceId.getInstance().getToken();
- if (!"".equals(registration_id)) {
- JSONObject json = new JSONObject().put(REGISTRATION_ID, registration_id);
+ if (token == null) {
+ token = FirebaseInstanceId.getInstance().getToken(senderID,FCM);
+ }
+
+ if (!"".equals(token)) {
+ JSONObject json = new JSONObject().put(REGISTRATION_ID, token);
+ json.put(REGISTRATION_TYPE, FCM);
Log.v(LOG_TAG, "onRegistered: " + json.toString());
@@ -83,14 +89,14 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
PushPlugin.sendEvent( json );
} else {
- callbackContext.error("Empty registration ID received from GCM");
+ callbackContext.error("Empty registration ID received from FCM");
return;
}
} catch (JSONException e) {
Log.e(LOG_TAG, "execute: Got JSON Exception " + e.getMessage());
callbackContext.error(e.getMessage());
} catch (IOException e) {
- Log.e(LOG_TAG, "execute: Got JSON Exception " + e.getMessage());
+ Log.e(LOG_TAG, "execute: Got IO Exception " + e.getMessage());
callbackContext.error(e.getMessage());
}
@@ -118,6 +124,8 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
editor.putBoolean(CLEAR_NOTIFICATIONS, jo.optBoolean(CLEAR_NOTIFICATIONS, true));
editor.putBoolean(FORCE_SHOW, jo.optBoolean(FORCE_SHOW, false));
editor.putString(SENDER_ID, senderID);
+ editor.putString(MESSAGE_KEY, jo.optString(MESSAGE_KEY));
+ editor.putString(TITLE_KEY, jo.optString(TITLE_KEY));
editor.commit();
}
@@ -143,7 +151,7 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
if (topics != null && !"".equals(registration_id)) {
unsubscribeFromTopics(topics, registration_id);
} else {
- InstanceID.getInstance(getApplicationContext()).deleteInstanceID();
+ FirebaseInstanceId.getInstance().deleteInstanceId();
Log.v(LOG_TAG, "UNREGISTER");
// Remove shared prefs
@@ -194,6 +202,13 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
callbackContext.success();
}
});
+ } else if (GET_APPLICATION_ICON_BADGE_NUMBER.equals(action)) {
+ cordova.getThreadPool().execute(new Runnable() {
+ public void run() {
+ Log.v(LOG_TAG, "getApplicationIconBadgeNumber");
+ callbackContext.success(getApplicationIconBadgeNumber(getApplicationContext()));
+ }
+ });
} else if (CLEAR_ALL_NOTIFICATIONS.equals(action)) {
cordova.getThreadPool().execute(new Runnable() {
public void run() {
@@ -212,8 +227,6 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
callbackContext.success();
} catch (JSONException e) {
callbackContext.error(e.getMessage());
- } catch (IOException e) {
- callbackContext.error(e.getMessage());
}
}
});
@@ -227,8 +240,6 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
callbackContext.success();
} catch (JSONException e) {
callbackContext.error(e.getMessage());
- } catch (IOException e) {
- callbackContext.error(e.getMessage());
}
}
});
@@ -259,25 +270,41 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
/*
* Sends the pushbundle extras to the client application.
- * If the client application isn't currently active, it is cached for later processing.
+ * If the client application isn't currently active and the no-cache flag is not set, it is cached for later processing.
*/
public static void sendExtras(Bundle extras) {
if (extras != null) {
+ String noCache = extras.getString(NO_CACHE);
if (gWebView != null) {
sendEvent(convertBundleToJson(extras));
- } else {
+ } else if(!"1".equals(noCache)){
Log.v(LOG_TAG, "sendExtras: caching extras to send at a later time.");
gCachedExtras.add(extras);
}
}
}
+ /*
+ * Retrives badge count from SharedPreferences
+ */
+ public static int getApplicationIconBadgeNumber(Context context){
+ SharedPreferences settings = context.getSharedPreferences(BADGE, Context.MODE_PRIVATE);
+ return settings.getInt(BADGE, 0);
+ }
+
+ /*
+ * Sets badge count on application icon and in SharedPreferences
+ */
public static void setApplicationIconBadgeNumber(Context context, int badgeCount) {
if (badgeCount > 0) {
ShortcutBadger.applyCount(context, badgeCount);
- } else {
+ }else{
ShortcutBadger.removeCount(context);
}
+
+ SharedPreferences.Editor editor = context.getSharedPreferences(BADGE, Context.MODE_PRIVATE).edit();
+ editor.putInt(BADGE, Math.max(badgeCount, 0));
+ editor.apply();
}
@Override
@@ -315,23 +342,7 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
notificationManager.cancelAll();
}
- /**
- * Transform `topic name` to `topic path`
- * Normally, the `topic` inputed from end-user is `topic name` only.
- * We should convert them to GCM `topic path`
- * Example:
- * when topic name = 'my-topic'
- * then topic path = '/topics/my-topic'
- *
- * @param String topic The topic name
- * @return The topic path
- */
- private String getTopicPath(String topic)
- {
- return "/topics/" + topic;
- }
-
- private void subscribeToTopics(JSONArray topics, String registrationToken) throws IOException {
+ private void subscribeToTopics(JSONArray topics, String registrationToken) {
if (topics != null) {
String topic = null;
for (int i=0; i<topics.length(); i++) {
@@ -341,16 +352,10 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
}
}
- private void subscribeToTopic(String topic, String registrationToken) throws IOException
- {
- try {
- if (topic != null) {
- Log.d(LOG_TAG, "Subscribing to topic: " + topic);
- GcmPubSub.getInstance(getApplicationContext()).subscribe(registrationToken, getTopicPath(topic), null);
- }
- } catch (IOException e) {
- Log.e(LOG_TAG, "Failed to subscribe to topic: " + topic, e);
- throw e;
+ private void subscribeToTopic(String topic, String registrationToken) {
+ if (topic != null) {
+ Log.d(LOG_TAG, "Subscribing to topic: " + topic);
+ FirebaseMessaging.getInstance().subscribeToTopic(topic);
}
}
@@ -358,29 +363,20 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
if (topics != null) {
String topic = null;
for (int i=0; i<topics.length(); i++) {
- try {
- topic = topics.optString(i, null);
- if (topic != null) {
- Log.d(LOG_TAG, "Unsubscribing to topic: " + topic);
- GcmPubSub.getInstance(getApplicationContext()).unsubscribe(registrationToken, getTopicPath(topic));
- }
- } catch (IOException e) {
- Log.e(LOG_TAG, "Failed to unsubscribe to topic: " + topic, e);
+ topic = topics.optString(i, null);
+ unsubscribeFromTopic(topic, registrationToken);
+ if (topic != null) {
+ Log.d(LOG_TAG, "Unsubscribing to topic: " + topic);
+ FirebaseMessaging.getInstance().unsubscribeFromTopic(topic);
}
}
}
}
- private void unsubscribeFromTopic(String topic, String registrationToken) throws IOException
- {
- try {
- if (topic != null) {
- Log.d(LOG_TAG, "Unsubscribing to topic: " + topic);
- GcmPubSub.getInstance(getApplicationContext()).unsubscribe(registrationToken, getTopicPath(topic));
- }
- } catch (IOException e) {
- Log.e(LOG_TAG, "Failed to unsubscribe to topic: " + topic, e);
- throw e;
+ private void unsubscribeFromTopic(String topic, String registrationToken) {
+ if (topic != null) {
+ Log.d(LOG_TAG, "Unsubscribing to topic: " + topic);
+ FirebaseMessaging.getInstance().unsubscribeFromTopic(topic);
}
}
@@ -413,6 +409,9 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
else if (key.equals(FOREGROUND)) {
additionalData.put(key, extras.getBoolean(FOREGROUND));
}
+ else if (key.equals(DISMISSED)) {
+ additionalData.put(key, extras.getBoolean(DISMISSED));
+ }
else if ( value instanceof String ) {
String strValue = (String)value;
try {
@@ -444,6 +443,13 @@ public class PushPlugin extends CordovaPlugin implements PushConstants {
return null;
}
+ private String getStringResourceByName(String aString) {
+ Activity activity = cordova.getActivity();
+ String packageName = activity.getPackageName();
+ int resId = activity.getResources().getIdentifier(aString, "string", packageName);
+ return activity.getString(resId);
+ }
+
public static boolean isInForeground() {
return gForeground;
}
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/RegistrationIntentService.java b/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/RegistrationIntentService.java
deleted file mode 100644
index b181e88e..00000000
--- a/StoneIsland/plugins/phonegap-plugin-push/src/android/com/adobe/phonegap/push/RegistrationIntentService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.adobe.phonegap.push;
-
-import android.content.Context;
-
-import android.app.IntentService;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.util.Log;
-
-import com.google.android.gms.gcm.GoogleCloudMessaging;
-import com.google.android.gms.iid.InstanceID;
-
-import java.io.IOException;
-
-public class RegistrationIntentService extends IntentService implements PushConstants {
- public static final String LOG_TAG = "PushPlugin_RegistrationIntentService";
-
- public RegistrationIntentService() {
- super(LOG_TAG);
- }
-
- @Override
- protected void onHandleIntent(Intent intent) {
- SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences(COM_ADOBE_PHONEGAP_PUSH, Context.MODE_PRIVATE);
-
- try {
- InstanceID instanceID = InstanceID.getInstance(this);
- String senderID = sharedPreferences.getString(SENDER_ID, "");
- String token = instanceID.getToken(senderID,
- GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
- PushPlugin.setRegistrationID(token);
- Log.i(LOG_TAG, "new GCM Registration Token: " + token);
-
- } catch (Exception e) {
- Log.d(LOG_TAG, "Failed to complete token refresh", e);
- }
- }
-}
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/browser/manifest.json b/StoneIsland/plugins/phonegap-plugin-push/src/browser/manifest.json
index ce8390ab..eff52c74 100644
--- a/StoneIsland/plugins/phonegap-plugin-push/src/browser/manifest.json
+++ b/StoneIsland/plugins/phonegap-plugin-push/src/browser/manifest.json
@@ -1,4 +1,4 @@
{
"name": "Push Demo",
- "gcm_sender_id": "85075801930"
+ "gcm_sender_id": "996231231186"
}
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.h b/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.h
index 276a0080..4cc1dcb0 100644
--- a/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.h
+++ b/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.h
@@ -29,7 +29,7 @@
@protocol GGLInstanceIDDelegate;
@protocol GCMReceiverDelegate;
-@interface PushPlugin : CDVPlugin<GGLInstanceIDDelegate, GCMReceiverDelegate>
+@interface PushPlugin : CDVPlugin
{
NSDictionary *notificationMessage;
BOOL isInline;
@@ -68,13 +68,12 @@
- (void)didSendDataMessageWithID:(NSString *)messageID;
- (void)didDeleteMessagesOnServer;
-// GCM Features
-@property(nonatomic, assign) BOOL usesGCM;
-@property(nonatomic, strong) NSNumber* gcmSandbox;
-@property(nonatomic, strong) NSString *gcmSenderId;
-@property(nonatomic, strong) NSDictionary *gcmRegistrationOptions;
-@property(nonatomic, strong) void (^gcmRegistrationHandler) (NSString *registrationToken, NSError *error);
-@property(nonatomic, strong) NSString *gcmRegistrationToken;
-@property(nonatomic, strong) NSArray *gcmTopics;
+// FCM Features
+@property(nonatomic, assign) BOOL usesFCM;
+@property(nonatomic, strong) NSNumber *fcmSandbox;
+@property(nonatomic, strong) NSString *fcmSenderId;
+@property(nonatomic, strong) NSDictionary *fcmRegistrationOptions;
+@property(nonatomic, strong) NSString *fcmRegistrationToken;
+@property(nonatomic, strong) NSArray *fcmTopics;
@end
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.m b/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.m
index a176b9af..90475d10 100644
--- a/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.m
+++ b/StoneIsland/plugins/phonegap-plugin-push/src/ios/PushPlugin.m
@@ -27,8 +27,9 @@
#define GMP_NO_MODULES true
#import "PushPlugin.h"
-#import "GoogleCloudMessaging.h"
-#import "GGLInstanceIDHeaders.h"
+@import FirebaseInstanceID;
+@import FirebaseMessaging;
+@import FirebaseAnalytics;
@implementation PushPlugin : CDVPlugin
@@ -42,78 +43,62 @@
@synthesize clearBadge;
@synthesize handlerObj;
-@synthesize usesGCM;
-@synthesize gcmSandbox;
-@synthesize gcmSenderId;
-@synthesize gcmRegistrationOptions;
-@synthesize gcmRegistrationHandler;
-@synthesize gcmRegistrationToken;
-@synthesize gcmTopics;
+@synthesize usesFCM;
+@synthesize fcmSandbox;
+@synthesize fcmSenderId;
+@synthesize fcmRegistrationOptions;
+@synthesize fcmRegistrationToken;
+@synthesize fcmTopics;
--(void)initGCMRegistrationHandler;
+-(void)initRegistration;
{
- __weak __block PushPlugin *weakSelf = self;
- gcmRegistrationHandler = ^(NSString *registrationToken, NSError *error){
- if (registrationToken != nil) {
- NSLog(@"GCM Registration Token: %@", registrationToken);
- [weakSelf setGcmRegistrationToken: registrationToken];
+ NSString * registrationToken = [[FIRInstanceID instanceID] token];
- id topics = [weakSelf gcmTopics];
- if (topics != nil) {
- for (NSString *topic in topics) {
- NSLog(@"subscribe from topic: %@", topic);
- id pubSub = [GCMPubSub sharedInstance];
- [pubSub subscribeWithToken: [weakSelf gcmRegistrationToken]
- topic:[NSString stringWithFormat:@"/topics/%@", topic]
- options:nil
- handler:^void(NSError *error) {
- if (error) {
- if (error.code == 3001) {
- NSLog(@"Already subscribed to %@", topic);
- } else {
- NSLog(@"Failed to subscribe to topic %@: %@", topic, error);
- }
- }
- else {
- NSLog(@"Successfully subscribe to topic %@", topic);
- }
- }];
- }
- }
+ if (registrationToken != nil) {
+ NSLog(@"FCM Registration Token: %@", registrationToken);
+ [self setFcmRegistrationToken: registrationToken];
- [weakSelf registerWithToken:registrationToken];
- } else {
- NSLog(@"Registration to GCM failed with error: %@", error.localizedDescription);
- [weakSelf failWithMessage:self.callbackId withMsg:@"" withError:error];
+ id topics = [self fcmTopics];
+ if (topics != nil) {
+ for (NSString *topic in topics) {
+ NSLog(@"subscribe to topic: %@", topic);
+ id pubSub = [FIRMessaging messaging];
+ [pubSub subscribeToTopic:topic];
+ }
}
- };
+
+ [self registerWithToken:registrationToken];
+ } else {
+ NSLog(@"FCM token is null");
+ }
+
}
-// GCM refresh token
+// FCM refresh token
// Unclear how this is testable under normal circumstances
- (void)onTokenRefresh {
#if !TARGET_IPHONE_SIMULATOR
// A rotation of the registration tokens is happening, so the app needs to request a new token.
- NSLog(@"The GCM registration token needs to be changed.");
- [[GGLInstanceID sharedInstance] tokenWithAuthorizedEntity:[self gcmSenderId]
- scope:kGGLInstanceIDScopeGCM
- options:[self gcmRegistrationOptions]
- handler:[self gcmRegistrationHandler]];
+ NSLog(@"The FCM registration token needs to be changed.");
+ [[FIRInstanceID instanceID] token];
+ [self initRegistration];
#endif
}
-- (void)willSendDataMessageWithID:(NSString *)messageID error:(NSError *)error {
- NSLog(@"willSendDataMessageWithID");
- if (error) {
- // Failed to send the message.
- } else {
- // Will send message, you can save the messageID to track the message
- }
+// contains error info
+- (void)sendDataMessageFailure:(NSNotification *)notification {
+ NSLog(@"sendDataMessageFailure");
+}
+- (void)sendDataMessageSuccess:(NSNotification *)notification {
+ NSLog(@"sendDataMessageSuccess");
+}
+
+- (void)didSendDataMessageWithID:messageID {
+ NSLog(@"didSendDataMessageWithID");
}
-- (void)didSendDataMessageWithID:(NSString *)messageID {
+- (void)willSendDataMessageWithID:messageID error:error {
NSLog(@"willSendDataMessageWithID");
- // Did successfully send message identified by messageID
}
- (void)didDeleteMessagesOnServer {
@@ -128,20 +113,10 @@
NSArray* topics = [command argumentAtIndex:0];
if (topics != nil) {
- id pubSub = [GCMPubSub sharedInstance];
+ id pubSub = [FIRMessaging messaging];
for (NSString *topic in topics) {
NSLog(@"unsubscribe from topic: %@", topic);
- [pubSub unsubscribeWithToken: [self gcmRegistrationToken]
- topic:[NSString stringWithFormat:@"/topics/%@", topic]
- options:nil
- handler:^void(NSError *error) {
- if (error) {
- NSLog(@"Failed to unsubscribe from topic %@: %@", topic, error);
- }
- else {
- NSLog(@"Successfully unsubscribe from topic %@", topic);
- }
- }];
+ [pubSub unsubscribeFromTopic:topic];
}
} else {
[[UIApplication sharedApplication] unregisterForRemoteNotifications];
@@ -155,25 +130,10 @@
if (topic != nil) {
NSLog(@"subscribe from topic: %@", topic);
- id pubSub = [GCMPubSub sharedInstance];
- [pubSub subscribeWithToken: [self gcmRegistrationToken]
- topic:[NSString stringWithFormat:@"/topics/%@", topic]
- options:nil
- handler:^void(NSError *error) {
- if (error) {
- if (error.code == 3001) {
- NSLog(@"Already subscribed to %@", topic);
- [self successWithMessage:command.callbackId withMsg:[NSString stringWithFormat:@"Already subscribed to %@", topic]];
- } else {
- NSLog(@"Failed to subscribe to topic %@: %@", topic, error);
- [self failWithMessage:command.callbackId withMsg:[NSString stringWithFormat:@"Failed to subscribe to topic %@", topic] withError:error];
- }
- }
- else {
- NSLog(@"Successfully subscribe to topic %@", topic);
- [self successWithMessage:command.callbackId withMsg:[NSString stringWithFormat:@"Successfully subscribe to topic %@", topic]];
- }
- }];
+ id pubSub = [FIRMessaging messaging];
+ [pubSub subscribeToTopic:topic];
+ NSLog(@"Successfully subscribe to topic %@", topic);
+ [self successWithMessage:command.callbackId withMsg:[NSString stringWithFormat:@"Successfully subscribe to topic %@", topic]];
} else {
NSLog(@"There is no topic to subscribe");
[self successWithMessage:command.callbackId withMsg:@"There is no topic to subscribe"];
@@ -186,19 +146,10 @@
if (topic != nil) {
NSLog(@"unsubscribe from topic: %@", topic);
- id pubSub = [GCMPubSub sharedInstance];
- [pubSub unsubscribeWithToken: [self gcmRegistrationToken]
- topic:[NSString stringWithFormat:@"/topics/%@", topic]
- options:nil
- handler:^void(NSError *error) {
- if (error) {
- NSLog(@"Failed to unsubscribe to topic %@: %@", topic, error);
- [self failWithMessage:command.callbackId withMsg:[NSString stringWithFormat:@"Failed to unsubscribe to topic %@", topic] withError:error];
- } else {
- NSLog(@"Successfully unsubscribe to topic %@", topic);
- [self successWithMessage:command.callbackId withMsg:[NSString stringWithFormat:@"Successfully unsubscribe to topic %@", topic]];
- }
- }];
+ id pubSub = [FIRMessaging messaging];
+ [pubSub unsubscribeFromTopic:topic];
+ NSLog(@"Successfully unsubscribe from topic %@", topic);
+ [self successWithMessage:command.callbackId withMsg:[NSString stringWithFormat:@"Successfully unsubscribe from topic %@", topic]];
} else {
NSLog(@"There is no topic to unsubscribe");
[self successWithMessage:command.callbackId withMsg:@"There is no topic to unsubscribe"];
@@ -207,6 +158,22 @@
- (void)init:(CDVInvokedUrlCommand*)command;
{
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self selector:@selector(onTokenRefresh)
+ name:kFIRInstanceIDTokenRefreshNotification object:nil];
+
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self selector:@selector(sendDataMessageFailure:)
+ name:FIRMessagingSendErrorNotification object:nil];
+
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self selector:@selector(sendDataMessageSuccess:)
+ name:FIRMessagingSendSuccessNotification object:nil];
+
+ [[NSNotificationCenter defaultCenter]
+ addObserver:self selector:@selector(didDeleteMessagesOnServer)
+ name:FIRMessagingMessagesDeletedNotification object:nil];
+
[self.commandDelegate runInBackground:^ {
NSLog(@"Push Plugin register called");
@@ -215,13 +182,10 @@
NSMutableDictionary* options = [command.arguments objectAtIndex:0];
NSMutableDictionary* iosOptions = [options objectForKey:@"ios"];
- NSArray* topics = [iosOptions objectForKey:@"topics"];
- [self setGcmTopics:topics];
+ NSArray* topics = [iosOptions objectForKey:@"topics"];
+ [self setFcmTopics:topics];
-#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
UIUserNotificationType UserNotificationTypes = UIUserNotificationTypeNone;
-#endif
- UIRemoteNotificationType notificationTypes = UIRemoteNotificationTypeNone;
id badgeArg = [iosOptions objectForKey:@"badge"];
id soundArg = [iosOptions objectForKey:@"sound"];
@@ -230,32 +194,20 @@
if (([badgeArg isKindOfClass:[NSString class]] && [badgeArg isEqualToString:@"true"]) || [badgeArg boolValue])
{
- notificationTypes |= UIRemoteNotificationTypeBadge;
-#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
UserNotificationTypes |= UIUserNotificationTypeBadge;
-#endif
}
if (([soundArg isKindOfClass:[NSString class]] && [soundArg isEqualToString:@"true"]) || [soundArg boolValue])
{
- notificationTypes |= UIRemoteNotificationTypeSound;
-#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
UserNotificationTypes |= UIUserNotificationTypeSound;
-#endif
}
if (([alertArg isKindOfClass:[NSString class]] && [alertArg isEqualToString:@"true"]) || [alertArg boolValue])
{
- notificationTypes |= UIRemoteNotificationTypeAlert;
-#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
UserNotificationTypes |= UIUserNotificationTypeAlert;
-#endif
}
- notificationTypes |= UIRemoteNotificationTypeNewsstandContentAvailability;
-#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
UserNotificationTypes |= UIUserNotificationActivationModeBackground;
-#endif
if (clearBadgeArg == nil || ([clearBadgeArg isKindOfClass:[NSString class]] && [clearBadgeArg isEqualToString:@"false"]) || ![clearBadgeArg boolValue]) {
NSLog(@"PushPlugin.register: setting badge to false");
@@ -267,12 +219,8 @@
}
NSLog(@"PushPlugin.register: clear badge is set to %d", clearBadge);
- if (notificationTypes == UIRemoteNotificationTypeNone)
- NSLog(@"PushPlugin.register: Push notification type is set to none");
-
isInline = NO;
-#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
NSLog(@"PushPlugin.register: better button setup");
// setup action buttons
NSMutableSet *categories = [[NSMutableSet alloc] init];
@@ -329,45 +277,46 @@
}
}
-#else
- NSLog(@"PushPlugin.register: action buttons only supported on iOS8 and above");
-#endif
-
-#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
if ([[UIApplication sharedApplication]respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UserNotificationTypes categories:categories];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
- } else {
- [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
- (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
-#else
- [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
- (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
-#endif
+
+ // Read GoogleService-Info.plist
+ NSString *path = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
+
+ // Load the file content and read the data into arrays
+ NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path];
+ fcmSenderId = [dict objectForKey:@"GCM_SENDER_ID"];
+ BOOL isGcmEnabled = [[dict valueForKey:@"IS_GCM_ENABLED"] boolValue];
+
+ NSLog(@"FCM Sender ID %@", fcmSenderId);
// GCM options
- [self setGcmSenderId: [iosOptions objectForKey:@"senderID"]];
- NSLog(@"GCM Sender ID %@", gcmSenderId);
- if([[self gcmSenderId] length] > 0) {
- NSLog(@"Using GCM Notification");
- [self setUsesGCM: YES];
- [self initGCMRegistrationHandler];
+ [self setFcmSenderId: fcmSenderId];
+ if(isGcmEnabled && [[self fcmSenderId] length] > 0) {
+ NSLog(@"Using FCM Notification");
+ [self setUsesFCM: YES];
+ dispatch_async(dispatch_get_main_queue(), ^{
+ if([FIRApp defaultApp] == nil)
+ [FIRApp configure];
+ [self initRegistration];
+ });
} else {
NSLog(@"Using APNS Notification");
- [self setUsesGCM:NO];
+ [self setUsesFCM:NO];
}
- id gcmSandBoxArg = [iosOptions objectForKey:@"gcmSandbox"];
+ id fcmSandboxArg = [iosOptions objectForKey:@"fcmSandbox"];
- [self setGcmSandbox:@NO];
- if ([self usesGCM] &&
- (([gcmSandBoxArg isKindOfClass:[NSString class]] && [gcmSandBoxArg isEqualToString:@"true"]) ||
- [gcmSandBoxArg boolValue]))
+ [self setFcmSandbox:@NO];
+ if ([self usesFCM] &&
+ (([fcmSandboxArg isKindOfClass:[NSString class]] && [fcmSandboxArg isEqualToString:@"true"]) ||
+ [fcmSandboxArg boolValue]))
{
- NSLog(@"Using GCM Sandbox");
- [self setGcmSandbox:@YES];
+ NSLog(@"Using FCM Sandbox");
+ [self setFcmSandbox:@YES];
}
if (notificationMessage) { // if there is a pending startup notification
@@ -422,14 +371,8 @@
[results setValue:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"] forKey:@"appVersion"];
// Check what Notifications the user has turned on. We registered for all three, but they may have manually disabled some or all of them.
-#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
- NSUInteger rntypes;
- if (!SYSTEM_VERSION_LESS_THAN(@"8.0")) {
- rntypes = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
- } else {
- rntypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
- }
+ NSUInteger rntypes = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];
// Set the defaults to disabled unless we find otherwise...
NSString *pushBadge = @"disabled";
@@ -440,13 +383,13 @@
// one is actually disabled. So we are literally checking to see if rnTypes matches what is turned on, instead of by number. The "tricky" part is that the
// single notification types will only match if they are the ONLY one enabled. Likewise, when we are checking for a pair of notifications, it will only be
// true if those two notifications are on. This is why the code is written this way
- if(rntypes & UIRemoteNotificationTypeBadge){
+ if(rntypes & UIUserNotificationTypeBadge){
pushBadge = @"enabled";
}
- if(rntypes & UIRemoteNotificationTypeAlert) {
+ if(rntypes & UIUserNotificationTypeAlert) {
pushAlert = @"enabled";
}
- if(rntypes & UIRemoteNotificationTypeSound) {
+ if(rntypes & UIUserNotificationTypeSound) {
pushSound = @"enabled";
}
@@ -460,24 +403,7 @@
[results setValue:dev.model forKey:@"deviceModel"];
[results setValue:dev.systemVersion forKey:@"deviceSystemVersion"];
- if([self usesGCM]) {
- GGLInstanceIDConfig *instanceIDConfig = [GGLInstanceIDConfig defaultConfig];
- instanceIDConfig.delegate = self;
- [[GGLInstanceID sharedInstance] startWithConfig:instanceIDConfig];
-
- [self setGcmRegistrationOptions: @{kGGLInstanceIDRegisterAPNSOption:deviceToken,
- kGGLInstanceIDAPNSServerTypeSandboxOption:[self gcmSandbox]}];
-
- [[GGLInstanceID sharedInstance] tokenWithAuthorizedEntity:[self gcmSenderId]
- scope:kGGLInstanceIDScopeGCM
- options:[self gcmRegistrationOptions]
- handler:[self gcmRegistrationHandler]];
-
- GCMConfig *gcmConfig = [GCMConfig defaultConfig];
- gcmConfig.receiverDelegate = self;
- [[GCMService sharedInstance] startWithConfig:gcmConfig];
-
- } else {
+ if(![self usesFCM]) {
[self registerWithToken: token];
}
#endif
@@ -610,31 +536,36 @@
[self.commandDelegate sendPluginResult:commandResult callbackId:command.callbackId];
}
--(void)successWithMessage:(NSString *)callbackId withMsg:(NSString *)message
+-(void)successWithMessage:(NSString *)myCallbackId withMsg:(NSString *)message
{
- if (callbackId != nil)
+ if (myCallbackId != nil)
{
CDVPluginResult *commandResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:message];
- [self.commandDelegate sendPluginResult:commandResult callbackId:callbackId];
+ [self.commandDelegate sendPluginResult:commandResult callbackId:myCallbackId];
}
}
-(void)registerWithToken:(NSString*)token; {
// Send result to trigger 'registration' event but keep callback
- NSMutableDictionary* message = [NSMutableDictionary dictionaryWithCapacity:1];
+ NSMutableDictionary* message = [NSMutableDictionary dictionaryWithCapacity:2];
[message setObject:token forKey:@"registrationId"];
+ if ([self usesFCM]) {
+ [message setObject:@"FCM" forKey:@"registrationType"];
+ } else {
+ [message setObject:@"APNS" forKey:@"registrationType"];
+ }
CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsDictionary:message];
[pluginResult setKeepCallbackAsBool:YES];
[self.commandDelegate sendPluginResult:pluginResult callbackId:self.callbackId];
}
--(void)failWithMessage:(NSString *)callbackId withMsg:(NSString *)message withError:(NSError *)error
+-(void)failWithMessage:(NSString *)myCallbackId withMsg:(NSString *)message withError:(NSError *)error
{
NSString *errorMessage = (error) ? [NSString stringWithFormat:@"%@ - %@", message, [error localizedDescription]] : message;
CDVPluginResult *commandResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:errorMessage];
- [self.commandDelegate sendPluginResult:commandResult callbackId:callbackId];
+ [self.commandDelegate sendPluginResult:commandResult callbackId:myCallbackId];
}
-(void) finish:(CDVInvokedUrlCommand*)command
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/js/push.js b/StoneIsland/plugins/phonegap-plugin-push/src/js/push.js
new file mode 100644
index 00000000..150af344
--- /dev/null
+++ b/StoneIsland/plugins/phonegap-plugin-push/src/js/push.js
@@ -0,0 +1,316 @@
+/* global cordova:false */
+/* globals window */
+
+/*!
+ * Module dependencies.
+ */
+
+const exec = cordova.require('cordova/exec');
+
+class PushNotification {
+ /**
+ * PushNotification constructor.
+ *
+ * @param {Object} options to initiate Push Notifications.
+ * @return {PushNotification} instance that can be monitored and cancelled.
+ */
+ constructor(options) {
+ this.handlers = {
+ registration: [],
+ notification: [],
+ error: [],
+ };
+
+ // require options parameter
+ if (typeof options === 'undefined') {
+ throw new Error('The options argument is required.');
+ }
+
+ // store the options to this object instance
+ this.options = options;
+
+ // triggered on registration and notification
+ const success = (result) => {
+ if (result && typeof result.registrationId !== 'undefined') {
+ this.emit('registration', result);
+ } else if (result && result.additionalData &&
+ typeof result.additionalData.actionCallback !== 'undefined') {
+ const executeFuctionOrEmitEventByName = (functionName, context, ...args) => {
+ const namespaces = functionName.split('.');
+ const func = namespaces.pop();
+ for (let i = 0; i < namespaces.length; i++) {
+ context = context[namespaces[i]];
+ }
+
+ if (typeof context[func] === 'function') {
+ context[func].call(context, args);
+ } else {
+ this.emit(functionName, args);
+ }
+ };
+
+ executeFuctionOrEmitEventByName(result.additionalData.actionCallback, window, result);
+ } else if (result) {
+ this.emit('notification', result);
+ }
+ };
+
+ // triggered on error
+ const fail = (msg) => {
+ const e = (typeof msg === 'string') ? new Error(msg) : msg;
+ this.emit('error', e);
+ };
+
+ // wait at least one process tick to allow event subscriptions
+ setTimeout(() => {
+ exec(success, fail, 'PushNotification', 'init', [options]);
+ }, 10);
+ }
+
+ /**
+ * Unregister from push notifications
+ */
+ unregister(successCallback, errorCallback = () => {}, options) {
+ if (typeof errorCallback !== 'function') {
+ console.log('PushNotification.unregister failure: failure parameter not a function');
+ return;
+ }
+
+ if (typeof successCallback !== 'function') {
+ console.log('PushNotification.unregister failure: success callback parameter ' +
+ ' must be a function');
+ return;
+ }
+
+ const cleanHandlersAndPassThrough = () => {
+ if (!options) {
+ this.handlers = {
+ registration: [],
+ notification: [],
+ error: [],
+ };
+ }
+ successCallback();
+ };
+
+ exec(cleanHandlersAndPassThrough, errorCallback, 'PushNotification', 'unregister', [options]);
+ }
+
+ /**
+ * subscribe to a topic
+ * @param {String} topic topic to subscribe
+ * @param {Function} successCallback success callback
+ * @param {Function} errorCallback error callback
+ * @return {void}
+ */
+ subscribe(topic, successCallback, errorCallback = () => {}) {
+ if (typeof errorCallback !== 'function') {
+ console.log('PushNotification.subscribe failure: ' +
+ 'failure parameter not a function');
+ return;
+ }
+
+ if (typeof successCallback !== 'function') {
+ console.log('PushNotification.subscribe failure: ' +
+ 'success callback parameter must be a function');
+ return;
+ }
+
+ exec(successCallback, errorCallback, 'PushNotification', 'subscribe', [topic]);
+ }
+
+ /**
+ * unsubscribe to a topic
+ * @param {String} topic topic to unsubscribe
+ * @param {Function} successCallback success callback
+ * @param {Function} errorCallback error callback
+ * @return {void}
+ */
+ unsubscribe(topic, successCallback, errorCallback = () => {}) {
+ if (typeof errorCallback !== 'function') {
+ console.log('PushNotification.unsubscribe failure: failure parameter not a function');
+ return;
+ }
+
+ if (typeof successCallback !== 'function') {
+ console.log('PushNotification.unsubscribe failure: ' +
+ 'success callback parameter must be a function');
+ return;
+ }
+
+ exec(successCallback, errorCallback, 'PushNotification', 'unsubscribe', [topic]);
+ }
+
+
+ /**
+ * Call this to set the application icon badge
+ */
+ setApplicationIconBadgeNumber(successCallback, errorCallback = () => {}, badge) {
+ if (typeof errorCallback !== 'function') {
+ console.log('PushNotification.setApplicationIconBadgeNumber failure: failure ' +
+ 'parameter not a function');
+ return;
+ }
+
+ if (typeof successCallback !== 'function') {
+ console.log('PushNotification.setApplicationIconBadgeNumber failure: success ' +
+ 'callback parameter must be a function');
+ return;
+ }
+
+ exec(successCallback, errorCallback, 'PushNotification',
+ 'setApplicationIconBadgeNumber', [{ badge }]);
+ }
+
+ /**
+ * Get the application icon badge
+ */
+
+ getApplicationIconBadgeNumber(successCallback, errorCallback = () => {}) {
+ if (typeof errorCallback !== 'function') {
+ console.log('PushNotification.getApplicationIconBadgeNumber failure: failure ' +
+ 'parameter not a function');
+ return;
+ }
+
+ if (typeof successCallback !== 'function') {
+ console.log('PushNotification.getApplicationIconBadgeNumber failure: success ' +
+ 'callback parameter must be a function');
+ return;
+ }
+
+ exec(successCallback, errorCallback, 'PushNotification', 'getApplicationIconBadgeNumber', []);
+ }
+
+ /**
+ * Clear all notifications
+ */
+
+ clearAllNotifications(successCallback = () => {}, errorCallback = () => {}) {
+ if (typeof errorCallback !== 'function') {
+ console.log('PushNotification.clearAllNotifications failure: failure parameter ' +
+ 'not a function');
+ return;
+ }
+
+ if (typeof successCallback !== 'function') {
+ console.log('PushNotification.clearAllNotifications failure: success callback ' +
+ 'parameter must be a function');
+ return;
+ }
+
+ exec(successCallback, errorCallback, 'PushNotification', 'clearAllNotifications', []);
+ }
+ /**
+ * Listen for an event.
+ *
+ * The following events are supported:
+ *
+ * - registration
+ * - notification
+ * - error
+ *
+ * @param {String} eventName to subscribe to.
+ * @param {Function} callback triggered on the event.
+ */
+
+ on(eventName, callback) {
+ if (!this.handlers.hasOwnProperty(eventName)) {
+ this.handlers[eventName] = [];
+ }
+ this.handlers[eventName].push(callback);
+ }
+
+ /**
+ * Remove event listener.
+ *
+ * @param {String} eventName to match subscription.
+ * @param {Function} handle function associated with event.
+ */
+
+ off(eventName, handle) {
+ if (this.handlers.hasOwnProperty(eventName)) {
+ const handleIndex = this.handlers[eventName].indexOf(handle);
+ if (handleIndex >= 0) {
+ this.handlers[eventName].splice(handleIndex, 1);
+ }
+ }
+ }
+
+ /**
+ * Emit an event.
+ *
+ * This is intended for internal use only.
+ *
+ * @param {String} eventName is the event to trigger.
+ * @param {*} all arguments are passed to the event listeners.
+ *
+ * @return {Boolean} is true when the event is triggered otherwise false.
+ */
+
+ emit(...args) {
+ const eventName = args.shift();
+
+ if (!this.handlers.hasOwnProperty(eventName)) {
+ return false;
+ }
+
+ for (let i = 0, length = this.handlers[eventName].length; i < length; i++) {
+ const callback = this.handlers[eventName][i];
+ if (typeof callback === 'function') {
+ callback.apply(undefined, args);
+ } else {
+ console.log(`event handler: ${eventName} must be a function`);
+ }
+ }
+
+ return true;
+ }
+
+ finish(successCallback = () => {}, errorCallback = () => {}, id = 'handler') {
+ if (typeof successCallback !== 'function') {
+ console.log('finish failure: success callback parameter must be a function');
+ return;
+ }
+
+ if (typeof errorCallback !== 'function') {
+ console.log('finish failure: failure parameter not a function');
+ return;
+ }
+
+ exec(successCallback, errorCallback, 'PushNotification', 'finish', [id]);
+ }
+}
+
+/*!
+ * Push Notification Plugin.
+ */
+
+module.exports = {
+ /**
+ * Register for Push Notifications.
+ *
+ * This method will instantiate a new copy of the PushNotification object
+ * and start the registration process.
+ *
+ * @param {Object} options
+ * @return {PushNotification} instance
+ */
+
+ init: (options) => {
+ return new PushNotification(options);
+ },
+
+ hasPermission: (successCallback, errorCallback) => {
+ exec(successCallback, errorCallback, 'PushNotification', 'hasPermission', []);
+ },
+
+ /**
+ * PushNotification Object.
+ *
+ * Expose the PushNotification object for direct use
+ * and testing. Typically, you should use the
+ * .init helper method.
+ */
+ PushNotification,
+};
diff --git a/StoneIsland/plugins/phonegap-plugin-push/src/windows/PushPluginProxy.js b/StoneIsland/plugins/phonegap-plugin-push/src/windows/PushPluginProxy.js
index ac04f39d..eb552dc0 100644
--- a/StoneIsland/plugins/phonegap-plugin-push/src/windows/PushPluginProxy.js
+++ b/StoneIsland/plugins/phonegap-plugin-push/src/windows/PushPluginProxy.js
@@ -88,6 +88,12 @@ module.exports = {
} catch(ex) {
onFail(ex);
}
+ },
+ subscribe: function() {
+ console.log("Subscribe is unsupported");
+ },
+ unsubscribe: function() {
+ console.log("Subscribe is unsupported");
}
};
require("cordova/exec/proxy").add("PushNotification", module.exports);