From 0428f3c86b0241cf0d692a99fadde6870710d00e Mon Sep 17 00:00:00 2001 From: sozinov Date: Wed, 22 Jul 2026 12:00:28 +0300 Subject: [PATCH 1/2] MOBILE-284: support shouldIncludeVersionCode parameter for init --- .../mindbox_android/MindboxAndroidPlugin.kt | 2 + .../lib/src/types/configuration.dart | 7 +++ .../test/src/types/configuration_test.dart | 31 ++++++++++++ .../types/mindbox_method_handler_test.dart | 50 +++++++++++++++++++ 4 files changed, 90 insertions(+) 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..cf1ac5b 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 @@ -73,11 +73,13 @@ class MindboxAndroidPlugin : FlutterPlugin, MethodCallHandler, ActivityAware, Ne val subscribeIfCreated: Boolean = args["subscribeCustomerIfCreated"] as Boolean val shouldCreateCustomer: Boolean = args["shouldCreateCustomer"] as Boolean val operationsDomainArg: String = args["operationsDomain"] as? String ?: "" + val shouldIncludeVersionCode: Boolean = args["shouldIncludeVersionCode"] as? Boolean ?: true val config = MindboxConfiguration.Builder(context.applicationContext, domain, endpointId) .setPreviousDeviceUuid(previousDeviceUuid) .setPreviousInstallationId(previousInstallId) .subscribeCustomerIfCreated(subscribeIfCreated) .shouldCreateCustomer(shouldCreateCustomer) + .shouldIncludeVersionCode(shouldIncludeVersionCode) .operationsDomain(operationsDomainArg) .build() Mindbox.init(activity = context, config, listOf()) diff --git a/mindbox_platform_interface/lib/src/types/configuration.dart b/mindbox_platform_interface/lib/src/types/configuration.dart index 00fbe35..4a18b55 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 = true, }); /// Used for generating baseurl for REST. @@ -38,6 +39,11 @@ 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. Default is `true`. + final bool shouldIncludeVersionCode; + /// Returns map of parameters Map toMap() => { 'domain': domain, @@ -48,5 +54,6 @@ class Configuration { 'subscribeCustomerIfCreated': subscribeCustomerIfCreated, 'shouldCreateCustomer': shouldCreateCustomer, 'operationsDomain': operationsDomain, + '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..e15b1ae 100644 --- a/mindbox_platform_interface/test/src/types/configuration_test.dart +++ b/mindbox_platform_interface/test/src/types/configuration_test.dart @@ -56,4 +56,35 @@ void main() { expect(configuration.toMap()['operationsDomain'], ''); }); + + test('shouldIncludeVersionCode defaults to true when not provided', () { + final Configuration configuration = Configuration( + domain: 'domain', + endpointIos: 'iOSEndpoint', + endpointAndroid: 'androidEndpoint', + ); + + expect(configuration.shouldIncludeVersionCode, true); + }); + + 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 returns true shouldIncludeVersionCode when not provided', () { + final Configuration configuration = Configuration( + domain: 'domain', + endpointIos: 'iOSEndpoint', + endpointAndroid: 'androidEndpoint', + ); + + expect(configuration.toMap()['shouldIncludeVersionCode'], true); + }); } 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..4f98908 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,56 @@ 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() forwards true shouldIncludeVersionCode by default', + () 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'), isTrue); + expect(capturedArgs['shouldIncludeVersionCode'], true); + }, + ); + test( 'When config is invalid, init() calling should throws MindboxException', () async { From d9dd631dc07a7fc8a4eb09c7f261524af9f4ef0a Mon Sep 17 00:00:00 2001 From: sozinov Date: Wed, 22 Jul 2026 13:26:12 +0300 Subject: [PATCH 2/2] MOBILE-284: follow review --- .../mindbox_android/MindboxAndroidPlugin.kt | 6 ++++-- .../lib/src/types/configuration.dart | 12 ++++++++---- .../test/src/types/configuration_test.dart | 19 ++++++++++++++++--- .../types/mindbox_method_handler_test.dart | 5 ++--- 4 files changed, 30 insertions(+), 12 deletions(-) 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 cf1ac5b..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 @@ -73,14 +73,16 @@ class MindboxAndroidPlugin : FlutterPlugin, MethodCallHandler, ActivityAware, Ne val subscribeIfCreated: Boolean = args["subscribeCustomerIfCreated"] as Boolean val shouldCreateCustomer: Boolean = args["shouldCreateCustomer"] as Boolean val operationsDomainArg: String = args["operationsDomain"] as? String ?: "" - val shouldIncludeVersionCode: Boolean = args["shouldIncludeVersionCode"] as? Boolean ?: true val config = MindboxConfiguration.Builder(context.applicationContext, domain, endpointId) .setPreviousDeviceUuid(previousDeviceUuid) .setPreviousInstallationId(previousInstallId) .subscribeCustomerIfCreated(subscribeIfCreated) .shouldCreateCustomer(shouldCreateCustomer) - .shouldIncludeVersionCode(shouldIncludeVersionCode) .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 4a18b55..2941b7a 100644 --- a/mindbox_platform_interface/lib/src/types/configuration.dart +++ b/mindbox_platform_interface/lib/src/types/configuration.dart @@ -10,7 +10,7 @@ class Configuration { this.previousInstallationId = '', this.shouldCreateCustomer = true, this.operationsDomain = '', - this.shouldIncludeVersionCode = true, + this.shouldIncludeVersionCode, }); /// Used for generating baseurl for REST. @@ -41,8 +41,11 @@ class Configuration { /// 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. Default is `true`. - final bool shouldIncludeVersionCode; + /// 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() => { @@ -54,6 +57,7 @@ class Configuration { 'subscribeCustomerIfCreated': subscribeCustomerIfCreated, 'shouldCreateCustomer': shouldCreateCustomer, 'operationsDomain': operationsDomain, - 'shouldIncludeVersionCode': shouldIncludeVersionCode, + 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 e15b1ae..9efa8a0 100644 --- a/mindbox_platform_interface/test/src/types/configuration_test.dart +++ b/mindbox_platform_interface/test/src/types/configuration_test.dart @@ -57,14 +57,14 @@ void main() { expect(configuration.toMap()['operationsDomain'], ''); }); - test('shouldIncludeVersionCode defaults to true when not provided', () { + test('shouldIncludeVersionCode defaults to null when not provided', () { final Configuration configuration = Configuration( domain: 'domain', endpointIos: 'iOSEndpoint', endpointAndroid: 'androidEndpoint', ); - expect(configuration.shouldIncludeVersionCode, true); + expect(configuration.shouldIncludeVersionCode, isNull); }); test('toMap includes shouldIncludeVersionCode when set to false', () { @@ -78,13 +78,26 @@ void main() { expect(configuration.toMap()['shouldIncludeVersionCode'], false); }); - test('toMap returns true shouldIncludeVersionCode when not provided', () { + 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 4f98908..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 @@ -126,7 +126,7 @@ void main() { ); test( - 'init() forwards true shouldIncludeVersionCode by default', + 'init() does not forward shouldIncludeVersionCode when not provided', () async { final capturedArgs = {}; TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger @@ -145,8 +145,7 @@ void main() { ), ); - expect(capturedArgs.containsKey('shouldIncludeVersionCode'), isTrue); - expect(capturedArgs['shouldIncludeVersionCode'], true); + expect(capturedArgs.containsKey('shouldIncludeVersionCode'), isFalse); }, );