Skip to content

Commit df384f6

Browse files
committed
Add isFreshInstall Boolean to allow the miration to behave in a different way for an application upgrade or a fresh install.
We cannot restore the previous code which existed because of #3535
1 parent 58fca2e commit df384f6

File tree

17 files changed

+35
-26
lines changed

17 files changed

+35
-26
lines changed

features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class MigrationPresenter(
3131
) : Presenter<MigrationState> {
3232
private val orderedMigrations = migrations.sortedBy { it.order }
3333
private val lastMigration: Int = orderedMigrations.lastOrNull()?.order ?: 0
34+
private var isFreshInstall = false
3435

3536
@Composable
3637
override fun present(): MigrationState {
@@ -49,6 +50,7 @@ class MigrationPresenter(
4950
val migrationValue = migrationStoreVersion ?: return@LaunchedEffect
5051
if (migrationValue == -1) {
5152
Timber.d("Fresh install, or previous installed application did not have the migration mechanism.")
53+
isFreshInstall = true
5254
}
5355
if (migrationValue == lastMigration) {
5456
Timber.d("Current app migration version: $migrationValue. No migration needed.")
@@ -59,7 +61,7 @@ class MigrationPresenter(
5961
val nextMigration = orderedMigrations.firstOrNull { it.order > migrationValue }
6062
if (nextMigration != null) {
6163
Timber.d("Current app migration version: $migrationValue. Applying migration: ${nextMigration.order}")
62-
nextMigration.migrate()
64+
nextMigration.migrate(isFreshInstall)
6365
migrationStore.setApplicationMigrationVersion(nextMigration.order)
6466
}
6567
}

features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ package io.element.android.features.migration.impl.migrations
99

1010
interface AppMigration {
1111
val order: Int
12-
suspend fun migrate()
12+
suspend fun migrate(isFreshInstall: Boolean)
1313
}

features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class AppMigration01(
2222
) : AppMigration {
2323
override val order: Int = 1
2424

25-
override suspend fun migrate() {
25+
override suspend fun migrate(isFreshInstall: Boolean) {
2626
logFilesRemover.perform()
2727
}
2828
}

features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class AppMigration02(
2727
) : AppMigration {
2828
override val order: Int = 2
2929

30-
override suspend fun migrate() {
30+
override suspend fun migrate(isFreshInstall: Boolean) {
3131
coroutineScope {
3232
for (session in sessionStore.getAllSessions()) {
3333
val sessionId = SessionId(session.userId)

features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class AppMigration03(
2121
) : AppMigration {
2222
override val order: Int = 3
2323

24-
override suspend fun migrate() {
25-
migration01.migrate()
24+
override suspend fun migrate(isFreshInstall: Boolean) {
25+
migration01.migrate(isFreshInstall)
2626
}
2727
}

features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration04.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class AppMigration04(
2727
}
2828
override val order: Int = 4
2929

30-
override suspend fun migrate() {
30+
override suspend fun migrate(isFreshInstall: Boolean) {
3131
runCatchingExceptions { context.getDatabasePath(NOTIFICATION_FILE_NAME).delete() }
3232
}
3333
}

features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration05.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class AppMigration05(
2222
) : AppMigration {
2323
override val order: Int = 5
2424

25-
override suspend fun migrate() {
25+
override suspend fun migrate(isFreshInstall: Boolean) {
2626
val allSessions = sessionStore.getAllSessions()
2727
for (session in allSessions) {
2828
if (session.sessionPath.isEmpty()) {

features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration06.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class AppMigration06(
2525
) : AppMigration {
2626
override val order: Int = 6
2727

28-
override suspend fun migrate() {
28+
override suspend fun migrate(isFreshInstall: Boolean) {
2929
val allSessions = sessionStore.getAllSessions()
3030
for (session in allSessions) {
3131
if (session.cachePath.isEmpty()) {

features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration07.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class AppMigration07(
2222
) : AppMigration {
2323
override val order: Int = 7
2424

25-
override suspend fun migrate() {
25+
override suspend fun migrate(isFreshInstall: Boolean) {
2626
logFilesRemover.perform { file ->
2727
file.name.startsWith("logs-")
2828
}

features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/MigrationPresenterTest.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ import io.element.android.features.migration.impl.migrations.AppMigration
1515
import io.element.android.libraries.architecture.AsyncData
1616
import io.element.android.tests.testutils.WarmUpRule
1717
import io.element.android.tests.testutils.consumeItemsUntilPredicate
18-
import io.element.android.tests.testutils.lambda.LambdaNoParamRecorder
18+
import io.element.android.tests.testutils.lambda.LambdaOneParamRecorder
19+
import io.element.android.tests.testutils.lambda.lambdaError
1920
import io.element.android.tests.testutils.lambda.lambdaRecorder
21+
import io.element.android.tests.testutils.lambda.value
2022
import kotlinx.coroutines.flow.first
2123
import kotlinx.coroutines.test.runTest
2224
import org.junit.Rule
@@ -48,13 +50,18 @@ class MigrationPresenterTest {
4850
assertThat(store.applicationMigrationVersion().first()).isEqualTo(migrations.maxOf { it.order })
4951
}
5052
for (migration in migrations) {
51-
migration.migrateLambda.assertions().isCalledOnce()
53+
migration.migrateLambda.assertions().isCalledOnce().with(value(true))
5254
}
5355
}
5456

5557
@Test
5658
fun `present - no migration should occurs if ApplicationMigrationVersion is the last one`() = runTest {
57-
val migrations = (1..10).map { FakeAppMigration(it) }
59+
val migrations = (1..10).map {
60+
FakeAppMigration(
61+
order = it,
62+
migrateLambda = lambdaRecorder<Boolean, Unit> { lambdaError() },
63+
)
64+
}
5865
val store = InMemoryMigrationStore(migrations.maxOf { it.order })
5966
val presenter = createPresenter(
6067
migrationStore = store,
@@ -90,7 +97,7 @@ class MigrationPresenterTest {
9097
consumeItemsUntilPredicate { it.migrationAction is AsyncData.Success }
9198
assertThat(store.applicationMigrationVersion().first()).isEqualTo(migrations.maxOf { it.order })
9299
for (migration in migrations) {
93-
migration.migrateLambda.assertions().isCalledOnce()
100+
migration.migrateLambda.assertions().isCalledOnce().with(value(false))
94101
}
95102
}
96103
}
@@ -106,9 +113,9 @@ private fun createPresenter(
106113

107114
private class FakeAppMigration(
108115
override val order: Int,
109-
val migrateLambda: LambdaNoParamRecorder<Unit> = lambdaRecorder { -> },
116+
val migrateLambda: LambdaOneParamRecorder<Boolean, Unit> = lambdaRecorder<Boolean, Unit> { },
110117
) : AppMigration {
111-
override suspend fun migrate() {
112-
migrateLambda()
118+
override suspend fun migrate(isFreshInstall: Boolean) {
119+
migrateLambda(isFreshInstall)
113120
}
114121
}

0 commit comments

Comments
 (0)