Start migrating Anvil KSP to Metro

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

View file

@ -9,16 +9,17 @@ package io.element.android.features.viewfolder.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.viewfolder.api.TextFileViewer
import io.element.android.features.viewfolder.impl.file.ColorationMode
import io.element.android.features.viewfolder.impl.file.FileContent
import io.element.android.libraries.di.AppScope
import dev.zacsweers.metro.AppScope
import kotlinx.collections.immutable.ImmutableList
import javax.inject.Inject
import dev.zacsweers.metro.Inject
@ContributesBinding(AppScope::class)
class DefaultTextFileViewer @Inject constructor() : TextFileViewer {
@Inject
class DefaultTextFileViewer() : TextFileViewer {
@Composable
override fun Render(
lines: ImmutableList<String>,

View file

@ -10,15 +10,16 @@ package io.element.android.features.viewfolder.impl
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
import com.squareup.anvil.annotations.ContributesBinding
import dev.zacsweers.metro.ContributesBinding
import io.element.android.features.viewfolder.api.ViewFolderEntryPoint
import io.element.android.features.viewfolder.impl.root.ViewFolderRootNode
import io.element.android.libraries.architecture.createNode
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 DefaultViewFolderEntryPoint @Inject constructor() : ViewFolderEntryPoint {
@Inject
class DefaultViewFolderEntryPoint() : ViewFolderEntryPoint {
override fun nodeBuilder(parentNode: Node, buildContext: BuildContext): ViewFolderEntryPoint.NodeBuilder {
val plugins = ArrayList<Plugin>()

View file

@ -7,20 +7,21 @@
package io.element.android.features.viewfolder.impl.file
import com.squareup.anvil.annotations.ContributesBinding
import dev.zacsweers.metro.ContributesBinding
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.core.extensions.runCatchingExceptions
import io.element.android.libraries.di.AppScope
import dev.zacsweers.metro.AppScope
import kotlinx.coroutines.withContext
import java.io.File
import javax.inject.Inject
import dev.zacsweers.metro.Inject
interface FileContentReader {
suspend fun getLines(path: String): Result<List<String>>
}
@ContributesBinding(AppScope::class)
class DefaultFileContentReader @Inject constructor(
@Inject
class DefaultFileContentReader(
private val dispatchers: CoroutineDispatchers,
) : FileContentReader {
override suspend fun getLines(path: String): Result<List<String>> = withContext(dispatchers.io) {

View file

@ -13,18 +13,18 @@ import android.os.Build
import android.os.Environment
import android.provider.MediaStore
import androidx.annotation.RequiresApi
import com.squareup.anvil.annotations.ContributesBinding
import dev.zacsweers.metro.ContributesBinding
import io.element.android.libraries.androidutils.system.toast
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.core.extensions.runCatchingExceptions
import io.element.android.libraries.core.mimetype.MimeTypes
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.ApplicationContext
import dev.zacsweers.metro.AppScope
import io.element.android.libraries.di.annotations.ApplicationContext
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.io.File
import java.io.FileOutputStream
import javax.inject.Inject
import dev.zacsweers.metro.Inject
interface FileSave {
suspend fun save(
@ -33,7 +33,8 @@ interface FileSave {
}
@ContributesBinding(AppScope::class)
class DefaultFileSave @Inject constructor(
@Inject
class DefaultFileSave(
@ApplicationContext private val context: Context,
private val dispatchers: CoroutineDispatchers,
) : FileSave {

View file

@ -11,17 +11,17 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.core.content.FileProvider
import com.squareup.anvil.annotations.ContributesBinding
import dev.zacsweers.metro.ContributesBinding
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.core.extensions.runCatchingExceptions
import io.element.android.libraries.core.meta.BuildMeta
import io.element.android.libraries.core.mimetype.MimeTypes
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.ApplicationContext
import dev.zacsweers.metro.AppScope
import io.element.android.libraries.di.annotations.ApplicationContext
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.io.File
import javax.inject.Inject
import dev.zacsweers.metro.Inject
interface FileShare {
suspend fun share(
@ -30,7 +30,8 @@ interface FileShare {
}
@ContributesBinding(AppScope::class)
class DefaultFileShare @Inject constructor(
@Inject
class DefaultFileShare(
@ApplicationContext private val context: Context,
private val dispatchers: CoroutineDispatchers,
private val buildMeta: BuildMeta,

View file

@ -13,15 +13,16 @@ import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
import com.bumble.appyx.core.plugin.plugins
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.Inject
import io.element.android.anvilannotations.ContributesNode
import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.di.AppScope
import dev.zacsweers.metro.AppScope
@ContributesNode(AppScope::class)
class ViewFileNode @AssistedInject constructor(
@Inject
class ViewFileNode(
@Assisted buildContext: BuildContext,
@Assisted plugins: List<Plugin>,
presenterFactory: ViewFilePresenter.Factory,

View file

@ -14,15 +14,16 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedFactory
import dev.zacsweers.metro.Inject
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.architecture.Presenter
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
class ViewFilePresenter @AssistedInject constructor(
@Inject
class ViewFilePresenter(
@Assisted("path") val path: String,
@Assisted("name") val name: String,
private val fileContentReader: FileContentReader,

View file

@ -7,21 +7,22 @@
package io.element.android.features.viewfolder.impl.folder
import com.squareup.anvil.annotations.ContributesBinding
import dev.zacsweers.metro.ContributesBinding
import io.element.android.features.viewfolder.impl.model.Item
import io.element.android.libraries.androidutils.filesize.FileSizeFormatter
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
import io.element.android.libraries.di.AppScope
import dev.zacsweers.metro.AppScope
import kotlinx.coroutines.withContext
import java.io.File
import javax.inject.Inject
import dev.zacsweers.metro.Inject
interface FolderExplorer {
suspend fun getItems(path: String): List<Item>
}
@ContributesBinding(AppScope::class)
class DefaultFolderExplorer @Inject constructor(
@Inject
class DefaultFolderExplorer(
private val fileSizeFormatter: FileSizeFormatter,
private val dispatchers: CoroutineDispatchers,
) : FolderExplorer {

View file

@ -13,19 +13,20 @@ import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
import com.bumble.appyx.core.plugin.plugins
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.Inject
import io.element.android.anvilannotations.ContributesNode
import io.element.android.features.viewfolder.impl.model.Item
import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.di.AppScope
import dev.zacsweers.metro.AppScope
@ContributesNode(AppScope::class)
class ViewFolderNode @AssistedInject constructor(
@Inject
class ViewFolderNode(
@Assisted buildContext: BuildContext,
@Assisted plugins: List<Plugin>,
presenterFactory: ViewFolderPresenter.Factory,
// presenterFactory: ViewFolderPresenter.Factory,
) : Node(buildContext, plugins = plugins) {
data class Inputs(
val canGoUp: Boolean,
@ -39,10 +40,10 @@ class ViewFolderNode @AssistedInject constructor(
private val inputs: Inputs = inputs()
private val presenter = presenterFactory.create(
canGoUp = inputs.canGoUp,
path = inputs.path,
)
// private val presenter = presenterFactory.create(
// canGoUp = inputs.canGoUp,
// path = inputs.path,
// )
private fun onBackClick() {
plugins<Callback>().forEach { it.onBackClick() }
@ -54,12 +55,12 @@ class ViewFolderNode @AssistedInject constructor(
@Composable
override fun View(modifier: Modifier) {
val state = presenter.present()
ViewFolderView(
state = state,
modifier = modifier,
onNavigateTo = ::onNavigateTo,
onBackClick = ::onBackClick,
)
// val state = presenter.present()
// ViewFolderView(
// state = state,
// modifier = modifier,
// onNavigateTo = ::onNavigateTo,
// onBackClick = ::onBackClick,
// )
}
}

View file

@ -13,35 +13,36 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedFactory
import dev.zacsweers.metro.Inject
import io.element.android.features.viewfolder.impl.model.Item
import io.element.android.libraries.architecture.Presenter
import kotlinx.collections.immutable.toImmutableList
class ViewFolderPresenter @AssistedInject constructor(
@Assisted val canGoUp: Boolean,
@Assisted val path: String,
private val folderExplorer: FolderExplorer,
) : Presenter<ViewFolderState> {
@AssistedFactory
interface Factory {
fun create(canGoUp: Boolean, path: String): ViewFolderPresenter
}
@Composable
override fun present(): ViewFolderState {
var content by remember { mutableStateOf(emptyList<Item>()) }
LaunchedEffect(Unit) {
content = buildList {
if (canGoUp) add(Item.Parent)
addAll(folderExplorer.getItems(path))
}
}
return ViewFolderState(
path = path,
content = content.toImmutableList(),
)
}
}
//@Inject
//class ViewFolderPresenter(
// @Assisted val canGoUp: Boolean,
// @Assisted val path: String,
// private val folderExplorer: FolderExplorer,
//) : Presenter<ViewFolderState> {
// @AssistedFactory
// interface Factory {
// fun create(canGoUp: Boolean, path: String): ViewFolderPresenter
// }
//
// @Composable
// override fun present(): ViewFolderState {
// var content by remember { mutableStateOf(emptyList<Item>()) }
// LaunchedEffect(Unit) {
// content = buildList {
// if (canGoUp) add(Item.Parent)
// addAll(folderExplorer.getItems(path))
// }
// }
// return ViewFolderState(
// path = path,
// content = content.toImmutableList(),
// )
// }
//}

View file

@ -17,8 +17,8 @@ import com.bumble.appyx.core.plugin.plugins
import com.bumble.appyx.navmodel.backstack.BackStack
import com.bumble.appyx.navmodel.backstack.operation.pop
import com.bumble.appyx.navmodel.backstack.operation.push
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.Inject
import io.element.android.anvilannotations.ContributesNode
import io.element.android.features.viewfolder.api.ViewFolderEntryPoint
import io.element.android.features.viewfolder.impl.file.ViewFileNode
@ -29,11 +29,12 @@ import io.element.android.libraries.architecture.BaseFlowNode
import io.element.android.libraries.architecture.NodeInputs
import io.element.android.libraries.architecture.createNode
import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.di.AppScope
import dev.zacsweers.metro.AppScope
import kotlinx.parcelize.Parcelize
@ContributesNode(AppScope::class)
class ViewFolderRootNode @AssistedInject constructor(
@Inject
class ViewFolderRootNode(
@Assisted buildContext: BuildContext,
@Assisted plugins: List<Plugin>,
) : BaseFlowNode<ViewFolderRootNode.NavTarget>(