Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -24,7 +25,8 @@ internal fun Any?.deserializeBannerSettings(
assetsProvider,
activityProvider
),
variantName = this["variantName"] as? String?
variantName = this["variantName"] as? String?,
initCustomization = this["initCustomization"].deserializeBannerInitCustomization()
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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
}
15 changes: 15 additions & 0 deletions example/ios/RunnerTests/Bridge/ShowFirstLayerBridgeTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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()
}

Expand Down Expand Up @@ -109,6 +119,11 @@ class ShowFirstLayerBridgeTest: XCTestCase, BaseBridgeTestProtocol {
],
"generalStyleSettings": [
"links": "BOTH"
],
"initCustomization": [
"paddingTop": 16,
"buttonBorderColor": "#004dcf",
"purposeListStyle": "FLAT"
]
]
]
Expand Down
2 changes: 2 additions & 0 deletions example/test/fake_usercentrics.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ class FakeUsercentrics extends UsercentricsPlatform {
NetworkMode? networkMode,
bool? consentMediation,
int? initTimeoutMillis,
// ignore: deprecated_member_use
BannerInitCustomization? bannerCustomization,
}) {
initializeCount++;
}
Expand Down
70 changes: 70 additions & 0 deletions ios/Classes/Serializer/BannerInitCustomizationSerializer.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
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<String, Any> 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:
return nil
}
}
}
4 changes: 3 additions & 1 deletion ios/Classes/Serializer/BannerSettingsSerializer.swift
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import Usercentrics
import UsercentricsUI

extension BannerSettings {
Expand Down Expand Up @@ -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"]))
}
}
6 changes: 5 additions & 1 deletion ios/Classes/Serializer/InitializeOptionsSerializer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,11 @@ extension UsercentricsOptions {
options.consentMediation = consentMediation
}

if let bannerCustomization = BannerInitCustomization.from(value: dict["bannerCustomization"]) {
options.bannerCustomization = bannerCustomization
}

return options
}

}
6 changes: 6 additions & 0 deletions lib/src/internal/bridge/initialize_bridge.dart
Original file line number Diff line number Diff line change
@@ -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';

Expand All @@ -17,6 +18,8 @@ abstract class InitializeBridge {
NetworkMode? networkMode,
bool? consentMediation,
int? initTimeoutMillis,
// ignore: deprecated_member_use_from_same_package
BannerInitCustomization? bannerCustomization,
});
}

Expand All @@ -37,6 +40,8 @@ class MethodChannelInitialize extends InitializeBridge {
NetworkMode? networkMode,
bool? consentMediation,
int? initTimeoutMillis,
// ignore: deprecated_member_use_from_same_package
BannerInitCustomization? bannerCustomization,
}) {
final arguments = InitializeOptionsSerializer.serialize(
settingsId: settingsId,
Expand All @@ -48,6 +53,7 @@ class MethodChannelInitialize extends InitializeBridge {
networkMode: networkMode,
consentMediation: consentMediation,
initTimeoutMillis: initTimeoutMillis,
bannerCustomization: bannerCustomization,
);
channel.invokeMethod(_name, arguments);
}
Expand Down
5 changes: 4 additions & 1 deletion lib/src/internal/platform/method_channel_usercentrics.dart
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ class MethodChannelUsercentrics extends UsercentricsPlatform {
NetworkMode? networkMode,
bool? consentMediation,
int? initTimeoutMillis,
// ignore: deprecated_member_use_from_same_package
BannerInitCustomization? bannerCustomization,
}) async {
final ongoingInit = isReadyCompleter;

Expand All @@ -113,7 +115,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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
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
: {
'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';
}
}
}
4 changes: 4 additions & 0 deletions lib/src/internal/serializer/banner_settings_serializer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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,
),
};
}
Original file line number Diff line number Diff line change
@@ -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';

Expand All @@ -15,6 +17,8 @@ class InitializeOptionsSerializer {
NetworkMode? networkMode,
bool? consentMediation,
int? initTimeoutMillis,
// ignore: deprecated_member_use_from_same_package
BannerInitCustomization? bannerCustomization,
}) =>
{
'settingsId': settingsId,
Expand All @@ -26,5 +30,8 @@ class InitializeOptionsSerializer {
'networkMode': NetworkModeSerializer.serialize(networkMode),
'consentMediation': consentMediation,
'initTimeoutMillis': initTimeoutMillis,
'bannerCustomization': BannerInitCustomizationSerializer.serialize(
bannerCustomization,
),
};
}
1 change: 1 addition & 0 deletions lib/src/internal/serializer/serializer.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand Down
Loading
Loading