Start migrating Anvil KSP to Metro

This commit is contained in:
Jorge Martín
2025-08-20 15:29:50 +02:00
parent 2eacce47c0
commit 92a4b8b66b
703 changed files with 3523 additions and 2820 deletions

View File

@@ -9,14 +9,15 @@ package io.element.android.features.migration.impl
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.squareup.anvil.annotations.ContributesBinding
import dev.zacsweers.metro.ContributesBinding
import io.element.android.features.api.MigrationEntryPoint
import io.element.android.features.api.MigrationState
import io.element.android.libraries.di.AppScope
import javax.inject.Inject
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.Inject
@ContributesBinding(AppScope::class)
class DefaultMigrationEntryPoint @Inject constructor(
@Inject
class DefaultMigrationEntryPoint(
private val migrationPresenter: MigrationPresenter,
) : MigrationEntryPoint {
@Composable

View File

@@ -9,17 +9,18 @@ package io.element.android.features.migration.impl
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.intPreferencesKey
import com.squareup.anvil.annotations.ContributesBinding
import io.element.android.libraries.di.AppScope
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesBinding
import dev.zacsweers.metro.Inject
import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import javax.inject.Inject
private val applicationMigrationVersion = intPreferencesKey("applicationMigrationVersion")
@ContributesBinding(AppScope::class)
class DefaultMigrationStore @Inject constructor(
@Inject
class DefaultMigrationStore(
preferenceDataStoreFactory: PreferenceDataStoreFactory,
) : MigrationStore {
private val store = preferenceDataStoreFactory.create("elementx_migration")

View File

@@ -18,13 +18,14 @@ import io.element.android.features.api.MigrationState
import io.element.android.features.migration.impl.migrations.AppMigration
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.SingleIn
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.SingleIn
import timber.log.Timber
import javax.inject.Inject
import dev.zacsweers.metro.Inject
@SingleIn(AppScope::class)
class MigrationPresenter @Inject constructor(
@Inject
class MigrationPresenter(
private val migrationStore: MigrationStore,
migrations: Set<@JvmSuppressWildcards AppMigration>,
) : Presenter<MigrationState> {

View File

@@ -7,16 +7,17 @@
package io.element.android.features.migration.impl.migrations
import com.squareup.anvil.annotations.ContributesMultibinding
import dev.zacsweers.metro.ContributesIntoSet
import dev.zacsweers.metro.Inject
import io.element.android.features.rageshake.api.logs.LogFilesRemover
import io.element.android.libraries.di.AppScope
import javax.inject.Inject
import dev.zacsweers.metro.AppScope
/**
* Remove existing logs from the device to remove any leaks of sensitive data.
*/
@ContributesMultibinding(AppScope::class)
class AppMigration01 @Inject constructor(
@ContributesIntoSet(AppScope::class)
@Inject
class AppMigration01(
private val logFilesRemover: LogFilesRemover,
) : AppMigration {
override val order: Int = 1

View File

@@ -7,20 +7,21 @@
package io.element.android.features.migration.impl.migrations
import com.squareup.anvil.annotations.ContributesMultibinding
import io.element.android.libraries.di.AppScope
import dev.zacsweers.metro.ContributesIntoSet
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.AppScope
import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.preferences.api.store.SessionPreferencesStoreFactory
import io.element.android.libraries.sessionstorage.api.SessionStore
import kotlinx.coroutines.coroutineScope
import javax.inject.Inject
/**
* This migration sets the skip session verification preference to true for all existing sessions.
* This way we don't force existing users to verify their session again.
*/
@ContributesMultibinding(AppScope::class)
class AppMigration02 @Inject constructor(
@ContributesIntoSet(AppScope::class)
@Inject
class AppMigration02(
private val sessionStore: SessionStore,
private val sessionPreferenceStoreFactory: SessionPreferencesStoreFactory,
) : AppMigration {

View File

@@ -7,15 +7,16 @@
package io.element.android.features.migration.impl.migrations
import com.squareup.anvil.annotations.ContributesMultibinding
import io.element.android.libraries.di.AppScope
import javax.inject.Inject
import dev.zacsweers.metro.ContributesIntoSet
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.AppScope
/**
* This performs the same operation as [AppMigration01], since we need to clear the local logs again.
*/
@ContributesMultibinding(AppScope::class)
class AppMigration03 @Inject constructor(
@ContributesIntoSet(AppScope::class)
@Inject
class AppMigration03(
private val migration01: AppMigration01,
) : AppMigration {
override val order: Int = 3

View File

@@ -8,17 +8,18 @@
package io.element.android.features.migration.impl.migrations
import android.content.Context
import com.squareup.anvil.annotations.ContributesMultibinding
import dev.zacsweers.metro.ContributesIntoSet
import dev.zacsweers.metro.Inject
import io.element.android.libraries.core.extensions.runCatchingExceptions
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.ApplicationContext
import javax.inject.Inject
import dev.zacsweers.metro.AppScope
import io.element.android.libraries.di.annotations.ApplicationContext
/**
* Remove notifications.bin file, used to store notification data locally.
*/
@ContributesMultibinding(AppScope::class)
class AppMigration04 @Inject constructor(
@ContributesIntoSet(AppScope::class)
@Inject
class AppMigration04(
@ApplicationContext private val context: Context,
) : AppMigration {
companion object {

View File

@@ -7,16 +7,19 @@
package io.element.android.features.migration.impl.migrations
import com.squareup.anvil.annotations.ContributesMultibinding
import io.element.android.libraries.di.AppScope
import dev.zacsweers.metro.ContributesIntoSet
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.Named
import dev.zacsweers.metro.AppScope
import io.element.android.libraries.di.BaseDirectory
import io.element.android.libraries.sessionstorage.api.SessionStore
import java.io.File
import javax.inject.Inject
@ContributesMultibinding(AppScope::class)
class AppMigration05 @Inject constructor(
@ContributesIntoSet(AppScope::class)
@Inject
class AppMigration05(
private val sessionStore: SessionStore,
private val baseDirectory: File,
@Named("baseDirectory") private val baseDirectory: File,
) : AppMigration {
override val order: Int = 5

View File

@@ -7,20 +7,22 @@
package io.element.android.features.migration.impl.migrations
import com.squareup.anvil.annotations.ContributesMultibinding
import io.element.android.libraries.di.AppScope
import dev.zacsweers.metro.ContributesIntoSet
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.Named
import dev.zacsweers.metro.AppScope
import io.element.android.libraries.di.CacheDirectory
import io.element.android.libraries.sessionstorage.api.SessionStore
import java.io.File
import javax.inject.Inject
/**
* Create the cache directory for the existing sessions.
*/
@ContributesMultibinding(AppScope::class)
class AppMigration06 @Inject constructor(
@ContributesIntoSet(AppScope::class)
@Inject
class AppMigration06(
private val sessionStore: SessionStore,
@CacheDirectory private val cacheDirectory: File,
@Named("cacheDirectory") private val cacheDirectory: File,
) : AppMigration {
override val order: Int = 6

View File

@@ -7,16 +7,17 @@
package io.element.android.features.migration.impl.migrations
import com.squareup.anvil.annotations.ContributesMultibinding
import dev.zacsweers.metro.ContributesIntoSet
import dev.zacsweers.metro.Inject
import io.element.android.features.rageshake.api.logs.LogFilesRemover
import io.element.android.libraries.di.AppScope
import javax.inject.Inject
import dev.zacsweers.metro.AppScope
/**
* Delete the previous log files.
*/
@ContributesMultibinding(AppScope::class)
class AppMigration07 @Inject constructor(
@ContributesIntoSet(AppScope::class)
@Inject
class AppMigration07(
private val logFilesRemover: LogFilesRemover,
) : AppMigration {
override val order: Int = 7