diff --git a/android/build.gradle b/android/build.gradle index 794d5040..677bb996 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -32,13 +32,19 @@ android { lintOptions { disable 'InvalidPackage' } + if (project.android.hasProperty('namespace')) { + namespace 'com.example.flutter_segment' + } dependencies { - implementation 'com.segment.analytics.android:analytics:4.10.0' - implementation 'com.segment.analytics.android.integrations:amplitude:3.0.3' + implementation 'com.segment.analytics.android:analytics:4.10.4' + implementation 'com.segment.analytics.android.integrations:amplitude:3.1.0' + implementation 'com.segment.analytics.android.integrations:mixpanel:2.3.2' + implementation 'com.appsflyer:segment-android-integration:6.5.2' + implementation 'com.android.installreferrer:installreferrer:2.1' } } dependencies { testImplementation 'junit:junit:4.12' -} \ No newline at end of file +} diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 48d11960..13155f53 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,4 +1,6 @@ + + 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..3087461a 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 mixpanelIntegrationEnabled; + private final Boolean appsFlyerIntegrationEnabled; private final Boolean debug; - public FlutterSegmentOptions(String writeKey, Boolean trackApplicationLifecycleEvents, Boolean amplitudeIntegrationEnabled,Boolean debug) { + public FlutterSegmentOptions(String writeKey, Boolean trackApplicationLifecycleEvents, Boolean amplitudeIntegrationEnabled, Boolean mixpanelntegrationEnabled, Boolean appsFlyerIntegrationEnabled, Boolean debug) { this.writeKey = writeKey; this.trackApplicationLifecycleEvents = trackApplicationLifecycleEvents; this.amplitudeIntegrationEnabled = amplitudeIntegrationEnabled; + this.mixpanelIntegrationEnabled = mixpanelntegrationEnabled; + this.appsFlyerIntegrationEnabled = appsFlyerIntegrationEnabled; this.debug = debug; } @@ -29,6 +33,14 @@ public Boolean isAmplitudeIntegrationEnabled() { return amplitudeIntegrationEnabled; } + public Boolean isMixpanelIntegrationEnabled() { + return mixpanelIntegrationEnabled; + } + + public Boolean isAppsFlyerIntegrationEnabled() { + return appsFlyerIntegrationEnabled; + } + 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 isMixpanelIntegrationEnabled = bundle.getBoolean("com.claimsforce.segment.ENABLE_MIXPANEL_INTEGRATION", false); + Boolean isAppsFlyerIntegrationEnabled = bundle.getBoolean("com.claimsforce.segment.ENABLE_APPSFLYER_INTEGRATION", false); Boolean debug = bundle.getBoolean("com.claimsforce.segment.DEBUG", false); - return new FlutterSegmentOptions(writeKey, trackApplicationLifecycleEvents, isAmplitudeIntegrationEnabled, debug); + return new FlutterSegmentOptions(writeKey, trackApplicationLifecycleEvents, isAmplitudeIntegrationEnabled, isMixpanelIntegrationEnabled, isAppsFlyerIntegrationEnabled, 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 isMixpanelIntegrationEnabled = orFalse((Boolean) options.get("mixpanelIntegrationEnabled")); + Boolean isAppsFlyerIntegrationEnabled = orFalse((Boolean) options.get("appsFlyerIntegrationEnabled")); Boolean debug = orFalse((Boolean) options.get("debug")); - return new FlutterSegmentOptions(writeKey, trackApplicationLifecycleEvents, isAmplitudeIntegrationEnabled, debug); + return new FlutterSegmentOptions(writeKey, trackApplicationLifecycleEvents, isAmplitudeIntegrationEnabled, isMixpanelIntegrationEnabled, isAppsFlyerIntegrationEnabled, 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..af7c5e0f 100644 --- a/android/src/main/java/com/example/flutter_segment/FlutterSegmentPlugin.java +++ b/android/src/main/java/com/example/flutter_segment/FlutterSegmentPlugin.java @@ -15,6 +15,8 @@ import com.segment.analytics.Middleware; import com.segment.analytics.integrations.BasePayload; import com.segment.analytics.android.integrations.amplitude.AmplitudeIntegration; +import com.segment.analytics.android.integrations.mixpanel.MixpanelIntegration; +import com.segment.analytics.android.integrations.appsflyer.AppsflyerIntegration; import static com.segment.analytics.Analytics.LogLevel; import java.util.LinkedHashMap; @@ -86,6 +88,12 @@ private void setupChannels(FlutterSegmentOptions options) { if (options.isAmplitudeIntegrationEnabled()) { analyticsBuilder.use(AmplitudeIntegration.FACTORY); } + if (options.isMixpanelIntegrationEnabled()) { + analyticsBuilder.use(MixpanelIntegration.FACTORY); + } + if (options.isAppsFlyerIntegrationEnabled()) { + analyticsBuilder.use(AppsflyerIntegration.FACTORY); + } // Here we build a middleware that just appends data to the current context // using the [deepMerge] strategy. diff --git a/ios/Classes/FlutterSegmentPlugin.m b/ios/Classes/FlutterSegmentPlugin.m index b5aea645..d2d62e46 100644 --- a/ios/Classes/FlutterSegmentPlugin.m +++ b/ios/Classes/FlutterSegmentPlugin.m @@ -3,6 +3,8 @@ #import #import #import +#import +#import "SEGAppsFlyerIntegrationFactory.h" @implementation FlutterSegmentPlugin // Contents to be appended to the context @@ -347,6 +349,8 @@ + (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 isMixpanelIntegrationEnabled = [[dict objectForKey: @"com.claimsforce.segment.ENABLE_MIXPANEL_INTEGRATION"] boolValue]; + BOOL isAppsFlyerIntegrationEnabled = [[dict objectForKey: @"com.claimsforce.segment.ENABLE_APPSFLYER_INTEGRATION"] boolValue]; if(!writeKey) { return nil; } @@ -356,6 +360,12 @@ + (SEGAnalyticsConfiguration*)createConfigFromFile { if (isAmplitudeIntegrationEnabled) { [configuration use:[SEGAmplitudeIntegrationFactory instance]]; } + if (isMixpanelIntegrationEnabled) { + [configuration use:[SEGMixpanelIntegrationFactory instance]]; + } + if (isAppsFlyerIntegrationEnabled) { + [configuration use:[SEGAppsFlyerIntegrationFactory instance]]; + } return configuration; } @@ -364,12 +374,20 @@ + (SEGAnalyticsConfiguration*)createConfigFromDict:(NSDictionary*) dict { NSString *writeKey = [dict objectForKey: @"writeKey"]; BOOL trackApplicationLifecycleEvents = [[dict objectForKey: @"trackApplicationLifecycleEvents"] boolValue]; BOOL isAmplitudeIntegrationEnabled = [[dict objectForKey: @"amplitudeIntegrationEnabled"] boolValue]; + BOOL isMixpanelIntegrationEnabled = [[dict objectForKey: @"mixpanelIntegrationEnabled"] boolValue]; + BOOL isAppsFlyerIntegrationEnabled = [[dict objectForKey: @"appsFlyerIntegrationEnabled"] boolValue]; SEGAnalyticsConfiguration *configuration = [SEGAnalyticsConfiguration configurationWithWriteKey:writeKey]; configuration.trackApplicationLifecycleEvents = trackApplicationLifecycleEvents; if (isAmplitudeIntegrationEnabled) { [configuration use:[SEGAmplitudeIntegrationFactory instance]]; } + if (isMixpanelIntegrationEnabled) { + [configuration use:[SEGMixpanelIntegrationFactory instance]]; + } + if (isAppsFlyerIntegrationEnabled) { + [configuration use:[SEGAppsFlyerIntegrationFactory instance]]; + } return configuration; } diff --git a/ios/flutter_segment.podspec b/ios/flutter_segment.podspec index dd86f8d1..53dc2466 100644 --- a/ios/flutter_segment.podspec +++ b/ios/flutter_segment.podspec @@ -17,6 +17,8 @@ A new flutter plugin project. s.dependency 'Flutter' s.dependency 'Analytics', '4.1.6' s.dependency 'Segment-Amplitude', '3.3.2' + s.dependency 'Segment-Mixpanel', '1.7.2' + s.dependency 'segment-appsflyer-ios', '6.8.0' 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..a6e9502a 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.mixpanelIntegrationEnabled = false, + this.appsFlyerIntegrationEnabled = false, this.debug = false, }); final String writeKey; final bool trackApplicationLifecycleEvents; final bool amplitudeIntegrationEnabled; + final bool mixpanelIntegrationEnabled; + final bool appsFlyerIntegrationEnabled; final bool debug; Map toMap() { @@ -16,6 +20,8 @@ class SegmentConfig { 'writeKey': writeKey, 'trackApplicationLifecycleEvents': trackApplicationLifecycleEvents, 'amplitudeIntegrationEnabled': amplitudeIntegrationEnabled, + 'mixpanelIntegrationEnabled': mixpanelIntegrationEnabled, + 'appsFlyerIntegrationEnabled': appsFlyerIntegrationEnabled, 'debug': debug, }; }