diff --git a/.DS_Store b/.DS_Store
deleted file mode 100644
index 04bbfa63..00000000
Binary files a/.DS_Store and /dev/null differ
diff --git a/.gitignore b/.gitignore
index fa9f0b81..2b526274 100644
--- a/.gitignore
+++ b/.gitignore
@@ -594,3 +594,9 @@ healthchecksdb
MigrationBackup/
# End of https://www.gitignore.io/api/git,dart,flutter,intellij,webstorm,visualstudio
+
+# Not needed macOS generated files
+.DS_Store
+example/.DS_Store
+example/android/.DS_Store
+example/ios/.DS_Store
\ No newline at end of file
diff --git a/android/build.gradle b/android/build.gradle
index 794d5040..fcfa8534 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -34,7 +34,10 @@ android {
}
dependencies {
+ implementation 'com.webengage:android-segment:2.+'
+ implementation 'com.google.firebase:firebase-messaging:22.0.0'
implementation 'com.segment.analytics.android:analytics:4.10.0'
+ implementation 'com.clevertap.android:clevertap-segment-android:+'
implementation 'com.segment.analytics.android.integrations:amplitude:3.0.3'
}
}
diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml
index 48d11960..658e44e3 100644
--- a/android/src/main/AndroidManifest.xml
+++ b/android/src/main/AndroidManifest.xml
@@ -1,4 +1,43 @@
+
-
-
+ xmlns:tools="http://schemas.android.com/tools"
+ package="com.example.flutter_segment">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/src/main/java/com/example/flutter_segment/FlutterSegmentOptions.java b/android/src/main/java/com/example/flutter_segment/FlutterSegmentOptions.java
index 3b225b0d..d12c3d69 100644
--- a/android/src/main/java/com/example/flutter_segment/FlutterSegmentOptions.java
+++ b/android/src/main/java/com/example/flutter_segment/FlutterSegmentOptions.java
@@ -8,12 +8,16 @@ public class FlutterSegmentOptions {
private final String writeKey;
private final Boolean trackApplicationLifecycleEvents;
private final Boolean amplitudeIntegrationEnabled;
+ private final Boolean webEngageIntegrationEnabled;
+ private final Boolean cleverTapIntegrationEnabled;
private final Boolean debug;
- public FlutterSegmentOptions(String writeKey, Boolean trackApplicationLifecycleEvents, Boolean amplitudeIntegrationEnabled,Boolean debug) {
+ public FlutterSegmentOptions(String writeKey, Boolean trackApplicationLifecycleEvents, Boolean amplitudeIntegrationEnabled, Boolean webEngageIntegrationEnabled, Boolean cleverTapIntegrationEnabled, Boolean debug) {
this.writeKey = writeKey;
this.trackApplicationLifecycleEvents = trackApplicationLifecycleEvents;
this.amplitudeIntegrationEnabled = amplitudeIntegrationEnabled;
+ this.webEngageIntegrationEnabled = webEngageIntegrationEnabled;
+ this.cleverTapIntegrationEnabled = cleverTapIntegrationEnabled;
this.debug = debug;
}
@@ -29,6 +33,14 @@ public Boolean isAmplitudeIntegrationEnabled() {
return amplitudeIntegrationEnabled;
}
+ public Boolean isWebEngageIntegrationEnabled() {
+ return webEngageIntegrationEnabled;
+ }
+
+ public Boolean isCleverTapIntegrationEnabled() {
+ return cleverTapIntegrationEnabled;
+ }
+
public Boolean getDebug() {
return debug;
}
@@ -37,16 +49,20 @@ static FlutterSegmentOptions create(Bundle bundle) {
String writeKey = bundle.getString("com.claimsforce.segment.WRITE_KEY");
Boolean trackApplicationLifecycleEvents = bundle.getBoolean("com.claimsforce.segment.TRACK_APPLICATION_LIFECYCLE_EVENTS");
Boolean isAmplitudeIntegrationEnabled = bundle.getBoolean("com.claimsforce.segment.ENABLE_AMPLITUDE_INTEGRATION", false);
+ Boolean isWebEngageIntegrationEnabled = bundle.getBoolean("com.claimsforce.segment.ENABLE_WEBENGAGE_INTEGRATION", false);
+ Boolean isCleverTapIntegrationEnabled = bundle.getBoolean("com.claimsforce.segment.ENABLE_CLEVERTAP_INTEGRATION", false);
Boolean debug = bundle.getBoolean("com.claimsforce.segment.DEBUG", false);
- return new FlutterSegmentOptions(writeKey, trackApplicationLifecycleEvents, isAmplitudeIntegrationEnabled, debug);
+ return new FlutterSegmentOptions(writeKey, trackApplicationLifecycleEvents, isAmplitudeIntegrationEnabled, isWebEngageIntegrationEnabled, isCleverTapIntegrationEnabled, debug);
}
static FlutterSegmentOptions create(HashMap options) {
String writeKey = (String) options.get("writeKey");
Boolean trackApplicationLifecycleEvents = (Boolean) options.get("trackApplicationLifecycleEvents");
Boolean isAmplitudeIntegrationEnabled = orFalse((Boolean) options.get("amplitudeIntegrationEnabled"));
+ Boolean isWebEngageIntegrationEnabled = orFalse((Boolean) options.get("webEngageIntegrationEnabled"));
+ Boolean isCleverTapIntegrationEnabled = orFalse((Boolean) options.get("cleverTapIntegrationEnabled"));
Boolean debug = orFalse((Boolean) options.get("debug"));
- return new FlutterSegmentOptions(writeKey, trackApplicationLifecycleEvents, isAmplitudeIntegrationEnabled, debug);
+ return new FlutterSegmentOptions(writeKey, trackApplicationLifecycleEvents, isAmplitudeIntegrationEnabled, isWebEngageIntegrationEnabled, isCleverTapIntegrationEnabled, debug);
}
private static Boolean orFalse(Boolean value) {
diff --git a/android/src/main/java/com/example/flutter_segment/FlutterSegmentPlugin.java b/android/src/main/java/com/example/flutter_segment/FlutterSegmentPlugin.java
index 547e21e4..ce12db65 100644
--- a/android/src/main/java/com/example/flutter_segment/FlutterSegmentPlugin.java
+++ b/android/src/main/java/com/example/flutter_segment/FlutterSegmentPlugin.java
@@ -16,6 +16,9 @@
import com.segment.analytics.integrations.BasePayload;
import com.segment.analytics.android.integrations.amplitude.AmplitudeIntegration;
import static com.segment.analytics.Analytics.LogLevel;
+import com.segment.analytics.android.integrations.clevertap.CleverTapIntegration;
+import com.webengage.sdk.android.integrations.segment.WebEngageIntegration;
+import com.webengage.sdk.android.WebEngageConfig;
import java.util.LinkedHashMap;
import java.util.HashMap;
@@ -87,6 +90,17 @@ private void setupChannels(FlutterSegmentOptions options) {
analyticsBuilder.use(AmplitudeIntegration.FACTORY);
}
+ if (options.isWebEngageIntegrationEnabled()) {
+ WebEngageConfig webEngageConfig = new WebEngageConfig.Builder()
+ .setDebugMode(true)
+ .build();
+ analyticsBuilder.use(WebEngageIntegration.FACTORY.withWebEngageConfig(webEngageConfig));
+ }
+
+ if (options.isCleverTapIntegrationEnabled()) {
+ analyticsBuilder.use(CleverTapIntegration.FACTORY);
+ }
+
// Here we build a middleware that just appends data to the current context
// using the [deepMerge] strategy.
analyticsBuilder.middleware(
diff --git a/android/src/main/java/com/example/flutter_segment/MyApplication.java b/android/src/main/java/com/example/flutter_segment/MyApplication.java
new file mode 100644
index 00000000..8fdc79af
--- /dev/null
+++ b/android/src/main/java/com/example/flutter_segment/MyApplication.java
@@ -0,0 +1,28 @@
+package com.example.flutter_segment;
+import android.app.Application;
+
+import androidx.annotation.NonNull;
+
+import com.webengage.sdk.android.WebEngage;
+import com.google.android.gms.tasks.OnCompleteListener;
+import com.google.android.gms.tasks.Task;
+import com.google.firebase.messaging.FirebaseMessaging;
+
+public class MyApplication extends Application {
+ @Override
+ public void onCreate() {
+ super.onCreate();
+
+ FirebaseMessaging.getInstance().getToken().addOnCompleteListener(new OnCompleteListener() {
+ @Override
+ public void onComplete(@NonNull Task task) {
+ try {
+ String token = task.getResult();
+ WebEngage.get().setRegistrationID(token);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ }
+}
\ No newline at end of file
diff --git a/android/src/main/java/com/example/flutter_segment/MyFirebaseMessagingService.java b/android/src/main/java/com/example/flutter_segment/MyFirebaseMessagingService.java
new file mode 100644
index 00000000..54d9097b
--- /dev/null
+++ b/android/src/main/java/com/example/flutter_segment/MyFirebaseMessagingService.java
@@ -0,0 +1,23 @@
+package com.example.flutter_segment;
+
+import android.util.Log;
+
+import com.google.firebase.messaging.FirebaseMessagingService;
+import com.google.firebase.messaging.RemoteMessage;
+
+import com.webengage.sdk.android.WebEngage;
+
+import java.util.Map;
+
+public class MyFirebaseMessagingService extends FirebaseMessagingService {
+ @Override
+ public void onNewToken(String s) {
+ super.onNewToken(s);
+ WebEngage.get().setRegistrationID(s);
+ }
+
+ @Override
+ public void onMessageReceived(RemoteMessage remoteMessage) {
+ // Not needed already handling in MessagingReceiver
+ }
+}
\ No newline at end of file
diff --git a/android/src/main/java/com/example/flutter_segment/WebEngageFirebaseMessagingReceiver.java b/android/src/main/java/com/example/flutter_segment/WebEngageFirebaseMessagingReceiver.java
new file mode 100644
index 00000000..523ddaaa
--- /dev/null
+++ b/android/src/main/java/com/example/flutter_segment/WebEngageFirebaseMessagingReceiver.java
@@ -0,0 +1,37 @@
+package com.example.flutter_segment;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+import com.google.firebase.messaging.RemoteMessage;
+import com.webengage.sdk.android.WebEngage;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class WebEngageFirebaseMessagingReceiver extends BroadcastReceiver {
+ private static final String TAG = "Tournafest-WebEngage";
+ static HashMap notifications = new HashMap<>();
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(TAG, "Webengage broadcast received for message");
+
+ if (intent.getExtras() == null) {
+ Log.d(
+ TAG,
+ "broadcast received but intent contained no extras to process RemoteMessage. Operation cancelled.");
+ return;
+ }
+
+ RemoteMessage remoteMessage = new RemoteMessage(intent.getExtras());
+ Map data = remoteMessage.getData();
+ if(data != null) {
+ if(data.containsKey("source") && "webengage".equals(data.get("source"))) {
+ WebEngage.get().receive(data);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/example/pubspec.lock b/example/pubspec.lock
index 5e07c384..bd22c5bb 100644
--- a/example/pubspec.lock
+++ b/example/pubspec.lock
@@ -68,7 +68,7 @@ packages:
path: ".."
relative: true
source: path
- version: "3.5.0"
+ version: "3.7.0"
flutter_test:
dependency: "direct dev"
description: flutter
diff --git a/ios/Classes/FlutterSegmentPlugin.m b/ios/Classes/FlutterSegmentPlugin.m
index b5aea645..560a97a4 100644
--- a/ios/Classes/FlutterSegmentPlugin.m
+++ b/ios/Classes/FlutterSegmentPlugin.m
@@ -2,6 +2,7 @@
#import
#import
#import
+#import
#import
@implementation FlutterSegmentPlugin
@@ -347,6 +348,7 @@ + (SEGAnalyticsConfiguration*)createConfigFromFile {
NSString *writeKey = [dict objectForKey: @"com.claimsforce.segment.WRITE_KEY"];
BOOL trackApplicationLifecycleEvents = [[dict objectForKey: @"com.claimsforce.segment.TRACK_APPLICATION_LIFECYCLE_EVENTS"] boolValue];
BOOL isAmplitudeIntegrationEnabled = [[dict objectForKey: @"com.claimsforce.segment.ENABLE_AMPLITUDE_INTEGRATION"] boolValue];
+ BOOL isWebEngageIntegrationEnabled = [[dict objectForKey: @"com.claimsforce.segment.ENABLE_WEBENGAGE_INTEGRATION"] boolValue];
if(!writeKey) {
return nil;
}
@@ -357,6 +359,10 @@ + (SEGAnalyticsConfiguration*)createConfigFromFile {
[configuration use:[SEGAmplitudeIntegrationFactory instance]];
}
+ if (isWebEngageIntegrationEnabled) {
+ [configuration use:[WEGSegmentIntegrationFactory instanceWithApplication:UIApplication.sharedApplication launchOptions:nil]];
+ }
+
return configuration;
}
@@ -364,6 +370,7 @@ + (SEGAnalyticsConfiguration*)createConfigFromDict:(NSDictionary*) dict {
NSString *writeKey = [dict objectForKey: @"writeKey"];
BOOL trackApplicationLifecycleEvents = [[dict objectForKey: @"trackApplicationLifecycleEvents"] boolValue];
BOOL isAmplitudeIntegrationEnabled = [[dict objectForKey: @"amplitudeIntegrationEnabled"] boolValue];
+ BOOL isWebEngageIntegrationEnabled = [[dict objectForKey: @"webEngageIntegrationEnabled"] boolValue];
SEGAnalyticsConfiguration *configuration = [SEGAnalyticsConfiguration configurationWithWriteKey:writeKey];
configuration.trackApplicationLifecycleEvents = trackApplicationLifecycleEvents;
@@ -371,6 +378,10 @@ + (SEGAnalyticsConfiguration*)createConfigFromDict:(NSDictionary*) dict {
[configuration use:[SEGAmplitudeIntegrationFactory instance]];
}
+ if (isWebEngageIntegrationEnabled) {
+ [configuration use:[WEGSegmentIntegrationFactory instanceWithApplication:UIApplication.sharedApplication launchOptions:nil]];
+ }
+
return configuration;
}
diff --git a/ios/flutter_segment.podspec b/ios/flutter_segment.podspec
index dd86f8d1..c49a4e08 100644
--- a/ios/flutter_segment.podspec
+++ b/ios/flutter_segment.podspec
@@ -17,6 +17,7 @@ A new flutter plugin project.
s.dependency 'Flutter'
s.dependency 'Analytics', '4.1.6'
s.dependency 'Segment-Amplitude', '3.3.2'
+ s.dependency 'Segment-WebEngage'
s.ios.deployment_target = '11.0'
# Added because Segment-Amplitude dependencies on iOS cause this error:
diff --git a/lib/src/segment_config.dart b/lib/src/segment_config.dart
index 906cda69..cfda6c19 100644
--- a/lib/src/segment_config.dart
+++ b/lib/src/segment_config.dart
@@ -3,12 +3,16 @@ class SegmentConfig {
required this.writeKey,
this.trackApplicationLifecycleEvents = false,
this.amplitudeIntegrationEnabled = false,
+ this.webEngageIntegrationEnabled = false,
+ this.cleverTapIntegrationEnabled = false,
this.debug = false,
});
final String writeKey;
final bool trackApplicationLifecycleEvents;
final bool amplitudeIntegrationEnabled;
+ final bool webEngageIntegrationEnabled;
+ final bool cleverTapIntegrationEnabled;
final bool debug;
Map toMap() {
@@ -16,6 +20,8 @@ class SegmentConfig {
'writeKey': writeKey,
'trackApplicationLifecycleEvents': trackApplicationLifecycleEvents,
'amplitudeIntegrationEnabled': amplitudeIntegrationEnabled,
+ 'webEngageIntegrationEnabled': webEngageIntegrationEnabled,
+ 'cleverTapIntegrationEnabled': cleverTapIntegrationEnabled,
'debug': debug,
};
}