Migrate to Metro DI (#3608)

Assisted-by: Claude:claude-opus-5
This commit is contained in:
AntsyLich
2026-08-17 00:47:48 +06:00
committed by GitHub
parent 1e5b1dc5e7
commit b2015d1ef3
314 changed files with 2416 additions and 2010 deletions
+4 -2
View File
@@ -3,6 +3,7 @@ plugins {
alias(mihonx.plugins.compose)
alias(mihonx.plugins.spotless)
alias(libs.plugins.metro)
}
android {
@@ -11,9 +12,10 @@ android {
dependencies {
implementation(projects.core.common)
implementation(projects.core.metro)
implementation(projects.domain)
implementation(projects.presentationCore)
api(projects.i18n)
implementation(projects.i18n)
implementation(libs.androidx.glance.appWidget)
implementation(libs.material)
@@ -22,5 +24,5 @@ dependencies {
implementation(libs.coil.core)
api(libs.injekt)
implementation(libs.metro.runtime)
}
@@ -0,0 +1,10 @@
package mihon.presentation.widget.di
import dev.zacsweers.metro.AppScope
import dev.zacsweers.metro.ContributesTo
import tachiyomi.presentation.widget.BaseUpdatesGridGlanceWidget
@ContributesTo(AppScope::class)
interface PresentationWidgetGraph {
fun inject(widget: BaseUpdatesGridGlanceWidget)
}
@@ -1,6 +1,5 @@
package tachiyomi.presentation.widget
import android.app.Application
import android.content.Context
import android.graphics.Bitmap
import android.os.Build
@@ -31,12 +30,16 @@ import coil3.request.transformations
import coil3.size.Precision
import coil3.size.Scale
import coil3.transform.RoundedCornersTransformation
import dev.zacsweers.metro.HasMemberInjections
import dev.zacsweers.metro.Inject
import eu.kanade.tachiyomi.core.security.SecurityPreferences
import eu.kanade.tachiyomi.util.system.dpToPx
import kotlinx.coroutines.flow.map
import kotlinx.datetime.DateTimeUnit
import kotlinx.datetime.TimeZone
import kotlinx.datetime.minus
import mihon.core.metro.metroGraph
import mihon.presentation.widget.di.PresentationWidgetGraph
import tachiyomi.core.common.util.lang.withIOContext
import tachiyomi.domain.manga.model.MangaCover
import tachiyomi.domain.updates.interactor.GetUpdates
@@ -47,16 +50,15 @@ import tachiyomi.presentation.widget.components.LockedWidget
import tachiyomi.presentation.widget.components.UpdatesWidget
import tachiyomi.presentation.widget.util.appWidgetBackgroundRadius
import tachiyomi.presentation.widget.util.calculateRowAndColumnCount
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import kotlin.time.Clock
import kotlin.time.Instant
abstract class BaseUpdatesGridGlanceWidget(
private val context: Context = Injekt.get<Application>(),
private val getUpdates: GetUpdates = Injekt.get(),
private val preferences: SecurityPreferences = Injekt.get(),
) : GlanceAppWidget() {
@HasMemberInjections
abstract class BaseUpdatesGridGlanceWidget : GlanceAppWidget() {
@Inject private lateinit var getUpdates: GetUpdates
@Inject private lateinit var preferences: SecurityPreferences
override val sizeMode = SizeMode.Exact
@@ -66,6 +68,7 @@ abstract class BaseUpdatesGridGlanceWidget(
abstract val bottomPadding: Dp
override suspend fun provideGlance(context: Context, id: GlanceId) {
context.metroGraph<PresentationWidgetGraph>().inject(this)
val locked = preferences.useAuthenticator.get()
val containerModifier = GlanceModifier
.fillMaxSize()
@@ -95,7 +98,7 @@ abstract class BaseUpdatesGridGlanceWidget(
getUpdates
.subscribe(false, DateLimit.toEpochMilliseconds())
.map { rawData ->
rawData.prepareData(rowCount, columnCount)
rawData.prepareData(context, rowCount, columnCount)
}
}
val data by flow.collectAsState(initial = null)
@@ -111,6 +114,7 @@ abstract class BaseUpdatesGridGlanceWidget(
@OptIn(ExperimentalCoilApi::class)
private suspend fun List<UpdatesWithRelations>.prepareData(
context: Context,
rowCount: Int,
columnCount: Int,
): List<Pair<Long, Bitmap?>> {
@@ -4,6 +4,7 @@ import androidx.glance.appwidget.GlanceAppWidget
import androidx.glance.appwidget.GlanceAppWidgetReceiver
class UpdatesGridGlanceReceiver : GlanceAppWidgetReceiver() {
override val glanceAppWidget: GlanceAppWidget
get() = UpdatesGridGlanceWidget()
}
@@ -3,6 +3,7 @@ package tachiyomi.presentation.widget
import android.content.Context
import androidx.glance.appwidget.updateAll
import androidx.lifecycle.LifecycleCoroutineScope
import dev.zacsweers.metro.Inject
import eu.kanade.tachiyomi.core.security.SecurityPreferences
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.combine
@@ -14,12 +15,14 @@ import logcat.LogPriority
import tachiyomi.core.common.util.system.logcat
import tachiyomi.domain.updates.interactor.GetUpdates
@Inject
class WidgetManager(
private val getUpdates: GetUpdates,
private val securityPreferences: SecurityPreferences,
) {
fun Context.init(scope: LifecycleCoroutineScope) {
context(context: Context)
fun init(scope: LifecycleCoroutineScope) {
combine(
getUpdates.subscribe(read = false, after = BaseUpdatesGridGlanceWidget.DateLimit.toEpochMilliseconds()),
securityPreferences.useAuthenticator.changes(),
@@ -31,10 +34,10 @@ class WidgetManager(
}
.onEach {
try {
UpdatesGridGlanceWidget().updateAll(this)
UpdatesGridCoverScreenGlanceWidget().updateAll(this)
UpdatesGridGlanceWidget().updateAll(context)
UpdatesGridCoverScreenGlanceWidget().updateAll(context)
} catch (e: Exception) {
logcat(LogPriority.ERROR, e) { "Failed to update widget" }
this.logcat(LogPriority.ERROR, e) { "Failed to update widget" }
}
}
.flowOn(Dispatchers.Default)