Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Major update #117

Merged
merged 9 commits into from
Jun 28, 2023
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
2 changes: 1 addition & 1 deletion QonversionSandwich.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,5 @@ Pod::Spec.new do |s|
s.source_files = 'ios/sandwich/**/*.{h,m,swift}'
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' }

s.dependency "Qonversion", "3.4.2"
s.dependency "Qonversion", "4.0.0"
end
4 changes: 2 additions & 2 deletions android/sandwich/build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
buildscript {
ext.qonversion_version = '4.4.2'
ext.qonversion_version = '5.0.0'
}

plugins {
Expand Down Expand Up @@ -44,7 +44,7 @@ ext {

dependencies {
api "io.qonversion.android.sdk:sdk:$qonversion_version"
implementation 'androidx.preference:preference:1.1.1'
implementation 'androidx.preference:preference:1.2.0'
}

apply from: "../scripts/maven-release.gradle"
36 changes: 30 additions & 6 deletions android/sandwich/src/main/kotlin/io/qonversion/sandwich/Mappers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@ import com.qonversion.android.sdk.automations.dto.QActionResult
import com.qonversion.android.sdk.automations.dto.QScreenPresentationConfig
import com.qonversion.android.sdk.automations.dto.QScreenPresentationStyle
import com.qonversion.android.sdk.dto.QEntitlement
import com.qonversion.android.sdk.dto.QRemoteConfig
import com.qonversion.android.sdk.dto.QUser
import com.qonversion.android.sdk.dto.eligibility.QEligibility
import com.qonversion.android.sdk.dto.experiments.QExperimentInfo
import com.qonversion.android.sdk.dto.experiments.QExperiment
import com.qonversion.android.sdk.dto.experiments.QExperimentGroup
import com.qonversion.android.sdk.dto.experiments.QExperimentGroupType
import com.qonversion.android.sdk.dto.offerings.QOffering
import com.qonversion.android.sdk.dto.offerings.QOfferings
import com.qonversion.android.sdk.dto.products.QProduct
Expand All @@ -26,6 +29,7 @@ fun QonversionError.toMap(): BridgeData {
)
}

@Suppress("DEPRECATION")
fun SkuDetails.toMap(): BridgeData {
return mapOf(
"description" to description,
Expand Down Expand Up @@ -113,15 +117,35 @@ fun Map<String, QEligibility>.toEligibilityMap(): BridgeData {
return mapValues { it.value.toMap() }
}

fun QExperimentInfo.toMap(): BridgeData {
fun QRemoteConfig.toMap(): BridgeData {
return mapOf(
"id" to experimentID,
"group" to mapOf("type" to 0)
"payload" to payload,
"experiment" to experiment?.toMap()
)
}

fun Map<String, QExperimentInfo>.toExperimentsMap(): BridgeData {
return mapValues { it.value.toMap() }
fun QExperiment.toMap(): BridgeData {
return mapOf(
"id" to id,
"name" to name,
"group" to group.toMap()
)
}

fun QExperimentGroup.toMap(): BridgeData {
return mapOf(
"id" to id,
"name" to name,
"type" to type.toFormattedString()
)
}

fun QExperimentGroupType.toFormattedString(): String {
return when (this) {
QExperimentGroupType.Treatment -> "treatment"
QExperimentGroupType.Control -> "control"
else -> "unknown"
}
}

fun QActionResult.toMap(): BridgeData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.qonversion.android.sdk.dto.QEntitlement
import com.qonversion.android.sdk.dto.QEntitlementsCacheLifetime
import com.qonversion.android.sdk.dto.QEnvironment
import com.qonversion.android.sdk.dto.QLaunchMode
import com.qonversion.android.sdk.dto.QRemoteConfig
import com.qonversion.android.sdk.dto.QUser
import com.qonversion.android.sdk.dto.QUserProperty
import com.qonversion.android.sdk.dto.QonversionError
Expand All @@ -21,8 +22,10 @@ import com.qonversion.android.sdk.dto.products.QProduct
import com.qonversion.android.sdk.listeners.QEntitlementsUpdateListener
import com.qonversion.android.sdk.listeners.QonversionEligibilityCallback
import com.qonversion.android.sdk.listeners.QonversionEntitlementsCallback
import com.qonversion.android.sdk.listeners.QonversionExperimentAttachCallback
import com.qonversion.android.sdk.listeners.QonversionOfferingsCallback
import com.qonversion.android.sdk.listeners.QonversionProductsCallback
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigCallback
import com.qonversion.android.sdk.listeners.QonversionUserCallback

private const val TAG = "Qonversion"
Expand Down Expand Up @@ -264,6 +267,44 @@ class QonversionSandwich(

// endregion

// region Experiments

fun remoteConfig(resultListener: ResultListener) {
Qonversion.shared.remoteConfig(object : QonversionRemoteConfigCallback {
override fun onSuccess(remoteConfig: QRemoteConfig) {
resultListener.onSuccess(remoteConfig.toMap())
}

override fun onError(error: QonversionError) {
resultListener.onError(error.toSandwichError())
}
})
}

fun attachUserToExperiment(experimentId: String, groupId: String, resultListener: ResultListener) {
Qonversion.shared.attachUserToExperiment(experimentId, groupId, object : QonversionExperimentAttachCallback {
override fun onSuccess() {
resultListener.onSuccess(emptySuccessResult())
}

override fun onError(error: QonversionError) {
resultListener.onError(error.toSandwichError())
}
})
}

fun detachUserFromExperiment(experimentId: String, resultListener: ResultListener) {
Qonversion.shared.detachUserFromExperiment(experimentId, object : QonversionExperimentAttachCallback {
override fun onSuccess() {
resultListener.onSuccess(emptySuccessResult())
}

override fun onError(error: QonversionError) {
resultListener.onError(error.toSandwichError())
}
})
}

// region Other

fun syncHistoricalData() {
Expand All @@ -274,6 +315,10 @@ class QonversionSandwich(

// region Private

private fun emptySuccessResult(): BridgeData {
return mapOf("success" to true)
}

private interface ProductCallback {
fun onProductLoaded(product: QProduct)

Expand Down
2 changes: 1 addition & 1 deletion ios/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ platform :ios, '9.0'
use_frameworks!

target 'QonversionSandwich' do
pod 'Qonversion', '3.4.2'
pod 'Qonversion', '4.0.0'
end

target 'Sample' do
Expand Down
20 changes: 10 additions & 10 deletions ios/Podfile.lock
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
PODS:
- Qonversion (3.4.2):
- Qonversion/Main (= 3.4.2)
- Qonversion/Main (3.4.2)
- QonversionSandwich (1.5.1):
- Qonversion (= 3.4.2)
- Qonversion (4.0.0):
- Qonversion/Main (= 4.0.0)
- Qonversion/Main (4.0.0)
- QonversionSandwich (1.5.2):
- Qonversion (= 4.0.0)

DEPENDENCIES:
- Qonversion (= 3.4.2)
- Qonversion (= 4.0.0)
- QonversionSandwich (from `../`)

SPEC REPOS:
Expand All @@ -18,9 +18,9 @@ EXTERNAL SOURCES:
:path: "../"

SPEC CHECKSUMS:
Qonversion: 8a5be89a9efd698f023b5342526bcb98eaccbed3
QonversionSandwich: 4f38ef330160e205c66f1e67681d79f7bc431607
Qonversion: ae70809310aa2efc43b7df7770c3a65fdec7407b
QonversionSandwich: 70d16cdc1935738ab58713cf46d0f6d36d66108b

PODFILE CHECKSUM: 6982333628ed6ed4fd13c2c07d1ed7dbdb22ff57
PODFILE CHECKSUM: 420fa7dba9fdd147ab9a5cb71fb9143ff03dac2b

COCOAPODS: 1.12.0
COCOAPODS: 1.11.3
39 changes: 35 additions & 4 deletions ios/sandwich/Mappers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -354,17 +354,48 @@ extension SKProductDiscount {
}
}

extension Qonversion.ExperimentInfo {
extension Qonversion.RemoteConfig {
func toMap() -> BridgeData {
return [
"payload": payload,
"experiment": experiment?.toMap()
]
}
}

extension Qonversion.Experiment {
func toMap() -> BridgeData {
return [
"id": identifier,
"group": [
"type": group?.type
]
"name": name,
"group": group.toMap()
]
}
}

extension Qonversion.ExperimentGroup {
func toMap() -> BridgeData {
return [
"id": identifier,
"name": name,
"type": type.toString()
]
}
}

extension Qonversion.ExperimentGroupType {
func toString() -> String {
switch self {
case .treatment:
return "treatment"
case .control:
return "control"
default:
return "unknown"
}
}
}

extension Date {
func toMilliseconds() -> Double {
return timeIntervalSince1970 * 1000
Expand Down
36 changes: 36 additions & 0 deletions ios/sandwich/QonversionSandwich.swift
Original file line number Diff line number Diff line change
Expand Up @@ -219,8 +219,44 @@ public class QonversionSandwich : NSObject {
Qonversion.shared().collectAdvertisingId()
}

@objc public func remoteConfig(_ completion: @escaping BridgeCompletion) {
Qonversion.shared().remoteConfig { remoteConfig, error in
if let error = error as NSError? {
completion(nil, error.toSandwichError())
}

let bridgeData: [String: Any]? = remoteConfig?.toMap().clearEmptyValues()

completion(bridgeData, nil)
}
}

@objc public func attachUserToExperiment(with experimentId: String, groupId: String, completion: @escaping BridgeCompletion) {
Qonversion.shared().attachUser(toExperiment: experimentId, groupId: groupId) { success, error in
if let error = error as NSError? {
return completion(nil, error.toSandwichError())
}

completion(self.defaultSuccessResponse(), nil)
}
}

@objc public func detachUserFromExperiment(with experimentId: String, completion: @escaping BridgeCompletion) {
Qonversion.shared().detachUser(fromExperiment: experimentId, completion: { success, error in
if let error = error as NSError? {
return completion(nil, error.toSandwichError())
}

completion(self.defaultSuccessResponse(), nil)
})
}

// MARK: - Private functions

private func defaultSuccessResponse() -> [String: Any] {
return ["success": true]
}

private func loadProduct(_ productId: String, _ offeringId: String, completion: @escaping ProductCompletion) {
Qonversion.shared().offerings() { (offerings, error) in
let offering: Qonversion.Offering? = offerings?.offering(for: offeringId)
Expand Down