diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3efbf84f2..bc3bca082 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -157,6 +157,7 @@ kotlin { "-opt-in=kotlinx.coroutines.FlowPreview", "-opt-in=kotlinx.coroutines.InternalCoroutinesApi", "-opt-in=kotlinx.serialization.ExperimentalSerializationApi", + "-Xannotation-default-target=param-property", ) } } diff --git a/app/src/main/java/eu/kanade/presentation/components/AppBar.kt b/app/src/main/java/eu/kanade/presentation/components/AppBar.kt index b400917c9..1efeb34e3 100644 --- a/app/src/main/java/eu/kanade/presentation/components/AppBar.kt +++ b/app/src/main/java/eu/kanade/presentation/components/AppBar.kt @@ -21,8 +21,9 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.PlainTooltip import androidx.compose.material3.Text import androidx.compose.material3.TextFieldDefaults +import androidx.compose.material3.TooltipAnchorPosition import androidx.compose.material3.TooltipBox -import androidx.compose.material3.TooltipDefaults +import androidx.compose.material3.TooltipDefaults.rememberTooltipPositionProvider import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarScrollBehavior @@ -195,7 +196,7 @@ fun AppBarActions( actions.filterIsInstance().map { TooltipBox( - positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(), + positionProvider = rememberTooltipPositionProvider(TooltipAnchorPosition.Above), tooltip = { PlainTooltip { Text(it.title) @@ -220,7 +221,7 @@ fun AppBarActions( val overflowActions = actions.filterIsInstance() if (overflowActions.isNotEmpty()) { TooltipBox( - positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(), + positionProvider = rememberTooltipPositionProvider(TooltipAnchorPosition.Above), tooltip = { PlainTooltip { Text(stringResource(MR.strings.action_menu_overflow_description)) @@ -349,7 +350,7 @@ fun SearchToolbar( // Don't show search action } else if (searchQuery == null) { TooltipBox( - positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(), + positionProvider = rememberTooltipPositionProvider(TooltipAnchorPosition.Above), tooltip = { PlainTooltip { Text(stringResource(MR.strings.action_search)) @@ -369,7 +370,7 @@ fun SearchToolbar( } } else if (searchQuery.isNotEmpty()) { TooltipBox( - positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(), + positionProvider = rememberTooltipPositionProvider(TooltipAnchorPosition.Above), tooltip = { PlainTooltip { Text(stringResource(MR.strings.action_reset)) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt index e7c06738d..50f8f0cd6 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/AboutScreen.kt @@ -245,7 +245,6 @@ object AboutScreen : Screen() { is GetApplicationRelease.Result.OsTooOld -> { context.toast(MR.strings.update_check_eol) } - else -> {} } } catch (e: Exception) { context.toast(e.message) diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/OpenSourceLicensesScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/OpenSourceLicensesScreen.kt index b879f0d2d..3385f7430 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/OpenSourceLicensesScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/OpenSourceLicensesScreen.kt @@ -2,13 +2,16 @@ package eu.kanade.presentation.more.settings.screen.about import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.currentOrThrow +import com.mikepenz.aboutlibraries.ui.compose.android.produceLibraries import com.mikepenz.aboutlibraries.ui.compose.m3.LibrariesContainer import com.mikepenz.aboutlibraries.ui.compose.util.htmlReadyLicenseContent import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.util.Screen +import eu.kanade.tachiyomi.R import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.material.Scaffold import tachiyomi.presentation.core.i18n.stringResource @@ -27,7 +30,9 @@ class OpenSourceLicensesScreen : Screen() { ) }, ) { contentPadding -> + val libraries by produceLibraries(R.raw.aboutlibraries) LibrariesContainer( + libraries = libraries, modifier = Modifier .fillMaxSize(), contentPadding = contentPadding, diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt index d4a12415c..c4886e384 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/debug/DebugInfoScreen.kt @@ -78,7 +78,7 @@ class DebugInfoScreen : Screen() { val status by produceState(initialValue = "-") { val result = ProfileVerifier.getCompilationStatusAsync().await().profileInstallResultCode value = when (result) { - ProfileVerifier.CompilationStatus.RESULT_CODE_NO_PROFILE -> "No profile installed" + ProfileVerifier.CompilationStatus.RESULT_CODE_NO_PROFILE_INSTALLED -> "No profile installed" ProfileVerifier.CompilationStatus.RESULT_CODE_COMPILED_WITH_PROFILE -> "Compiled" ProfileVerifier.CompilationStatus.RESULT_CODE_COMPILED_WITH_PROFILE_NON_MATCHING -> "Compiled non-matching" diff --git a/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt b/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt index 67c919c07..0fa91c2ab 100644 --- a/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt +++ b/app/src/main/java/eu/kanade/presentation/track/TrackerSearch.kt @@ -1,5 +1,6 @@ package eu.kanade.presentation.track +import android.content.ClipData import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut @@ -47,6 +48,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -55,11 +57,11 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.SolidColor -import androidx.compose.ui.platform.ClipboardManager -import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.Clipboard +import androidx.compose.ui.platform.LocalClipboard import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.platform.toClipEntry import androidx.compose.ui.text.capitalize import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.intl.Locale @@ -73,6 +75,7 @@ import eu.kanade.presentation.manga.components.MangaCover import eu.kanade.presentation.theme.TachiyomiPreviewTheme import eu.kanade.tachiyomi.data.track.model.TrackSearch import eu.kanade.tachiyomi.util.system.openInBrowser +import kotlinx.coroutines.launch import tachiyomi.i18n.MR import tachiyomi.presentation.core.components.ScrollbarLazyColumn import tachiyomi.presentation.core.components.material.Scaffold @@ -240,7 +243,7 @@ private fun SearchResultItem( onClick: () -> Unit, ) { val context = LocalContext.current - val clipboardManager: ClipboardManager = LocalClipboardManager.current + val clipboard: Clipboard = LocalClipboard.current val focusManager = LocalFocusManager.current val type = trackSearch.publishing_type.toLowerCase(Locale.current).capitalize(Locale.current) val status = trackSearch.publishing_status.toLowerCase(Locale.current).capitalize(Locale.current) @@ -248,6 +251,7 @@ private fun SearchResultItem( val shape = RoundedCornerShape(16.dp) val borderColor = if (selected) MaterialTheme.colorScheme.outline else Color.Transparent var dropDownMenuExpanded by remember { mutableStateOf(false) } + val scope = rememberCoroutineScope() Box( modifier = Modifier .fillMaxWidth() @@ -295,7 +299,13 @@ private fun SearchResultItem( expanded = dropDownMenuExpanded, onCollapseMenu = { dropDownMenuExpanded = false }, onCopyName = { - clipboardManager.setText(AnnotatedString(trackSearch.title)) + scope.launch { + val clipEntry = ClipData.newPlainText( + trackSearch.title, + trackSearch.title, + ).toClipEntry() + clipboard.setClipEntry(clipEntry) + } }, onOpenInBrowser = { val url = trackSearch.tracking_url diff --git a/app/src/main/java/eu/kanade/presentation/util/ExceptionFormatter.kt b/app/src/main/java/eu/kanade/presentation/util/ExceptionFormatter.kt index e4e4eed03..db470a0f4 100644 --- a/app/src/main/java/eu/kanade/presentation/util/ExceptionFormatter.kt +++ b/app/src/main/java/eu/kanade/presentation/util/ExceptionFormatter.kt @@ -9,21 +9,21 @@ import tachiyomi.domain.source.model.SourceNotInstalledException import tachiyomi.i18n.MR import java.net.UnknownHostException -context(Context) +context(context: Context) val Throwable.formattedMessage: String get() { when (this) { - is HttpException -> return stringResource(MR.strings.exception_http, code) + is HttpException -> return context.stringResource(MR.strings.exception_http, code) is UnknownHostException -> { - return if (!isOnline()) { - stringResource(MR.strings.exception_offline) + return if (!context.isOnline()) { + context.stringResource(MR.strings.exception_offline) } else { - stringResource(MR.strings.exception_unknown_host, message ?: "") + context.stringResource(MR.strings.exception_unknown_host, message ?: "") } } - is NoResultsException -> return stringResource(MR.strings.no_results_found) - is SourceNotInstalledException -> return stringResource(MR.strings.loader_not_implemented_error) + is NoResultsException -> return context.stringResource(MR.strings.no_results_found) + is SourceNotInstalledException -> return context.stringResource(MR.strings.loader_not_implemented_error) } return when (val className = this::class.simpleName) { "Exception", "IOException" -> message ?: className diff --git a/app/src/main/java/eu/kanade/presentation/util/FastScrollAnimateItem.kt b/app/src/main/java/eu/kanade/presentation/util/FastScrollAnimateItem.kt index a6c9f7019..9d24b8520 100644 --- a/app/src/main/java/eu/kanade/presentation/util/FastScrollAnimateItem.kt +++ b/app/src/main/java/eu/kanade/presentation/util/FastScrollAnimateItem.kt @@ -4,5 +4,7 @@ import androidx.compose.foundation.lazy.LazyItemScope import androidx.compose.ui.Modifier // https://issuetracker.google.com/352584409 -context(LazyItemScope) -fun Modifier.animateItemFastScroll() = this.animateItem(fadeInSpec = null, fadeOutSpec = null) +context(itemScope: LazyItemScope) +fun Modifier.animateItemFastScroll() = with(itemScope) { + this@animateItemFastScroll.animateItem(fadeInSpec = null, fadeOutSpec = null) +} diff --git a/app/src/main/java/eu/kanade/presentation/webview/EhLoginWebViewScreen.kt b/app/src/main/java/eu/kanade/presentation/webview/EhLoginWebViewScreen.kt index 5c94ee8ec..a0015377d 100644 --- a/app/src/main/java/eu/kanade/presentation/webview/EhLoginWebViewScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/webview/EhLoginWebViewScreen.kt @@ -80,7 +80,7 @@ fun EhLoginWebViewScreen( ) is LoadingState.Loading -> { val animatedProgress by animateFloatAsState( - (loadingState as? LoadingState.Loading)?.progress ?: 1f, + loadingState.progress, animationSpec = ProgressIndicatorDefaults.ProgressAnimationSpec, label = "webview_loading", ) diff --git a/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt b/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt index 48c4606d3..4287e105c 100644 --- a/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt +++ b/app/src/main/java/eu/kanade/presentation/webview/WebViewScreenContent.kt @@ -273,7 +273,7 @@ fun WebViewScreenContent( .align(Alignment.BottomCenter), ) is LoadingState.Loading -> LinearProgressIndicator( - progress = { (loadingState as? LoadingState.Loading)?.progress ?: 1f }, + progress = { loadingState.progress }, modifier = Modifier .fillMaxWidth() .align(Alignment.BottomCenter), diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt index 07aa1b632..b8c7fb491 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/anilist/AnilistApi.kt @@ -45,9 +45,9 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { suspend fun addLibManga(track: Track): Track { return withIOContext { - val query = """ - |mutation AddManga(${'$'}mangaId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus, ${'$'}private: Boolean) { - |SaveMediaListEntry (mediaId: ${'$'}mangaId, progress: ${'$'}progress, status: ${'$'}status, private: ${'$'}private) { + val query = $$""" + |mutation AddManga($mangaId: Int, $progress: Int, $status: MediaListStatus, $private: Boolean) { + |SaveMediaListEntry (mediaId: $mangaId, progress: $progress, status: $status, private: $private) { | id | status |} @@ -82,14 +82,14 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { suspend fun updateLibManga(track: Track): Track { return withIOContext { - val query = """ + val query = $$""" |mutation UpdateManga( - |${'$'}listId: Int, ${'$'}progress: Int, ${'$'}status: MediaListStatus, ${'$'}private: Boolean, - |${'$'}score: Int, ${'$'}startedAt: FuzzyDateInput, ${'$'}completedAt: FuzzyDateInput + |$listId: Int, $progress: Int, $status: MediaListStatus, $private: Boolean, + |$score: Int, $startedAt: FuzzyDateInput, $completedAt: FuzzyDateInput |) { |SaveMediaListEntry( - |id: ${'$'}listId, progress: ${'$'}progress, status: ${'$'}status, private: ${'$'}private, - |scoreRaw: ${'$'}score, startedAt: ${'$'}startedAt, completedAt: ${'$'}completedAt + |id: $listId, progress: $progress, status: $status, private: $private, + |scoreRaw: $score, startedAt: $startedAt, completedAt: $completedAt |) { |id |status @@ -118,9 +118,9 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { suspend fun deleteLibManga(track: DomainTrack) { withIOContext { - val query = """ - |mutation DeleteManga(${'$'}listId: Int) { - |DeleteMediaListEntry(id: ${'$'}listId) { + val query = $$""" + |mutation DeleteManga($listId: Int) { + |DeleteMediaListEntry(id: $listId) { |deleted |} |} @@ -139,10 +139,10 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { suspend fun search(search: String): List { return withIOContext { - val query = """ - |query Search(${'$'}query: String) { + val query = $$""" + |query Search($query: String) { |Page (perPage: 50) { - |media(search: ${'$'}query, type: MANGA, format_not_in: [NOVEL]) { + |media(search: $query, type: MANGA, format_not_in: [NOVEL]) { |id |staff { |edges { @@ -201,10 +201,10 @@ class AnilistApi(val client: OkHttpClient, interceptor: AnilistInterceptor) { suspend fun findLibManga(track: Track, userid: Int): Track? { return withIOContext { - val query = """ - |query (${'$'}id: Int!, ${'$'}manga_id: Int!) { + val query = $$""" + |query ($id: Int!, $manga_id: Int!) { |Page { - |mediaList(userId: ${'$'}id, type: MANGA, mediaId: ${'$'}manga_id) { + |mediaList(userId: $id, type: MANGA, mediaId: $manga_id) { |id |status |scoreRaw: score(format: POINT_100) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt index f935f1531..fa0bce639 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/bangumi/Bangumi.kt @@ -113,7 +113,7 @@ class Bangumi(id: Long) : BaseTracker(id, "Bangumi") { // Users can set a 'username' (not nickname) once which effectively // replaces the stringified ID in certain queries. // If no username is set, the API returns the user ID as a strings - var username = api.getUsername() + val username = api.getUsername() saveCredentials(username, oauth.accessToken) } catch (_: Throwable) { logout() diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/Kavita.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/Kavita.kt index 51492e262..ae1068d68 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/Kavita.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/kavita/Kavita.kt @@ -137,7 +137,7 @@ class Kavita(id: Long) : BaseTracker(id, "Kavita"), EnhancedTracker { } authentication.apiUrl = prefApiUrl - authentication.jwtToken = token.toString() + authentication.jwtToken = token } authentications = oauth } diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiApi.kt b/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiApi.kt index 653680604..ae9b518ab 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiApi.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/track/suwayomi/SuwayomiApi.kt @@ -37,14 +37,14 @@ class SuwayomiApi(private val trackId: Long) { public fun sourcePreferences(): SharedPreferences = configurableSource.sourcePreferences() suspend fun getTrackSearch(mangaId: Long): TrackSearch = withIOContext { - val query = """ - |query GetManga(${'$'}mangaId: Int!) { - | manga(id: ${'$'}mangaId) { + val query = $$""" + |query GetManga($mangaId: Int!) { + | manga(id: $mangaId) { | ...MangaFragment | } |} | - |$MangaFragment + |$$MangaFragment """.trimMargin() val payload = buildJsonObject { put("query", query) @@ -87,9 +87,9 @@ class SuwayomiApi(private val trackId: Long) { // TODO: Include a filter on the chapter number here // Below, we only consider older chapters; since v2.1.1985 filtering works properly in the query - val chaptersQuery = """ - |query GetMangaUnreadChapters(${'$'}mangaId: Int!) { - | chapters(condition: {mangaId: ${'$'}mangaId, isRead: false}) { + val chaptersQuery = $$""" + |query GetMangaUnreadChapters($mangaId: Int!) { + | chapters(condition: {mangaId: $mangaId, isRead: false}) { | nodes { | id | chapterNumber @@ -119,20 +119,20 @@ class SuwayomiApi(private val trackId: Long) { } val markQuery = if (deleteDownloadsOnServer) { - """ - |mutation MarkChaptersRead(${'$'}chapters: [Int!]!) { - | updateChapters(input: {ids: ${'$'}chapters, patch: {isRead: true}}) { + $$""" + |mutation MarkChaptersRead($chapters: [Int!]!) { + | updateChapters(input: {ids: $chapters, patch: {isRead: true}}) { | __typename | } - | deleteDownloadedChapters(input: {ids: ${'$'}chapters}) { + | deleteDownloadedChapters(input: {ids: $chapters}) { | __typename | } |} """.trimMargin() } else { - """ - |mutation MarkChaptersRead(${'$'}chapters: [Int!]!) { - | updateChapters(input: {ids: ${'$'}chapters, patch: {isRead: true}}) { + $$""" + |mutation MarkChaptersRead($chapters: [Int!]!) { + | updateChapters(input: {ids: $chapters, patch: {isRead: true}}) { | __typename | } |} @@ -156,9 +156,9 @@ class SuwayomiApi(private val trackId: Long) { .awaitSuccess() } - val trackQuery = """ - |mutation TrackManga(${'$'}mangaId: Int!) { - | trackProgress(input: {mangaId: ${'$'}mangaId}) { + val trackQuery = $$""" + |mutation TrackManga($mangaId: Int!) { + | trackProgress(input: {mangaId: $mangaId}) { | __typename | } |} diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt index be1ef2fc0..7c316d567 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/reader/ReaderViewModel.kt @@ -655,7 +655,7 @@ class ReaderViewModel @JvmOverloads constructor( * if setting is enabled and [currentChapter] is queued for download */ private fun cancelQueuedDownloads(currentChapter: ReaderChapter): Download? { - return downloadManager.getQueuedDownloadOrNull(currentChapter.chapter.id!!.toLong())?.also { + return downloadManager.getQueuedDownloadOrNull(currentChapter.chapter.id!!)?.also { downloadManager.cancelQueuedDownloads(listOf(it)) } } @@ -848,7 +848,7 @@ class ReaderViewModel @JvmOverloads constructor( viewModelScope.launchNonCancellable { updateChapter.await( ChapterUpdate( - id = chapter.id!!.toLong(), + id = chapter.id!!, bookmark = bookmarked, ), ) diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/view/EditTextPreferenceExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/view/EditTextPreferenceExtensions.kt index 4428fb9ae..da3cb6d7d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/view/EditTextPreferenceExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/view/EditTextPreferenceExtensions.kt @@ -5,6 +5,7 @@ package androidx.preference /** * Returns package-private [EditTextPreference.getOnBindEditTextListener] */ +@Suppress("EXTENSION_SHADOWED_BY_MEMBER") fun EditTextPreference.getOnBindEditTextListener(): EditTextPreference.OnBindEditTextListener? { return onBindEditTextListener } diff --git a/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarHeader.kt b/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarHeader.kt index f5dbf5c48..b2cbbee6e 100644 --- a/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarHeader.kt +++ b/app/src/main/java/mihon/feature/upcoming/components/calendar/CalendarHeader.kt @@ -54,9 +54,11 @@ fun CalenderHeader( } Row { IconButton(onClick = onPreviousClick) { + @Suppress("DEPRECATION") Icon(Icons.Default.KeyboardArrowLeft, stringResource(MR.strings.upcoming_calendar_prev)) } IconButton(onClick = onNextClick) { + @Suppress("DEPRECATION") Icon(Icons.Default.KeyboardArrowRight, stringResource(MR.strings.upcoming_calendar_next)) } } diff --git a/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt b/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt index 916ec38f4..a4f5577d3 100644 --- a/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt +++ b/buildSrc/src/main/kotlin/mihon/buildlogic/ProjectExtensions.kt @@ -14,7 +14,6 @@ import org.gradle.kotlin.dsl.provideDelegate import org.gradle.kotlin.dsl.the import org.gradle.kotlin.dsl.withType import org.jetbrains.kotlin.compose.compiler.gradle.ComposeCompilerGradlePluginExtension -import org.jetbrains.kotlin.compose.compiler.gradle.ComposeFeatureFlag import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import java.io.File @@ -42,7 +41,7 @@ internal fun Project.configureAndroid(commonExtension: CommonExtension<*, *, *, compilerOptions { jvmTarget.set(AndroidConfig.JvmTarget) freeCompilerArgs.addAll( - "-Xcontext-receivers", + "-Xcontext-parameters", "-opt-in=kotlin.RequiresOptIn", ) @@ -73,8 +72,6 @@ internal fun Project.configureCompose(commonExtension: CommonExtension<*, *, *, } extensions.configure { - featureFlags.set(setOf(ComposeFeatureFlag.OptimizeNonSkippingGroups)) - val enableMetrics = project.providers.gradleProperty("enableComposeCompilerMetrics").orNull.toBoolean() val enableReports = project.providers.gradleProperty("enableComposeCompilerReports").orNull.toBoolean() diff --git a/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/OkHttpExtensions.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/OkHttpExtensions.kt index 2417f6b90..0a860d069 100755 --- a/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/OkHttpExtensions.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/OkHttpExtensions.kt @@ -134,18 +134,18 @@ fun OkHttpClient.newCachelessCallWithProgress(request: Request, listener: Progre return progressClient.newCall(request) } -context(Json) +context(_: Json) inline fun Response.parseAs(): T { return decodeFromJsonResponse(serializer(), this) } -context(Json) +context(json: Json) fun decodeFromJsonResponse( deserializer: DeserializationStrategy, response: Response, ): T { return response.body.source().use { - decodeFromBufferedSource(deserializer, it) + json.decodeFromBufferedSource(deserializer, it) } } diff --git a/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt index 6a765c680..8c2151ef9 100755 --- a/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt @@ -73,7 +73,7 @@ class CloudflareInterceptor( executor.execute { webview = createWebView(originalRequest) - webview?.webViewClient = object : WebViewClientCompat() { + webview.webViewClient = object : WebViewClientCompat() { override fun onPageFinished(view: WebView, url: String) { fun isCloudFlareBypassed(): Boolean { return cookieManager.get(origRequestUrl.toHttpUrl()) @@ -111,7 +111,7 @@ class CloudflareInterceptor( } } - webview?.loadUrl(origRequestUrl, headers) + webview.loadUrl(origRequestUrl, headers) } latch.awaitFor30Seconds() diff --git a/core/common/src/main/kotlin/mihon/core/common/archive/ArchiveInputStream.kt b/core/common/src/main/kotlin/mihon/core/common/archive/ArchiveInputStream.kt index 71c2b5e68..60668dd09 100644 --- a/core/common/src/main/kotlin/mihon/core/common/archive/ArchiveInputStream.kt +++ b/core/common/src/main/kotlin/mihon/core/common/archive/ArchiveInputStream.kt @@ -7,6 +7,7 @@ import me.zhanghai.android.libarchive.ArchiveException import java.io.InputStream import java.nio.ByteBuffer import kotlin.concurrent.Volatile +import mihon.core.common.archive.ArchiveEntry as MihonArchiveEntry class ArchiveInputStream( buffer: Long, @@ -67,18 +68,20 @@ class ArchiveInputStream( Archive.readFree(archive) } - fun getNextEntry() = Archive.readNextHeader(archive).takeUnless { it == 0L }?.let { entry -> - val name = ArchiveEntry.pathnameUtf8(entry) ?: ArchiveEntry.pathname(entry)?.decodeToString() ?: return null - val isFile = ArchiveEntry.filetype(entry) == ArchiveEntry.AE_IFREG - // SY --> - val isEncrypted = ArchiveEntry.isEncrypted(entry) - // SY <-- - ArchiveEntry( - name, - isFile, + fun getNextEntry(): MihonArchiveEntry? { + return Archive.readNextHeader(archive).takeUnless { it == 0L }?.let { entry -> + val name = ArchiveEntry.pathnameUtf8(entry) ?: ArchiveEntry.pathname(entry)?.decodeToString() ?: return null + val isFile = ArchiveEntry.filetype(entry) == ArchiveEntry.AE_IFREG // SY --> - isEncrypted, + val isEncrypted = ArchiveEntry.isEncrypted(entry) // SY <-- - ) + MihonArchiveEntry( + name, + isFile, + // SY --> + isEncrypted, + // SY <-- + ) + } } } diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt index a0c67a78f..3addbb254 100644 --- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt +++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/SettingsItems.kt @@ -23,11 +23,11 @@ import androidx.compose.material.icons.rounded.CheckBoxOutlineBlank import androidx.compose.material.icons.rounded.DisabledByDefault import androidx.compose.material3.Checkbox import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExposedDropdownMenuAnchorType import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuDefaults import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.MenuAnchorType import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.RadioButton import androidx.compose.material3.Surface @@ -293,7 +293,7 @@ fun SelectItem( ) { OutlinedTextField( modifier = Modifier - .menuAnchor(MenuAnchorType.PrimaryNotEditable) + .menuAnchor(ExposedDropdownMenuAnchorType.PrimaryNotEditable) .fillMaxWidth() .padding( horizontal = SettingsItemsPaddings.Horizontal,