Skip to content

Commit

Permalink
Release/1.0.2.8 (#166)
Browse files Browse the repository at this point in the history
  • Loading branch information
mtwalli authored Aug 20, 2024
2 parents 28dd5c1 + 6b11518 commit a1fd787
Show file tree
Hide file tree
Showing 26 changed files with 346 additions and 28 deletions.
2 changes: 2 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ dependencies {
implementation(libs.androidx.lifecycle.runtimeCompose)
implementation(libs.androidx.compose.material3.windowSizeClass)
implementation(libs.androidx.material3.adaptive.navigation.suite.android)
implementation(libs.review)
implementation(libs.review.ktx)

debugImplementation(libs.androidx.compose.ui.testManifest)

Expand Down
12 changes: 12 additions & 0 deletions app/src/main/java/com/memorati/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.google.android.play.core.review.ReviewManager
import com.memorati.core.ui.theme.MemoratiTheme
import com.memorati.feature.assistant.navigation.assistantScreen
import com.memorati.feature.cards.navigation.cardsScreen
Expand All @@ -22,12 +23,23 @@ import com.memorati.feature.settings.navigation.settingsScreen
import com.memorati.navigation.TopDestination
import com.memorati.ui.navigationSuiteItems
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

@AndroidEntryPoint
class MainActivity : ComponentActivity() {

@Inject
lateinit var reviewManager: ReviewManager

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

val request = reviewManager.requestReviewFlow()
request.addOnCompleteListener { task ->
if (task.isSuccessful) {
reviewManager.launchReviewFlow(this@MainActivity, task.result)
}
}
setContent {
val navController = rememberNavController()
val navBackStackEntry by navController.currentBackStackEntryAsState()
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/java/com/memorati/di/AppModule.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package com.memorati.di

import android.content.Context
import com.google.android.play.core.review.ReviewManager
import com.google.android.play.core.review.ReviewManagerFactory
import com.memorati.BuildConfig
import com.memorati.core.common.di.AppId
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent

@Module
Expand All @@ -13,4 +17,9 @@ class AppModule {
@Provides
@AppId
fun appId(): String = BuildConfig.APPLICATION_ID

@Provides
fun reviewManager(
@ApplicationContext context: Context,
): ReviewManager = ReviewManagerFactory.create(context)
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ internal fun Flashcard.handleReviewResponse(
consecutiveCorrectCount = consecutiveCorrectCount,
// Apply decay to memory strength over time
memoryStrength = additionalInfo.memoryStrength * 0.95,
totalReviews = additionalInfo.totalReviews + 1,
),
lastReviewAt = now,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,12 @@ private fun AdditionalInfoEntity.toAdditionalInfo() = AdditionalInfo(
difficulty = difficulty,
consecutiveCorrectCount = consecutiveCorrectCount,
memoryStrength = memoryStrength,
totalReviews = totalReviews,
)

private fun AdditionalInfo.toAdditionalInfoEntity() = AdditionalInfoEntity(
difficulty = difficulty,
consecutiveCorrectCount = consecutiveCorrectCount,
memoryStrength = memoryStrength,
totalReviews = totalReviews,
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,26 @@ import com.memorati.core.model.UserData.Companion.END
import com.memorati.core.model.UserData.Companion.INTERVAL
import com.memorati.core.model.UserData.Companion.START
import com.memorati.core.model.UserData.Companion.WEEKS
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.datetime.LocalTime
import java.io.IOException
import javax.inject.Inject
import kotlin.time.Duration.Companion.milliseconds

class PreferencesDataSource @Inject constructor(
interface PreferencesDataSource {
val userData: Flow<UserData>
suspend fun setStartTime(time: Int)
suspend fun setEndTime(time: Int)
suspend fun setAlarmInterval(interval: Long)
suspend fun setIdiomLanguageTag(tag: String)
suspend fun setWeekCountOfReview(count: Int)
suspend fun setCorrectnessCount(count: Int)
}

class PreferencesData(
private val userPreferences: DataStore<UserPreferences>,
) {
val userData = userPreferences.data.map { prefs ->
) : PreferencesDataSource {
override val userData = userPreferences.data.map { prefs ->
with(prefs) {
UserData(
idiomLanguageTag = idiomLanguageTag,
Expand All @@ -30,7 +40,7 @@ class PreferencesDataSource @Inject constructor(
}
}

suspend fun setStartTime(time: Int) {
override suspend fun setStartTime(time: Int) {
try {
userPreferences.updateData {
it.copy {
Expand All @@ -42,7 +52,7 @@ class PreferencesDataSource @Inject constructor(
}
}

suspend fun setEndTime(time: Int) {
override suspend fun setEndTime(time: Int) {
try {
userPreferences.updateData {
it.copy {
Expand All @@ -54,7 +64,7 @@ class PreferencesDataSource @Inject constructor(
}
}

suspend fun setAlarmInterval(interval: Long) {
override suspend fun setAlarmInterval(interval: Long) {
try {
userPreferences.updateData {
it.copy {
Expand All @@ -66,7 +76,7 @@ class PreferencesDataSource @Inject constructor(
}
}

suspend fun setIdiomLanguageTag(tag: String) {
override suspend fun setIdiomLanguageTag(tag: String) {
try {
userPreferences.updateData {
it.copy {
Expand All @@ -78,27 +88,35 @@ class PreferencesDataSource @Inject constructor(
}
}

suspend fun setCorrectnessCount(count: Int) {
override suspend fun setCorrectnessCount(count: Int) {
try {
userPreferences.updateData {
it.copy {
wordCorrectnessCount = count
}
}
} catch (ioException: IOException) {
Log.e("PreferencesDataSource", "Failed to update wordCorrectnessCount preferences", ioException)
Log.e(
"PreferencesDataSource",
"Failed to update wordCorrectnessCount preferences",
ioException,
)
}
}

suspend fun setWeekCountOfReview(count: Int) {
override suspend fun setWeekCountOfReview(count: Int) {
try {
userPreferences.updateData {
it.copy {
weeksOfReview = count
}
}
} catch (ioException: IOException) {
Log.e("PreferencesDataSource", "Failed to update weeksOfReview preferences", ioException)
Log.e(
"PreferencesDataSource",
"Failed to update weeksOfReview preferences",
ioException,
)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import androidx.datastore.dataStoreFile
import com.memorati.core.common.di.ApplicationScope
import com.memorati.core.common.dispatcher.Dispatcher
import com.memorati.core.common.dispatcher.MemoratiDispatchers.IO
import com.memorati.core.datastore.PreferencesData
import com.memorati.core.datastore.PreferencesDataSource
import com.memorati.core.datastore.UserPreferences
import com.memorati.core.datastore.UserPreferencesSerializer
import dagger.Module
Expand Down Expand Up @@ -35,4 +37,10 @@ class DatastoreModule {
) {
context.dataStoreFile("user_preferences.pb")
}

@Provides
@Singleton
fun providesUserPreferences(
store: DataStore<UserPreferences>,
): PreferencesDataSource = PreferencesData(store)
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,23 @@ import kotlinx.serialization.EncodeDefault
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@OptIn(ExperimentalSerializationApi::class)
@Serializable
data class AdditionalInfoEntity(
@EncodeDefault
@SerialName("difficulty")
val difficulty: Double = 1.0,

@EncodeDefault
@SerialName("consecutiveCorrectCount")
val consecutiveCorrectCount: Int = 0,

@EncodeDefault
@SerialName("memoryStrength")
val memoryStrength: Double = 1.0,

@EncodeDefault
@SerialName("totalReviews")
val totalReviews: Int = 0,
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.memorati.core.db.model

import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import kotlin.test.Test
Expand All @@ -9,9 +8,16 @@ import kotlin.test.assertEquals
class AdditionalInfoEntityTest {

private val infoString1 = """
{"difficulty":1.0,"consecutiveCorrectCount":0,"memoryStrength":1.0}
{"difficulty":1.0,"consecutiveCorrectCount":0,"memoryStrength":1.0,"totalReviews":0}
""".trimIndent()
private val infoString2 = """
{"difficulty":2.0,"consecutiveCorrectCount":0,"memoryStrength":1.0,"totalReviews":0}
""".trimIndent()

private val infoString1Legacy = """
{"difficulty":1.0,"consecutiveCorrectCount":0,"memoryStrength":1.0}
""".trimIndent()
private val infoString2Legacy = """
{"difficulty":2.0,"consecutiveCorrectCount":0,"memoryStrength":1.0}
""".trimIndent()

Expand Down Expand Up @@ -40,4 +46,17 @@ class AdditionalInfoEntityTest {
Json.decodeFromString(infoString1),
)
}

@Test
fun `Decode string legacy to AdditionalInfoEntity `() {
assertEquals(
AdditionalInfoEntity(difficulty = 2.0),
Json.decodeFromString(infoString2Legacy),
)

assertEquals(
AdditionalInfoEntity(),
Json.decodeFromString(infoString1Legacy),
)
}
}
Loading

0 comments on commit a1fd787

Please sign in to comment.