@@ -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)
|
||||
}
|
||||
|
||||
+10
@@ -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)
|
||||
}
|
||||
+13
-9
@@ -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?>> {
|
||||
|
||||
+1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user