From b4638017dd774d9dcd325258611f663083493015 Mon Sep 17 00:00:00 2001 From: Ahmad Ansori Palembani Date: Sat, 8 Jun 2024 08:36:56 +0700 Subject: [PATCH] feat: Some QoL features (GH-85) Co-authored-by: AshbornXS <75546030+AshbornXS@users.noreply.github.com> --- .../dev/yokai/domain/base/BasePreferences.kt | 14 +++++ .../ui/download/DownloadBottomSheet.kt | 8 +++ .../ui/extension/ExtensionBottomPresenter.kt | 18 +++++- .../ui/extension/ExtensionBottomSheet.kt | 4 ++ .../tachiyomi/ui/library/LibraryController.kt | 4 ++ .../tachiyomi/ui/library/LibraryPresenter.kt | 13 +++- .../kanade/tachiyomi/ui/main/MainActivity.kt | 61 +++++++++++++++---- .../controllers/SettingsGeneralController.kt | 24 ++++++++ .../globalsearch/GlobalSearchController.kt | 18 +++++- .../ui/webview/BaseWebViewActivity.kt | 3 + .../tachiyomi/ui/webview/WebViewActivity.kt | 11 ++++ .../tachiyomi/util/system/WebViewUtil.kt | 2 + app/src/main/res/layout/webview_activity.xml | 50 +++++++++++---- app/src/main/res/menu/download_single.xml | 5 +- app/src/main/res/menu/webview.xml | 5 ++ app/src/main/res/values-pt-rBR/strings.xml | 3 +- app/src/main/res/values/strings.xml | 7 +++ 17 files changed, 223 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/dev/yokai/domain/base/BasePreferences.kt b/app/src/main/java/dev/yokai/domain/base/BasePreferences.kt index dbf61bb2b2..d141611d19 100644 --- a/app/src/main/java/dev/yokai/domain/base/BasePreferences.kt +++ b/app/src/main/java/dev/yokai/domain/base/BasePreferences.kt @@ -22,4 +22,18 @@ class BasePreferences(private val preferenceStore: PreferenceStore) { fun hasShownOnboarding() = preferenceStore.getBoolean(Preference.appStateKey("onboarding_complete"), false) fun crashReport() = preferenceStore.getBoolean("pref_crash_report", true) + + fun longTapBrowseNavBehaviour() = preferenceStore.getEnum("pref_browser_long_tap", LongTapBrowse.DEFAULT) + + enum class LongTapBrowse(@StringRes val titleResId: Int) { + DEFAULT(R.string.browse_long_tap_default), + SEARCH(R.string.browse_long_tap_search), + } + + fun longTapRecentsNavBehaviour() = preferenceStore.getEnum("pref_recents_long_tap", LongTapRecents.DEFAULT) + + enum class LongTapRecents(@StringRes val titleResId: Int) { + DEFAULT(R.string.recents_long_tap_default), + LAST_READ(R.string.recents_long_tap_last_read) + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadBottomSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadBottomSheet.kt index de9c528a2a..b8ad6267dc 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadBottomSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/download/DownloadBottomSheet.kt @@ -356,6 +356,14 @@ class DownloadBottomSheet @JvmOverloads constructor( ?: Pair(listOf(), listOf()) presenter.reorder(selectedSeries + otherSeries) } + R.id.move_to_bottom_series -> { + val (selectedSeries, otherSeries) = adapter?.currentItems + ?.filterIsInstance() + ?.map(DownloadItem::download) + ?.partition { item.download.manga.id == it.manga.id } + ?: Pair(listOf(), listOf()) + presenter.reorder(otherSeries + selectedSeries) + } R.id.cancel_series -> { val allDownloadsForSeries = adapter?.currentItems ?.filterIsInstance() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionBottomPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionBottomPresenter.kt index a67ee962bf..18a79d8fed 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionBottomPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionBottomPresenter.kt @@ -2,6 +2,9 @@ package eu.kanade.tachiyomi.ui.extension import android.content.pm.PackageInstaller import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.download.DownloadManager +import eu.kanade.tachiyomi.data.download.model.Download +import eu.kanade.tachiyomi.data.download.model.DownloadQueue import eu.kanade.tachiyomi.extension.ExtensionInstallerJob import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.extension.model.Extension @@ -10,12 +13,15 @@ import eu.kanade.tachiyomi.extension.model.InstalledExtensionsOrder import eu.kanade.tachiyomi.extension.util.ExtensionLoader import eu.kanade.tachiyomi.ui.migration.BaseMigrationPresenter import eu.kanade.tachiyomi.util.system.LocaleHelper +import eu.kanade.tachiyomi.util.system.launchUI import eu.kanade.tachiyomi.util.system.withUIContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get typealias ExtensionTuple = Triple, List, List> @@ -24,16 +30,19 @@ typealias ExtensionIntallInfo = Pair /** * Presenter of [ExtensionBottomSheet]. */ -class ExtensionBottomPresenter : BaseMigrationPresenter() { +class ExtensionBottomPresenter : BaseMigrationPresenter(), DownloadQueue.DownloadListener { private var extensions = emptyList() + val downloadManager: DownloadManager = Injekt.get() + private var currentDownloads = hashMapOf() private var firstLoad = true override fun onCreate() { super.onCreate() + downloadManager.addListener(this) presenterScope.launch { val extensionJob = async { extensionManager.findAvailableExtensions() @@ -279,4 +288,11 @@ class ExtensionBottomPresenter : BaseMigrationPresenter() extensionManager.trust(pkgName, versionCode, signatureHash) } } + + override fun updateDownload(download: Download) = updateDownloads() + override fun updateDownloads() { + presenterScope.launchUI { + view?.updateDownloadStatus(!downloadManager.isPaused()) + } + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionBottomSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionBottomSheet.kt index 1d597a4bc1..66f5fd628b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionBottomSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionBottomSheet.kt @@ -514,4 +514,8 @@ class ExtensionBottomSheet @JvmOverloads constructor(context: Context, attrs: At return if (index == -1) POSITION_NONE else index } } + + fun updateDownloadStatus(isRunning: Boolean) { + (controller.activity as? MainActivity)?.downloadStatusChanged(isRunning) + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index e0993ddaf0..c41df7bfb7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -2172,4 +2172,8 @@ open class LibraryController( destroyActionModeIfNeeded() } } + + fun updateDownloadStatus(isRunning: Boolean) { + (activity as? MainActivity)?.downloadStatusChanged(isRunning) + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt index 9db4dbb2ff..520b47cf1f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt @@ -15,6 +15,8 @@ import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.MangaCategory import eu.kanade.tachiyomi.data.database.models.Track import eu.kanade.tachiyomi.data.download.DownloadManager +import eu.kanade.tachiyomi.data.download.model.Download +import eu.kanade.tachiyomi.data.download.model.DownloadQueue import eu.kanade.tachiyomi.data.preference.DelayedLibrarySuggestionsJob import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.track.TrackManager @@ -45,6 +47,7 @@ import eu.kanade.tachiyomi.util.manga.MangaCoverMetadata import eu.kanade.tachiyomi.util.mapStatus import eu.kanade.tachiyomi.util.system.executeOnIO import eu.kanade.tachiyomi.util.system.launchIO +import eu.kanade.tachiyomi.util.system.launchUI import eu.kanade.tachiyomi.util.system.withUIContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -69,7 +72,7 @@ class LibraryPresenter( private val downloadManager: DownloadManager = Injekt.get(), private val chapterFilter: ChapterFilter = Injekt.get(), private val trackManager: TrackManager = Injekt.get(), -) : BaseCoroutinePresenter() { +) : BaseCoroutinePresenter(), DownloadQueue.DownloadListener { private val getLibraryManga: GetLibraryManga by injectLazy() private val context = preferences.context @@ -147,6 +150,7 @@ class LibraryPresenter( override fun onCreate() { super.onCreate() + downloadManager.addListener(this) if (!controllerIsSubClass) { lastLibraryItems?.let { libraryItems = it } lastCategories?.let { categories = it } @@ -1493,4 +1497,11 @@ class LibraryPresenter( } } } + + override fun updateDownload(download: Download) = updateDownloads() + override fun updateDownloads() { + presenterScope.launchUI { + view?.updateDownloadStatus(!downloadManager.isPaused()) + } + } } 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 f14341aa63..44f5887b09 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 @@ -75,6 +75,7 @@ import dev.yokai.presentation.onboarding.OnboardingController import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.Migrations import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.download.DownloadJob import eu.kanade.tachiyomi.data.download.DownloadManager import eu.kanade.tachiyomi.data.library.LibraryUpdateJob @@ -99,6 +100,7 @@ import eu.kanade.tachiyomi.ui.manga.MangaDetailsController import eu.kanade.tachiyomi.ui.more.AboutController import eu.kanade.tachiyomi.ui.more.OverflowDialog import eu.kanade.tachiyomi.ui.more.stats.StatsController +import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.ui.recents.RecentsController import eu.kanade.tachiyomi.ui.recents.RecentsViewType import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate @@ -106,10 +108,12 @@ import eu.kanade.tachiyomi.ui.setting.SettingsLegacyController import eu.kanade.tachiyomi.ui.setting.controllers.SettingsMainController import eu.kanade.tachiyomi.ui.source.BrowseController import eu.kanade.tachiyomi.ui.source.browse.BrowseSourceController +import eu.kanade.tachiyomi.ui.source.globalsearch.GlobalSearchController import eu.kanade.tachiyomi.util.manga.MangaCoverMetadata import eu.kanade.tachiyomi.util.manga.MangaShortcutManager import eu.kanade.tachiyomi.util.system.contextCompatDrawable import eu.kanade.tachiyomi.util.system.dpToPx +import eu.kanade.tachiyomi.util.system.executeOnIO import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.hasSideNavBar import eu.kanade.tachiyomi.util.system.ignoredSystemInsets @@ -167,6 +171,7 @@ open class MainActivity : BaseActivity() { private val downloadManager: DownloadManager by injectLazy() private val mangaShortcutManager: MangaShortcutManager by injectLazy() private val extensionManager: ExtensionManager by injectLazy() + private val db: DatabaseHelper by injectLazy() private val hideBottomNav get() = router.backstackSize > 1 && router.backstack[1].controller !is DialogController private val hideAppBar @@ -390,16 +395,48 @@ open class MainActivity : BaseActivity() { } true } - for (id in listOf(R.id.nav_recents, R.id.nav_browse)) { - nav.getItemView(id)?.setOnLongClickListener { - nav.selectedItemId = id - nav.post { - val controller = - router.backstack.firstOrNull()?.controller as? BottomSheetController - controller?.showSheet() - } - true + nav.getItemView(R.id.nav_recents)?.setOnLongClickListener { + if (nav.selectedItemId != R.id.nav_recents) { + nav.selectedItemId = R.id.nav_recents } + when (basePreferences.longTapRecentsNavBehaviour().get()) { + BasePreferences.LongTapRecents.DEFAULT -> { + nav.post { + val controller = + router.backstack.firstOrNull()?.controller as? BottomSheetController + controller?.showSheet() + } + } + BasePreferences.LongTapRecents.LAST_READ -> { + lifecycleScope.launchUI { + val lastReadChapter = + db.getHistoryUngrouped("", 0, true).executeOnIO().maxByOrNull { it.history.last_read } + lastReadChapter ?: return@launchUI + + val manga = lastReadChapter.manga + val chapter = lastReadChapter.chapter + startActivity(ReaderActivity.newIntent(this@MainActivity, manga, chapter)) + } + } + } + true + } + nav.getItemView(R.id.nav_browse)?.setOnLongClickListener { + if (nav.selectedItemId != R.id.nav_browse) { + nav.selectedItemId = R.id.nav_browse + } + when (basePreferences.longTapBrowseNavBehaviour().get()) { + BasePreferences.LongTapBrowse.DEFAULT -> { + nav.post { + val controller = + router.backstack.firstOrNull()?.controller as? BottomSheetController + controller?.showSheet() + } + } + BasePreferences.LongTapBrowse.SEARCH -> + router.pushController(GlobalSearchController().withFadeTransaction()) + } + true } val container: ViewGroup = binding.controllerContainer @@ -1486,11 +1523,13 @@ open class MainActivity : BaseActivity() { } } - private fun downloadStatusChanged(downloading: Boolean) { + fun downloadStatusChanged(downloading: Boolean) { lifecycleScope.launchUI { val hasQueue = downloading || downloadManager.hasQueue() if (hasQueue) { - nav.getOrCreateBadge(R.id.nav_recents) + val badge = nav.getOrCreateBadge(R.id.nav_recents) + badge.number = downloadManager.queue.size + if (downloading) badge.backgroundColor = -870219 else badge.backgroundColor = Color.GRAY showDLQueueTutorial() } else { nav.removeBadge(R.id.nav_recents) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/controllers/SettingsGeneralController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/controllers/SettingsGeneralController.kt index cc58f91545..76e8aefd71 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/controllers/SettingsGeneralController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/controllers/SettingsGeneralController.kt @@ -9,11 +9,13 @@ import android.view.View import androidx.appcompat.app.AppCompatDelegate import androidx.core.os.LocaleListCompat import androidx.preference.PreferenceScreen +import dev.yokai.domain.base.BasePreferences import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.updater.AppDownloadInstallJob import eu.kanade.tachiyomi.ui.setting.SettingsLegacyController import eu.kanade.tachiyomi.ui.setting.ThemePreference +import eu.kanade.tachiyomi.ui.setting.bindTo import eu.kanade.tachiyomi.ui.setting.defaultValue import eu.kanade.tachiyomi.ui.setting.infoPreference import eu.kanade.tachiyomi.ui.setting.intListPreference @@ -230,6 +232,28 @@ class SettingsGeneralController : SettingsLegacyController() { } } } + + preferenceCategory { + titleRes = R.string.navigation + + listPreference(activity) { + bindTo(basePreferences.longTapRecentsNavBehaviour()) + titleRes = R.string.recents_long_tap + + val values = BasePreferences.LongTapRecents.entries.toList() + entriesRes = values.map { it.titleResId }.toTypedArray() + entryValues = values.map { it.name }.toTypedArray().toList() + } + + listPreference(activity) { + bindTo(basePreferences.longTapBrowseNavBehaviour()) + titleRes = R.string.browse_long_tap + + val values = BasePreferences.LongTapBrowse.entries.toList() + entriesRes = values.map { it.titleResId }.toTypedArray() + entryValues = values.map { it.name }.toTypedArray().toList() + } + } } override fun onDestroyView(view: View) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/source/globalsearch/GlobalSearchController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/source/globalsearch/GlobalSearchController.kt index e6181a6b12..1245263ee3 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/source/globalsearch/GlobalSearchController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/source/globalsearch/GlobalSearchController.kt @@ -23,6 +23,7 @@ import eu.kanade.tachiyomi.ui.main.SearchControllerInterface import eu.kanade.tachiyomi.ui.manga.MangaDetailsController import eu.kanade.tachiyomi.ui.source.browse.BrowseSourceController import eu.kanade.tachiyomi.util.addOrRemoveToFavorites +import eu.kanade.tachiyomi.util.system.extensionIntentForText import eu.kanade.tachiyomi.util.system.rootWindowInsetsCompat import eu.kanade.tachiyomi.util.view.activityBinding import eu.kanade.tachiyomi.util.view.isControllerVisible @@ -163,7 +164,15 @@ open class GlobalSearchController( activityBinding?.searchToolbar?.searchItem?.expandActionView() activityBinding?.searchToolbar?.searchView?.setQuery(presenter.query, false) + if (presenter.query.isBlank()) { + activityBinding?.searchToolbar?.searchView?.requestFocus() + } + setOnQueryTextChangeListener(activityBinding?.searchToolbar?.searchView, onlyOnSubmit = true, hideKbOnSubmit = true) { + // try to handle the query as a manga URL + applicationContext?.extensionIntentForText(it ?: "")?.let { + startActivity(it) + } presenter.search(it ?: "") setTitle() // Update toolbar title true @@ -177,7 +186,9 @@ open class GlobalSearchController( val searchItem = activityBinding?.searchToolbar?.searchItem ?: return searchItem.expandActionView() searchView.setQuery(presenter.query, false) - searchView.clearFocus() + if (presenter.query.isNotBlank()) { + searchView.clearFocus() + } } if (type == ControllerChangeType.POP_ENTER && lastPosition > -1) { val holder = binding.recycler.findViewHolderForAdapterPosition(lastPosition) as? GlobalSearchHolder @@ -221,6 +232,11 @@ open class GlobalSearchController( customTitle = view.context?.getString(R.string.loading) setTitle() } + + // try to handle the query as a manga URL + applicationContext?.extensionIntentForText(presenter.query)?.let { + startActivity(it) + } } override fun onDestroyView(view: View) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/BaseWebViewActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/BaseWebViewActivity.kt index 54aa271a7f..2005f87306 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/BaseWebViewActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/BaseWebViewActivity.kt @@ -134,6 +134,9 @@ open class BaseWebViewActivity : BaseActivity() { override fun onReceivedTitle(view: WebView?, title: String?) { super.onReceivedTitle(view, title) this@BaseWebViewActivity.title = title + binding.toolbarTitle.text = title + binding.toolbarSubtitle.text = view?.url + binding.toolbarSubtitle.isSelected = true } } val marginB = binding.webview.marginBottom diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt index def3d9a25d..75fd154315 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt @@ -12,6 +12,7 @@ import androidx.activity.OnBackPressedCallback import androidx.activity.addCallback import androidx.core.graphics.ColorUtils import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.network.NetworkHelper import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.system.WebViewClientCompat @@ -19,6 +20,7 @@ import eu.kanade.tachiyomi.util.system.extensionIntentForText import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.openInBrowser import eu.kanade.tachiyomi.util.system.toast +import okhttp3.HttpUrl.Companion.toHttpUrl import timber.log.Timber import uy.kohesive.injekt.injectLazy @@ -27,6 +29,8 @@ open class WebViewActivity : BaseWebViewActivity() { private val sourceManager by injectLazy() private var bundle: Bundle? = null + private val network: NetworkHelper by injectLazy() + private var backPressedCallback: OnBackPressedCallback? = null private val backCallback = { if (binding.webview.canGoBack()) binding.webview.goBack() @@ -166,10 +170,17 @@ open class WebViewActivity : BaseWebViewActivity() { R.id.action_web_share -> shareWebpage() R.id.action_web_browser -> openInBrowser() R.id.action_open_in_app -> openUrlInApp() + R.id.action_web_clear_cookies -> clearCookies() } return super.onOptionsItemSelected(item) } + private fun clearCookies() { + val url = binding.webview.url ?: return + val cleared = network.cookieJar.remove(url.toHttpUrl()) + toast("Cleared $cleared cookies for: $url") + } + private fun openUrlInApp() { val url = binding.webview.url ?: return extensionIntentForText(url)?.let { startActivity(it) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/WebViewUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/WebViewUtil.kt index 2d3c7da70e..a7b5a411df 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/WebViewUtil.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/WebViewUtil.kt @@ -37,6 +37,8 @@ fun WebView.setDefaultSettings() { databaseEnabled = true useWideViewPort = true loadWithOverviewMode = true + builtInZoomControls = true + displayZoomControls = false cacheMode = WebSettings.LOAD_DEFAULT } } diff --git a/app/src/main/res/layout/webview_activity.xml b/app/src/main/res/layout/webview_activity.xml index 30a5d75c8a..a73ca49241 100644 --- a/app/src/main/res/layout/webview_activity.xml +++ b/app/src/main/res/layout/webview_activity.xml @@ -1,7 +1,6 @@ - + android:orientation="vertical"> + app:layout_scrollFlags="scroll|enterAlways"> + + + + + + + + + + @@ -36,20 +65,19 @@ + android:layout_height="match_parent" + android:nestedScrollingEnabled="true"> + android:progressTint="?attr/colorSecondary" /> - \ No newline at end of file + diff --git a/app/src/main/res/menu/download_single.xml b/app/src/main/res/menu/download_single.xml index 0da2189f4b..fa3228964b 100644 --- a/app/src/main/res/menu/download_single.xml +++ b/app/src/main/res/menu/download_single.xml @@ -9,6 +9,9 @@ + + - \ No newline at end of file + diff --git a/app/src/main/res/menu/webview.xml b/app/src/main/res/menu/webview.xml index cd80d17a3b..1ef32c3235 100644 --- a/app/src/main/res/menu/webview.xml +++ b/app/src/main/res/menu/webview.xml @@ -29,4 +29,9 @@ android:title="@string/open_in_browser" app:showAsAction="never" /> + + diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index c361d73aaa..3f35a13901 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -972,6 +972,7 @@ Invertido Nenhuma entrada na biblioteca para fazer backup Mover série para o topo + Mover série para o fundo Crescente Data Decrescente @@ -1135,4 +1136,4 @@ Aplicar Informações de depuração Atividade em segundo plano - \ No newline at end of file + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 23b675c892..61275e3fcc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -311,6 +311,9 @@ Only downloaded Unread or downloaded Clear history + Show download queue + Open last read chapter + Long tap Recents behaviour Search filters @@ -331,6 +334,9 @@ Last used Local source guide Check website in WebView + Open extensions / migration menu + Open global search + Long tap Browse behaviour @@ -990,6 +996,7 @@ Downloading: %1$s Cancel all Move series to top + Move series to bottom Downloads can be cancelled by swiping them away\nSwipe this tip to dismiss it Cancel all for this series Downloaded