Skip to content

Commit

Permalink
Merge pull request #523 from qonversion/release/6.2.0
Browse files Browse the repository at this point in the history
Release 6.2.0
  • Loading branch information
suriksarkisyan authored Sep 22, 2023
2 parents f91c33e + b4de753 commit 07741ae
Show file tree
Hide file tree
Showing 12 changed files with 187 additions and 6 deletions.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import io.gitlab.arturbosch.detekt.DetektCreateBaselineTask
buildscript {
ext {
release = [
versionName: "6.1.1",
versionName: "6.2.0",
versionCode: 1
]
}
Expand Down
2 changes: 1 addition & 1 deletion fastlane/report.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@



<testcase classname="fastlane.lanes" name="0: default_platform" time="0.111658">
<testcase classname="fastlane.lanes" name="0: default_platform" time="0.104731">

</testcase>

Expand Down
23 changes: 23 additions & 0 deletions sdk/src/main/java/com/qonversion/android/sdk/Qonversion.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import com.qonversion.android.sdk.listeners.QonversionEntitlementsCallback
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.QonversionRemoteConfigurationAttachCallback
import com.qonversion.android.sdk.listeners.QonversionUserCallback
import com.qonversion.android.sdk.listeners.QonversionUserPropertiesCallback

Expand Down Expand Up @@ -201,6 +202,28 @@ interface Qonversion {
*/
fun detachUserFromExperiment(experimentId: String, callback: QonversionExperimentAttachCallback)

/**
* This function should be used for the test purposes only. Do not forget to delete the usage of this function before the release.
* Use this function to attach the user to the remote configuration.
* @param remoteConfigurationId identifier of the remote configuration
* @param callback callback that includes information about the result of the action
*/
fun attachUserToRemoteConfiguration(
remoteConfigurationId: String,
callback: QonversionRemoteConfigurationAttachCallback
)

/**
* This function should be used for the test purposes only. Do not forget to delete the usage of this function before the release.
* Use this function to detach the user from the remote configuration.
* @param remoteConfigurationId identifier of the remote configuration
* @param callback callback that includes information about the result of the action
*/
fun detachUserFromRemoteConfiguration(
remoteConfigurationId: String,
callback: QonversionRemoteConfigurationAttachCallback
)

/**
* You can check if a user is eligible for an introductory offer, including a free trial.
* You can show only a regular price for users who are not eligible for an introductory offer.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.qonversion.android.sdk.internal.provider.UserStateProvider
import com.qonversion.android.sdk.internal.services.QRemoteConfigService
import com.qonversion.android.sdk.listeners.QonversionExperimentAttachCallback
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigCallback
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigurationAttachCallback
import javax.inject.Inject

internal class QRemoteConfigManager @Inject constructor(
Expand Down Expand Up @@ -71,6 +72,22 @@ internal class QRemoteConfigManager @Inject constructor(
remoteConfigService.detachUserFromExperiment(experimentId, internalConfig.uid, callback)
}

fun attachUserToRemoteConfiguration(
remoteConfigurationId: String,
callback: QonversionRemoteConfigurationAttachCallback
) {
currentRemoteConfig = null
remoteConfigService.attachUserToRemoteConfiguration(remoteConfigurationId, internalConfig.uid, callback)
}

fun detachUserFromRemoteConfiguration(
remoteConfigurationId: String,
callback: QonversionRemoteConfigurationAttachCallback
) {
currentRemoteConfig = null
remoteConfigService.detachUserFromRemoteConfiguration(remoteConfigurationId, internalConfig.uid, callback)
}

private fun fireToCallbacks(action: QonversionRemoteConfigCallback.() -> Unit) {
val callbacks = remoteConfigCallbacks.toList()
callbacks.forEach { it.action() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import com.qonversion.android.sdk.listeners.QonversionRemoteConfigCallback
import com.qonversion.android.sdk.listeners.QonversionEligibilityCallback
import com.qonversion.android.sdk.listeners.QonversionUserCallback
import com.qonversion.android.sdk.listeners.QEntitlementsUpdateListener
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigurationAttachCallback
import com.qonversion.android.sdk.listeners.QonversionUserPropertiesCallback

internal class QonversionInternal(
Expand Down Expand Up @@ -244,6 +245,22 @@ internal class QonversionInternal(
?: logLaunchErrorForFunctionName(object {}.javaClass.enclosingMethod?.name)
}

override fun attachUserToRemoteConfiguration(
remoteConfigurationId: String,
callback: QonversionRemoteConfigurationAttachCallback
) {
remoteConfigManager?.attachUserToRemoteConfiguration(remoteConfigurationId, callback)
?: logLaunchErrorForFunctionName(object {}.javaClass.enclosingMethod?.name)
}

override fun detachUserFromRemoteConfiguration(
remoteConfigurationId: String,
callback: QonversionRemoteConfigurationAttachCallback
) {
remoteConfigManager?.detachUserFromRemoteConfiguration(remoteConfigurationId, callback)
?: logLaunchErrorForFunctionName(object {}.javaClass.enclosingMethod?.name)
}

override fun checkTrialIntroEligibility(
productIds: List<String>,
callback: QonversionEligibilityCallback
Expand Down
12 changes: 12 additions & 0 deletions sdk/src/main/java/com/qonversion/android/sdk/internal/api/Api.kt
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,18 @@ internal interface Api {
@Path("user_id") userId: String
): Call<Void>

@POST("v3/remote-configurations/{id}/users/{user_id}")
fun attachUserToRemoteConfiguration(
@Path("id") experimentId: String,
@Path("user_id") userId: String
): Call<Void>

@DELETE("v3/remote-configurations/{id}/users/{user_id}")
fun detachUserFromRemoteConfiguration(
@Path("id") experimentId: String,
@Path("user_id") userId: String
): Call<Void>

@POST("v3/users/{user_id}/properties")
fun sendProperties(
@Path("user_id") userId: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ internal enum class RequestType {
GetProperties,
EligibilityForProductIds,
Identify,
AttachUserToRemoteConfiguration,
DetachUserFromRemoteConfiguration,
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ import com.qonversion.android.sdk.internal.stringValue
import com.qonversion.android.sdk.internal.toQonversionError
import com.qonversion.android.sdk.listeners.QonversionExperimentAttachCallback
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigCallback
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigurationAttachCallback

import retrofit2.Response
import java.lang.RuntimeException
import java.util.Timer
Expand Down Expand Up @@ -116,7 +118,7 @@ internal class DefaultRepository internal constructor(
val request = AttachUserRequest(groupId)
api.attachUserToExperiment(experimentId, userId, request).enqueue {
onResponse = {
logger.debug("attachUserRequest - ${it.getLogMessage()}")
logger.debug("attachUserToExperimentRequest - ${it.getLogMessage()}")
if (it.isSuccessful) {
callback.onSuccess()
} else {
Expand All @@ -125,7 +127,7 @@ internal class DefaultRepository internal constructor(
}

onFailure = {
logger.release("attachUserRequest - failure - ${it.toQonversionError()}")
logger.release("attachUserToExperimentRequest - failure - ${it.toQonversionError()}")
callback.onError(it.toQonversionError())
}
}
Expand All @@ -138,7 +140,51 @@ internal class DefaultRepository internal constructor(
) {
api.detachUserFromExperiment(experimentId, userId).enqueue {
onResponse = {
logger.debug("detachUserRequest - ${it.getLogMessage()}")
logger.debug("detachUserFromExperimentRequest - ${it.getLogMessage()}")
if (it.isSuccessful) {
callback.onSuccess()
} else {
callback.onError(errorMapper.getErrorFromResponse(it))
}
}

onFailure = {
logger.release("detachUserFromExperimentRequest - failure - ${it.toQonversionError()}")
callback.onError(it.toQonversionError())
}
}
}

override fun attachUserToRemoteConfiguration(
remoteConfigurationId: String,
userId: String,
callback: QonversionRemoteConfigurationAttachCallback
) {
api.attachUserToRemoteConfiguration(remoteConfigurationId, userId).enqueue {
onResponse = {
logger.debug("attachUserToRemoteConfigurationRequest - ${it.getLogMessage()}")
if (it.isSuccessful) {
callback.onSuccess()
} else {
callback.onError(errorMapper.getErrorFromResponse(it))
}
}

onFailure = {
logger.release("attachUserToRemoteConfigurationRequest - failure - ${it.toQonversionError()}")
callback.onError(it.toQonversionError())
}
}
}

override fun detachUserFromRemoteConfiguration(
remoteConfigurationId: String,
userId: String,
callback: QonversionRemoteConfigurationAttachCallback
) {
api.detachUserFromRemoteConfiguration(remoteConfigurationId, userId).enqueue {
onResponse = {
logger.debug("detachUserFromRemoteConfigurationRequest - ${it.getLogMessage()}")
if (it.isSuccessful) {
callback.onSuccess()
} else {
Expand All @@ -147,7 +193,7 @@ internal class DefaultRepository internal constructor(
}

onFailure = {
logger.release("detachUserRequest - failure - ${it.toQonversionError()}")
logger.release("detachUserFromRemoteConfigurationRequest - failure - ${it.toQonversionError()}")
callback.onError(it.toQonversionError())
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import com.qonversion.android.sdk.listeners.QonversionEligibilityCallback
import com.qonversion.android.sdk.listeners.QonversionExperimentAttachCallback
import com.qonversion.android.sdk.listeners.QonversionLaunchCallback
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigCallback
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigurationAttachCallback

internal interface QRepository {

Expand All @@ -33,6 +34,18 @@ internal interface QRepository {
callback: QonversionExperimentAttachCallback
)

fun attachUserToRemoteConfiguration(
remoteConfigurationId: String,
userId: String,
callback: QonversionRemoteConfigurationAttachCallback
)

fun detachUserFromRemoteConfiguration(
remoteConfigurationId: String,
userId: String,
callback: QonversionRemoteConfigurationAttachCallback
)

fun purchase(
installDate: Long,
purchase: Purchase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import com.qonversion.android.sdk.listeners.QonversionEligibilityCallback
import com.qonversion.android.sdk.listeners.QonversionExperimentAttachCallback
import com.qonversion.android.sdk.listeners.QonversionLaunchCallback
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigCallback
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigurationAttachCallback

internal class RepositoryWithRateLimits(
private val repository: QRepository,
Expand Down Expand Up @@ -70,6 +71,34 @@ internal class RepositoryWithRateLimits(
}
}

override fun attachUserToRemoteConfiguration(
remoteConfigurationId: String,
userId: String,
callback: QonversionRemoteConfigurationAttachCallback
) {
withRateLimitCheck(
RequestType.AttachUserToRemoteConfiguration,
(remoteConfigurationId + userId).hashCode(),
{ error -> callback.onError(error) }
) {
repository.attachUserToRemoteConfiguration(remoteConfigurationId, userId, callback)
}
}

override fun detachUserFromRemoteConfiguration(
remoteConfigurationId: String,
userId: String,
callback: QonversionRemoteConfigurationAttachCallback
) {
withRateLimitCheck(
RequestType.DetachUserFromRemoteConfiguration,
(remoteConfigurationId + userId).hashCode(),
{ error -> callback.onError(error) }
) {
repository.detachUserFromRemoteConfiguration(remoteConfigurationId, userId, callback)
}
}

override fun purchase(
installDate: Long,
purchase: Purchase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.qonversion.android.sdk.internal.services
import com.qonversion.android.sdk.internal.repository.QRepository
import com.qonversion.android.sdk.listeners.QonversionExperimentAttachCallback
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigCallback
import com.qonversion.android.sdk.listeners.QonversionRemoteConfigurationAttachCallback
import javax.inject.Inject

internal class QRemoteConfigService @Inject constructor(
Expand All @@ -24,4 +25,20 @@ internal class QRemoteConfigService @Inject constructor(
fun detachUserFromExperiment(experimentId: String, userId: String, callback: QonversionExperimentAttachCallback) {
repository.detachUserFromExperiment(experimentId, userId, callback)
}

fun attachUserToRemoteConfiguration(
remoteConfigurationId: String,
userId: String,
callback: QonversionRemoteConfigurationAttachCallback
) {
repository.attachUserToRemoteConfiguration(remoteConfigurationId, userId, callback)
}

fun detachUserFromRemoteConfiguration(
remoteConfigurationId: String,
userId: String,
callback: QonversionRemoteConfigurationAttachCallback
) {
repository.detachUserFromRemoteConfiguration(remoteConfigurationId, userId, callback)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,11 @@ interface QonversionExperimentAttachCallback {
fun onError(error: QonversionError)
}

interface QonversionRemoteConfigurationAttachCallback {
fun onSuccess()
fun onError(error: QonversionError)
}

interface QonversionEntitlementsCallback {
fun onSuccess(entitlements: Map<String, QEntitlement>)
fun onError(error: QonversionError)
Expand Down

0 comments on commit 07741ae

Please sign in to comment.