diff --git a/android-core/src/main/java/com/mparticle/internal/PushRegistrationHelper.java b/android-core/src/main/java/com/mparticle/internal/PushRegistrationHelper.java deleted file mode 100644 index 6403201fc..000000000 --- a/android-core/src/main/java/com/mparticle/internal/PushRegistrationHelper.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.mparticle.internal; - -import android.content.Context; -import android.os.Looper; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.mparticle.MParticle; - -public class PushRegistrationHelper { - - public static PushRegistration getLatestPushRegistration(Context context) { - return ConfigManager.getInstance(context).getPushRegistration(); - } - - public static void requestInstanceId(Context context) { - requestInstanceId(context, ConfigManager.getInstance(context).getPushSenderId()); - } - - public static void requestInstanceId(final Context context, final String senderId) { - if (!ConfigManager.getInstance(context).isPushRegistrationFetched() && MPUtility.isFirebaseAvailable()) { - final Runnable instanceRunnable = new Runnable() { - @Override - public void run() { - try { - if (MPUtility.isFirebaseAvailablePreV21()) { - Class clazz = Class.forName("com.google.firebase.iid.FirebaseInstanceId"); - Object instance = clazz.getMethod("getInstance").invoke(null); - String instanceId = (String) clazz.getMethod("getToken", String.class, String.class).invoke(instance, senderId, "FCM"); - setPushRegistration(context, instanceId, senderId); - } else if (MPUtility.isFirebaseAvailablePostV21()) { - com.google.firebase.messaging.FirebaseMessaging.getInstance().getToken() - .addOnSuccessListener(new OnSuccessListener() { - @Override - public void onSuccess(String instanceId) { - setPushRegistration(context, instanceId, senderId); - } - }) - .addOnFailureListener(new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - Logger.error("Error registering for FCM Instance ID: ", e.getMessage()); - } - }); - } else { - Logger.error("Error registering FCM Instance ID: no Firebase library"); - } - } catch (Exception ex) { - Logger.error("Error registering for FCM Instance ID: ", ex.getMessage()); - } - } - }; - if (Looper.getMainLooper() == Looper.myLooper()) { - new Thread(instanceRunnable).start(); - } else { - instanceRunnable.run(); - } - } - } - - - static void setPushRegistration(Context context, String instanceId, String senderId) { - if (!MPUtility.isEmpty(instanceId)) { - MParticle mParticle = MParticle.getInstance(); - ConfigManager configManager = ConfigManager.getInstance(context); - configManager.setPushRegistrationFetched(); - PushRegistration newPushRegistration = new PushRegistration(instanceId, senderId); - PushRegistration pushRegistration = configManager.getPushRegistration(); - //If this new push registration matches the existing persisted value we can will defer logging it until a new Session starts - - if (mParticle == null || (mParticle.getCurrentSession() == null && newPushRegistration.equals(pushRegistration))) { - //If the SDK isn't started, OR if a Session hasn't started and this is a duplicate push registration, - // log the push notification as a background push in the ConfigManager and we will send a IdentityApi.modify() call when it starts up. - ConfigManager.getInstance(context).setPushRegistrationInBackground(new PushRegistration(instanceId, senderId)); - } else { - mParticle.logPushRegistration(instanceId, senderId); - } - } - } - - public static class PushRegistration { - @Nullable - public String senderId; - @Nullable - public String instanceId; - - public PushRegistration(@Nullable String instanceId, @Nullable String senderId) { - this.instanceId = instanceId; - this.senderId = senderId; - } - - @Override - @NonNull - public String toString() { - return "[" + (senderId == null ? "null" : senderId) + ", " + (instanceId == null ? "null" : instanceId) + "]"; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || !(o instanceof PushRegistration)) { - return false; - } - PushRegistration other = (PushRegistration) o; - return (senderId == other.senderId || (senderId != null && senderId.equals(other.senderId))) && - (instanceId == other.instanceId || (instanceId != null && instanceId.equals(other.instanceId))); - } - } -} diff --git a/android-core/src/main/java/com/mparticle/internal/PushRegistrationHelper.kt b/android-core/src/main/java/com/mparticle/internal/PushRegistrationHelper.kt new file mode 100644 index 000000000..026f3ef44 --- /dev/null +++ b/android-core/src/main/java/com/mparticle/internal/PushRegistrationHelper.kt @@ -0,0 +1,95 @@ +package com.mparticle.internal + +import android.content.Context +import android.os.Looper +import com.google.firebase.messaging.FirebaseMessaging +import com.mparticle.MParticle +import com.mparticle.internal.MPUtility.isEmpty +import com.mparticle.internal.MPUtility.isFirebaseAvailable +import com.mparticle.internal.MPUtility.isFirebaseAvailablePostV21 +import com.mparticle.internal.MPUtility.isFirebaseAvailablePreV21 + +object PushRegistrationHelper { + fun getLatestPushRegistration(context: Context): PushRegistration { + return ConfigManager.getInstance(context).pushRegistration + } + + @JvmStatic + @JvmOverloads + fun requestInstanceId(context: Context, senderId: String = ConfigManager.getInstance(context).pushSenderId) { + if (!ConfigManager.getInstance(context).isPushRegistrationFetched && isFirebaseAvailable) { + val instanceRunnable = Runnable { + try { + if (isFirebaseAvailablePreV21) { + val clazz = Class.forName("com.google.firebase.iid.FirebaseInstanceId") + val instance = clazz.getMethod("getInstance").invoke(null) + val instanceId = clazz.getMethod("getToken", String::class.java, String::class.java) + .invoke(instance, senderId, "FCM") as String + setPushRegistration(context, instanceId, senderId) + } else if (isFirebaseAvailablePostV21) { + FirebaseMessaging.getInstance().token + .addOnSuccessListener { instanceId -> + setPushRegistration( + context, + instanceId, + senderId + ) + } + .addOnFailureListener { e -> + Logger.error( + "Error registering for FCM Instance ID: ", + e.message + ) + } + } else { + Logger.error("Error registering FCM Instance ID: no Firebase library") + } + } catch (ex: Exception) { + Logger.error("Error registering for FCM Instance ID: ", ex.message) + } + } + if (Looper.getMainLooper() == Looper.myLooper()) { + Thread(instanceRunnable).start() + } else { + instanceRunnable.run() + } + } + } + + @JvmStatic + fun setPushRegistration(context: Context, instanceId: String, senderId: String) { + if (!isEmpty(instanceId)) { + val mParticle = MParticle.getInstance() + val configManager = ConfigManager.getInstance(context) + configManager.setPushRegistrationFetched() + val newPushRegistration = PushRegistration(instanceId, senderId) + val pushRegistration = configManager.pushRegistration + + // If this new push registration matches the existing persisted value we can will defer logging it until a new Session starts + if (mParticle == null || (mParticle.currentSession == null && newPushRegistration == pushRegistration)) { + // If the SDK isn't started, OR if a Session hasn't started and this is a duplicate push registration, + // log the push notification as a background push in the ConfigManager and we will send a IdentityApi.modify() call when it starts up. + ConfigManager.getInstance(context).setPushRegistrationInBackground(PushRegistration(instanceId, senderId)) + } else { + mParticle.logPushRegistration(instanceId, senderId) + } + } + } + + class PushRegistration(@JvmField var instanceId: String?, @JvmField var senderId: String?) { + override fun toString(): String { + return "[" + (if (senderId == null) "null" else senderId) + ", " + (if (instanceId == null) "null" else instanceId) + "]" + } + + override fun equals(o: Any?): Boolean { + if (this === o) { + return true + } + if (o == null || o !is PushRegistration) { + return false + } + val other = o + return (senderId == other.senderId && instanceId == other.instanceId) + } + } +} diff --git a/android-core/src/main/java/com/mparticle/internal/ReportingManager.java b/android-core/src/main/java/com/mparticle/internal/ReportingManager.java deleted file mode 100644 index 6c60800df..000000000 --- a/android-core/src/main/java/com/mparticle/internal/ReportingManager.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.mparticle.internal; - -import java.util.List; - - -public interface ReportingManager { - void log(JsonReportingMessage message); - - void logAll(List messageList); -} diff --git a/android-core/src/main/java/com/mparticle/internal/ReportingManager.kt b/android-core/src/main/java/com/mparticle/internal/ReportingManager.kt new file mode 100644 index 000000000..eb7c05e13 --- /dev/null +++ b/android-core/src/main/java/com/mparticle/internal/ReportingManager.kt @@ -0,0 +1,7 @@ +package com.mparticle.internal + +interface ReportingManager { + fun log(message: JsonReportingMessage) + + fun logAll(messageList: List) +}