mirror of
https://github.com/aniyomiorg/aniyomi.git
synced 2024-11-28 09:15:12 +03:00
Add offline mode (forced download filters; closes #2902)
This commit is contained in:
parent
9c820fcca1
commit
5bc77fc6e8
10 changed files with 59 additions and 26 deletions
|
@ -99,6 +99,8 @@ object PreferenceKeys {
|
||||||
|
|
||||||
const val libraryUpdatePrioritization = "library_update_prioritization"
|
const val libraryUpdatePrioritization = "library_update_prioritization"
|
||||||
|
|
||||||
|
const val offlineMode = "pref_offline_mode"
|
||||||
|
|
||||||
const val filterDownloaded = "pref_filter_downloaded_key"
|
const val filterDownloaded = "pref_filter_downloaded_key"
|
||||||
|
|
||||||
const val filterUnread = "pref_filter_unread_key"
|
const val filterUnread = "pref_filter_unread_key"
|
||||||
|
|
|
@ -183,6 +183,8 @@ class PreferencesHelper(val context: Context) {
|
||||||
|
|
||||||
fun downloadBadge() = rxPrefs.getBoolean(Keys.downloadBadge, false)
|
fun downloadBadge() = rxPrefs.getBoolean(Keys.downloadBadge, false)
|
||||||
|
|
||||||
|
fun offlineMode() = flowPrefs.getBoolean(Keys.offlineMode, false)
|
||||||
|
|
||||||
fun filterDownloaded() = rxPrefs.getBoolean(Keys.filterDownloaded, false)
|
fun filterDownloaded() = rxPrefs.getBoolean(Keys.filterDownloaded, false)
|
||||||
|
|
||||||
fun filterUnread() = rxPrefs.getBoolean(Keys.filterUnread, false)
|
fun filterUnread() = rxPrefs.getBoolean(Keys.filterUnread, false)
|
||||||
|
|
|
@ -111,10 +111,8 @@ class LibraryPresenter(
|
||||||
* @param map the map to filter.
|
* @param map the map to filter.
|
||||||
*/
|
*/
|
||||||
private fun applyFilters(map: LibraryMap): LibraryMap {
|
private fun applyFilters(map: LibraryMap): LibraryMap {
|
||||||
val filterDownloaded = preferences.filterDownloaded().getOrDefault()
|
val filterDownloaded = preferences.offlineMode().get() || preferences.filterDownloaded().getOrDefault()
|
||||||
|
|
||||||
val filterUnread = preferences.filterUnread().getOrDefault()
|
val filterUnread = preferences.filterUnread().getOrDefault()
|
||||||
|
|
||||||
val filterCompleted = preferences.filterCompleted().getOrDefault()
|
val filterCompleted = preferences.filterCompleted().getOrDefault()
|
||||||
|
|
||||||
val filterFn: (LibraryItem) -> Boolean = f@{ item ->
|
val filterFn: (LibraryItem) -> Boolean = f@{ item ->
|
||||||
|
|
|
@ -96,7 +96,8 @@ class LibrarySettingsSheet(
|
||||||
override val footer = Item.Separator()
|
override val footer = Item.Separator()
|
||||||
|
|
||||||
override fun initModels() {
|
override fun initModels() {
|
||||||
downloaded.checked = preferences.filterDownloaded().getOrDefault()
|
downloaded.checked = preferences.offlineMode().get() || preferences.filterDownloaded().getOrDefault()
|
||||||
|
downloaded.enabled = !preferences.offlineMode().get()
|
||||||
unread.checked = preferences.filterUnread().getOrDefault()
|
unread.checked = preferences.filterUnread().getOrDefault()
|
||||||
completed.checked = preferences.filterCompleted().getOrDefault()
|
completed.checked = preferences.filterCompleted().getOrDefault()
|
||||||
}
|
}
|
||||||
|
|
|
@ -155,6 +155,7 @@ class ChaptersController : NucleusController<ChaptersControllerBinding, Chapters
|
||||||
menuFilterRead.isChecked = presenter.onlyRead()
|
menuFilterRead.isChecked = presenter.onlyRead()
|
||||||
menuFilterUnread.isChecked = presenter.onlyUnread()
|
menuFilterUnread.isChecked = presenter.onlyUnread()
|
||||||
menuFilterDownloaded.isChecked = presenter.onlyDownloaded()
|
menuFilterDownloaded.isChecked = presenter.onlyDownloaded()
|
||||||
|
menuFilterDownloaded.isEnabled = !presenter.isOfflineMode()
|
||||||
menuFilterBookmarked.isChecked = presenter.onlyBookmarked()
|
menuFilterBookmarked.isChecked = presenter.onlyBookmarked()
|
||||||
|
|
||||||
val filterSet = presenter.onlyRead() || presenter.onlyUnread() || presenter.onlyDownloaded() || presenter.onlyBookmarked()
|
val filterSet = presenter.onlyRead() || presenter.onlyUnread() || presenter.onlyDownloaded() || presenter.onlyBookmarked()
|
||||||
|
|
|
@ -366,11 +366,18 @@ class ChaptersPresenter(
|
||||||
refreshChapters()
|
refreshChapters()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether offline mode is enabled (i.e. force only downloaded content).
|
||||||
|
*/
|
||||||
|
fun isOfflineMode(): Boolean {
|
||||||
|
return preferences.offlineMode().get()
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the display only downloaded filter is enabled.
|
* Whether the display only downloaded filter is enabled.
|
||||||
*/
|
*/
|
||||||
fun onlyDownloaded(): Boolean {
|
fun onlyDownloaded(): Boolean {
|
||||||
return manga.downloadedFilter == Manga.SHOW_DOWNLOADED
|
return isOfflineMode() || manga.downloadedFilter == Manga.SHOW_DOWNLOADED
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.more
|
||||||
|
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.R
|
import eu.kanade.tachiyomi.R
|
||||||
|
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
|
||||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||||
import eu.kanade.tachiyomi.ui.base.controller.RootController
|
import eu.kanade.tachiyomi.ui.base.controller.RootController
|
||||||
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
|
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
|
||||||
|
@ -16,6 +17,7 @@ import eu.kanade.tachiyomi.util.preference.iconTint
|
||||||
import eu.kanade.tachiyomi.util.preference.onClick
|
import eu.kanade.tachiyomi.util.preference.onClick
|
||||||
import eu.kanade.tachiyomi.util.preference.preference
|
import eu.kanade.tachiyomi.util.preference.preference
|
||||||
import eu.kanade.tachiyomi.util.preference.preferenceCategory
|
import eu.kanade.tachiyomi.util.preference.preferenceCategory
|
||||||
|
import eu.kanade.tachiyomi.util.preference.switchPreference
|
||||||
import eu.kanade.tachiyomi.util.preference.titleRes
|
import eu.kanade.tachiyomi.util.preference.titleRes
|
||||||
import eu.kanade.tachiyomi.util.system.getResourceColor
|
import eu.kanade.tachiyomi.util.system.getResourceColor
|
||||||
import eu.kanade.tachiyomi.util.system.openInBrowser
|
import eu.kanade.tachiyomi.util.system.openInBrowser
|
||||||
|
@ -29,29 +31,38 @@ class MoreController : SettingsController(), RootController {
|
||||||
|
|
||||||
val tintColor = context.getResourceColor(R.attr.colorAccent)
|
val tintColor = context.getResourceColor(R.attr.colorAccent)
|
||||||
|
|
||||||
badgePreference {
|
switchPreference {
|
||||||
titleRes = R.string.label_extensions
|
key = Keys.offlineMode
|
||||||
iconRes = R.drawable.ic_extension_24dp
|
titleRes = R.string.label_offline_mode
|
||||||
|
iconRes = R.drawable.ic_cloud_off_24dp
|
||||||
iconTint = tintColor
|
iconTint = tintColor
|
||||||
setBadge(Injekt.get<PreferencesHelper>().extensionUpdatesCount().get())
|
|
||||||
onClick {
|
|
||||||
router.pushController(ExtensionController().withFadeTransaction())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
preference {
|
|
||||||
titleRes = R.string.label_download_queue
|
preferenceCategory {
|
||||||
iconRes = R.drawable.ic_file_download_black_24dp
|
badgePreference {
|
||||||
iconTint = tintColor
|
titleRes = R.string.label_extensions
|
||||||
onClick {
|
iconRes = R.drawable.ic_extension_24dp
|
||||||
router.pushController(DownloadController().withFadeTransaction())
|
iconTint = tintColor
|
||||||
|
setBadge(Injekt.get<PreferencesHelper>().extensionUpdatesCount().get())
|
||||||
|
onClick {
|
||||||
|
router.pushController(ExtensionController().withFadeTransaction())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
preference {
|
||||||
preference {
|
titleRes = R.string.label_download_queue
|
||||||
titleRes = R.string.label_migration
|
iconRes = R.drawable.ic_file_download_black_24dp
|
||||||
iconRes = R.drawable.ic_compare_arrows_black_24dp
|
iconTint = tintColor
|
||||||
iconTint = tintColor
|
onClick {
|
||||||
onClick {
|
router.pushController(DownloadController().withFadeTransaction())
|
||||||
router.pushController(MigrationController().withFadeTransaction())
|
}
|
||||||
|
}
|
||||||
|
preference {
|
||||||
|
titleRes = R.string.label_migration
|
||||||
|
iconRes = R.drawable.ic_compare_arrows_black_24dp
|
||||||
|
iconTint = tintColor
|
||||||
|
onClick {
|
||||||
|
router.pushController(MigrationController().withFadeTransaction())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ open class ExtendedNavigationView @JvmOverloads constructor(
|
||||||
/**
|
/**
|
||||||
* A checkbox.
|
* A checkbox.
|
||||||
*/
|
*/
|
||||||
open class Checkbox(val resTitle: Int, var checked: Boolean = false) : Item()
|
open class Checkbox(val resTitle: Int, var checked: Boolean = false, var enabled: Boolean = true) : Item()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A checkbox belonging to a group. The group must handle selections and restrictions.
|
* A checkbox belonging to a group. The group must handle selections and restrictions.
|
||||||
|
@ -218,6 +218,7 @@ open class ExtendedNavigationView @JvmOverloads constructor(
|
||||||
val item = items[position] as Item.CheckboxGroup
|
val item = items[position] as Item.CheckboxGroup
|
||||||
holder.check.setText(item.resTitle)
|
holder.check.setText(item.resTitle)
|
||||||
holder.check.isChecked = item.checked
|
holder.check.isChecked = item.checked
|
||||||
|
holder.check.isEnabled = item.enabled
|
||||||
}
|
}
|
||||||
is MultiStateHolder -> {
|
is MultiStateHolder -> {
|
||||||
val item = items[position] as Item.MultiStateGroup
|
val item = items[position] as Item.MultiStateGroup
|
||||||
|
|
9
app/src/main/res/drawable/ic_cloud_off_24dp.xml
Normal file
9
app/src/main/res/drawable/ic_cloud_off_24dp.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:pathData="M19.35,10.04C18.67,6.59 15.64,4 12,4c-1.48,0 -2.85,0.43 -4.01,1.17l1.46,1.46C10.21,6.23 11.08,6 12,6c3.04,0 5.5,2.46 5.5,5.5v0.5H19c1.66,0 3,1.34 3,3 0,1.13 -0.64,2.11 -1.56,2.62l1.45,1.45C23.16,18.16 24,16.68 24,15c0,-2.64 -2.05,-4.78 -4.65,-4.96zM3,5.27l2.75,2.74C2.56,8.15 0,10.77 0,14c0,3.31 2.69,6 6,6h11.73l2,2L21,20.73 4.27,4 3,5.27zM7.73,10l8,8H6c-2.21,0 -4,-1.79 -4,-4s1.79,-4 4,-4h1.73z"
|
||||||
|
android:fillColor="#000000"/>
|
||||||
|
</vector>
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
<!-- Activities and fragments labels (toolbar title) -->
|
<!-- Activities and fragments labels (toolbar title) -->
|
||||||
<string name="label_more">More</string>
|
<string name="label_more">More</string>
|
||||||
|
<string name="label_offline_mode">Offline mode</string>
|
||||||
<string name="label_settings">Settings</string>
|
<string name="label_settings">Settings</string>
|
||||||
<string name="label_download_queue">Download queue</string>
|
<string name="label_download_queue">Download queue</string>
|
||||||
<string name="label_library">Library</string>
|
<string name="label_library">Library</string>
|
||||||
|
|
Loading…
Reference in a new issue