feature/store-review #49

Merged
fabian merged 2 commits from feature/store-review into develop 2023-09-01 16:03:27 +02:00
5 changed files with 93 additions and 1 deletions

View File

@@ -40,6 +40,7 @@ import androidx.navigation.compose.composable
import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.google.accompanist.systemuicontroller.rememberSystemUiController
import com.google.android.play.core.review.ReviewManager
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -47,6 +48,7 @@ import me.zobrist.tichucounter.domain.DrawerItem
import me.zobrist.tichucounter.domain.ISettingsChangeListener import me.zobrist.tichucounter.domain.ISettingsChangeListener
import me.zobrist.tichucounter.domain.KeepScreenOn import me.zobrist.tichucounter.domain.KeepScreenOn
import me.zobrist.tichucounter.domain.Language import me.zobrist.tichucounter.domain.Language
import me.zobrist.tichucounter.domain.ReviewService
import me.zobrist.tichucounter.domain.Route import me.zobrist.tichucounter.domain.Route
import me.zobrist.tichucounter.domain.SettingsAdapter import me.zobrist.tichucounter.domain.SettingsAdapter
import me.zobrist.tichucounter.domain.Theme import me.zobrist.tichucounter.domain.Theme
@@ -73,6 +75,9 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
@Inject @Inject
lateinit var settingsAdapter: SettingsAdapter lateinit var settingsAdapter: SettingsAdapter
@Inject
lateinit var reviewService: ReviewService
private val counterViewModel: CounterViewModel by viewModels() private val counterViewModel: CounterViewModel by viewModels()
private val historyViewModel: HistoryViewModel by viewModels() private val historyViewModel: HistoryViewModel by viewModels()
private val settingsViewModel: SettingsViewModel by viewModels() private val settingsViewModel: SettingsViewModel by viewModels()
@@ -84,6 +89,10 @@ class MainActivity : AppCompatActivity(), ISettingsChangeListener {
settingsAdapter.registerOnChangeListener(this) settingsAdapter.registerOnChangeListener(this)
mainViewModel.onNewGame = {
reviewService.request()
}
setContent { setContent {
AppTheme { AppTheme {
val systemUiController = rememberSystemUiController() val systemUiController = rememberSystemUiController()

View File

@@ -0,0 +1,68 @@
package me.zobrist.tichucounter.domain
import android.app.Activity
import android.content.Context
import androidx.fragment.app.FragmentActivity
import androidx.preference.PreferenceManager
import com.google.android.play.core.review.ReviewManagerFactory
import com.google.android.play.core.review.testing.FakeReviewManager
import dagger.hilt.android.internal.Contexts
import dagger.hilt.android.qualifiers.ActivityContext
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.android.scopes.ActivityScoped
import dagger.hilt.android.scopes.FragmentScoped
import dagger.hilt.android.scopes.ViewScoped
import java.time.Duration
import java.time.Period
import java.util.Date
import javax.inject.Inject
import javax.inject.Singleton
class ReviewService @Inject constructor(@ActivityContext private val appContext: Context) {
private val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(appContext)
private val THREE_MONTHS : Long = 7776000000
private var requestCalled: Int
get() = sharedPreferences.getInt("requestCalled", 0)
set(value) {
val editor = sharedPreferences.edit()
editor.putInt("requestCalled", value)
editor.apply()
}
private var nextReviewedDate: Date
get() = Date(sharedPreferences.getLong("lastReviewedDate", 0))
set(value) {
val editor = sharedPreferences.edit()
editor.putLong("lastReviewedDate", value.time)
editor.apply()
}
fun request() {
requestCalled += 1
if(requestCalled >= 3)
{
if(nextReviewedDate.time < System.currentTimeMillis())
{
requestCalled = 0
nextReviewedDate = Date(System.currentTimeMillis() + THREE_MONTHS)
val manager = ReviewManagerFactory.create(appContext)
val request = manager.requestReviewFlow()
request.addOnCompleteListener { task ->
if (task.isSuccessful) {
// We got the ReviewInfo object
val reviewInfo = task.result
manager.launchReviewFlow(appContext as Activity, reviewInfo)
} else {
}
}
}
}
}
}

View File

@@ -4,6 +4,7 @@ import android.content.Context
import androidx.core.os.LocaleListCompat import androidx.core.os.LocaleListCompat
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import java.util.Date
import javax.inject.Inject import javax.inject.Inject
import javax.inject.Singleton import javax.inject.Singleton
@@ -36,6 +37,9 @@ class SettingsAdapter @Inject constructor(@ApplicationContext private val contex
var keepScreenOn: KeepScreenOn var keepScreenOn: KeepScreenOn
private set private set
var reviewDialogShownDate: Date
get() = Date(sharedPreferences.getLong("reviewDialogShownDate", 0))
set(value) = updatePreference("reviewDialogShownDate", value.time)
init { init {
language = try { language = try {
@@ -95,6 +99,12 @@ class SettingsAdapter @Inject constructor(@ApplicationContext private val contex
editor.apply() editor.apply()
} }
private fun updatePreference(name: String?, value: Long) {
val editor = sharedPreferences.edit()
editor.putLong(name, value)
editor.apply()
}
private fun notifyListeners(language: Language) { private fun notifyListeners(language: Language) {
listenerList.forEach { listenerList.forEach {
it.onLanguageChanged(language) it.onLanguageChanged(language)

View File

@@ -7,8 +7,10 @@ import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.scopes.ActivityScoped
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import me.zobrist.tichucounter.data.entity.Round import me.zobrist.tichucounter.data.entity.Round
import me.zobrist.tichucounter.domain.ReviewService
import me.zobrist.tichucounter.repository.GameRepository import me.zobrist.tichucounter.repository.GameRepository
import javax.inject.Inject import javax.inject.Inject
@@ -21,6 +23,8 @@ class MainViewModel @Inject constructor(
private var redoRounds = mutableStateListOf<Round>() private var redoRounds = mutableStateListOf<Round>()
private var expectedRoundCount = 0 private var expectedRoundCount = 0
var onNewGame: (() -> Unit)? = null
var isUndoActionActive by mutableStateOf(false) var isUndoActionActive by mutableStateOf(false)
val isRedoActionActive: Boolean val isRedoActionActive: Boolean
@@ -75,5 +79,6 @@ class MainViewModel @Inject constructor(
redoRounds.clear() redoRounds.clear()
gameRepository.newGame() gameRepository.newGame()
} }
onNewGame?.let { it() }
} }
} }

View File

@@ -6,7 +6,7 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:8.1.0' classpath 'com.android.tools.build:gradle:8.1.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong