diff --git a/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/items/HomeNavigationBarItem.kt b/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/items/HomeNavigationBarItem.kt index a39f8655c..165a6f37b 100644 --- a/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/items/HomeNavigationBarItem.kt +++ b/app/src/androidMain/kotlin/dev/alvr/katana/ui/main/navigation/items/HomeNavigationBarItem.kt @@ -1,10 +1,10 @@ package dev.alvr.katana.ui.main.navigation.items import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.twotone.LibraryBooks import androidx.compose.material.icons.twotone.AccountCircle import androidx.compose.material.icons.twotone.Dashboard import androidx.compose.material.icons.twotone.Explore -import androidx.compose.material.icons.twotone.LibraryBooks import androidx.compose.material.icons.twotone.VideoLibrary import androidx.compose.ui.graphics.vector.ImageVector import com.ramcosta.composedestinations.spec.NavGraphSpec @@ -22,7 +22,7 @@ internal enum class HomeNavigationBarItem( override val label: Int, ) : NavigationBarItem { Anime(AnimeNavGraph, Icons.TwoTone.VideoLibrary, R.string.navigation_bar_destination_anime_lists), - Manga(MangaNavGraph, Icons.TwoTone.LibraryBooks, R.string.navigation_bar_destination_manga_lists), + Manga(MangaNavGraph, Icons.AutoMirrored.TwoTone.LibraryBooks, R.string.navigation_bar_destination_manga_lists), Explore(ExploreNavGraph, Icons.TwoTone.Explore, R.string.navigation_bar_destination_explore), Social(SocialNavGraph, Icons.TwoTone.Dashboard, R.string.navigation_bar_destination_social), Account(AccountNavGraph, Icons.TwoTone.AccountCircle, R.string.navigation_bar_destination_account); diff --git a/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/common/KatanaCommonPlugin.kt b/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/common/KatanaCommonPlugin.kt index 10ff49df7..f2bd4c95f 100644 --- a/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/common/KatanaCommonPlugin.kt +++ b/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/common/KatanaCommonPlugin.kt @@ -1,5 +1,7 @@ package dev.alvr.katana.buildlogic.common +import dev.alvr.katana.buildlogic.KatanaConfiguration +import dev.alvr.katana.buildlogic.fullPackageName import dev.alvr.katana.buildlogic.isRelease import org.gradle.api.Plugin import org.gradle.api.Project @@ -16,6 +18,11 @@ internal class KatanaCommonPlugin : Plugin { with(target) { apply(plugin = "com.louiscad.complete-kotlin") + subprojects { + group = fullPackageName + version = KatanaConfiguration.VersionCode + } + with(tasks) { register("clean") { allprojects { delete(layout.buildDirectory.asFile.get()) } diff --git a/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/consts.kt b/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/consts.kt index 7151346b8..83fc01cb8 100644 --- a/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/consts.kt +++ b/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/consts.kt @@ -1,7 +1,6 @@ package dev.alvr.katana.buildlogic internal const val AndroidDir = "src/androidMain" -internal const val ResourcesDir = "src/commonMain/resources" internal const val ANDROID_APPLICATION_PLUGIN = "com.android.application" internal const val ANDROID_LIBRARY_PLUGIN = "com.android.library" diff --git a/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/extensions.kt b/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/extensions.kt index 324bba8fb..d35f27fb5 100644 --- a/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/extensions.kt +++ b/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/extensions.kt @@ -16,7 +16,6 @@ import org.gradle.jvm.toolchain.JvmVendorSpec import org.gradle.kotlin.dsl.DependencyHandlerScope import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies -import org.gradle.kotlin.dsl.get import org.gradle.kotlin.dsl.getByType import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.gradle.dsl.KotlinCommonCompilerOptions @@ -90,11 +89,6 @@ internal fun BaseExtension.configureAndroid(packageName: String) { targetCompatibility = KatanaConfiguration.UseJavaVersion } - with(sourceSets["main"]) { - res.srcDirs("$AndroidDir/res", ResourcesDir) - resources.srcDirs(ResourcesDir) - } - testOptions { animationsDisabled = true unitTests { diff --git a/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/mp/app/KatanaMultiplatformAppPlugin.kt b/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/mp/app/KatanaMultiplatformAppPlugin.kt index 241c9ca39..0175cb7f8 100644 --- a/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/mp/app/KatanaMultiplatformAppPlugin.kt +++ b/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/mp/app/KatanaMultiplatformAppPlugin.kt @@ -5,7 +5,6 @@ import com.android.build.gradle.internal.dsl.BaseAppModuleExtension import dev.alvr.katana.buildlogic.ANDROID_APPLICATION_PLUGIN import dev.alvr.katana.buildlogic.AndroidDir import dev.alvr.katana.buildlogic.KatanaConfiguration -import dev.alvr.katana.buildlogic.ResourcesDir import dev.alvr.katana.buildlogic.catalogBundle import dev.alvr.katana.buildlogic.configureAndroid import dev.alvr.katana.buildlogic.mp.mobile.KatanaMultiplatformMobileBasePlugin @@ -118,7 +117,6 @@ internal class KatanaMultiplatformAppPlugin : KatanaMultiplatformMobileBasePlugi sourceSets["main"].manifest.srcFile("$AndroidDir/AndroidManifest.xml") sourceSets["main"].res.srcDirs("$AndroidDir/res") - sourceSets["main"].resources.srcDirs(ResourcesDir) } private fun SentryPluginExtension.configureSentry() { diff --git a/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/mp/mobile/ui/KatanaMultiplatformComposePlugin.kt b/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/mp/mobile/ui/KatanaMultiplatformComposePlugin.kt index b81ae7d9b..0bd42f295 100644 --- a/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/mp/mobile/ui/KatanaMultiplatformComposePlugin.kt +++ b/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/mp/mobile/ui/KatanaMultiplatformComposePlugin.kt @@ -1,22 +1,16 @@ package dev.alvr.katana.buildlogic.mp.mobile.ui -import dev.alvr.katana.buildlogic.ResourcesDir import dev.alvr.katana.buildlogic.catalogBundle import dev.alvr.katana.buildlogic.catalogLib -import dev.alvr.katana.buildlogic.fullPackageName import dev.alvr.katana.buildlogic.kspDependencies import dev.alvr.katana.buildlogic.mp.androidUnitTest import dev.alvr.katana.buildlogic.mp.configureSourceSets -import dev.alvr.katana.buildlogic.mp.tasks.GenerateResourcesFileTask import java.io.File import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.plugins.ExtensionAware import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure -import org.gradle.kotlin.dsl.getValue -import org.gradle.kotlin.dsl.provideDelegate -import org.gradle.kotlin.dsl.registering import org.jetbrains.compose.ComposeExtension import org.jetbrains.compose.ComposePlugin import org.jetbrains.compose.ExperimentalComposeLibrary @@ -31,8 +25,6 @@ internal class KatanaMultiplatformComposePlugin : Plugin { configure { configureMultiplatform() } configure { configureComposeMultiplatform() } } - - generateResourcesTask() } context(Project) @@ -48,8 +40,6 @@ internal class KatanaMultiplatformComposePlugin : Plugin { configureSourceSets { commonMain { - kotlin.srcDirs("build/$GeneratedResourcesDir") - dependencies { implementation(compose.animation) implementation(compose.components.resources) @@ -100,27 +90,9 @@ internal class KatanaMultiplatformComposePlugin : Plugin { ) } - private fun Project.generateResourcesTask() { - val generateResourcesFile by tasks.registering(GenerateResourcesFileTask::class) { - packageName.set(fullPackageName) - inputFiles.from( - layout.projectDirectory.dir(ResourcesDir).asFileTree.matching { - include("**/*.webp", "**/*.xml") - }, - ) - outputDir.set(layout.buildDirectory.dir(GeneratedResourcesDir)) - } - - tasks.named("preBuild").configure { dependsOn(generateResourcesFile) } - } - private fun Project.composePluginEnabled(property: String) = providers.gradleProperty(property).orNull == "true" private fun Project.composePluginDir(directory: String) = File(layout.buildDirectory.asFile.get(), directory).absolutePath - - private companion object { - const val GeneratedResourcesDir = "generated/sources/katana/main" - } } diff --git a/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/mp/tasks/GenerateResourcesFileTask.kt b/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/mp/tasks/GenerateResourcesFileTask.kt deleted file mode 100644 index 429ba0d3f..000000000 --- a/build-logic/katana-convention/src/main/kotlin/dev/alvr/katana/buildlogic/mp/tasks/GenerateResourcesFileTask.kt +++ /dev/null @@ -1,87 +0,0 @@ -package dev.alvr.katana.buildlogic.mp.tasks - -import com.squareup.kotlinpoet.AnnotationSpec -import com.squareup.kotlinpoet.ClassName -import com.squareup.kotlinpoet.FileSpec -import com.squareup.kotlinpoet.KModifier -import com.squareup.kotlinpoet.PropertySpec -import com.squareup.kotlinpoet.TypeSpec -import dev.alvr.katana.buildlogic.ResourcesDir -import dev.alvr.katana.buildlogic.mp.identifier -import java.io.File -import org.gradle.api.DefaultTask -import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.provider.Property -import org.gradle.api.tasks.CacheableTask -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputFiles -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.PathSensitive -import org.gradle.api.tasks.PathSensitivity -import org.gradle.api.tasks.TaskAction -import org.gradle.internal.FileUtils - -@CacheableTask -internal abstract class GenerateResourcesFileTask : DefaultTask() { - @get:Input - internal abstract val packageName: Property - - @get:InputFiles - @get:PathSensitive(value = PathSensitivity.RELATIVE) - internal abstract val inputFiles: ConfigurableFileCollection - - @get:OutputDirectory - internal abstract val outputDir: DirectoryProperty - - private val String.resourceIdentifier - get() = split('_').identifier - - @TaskAction - private fun generateResourcesFile() { - inputFiles.files.generateResourcesFile() - } - - private fun Set.generateResourcesFile() { - if (isEmpty()) { - outputDir.get().asFile.deleteRecursively() - return - } - - val stableAnnotation = AnnotationSpec - .builder(ClassName(ComposeRuntimePackage, ComposeStableAnnotation)) - .build() - - val properties = map { file -> - val propertyName = FileUtils.removeExtension(file.name).resourceIdentifier - val fileName = file.absolutePath.replace('\\', '/').substringAfter("$ResourcesDir/") - - PropertySpec.builder(propertyName, ClassName(KatanaResourcePackage, KatanaResourceClass)) - .addAnnotation(stableAnnotation) - .addModifiers(KModifier.INTERNAL) - .initializer("%L(%S)", KatanaResourceClass, fileName) - .build() - } - - val resourcesObject = TypeSpec.objectBuilder(KatanaResourcesLocalClass) - .addModifiers(KModifier.INTERNAL) - .addProperties(properties) - .build() - - FileSpec.builder(ClassName("${packageName.get()}$KatanaResourcesLocalPackage", KatanaResourcesLocalClass)) - .addType(resourcesObject) - .build() - .writeTo(outputDir.get().asFile) - } - - private companion object { - const val ComposeRuntimePackage = "androidx.compose.runtime" - const val ComposeStableAnnotation = "Stable" - - const val KatanaResourcePackage = "dev.alvr.katana.ui.base.resources" - const val KatanaResourceClass = "KatanaResource" - - const val KatanaResourcesLocalPackage = ".resources" - const val KatanaResourcesLocalClass = "KatanaResources" - } -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index da941f005..685bbc652 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ apollo = "3.8.2" arrow = "1.2.2" buildconfig = "5.3.5" complete-kotlin = "1.1.0" -compose = "1.5.12" +compose = "1.6.0" compose-compiler = "1.5.8.1" datastore = "1.1.0-beta01" destinations = "1.10.1" diff --git a/ui/base/src/androidMain/kotlin/dev/alvr/katana/ui/base/design/typography.android.kt b/ui/base/src/androidMain/kotlin/dev/alvr/katana/ui/base/design/typography.android.kt deleted file mode 100644 index 4a2ac52a1..000000000 --- a/ui/base/src/androidMain/kotlin/dev/alvr/katana/ui/base/design/typography.android.kt +++ /dev/null @@ -1,20 +0,0 @@ -package dev.alvr.katana.ui.base.design - -import android.annotation.SuppressLint -import androidx.compose.runtime.Composable -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.font.Font -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.font.FontWeight - -private val cache = mutableMapOf() - -@Composable -@SuppressLint("DiscouragedApi") -internal actual fun font(font: String, weight: FontWeight, style: FontStyle) = - with(LocalContext.current) { - cache.getOrPut(font) { - val id = resources.getIdentifier(font, "font", packageName) - Font(id, weight, style) - } - } diff --git a/ui/base/src/commonMain/resources/font/barlow_bold.ttf b/ui/base/src/commonMain/composeResources/font/barlow_bold.ttf similarity index 100% rename from ui/base/src/commonMain/resources/font/barlow_bold.ttf rename to ui/base/src/commonMain/composeResources/font/barlow_bold.ttf diff --git a/ui/base/src/commonMain/resources/font/barlow_light.ttf b/ui/base/src/commonMain/composeResources/font/barlow_light.ttf similarity index 100% rename from ui/base/src/commonMain/resources/font/barlow_light.ttf rename to ui/base/src/commonMain/composeResources/font/barlow_light.ttf diff --git a/ui/base/src/commonMain/resources/font/barlow_medium.ttf b/ui/base/src/commonMain/composeResources/font/barlow_medium.ttf similarity index 100% rename from ui/base/src/commonMain/resources/font/barlow_medium.ttf rename to ui/base/src/commonMain/composeResources/font/barlow_medium.ttf diff --git a/ui/base/src/commonMain/resources/font/barlow_normal.ttf b/ui/base/src/commonMain/composeResources/font/barlow_normal.ttf similarity index 100% rename from ui/base/src/commonMain/resources/font/barlow_normal.ttf rename to ui/base/src/commonMain/composeResources/font/barlow_normal.ttf diff --git a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/KatanaSearchTopAppBar.kt b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/KatanaSearchTopAppBar.kt index 3d492ec15..5dc727a17 100644 --- a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/KatanaSearchTopAppBar.kt +++ b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/components/KatanaSearchTopAppBar.kt @@ -4,7 +4,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.ArrowBack +import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.material.icons.outlined.Clear import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -66,8 +66,8 @@ fun KatanaSearchTopAppBar( leadingIcon = { IconButton(onClick = onBack) { Icon( - imageVector = Icons.Outlined.ArrowBack, contentDescription = strings.toolbarSearchClose, + imageVector = Icons.AutoMirrored.Outlined.ArrowBack, ) } }, diff --git a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/design/typography.kt b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/design/typography.kt index a2d8640cf..ce9e4bdad 100644 --- a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/design/typography.kt +++ b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/design/typography.kt @@ -2,18 +2,25 @@ package dev.alvr.katana.ui.base.design import androidx.compose.material3.Typography import androidx.compose.runtime.Composable -import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight +import dev.alvr.katana.ui.base.base.generated.resources.Res +import dev.alvr.katana.ui.base.base.generated.resources.barlow_bold +import dev.alvr.katana.ui.base.base.generated.resources.barlow_light +import dev.alvr.katana.ui.base.base.generated.resources.barlow_medium +import dev.alvr.katana.ui.base.base.generated.resources.barlow_normal +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.Font +@OptIn(ExperimentalResourceApi::class) internal val KatanaTypography @Composable get() = Typography().apply { val fontFamily = FontFamily( - font("barlow_light", FontWeight.Light, FontStyle.Normal), - font("barlow_normal", FontWeight.Normal, FontStyle.Normal), - font("barlow_medium", FontWeight.Medium, FontStyle.Normal), - font("barlow_bold", FontWeight.Bold, FontStyle.Normal), + Font(Res.font.barlow_light, FontWeight.Light, FontStyle.Normal), + Font(Res.font.barlow_normal, FontWeight.Normal, FontStyle.Normal), + Font(Res.font.barlow_medium, FontWeight.Medium, FontStyle.Normal), + Font(Res.font.barlow_bold, FontWeight.Bold, FontStyle.Normal), ) copy( @@ -34,6 +41,3 @@ internal val KatanaTypography labelSmall = labelSmall.copy(fontFamily = fontFamily), ) } - -@Composable -internal expect fun font(font: String, weight: FontWeight, style: FontStyle): Font diff --git a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/resources/KatanaResource.kt b/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/resources/KatanaResource.kt deleted file mode 100644 index e5c5e9a2c..000000000 --- a/ui/base/src/commonMain/kotlin/dev/alvr/katana/ui/base/resources/KatanaResource.kt +++ /dev/null @@ -1,30 +0,0 @@ -package dev.alvr.katana.ui.base.resources - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Immutable -import androidx.compose.runtime.saveable.Saver -import kotlin.jvm.JvmInline -import kotlinx.coroutines.runBlocking -import org.jetbrains.compose.resources.ExperimentalResourceApi -import org.jetbrains.compose.resources.painterResource -import org.jetbrains.compose.resources.resource - -@Immutable -@JvmInline -value class KatanaResource(private val key: String) { - - @OptIn(ExperimentalResourceApi::class) - val asPainter @Composable get() = painterResource(key) - - @OptIn(ExperimentalResourceApi::class) - val asByteArray get() = runBlocking { resource(key).readBytes() } - - val id get() = key.substringAfterLast('/').substringBeforeLast('.') - - companion object { - val saver = Saver( - save = { res -> res.key }, - restore = { key -> KatanaResource(key) } - ) - } -} diff --git a/ui/base/src/iosMain/kotlin/dev/alvr/katana/ui/base/design/typography.ios.kt b/ui/base/src/iosMain/kotlin/dev/alvr/katana/ui/base/design/typography.ios.kt deleted file mode 100644 index b4b46114c..000000000 --- a/ui/base/src/iosMain/kotlin/dev/alvr/katana/ui/base/design/typography.ios.kt +++ /dev/null @@ -1,20 +0,0 @@ -package dev.alvr.katana.ui.base.design - -import androidx.compose.runtime.Composable -import androidx.compose.ui.text.font.Font -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.platform.Font -import kotlinx.coroutines.runBlocking -import org.jetbrains.compose.resources.ExperimentalResourceApi -import org.jetbrains.compose.resources.resource - -private val cache = mutableMapOf() - -@Composable -@OptIn(ExperimentalResourceApi::class) -internal actual fun font(font: String, weight: FontWeight, style: FontStyle) = - cache.getOrPut(font) { - val byteArray = runBlocking { resource("font/$font.ttf").readBytes() } - Font(font, byteArray, weight, style) - } diff --git a/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/components/ChangeList.kt b/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/components/ChangeList.kt index a0ae4064f..3d41a12ca 100644 --- a/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/components/ChangeList.kt +++ b/ui/lists/src/androidMain/kotlin/dev/alvr/katana/ui/lists/view/components/ChangeList.kt @@ -7,7 +7,7 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.twotone.List +import androidx.compose.material.icons.automirrored.twotone.List import androidx.compose.material3.FloatingActionButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme @@ -74,8 +74,8 @@ internal fun ChangeListButton( if (visible) { FloatingActionButton(onClick = onClick) { Icon( - imageVector = Icons.TwoTone.List, contentDescription = LocalListsStrings.current.changeListButton, + imageVector = Icons.AutoMirrored.TwoTone.List, ) } } diff --git a/ui/lists/src/commonMain/resources/default_cover.webp b/ui/lists/src/commonMain/composeResources/drawable/default_cover.webp similarity index 100% rename from ui/lists/src/commonMain/resources/default_cover.webp rename to ui/lists/src/commonMain/composeResources/drawable/default_cover.webp diff --git a/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/view/components/MediaList.kt b/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/view/components/MediaList.kt index 15d10d8e5..2ee8cd407 100644 --- a/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/view/components/MediaList.kt +++ b/ui/lists/src/commonMain/kotlin/dev/alvr/katana/ui/lists/view/components/MediaList.kt @@ -50,12 +50,15 @@ import dev.alvr.katana.common.core.zero import dev.alvr.katana.ui.base.components.KatanaPullRefresh import dev.alvr.katana.ui.base.modifiers.katanaPlaceholder import dev.alvr.katana.ui.lists.entities.MediaListItem -import dev.alvr.katana.ui.lists.resources.KatanaResources +import dev.alvr.katana.ui.lists.lists.generated.resources.Res +import dev.alvr.katana.ui.lists.lists.generated.resources.default_cover import dev.alvr.katana.ui.lists.strings.LocalListsStrings import dev.alvr.katana.ui.lists.viewmodel.ListState import io.kamel.image.KamelImage import io.kamel.image.asyncPainterResource import kotlinx.collections.immutable.ImmutableList +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.painterResource @Composable internal fun MediaList( @@ -248,6 +251,7 @@ private fun CoverAndScore( } @Composable +@OptIn(ExperimentalResourceApi::class) private fun Cover( cover: String, title: String, @@ -262,7 +266,7 @@ private fun Cover( onFailure = { Image( modifier = Modifier.align(Alignment.Center), - painter = KatanaResources.defaultCover.asPainter, + painter = painterResource(Res.drawable.default_cover), contentDescription = LocalListsStrings.current.errorCover, ) }, @@ -388,7 +392,7 @@ private fun Progress( } LinearProgressIndicator( - progress = currentProgress, + progress = { currentProgress }, modifier = modifier, ) } diff --git a/ui/login/src/androidMain/kotlin/dev/alvr/katana/ui/login/view/LoginScreen.kt b/ui/login/src/androidMain/kotlin/dev/alvr/katana/ui/login/view/LoginScreen.kt index e60e87014..a8d5528a0 100644 --- a/ui/login/src/androidMain/kotlin/dev/alvr/katana/ui/login/view/LoginScreen.kt +++ b/ui/login/src/androidMain/kotlin/dev/alvr/katana/ui/login/view/LoginScreen.kt @@ -17,7 +17,6 @@ import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.consumeWindowInsets @@ -30,7 +29,7 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.text.InlineTextContent import androidx.compose.foundation.text.appendInlineContent import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowForward +import androidx.compose.material.icons.automirrored.filled.ArrowForward import androidx.compose.material.rememberScaffoldState import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator @@ -64,7 +63,6 @@ import androidx.compose.ui.unit.dp import com.ramcosta.composedestinations.annotation.DeepLink import com.ramcosta.composedestinations.annotation.Destination import dev.alvr.katana.common.core.zero -import dev.alvr.katana.ui.base.resources.KatanaResource import dev.alvr.katana.ui.base.viewmodel.collectAsState import dev.alvr.katana.ui.login.ANILIST_LOGIN import dev.alvr.katana.ui.login.ANILIST_REGISTER @@ -79,11 +77,18 @@ import dev.alvr.katana.ui.login.HEADER_ANIMATION_DURATION import dev.alvr.katana.ui.login.LOGIN_DEEP_LINK import dev.alvr.katana.ui.login.LOGO_FULL_SIZE import dev.alvr.katana.ui.login.LOGO_RESIZED +import dev.alvr.katana.ui.login.login.generated.resources.Res +import dev.alvr.katana.ui.login.login.generated.resources.background_chihiro +import dev.alvr.katana.ui.login.login.generated.resources.background_howl +import dev.alvr.katana.ui.login.login.generated.resources.background_mononoke +import dev.alvr.katana.ui.login.login.generated.resources.background_totoro +import dev.alvr.katana.ui.login.login.generated.resources.ic_katana_logo import dev.alvr.katana.ui.login.navigation.LoginNavigator -import dev.alvr.katana.ui.login.resources.KatanaResources import dev.alvr.katana.ui.login.strings.LocalLoginStrings import dev.alvr.katana.ui.login.viewmodel.LoginState import dev.alvr.katana.ui.login.viewmodel.LoginViewModel +import org.jetbrains.compose.resources.ExperimentalResourceApi +import org.jetbrains.compose.resources.painterResource import org.koin.androidx.compose.koinViewModel import org.koin.core.parameter.parametersOf @@ -107,17 +112,16 @@ internal fun LoginScreen( } @Composable -@OptIn(ExperimentalLayoutApi::class) +@OptIn(ExperimentalResourceApi::class) private fun Login(state: LoginState, onLogin: () -> Unit) { val strings = LocalLoginStrings.current - var loading by remember { mutableStateOf(false) } - val background = rememberSaveable(saver = KatanaResource.saver) { + val background = remember { listOf( - KatanaResources.backgroundChihiro, - KatanaResources.backgroundHowl, - KatanaResources.backgroundMononoke, - KatanaResources.backgroundTotoro, + Res.drawable.background_chihiro, + Res.drawable.background_howl, + Res.drawable.background_mononoke, + Res.drawable.background_totoro, ).random() } @@ -125,9 +129,7 @@ private fun Login(state: LoginState, onLogin: () -> Unit) { when { state.saved -> onLogin() - state.loading -> loading = true state.errorType != null -> { - loading = false val message = when (state.errorType) { LoginState.ErrorType.SaveToken -> strings.saveTokenError LoginState.ErrorType.SaveUserId -> strings.fetchUserIdError @@ -147,11 +149,11 @@ private fun Login(state: LoginState, onLogin: () -> Unit) { .padding(padding) .consumeWindowInsets(padding), ) { - if (loading) { + if (state.loading) { Loading() } else { Image( - painter = background.asPainter, + painter = painterResource(background), contentDescription = strings.contentDescriptionBackground, contentScale = ContentScale.Crop, modifier = Modifier @@ -190,6 +192,7 @@ internal fun Header(modifier: Modifier = Modifier) { } @Composable +@OptIn(ExperimentalResourceApi::class) private fun KatanaLogo() { val configuration = LocalConfiguration.current val sizeFraction = if (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) { @@ -199,7 +202,7 @@ private fun KatanaLogo() { } Image( - painter = KatanaResources.icKatanaLogo.asPainter, + painter = painterResource(Res.drawable.ic_katana_logo), contentDescription = LocalLoginStrings.current.contentDescriptionKatanaLogo, modifier = Modifier .padding(top = 8.dp) @@ -291,8 +294,8 @@ private fun GetStartedButton(onStartedClick: (State) -> Unit) { ), ) { Icon( - imageVector = Icons.Filled.ArrowForward, contentDescription = LocalLoginStrings.current.contentDescriptionGetStartedArrow, + imageVector = Icons.AutoMirrored.Filled.ArrowForward, modifier = Modifier.offset(x = translation), tint = MaterialTheme.colorScheme.onSurface, ) @@ -378,8 +381,8 @@ private fun BeginLoginButton(modifier: Modifier = Modifier) { @Composable private fun Animate( delayMillis: Int, + durationMillis: Int, modifier: Modifier = Modifier, - durationMillis: Int = BOTTOM_ANIM_DURATION, content: @Composable () -> Unit, ) { var animationFinished by rememberSaveable { mutableStateOf(false) } diff --git a/ui/login/src/commonMain/resources/background_chihiro.webp b/ui/login/src/commonMain/composeResources/drawable/background_chihiro.webp similarity index 100% rename from ui/login/src/commonMain/resources/background_chihiro.webp rename to ui/login/src/commonMain/composeResources/drawable/background_chihiro.webp diff --git a/ui/login/src/commonMain/resources/background_howl.webp b/ui/login/src/commonMain/composeResources/drawable/background_howl.webp similarity index 100% rename from ui/login/src/commonMain/resources/background_howl.webp rename to ui/login/src/commonMain/composeResources/drawable/background_howl.webp diff --git a/ui/login/src/commonMain/resources/background_mononoke.webp b/ui/login/src/commonMain/composeResources/drawable/background_mononoke.webp similarity index 100% rename from ui/login/src/commonMain/resources/background_mononoke.webp rename to ui/login/src/commonMain/composeResources/drawable/background_mononoke.webp diff --git a/ui/login/src/commonMain/resources/background_totoro.webp b/ui/login/src/commonMain/composeResources/drawable/background_totoro.webp similarity index 100% rename from ui/login/src/commonMain/resources/background_totoro.webp rename to ui/login/src/commonMain/composeResources/drawable/background_totoro.webp diff --git a/ui/login/src/commonMain/resources/ic_katana_logo.xml b/ui/login/src/commonMain/composeResources/drawable/ic_katana_logo.xml similarity index 100% rename from ui/login/src/commonMain/resources/ic_katana_logo.xml rename to ui/login/src/commonMain/composeResources/drawable/ic_katana_logo.xml