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, }; }