diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt index 949b4846ed..76f5cb81b0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -207,6 +207,8 @@ class PreferencesHelper(val context: Context) { fun hiddenCatalogues() = rxPrefs.getStringSet("hidden_catalogues", mutableSetOf()) + fun pinnedCatalogues() = rxPrefs.getStringSet("pinned_catalogues", emptySet()) + fun downloadNew() = rxPrefs.getBoolean(Keys.downloadNew, false) fun downloadNewCategories() = rxPrefs.getStringSet(Keys.downloadNewCategories, emptySet()) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CatalogueController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CatalogueController.kt index 26f467197a..b7f80ba0e7 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CatalogueController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CatalogueController.kt @@ -10,7 +10,6 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.SearchView -import androidx.recyclerview.widget.LinearLayoutManager import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.list.listItems import com.bluelinelabs.conductor.ControllerChangeHandler @@ -25,7 +24,6 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.source.CatalogueSource import eu.kanade.tachiyomi.source.Source -import eu.kanade.tachiyomi.source.online.LoginSource import eu.kanade.tachiyomi.ui.base.controller.NucleusController import eu.kanade.tachiyomi.ui.base.controller.requestPermissionsSafe import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction @@ -40,7 +38,6 @@ import eu.kanade.tachiyomi.ui.setting.SettingsSourcesController import eu.kanade.tachiyomi.util.view.applyWindowInsetsForRootController import eu.kanade.tachiyomi.util.view.scrollViewWith import eu.kanade.tachiyomi.util.view.setOnQueryTextChangeListener -import eu.kanade.tachiyomi.widget.preference.SourceLoginDialog import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.catalogue_main_controller.* import kotlinx.android.synthetic.main.extensions_bottom_sheet.* @@ -52,12 +49,10 @@ import kotlin.math.max /** * This controller shows and manages the different catalogues enabled by the user. * This controller should only handle UI actions, IO actions should be done by [CataloguePresenter] - * [SourceLoginDialog.Listener] refreshes the adapter on successful login of catalogues. * [CatalogueAdapter.OnBrowseClickListener] call function data on browse item click. * [CatalogueAdapter.OnLatestClickListener] call function data on latest item click */ class CatalogueController : NucleusController(), - SourceLoginDialog.Listener, FlexibleAdapter.OnItemClickListener, FlexibleAdapter.OnItemLongClickListener, CatalogueAdapter.OnBrowseClickListener, @@ -86,26 +81,15 @@ class CatalogueController : NucleusController(), * Called when controller is initialized. */ init { - // Enable the option menu setHasOptionsMenu(true) } - /** - * Set the title of controller. - * - * @return title. - */ override fun getTitle(): String? { return if (showingExtenions) applicationContext?.getString(R.string.extensions) else applicationContext?.getString(R.string.sources) } - /** - * Create the [CataloguePresenter] used in controller. - * - * @return instance of [CataloguePresenter] - */ override fun createPresenter(): CataloguePresenter { return CataloguePresenter() } @@ -121,11 +105,6 @@ class CatalogueController : NucleusController(), return inflater.inflate(R.layout.catalogue_main_controller, container, false) } - /** - * Called when the view is created - * - * @param view view of controller - */ override fun onViewCreated(view: View) { super.onViewCreated(view) view.applyWindowInsetsForRootController(activity!!.bottom_nav) @@ -229,44 +208,28 @@ class CatalogueController : NucleusController(), ext_bottom_sheet?.presenter?.refreshExtensions() } - /** - * Called when login dialog is closed, refreshes the adapter. - * - * @param source clicked item containing source information. - */ - override fun loginDialogClosed(source: LoginSource) { - if (source.isLogged()) { - adapter?.clear() - presenter.loadSources() - } - } - override fun onItemClick(view: View, position: Int): Boolean { val item = adapter?.getItem(position) as? SourceItem ?: return false val source = item.source - if (source is LoginSource && !source.isLogged()) { - val dialog = SourceLoginDialog(source) - dialog.targetController = this - dialog.showDialog(router) - } else { - // Open the catalogue view. - openCatalogue(source, BrowseCatalogueController(source)) - } + // Open the catalogue view. + openCatalogue(source, BrowseCatalogueController(source)) return false } override fun onItemLongClick(position: Int) { val activity = activity ?: return val item = adapter?.getItem(position) as? SourceItem ?: return + val isPinned = item.header?.code?.equals(CataloguePresenter.PINNED_KEY) ?: false MaterialDialog(activity) .title(text = item.source.name) - .listItems(items = listOf(activity.getString(R.string.hide)), - waitForPositiveButton = false, selection = { _, index, _ -> + .listItems(items = listOf( + activity.getString(R.string.hide), + activity.getString(if (isPinned) R.string.unpin else R.string.pin) + ), waitForPositiveButton = false, selection = { _, index, _ -> when (index) { - 0 -> { - hideCatalogue(item.source) - } + 0 -> hideCatalogue(item.source) + 1 -> pinCatalogue(item.source, isPinned) } }).show() } @@ -278,6 +241,17 @@ class CatalogueController : NucleusController(), presenter.updateSources() } + private fun pinCatalogue(source: Source, isPinned: Boolean) { + val current = preferences.pinnedCatalogues().getOrDefault() + if (isPinned) { + preferences.pinnedCatalogues().set(current - source.id.toString()) + } else { + preferences.pinnedCatalogues().set(current + source.id.toString()) + } + + presenter.updateSources() + } + /** * Called when browse is clicked in [CatalogueAdapter] */ diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CataloguePresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CataloguePresenter.kt index 95f3acdbf9..3bef061a74 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CataloguePresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/catalogue/CataloguePresenter.kt @@ -27,9 +27,6 @@ class CataloguePresenter( private val preferences: PreferencesHelper = Injekt.get() ) : BasePresenter() { - /** - * Enabled sources. - */ var sources = getEnabledSources() /** @@ -48,9 +45,12 @@ class CataloguePresenter( /** * Unsubscribe and create a new subscription to fetch enabled sources. */ - fun loadSources() { + private fun loadSources() { sourceSubscription?.unsubscribe() + val pinnedSources = mutableListOf() + val pinnedCatalogues = preferences.pinnedCatalogues().getOrDefault() + val map = TreeMap> { d1, d2 -> // Catalogues without a lang defined will be placed at the end when { @@ -60,9 +60,19 @@ class CataloguePresenter( } } val byLang = sources.groupByTo(map, { it.lang }) - val sourceItems = byLang.flatMap { + var sourceItems = byLang.flatMap { val langItem = LangItem(it.key) - it.value.map { source -> SourceItem(source, langItem) } + it.value.map { source -> + if (source.id.toString() in pinnedCatalogues) { + pinnedSources.add(SourceItem(source, LangItem(PINNED_KEY))) + } + + SourceItem(source, langItem) + } + } + + if (pinnedSources.isNotEmpty()) { + sourceItems = pinnedSources + sourceItems } sourceSubscription = Observable.just(sourceItems) @@ -101,4 +111,8 @@ class CataloguePresenter( .sortedBy { "(${it.lang}) ${it.name}" } + sourceManager.get(LocalSource.ID) as LocalSource } + + companion object { + const val PINNED_KEY = "pinned" + } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/LocaleHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/LocaleHelper.kt index ad515f830e..b57b432037 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/LocaleHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/LocaleHelper.kt @@ -7,8 +7,9 @@ import android.os.Build import android.view.ContextThemeWrapper import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import uy.kohesive.injekt.injectLazy +import eu.kanade.tachiyomi.ui.catalogue.CataloguePresenter import java.util.Locale +import uy.kohesive.injekt.injectLazy /** * Utility class to change the application's language in runtime. @@ -56,6 +57,7 @@ object LocaleHelper { return when (lang) { null -> "" "" -> context.getString(R.string.other) + CataloguePresenter.PINNED_KEY -> context.getString(R.string.pinned) "all" -> context.getString(R.string.all) else -> { val locale = getLocale(lang) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 82cb30eb81..9f2226a23d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -655,6 +655,8 @@ Options Pause Picture saved + Pin + Pinned Refresh Refreshing Remove @@ -677,6 +679,7 @@ Undo Unknown error Un-select all + Unpin Use default View all errors View chapters