Skip to content

Commit 1dbf7a8

Browse files
committed
Initial commit for fcm upgrade
1 parent afbb3bb commit 1dbf7a8

File tree

9 files changed

+318
-132
lines changed

9 files changed

+318
-132
lines changed

iterableapi/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ dependencies {
2323
testCompile 'junit:junit:4.12'
2424
compile 'com.android.support:appcompat-v7:23.2.1'
2525
compile 'com.google.android.gms:play-services-gcm:9.0.2'
26+
compile 'com.google.firebase:firebase-messaging:9.0.2'
2627
compile 'com.android.support:support-annotations:23.2.1'
2728
compile 'com.squareup.picasso:picasso:2.5.2'
2829
}

iterableapi/src/main/java/com/iterable/iterableapi/IterableApi.java

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,31 @@
44
import android.content.Context;
55
import android.content.Intent;
66
import android.content.SharedPreferences;
7-
import android.net.Uri;
87
import android.os.Build;
98
import android.os.Bundle;
9+
import android.util.Log;
1010

1111
import com.google.android.gms.ads.identifier.AdvertisingIdClient;
1212
import com.google.android.gms.common.GooglePlayServicesNotAvailableException;
1313
import com.google.android.gms.common.GooglePlayServicesRepairableException;
14+
import com.google.android.gms.gcm.GoogleCloudMessaging;
15+
import com.google.android.gms.iid.InstanceID;
16+
import com.google.firebase.iid.FirebaseInstanceId;
1417

1518
import org.json.JSONException;
1619
import org.json.JSONObject;
1720

1821
import java.io.IOException;
1922
import java.text.SimpleDateFormat;
2023
import java.util.Date;
24+
import java.util.Objects;
25+
import java.util.Set;
2126
import java.util.TimeZone;
27+
import java.util.concurrent.Callable;
28+
import java.util.concurrent.ExecutionException;
29+
import java.util.concurrent.ExecutorService;
30+
import java.util.concurrent.Executors;
31+
import java.util.concurrent.Future;
2232
import java.util.regex.Matcher;
2333
import java.util.regex.Pattern;
2434

@@ -313,13 +323,17 @@ public boolean isIterableIntent(Intent intent) {
313323
}
314324

