chore: Some more effort moving widget to its own module

This commit is contained in:
Ahmad Ansori Palembani 2024-06-17 13:21:27 +07:00
parent 79b5494307
commit 4a9a7813e0
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
34 changed files with 205 additions and 64 deletions

View file

@ -155,7 +155,9 @@ android {
dependencies { dependencies {
implementation(projects.core) implementation(projects.core)
implementation(projects.data)
implementation(projects.i18n) implementation(projects.i18n)
implementation(projects.presentation.core)
implementation(projects.sourceApi) implementation(projects.sourceApi)
// Compose // Compose

View file

@ -141,6 +141,7 @@ import kotlinx.coroutines.withContext
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import yokai.core.migration.Migrator import yokai.core.migration.Migrator
import yokai.domain.base.BasePreferences import yokai.domain.base.BasePreferences
import yokai.presentation.core.Constants
import yokai.presentation.extension.repo.ExtensionRepoController import yokai.presentation.extension.repo.ExtensionRepoController
import yokai.presentation.onboarding.OnboardingController import yokai.presentation.onboarding.OnboardingController
import kotlin.collections.set import kotlin.collections.set
@ -1596,17 +1597,20 @@ open class MainActivity : BaseActivity<MainActivityBinding>() {
private const val SWIPE_THRESHOLD = 100 private const val SWIPE_THRESHOLD = 100
private const val SWIPE_VELOCITY_THRESHOLD = 100 private const val SWIPE_VELOCITY_THRESHOLD = 100
const val MAIN_ACTIVITY = "eu.kanade.tachiyomi.ui.main.MainActivity" const val MAIN_ACTIVITY = Constants.MAIN_ACTIVITY
// Shortcut actions // Shortcut actions
const val SHORTCUT_LIBRARY = "eu.kanade.tachiyomi.SHOW_LIBRARY" const val SHORTCUT_LIBRARY = "eu.kanade.tachiyomi.SHOW_LIBRARY"
const val SHORTCUT_RECENTS = "eu.kanade.tachiyomi.SHOW_RECENTS" @Deprecated
val SHORTCUT_RECENTS = Constants.SHORTCUT_RECENTS
const val SHORTCUT_RECENTLY_UPDATED = "eu.kanade.tachiyomi.SHOW_RECENTLY_UPDATED" const val SHORTCUT_RECENTLY_UPDATED = "eu.kanade.tachiyomi.SHOW_RECENTLY_UPDATED"
const val SHORTCUT_RECENTLY_READ = "eu.kanade.tachiyomi.SHOW_RECENTLY_READ" const val SHORTCUT_RECENTLY_READ = "eu.kanade.tachiyomi.SHOW_RECENTLY_READ"
const val SHORTCUT_BROWSE = "eu.kanade.tachiyomi.SHOW_BROWSE" const val SHORTCUT_BROWSE = "eu.kanade.tachiyomi.SHOW_BROWSE"
const val SHORTCUT_DOWNLOADS = "eu.kanade.tachiyomi.SHOW_DOWNLOADS" const val SHORTCUT_DOWNLOADS = "eu.kanade.tachiyomi.SHOW_DOWNLOADS"
const val SHORTCUT_MANGA = "eu.kanade.tachiyomi.SHOW_MANGA" @Deprecated
const val SHORTCUT_MANGA_BACK = "eu.kanade.tachiyomi.SHOW_MANGA_BACK" const val SHORTCUT_MANGA = Constants.SHORTCUT_MANGA
@Deprecated
const val SHORTCUT_MANGA_BACK = Constants.SHORTCUT_MANGA_BACK
const val SHORTCUT_UPDATE_NOTES = "eu.kanade.tachiyomi.SHOW_UPDATE_NOTES" const val SHORTCUT_UPDATE_NOTES = "eu.kanade.tachiyomi.SHOW_UPDATE_NOTES"
const val SHORTCUT_SOURCE = "eu.kanade.tachiyomi.SHOW_SOURCE" const val SHORTCUT_SOURCE = "eu.kanade.tachiyomi.SHOW_SOURCE"
const val SHORTCUT_READER_SETTINGS = "eu.kanade.tachiyomi.READER_SETTINGS" const val SHORTCUT_READER_SETTINGS = "eu.kanade.tachiyomi.READER_SETTINGS"

View file

@ -30,6 +30,7 @@ import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import yokai.domain.chapter.interactor.GetChapters import yokai.domain.chapter.interactor.GetChapters
import yokai.presentation.core.util.IntentCommon
class SearchActivity : MainActivity() { class SearchActivity : MainActivity() {
private val getChapters: GetChapters by injectLazy() private val getChapters: GetChapters by injectLazy()
@ -199,15 +200,8 @@ class SearchActivity : MainActivity() {
} }
companion object { companion object {
fun openMangaIntent(context: Context, id: Long?, canReturnToMain: Boolean = false) = Intent( fun openMangaIntent(context: Context, id: Long?, canReturnToMain: Boolean = false) =
context, IntentCommon.openManga(context, id, canReturnToMain)
SearchActivity::class
.java,
)
.apply {
action = if (canReturnToMain) SHORTCUT_MANGA_BACK else SHORTCUT_MANGA
putExtra(MangaDetailsController.MANGA_EXTRA, id)
}
fun openReaderSettings(context: Context) = Intent( fun openReaderSettings(context: Context) = Intent(
context, context,

View file

@ -133,6 +133,7 @@ import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeoutOrNull import kotlinx.coroutines.withTimeoutOrNull
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import yokai.presentation.core.Constants
import java.io.File import java.io.File
import java.io.IOException import java.io.IOException
import java.util.* import java.util.*
@ -1843,7 +1844,8 @@ class MangaDetailsController :
const val SMART_SEARCH_CONFIG_EXTRA = "smartSearchConfig" const val SMART_SEARCH_CONFIG_EXTRA = "smartSearchConfig"
const val FROM_CATALOGUE_EXTRA = "from_catalogue" const val FROM_CATALOGUE_EXTRA = "from_catalogue"
const val MANGA_EXTRA = "manga" @Deprecated
const val MANGA_EXTRA = Constants.MANGA_EXTRA
private enum class RangeMode { private enum class RangeMode {
Download, Download,

View file

@ -23,8 +23,6 @@
<color name="tachiyomi_inverseSurface">#303033</color> <color name="tachiyomi_inverseSurface">#303033</color>
<color name="tachiyomi_primaryInverse">#AEC6FF</color> <color name="tachiyomi_primaryInverse">#AEC6FF</color>
<color name="cover_placeholder">#1F888888</color>
<!-- Application Colors --> <!-- Application Colors -->
<color name="primaryVariantTachiyomi">#E5ECF4</color> <color name="primaryVariantTachiyomi">#E5ECF4</color>
<color name="colorPrimaryInactive">#C2424242</color> <color name="colorPrimaryInactive">#C2424242</color>

View file

@ -15,6 +15,8 @@ kotlin {
} }
val androidMain by getting { val androidMain by getting {
dependencies { dependencies {
api(libs.injekt.core)
api(libs.okhttp) api(libs.okhttp)
api(libs.okhttp.logging.interceptor) api(libs.okhttp.logging.interceptor)
api(libs.okhttp.dnsoverhttps) api(libs.okhttp.dnsoverhttps)

24
data/build.gradle.kts Normal file
View file

@ -0,0 +1,24 @@
plugins {
kotlin("multiplatform")
kotlin("plugin.serialization")
id("com.android.library")
}
kotlin {
androidTarget()
sourceSets {
val commonMain by getting {
dependencies {
}
}
val androidMain by getting {
dependencies {
implementation(projects.sourceApi)
}
}
}
}
android {
namespace = "yokai.data"
}

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest />

View file

@ -1,9 +1,8 @@
package eu.kanade.tachiyomi.data.database package eu.kanade.tachiyomi.data.database
import eu.kanade.tachiyomi.source.model.UpdateStrategy import eu.kanade.tachiyomi.source.model.UpdateStrategy
import java.util.Date
// TODO: Move to dev.yokai.data.DatabaseAdapter // TODO: Move to yokai.data.DatabaseAdapter
val updateStrategyAdapter = object : ColumnAdapter<UpdateStrategy, Int> { val updateStrategyAdapter = object : ColumnAdapter<UpdateStrategy, Int> {
private val enumValues by lazy { UpdateStrategy.entries } private val enumValues by lazy { UpdateStrategy.entries }

View file

@ -62,6 +62,7 @@ loading-button = { module = "br.com.simplepass:loading-button-android", version
mockk = { module = "io.mockk:mockk", version = "1.13.11" } mockk = { module = "io.mockk:mockk", version = "1.13.11" }
moko-resources = { module = "dev.icerock.moko:resources", version.ref = "moko" } moko-resources = { module = "dev.icerock.moko:resources", version.ref = "moko" }
moko-resources-compose = { module = "dev.icerock.moko:resources-compose", version.ref = "moko" }
moko-generator = { module = "dev.icerock.moko:resources-generator", version.ref = "moko" } moko-generator = { module = "dev.icerock.moko:resources-generator", version.ref = "moko" }
okio = { module = "com.squareup.okio:okio", version = "3.9.0" } okio = { module = "com.squareup.okio:okio", version = "3.9.0" }

View file

@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="no_recent_read_updated_manga">No recently read or updated series</string>
<!-- Recents -->
<string name="label_recent_updates">Updates</string>
<!-- App widget -->
<string name="appwidget_updates_description">See your recently updated library entries</string>
<string name="appwidget_unavailable_locked">Widget not available when app lock is enabled</string>
<!-- WebView --> <!-- WebView -->
<string name="failed_to_bypass_cloudflare">Failed to bypass Cloudflare</string> <string name="failed_to_bypass_cloudflare">Failed to bypass Cloudflare</string>
<!-- Do not translate "WebView" --> <!-- Do not translate "WebView" -->

View file

@ -13,5 +13,5 @@ android {
} }
dependencies { dependencies {
api(libs.material)
} }

View file

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest />

View file

@ -0,0 +1,12 @@
package yokai.presentation.core
object Constants {
const val MAIN_ACTIVITY = "eu.kanade.tachiyomi.ui.main.MainActivity"
const val SEARCH_ACTIVITY = "eu.kanade.tachiyomi.ui.main.SearchActivity"
const val SHORTCUT_RECENTS = "eu.kanade.tachiyomi.SHOW_RECENTS"
const val SHORTCUT_MANGA = "eu.kanade.tachiyomi.SHOW_MANGA"
const val SHORTCUT_MANGA_BACK = "eu.kanade.tachiyomi.SHOW_MANGA_BACK"
const val MANGA_EXTRA = "manga"
}

View file

@ -0,0 +1,14 @@
package yokai.presentation.core.util
import android.content.Context
import android.content.Intent
import yokai.presentation.core.Constants
object IntentCommon {
fun openManga(context: Context, id: Long?, canReturnToMain: Boolean = false) =
Intent(context, Class.forName(Constants.SEARCH_ACTIVITY))
.apply {
action = if (canReturnToMain) Constants.SHORTCUT_MANGA_BACK else Constants.SHORTCUT_MANGA
putExtra(Constants.MANGA_EXTRA, id)
}
}

View file

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="cover_placeholder">#1F888888</color>
</resources>

View file

@ -22,8 +22,10 @@ android {
dependencies { dependencies {
implementation(projects.core) implementation(projects.core)
implementation(projects.data)
implementation(projects.domain) implementation(projects.domain)
implementation(projects.presentationCore) implementation(projects.i18n)
implementation(projects.presentation.core)
implementation(androidx.glance.appwidget) implementation(androidx.glance.appwidget)

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<receiver
android:name="eu.kanade.tachiyomi.appwidget.UpdatesGridGlanceReceiver"
android:enabled="@bool/glance_appwidget_available"
android:exported="false"
android:label="@string/updates">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/updates_grid_glance_widget_info" />
</receiver>
</application>
</manifest>

View file

@ -1,8 +1,7 @@
package eu.kanade.tachiyomi.appwidget package yokai.presentation.widget
import android.content.Context import android.content.Context
import androidx.glance.appwidget.GlanceAppWidgetManager import androidx.glance.appwidget.GlanceAppWidgetManager
import eu.kanade.tachiyomi.appwidget.UpdatesGridGlanceWidget
class TachiyomiWidgetManager { class TachiyomiWidgetManager {

View file

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.appwidget package yokai.presentation.widget
import androidx.glance.appwidget.GlanceAppWidget import androidx.glance.appwidget.GlanceAppWidget
import androidx.glance.appwidget.GlanceAppWidgetReceiver import androidx.glance.appwidget.GlanceAppWidgetReceiver

View file

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.appwidget package yokai.presentation.widget
import android.app.Application import android.app.Application
import android.content.Context import android.content.Context
@ -24,26 +24,27 @@ import coil3.request.transformations
import coil3.size.Precision import coil3.size.Precision
import coil3.size.Scale import coil3.size.Scale
import coil3.transform.RoundedCornersTransformation import coil3.transform.RoundedCornersTransformation
import eu.kanade.tachiyomi.appwidget.components.CoverHeight
import eu.kanade.tachiyomi.appwidget.components.CoverWidth
import eu.kanade.tachiyomi.appwidget.components.LockedWidget
import eu.kanade.tachiyomi.appwidget.components.UpdatesWidget
import eu.kanade.tachiyomi.appwidget.util.appWidgetBackgroundRadius
import eu.kanade.tachiyomi.appwidget.util.calculateRowAndColumnCount
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.ui.recents.RecentsPresenter import eu.kanade.tachiyomi.ui.recents.RecentsPresenter
import eu.kanade.tachiyomi.util.system.dpToPx import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.launchIO import eu.kanade.tachiyomi.util.system.launchIO
import kotlinx.coroutines.MainScope import kotlinx.coroutines.MainScope
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import yokai.presentation.widget.components.CoverHeight
import yokai.presentation.widget.components.CoverWidth
import yokai.presentation.widget.components.LockedWidget
import yokai.presentation.widget.components.UpdatesWidget
import yokai.presentation.widget.util.appWidgetBackgroundRadius
import yokai.presentation.widget.util.calculateRowAndColumnCount
import java.util.* import java.util.*
import kotlin.math.min import kotlin.math.min
class UpdatesGridGlanceWidget : GlanceAppWidget() { // FIXME
private val app: Application by injectLazy() class UpdatesGridGlanceWidget(
private val preferences: PreferencesHelper by injectLazy() private val app: Application = Injekt.get(),
//private val preferences: PreferencesHelper by injectLazy(),
) : GlanceAppWidget() {
private val coroutineScope = MainScope() private val coroutineScope = MainScope()
private var data: List<Pair<Long, Bitmap?>>? = null private var data: List<Pair<Long, Bitmap?>>? = null

View file

@ -1,7 +1,8 @@
package eu.kanade.tachiyomi.appwidget.components package yokai.presentation.widget.components
import android.content.Intent import android.content.Intent
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.glance.GlanceModifier import androidx.glance.GlanceModifier
@ -15,14 +16,17 @@ import androidx.glance.text.Text
import androidx.glance.text.TextAlign import androidx.glance.text.TextAlign
import androidx.glance.text.TextStyle import androidx.glance.text.TextStyle
import androidx.glance.unit.ColorProvider import androidx.glance.unit.ColorProvider
import eu.kanade.tachiyomi.R import yokai.i18n.MR
import eu.kanade.tachiyomi.appwidget.ContainerModifier import yokai.presentation.core.Constants
import eu.kanade.tachiyomi.appwidget.util.stringResource import yokai.presentation.widget.ContainerModifier
import eu.kanade.tachiyomi.ui.main.MainActivity import yokai.presentation.widget.R
import yokai.presentation.widget.util.stringResource
@Composable @Composable
fun LockedWidget() { fun LockedWidget() {
val intent = Intent(LocalContext.current, Class.forName(MainActivity.MAIN_ACTIVITY)).apply { val context = LocalContext.current
val clazz = Class.forName(Constants.MAIN_ACTIVITY)
val intent = Intent(context, clazz).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
} }
Box( Box(
@ -33,9 +37,9 @@ fun LockedWidget() {
contentAlignment = Alignment.Center, contentAlignment = Alignment.Center,
) { ) {
Text( Text(
text = stringResource(R.string.appwidget_unavailable_locked), text = stringResource(MR.strings.appwidget_unavailable_locked),
style = TextStyle( style = TextStyle(
color = ColorProvider(R.color.appwidget_on_secondary_container), color = ColorProvider(Color(context.getColor(R.color.appwidget_on_secondary_container))),
fontSize = 12.sp, fontSize = 12.sp,
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
), ),

View file

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.appwidget.components package yokai.presentation.widget.components
import android.graphics.Bitmap import android.graphics.Bitmap
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -10,8 +10,8 @@ import androidx.glance.layout.Box
import androidx.glance.layout.ContentScale import androidx.glance.layout.ContentScale
import androidx.glance.layout.fillMaxSize import androidx.glance.layout.fillMaxSize
import androidx.glance.layout.size import androidx.glance.layout.size
import eu.kanade.tachiyomi.R import yokai.presentation.widget.R
import eu.kanade.tachiyomi.appwidget.util.appWidgetInnerRadius import yokai.presentation.widget.util.appWidgetInnerRadius
val CoverWidth = 58.dp val CoverWidth = 58.dp
val CoverHeight = 87.dp val CoverHeight = 87.dp

View file

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.appwidget.components package yokai.presentation.widget.components
import android.content.Intent import android.content.Intent
import android.graphics.Bitmap import android.graphics.Bitmap
@ -17,16 +17,18 @@ import androidx.glance.layout.Row
import androidx.glance.layout.fillMaxWidth import androidx.glance.layout.fillMaxWidth
import androidx.glance.layout.padding import androidx.glance.layout.padding
import androidx.glance.text.Text import androidx.glance.text.Text
import eu.kanade.tachiyomi.appwidget.ContainerModifier import yokai.i18n.MR
import eu.kanade.tachiyomi.appwidget.util.calculateRowAndColumnCount import yokai.presentation.core.Constants
import eu.kanade.tachiyomi.appwidget.util.stringResource import yokai.presentation.core.util.IntentCommon
import eu.kanade.tachiyomi.ui.main.SearchActivity import yokai.presentation.widget.ContainerModifier
import yokai.presentation.widget.util.calculateRowAndColumnCount
import yokai.presentation.widget.util.stringResource
@Composable @Composable
fun UpdatesWidget(data: List<Pair<Long, Bitmap?>>?) { fun UpdatesWidget(data: List<Pair<Long, Bitmap?>>?) {
val (rowCount, columnCount) = LocalSize.current.calculateRowAndColumnCount() val (rowCount, columnCount) = LocalSize.current.calculateRowAndColumnCount()
val clazz = Class.forName("eu.kanade.tachiyomi.ui.main.MainActivity") val clazz = Class.forName(Constants.MAIN_ACTIVITY)
val mainIntent = Intent(LocalContext.current, clazz).setAction("eu.kanade.tachiyomi.SHOW_RECENTS") val mainIntent = Intent(LocalContext.current, clazz).setAction(Constants.SHORTCUT_RECENTS)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
Column( Column(
modifier = ContainerModifier.clickable(actionStartActivity(mainIntent)), modifier = ContainerModifier.clickable(actionStartActivity(mainIntent)),
@ -36,7 +38,7 @@ fun UpdatesWidget(data: List<Pair<Long, Bitmap?>>?) {
if (data == null) { if (data == null) {
CircularProgressIndicator() CircularProgressIndicator()
} else if (data.isEmpty()) { } else if (data.isEmpty()) {
Text(text = stringResource(R.string.no_recent_read_updated_manga)) Text(text = stringResource(MR.strings.no_recent_read_updated_manga))
} else { } else {
(0 until rowCount).forEach { i -> (0 until rowCount).forEach { i ->
val coverRow = (0 until columnCount).mapNotNull { j -> val coverRow = (0 until columnCount).mapNotNull { j ->
@ -56,7 +58,7 @@ fun UpdatesWidget(data: List<Pair<Long, Bitmap?>>?) {
.padding(horizontal = 3.dp), .padding(horizontal = 3.dp),
contentAlignment = Alignment.Center, contentAlignment = Alignment.Center,
) { ) {
val intent = SearchActivity.openMangaIntent(LocalContext.current, mangaId, true) val intent = IntentCommon.openManga(LocalContext.current, mangaId, true)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
// https://issuetracker.google.com/issues/238793260 // https://issuetracker.google.com/issues/238793260
.addCategory(mangaId.toString()) .addCategory(mangaId.toString())

View file

@ -1,12 +1,13 @@
package eu.kanade.tachiyomi.appwidget.util package yokai.presentation.widget.util
import androidx.annotation.StringRes
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.DpSize
import androidx.glance.GlanceModifier import androidx.glance.GlanceModifier
import androidx.glance.LocalContext import androidx.glance.LocalContext
import androidx.glance.appwidget.cornerRadius import androidx.glance.appwidget.cornerRadius
import eu.kanade.tachiyomi.R import dev.icerock.moko.resources.StringResource
import yokai.presentation.widget.R
import yokai.util.lang.getMString
fun GlanceModifier.appWidgetBackgroundRadius(): GlanceModifier { fun GlanceModifier.appWidgetBackgroundRadius(): GlanceModifier {
return this.cornerRadius(R.dimen.appwidget_background_radius) return this.cornerRadius(R.dimen.appwidget_background_radius)
@ -17,8 +18,8 @@ fun GlanceModifier.appWidgetInnerRadius(): GlanceModifier {
} }
@Composable @Composable
fun stringResource(@StringRes id: Int): String { fun stringResource(id: StringResource): String {
return LocalContext.current.getString(id) return LocalContext.current.getMString(id)
} }
/** /**

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/appwidget_secondary_container" />
<corners android:radius="@dimen/appwidget_background_radius" />
</shape>

View file

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/cover_placeholder" />
<corners android:radius="@dimen/appwidget_inner_radius" />
</shape>
</item>
<item
android:top="24dp"
android:bottom="24dp"
android:left="24dp"
android:right="24dp">
<vector
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@color/cover_placeholder"
android:pathData="M21,5v6.59l-2.29,-2.3c-0.39,-0.39 -1.03,-0.39 -1.42,0L14,12.59 10.71,9.3c-0.39,-0.39 -1.02,-0.39 -1.41,0L6,12.59 3,9.58L3,5c0,-1.1 0.9,-2 2,-2h14c1.1,0 2,0.9 2,2zM18,11.42l3,3.01L21,19c0,1.1 -0.9,2 -2,2L5,21c-1.1,0 -2,-0.9 -2,-2v-6.58l2.29,2.29c0.39,0.39 1.02,0.39 1.41,0l3.3,-3.3 3.29,3.29c0.39,0.39 1.02,0.39 1.41,0l3.3,-3.28z"/>
</vector>
</item>
</layer-list>

View file

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="appwidget_background">@color/m3_sys_color_dynamic_light_surface</color>
<color name="appwidget_on_background">@color/m3_sys_color_dynamic_light_on_surface</color>
<color name="appwidget_surface_variant">@color/m3_sys_color_dynamic_light_surface_variant</color>
<color name="appwidget_on_surface_variant">@color/m3_sys_color_dynamic_light_on_surface_variant</color>
<color name="appwidget_secondary_container">@color/m3_sys_color_dynamic_light_secondary_container</color>
<color name="appwidget_on_secondary_container">@color/m3_sys_color_dynamic_light_on_secondary_container</color>
</resources>

View file

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="appwidget_background_radius">16dp</dimen>
<dimen name="appwidget_inner_radius">12dp</dimen>
</resources>

View file

@ -32,8 +32,9 @@ enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
rootProject.name = "Yokai" rootProject.name = "Yokai"
include(":app") include(":app")
include(":core") include(":core")
include(":data")
include(":domain") include(":domain")
include(":i18n") include(":i18n")
include(":presentation-core") include(":presentation:core")
include(":presentation-widget") include(":presentation:widget")
include(":source-api") include(":source-api")