diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMainScreen.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMainScreen.kt index 12c069437..34c24c8e1 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMainScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/SettingsMainScreen.kt @@ -255,7 +255,7 @@ object SettingsMainScreen : Screen() { "${stringResource(MR.strings.app_name)} ${AboutScreen.getVersionName(withBuildDate = false)}" }, icon = Icons.Outlined.Info, - screen = AboutScreen, + screen = AboutScreen(), ), ) } 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 0d496c452..48df38d35 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 @@ -62,7 +62,7 @@ import java.time.Instant import java.time.LocalDateTime import java.time.ZoneId -object AboutScreen : Screen() { +class AboutScreen : Screen() { private fun readResolve(): Any = AboutScreen @Composable @@ -79,10 +79,6 @@ object AboutScreen : Screen() { var isCheckingWhatsComing by remember { mutableStateOf(false) } // KMK <-- - // SY --> - var showWhatsNewDialog by remember { mutableStateOf(false) } - // SY <-- - Scaffold( topBar = { scrollBehavior -> AppBar( @@ -295,13 +291,6 @@ object AboutScreen : Screen() { } } } - - // SY --> - // KMK: Unused now - if (showWhatsNewDialog) { - WhatsNewDialog(onDismissRequest = { showWhatsNewDialog = false }) - } - // SY <-- } /** @@ -343,76 +332,81 @@ object AboutScreen : Screen() { } } - // KMK --> - private suspend fun getReleaseNotes( - context: Context, - onAvailableUpdate: (GetApplicationRelease.Result.NewUpdate) -> Unit, - onFinish: () -> Unit, - ) { - val updateChecker = AppUpdateChecker() - withUIContext { - try { - when (val result = withIOContext { updateChecker.getReleaseNotes() }) { - is GetApplicationRelease.Result.NewUpdate -> { - onAvailableUpdate(result) + companion object { + // KMK --> + suspend fun getReleaseNotes( + context: Context, + onAvailableUpdate: (GetApplicationRelease.Result.NewUpdate) -> Unit, + onFinish: () -> Unit, + ) { + val updateChecker = AppUpdateChecker() + withUIContext { + try { + when (val result = withIOContext { updateChecker.getReleaseNotes() }) { + is GetApplicationRelease.Result.NewUpdate -> { + onAvailableUpdate(result) + } + + else -> {} } - else -> {} + } catch (e: Exception) { + context.toast(e.message) + logcat(LogPriority.ERROR, e) + } finally { + onFinish() } - } catch (e: Exception) { - context.toast(e.message) - logcat(LogPriority.ERROR, e) - } finally { - onFinish() } } - } - // KMK <-- + // KMK <-- - fun getVersionName(withBuildDate: Boolean): String { - return when { - isDebugBuildType -> { - "Debug ${BuildConfig.COMMIT_SHA}".let { - if (withBuildDate) { - "$it (${getFormattedBuildTime()})" - } else { - it + fun getVersionName(withBuildDate: Boolean): String { + return when { + isDebugBuildType -> { + "Debug ${BuildConfig.COMMIT_SHA}".let { + if (withBuildDate) { + "$it (${getFormattedBuildTime()})" + } else { + it + } } } - } - isPreviewBuildType -> { - "Beta r${BuildConfig.COMMIT_COUNT}".let { - if (withBuildDate) { - "$it (${BuildConfig.COMMIT_SHA}, ${getFormattedBuildTime()})" - } else { - "$it (${BuildConfig.COMMIT_SHA})" + + isPreviewBuildType -> { + "Beta r${BuildConfig.COMMIT_COUNT}".let { + if (withBuildDate) { + "$it (${BuildConfig.COMMIT_SHA}, ${getFormattedBuildTime()})" + } else { + "$it (${BuildConfig.COMMIT_SHA})" + } } } - } - else -> { - "Stable ${BuildConfig.VERSION_NAME}".let { - if (withBuildDate) { - "$it (${getFormattedBuildTime()})" - } else { - it + + else -> { + "Stable ${BuildConfig.VERSION_NAME}".let { + if (withBuildDate) { + "$it (${getFormattedBuildTime()})" + } else { + it + } } } } } - } - internal fun getFormattedBuildTime(): String { - return try { - LocalDateTime.ofInstant( - Instant.parse(BuildConfig.BUILD_TIME), - ZoneId.systemDefault(), - ) - .toDateTimestampString( - UiPreferences.dateFormat( - Injekt.get().dateFormat().get(), - ), + internal fun getFormattedBuildTime(): String { + return try { + LocalDateTime.ofInstant( + Instant.parse(BuildConfig.BUILD_TIME), + ZoneId.systemDefault(), ) - } catch (e: Exception) { - BuildConfig.BUILD_TIME + .toDateTimestampString( + UiPreferences.dateFormat( + Injekt.get().dateFormat().get(), + ), + ) + } catch (e: Exception) { + BuildConfig.BUILD_TIME + } } } } diff --git a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/WhatsNewDialog.kt b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/WhatsNewDialog.kt index 0f09ca09a..bb8f915e2 100644 --- a/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/WhatsNewDialog.kt +++ b/app/src/main/java/eu/kanade/presentation/more/settings/screen/about/WhatsNewDialog.kt @@ -2,173 +2,41 @@ package eu.kanade.presentation.more.settings.screen.about -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items import androidx.compose.material3.AlertDialog -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.produceState -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.text.SpanStyle -import androidx.compose.ui.text.buildAnnotatedString -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp +import androidx.compose.ui.tooling.preview.Preview import eu.kanade.tachiyomi.BuildConfig -import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.updater.RELEASE_URL -import eu.kanade.tachiyomi.util.system.isReleaseBuildType -import eu.kanade.tachiyomi.util.system.openInBrowser -import kotlinx.serialization.Serializable -import nl.adaptivity.xmlutil.core.AndroidXmlReader -import nl.adaptivity.xmlutil.serialization.XML -import nl.adaptivity.xmlutil.serialization.XmlSerialName -import nl.adaptivity.xmlutil.serialization.XmlValue -import tachiyomi.core.common.util.lang.withIOContext import tachiyomi.i18n.MR -import tachiyomi.i18n.kmk.KMR -import tachiyomi.i18n.sy.SYMR -import tachiyomi.presentation.core.components.material.padding import tachiyomi.presentation.core.i18n.stringResource @Composable -fun WhatsNewDialog(onDismissRequest: () -> Unit) { - val context = LocalContext.current +fun WhatsNewDialog( + onDismissRequest: () -> Unit, + onOpenWhatsNew: () -> Unit = {}, +) { AlertDialog( onDismissRequest = onDismissRequest, + title = { Text(text = stringResource(MR.strings.updated_version, BuildConfig.VERSION_NAME)) }, confirmButton = { TextButton(onClick = onDismissRequest) { Text(text = stringResource(MR.strings.action_ok)) } }, - title = { Text(text = stringResource(MR.strings.updated_version, BuildConfig.VERSION_NAME)) }, // KMK --> dismissButton = { - TextButton(onClick = { context.openInBrowser(RELEASE_URL) }) { - Text(text = stringResource(KMR.strings.changelogs)) + TextButton(onClick = onOpenWhatsNew) { + Text(text = stringResource(MR.strings.whats_new)) } }, + text = { Text(text = AboutScreen.getVersionName(withBuildDate = true)) }, // KMK <-- - text = { - Column { - val changelog by produceState?>(initialValue = null) { - value = withIOContext { - try { - XML.decodeFromReader( - AndroidXmlReader( - context.resources.openRawResource( - if (isReleaseBuildType) R.raw.changelog_release else R.raw.changelog_preview, - ).bufferedReader(), - ), - ).toDisplayChangelog() - } catch (e: Exception) { - emptyList() - } - } - } - if (changelog != null) { - LazyColumn( - verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.medium), - modifier = Modifier.fillMaxSize(), - ) { - items(changelog.orEmpty()) { changelog -> - Column(Modifier.fillMaxWidth()) { - Text( - text = stringResource(SYMR.strings.changelog_version, changelog.version), - color = MaterialTheme.colorScheme.primary, - fontWeight = FontWeight.Bold, - style = MaterialTheme.typography.titleSmall, - ) - HorizontalDivider(Modifier.padding(vertical = 8.dp)) - Column( - verticalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small), - ) { - changelog.changelog.forEach { - Text(text = it, style = MaterialTheme.typography.bodySmall) - } - } - } - } - } - } - } - }, - modifier = Modifier.fillMaxSize(), ) } -data class DisplayChangelog( - val version: String, - val changelog: List, -) - -@Serializable -@XmlSerialName("changelog", "", "") -data class Changelog( - val bulletedList: Boolean, - val changelogs: List, -) - -@Serializable -@XmlSerialName("changelogversion", "", "") -data class ChangelogVersion( - val versionName: String, - val changeDate: String, - val text: List, -) - -@Serializable -@XmlSerialName("changelogtext", "", "") -data class ChangelogText( - @XmlValue(true) val value: String, -) - -private const val bullet = "\u2022" - -fun Changelog.toDisplayChangelog(): List { - val prefix = if (bulletedList) bullet + "\t\t" else "" - return changelogs.map { version -> - DisplayChangelog( - version = version.versionName, - changelog = version.text.mapIndexed { index, changelogText -> - buildAnnotatedString { - append(prefix) - var inBBCode = false - var isEscape = false - changelogText.value.forEachIndexed { charIndex, c -> - if (!inBBCode && c == '[') { - inBBCode = true - } else if (inBBCode && c == ']') { - inBBCode = false - isEscape = false - } else if (inBBCode && c == '/') { - isEscape = true - } else if (inBBCode && c == 'b') { - if (isEscape) { - try { - pop() - } catch (e: IllegalStateException) { - throw Exception("Exception on ${version.versionName}:$index:$charIndex", e) - } - } else { - pushStyle(SpanStyle(fontWeight = FontWeight.Bold)) - } - } else { - append(c) - } - } - } - }, - ) - } +@Preview +@Composable +fun WhatsNewDialogPreview() { + WhatsNewDialog({}) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index 306002540..eb33d05eb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -62,6 +62,7 @@ import eu.kanade.presentation.components.RestoringBannerBackgroundColor import eu.kanade.presentation.components.SyncingBannerBackgroundColor import eu.kanade.presentation.components.UpdatingBannerBackgroundColor import eu.kanade.presentation.more.settings.screen.ConfigureExhDialog +import eu.kanade.presentation.more.settings.screen.about.AboutScreen.Companion.getReleaseNotes import eu.kanade.presentation.more.settings.screen.about.WhatsNewDialog import eu.kanade.presentation.more.settings.screen.browse.ExtensionReposScreen import eu.kanade.presentation.more.settings.screen.data.RestoreBackupScreen @@ -86,6 +87,7 @@ import eu.kanade.tachiyomi.ui.home.HomeScreen import eu.kanade.tachiyomi.ui.manga.MangaScreen import eu.kanade.tachiyomi.ui.more.NewUpdateScreen import eu.kanade.tachiyomi.ui.more.OnboardingScreen +import eu.kanade.tachiyomi.ui.more.WhatsNewScreen import eu.kanade.tachiyomi.util.system.dpToPx import eu.kanade.tachiyomi.util.system.isDebugBuildType import eu.kanade.tachiyomi.util.system.isNavigationBarNeedsScrim @@ -106,6 +108,7 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import logcat.LogPriority import mihon.core.migration.Migrator +import mihon.core.migration.Migrator.scope import tachiyomi.core.common.Constants import tachiyomi.core.common.preference.Preference import tachiyomi.core.common.preference.PreferenceStore @@ -360,12 +363,12 @@ class MainActivity : BaseActivity() { 0, ) val previewCurrentVersion = BuildConfig.COMMIT_COUNT.toInt() + var isCheckingWhatsNew by remember { mutableStateOf(false) } // KMK <-- var showChangelog by remember { mutableStateOf( // KMK --> - // isDebugBuildType || isReleaseBuildType && didMigration || isPreviewBuildType && @@ -374,9 +377,35 @@ class MainActivity : BaseActivity() { ) } if (showChangelog) { - // SY --> - WhatsNewDialog(onDismissRequest = { showChangelog = false }) - // SY <-- + // KMK --> + WhatsNewDialog( + onDismissRequest = { showChangelog = false }, + onOpenWhatsNew = { + showChangelog = false + if (!isCheckingWhatsNew) { + scope.launch { + isCheckingWhatsNew = true + + getReleaseNotes( + context = context, + onAvailableUpdate = { result -> + val whatsNewScreen = WhatsNewScreen( + currentVersion = BuildConfig.VERSION_NAME, + versionName = result.release.version, + changelogInfo = result.release.info, + releaseLink = result.release.releaseLink, + ) + navigator?.push(whatsNewScreen) + }, + onFinish = { + isCheckingWhatsNew = false + }, + ) + } + } + }, + ) + // KMK <-- } // KMK --> previewLastVersion.set(previewCurrentVersion) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsScreen.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsScreen.kt index 3d396ace9..77300409f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsScreen.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsScreen.kt @@ -35,7 +35,7 @@ class SettingsScreen( if (!isTabletUi()) { Navigator( screen = when (destination) { - Destination.About.id -> AboutScreen + Destination.About.id -> AboutScreen() Destination.DataAndStorage.id -> SettingsDataScreen Destination.Tracking.id -> SettingsTrackingScreen else -> SettingsMainScreen @@ -56,7 +56,7 @@ class SettingsScreen( } else { Navigator( screen = when (destination) { - Destination.About.id -> AboutScreen + Destination.About.id -> AboutScreen() Destination.DataAndStorage.id -> SettingsDataScreen Destination.Tracking.id -> SettingsTrackingScreen else -> SettingsAppearanceScreen diff --git a/app/src/main/res/raw/changelog_preview.xml b/app/src/main/res/raw/changelog_preview.xml deleted file mode 100644 index bacddc87c..000000000 --- a/app/src/main/res/raw/changelog_preview.xml +++ /dev/null @@ -1,121 +0,0 @@ - - - - [b]New:[/b] Add user manga notes - [b]New:[/b] Display all similarly named duplicates in duplicate manga dialogue - [b]New:[/b] Allow `migrate` mangas when using `Bulk-favorite` - [b]New:[/b] Add markdown support for manga descriptions - [b]New:[/b] Bring back original Mihon's direct migration dialog - [b]New:[/b] Allow to top align the cover in manga info view - [b]Improve:[/b] Update non-library manga data when browsing - [b]Improve:[/b] Deduplicate entries when browsing - [b]Fix:[/b] Mark existing duplicate read chapters as read option not working in some cases - [b]Fix:[/b] NaN crash when dragging `Start/Resume` reading button in MangaScreen - [b]Fix:[/b] Reader's chapter list for Merged entry - [b]Fix:[/b] `Refresh covers` was limited by Smart Update - [b]Fix:[/b] App bar action tooltips blocking clicks - [b]Fix:[/b] Page number not appearing when opening chapter - - - [b]New:[/b] Open source settings from Browse & Manga screen - [b]New:[/b] Add badge to UpdateScreen header - [b]New:[/b] Add prefix search to search by internal DB ID - [b]Improve:[/b] EH/ExH: better language detection in case actual language tag is not the first one - [b]Improve:[/b] Restore original list header's background color - [b]Improve:[/b] Move `Suggestions` settings to same place - [b]Improve:[/b] Replace repo icon - [b]Improve:[/b] Removed 6h auto updates - [b]Improve:[/b] Add back option to hide unread chapter badge in library - [b]Improve:[/b] Make more sliders discrete and ensure they don't look out of place - [b]Fix:[/b] Backup sharing from notifications not working when app is in background - [b]Fix:[/b] Messed up trackers progress update always auto sync - [b]Fix:[/b] Vertical chapter navigator overlap bottom bar - [b]Fix:[/b] Reorder feeds - [b]Fix:[/b] Pinned sources were not restored from backup - [b]Fix:[/b] Update base URL and host for Pururin to pururin.me - [b]Fix:[/b] Bangumi search including novels - - - [b]New:[/b] Hide excluded scanlators from Update view - [b]New:[/b] Use COMPLETE category when sync finishes - [b]New:[/b] Display staff information on Anilist tracker search results - [b]New:[/b] Implement vertical page panning in paged reader mode when using hardware keys - [b]Improve:[/b] Update view's UI & order (always show latest unread chapter first) - [b]Improve:[/b] Change label of setting to always use SSIV in long strip reader - [b]Improve:[/b] Bump default user agent - [b]Improve:[/b] Description showing which sources support batch-add - [b]Improve:[/b] Spoof or remove `X-Requested-With` header from webview - [b]Fix:[/b] delegate nhentai failed to load cover - [b]Fix:[/b] Attempt to fix crash when migrating or removing entries from library - [b]Fix:[/b] fill info from trackers only looking for specific 'Art' or 'Story' - [b]Fix:[/b] an issue where tracker reading progress is changed to a lower value - - - [b]New:[/b] Add button to favorite manga from history screen - [b]New:[/b] Support for private tracking with AniList, Bangumi, Kitsu - [b]New:[/b] Add option to export minimal library information to a CSV file - [b]New:[/b] Add "Monochrome" theme - [b]Improve:[/b] Apply "Downloaded only" filter to all entries regardless of favourite status - [b]Improve:[/b] Remove alphabetical category/feed sort option - [b]Improve:[/b] Improve support for drag-and-drop category/feed reordering - [b]Improve:[/b] Migrate to Bangumi's newer v0 API - [b]Improve:[/b] Ignore hidden files/folders for Local Source chapter list - [b]Improve:[/b] priority manga update list - [b]Fix:[/b] App's preferences referencing deleted categories - [b]Fix:[/b] Bangumi login regression - [b]Fix:[/b] Xiaomi webview - [b]Fix:[/b] Comick recommendations failed due to empty cover list - [b]Fix:[/b] Migrate filter Obsolete was showing E-H/ExH source - [b]Fix:[/b] don't expand manga description if it's favorited - - - [b]Improve:[/b] (EditMergedSettings): Allow open merge children manga - [b]Improve:[/b] Add manual install button to App installing notification - [b]Improve:[/b] Rework slider UI - [b]Improve:[/b] Add Infinix system app to list of invalid browsers - [b]Improve:[/b] Translations update from Hosted Weblate - [b]Fix:[/b] crash when extensions trying to destructuring MangasPage - [b]Fix:[/b] (PreferenceRestorer): correctly backup/restore preferences related to category - [b]Fix:[/b] (MangaRestorer): avoid chapter's order mixed up when backup restore/sync - [b]Fix:[/b] (BackupRestorer): avoid issue of late restoring categories - [b]Fix:[/b] (EXH): Migrate old source to new source for merge references - [b]Fix:[/b] (MangaRestorer): avoid exception caused by duplicate entries - [b]Fix:[/b] MAL tracker losing track of login expiration - [b]Fix:[/b] Bangumi tracker losing track of login expiration - [b]Fix:[/b] loading Merged source should be independent of integrated-H switch - - - [b]New:[/b] feat: unify recommendation screens and add more sources - [b]New:[/b] built-in EH compatible with extension - [b]New:[/b] Notification rich info - [b]New:[/b] Drag to reorder feeds - [b]New:[/b] Add option to enable incognito mode per extension - [b]New:[/b] feat: add global search shortcut to SmartSearch - [b]Improve:[/b] update website link - [b]Improve:[/b] add webview to Extension detail screen - [b]Improve:[/b] Restore chapter's bookmark & oldest dateUpload from backup - [b]Improve:[/b] Update Bangumi - [b]Fix:[/b] custom theme color in various AndroidView - [b]Fix:[/b] Mangadex fix alt title being removed by cleanDescription - [b]Fix:[/b] was not showing entry after importing entry with deep-link - [b]Fix:[/b] add entry to favorite when importing via deep-link - [b]Fix:[/b] crash when open manga/chapter deep-link or SmartSearch caused by #612 - [b]Fix:[/b] (myanimelist): Fix nullability and fallback to medium cover if large cover is null - [b]Fix:[/b] (download): Making sure archive tmp file is created properly - - - [b]New:[/b] Group update entries together - [b]New:[/b] Drag & Drop to reorder category quickly in Settings/Category screen - [b]Improve:[/b] Fast browsing - [b]Improve:[/b] Allow disable app auto-update - [b]Improve:[/b] Allow edit migration options while already being searching - [b]Improve:[/b] Don't auto-expand manga when browsing if is favorited - [b]Improve:[/b] Add option to always use SSIV for image decoding - [b]Fix:[/b] Duplicate chapters on backup restoring - [b]Fix:[/b] Exclude categories when delete read chapter, except manually deleting - [b]Fix:[/b] Download job stops all together even if 1 entry is failed to create directory - [b]Fix:[/b] App shortcuts - [b]Fix:[/b] Color Fill manga info from tracker - [b]Fix:[/b] Some debug functions name - - diff --git a/app/src/main/res/raw/changelog_release.xml b/app/src/main/res/raw/changelog_release.xml deleted file mode 100644 index 38ca63f04..000000000 --- a/app/src/main/res/raw/changelog_release.xml +++ /dev/null @@ -1,313 +0,0 @@ - - - - [b]New:[/b] Open source settings from Browse & Manga screen - [b]New:[/b] Add badge to UpdateScreen header - [b]Improve:[/b] EH/ExH: better language detection in case actual language tag is not the first one - [b]Improve:[/b] Move `Suggestions` settings to same place - [b]Improve:[/b] Add back option to hide unread chapter badge in library - [b]Fix:[/b] Backup sharing from notifications not working when app is in background - [b]Fix:[/b] Messed up trackers progress update always auto sync - [b]Fix:[/b] Vertical chapter navigator overlap bottom bar - [b]Fix:[/b] Update base URL and host for Pururin to pururin.me - [b]Fix:[/b] Bangumi search including novels - - - [b]New:[/b] feat: unify recommendation screens combine MAL, AniList, MangaUpdates, MangaDex, Comick - [b]New:[/b] Support for private tracking with AniList, Bangumi, Kitsu - [b]New:[/b] Notification rich info - [b]New:[/b] Drag to reorder feeds - [b]New:[/b] Hide excluded scanlators from Update view - [b]New:[/b] Built-in EH compatible with extension - [b]New:[/b] Add option to enable incognito mode per extension - [b]New:[/b] Add button to favorite manga from history screen - [b]New:[/b] Use COMPLETE category when sync finishes - [b]New:[/b] Display staff information on Anilist tracker search results - [b]New:[/b] Implement vertical page panning in paged reader mode when using hardware keys - [b]New:[/b] Add global search shortcut to SmartSearch - [b]New:[/b] Add option to export minimal library information to a CSV file - [b]New:[/b] Add "Monochrome" theme - [b]New:[/b] Add prefix search to search by internal DB ID - [b]Improve:[/b] Update view's UI & order (always show latest unread chapter first) (cuong-tran) - [b]Improve:[/b] (EditMergedSettings): Allow open merge children manga - [b]Improve:[/b] Apply "Downloaded only" filter to all entries regardless of favourite status - [b]Improve:[/b] Remove alphabetical category/feed sort option - [b]Improve:[/b] Restore chapter's bookmark & oldest dateUpload from backup - [b]Improve:[/b] Migrate to Bangumi's newer v0 API - [b]Improve:[/b] Priority manga update list - [b]Improve:[/b] Ignore hidden files/folders for Local Source chapter list - [b]Improve:[/b] add webview to Extension detail screen - [b]Improve:[/b] Rework slider UI - [b]Improve:[/b] Improve support for drag-and-drop category reordering - [b]Improve:[/b] Change label of setting to always use SSIV in long strip reader - [b]Improve:[/b] Bump default user agent - [b]Improve:[/b] Description showing which sources support batch-add - [b]Improve:[/b] Spoof or remove `X-Requested-With` header from webview - [b]Improve:[/b] update website link - [b]Improve:[/b] Restore original list header's background color - [b]Improve:[/b] Replace repo icon - [b]Improve:[/b] Removed 6h auto updates - [b]Fix:[/b] Infinix, Xiaomi webview - [b]Fix:[/b] App's preferences referencing deleted categories - [b]Fix:[/b] Bangumi login regression - [b]Fix:[/b] Migrate filter Obsolete was showing E-H/ExH source - [b]Fix:[/b] don't expand manga description if it's favorited - [b]Fix:[/b] custom theme color in various AndroidView - [b]Fix:[/b] Mangadex fix alt title being removed by cleanDescription - [b]Fix:[/b] was not showing entry after importing entry with deep-link - [b]Fix:[/b] add entry to favorite when importing via deep-link - [b]Fix:[/b] (PreferenceRestorer): correctly backup/restore preferences related to category - [b]Fix:[/b] (MangaRestorer): avoid chapter's order mixed up when backup restore/sync - [b]Fix:[/b] (BackupRestorer): avoid issue of late restoring categories - [b]Fix:[/b] (MangaRestorer): avoid exception caused by duplicate entries - [b]Fix:[/b] (myanimelist): Fix nullability and fallback to medium cover if large cover is null - [b]Fix:[/b] MAL tracker losing track of login expiration - [b]Fix:[/b] Bangumi tracker losing track of login expiration - [b]Fix:[/b] (download): Making sure archive tmp file is created properly - [b]Fix:[/b] delegate nhentai failed to load cover - [b]Fix:[/b] Attempt to fix crash when migrating or removing entries from library - [b]Fix:[/b] fill info from trackers only looking for specific 'Art' or 'Story' - [b]Fix:[/b] an issue where tracker reading progress is changed to a lower value - [b]Fix:[/b] Messed up trackers progress update always auto sync - [b]Fix:[/b] Update base URL and host for Pururin to pururin.me - - - [b]Fix:[/b] crash due to extensions destructuring MangasPage - - - [b]New:[/b] Remove extensions repo - [b]Improve:[/b] Allow manual install app update - - - [b]New:[/b] Group update entries together - [b]New:[/b] Drag & Drop to reorder category quickly in Settings/Category screen - [b]Improve:[/b] Fast browsing - [b]Improve:[/b] Allow disable app auto-update - [b]Improve:[/b] Allow edit migration options while already being searching - [b]Improve:[/b] Don't auto-expand manga when browsing if is favorited - [b]Improve:[/b] Add option to always use SSIV for image decoding - [b]Fix:[/b] Duplicate chapters on backup restoring - [b]Fix:[/b] Exclude categories when delete read chapter, except manually deleting - [b]Fix:[/b] Download job stops all together even if 1 entry is failed to create directory - [b]Fix:[/b] App shortcuts - [b]Fix:[/b] Color Fill manga info from tracker - [b]Fix:[/b] Some debug functions name - - - [b]New:[/b] Auto install app update - [b]New:[/b] filter only Obsolete sources in Migration screen - [b]New:[/b] Get manga info from tracker - [b]Improve:[/b] App update retry/resume - [b]Improve:[/b] add manual download & error message to app update error notification - [b]Improve:[/b] add webp support to nh - [b]Improve:[/b] Improve saved-search usage - [b]Improve:[/b] allow using saved-search while migration source search - [b]Improve:[/b] Trying to load saved-search as much as possible even though filterList might changed - [b]Improve:[/b] allow reset filters on SourceFeedScreen - [b]Improve:[/b] change bulk-favorite icon to Heart - [b]Improve:[/b] Bump default user agent - [b]Improve:[/b] Auto format extension repo URLs - [b]Improve:[/b] Some improvements to Bangumi tracker search - [b]Improve:[/b] support comma (,) delimiter when searching library - [b]Improve:[/b] Do not sync automatically when not connected to a network. - [b]Improve:[/b] Improve hardware bitmap threshold option - [b]Improve:[/b] Add option to lower the threshold for hardware bitmaps - [b]Improve:[/b] Switch to hardware bitmap in reader only if device can handle it - [b]Improve:[/b] Add a Honor system app to list of invalid browsers - [b]Improve:[/b] Increase new updates count when updates found - [b]Improve:[/b] favorites sync statuses - [b]Improve:[/b] Update usage of work:work-runtime - [b]Improve:[/b] Update tag lists - [b]Improve:[/b] Always use software bitmap on certain devices - [b]Fix:[/b] nH cover - [b]Fix:[/b] Maintain correct source order even when receiving new chapters from a sync service - [b]Fix:[/b] null categories in Settings/Downloads/Exclude - [b]Fix:[/b] idle status set - [b]Fix:[/b] source-search clear causing disappearance of search box - [b]Fix:[/b] a possible crash with auto-zoom - [b]Fix:[/b] multiple issues with the E-H updater - [b]Fix:[/b] Reader's dialog font size - [b]Fix:[/b] crash on MigrationListScreen with null accessing a mutableState when it's being put in the background - [b]Fix:[/b] app onStart sync - [b]Fix:[/b] crashes from Exh Updater - [b]Fix:[/b] InterceptActivity crash - [b]Fix:[/b] long strip images not loading in some old devices - [b]Fix:[/b] a rare crash when invoking "Mark previous as read" action - [b]Fix:[/b] fix: app update error notification always disappeared - [b]Fix:[/b] Fix reader transition color scheme in auto background mode - - - [b]New:[/b] Error screen - [b]New:[/b] Hidden categories - [b]New:[/b] Range-selection for Migration - [b]New:[/b] show all entries going to be checked for Smart update on Upcoming screen - [b]New:[/b] allow Feed to hide entries already in Library - [b]New:[/b] Added random library sort - [b]New:[/b] Add option to opt out of Crashlytics - [b]New:[/b] Panorama cover - [b]New:[/b] read/resume button movable - [b]New:[/b] show number of entries on upcoming screen - [b]New:[/b] saved search tabs for browse source - [b]New:[/b] reorder feeds & saved-searches - [b]New:[/b] disable smart-update for individual & fix custom interval - [b]New:[/b] Option to update trackers when chapter marked as read - [b]New:[/b] Add source search, icon flags on Feed adding dialog - [b]New:[/b] Showing source icon in library - [b]New:[/b] Use language flags - [b]New:[/b] Bulk-merging multiple library entries - [b]New:[/b] Ability to enable/disable repo - [b]New:[/b] Show repo icon for Repo - [b]New:[/b] Custom themes - [b]New:[/b] Allow sync Feeds & extension-repo settings - [b]New:[/b] Add 'show entry' action to download notifications - [b]New:[/b] Add option to skip downloading duplicate read chapters - [b]New:[/b] Delete duplicate downloaded chapters when they are automatically marked as read - [b]New:[/b] Add migrate option to only show entries with new chapters - [b]New:[/b] add source search to pre-migration screen - [b]New:[/b] Add Copy Tracker URL on icon long press - [b]New:[/b] Add a button to select all scanlators - [b]New:[/b] Add an "open in browser" button to reader menu - [b]New:[/b] Add Backup and Restore of Extension Repos - [b]New:[/b] Remove the 'UNOFFICIAL' status, remove built-in Komikku repo, instead allow adding it as default - [b]Improve:[/b] Default disable Integrated H features - [b]Improve:[/b] show duplicating manga cover on Duplicate dialog - [b]Improve:[/b] allow chapter 0 dupe auto mark as read - [b]Improve:[/b] rework panorama cover settings - [b]Improve:[/b] update all trackers based on common data when new tracker is added - [b]Improve:[/b] show a toast whenever progress is synced from Trackers - [b]Improve:[/b] Allow Always/Ask/Nerver update trackers on mark as read - [b]Improve:[/b] Avoid blocking call causing lag in settings - [b]Improve:[/b] Add Quantity Badge to Upcoming Screen - [b]Improve:[/b] make global search pinned/all sticky - [b]Improve:[/b] hide Pinned chip in Global/Migrate Search if no pinned sources available - [b]Improve:[/b] Allow adding multiple tags separated by commas - [b]Improve:[/b] show loading indicator while bulk-selection is running - [b]Improve:[/b] bulk-selection: reverse selection - [b]Improve:[/b] Reload saved-searches when screen is navigated back to - [b]Improve:[/b] only load suggestions after entry finished loading info & chapters - [b]Improve:[/b] Hide sync library option when sync is disabled - [b]Improve:[/b] Show download state and progress on reader chapter list. - [b]Improve:[/b] Confirmation dialog when removing privately installed extensions - [b]Improve:[/b] hide batch add if integrated H & Delegated src is off - [b]Improve:[/b] add MangaDex to Batch-Add example - [b]Improve:[/b] Support skip-downloading-duplicate-read-chapters for merged entries - [b]Improve:[/b] Show local chapters as downloaded on merged entries - [b]Improve:[/b] Re-enable fetching chapters list for entries with licensed status - [b]Improve:[/b] Respect `thumbnailQuality` and `tryUsingFirstVolumeCover` preferences - [b]Improve:[/b] Reduce ChapterNavigator horizontal padding on small ui - [b]Improve:[/b] hide display mode for E-H - [b]Improve:[/b] Ignore "intent://" urls on webview - [b]Improve:[/b] Remove legacy broken source and history backup - [b]Improve:[/b] Rename Related Titles to Suggestions - [b]Improve:[/b] Add more auto backup hours - [b]Improve:[/b] Add option to update library each 6 hours - [b]Improve:[/b] Back-button on pre-migration source - [b]Improve:[/b] Don't expand description on the manga while merging - [b]Improve:[/b] Hide keyboard when a Tracker SearchResultItem is clicked - [b]Improve:[/b] Move dropdown menu to correct position - [b]Improve:[/b] Add extensions list refresh menu - [b]Improve:[/b] Add confirmation when adding repo via URI - [b]Improve:[/b] Respect privacy settings in extension update notification - [b]Improve:[/b] Option to not backup Saved searches & Feeds - [b]Improve:[/b] allow canceling search for a migrating manga without remove it - [b]Improve:[/b] put Suggestions in overflow - [b]Improve:[/b] Smart library updates now will honor the 'Skip Completed' option - [b]Fix:[/b] for ExH - [b]Fix:[/b] sync progress from tracker not working if chapters order is messed up after backup restoration - [b]Fix:[/b] app crash when removing tracked entry from tracker - [b]Fix:[/b] late loading saved-searches when jump from SourceFeedScreen or FeedScreen - [b]Fix:[/b] reader slider - [b]Fix:[/b] settings SliderItem steps count - [b]Fix:[/b] source search box's height - [b]Fix:[/b] issue with not showing source names in merged manga sometimes - [b]Fix:[/b] EnhancedTracker not auto binding when adding manga to library - [b]Fix:[/b] Retain remote last chapter read if it's higher than the local one for EnhancedTracker - [b]Fix:[/b] Kitsu `ratingTwenty` being typed as String - [b]Fix:[/b] Kitsu `synopsis` nullability - [b]Fix:[/b] Update Kitsu's domain to kitsu.app - [b]Fix:[/b] wrong feed adding when filter search - [b]Fix:[/b] Setting to hide home button while browsing Suggestions - [b]Fix:[/b] settings to show/hide progress-banner were not working - [b]Fix:[/b] Fix MAL search results not showing start dates - [b]Fix:[/b] wrong initial number of migrating items - [b]Fix:[/b] Don't crash on ill-formed URLs - [b]Fix:[/b] Handle Android SDK 35 API collision - [b]Based on Mihon stable 0.17.0 (Oct 26, 2024)[/b] - [b]Based on TachiyomiSY stable 1.11.0 (Oct 28, 2024)[/b] - - - [b]New:[/b] Support for backing up and restoring Feeds - [b]New:[/b] Allow changing feeds' order - [b]New:[/b] Show progress-banner for sync/restore/update - [b]New:[/b] Jump to entry from download queue item - [b]New:[/b] Long-click search drop-down menu for entry's title/author/artist/source - [b]New:[/b] Support sources search in Migrate Source Screen - [b]New:[/b] Onboarding permissions request for external storage - [b]New:[/b] Request for storage permission when saving pictures (Android P & below) - [b]New:[/b] Adds Reader Option to Copy Panel to Clipboard - [b]New:[/b] Added configuration options to e-ink page flashes - [b]Improve:[/b] Update default popular user-agent, better support Cloudflare - [b]Improve:[/b] Google drive sync - [b]Improve:[/b] Make global search 'Has result' sticky - [b]Improve:[/b] Background color for favorite entries - [b]Fix:[/b] Update E-H to support libraryColored, bulk-selection overlay - [b]Fix:[/b] Copy icon (migration whole list) was always migrating instead of copy - [b]Fix:[/b] Migrate/copy manga with 'Delete downloaded' unticked had no effect but always delete - [b]Fix:[/b] Background color of selected entries - [b]Fix:[/b] (performance) rework cover's loading animation - [b]Fix:[/b] (performance) laggy after browsing library for a while - [b]Fix:[/b] Revert chapter's filter icon - - - [b]Komikku's Discord channel[/b] - [b]New:[/b] App icon - [b]New:[/b] More App themes - [b]New:[/b] Theme based on entry's cover color - [b]New:[/b] More suggestions with a dedicated screen - [b]Improved:[/b] Faster loading of related entries - [b]Improve:[/b] Better background for full cover view - [b]Improve:[/b] Better cover-error & cover-loading - [b]New:[/b] Auto 2-way sync read chapters from Trackers & swipe read to update - [b]New:[/b] Add NSFW filter & source search into Merge screen - [b]Improve:[/b] Sticky header & language for sources filter - [b]Fix:[/b] Allow manual edit on Tracker's chapter (must hit Done on keyboard) - [b]Fix:[/b] Genre tag search while browsing Suggestions or from Feed Screen - [b]Fix:[/b] Bangumi tracker - [b]Fix:[/b] sometimes it's loading forever if app sleeps for too long (in Source's feed & browse screens) - [b]Fix:[/b] GDrive error message - [b]New:[/b] A peek into Preview-build's 'What's New' in About screen - [b]New:[/b] Support only Android 8+ - [b]Improve:[/b] Update translation - [b]Based on TachiyomiSY stable 1.10.6 (Mar 4, 2024)[/b] - [b]Based on Mihon stable 0.16.5 (Apr 9, 2024)[/b] - [b]New:[/b] Trust all extensions by repo - [b]New:[/b] Add Namicomi support for external chapters on MD - [b]Improved:[/b] Massively improve findFile performance - [b]Fix:[/b] storage permission request for non-conforming devices - - - [b]New[/b] Show related mangas for all sources - [b]New[/b] Bulk select multiple entries to favorite/category - [b]New[/b] Search for sources in Browse screen - [b]New[/b] Quick NSFW sources filter in both Extensions/Browse screen - [b]Improved[/b] Feeds screen support all sources - [b]Improved[/b] More Feed's entries - Built-in official extensions repo - [b]Improved[/b] Click manga's source name will jump to source browsing - [b]Improved[/b] Show extensions/sources NSFW & languages tag - [b]Improved[/b] Jump to extensions' settings from Source screen - Migrate to Komikku's own Tracking clients - [b]New[/b] Configurable interval to refresh entries from downloaded storage - Updater switched to method similar to Mihon's - Revert back support to show extensions' changelog & readme - [b]Based on TachiyomiSY stable 1.10.5 (Mar 2,2024)[/b] - [b]Based on Mihon stable 0.16.4 (from 0.16.3)[/b] - Minor fix for marking duplicate chapters as read - Include the delayed tracker update fix - - - [b]New[/b] quick clean Titles, adds a quick clean that will clean titles from manga from certain sources, it will quickly remove unnecessary bloat - [b]Rewritten[/b] rewrite the library search engine (that was inherited from EH), it now can exclude, use quotes for absolute searches, it supports namespace tags, and a bunch more, its probably the most advanced search engine any Tachi fork has - [b]New[/b] smart Background, when using a pager like LTR, the background will now change color depending on the page (from J2k) - -