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

@ -7,7 +7,7 @@
package io.element.android.features.invite.impl
import com.squareup.anvil.annotations.ContributesBinding
import dev.zacsweers.metro.ContributesBinding
import im.vector.app.features.analytics.plan.JoinedRoom
import io.element.android.features.invite.api.SeenInvitesStore
import io.element.android.libraries.core.extensions.mapFailure
@ -19,7 +19,7 @@ import io.element.android.libraries.matrix.api.exception.ClientException
import io.element.android.libraries.matrix.api.exception.ErrorKind
import io.element.android.libraries.matrix.api.room.join.JoinRoom
import io.element.android.libraries.push.api.notifications.NotificationCleaner
import javax.inject.Inject
import dev.zacsweers.metro.Inject
interface AcceptInvite {
suspend operator fun invoke(roomId: RoomId): Result<RoomId>
@ -30,7 +30,8 @@ interface AcceptInvite {
}
@ContributesBinding(SessionScope::class)
class DefaultAcceptInvite @Inject constructor(
@Inject
class DefaultAcceptInvite(
private val client: MatrixClient,
private val joinRoom: JoinRoom,
private val notificationCleaner: NotificationCleaner,

View file

@ -7,13 +7,13 @@
package io.element.android.features.invite.impl
import com.squareup.anvil.annotations.ContributesBinding
import dev.zacsweers.metro.ContributesBinding
import io.element.android.features.invite.api.SeenInvitesStore
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.push.api.notifications.NotificationCleaner
import javax.inject.Inject
import dev.zacsweers.metro.Inject
interface DeclineInvite {
suspend operator fun invoke(
@ -32,7 +32,8 @@ interface DeclineInvite {
}
@ContributesBinding(SessionScope::class)
class DefaultDeclineInvite @Inject constructor(
@Inject
class DefaultDeclineInvite(
private val client: MatrixClient,
private val notificationCleaner: NotificationCleaner,
private val seenInvitesStore: SeenInvitesStore,

View file

@ -8,20 +8,21 @@
package io.element.android.features.invite.impl
import android.content.Context
import com.squareup.anvil.annotations.ContributesBinding
import dev.zacsweers.metro.ContributesBinding
import io.element.android.features.invite.api.SeenInvitesStore
import io.element.android.libraries.di.AppScope
import io.element.android.libraries.di.ApplicationContext
import io.element.android.libraries.di.SingleIn
import dev.zacsweers.metro.AppScope
import io.element.android.libraries.di.annotations.ApplicationContext
import dev.zacsweers.metro.SingleIn
import io.element.android.libraries.matrix.api.core.SessionId
import io.element.android.libraries.sessionstorage.api.observer.SessionObserver
import kotlinx.coroutines.CoroutineScope
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject
import dev.zacsweers.metro.Inject
@SingleIn(AppScope::class)
@ContributesBinding(AppScope::class)
class DefaultSeenInvitesStoreFactory @Inject constructor(
@Inject
class DefaultSeenInvitesStoreFactory(
@ApplicationContext private val context: Context,
private val sessionObserver: SessionObserver,
) : SeenInvitesStoreFactory {

View file

@ -24,9 +24,10 @@ import io.element.android.libraries.architecture.runUpdatingState
import io.element.android.libraries.matrix.api.core.RoomId
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import javax.inject.Inject
import dev.zacsweers.metro.Inject
class AcceptDeclineInvitePresenter @Inject constructor(
@Inject
class AcceptDeclineInvitePresenter(
private val acceptInvite: AcceptInvite,
private val declineInvite: DeclineInvite,
) : Presenter<AcceptDeclineInviteState> {

View file

@ -9,15 +9,16 @@ package io.element.android.features.invite.impl.acceptdecline
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.invite.api.acceptdecline.AcceptDeclineInviteState
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteView
import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.matrix.api.core.RoomId
import javax.inject.Inject
import dev.zacsweers.metro.Inject
@ContributesBinding(SessionScope::class)
class DefaultAcceptDeclineInviteView @Inject constructor() : AcceptDeclineInviteView {
@Inject
class DefaultAcceptDeclineInviteView() : AcceptDeclineInviteView {
@Composable
override fun Render(
state: AcceptDeclineInviteState,

View file

@ -12,8 +12,8 @@ import androidx.compose.ui.Modifier
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.bumble.appyx.core.plugin.Plugin
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.invite.api.InviteData
import io.element.android.libraries.architecture.NodeInputs
@ -21,23 +21,24 @@ import io.element.android.libraries.architecture.inputs
import io.element.android.libraries.di.SessionScope
@ContributesNode(SessionScope::class)
class DeclineAndBlockNode @AssistedInject constructor(
@Inject
class DeclineAndBlockNode(
@Assisted buildContext: BuildContext,
@Assisted plugins: List<Plugin>,
presenterFactory: DeclineAndBlockPresenter.Factory,
// presenterFactory: DeclineAndBlockPresenter.Factory,
) : Node(buildContext, plugins = plugins) {
data class Inputs(val inviteData: InviteData) : NodeInputs
private val inviteData = inputs<Inputs>().inviteData
private val presenter = presenterFactory.create(inviteData)
// private val presenter = presenterFactory.create(inviteData)
@Composable
override fun View(modifier: Modifier) {
val state = presenter.present()
DeclineAndBlockView(
state = state,
onBackClick = ::navigateUp,
modifier = modifier
)
// val state = presenter.present()
// DeclineAndBlockView(
// state = state,
// onBackClick = ::navigateUp,
// modifier = modifier
// )
}
}

View file

@ -15,9 +15,9 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.saveable.rememberSaveable
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.invite.api.InviteData
import io.element.android.features.invite.impl.DeclineInvite
import io.element.android.libraries.architecture.AsyncAction
@ -28,65 +28,66 @@ import io.element.android.libraries.ui.strings.CommonStrings
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
class DeclineAndBlockPresenter @AssistedInject constructor(
@Assisted private val inviteData: InviteData,
private val declineInvite: DeclineInvite,
private val snackbarDispatcher: SnackbarDispatcher,
) : Presenter<DeclineAndBlockState> {
@AssistedFactory
interface Factory {
fun create(inviteData: InviteData): DeclineAndBlockPresenter
}
@Composable
override fun present(): DeclineAndBlockState {
var reportReason by rememberSaveable { mutableStateOf("") }
var blockUser by rememberSaveable { mutableStateOf(true) }
var reportRoom by rememberSaveable { mutableStateOf(false) }
val declineAction: MutableState<AsyncAction<Unit>> = remember { mutableStateOf(AsyncAction.Uninitialized) }
val coroutineScope = rememberCoroutineScope()
fun handleEvents(event: DeclineAndBlockEvents) {
when (event) {
DeclineAndBlockEvents.ClearDeclineAction -> declineAction.value = AsyncAction.Uninitialized
DeclineAndBlockEvents.Decline -> coroutineScope.decline(reportReason, blockUser, reportRoom, declineAction)
DeclineAndBlockEvents.ToggleBlockUser -> blockUser = !blockUser
DeclineAndBlockEvents.ToggleReportRoom -> reportRoom = !reportRoom
is DeclineAndBlockEvents.UpdateReportReason -> reportReason = event.reason
}
}
return DeclineAndBlockState(
reportRoom = reportRoom,
reportReason = reportReason,
blockUser = blockUser,
declineAction = declineAction.value,
eventSink = ::handleEvents
)
}
private fun CoroutineScope.decline(
reason: String,
blockUser: Boolean,
reportRoom: Boolean,
action: MutableState<AsyncAction<Unit>>
) = launch {
action.value = AsyncAction.Loading
declineInvite(
roomId = inviteData.roomId,
blockUser = blockUser,
reportRoom = reportRoom,
reportReason = reason
).onSuccess {
action.value = AsyncAction.Success(Unit)
}.onFailure { error ->
if (error is DeclineInvite.Exception.DeclineInviteFailed) {
action.value = AsyncAction.Failure(error)
} else {
action.value = AsyncAction.Uninitialized
snackbarDispatcher.post(SnackbarMessage(CommonStrings.error_unknown))
}
}
}
}
//@Inject
//class DeclineAndBlockPresenter(
// @Assisted private val inviteData: InviteData,
// private val declineInvite: DeclineInvite,
// private val snackbarDispatcher: SnackbarDispatcher,
//) : Presenter<DeclineAndBlockState> {
// @AssistedFactory
// interface Factory {
// fun create(inviteData: InviteData): DeclineAndBlockPresenter
// }
//
// @Composable
// override fun present(): DeclineAndBlockState {
// var reportReason by rememberSaveable { mutableStateOf("") }
// var blockUser by rememberSaveable { mutableStateOf(true) }
// var reportRoom by rememberSaveable { mutableStateOf(false) }
// val declineAction: MutableState<AsyncAction<Unit>> = remember { mutableStateOf(AsyncAction.Uninitialized) }
//
// val coroutineScope = rememberCoroutineScope()
//
// fun handleEvents(event: DeclineAndBlockEvents) {
// when (event) {
// DeclineAndBlockEvents.ClearDeclineAction -> declineAction.value = AsyncAction.Uninitialized
// DeclineAndBlockEvents.Decline -> coroutineScope.decline(reportReason, blockUser, reportRoom, declineAction)
// DeclineAndBlockEvents.ToggleBlockUser -> blockUser = !blockUser
// DeclineAndBlockEvents.ToggleReportRoom -> reportRoom = !reportRoom
// is DeclineAndBlockEvents.UpdateReportReason -> reportReason = event.reason
// }
// }
//
// return DeclineAndBlockState(
// reportRoom = reportRoom,
// reportReason = reportReason,
// blockUser = blockUser,
// declineAction = declineAction.value,
// eventSink = ::handleEvents
// )
// }
//
// private fun CoroutineScope.decline(
// reason: String,
// blockUser: Boolean,
// reportRoom: Boolean,
// action: MutableState<AsyncAction<Unit>>
// ) = launch {
// action.value = AsyncAction.Loading
// declineInvite(
// roomId = inviteData.roomId,
// blockUser = blockUser,
// reportRoom = reportRoom,
// reportReason = reason
// ).onSuccess {
// action.value = AsyncAction.Success(Unit)
// }.onFailure { error ->
// if (error is DeclineInvite.Exception.DeclineInviteFailed) {
// action.value = AsyncAction.Failure(error)
// } else {
// action.value = AsyncAction.Uninitialized
// snackbarDispatcher.post(SnackbarMessage(CommonStrings.error_unknown))
// }
// }
// }
//}

View file

@ -9,15 +9,16 @@ package io.element.android.features.invite.impl.declineandblock
import com.bumble.appyx.core.modality.BuildContext
import com.bumble.appyx.core.node.Node
import com.squareup.anvil.annotations.ContributesBinding
import dev.zacsweers.metro.ContributesBinding
import io.element.android.features.invite.api.InviteData
import io.element.android.features.invite.api.declineandblock.DeclineInviteAndBlockEntryPoint
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 DefaultDeclineAndBlockEntryPoint @Inject constructor() : DeclineInviteAndBlockEntryPoint {
@Inject
class DefaultDeclineAndBlockEntryPoint() : DeclineInviteAndBlockEntryPoint {
override fun createNode(parentNode: Node, buildContext: BuildContext, inviteData: InviteData): Node {
val inputs = DeclineAndBlockNode.Inputs(inviteData)
return parentNode.createNode<DeclineAndBlockNode>(buildContext, plugins = listOf(inputs))

View file

@ -7,10 +7,10 @@
package io.element.android.features.invite.impl.di
import com.squareup.anvil.annotations.ContributesTo
import dagger.Binds
import dagger.Module
import dagger.Provides
import dev.zacsweers.metro.Binds
import dev.zacsweers.metro.BindingContainer
import dev.zacsweers.metro.ContributesTo
import dev.zacsweers.metro.Provides
import io.element.android.features.invite.api.SeenInvitesStore
import io.element.android.features.invite.api.acceptdecline.AcceptDeclineInviteState
import io.element.android.features.invite.impl.SeenInvitesStoreFactory
@ -20,7 +20,7 @@ import io.element.android.libraries.di.SessionScope
import io.element.android.libraries.matrix.api.MatrixClient
@ContributesTo(SessionScope::class)
@Module
@BindingContainer
interface InviteModule {
@Binds
fun bindAcceptDeclinePresenter(presenter: AcceptDeclineInvitePresenter): Presenter<AcceptDeclineInviteState>