315325
/**
316-
* Registers an existing GCM device token with Iterable.
326+
* Registers an existing device token with Iterable.
317327
* Recommended to use registerForPush if you do not already have a deviceToken
318328
* @param applicationName
319329
* @param token
320330
*/
321-
public void registerDeviceToken(String applicationName, String token) {
322-
registerDeviceToken(applicationName, token, null);
331+
public void registerDeviceToken(final String applicationName, final String token) {
332+
new Thread(new Runnable() {
333+
public void run() {
334+
registerDeviceToken(applicationName, token, null);
335+
}
336+
}).start();
323337
}
324338

325339
/**
@@ -470,20 +484,45 @@ public void updateUser(JSONObject dataFields) {
470484
* @param gcmProjectNumber
471485
*/
472486
public void registerForPush(String iterableAppId, String gcmProjectNumber) {
473-
registerForPush(iterableAppId, gcmProjectNumber, false);
487+
registerForPush(iterableAppId, gcmProjectNumber, IterableConstants.MESSAGING_PLATFORM_GOOGLE);
488+
}
489+
490+
/**
491+
* Registers for push notifications.
492+
* @param iterableAppId
493+
* @param projectNumber
494+
* @param pushServicePlatform
495+
*/
496+
public void registerForPush(String iterableAppId, String projectNumber, String pushServicePlatform) {
497+
IterablePushRegistrationData data = new IterablePushRegistrationData(iterableAppId, projectNumber, pushServicePlatform, IterablePushRegistrationData.PushRegistrationAction.ENABLE);
498+
new IterablePushRegistration().execute(data);
474499
}
475500

476501
/**
477502
* Disables the device from push notifications
478503
*
479-
* The disablePush call first calls registerForPush to obtain the device's registration token.
480-
* Then it calls the disablePush api endpoint.
504+
* The disablePush call
481505
*
482506
* @param iterableAppId
483507
* @param gcmProjectNumber
484508
*/
485509
public void disablePush(String iterableAppId, String gcmProjectNumber) {
486-
registerForPush(iterableAppId, gcmProjectNumber, true);
510+
disablePush(iterableAppId, gcmProjectNumber, IterableConstants.MESSAGING_PLATFORM_GOOGLE);
511+
}
512+
513+
/**
514+
* Disables the device from push notifications
515+
*
516+
* The disablePush call
517+
*
518+
* @param iterableAppId
519+
* @param projectNumber
520+
* @param pushServicePlatform
521+
*/
522+
public void disablePush(String iterableAppId, String projectNumber, String pushServicePlatform) {
523+
524+
IterablePushRegistrationData data = new IterablePushRegistrationData(iterableAppId, projectNumber, pushServicePlatform, IterablePushRegistrationData.PushRegistrationAction.DISABLE);
525+
new IterablePushRegistration().execute(data);
487526
}
488527

489528
/**
@@ -606,21 +645,6 @@ static String getNotificationIcon(Context context) {
606645
return iconName;
607646
}
608647

609-
/**
610-
* Registers the device for push notifications.
611-
* @param iterableAppId
612-
* @param gcmProjectNumber
613-
* @param disableAfterRegistration
614-
*/
615-
protected void registerForPush(String iterableAppId, String gcmProjectNumber, boolean disableAfterRegistration) {
616-
Intent pushRegistrationIntent = new Intent(_applicationContext, IterablePushReceiver.class);
617-
pushRegistrationIntent.setAction(IterableConstants.ACTION_PUSH_REGISTRATION);
618-
pushRegistrationIntent.putExtra(IterableConstants.PUSH_APP_ID, iterableAppId);
619-
pushRegistrationIntent.putExtra(IterableConstants.PUSH_GCM_PROJECT_NUMBER, gcmProjectNumber);
620-
pushRegistrationIntent.putExtra(IterableConstants.PUSH_DISABLE_AFTER_REGISTRATION, disableAfterRegistration);
621-
_applicationContext.sendBroadcast(pushRegistrationIntent);
622-
}
623-
624648
/**
625649
* Tracks when a push notification is opened on device.
626650
* @param campaignId
@@ -643,7 +667,7 @@ protected void trackPushOpen(int campaignId, int templateId, String messageId) {
643667
}
644668

645669
/**
646-
* Internal api call made from IterablePushRegistrationGCM after a registrationToken is obtained.
670+
* Internal api call made from IterablePushRegistration after a registrationToken is obtained.
647671
* @param token
648672
*/
649673
protected void disablePush(String token) {

iterableapi/src/main/java/com/iterable/iterableapi/IterableConstants.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,10 @@ public final class IterableConstants {
4747
public static final String PUSH_GCM_PROJECT_NUMBER = "GCMProjectNumber";
4848
public static final String PUSH_DISABLE_AFTER_REGISTRATION = "DisableAfterRegistration";
4949

50-
public static final String MESSAGING_PLATFORM_GOOGLE = "GCM";
51-
public static final String MESSAGING_PLATFORM_AMAZON = "ADM";
50+
public static final String MESSAGING_PUSH_SERVICE_PLATFORM = "PushServicePlatform";
51+
public static final String MESSAGING_PLATFORM_GOOGLE = "GCM";
52+
public static final String MESSAGING_PLATFORM_FIREBASE = "FCM";
53+
public static final String MESSAGING_PLATFORM_AMAZON = "ADM";
5254

5355
public static final String IS_GHOST_PUSH = "isGhostPush";
5456
public static final String ITERABLE_DATA_KEY = "itbl";
@@ -57,6 +59,7 @@ public final class IterableConstants {
5759
public static final String ITERABLE_DATA_SOUND = "sound";
5860

5961
public static final String INSTANCE_ID_CLASS = "com.google.android.gms.iid.InstanceID";
62+
public static final String FIREBASE_MESSAGING_CLASS = "com.google.firebase.messaging.FirebaseMessaging";
6063
public static final String ICON_FOLDER_IDENTIFIER = "drawable";
6164
public static final String NOTIFICATION_ICON_NAME = "iterable_notification_icon";
6265
public static final String NOTIFICATION_COLOR = "iterable_notification_color";
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.iterable.iterableapi;
2+
3+
import android.content.Context;
4+
import android.content.SharedPreferences;
5+
import android.util.Log;
6+
7+
import com.google.firebase.iid.FirebaseInstanceId;
8+
import com.google.firebase.iid.FirebaseInstanceIdService;
9+
10+
import iterable.com.iterableapi.R;
11+
12+
/**
13+
* Created by David Truong dt@iterable.com.
14+
*/
15+
public class IterableFirebaseInstanceIDService extends FirebaseInstanceIdService {
16+
17+
static final String TAG = "itblFCMInstanceService";
18+
19+
@Override
20+
public void onTokenRefresh() {
21+
String registrationToken = FirebaseInstanceId.getInstance().getToken();
22+
23+
Context mainContext = IterableApi.sharedInstance.getMainActivityContext();
24+
if (mainContext != null) {
25+
SharedPreferences sharedPref = mainContext.getSharedPreferences(IterableConstants.PUSH_APP_ID, Context.MODE_PRIVATE);
26+
String pushIdPref = sharedPref.getString(IterableConstants.PUSH_APP_ID, null);
27+
if (registrationToken != null && !registrationToken.isEmpty() && pushIdPref != null
28+
&& !pushIdPref.equalsIgnoreCase(IterableConstants.PUSH_APP_ID)) {
29+
Log.w(TAG, "Refreshed fcm token: " + registrationToken);
30+
IterableApi.sharedInstance.registerDeviceToken(pushIdPref, registrationToken);
31+
SharedPreferences.Editor editor = sharedPref.edit();
32+
editor.putString(IterableConstants.PUSH_APP_ID, IterableConstants.PUSH_APP_ID);
33+
editor.commit();
34+
}
35+
}
36+
}
37+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.iterable.iterableapi;
2+
3+
4+
import android.util.Log;
5+
6+
import com.google.firebase.messaging.FirebaseMessagingService;
7+
import com.google.firebase.messaging.RemoteMessage;
8+
9+
import java.util.Map;
10+
11+
/**
12+
* Created by David Truong dt@iterable.com.
13+
*/
14+
public class IterableFirebaseMessagingService extends FirebaseMessagingService {
15+
16+
static final String TAG = "itblFCMMessagingService";
17+
18+
@Override
19+
public void onMessageReceived(RemoteMessage remoteMessage) {
20+
super.onMessageReceived(remoteMessage);
21+
//Handle custom message here
22+
}
23+
}

iterableapi/src/main/java/com/iterable/iterableapi/IterablePushReceiver.java

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import android.content.Intent;
77
import android.content.pm.PackageManager;
88
import android.os.Bundle;
9+
import android.util.Log;
910

1011
/**
1112
*
@@ -16,6 +17,7 @@ public class IterablePushReceiver extends BroadcastReceiver{
1617
static final String TAG = "IterablePushReceiver";
1718

1819
private static final String ACTION_GCM_RECEIVE_INTENT = "com.google.android.c2dm.intent.RECEIVE";
20+
private static final String ACTION_FCM_RECEIVE_INTENT = "com.google.firebase.MESSAGING_EVENT";
1921

2022
/**
2123
* Receives a new IterablePushIntent.
@@ -26,25 +28,32 @@ public class IterablePushReceiver extends BroadcastReceiver{
2628
public void onReceive(Context context, Intent intent) {
2729
String intentAction = intent.getAction();
2830

29-
if (intentAction.equals(IterableConstants.ACTION_PUSH_REGISTRATION)) {
30-
handlePushRegistration(context, intent);
31+
if (intentAction.equals(ACTION_FCM_RECEIVE_INTENT)) {
32+
IterableLogger.d(TAG, "FCM intent received" + intent);
33+
handlePushReceived(context, intent);
3134
} else if (intentAction.equals(ACTION_GCM_RECEIVE_INTENT)) {
35+
IterableLogger.d(TAG, "GCM intent received" + intent);
3236
handlePushReceived(context, intent);
3337
}
3438
}
3539

36-
/**
37-
* Handles the push registration data from the intent.
38-
* @param context
39-
* @param intent
40-
*/
41-
private void handlePushRegistration(Context context, Intent intent) {
42-
String iterableAppId = intent.getStringExtra(IterableConstants.PUSH_APP_ID);
43-
String projectNumber = intent.getStringExtra(IterableConstants.PUSH_GCM_PROJECT_NUMBER);
44-
boolean disablePush = intent.getBooleanExtra(IterableConstants.PUSH_DISABLE_AFTER_REGISTRATION, false);
45-
IterableGCMRegistrationData data = new IterableGCMRegistrationData(iterableAppId, projectNumber, disablePush);
46-
new IterablePushRegistrationGCM().execute(data);
47-
}
40+
// /**
41+
// * Handles the push registration data from the intent.
42+
// * @param context
43+
// * @param intent
44+
// */
45+
// private void handlePushRegistration(Context context, Intent intent) {
46+
// String iterableAppId = intent.getStringExtra(IterableConstants.PUSH_APP_ID);
47+
// String projectNumber = intent.getStringExtra(IterableConstants.PUSH_GCM_PROJECT_NUMBER);
48+
// boolean disablePush = intent.getBooleanExtra(IterableConstants.PUSH_DISABLE_AFTER_REGISTRATION, false);
49+
// String messagingPlatform = intent.getStringExtra(IterableConstants.MESSAGING_PUSH_SERVICE_PLATFORM);
50+
//
51+
//// IterablePushRegistrationData data = new IterablePushRegistrationData(iterableAppId, projectNumber, disablePush, messagingPlatform);
52+
//// new IterablePushRegistration().execute(data);
53+
// IterableApi sharedInstance = IterableApi.sharedInstance;
54+
// String token = sharedInstance.getDeviceToken(projectNumber, messagingPlatform);
55+
// sharedInstance.registerDeviceToken(iterableAppId, token);
56+
// }
4857

4958
/**
5059
* Handles receiving an incoming push notification from the intent.
@@ -55,6 +64,7 @@ private void handlePushReceived(Context context, Intent intent) {
5564
if (intent.hasExtra(IterableConstants.ITERABLE_DATA_KEY)) {
5665
Bundle extras = intent.getExtras();
5766
if (!IterableNotification.isGhostPush(extras)) {
67+
IterableLogger.d(TAG, "Iterable push received " + extras);
5868
Context appContext = context.getApplicationContext();
5969
PackageManager packageManager = appContext.getPackageManager();
6070
Intent packageIntent = packageManager.getLaunchIntentForPackage(appContext.getPackageName());
@@ -71,6 +81,8 @@ private void handlePushReceived(Context context, Intent intent) {
7181
appContext, intent.getExtras(), mainClass);
7282

7383
IterableNotification.postNotificationOnDevice(appContext, notificationBuilder);
84+
} else {
85+
IterableLogger.d(TAG, "Iterable ghost silent push received");
7486
}
7587
}
7688
}

0 commit comments

Comments
 (0)