From 4e88ddcaddd2ab7f8d0c6cf34646b6920145a05e Mon Sep 17 00:00:00 2001 From: "bruno.silva" Date: Tue, 14 Jul 2026 17:34:53 +0100 Subject: [PATCH 1/3] Add BannerInitCustomization support (init-time and show-time) Exposes bannerCustomization (init-time, on UsercentricsOptions) and initCustomization (show-time, on BannerSettings) so Flutter apps can apply the same predefined-banner style overrides already available on native Android/iOS, matching CPD-109/MSDK-4161/4167-4170. Co-Authored-By: Claude Sonnet 5 --- .../BannerInitCustomizationSerializer.kt | 43 ++++ .../serializer/BannerSettingsSerializer.kt | 4 +- .../flutter/serializer/OptionsSerializer.kt | 4 + .../Bridge/ShowFirstLayerBridgeTest.swift | 15 ++ example/test/fake_usercentrics.dart | 2 + .../BannerInitCustomizationSerializer.swift | 71 +++++++ .../Serializer/BannerSettingsSerializer.swift | 4 +- .../InitializeOptionsSerializer.swift | 6 +- .../internal/bridge/initialize_bridge.dart | 4 + .../platform/method_channel_usercentrics.dart | 4 +- .../banner_init_customization_serializer.dart | 48 +++++ .../banner_settings_serializer.dart | 4 + .../initialize_options_serializer.dart | 6 + lib/src/internal/serializer/serializer.dart | 1 + lib/src/model/banner_init_customization.dart | 196 ++++++++++++++++++ lib/src/model/banner_settings.dart | 19 +- lib/src/model/model.dart | 1 + lib/src/platform/usercentrics_platform.dart | 1 + lib/src/usercentrics.dart | 9 +- .../bridge/fake_initialize_bridge.dart | 4 + .../bridge/initialize_bridge_test.dart | 42 +++- .../show_first_layer_bridge_test.mock.dart | 3 +- .../bridge/show_second_layer_bridge_test.dart | 2 + .../show_second_layer_bridge_test.mock.dart | 37 +++- test/platform/fake_usercentrics_platform.dart | 4 + 25 files changed, 522 insertions(+), 12 deletions(-) create mode 100644 android/src/main/kotlin/com/usercentrics/sdk/flutter/serializer/BannerInitCustomizationSerializer.kt create mode 100644 ios/Classes/Serializer/BannerInitCustomizationSerializer.swift create mode 100644 lib/src/internal/serializer/banner_init_customization_serializer.dart create mode 100644 lib/src/model/banner_init_customization.dart diff --git a/android/src/main/kotlin/com/usercentrics/sdk/flutter/serializer/BannerInitCustomizationSerializer.kt b/android/src/main/kotlin/com/usercentrics/sdk/flutter/serializer/BannerInitCustomizationSerializer.kt new file mode 100644 index 00000000..34c1eb8d --- /dev/null +++ b/android/src/main/kotlin/com/usercentrics/sdk/flutter/serializer/BannerInitCustomizationSerializer.kt @@ -0,0 +1,43 @@ +@file:Suppress("DEPRECATION") + +package com.usercentrics.sdk.flutter.serializer + +import com.usercentrics.sdk.BannerInitCustomization +import com.usercentrics.sdk.PurposeListStyle + +internal fun Any?.deserializeBannerInitCustomization(): BannerInitCustomization? { + if (this !is Map<*, *>) { + return null + } + return BannerInitCustomization( + paddingTop = this["paddingTop"] as? Int, + paddingBottom = this["paddingBottom"] as? Int, + paddingStart = this["paddingStart"] as? Int, + paddingEnd = this["paddingEnd"] as? Int, + lineSpacingMultiplier = (this["lineSpacingMultiplier"] as? Double)?.toFloat(), + titleFontSize = this["titleFontSize"] as? Int, + bodyFontSize = this["bodyFontSize"] as? Int, + linkFontSize = this["linkFontSize"] as? Int, + titleFontBold = this["titleFontBold"] as? Boolean, + headerPaddingTop = this["headerPaddingTop"] as? Int, + headerPaddingSides = this["headerPaddingSides"] as? Int, + headerPaddingBetweenElements = this["headerPaddingBetweenElements"] as? Int, + buttonBorderColor = this["buttonBorderColor"] as? String, + buttonBorderWidth = this["buttonBorderWidth"] as? Int, + purposeListStyle = (this["purposeListStyle"] as? String)?.let { + PurposeListStyle.valueOf(it) + }, + stickyHeader = this["stickyHeader"] as? Boolean, + hideLanguageSwitcher = this["hideLanguageSwitcher"] as? Boolean, + buttonHeightDp = this["buttonHeightDp"] as? Int, + buttonHorizontalPaddingDp = this["buttonHorizontalPaddingDp"] as? Int, + buttonSpacingDp = this["buttonSpacingDp"] as? Int, + linkUnderline = this["linkUnderline"] as? Boolean, + showSecondLayerCloseButton = this["showSecondLayerCloseButton"] as? Boolean, + tabFontSize = this["tabFontSize"] as? Int, + tabActiveColor = this["tabActiveColor"] as? String, + denyAllButtonBackground = this["denyAllButtonBackground"] as? String, + acceptAllButtonBackground = this["acceptAllButtonBackground"] as? String, + linkColor = this["linkColor"] as? String, + ) +} diff --git a/android/src/main/kotlin/com/usercentrics/sdk/flutter/serializer/BannerSettingsSerializer.kt b/android/src/main/kotlin/com/usercentrics/sdk/flutter/serializer/BannerSettingsSerializer.kt index 071bea26..0681de79 100644 --- a/android/src/main/kotlin/com/usercentrics/sdk/flutter/serializer/BannerSettingsSerializer.kt +++ b/android/src/main/kotlin/com/usercentrics/sdk/flutter/serializer/BannerSettingsSerializer.kt @@ -4,6 +4,7 @@ import com.usercentrics.sdk.BannerSettings import com.usercentrics.sdk.flutter.api.FlutterActivityProvider import com.usercentrics.sdk.flutter.api.FlutterAssetsProvider +@Suppress("DEPRECATION") internal fun Any?.deserializeBannerSettings( assetsProvider: FlutterAssetsProvider, activityProvider: FlutterActivityProvider @@ -24,7 +25,8 @@ internal fun Any?.deserializeBannerSettings( assetsProvider, activityProvider ), - variantName = this["variantName"] as? String? + variantName = this["variantName"] as? String?, + initCustomization = this["initCustomization"].deserializeBannerInitCustomization() ) } diff --git a/android/src/main/kotlin/com/usercentrics/sdk/flutter/serializer/OptionsSerializer.kt b/android/src/main/kotlin/com/usercentrics/sdk/flutter/serializer/OptionsSerializer.kt index 620dc572..28876ce1 100644 --- a/android/src/main/kotlin/com/usercentrics/sdk/flutter/serializer/OptionsSerializer.kt +++ b/android/src/main/kotlin/com/usercentrics/sdk/flutter/serializer/OptionsSerializer.kt @@ -4,6 +4,7 @@ import com.usercentrics.sdk.UsercentricsOptions import com.usercentrics.sdk.models.common.NetworkMode import com.usercentrics.sdk.models.common.UsercentricsLoggerLevel +@Suppress("DEPRECATION") internal fun Any?.deserializeOptions(): UsercentricsOptions { this as Map<*, *> val options = UsercentricsOptions() @@ -34,5 +35,8 @@ internal fun Any?.deserializeOptions(): UsercentricsOptions { this["initTimeoutMillis"]?.let { options.initTimeoutMillis = (it as Int).toLong() } + this["bannerCustomization"]?.let { + options.bannerCustomization = it.deserializeBannerInitCustomization() + } return options } diff --git a/example/ios/RunnerTests/Bridge/ShowFirstLayerBridgeTest.swift b/example/ios/RunnerTests/Bridge/ShowFirstLayerBridgeTest.swift index de361bc0..4d61796a 100644 --- a/example/ios/RunnerTests/Bridge/ShowFirstLayerBridgeTest.swift +++ b/example/ios/RunnerTests/Bridge/ShowFirstLayerBridgeTest.swift @@ -4,6 +4,11 @@ import XCTest @testable import usercentrics_sdk import UsercentricsUI +private func intValue(_ value: KotlinInt?) -> Int? { + guard let value = value else { return nil } + return Int(value.intValue) +} + class ShowFirstLayerBridgeTest: XCTestCase, BaseBridgeTestProtocol { var bridgeName: String! = "showFirstLayer" @@ -74,6 +79,11 @@ class ShowFirstLayerBridgeTest: XCTestCase, BaseBridgeTestProtocol { XCTAssertEqual(self.bannerProxy.showFirstLayerBannerSettingsArg?.firstLayerStyleSettings?.layout, .popup(position: .center)) // TODO Assert style settings + let initCustomization = self.bannerProxy.showFirstLayerBannerSettingsArg?.initCustomization + XCTAssertEqual(initCustomization?.buttonBorderColor, "#004dcf") + XCTAssertEqual(intValue(initCustomization?.paddingTop), 16) + XCTAssertEqual(initCustomization?.purposeListStyle, .flat) + expectation.fulfill() } @@ -109,6 +119,11 @@ class ShowFirstLayerBridgeTest: XCTestCase, BaseBridgeTestProtocol { ], "generalStyleSettings": [ "links": "BOTH" + ], + "initCustomization": [ + "paddingTop": 16, + "buttonBorderColor": "#004dcf", + "purposeListStyle": "FLAT" ] ] ] diff --git a/example/test/fake_usercentrics.dart b/example/test/fake_usercentrics.dart index 67fc22e6..e63bd3a3 100644 --- a/example/test/fake_usercentrics.dart +++ b/example/test/fake_usercentrics.dart @@ -18,6 +18,8 @@ class FakeUsercentrics extends UsercentricsPlatform { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + // ignore: deprecated_member_use + BannerInitCustomization? bannerCustomization, }) { initializeCount++; } diff --git a/ios/Classes/Serializer/BannerInitCustomizationSerializer.swift b/ios/Classes/Serializer/BannerInitCustomizationSerializer.swift new file mode 100644 index 00000000..4bf5ba58 --- /dev/null +++ b/ios/Classes/Serializer/BannerInitCustomizationSerializer.swift @@ -0,0 +1,71 @@ +import Usercentrics + +private func kotlinInt(_ value: Any?) -> KotlinInt? { + guard let value = value as? Int else { return nil } + return KotlinInt(int: Int32(value)) +} + +private func kotlinFloat(_ value: Any?) -> KotlinFloat? { + guard let value = value as? Double else { return nil } + return KotlinFloat(float: Float(value)) +} + +private func kotlinBool(_ value: Any?) -> KotlinBoolean? { + guard let value = value as? Bool else { return nil } + return KotlinBoolean(bool: value) +} + +extension BannerInitCustomization { + static func from(value: Any?) -> BannerInitCustomization? { + guard let dict = value as? Dictionary else { return nil } + + var purposeListStyle: PurposeListStyle? + if let purposeListStyleString = dict["purposeListStyle"] as? String { + purposeListStyle = PurposeListStyle.initialize(from: purposeListStyleString) + } + + return BannerInitCustomization( + paddingTop: kotlinInt(dict["paddingTop"]), + paddingBottom: kotlinInt(dict["paddingBottom"]), + paddingStart: kotlinInt(dict["paddingStart"]), + paddingEnd: kotlinInt(dict["paddingEnd"]), + lineSpacingMultiplier: kotlinFloat(dict["lineSpacingMultiplier"]), + titleFontSize: kotlinInt(dict["titleFontSize"]), + bodyFontSize: kotlinInt(dict["bodyFontSize"]), + linkFontSize: kotlinInt(dict["linkFontSize"]), + titleFontBold: kotlinBool(dict["titleFontBold"]), + headerPaddingTop: kotlinInt(dict["headerPaddingTop"]), + headerPaddingSides: kotlinInt(dict["headerPaddingSides"]), + headerPaddingBetweenElements: kotlinInt(dict["headerPaddingBetweenElements"]), + buttonBorderColor: dict["buttonBorderColor"] as? String, + buttonBorderWidth: kotlinInt(dict["buttonBorderWidth"]), + purposeListStyle: purposeListStyle, + stickyHeader: kotlinBool(dict["stickyHeader"]), + hideLanguageSwitcher: kotlinBool(dict["hideLanguageSwitcher"]), + buttonHeightDp: kotlinInt(dict["buttonHeightDp"]), + buttonHorizontalPaddingDp: kotlinInt(dict["buttonHorizontalPaddingDp"]), + buttonSpacingDp: kotlinInt(dict["buttonSpacingDp"]), + linkUnderline: kotlinBool(dict["linkUnderline"]), + showSecondLayerCloseButton: kotlinBool(dict["showSecondLayerCloseButton"]), + tabFontSize: kotlinInt(dict["tabFontSize"]), + tabActiveColor: dict["tabActiveColor"] as? String, + denyAllButtonBackground: dict["denyAllButtonBackground"] as? String, + acceptAllButtonBackground: dict["acceptAllButtonBackground"] as? String, + linkColor: dict["linkColor"] as? String + ) + } +} + +extension PurposeListStyle { + static func initialize(from value: String) -> PurposeListStyle? { + switch value { + case "BOXED": + return PurposeListStyle.boxed + case "FLAT": + return PurposeListStyle.flat + default: + assert(false) + return nil + } + } +} diff --git a/ios/Classes/Serializer/BannerSettingsSerializer.swift b/ios/Classes/Serializer/BannerSettingsSerializer.swift index 5d1420a2..cc8a0d05 100644 --- a/ios/Classes/Serializer/BannerSettingsSerializer.swift +++ b/ios/Classes/Serializer/BannerSettingsSerializer.swift @@ -1,3 +1,4 @@ +import Usercentrics import UsercentricsUI extension BannerSettings { @@ -27,6 +28,7 @@ extension BannerSettings { self.init(generalStyleSettings: generalStyleSettings, firstLayerStyleSettings: firstLayerSettings, secondLayerStyleSettings: secondLayerSettings, - variantName: dict["variantName"] as? String) + variantName: dict["variantName"] as? String, + initCustomization: BannerInitCustomization.from(value: dict["initCustomization"])) } } diff --git a/ios/Classes/Serializer/InitializeOptionsSerializer.swift b/ios/Classes/Serializer/InitializeOptionsSerializer.swift index ae68dc1f..cd73d307 100644 --- a/ios/Classes/Serializer/InitializeOptionsSerializer.swift +++ b/ios/Classes/Serializer/InitializeOptionsSerializer.swift @@ -48,7 +48,11 @@ extension UsercentricsOptions { options.consentMediation = consentMediation } + if let bannerCustomization = BannerInitCustomization.from(value: dict["bannerCustomization"]) { + options.bannerCustomization = bannerCustomization + } + return options } - + } diff --git a/lib/src/internal/bridge/initialize_bridge.dart b/lib/src/internal/bridge/initialize_bridge.dart index 461ba354..f60faf06 100644 --- a/lib/src/internal/bridge/initialize_bridge.dart +++ b/lib/src/internal/bridge/initialize_bridge.dart @@ -1,5 +1,6 @@ import 'package:flutter/services.dart'; import 'package:usercentrics_sdk/src/internal/serializer/initialize_options_serializer.dart'; +import 'package:usercentrics_sdk/src/model/banner_init_customization.dart'; import 'package:usercentrics_sdk/src/model/logger_level.dart'; import 'package:usercentrics_sdk/src/model/network_mode.dart'; @@ -17,6 +18,7 @@ abstract class InitializeBridge { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + BannerInitCustomization? bannerCustomization, }); } @@ -37,6 +39,7 @@ class MethodChannelInitialize extends InitializeBridge { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + BannerInitCustomization? bannerCustomization, }) { final arguments = InitializeOptionsSerializer.serialize( settingsId: settingsId, @@ -48,6 +51,7 @@ class MethodChannelInitialize extends InitializeBridge { networkMode: networkMode, consentMediation: consentMediation, initTimeoutMillis: initTimeoutMillis, + bannerCustomization: bannerCustomization, ); channel.invokeMethod(_name, arguments); } diff --git a/lib/src/internal/platform/method_channel_usercentrics.dart b/lib/src/internal/platform/method_channel_usercentrics.dart index c7c39993..46ade6a0 100644 --- a/lib/src/internal/platform/method_channel_usercentrics.dart +++ b/lib/src/internal/platform/method_channel_usercentrics.dart @@ -88,6 +88,7 @@ class MethodChannelUsercentrics extends UsercentricsPlatform { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + BannerInitCustomization? bannerCustomization, }) async { final ongoingInit = isReadyCompleter; @@ -113,7 +114,8 @@ class MethodChannelUsercentrics extends UsercentricsPlatform { version: version, networkMode: networkMode, consentMediation: consentMediation, - initTimeoutMillis: initTimeoutMillis); + initTimeoutMillis: initTimeoutMillis, + bannerCustomization: bannerCustomization); await status.then((value) => isReadyCompleter?.complete(null)); } catch (error, stackTrace) { diff --git a/lib/src/internal/serializer/banner_init_customization_serializer.dart b/lib/src/internal/serializer/banner_init_customization_serializer.dart new file mode 100644 index 00000000..cce1db4e --- /dev/null +++ b/lib/src/internal/serializer/banner_init_customization_serializer.dart @@ -0,0 +1,48 @@ +import 'package:usercentrics_sdk/src/model/banner_init_customization.dart'; + +class BannerInitCustomizationSerializer { + static dynamic serialize(BannerInitCustomization? value) => value == null + ? null + : { + 'paddingTop': value.paddingTop, + 'paddingBottom': value.paddingBottom, + 'paddingStart': value.paddingStart, + 'paddingEnd': value.paddingEnd, + 'lineSpacingMultiplier': value.lineSpacingMultiplier, + 'titleFontSize': value.titleFontSize, + 'bodyFontSize': value.bodyFontSize, + 'linkFontSize': value.linkFontSize, + 'titleFontBold': value.titleFontBold, + 'headerPaddingTop': value.headerPaddingTop, + 'headerPaddingSides': value.headerPaddingSides, + 'headerPaddingBetweenElements': value.headerPaddingBetweenElements, + 'buttonBorderColor': value.buttonBorderColor, + 'buttonBorderWidth': value.buttonBorderWidth, + 'purposeListStyle': _serializePurposeListStyle( + value.purposeListStyle, + ), + 'stickyHeader': value.stickyHeader, + 'hideLanguageSwitcher': value.hideLanguageSwitcher, + 'buttonHeightDp': value.buttonHeightDp, + 'buttonHorizontalPaddingDp': value.buttonHorizontalPaddingDp, + 'buttonSpacingDp': value.buttonSpacingDp, + 'linkUnderline': value.linkUnderline, + 'showSecondLayerCloseButton': value.showSecondLayerCloseButton, + 'tabFontSize': value.tabFontSize, + 'tabActiveColor': value.tabActiveColor, + 'denyAllButtonBackground': value.denyAllButtonBackground, + 'acceptAllButtonBackground': value.acceptAllButtonBackground, + 'linkColor': value.linkColor, + }; + + static dynamic _serializePurposeListStyle(PurposeListStyle? value) { + switch (value) { + case null: + return null; + case PurposeListStyle.boxed: + return 'BOXED'; + case PurposeListStyle.flat: + return 'FLAT'; + } + } +} diff --git a/lib/src/internal/serializer/banner_settings_serializer.dart b/lib/src/internal/serializer/banner_settings_serializer.dart index 349829de..29ff6f6a 100644 --- a/lib/src/internal/serializer/banner_settings_serializer.dart +++ b/lib/src/internal/serializer/banner_settings_serializer.dart @@ -13,5 +13,9 @@ class BannerSettingsSerializer { 'generalStyleSettings': GeneralStyleSettingsSerializer.serialize(settings?.general), 'variantName': settings?.variantName, + 'initCustomization': BannerInitCustomizationSerializer.serialize( + // ignore: deprecated_member_use_from_same_package + settings?.initCustomization, + ), }; } diff --git a/lib/src/internal/serializer/initialize_options_serializer.dart b/lib/src/internal/serializer/initialize_options_serializer.dart index ea983cb4..1292c20a 100644 --- a/lib/src/internal/serializer/initialize_options_serializer.dart +++ b/lib/src/internal/serializer/initialize_options_serializer.dart @@ -1,6 +1,8 @@ +import 'package:usercentrics_sdk/src/model/banner_init_customization.dart'; import 'package:usercentrics_sdk/src/model/logger_level.dart'; import 'package:usercentrics_sdk/src/model/network_mode.dart'; +import 'banner_init_customization_serializer.dart'; import 'logger_level_serializer.dart'; import 'network_mode_serializer.dart'; @@ -15,6 +17,7 @@ class InitializeOptionsSerializer { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + BannerInitCustomization? bannerCustomization, }) => { 'settingsId': settingsId, @@ -26,5 +29,8 @@ class InitializeOptionsSerializer { 'networkMode': NetworkModeSerializer.serialize(networkMode), 'consentMediation': consentMediation, 'initTimeoutMillis': initTimeoutMillis, + 'bannerCustomization': BannerInitCustomizationSerializer.serialize( + bannerCustomization, + ), }; } diff --git a/lib/src/internal/serializer/serializer.dart b/lib/src/internal/serializer/serializer.dart index fed87dd3..e3517504 100644 --- a/lib/src/internal/serializer/serializer.dart +++ b/lib/src/internal/serializer/serializer.dart @@ -1,5 +1,6 @@ export 'additional_consent_mode_data_serializer.dart'; export 'analytics_event_type_serializer.dart'; +export 'banner_init_customization_serializer.dart'; export 'banner_settings_serializer.dart'; export 'button_settings_serializer.dart'; export 'category_serializer.dart'; diff --git a/lib/src/model/banner_init_customization.dart b/lib/src/model/banner_init_customization.dart new file mode 100644 index 00000000..b10c0abc --- /dev/null +++ b/lib/src/model/banner_init_customization.dart @@ -0,0 +1,196 @@ +/// The purpose list display style. +enum PurposeListStyle { + /// The purposes are displayed inside individual boxed containers. + boxed, + + /// The purposes are displayed as a flat list, without boxed containers. + flat, +} + +/// Programmatic customization options for the predefined Banner UI. +/// +/// Every field is nullable. `null` means "inherit from the layer below" +/// (show-time > init-time > admin dashboard > SDK hardcoded default) — it +/// does not mean "reset to zero/empty/false". +@Deprecated( + 'BannerInitCustomization is deprecated and will be removed in a future release. Configure banner appearance via the Usercentrics dashboard instead.') +class BannerInitCustomization { + /// Creates a BannerInitCustomization. + const BannerInitCustomization({ + this.paddingTop, + this.paddingBottom, + this.paddingStart, + this.paddingEnd, + this.lineSpacingMultiplier, + this.titleFontSize, + this.bodyFontSize, + this.linkFontSize, + this.titleFontBold, + this.headerPaddingTop, + this.headerPaddingSides, + this.headerPaddingBetweenElements, + this.buttonBorderColor, + this.buttonBorderWidth, + this.purposeListStyle, + this.stickyHeader, + this.hideLanguageSwitcher, + this.buttonHeightDp, + this.buttonHorizontalPaddingDp, + this.buttonSpacingDp, + this.linkUnderline, + this.showSecondLayerCloseButton, + this.tabFontSize, + this.tabActiveColor, + this.denyAllButtonBackground, + this.acceptAllButtonBackground, + this.linkColor, + }); + + /// The top padding. + final int? paddingTop; + + /// The bottom padding. + final int? paddingBottom; + + /// The start padding. + final int? paddingStart; + + /// The end padding. + final int? paddingEnd; + + /// The line spacing multiplier. + final double? lineSpacingMultiplier; + + /// The title font size. + final int? titleFontSize; + + /// The body font size. + final int? bodyFontSize; + + /// The link font size. + final int? linkFontSize; + + /// Whether the title font is bold. + final bool? titleFontBold; + + /// The header top padding. + final int? headerPaddingTop; + + /// The header sides padding. + final int? headerPaddingSides; + + /// The header padding between elements. + final int? headerPaddingBetweenElements; + + /// The button border color, as a hex string, e.g. "#004dcf". + final String? buttonBorderColor; + + /// The button border width. + final int? buttonBorderWidth; + + /// The purpose list display style. + final PurposeListStyle? purposeListStyle; + + /// Whether the header should stick to the top when scrolling. + final bool? stickyHeader; + + /// Whether the language switcher should be hidden. + final bool? hideLanguageSwitcher; + + /// The button height. + final int? buttonHeightDp; + + /// The button horizontal padding. + final int? buttonHorizontalPaddingDp; + + /// The spacing between buttons. + final int? buttonSpacingDp; + + /// Whether links should be underlined. + final bool? linkUnderline; + + /// Whether the second layer close button should be shown. + final bool? showSecondLayerCloseButton; + + /// The tab font size. + final int? tabFontSize; + + /// The tab active color, as a hex string. + final String? tabActiveColor; + + /// The deny all button background color, as a hex string. + final String? denyAllButtonBackground; + + /// The accept all button background color, as a hex string. + final String? acceptAllButtonBackground; + + /// The link color, as a hex string. + final String? linkColor; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is BannerInitCustomization && + runtimeType == other.runtimeType && + paddingTop == other.paddingTop && + paddingBottom == other.paddingBottom && + paddingStart == other.paddingStart && + paddingEnd == other.paddingEnd && + lineSpacingMultiplier == other.lineSpacingMultiplier && + titleFontSize == other.titleFontSize && + bodyFontSize == other.bodyFontSize && + linkFontSize == other.linkFontSize && + titleFontBold == other.titleFontBold && + headerPaddingTop == other.headerPaddingTop && + headerPaddingSides == other.headerPaddingSides && + headerPaddingBetweenElements == other.headerPaddingBetweenElements && + buttonBorderColor == other.buttonBorderColor && + buttonBorderWidth == other.buttonBorderWidth && + purposeListStyle == other.purposeListStyle && + stickyHeader == other.stickyHeader && + hideLanguageSwitcher == other.hideLanguageSwitcher && + buttonHeightDp == other.buttonHeightDp && + buttonHorizontalPaddingDp == other.buttonHorizontalPaddingDp && + buttonSpacingDp == other.buttonSpacingDp && + linkUnderline == other.linkUnderline && + showSecondLayerCloseButton == other.showSecondLayerCloseButton && + tabFontSize == other.tabFontSize && + tabActiveColor == other.tabActiveColor && + denyAllButtonBackground == other.denyAllButtonBackground && + acceptAllButtonBackground == other.acceptAllButtonBackground && + linkColor == other.linkColor; + + @override + int get hashCode => + paddingTop.hashCode ^ + paddingBottom.hashCode ^ + paddingStart.hashCode ^ + paddingEnd.hashCode ^ + lineSpacingMultiplier.hashCode ^ + titleFontSize.hashCode ^ + bodyFontSize.hashCode ^ + linkFontSize.hashCode ^ + titleFontBold.hashCode ^ + headerPaddingTop.hashCode ^ + headerPaddingSides.hashCode ^ + headerPaddingBetweenElements.hashCode ^ + buttonBorderColor.hashCode ^ + buttonBorderWidth.hashCode ^ + purposeListStyle.hashCode ^ + stickyHeader.hashCode ^ + hideLanguageSwitcher.hashCode ^ + buttonHeightDp.hashCode ^ + buttonHorizontalPaddingDp.hashCode ^ + buttonSpacingDp.hashCode ^ + linkUnderline.hashCode ^ + showSecondLayerCloseButton.hashCode ^ + tabFontSize.hashCode ^ + tabActiveColor.hashCode ^ + denyAllButtonBackground.hashCode ^ + acceptAllButtonBackground.hashCode ^ + linkColor.hashCode; + + @override + String toString() => + 'BannerInitCustomization(paddingTop: $paddingTop, paddingBottom: $paddingBottom, paddingStart: $paddingStart, paddingEnd: $paddingEnd, lineSpacingMultiplier: $lineSpacingMultiplier, titleFontSize: $titleFontSize, bodyFontSize: $bodyFontSize, linkFontSize: $linkFontSize, titleFontBold: $titleFontBold, headerPaddingTop: $headerPaddingTop, headerPaddingSides: $headerPaddingSides, headerPaddingBetweenElements: $headerPaddingBetweenElements, buttonBorderColor: $buttonBorderColor, buttonBorderWidth: $buttonBorderWidth, purposeListStyle: $purposeListStyle, stickyHeader: $stickyHeader, hideLanguageSwitcher: $hideLanguageSwitcher, buttonHeightDp: $buttonHeightDp, buttonHorizontalPaddingDp: $buttonHorizontalPaddingDp, buttonSpacingDp: $buttonSpacingDp, linkUnderline: $linkUnderline, showSecondLayerCloseButton: $showSecondLayerCloseButton, tabFontSize: $tabFontSize, tabActiveColor: $tabActiveColor, denyAllButtonBackground: $denyAllButtonBackground, acceptAllButtonBackground: $acceptAllButtonBackground, linkColor: $linkColor)'; +} diff --git a/lib/src/model/banner_settings.dart b/lib/src/model/banner_settings.dart index 55898c92..d4c3d506 100644 --- a/lib/src/model/banner_settings.dart +++ b/lib/src/model/banner_settings.dart @@ -1,3 +1,4 @@ +import 'package:usercentrics_sdk/src/model/banner_init_customization.dart'; import 'package:usercentrics_sdk/src/model/first_layer_style_settings.dart'; import 'package:usercentrics_sdk/src/model/general_style_settings.dart'; import 'package:usercentrics_sdk/src/model/second_layer_style_settings.dart'; @@ -9,11 +10,13 @@ class BannerSettings { /// - The [firstLayer] that enables you to style the first layer programmatically. /// - The [secondLayer] that enables you to style the second layer programmatically. /// - The [variantName] enables you to set the banner variant for A/B testing. + /// - The [initCustomization] enables you to further customize the predefined Banner UI at show-time. const BannerSettings({ this.general, this.firstLayer, this.secondLayer, this.variantName, + this.initCustomization, }); /// The banner variant for A/B testing. @@ -28,6 +31,11 @@ class BannerSettings { /// The second layer style settings. final SecondLayerStyleSettings? secondLayer; + /// Further programmatic customization of the predefined Banner UI, applied at show-time. + @Deprecated( + 'BannerInitCustomization is deprecated and will be removed in a future release. Configure banner appearance via the Usercentrics dashboard instead.') + final BannerInitCustomization? initCustomization; + @override bool operator ==(Object other) => identical(this, other) || @@ -36,16 +44,21 @@ class BannerSettings { variantName == other.variantName && general == other.general && firstLayer == other.firstLayer && - secondLayer == other.secondLayer; + secondLayer == other.secondLayer && + // ignore: deprecated_member_use_from_same_package + initCustomization == other.initCustomization; @override int get hashCode => variantName.hashCode + general.hashCode + firstLayer.hashCode + - secondLayer.hashCode; + secondLayer.hashCode + + // ignore: deprecated_member_use_from_same_package + initCustomization.hashCode; @override String toString() => - "$BannerSettings(variantName: $variantName, general: $general, firstLayer: $firstLayer, secondLayer: $secondLayer)"; + // ignore: deprecated_member_use_from_same_package + "$BannerSettings(variantName: $variantName, general: $general, firstLayer: $firstLayer, secondLayer: $secondLayer, initCustomization: $initCustomization)"; } diff --git a/lib/src/model/model.dart b/lib/src/model/model.dart index 9d21ba60..95492052 100644 --- a/lib/src/model/model.dart +++ b/lib/src/model/model.dart @@ -2,6 +2,7 @@ export 'additional_consent_mode_data.dart'; export 'gpp_data.dart'; export 'gpp_section_change_payload.dart'; export 'analytics_event_type.dart'; +export 'banner_init_customization.dart'; export 'banner_settings.dart'; export 'button_settings.dart'; export 'category.dart'; diff --git a/lib/src/platform/usercentrics_platform.dart b/lib/src/platform/usercentrics_platform.dart index f614bee6..918356cc 100644 --- a/lib/src/platform/usercentrics_platform.dart +++ b/lib/src/platform/usercentrics_platform.dart @@ -16,6 +16,7 @@ abstract class UsercentricsPlatform { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + BannerInitCustomization? bannerCustomization, }); Future get status; diff --git a/lib/src/usercentrics.dart b/lib/src/usercentrics.dart index 10f6ae11..05668819 100644 --- a/lib/src/usercentrics.dart +++ b/lib/src/usercentrics.dart @@ -27,6 +27,8 @@ class Usercentrics { /// - The [networkMode] sets the network operation mode. Be careful, use this option only if we have confirmed that it is ready to use because it has a significant impact on the whole system's performance. The default value is "world". /// - The [consentMediation] enables the feature of consent mediation, this feature works with a set of selected SDKs that you can find in the documentation. /// - The [initTimeoutMillis] sets a timeout for the SDK to initialize. Minimum value is 5000ms. The default value is 10000ms. + /// - The [bannerCustomization] enables further programmatic customization of the predefined Banner UI, applied at init-time. + /// **Deprecated:** [bannerCustomization] is deprecated and will be removed in a future release. Configure banner appearance via the Usercentrics dashboard instead. static void initialize({ String settingsId = "", String ruleSetId = "", @@ -37,6 +39,9 @@ class Usercentrics { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + @Deprecated( + 'BannerInitCustomization is deprecated and will be removed in a future release. Configure banner appearance via the Usercentrics dashboard instead.') + BannerInitCustomization? bannerCustomization, }) => _delegate.initialize( settingsId: settingsId, @@ -47,7 +52,9 @@ class Usercentrics { version: version, networkMode: networkMode, consentMediation: consentMediation, - initTimeoutMillis: initTimeoutMillis); + initTimeoutMillis: initTimeoutMillis, + // ignore: deprecated_member_use_from_same_package + bannerCustomization: bannerCustomization); /// Get the [UsercentricsReadyStatus] to catch the consent status of the user. static Future get status => _delegate.status; diff --git a/test/internal/bridge/fake_initialize_bridge.dart b/test/internal/bridge/fake_initialize_bridge.dart index 3c6b206e..a0aa4604 100644 --- a/test/internal/bridge/fake_initialize_bridge.dart +++ b/test/internal/bridge/fake_initialize_bridge.dart @@ -1,5 +1,6 @@ import 'package:flutter/src/services/platform_channel.dart'; import 'package:usercentrics_sdk/src/internal/bridge/bridge.dart'; +import 'package:usercentrics_sdk/src/model/banner_init_customization.dart'; import 'package:usercentrics_sdk/src/model/logger_level.dart'; import 'package:usercentrics_sdk/src/model/network_mode.dart'; @@ -15,6 +16,7 @@ class FakeInitializeBridge extends InitializeBridge { NetworkMode? invokeNetworkModeArgument; bool? invokeConsentMediationArgument; int? invokeInitTimeoutMillisArgument; + BannerInitCustomization? invokeBannerCustomizationArgument; @override void invoke({ @@ -28,6 +30,7 @@ class FakeInitializeBridge extends InitializeBridge { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + BannerInitCustomization? bannerCustomization, }) { invokeCount++; invokeChannelArgument = channel; @@ -40,5 +43,6 @@ class FakeInitializeBridge extends InitializeBridge { invokeNetworkModeArgument = networkMode; invokeConsentMediationArgument = consentMediation; invokeInitTimeoutMillisArgument = initTimeoutMillis; + invokeBannerCustomizationArgument = bannerCustomization; } } diff --git a/test/internal/bridge/initialize_bridge_test.dart b/test/internal/bridge/initialize_bridge_test.dart index eb8e2884..492f4b6d 100644 --- a/test/internal/bridge/initialize_bridge_test.dart +++ b/test/internal/bridge/initialize_bridge_test.dart @@ -1,6 +1,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:usercentrics_sdk/src/internal/bridge/bridge.dart'; +import 'package:usercentrics_sdk/src/model/banner_init_customization.dart'; import 'package:usercentrics_sdk/src/model/logger_level.dart'; import 'package:usercentrics_sdk/src/model/network_mode.dart'; @@ -16,7 +17,36 @@ void main() { "timeoutMillis": 20000, "networkMode": "EU", 'consentMediation': true, - "initTimeoutMillis": 25000 + "initTimeoutMillis": 25000, + "bannerCustomization": { + 'paddingTop': 16, + 'paddingBottom': null, + 'paddingStart': null, + 'paddingEnd': null, + 'lineSpacingMultiplier': null, + 'titleFontSize': null, + 'bodyFontSize': null, + 'linkFontSize': null, + 'titleFontBold': null, + 'headerPaddingTop': null, + 'headerPaddingSides': null, + 'headerPaddingBetweenElements': null, + 'buttonBorderColor': '#004dcf', + 'buttonBorderWidth': null, + 'purposeListStyle': 'FLAT', + 'stickyHeader': null, + 'hideLanguageSwitcher': null, + 'buttonHeightDp': null, + 'buttonHorizontalPaddingDp': null, + 'buttonSpacingDp': null, + 'linkUnderline': null, + 'showSecondLayerCloseButton': null, + 'tabFontSize': null, + 'tabActiveColor': null, + 'denyAllButtonBackground': null, + 'acceptAllButtonBackground': null, + 'linkColor': null, + }, }; const mockSettingsId = 'Yi9N3aXia'; const mockRuleSetId = 'XXxXXXYYyyyYY'; @@ -27,6 +57,12 @@ void main() { const mockInitTimeoutMillis = 25000; const mockNetworkMode = NetworkMode.eu; const mockConsentMediation = true; + // ignore: deprecated_member_use + const mockBannerCustomization = BannerInitCustomization( + paddingTop: 16, + buttonBorderColor: '#004dcf', + purposeListStyle: PurposeListStyle.flat, + ); const MethodChannel channel = MethodChannel('usercentrics'); TestWidgetsFlutterBinding.ensureInitialized(); @@ -57,7 +93,9 @@ void main() { timeoutMillis: mockTimeoutMillis, networkMode: mockNetworkMode, consentMediation: mockConsentMediation, - initTimeoutMillis: mockInitTimeoutMillis); + initTimeoutMillis: mockInitTimeoutMillis, + // ignore: deprecated_member_use + bannerCustomization: mockBannerCustomization); expect(callCounter, 1); expect(receivedCall?.method, 'initialize'); diff --git a/test/internal/bridge/show_first_layer_bridge_test.mock.dart b/test/internal/bridge/show_first_layer_bridge_test.mock.dart index 86d2eb60..ad6ec0a1 100644 --- a/test/internal/bridge/show_first_layer_bridge_test.mock.dart +++ b/test/internal/bridge/show_first_layer_bridge_test.mock.dart @@ -115,7 +115,8 @@ const expectedArguments = { 'links': 'BOTH', 'disableSystemBackButton': false, }, - "variantName": "variantA" + "variantName": "variantA", + "initCustomization": null }, }; diff --git a/test/internal/bridge/show_second_layer_bridge_test.dart b/test/internal/bridge/show_second_layer_bridge_test.dart index a9ca6b43..4e20b599 100644 --- a/test/internal/bridge/show_second_layer_bridge_test.dart +++ b/test/internal/bridge/show_second_layer_bridge_test.dart @@ -31,6 +31,8 @@ void main() { secondLayer: mockSecondLayerSettings, general: mockGeneralStyleSettings, variantName: mockVariant, + // ignore: deprecated_member_use + initCustomization: mockBannerInitCustomization, ), ); diff --git a/test/internal/bridge/show_second_layer_bridge_test.mock.dart b/test/internal/bridge/show_second_layer_bridge_test.mock.dart index b13a32e1..a53db7ff 100644 --- a/test/internal/bridge/show_second_layer_bridge_test.mock.dart +++ b/test/internal/bridge/show_second_layer_bridge_test.mock.dart @@ -91,7 +91,36 @@ const expectedArguments = { 'links': 'HIDDEN', 'disableSystemBackButton': false }, - "variantName": 'variantA' + "variantName": 'variantA', + "initCustomization": { + 'paddingTop': null, + 'paddingBottom': null, + 'paddingStart': null, + 'paddingEnd': null, + 'lineSpacingMultiplier': null, + 'titleFontSize': null, + 'bodyFontSize': null, + 'linkFontSize': null, + 'titleFontBold': null, + 'headerPaddingTop': null, + 'headerPaddingSides': null, + 'headerPaddingBetweenElements': null, + 'buttonBorderColor': '#004dcf', + 'buttonBorderWidth': null, + 'purposeListStyle': 'FLAT', + 'stickyHeader': null, + 'hideLanguageSwitcher': null, + 'buttonHeightDp': null, + 'buttonHorizontalPaddingDp': null, + 'buttonSpacingDp': null, + 'linkUnderline': null, + 'showSecondLayerCloseButton': null, + 'tabFontSize': null, + 'tabActiveColor': null, + 'denyAllButtonBackground': null, + 'acceptAllButtonBackground': null, + 'linkColor': null, + } } }; const mockFont = BannerFont( @@ -124,3 +153,9 @@ const mockGeneralStyleSettings = GeneralStyleSettings( ); const mockVariant = "variantA"; + +// ignore: deprecated_member_use +const mockBannerInitCustomization = BannerInitCustomization( + buttonBorderColor: '#004dcf', + purposeListStyle: PurposeListStyle.flat, +); diff --git a/test/platform/fake_usercentrics_platform.dart b/test/platform/fake_usercentrics_platform.dart index a9e4081b..c2a170c8 100644 --- a/test/platform/fake_usercentrics_platform.dart +++ b/test/platform/fake_usercentrics_platform.dart @@ -4,6 +4,7 @@ import 'package:usercentrics_sdk/src/model/additional_consent_mode_data.dart'; import 'package:usercentrics_sdk/src/model/gpp_data.dart'; import 'package:usercentrics_sdk/src/model/gpp_section_change_payload.dart'; import 'package:usercentrics_sdk/src/model/analytics_event_type.dart'; +import 'package:usercentrics_sdk/src/model/banner_init_customization.dart'; import 'package:usercentrics_sdk/src/model/banner_settings.dart'; import 'package:usercentrics_sdk/src/model/ccpa_data.dart'; import 'package:usercentrics_sdk/src/model/cmp_data.dart'; @@ -70,6 +71,7 @@ class FakeUsercentricsPlatform extends UsercentricsPlatform { NetworkMode? networkModeArgument; bool? consentMediationArgument; int? initializeInitTimeoutMillisArgument; + BannerInitCustomization? initializeBannerCustomizationArgument; @override void initialize({ @@ -82,6 +84,7 @@ class FakeUsercentricsPlatform extends UsercentricsPlatform { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + BannerInitCustomization? bannerCustomization, }) { initializeCount++; initializeSettingsIdArgument = settingsId; @@ -93,6 +96,7 @@ class FakeUsercentricsPlatform extends UsercentricsPlatform { networkModeArgument = networkMode; consentMediationArgument = consentMediation; initializeInitTimeoutMillisArgument = initTimeoutMillis; + initializeBannerCustomizationArgument = bannerCustomization; } final UsercentricsReadyStatus? restoreUserSessionAnswer; From 81d7e886c2a3f88677663e78d7c704993b65b052 Mon Sep 17 00:00:00 2001 From: "bruno.silva" Date: Tue, 14 Jul 2026 17:40:22 +0100 Subject: [PATCH 2/3] Fix iOS PurposeListStyle parsing crashing in debug on unrecognized values MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit assert(false) crashes debug builds but is compiled out of release, silently returning nil there instead — collapse to a plain nil so behavior is consistent across build configurations. Co-Authored-By: Claude Sonnet 5 --- ios/Classes/Serializer/BannerInitCustomizationSerializer.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/ios/Classes/Serializer/BannerInitCustomizationSerializer.swift b/ios/Classes/Serializer/BannerInitCustomizationSerializer.swift index 4bf5ba58..c728ec4d 100644 --- a/ios/Classes/Serializer/BannerInitCustomizationSerializer.swift +++ b/ios/Classes/Serializer/BannerInitCustomizationSerializer.swift @@ -64,7 +64,6 @@ extension PurposeListStyle { case "FLAT": return PurposeListStyle.flat default: - assert(false) return nil } } From 32a89310a35e8695db0cc5e34a93be4e1dade248 Mon Sep 17 00:00:00 2001 From: "bruno.silva" Date: Wed, 15 Jul 2026 09:22:33 +0100 Subject: [PATCH 3/3] Fix flutter analyze CI failure for BannerInitCustomization deprecation BannerInitCustomization was marked @Deprecated in the same commit that introduced it, so internal plumbing referencing it (bridges, serializers, platform interface, test fakes) triggered deprecated_member_use_from_same_package, and flutter analyze fails CI on any reported issue. Suppress with the existing project convention and fix two test ignore-comments that used the wrong lint code. Co-Authored-By: Claude Sonnet 5 --- lib/src/internal/bridge/initialize_bridge.dart | 2 ++ lib/src/internal/platform/method_channel_usercentrics.dart | 1 + .../serializer/banner_init_customization_serializer.dart | 1 + lib/src/internal/serializer/initialize_options_serializer.dart | 1 + lib/src/platform/usercentrics_platform.dart | 1 + test/internal/bridge/fake_initialize_bridge.dart | 2 ++ test/internal/bridge/initialize_bridge_test.dart | 2 +- test/internal/bridge/show_second_layer_bridge_test.mock.dart | 2 +- test/platform/fake_usercentrics_platform.dart | 2 ++ 9 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/src/internal/bridge/initialize_bridge.dart b/lib/src/internal/bridge/initialize_bridge.dart index f60faf06..d713eb2c 100644 --- a/lib/src/internal/bridge/initialize_bridge.dart +++ b/lib/src/internal/bridge/initialize_bridge.dart @@ -18,6 +18,7 @@ abstract class InitializeBridge { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + // ignore: deprecated_member_use_from_same_package BannerInitCustomization? bannerCustomization, }); } @@ -39,6 +40,7 @@ class MethodChannelInitialize extends InitializeBridge { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + // ignore: deprecated_member_use_from_same_package BannerInitCustomization? bannerCustomization, }) { final arguments = InitializeOptionsSerializer.serialize( diff --git a/lib/src/internal/platform/method_channel_usercentrics.dart b/lib/src/internal/platform/method_channel_usercentrics.dart index 46ade6a0..944dfd18 100644 --- a/lib/src/internal/platform/method_channel_usercentrics.dart +++ b/lib/src/internal/platform/method_channel_usercentrics.dart @@ -88,6 +88,7 @@ class MethodChannelUsercentrics extends UsercentricsPlatform { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + // ignore: deprecated_member_use_from_same_package BannerInitCustomization? bannerCustomization, }) async { final ongoingInit = isReadyCompleter; diff --git a/lib/src/internal/serializer/banner_init_customization_serializer.dart b/lib/src/internal/serializer/banner_init_customization_serializer.dart index cce1db4e..37b167c6 100644 --- a/lib/src/internal/serializer/banner_init_customization_serializer.dart +++ b/lib/src/internal/serializer/banner_init_customization_serializer.dart @@ -1,6 +1,7 @@ import 'package:usercentrics_sdk/src/model/banner_init_customization.dart'; class BannerInitCustomizationSerializer { + // ignore: deprecated_member_use_from_same_package static dynamic serialize(BannerInitCustomization? value) => value == null ? null : { diff --git a/lib/src/internal/serializer/initialize_options_serializer.dart b/lib/src/internal/serializer/initialize_options_serializer.dart index 1292c20a..dc84260a 100644 --- a/lib/src/internal/serializer/initialize_options_serializer.dart +++ b/lib/src/internal/serializer/initialize_options_serializer.dart @@ -17,6 +17,7 @@ class InitializeOptionsSerializer { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + // ignore: deprecated_member_use_from_same_package BannerInitCustomization? bannerCustomization, }) => { diff --git a/lib/src/platform/usercentrics_platform.dart b/lib/src/platform/usercentrics_platform.dart index 918356cc..ef558369 100644 --- a/lib/src/platform/usercentrics_platform.dart +++ b/lib/src/platform/usercentrics_platform.dart @@ -16,6 +16,7 @@ abstract class UsercentricsPlatform { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + // ignore: deprecated_member_use_from_same_package BannerInitCustomization? bannerCustomization, }); diff --git a/test/internal/bridge/fake_initialize_bridge.dart b/test/internal/bridge/fake_initialize_bridge.dart index a0aa4604..5767ed09 100644 --- a/test/internal/bridge/fake_initialize_bridge.dart +++ b/test/internal/bridge/fake_initialize_bridge.dart @@ -16,6 +16,7 @@ class FakeInitializeBridge extends InitializeBridge { NetworkMode? invokeNetworkModeArgument; bool? invokeConsentMediationArgument; int? invokeInitTimeoutMillisArgument; + // ignore: deprecated_member_use_from_same_package BannerInitCustomization? invokeBannerCustomizationArgument; @override @@ -30,6 +31,7 @@ class FakeInitializeBridge extends InitializeBridge { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + // ignore: deprecated_member_use_from_same_package BannerInitCustomization? bannerCustomization, }) { invokeCount++; diff --git a/test/internal/bridge/initialize_bridge_test.dart b/test/internal/bridge/initialize_bridge_test.dart index 492f4b6d..321d33ef 100644 --- a/test/internal/bridge/initialize_bridge_test.dart +++ b/test/internal/bridge/initialize_bridge_test.dart @@ -57,7 +57,7 @@ void main() { const mockInitTimeoutMillis = 25000; const mockNetworkMode = NetworkMode.eu; const mockConsentMediation = true; - // ignore: deprecated_member_use + // ignore: deprecated_member_use_from_same_package const mockBannerCustomization = BannerInitCustomization( paddingTop: 16, buttonBorderColor: '#004dcf', diff --git a/test/internal/bridge/show_second_layer_bridge_test.mock.dart b/test/internal/bridge/show_second_layer_bridge_test.mock.dart index a53db7ff..5583ba4f 100644 --- a/test/internal/bridge/show_second_layer_bridge_test.mock.dart +++ b/test/internal/bridge/show_second_layer_bridge_test.mock.dart @@ -154,7 +154,7 @@ const mockGeneralStyleSettings = GeneralStyleSettings( const mockVariant = "variantA"; -// ignore: deprecated_member_use +// ignore: deprecated_member_use_from_same_package const mockBannerInitCustomization = BannerInitCustomization( buttonBorderColor: '#004dcf', purposeListStyle: PurposeListStyle.flat, diff --git a/test/platform/fake_usercentrics_platform.dart b/test/platform/fake_usercentrics_platform.dart index c2a170c8..7bdcc3ba 100644 --- a/test/platform/fake_usercentrics_platform.dart +++ b/test/platform/fake_usercentrics_platform.dart @@ -71,6 +71,7 @@ class FakeUsercentricsPlatform extends UsercentricsPlatform { NetworkMode? networkModeArgument; bool? consentMediationArgument; int? initializeInitTimeoutMillisArgument; + // ignore: deprecated_member_use_from_same_package BannerInitCustomization? initializeBannerCustomizationArgument; @override @@ -84,6 +85,7 @@ class FakeUsercentricsPlatform extends UsercentricsPlatform { NetworkMode? networkMode, bool? consentMediation, int? initTimeoutMillis, + // ignore: deprecated_member_use_from_same_package BannerInitCustomization? bannerCustomization, }) { initializeCount++;