mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 22:37:56 +01:00 
			
		
		
		
	Add offline mode (forced download filters; closes #2902)
This commit is contained in:
		| @@ -99,6 +99,8 @@ object PreferenceKeys { | ||||
|  | ||||
|     const val libraryUpdatePrioritization = "library_update_prioritization" | ||||
|  | ||||
|     const val offlineMode = "pref_offline_mode" | ||||
|  | ||||
|     const val filterDownloaded = "pref_filter_downloaded_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 offlineMode() = flowPrefs.getBoolean(Keys.offlineMode, false) | ||||
|  | ||||
|     fun filterDownloaded() = rxPrefs.getBoolean(Keys.filterDownloaded, false) | ||||
|  | ||||
|     fun filterUnread() = rxPrefs.getBoolean(Keys.filterUnread, false) | ||||
|   | ||||
| @@ -111,10 +111,8 @@ class LibraryPresenter( | ||||
|      * @param map the map to filter. | ||||
|      */ | ||||
|     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 filterCompleted = preferences.filterCompleted().getOrDefault() | ||||
|  | ||||
|         val filterFn: (LibraryItem) -> Boolean = f@{ item -> | ||||
|   | ||||
| @@ -96,7 +96,8 @@ class LibrarySettingsSheet( | ||||
|             override val footer = Item.Separator() | ||||
|  | ||||
|             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() | ||||
|                 completed.checked = preferences.filterCompleted().getOrDefault() | ||||
|             } | ||||
|   | ||||
| @@ -155,6 +155,7 @@ class ChaptersController : NucleusController<ChaptersControllerBinding, Chapters | ||||
|         menuFilterRead.isChecked = presenter.onlyRead() | ||||
|         menuFilterUnread.isChecked = presenter.onlyUnread() | ||||
|         menuFilterDownloaded.isChecked = presenter.onlyDownloaded() | ||||
|         menuFilterDownloaded.isEnabled = !presenter.isOfflineMode() | ||||
|         menuFilterBookmarked.isChecked = presenter.onlyBookmarked() | ||||
|  | ||||
|         val filterSet = presenter.onlyRead() || presenter.onlyUnread() || presenter.onlyDownloaded() || presenter.onlyBookmarked() | ||||
|   | ||||
| @@ -366,11 +366,18 @@ class ChaptersPresenter( | ||||
|         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. | ||||
|      */ | ||||
|     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 eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys | ||||
| import eu.kanade.tachiyomi.data.preference.PreferencesHelper | ||||
| import eu.kanade.tachiyomi.ui.base.controller.RootController | ||||
| 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.preference | ||||
| 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.system.getResourceColor | ||||
| import eu.kanade.tachiyomi.util.system.openInBrowser | ||||
| @@ -29,29 +31,38 @@ class MoreController : SettingsController(), RootController { | ||||
|  | ||||
|         val tintColor = context.getResourceColor(R.attr.colorAccent) | ||||
|  | ||||
|         badgePreference { | ||||
|             titleRes = R.string.label_extensions | ||||
|             iconRes = R.drawable.ic_extension_24dp | ||||
|         switchPreference { | ||||
|             key = Keys.offlineMode | ||||
|             titleRes = R.string.label_offline_mode | ||||
|             iconRes = R.drawable.ic_cloud_off_24dp | ||||
|             iconTint = tintColor | ||||
|             setBadge(Injekt.get<PreferencesHelper>().extensionUpdatesCount().get()) | ||||
|             onClick { | ||||
|                 router.pushController(ExtensionController().withFadeTransaction()) | ||||
|             } | ||||
|         } | ||||
|         preference { | ||||
|             titleRes = R.string.label_download_queue | ||||
|             iconRes = R.drawable.ic_file_download_black_24dp | ||||
|             iconTint = tintColor | ||||
|             onClick { | ||||
|                 router.pushController(DownloadController().withFadeTransaction()) | ||||
|  | ||||
|         preferenceCategory { | ||||
|             badgePreference { | ||||
|                 titleRes = R.string.label_extensions | ||||
|                 iconRes = R.drawable.ic_extension_24dp | ||||
|                 iconTint = tintColor | ||||
|                 setBadge(Injekt.get<PreferencesHelper>().extensionUpdatesCount().get()) | ||||
|                 onClick { | ||||
|                     router.pushController(ExtensionController().withFadeTransaction()) | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         preference { | ||||
|             titleRes = R.string.label_migration | ||||
|             iconRes = R.drawable.ic_compare_arrows_black_24dp | ||||
|             iconTint = tintColor | ||||
|             onClick { | ||||
|                 router.pushController(MigrationController().withFadeTransaction()) | ||||
|             preference { | ||||
|                 titleRes = R.string.label_download_queue | ||||
|                 iconRes = R.drawable.ic_file_download_black_24dp | ||||
|                 iconTint = tintColor | ||||
|                 onClick { | ||||
|                     router.pushController(DownloadController().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. | ||||
|          */ | ||||
|         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. | ||||
| @@ -218,6 +218,7 @@ open class ExtendedNavigationView @JvmOverloads constructor( | ||||
|                     val item = items[position] as Item.CheckboxGroup | ||||
|                     holder.check.setText(item.resTitle) | ||||
|                     holder.check.isChecked = item.checked | ||||
|                     holder.check.isEnabled = item.enabled | ||||
|                 } | ||||
|                 is MultiStateHolder -> { | ||||
|                     val item = items[position] as Item.MultiStateGroup | ||||
|   | ||||
		Reference in New Issue
	
	Block a user