diff --git a/mindbox_android/android/src/main/kotlin/cloud/mindbox/mindbox_android/MindboxAndroidPlugin.kt b/mindbox_android/android/src/main/kotlin/cloud/mindbox/mindbox_android/MindboxAndroidPlugin.kt index e587c8b..bb96a16 100644 --- a/mindbox_android/android/src/main/kotlin/cloud/mindbox/mindbox_android/MindboxAndroidPlugin.kt +++ b/mindbox_android/android/src/main/kotlin/cloud/mindbox/mindbox_android/MindboxAndroidPlugin.kt @@ -79,6 +79,10 @@ class MindboxAndroidPlugin : FlutterPlugin, MethodCallHandler, ActivityAware, Ne .subscribeCustomerIfCreated(subscribeIfCreated) .shouldCreateCustomer(shouldCreateCustomer) .operationsDomain(operationsDomainArg) + .apply { + (args["shouldIncludeVersionCode"] as? Boolean) + ?.let { shouldIncludeVersionCode(it) } + } .build() Mindbox.init(activity = context, config, listOf()) result.success("initialized") diff --git a/mindbox_platform_interface/lib/src/types/configuration.dart b/mindbox_platform_interface/lib/src/types/configuration.dart index 00fbe35..2941b7a 100644 --- a/mindbox_platform_interface/lib/src/types/configuration.dart +++ b/mindbox_platform_interface/lib/src/types/configuration.dart @@ -10,6 +10,7 @@ class Configuration { this.previousInstallationId = '', this.shouldCreateCustomer = true, this.operationsDomain = '', + this.shouldIncludeVersionCode, }); /// Used for generating baseurl for REST. @@ -38,6 +39,14 @@ class Configuration { /// first initialisation. Default is `true`. final bool shouldCreateCustomer; + /// Specifies whether the app versionCode is included in the app version + /// reported to Mindbox. When `false`, only versionName is reported. + /// Android only, ignored on iOS. + /// + /// When not provided, the key is not sent to the native SDK and its + /// default is used (`true` — versionCode is reported). + final bool? shouldIncludeVersionCode; + /// Returns map of parameters Map toMap() => { 'domain': domain, @@ -48,5 +57,7 @@ class Configuration { 'subscribeCustomerIfCreated': subscribeCustomerIfCreated, 'shouldCreateCustomer': shouldCreateCustomer, 'operationsDomain': operationsDomain, + if (shouldIncludeVersionCode != null) + 'shouldIncludeVersionCode': shouldIncludeVersionCode, }; } diff --git a/mindbox_platform_interface/test/src/types/configuration_test.dart b/mindbox_platform_interface/test/src/types/configuration_test.dart index ee1576d..9efa8a0 100644 --- a/mindbox_platform_interface/test/src/types/configuration_test.dart +++ b/mindbox_platform_interface/test/src/types/configuration_test.dart @@ -56,4 +56,48 @@ void main() { expect(configuration.toMap()['operationsDomain'], ''); }); + + test('shouldIncludeVersionCode defaults to null when not provided', () { + final Configuration configuration = Configuration( + domain: 'domain', + endpointIos: 'iOSEndpoint', + endpointAndroid: 'androidEndpoint', + ); + + expect(configuration.shouldIncludeVersionCode, isNull); + }); + + test('toMap includes shouldIncludeVersionCode when set to false', () { + final Configuration configuration = Configuration( + domain: 'domain', + endpointIos: 'iOSEndpoint', + endpointAndroid: 'androidEndpoint', + shouldIncludeVersionCode: false, + ); + + expect(configuration.toMap()['shouldIncludeVersionCode'], false); + }); + + test('toMap includes shouldIncludeVersionCode when set to true', () { + final Configuration configuration = Configuration( + domain: 'domain', + endpointIos: 'iOSEndpoint', + endpointAndroid: 'androidEndpoint', + shouldIncludeVersionCode: true, + ); + + expect(configuration.toMap()['shouldIncludeVersionCode'], true); + }); + + test('toMap does not contain shouldIncludeVersionCode when not provided', + () { + final Configuration configuration = Configuration( + domain: 'domain', + endpointIos: 'iOSEndpoint', + endpointAndroid: 'androidEndpoint', + ); + + expect( + configuration.toMap().containsKey('shouldIncludeVersionCode'), false); + }); } diff --git a/mindbox_platform_interface/test/src/types/mindbox_method_handler_test.dart b/mindbox_platform_interface/test/src/types/mindbox_method_handler_test.dart index ed685e0..57c2e52 100644 --- a/mindbox_platform_interface/test/src/types/mindbox_method_handler_test.dart +++ b/mindbox_platform_interface/test/src/types/mindbox_method_handler_test.dart @@ -100,6 +100,55 @@ void main() { }, ); + test( + 'init() forwards shouldIncludeVersionCode to native channel when set', + () async { + final capturedArgs = {}; + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, (call) async { + if (call.method == 'init') { + capturedArgs.addAll(Map.from(call.arguments)); + } + return mindboxMockMethodCallHandler(call); + }); + + await handler.init( + configuration: Configuration( + domain: 'domain', + endpointIos: 'endpointIos', + endpointAndroid: 'endpointAndroid', + shouldIncludeVersionCode: false, + ), + ); + + expect(capturedArgs['shouldIncludeVersionCode'], false); + }, + ); + + test( + 'init() does not forward shouldIncludeVersionCode when not provided', + () async { + final capturedArgs = {}; + TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger + .setMockMethodCallHandler(channel, (call) async { + if (call.method == 'init') { + capturedArgs.addAll(Map.from(call.arguments)); + } + return mindboxMockMethodCallHandler(call); + }); + + await handler.init( + configuration: Configuration( + domain: 'domain', + endpointIos: 'endpointIos', + endpointAndroid: 'endpointAndroid', + ), + ); + + expect(capturedArgs.containsKey('shouldIncludeVersionCode'), isFalse); + }, + ); + test( 'When config is invalid, init() calling should throws MindboxException', () async {