Coverage Summary for Class: InAppReview (com.vsevolodganin.clicktrack.common)
Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
InAppReview |
0%
(0/6)
|
0%
(0/6)
|
0%
(0/22)
|
0%
(0/134)
|
InAppReview$Const |
0%
(0/2)
|
|
0%
(0/2)
|
0%
(0/3)
|
InAppReview$tryLaunchRequestReview$1 |
0%
(0/1)
|
|
0%
(0/1)
|
0%
(0/11)
|
InAppReview$tryRequestReview$1 |
|
Total |
0%
(0/9)
|
0%
(0/6)
|
0%
(0/25)
|
0%
(0/148)
|
package com.vsevolodganin.clicktrack.common
import android.app.Activity
import com.google.android.play.core.ktx.launchReview
import com.google.android.play.core.ktx.requestReview
import com.google.android.play.core.review.ReviewManager
import com.vsevolodganin.clicktrack.analytics.AnalyticsLogger
import com.vsevolodganin.clicktrack.di.component.MainControllerScope
import com.vsevolodganin.clicktrack.storage.UserPreferencesRepository
import com.vsevolodganin.clicktrack.utils.log.Logger
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import me.tatarka.inject.annotations.Inject
import kotlin.time.Duration.Companion.days
import kotlin.time.Duration.Companion.milliseconds
@MainControllerScope
@Inject
class InAppReview(
private val reviewManagerProvider: () -> ReviewManager,
private val activity: Activity,
private val userPreferencesRepository: UserPreferencesRepository,
private val analyticsLogger: AnalyticsLogger,
private val logger: Logger,
) {
@OptIn(DelicateCoroutinesApi::class)
fun tryLaunchRequestReview() {
GlobalScope.launch(Dispatchers.Main) {
tryRequestReview()
}
}
private suspend fun tryRequestReview() {
try {
if (mayRequestReview()) {
val reviewManager = reviewManagerProvider.invoke()
val reviewInfo = reviewManager.requestReview()
reviewManager.launchReview(activity, reviewInfo)
userPreferencesRepository.reviewRequestTimestamp.value = nowMilliseconds()
analyticsLogger.logEvent("review_requested")
}
} catch (t: Throwable) {
logger.logError(TAG, "Failed to request review", t)
}
}
private fun mayRequestReview(): Boolean {
val now = nowMilliseconds()
val reviewRequestTimestamp = userPreferencesRepository.reviewRequestTimestamp.value
if (reviewRequestTimestamp == UserPreferencesRepository.Const.REVIEW_NOT_REQUESTED) {
userPreferencesRepository.reviewRequestTimestamp.value = now
return false
}
return (now - reviewRequestTimestamp).milliseconds >= REVIEW_REQUEST_PERIOD
}
private fun nowMilliseconds(): Long = System.currentTimeMillis()
private companion object Const {
const val TAG = "InAppReview"
val REVIEW_REQUEST_PERIOD = 30.days
}
}