mirror of
https://github.com/mihonapp/mihon.git
synced 2025-11-12 20:19:05 +01:00
Support for sources from different languages
This commit is contained in:
@@ -1,10 +1,15 @@
|
||||
package eu.kanade.tachiyomi.ui.base.activity
|
||||
|
||||
import android.graphics.Color
|
||||
import android.os.Bundle
|
||||
import android.support.design.widget.Snackbar
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import android.support.v7.widget.Toolbar
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.widget.TextView
|
||||
import eu.kanade.tachiyomi.App
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.injection.component.AppComponent
|
||||
import icepick.Icepick
|
||||
import org.greenrobot.eventbus.EventBus
|
||||
@@ -60,6 +65,24 @@ open class BaseActivity : AppCompatActivity() {
|
||||
EventBus.getDefault().unregister(this)
|
||||
}
|
||||
|
||||
fun snack(text: String?, duration: Int = Snackbar.LENGTH_LONG) {
|
||||
val snack = Snackbar.make(findViewById(android.R.id.content), text ?: getString(R.string.unknown_error), duration)
|
||||
val textView = snack.view.findViewById(android.support.design.R.id.snackbar_text) as TextView
|
||||
textView.setTextColor(Color.WHITE)
|
||||
snack.show()
|
||||
}
|
||||
|
||||
fun snack(text: String?, actionRes: Int, actionFunc: () -> Unit,
|
||||
duration: Int = Snackbar.LENGTH_LONG, view: View = findViewById(android.R.id.content)) {
|
||||
|
||||
val snack = Snackbar.make(view, text ?: getString(R.string.unknown_error), duration)
|
||||
.setAction(actionRes, { actionFunc() })
|
||||
|
||||
val textView = snack.view.findViewById(android.support.design.R.id.snackbar_text) as TextView
|
||||
textView.setTextColor(Color.WHITE)
|
||||
snack.show()
|
||||
}
|
||||
|
||||
protected val applicationComponent: AppComponent
|
||||
get() = App.get(this).component
|
||||
|
||||
|
||||
@@ -168,7 +168,7 @@ class CatalogueFragment : BaseRxFragment<CataloguePresenter>(), FlexibleViewHold
|
||||
val themedContext = baseActivity.supportActionBar?.themedContext ?: activity
|
||||
|
||||
val spinnerAdapter = ArrayAdapter(themedContext,
|
||||
android.R.layout.simple_spinner_item, presenter.getEnabledSources())
|
||||
android.R.layout.simple_spinner_item, presenter.sources)
|
||||
spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
|
||||
|
||||
val onItemSelected = object : AdapterView.OnItemSelectedListener {
|
||||
@@ -353,8 +353,12 @@ class CatalogueFragment : BaseRxFragment<CataloguePresenter>(), FlexibleViewHold
|
||||
*/
|
||||
fun onAddPageError(error: Throwable) {
|
||||
hideProgressBar()
|
||||
ToastUtil.showShort(context, error.message)
|
||||
Timber.e(error, error.message)
|
||||
|
||||
baseActivity.snack(error.message, R.string.action_retry, {
|
||||
showProgressBar()
|
||||
presenter.retryRequest()
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -5,6 +5,7 @@ import eu.kanade.tachiyomi.data.cache.CoverCache
|
||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||
import eu.kanade.tachiyomi.data.database.models.Manga
|
||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
||||
import eu.kanade.tachiyomi.data.source.SourceManager
|
||||
import eu.kanade.tachiyomi.data.source.base.Source
|
||||
import eu.kanade.tachiyomi.data.source.model.MangasPage
|
||||
@@ -45,7 +46,7 @@ class CataloguePresenter : BasePresenter<CatalogueFragment>() {
|
||||
/**
|
||||
* Enabled sources.
|
||||
*/
|
||||
private val sources by lazy { sourceManager.sources }
|
||||
val sources by lazy { getEnabledSources() }
|
||||
|
||||
/**
|
||||
* Active source.
|
||||
@@ -188,6 +189,13 @@ class CataloguePresenter : BasePresenter<CatalogueFragment>() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retry a failed request.
|
||||
*/
|
||||
fun retryRequest() {
|
||||
start(GET_MANGA_PAGE)
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the observable of the network request for a page.
|
||||
*
|
||||
@@ -308,12 +316,19 @@ class CataloguePresenter : BasePresenter<CatalogueFragment>() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of enabled sources.
|
||||
*
|
||||
* TODO filter by enabled sources.
|
||||
* Returns a list of enabled sources ordered by language and name.
|
||||
*/
|
||||
fun getEnabledSources(): List<Source> {
|
||||
return sourceManager.sources
|
||||
private fun getEnabledSources(): List<Source> {
|
||||
val languages = prefs.enabledLanguages().getOrDefault()
|
||||
|
||||
// Ensure at least one language
|
||||
if (languages.isEmpty()) {
|
||||
languages.add("EN")
|
||||
}
|
||||
|
||||
return sourceManager.getSources()
|
||||
.filter { it.lang.code in languages }
|
||||
.sortedBy { "(${it.lang.code}) ${it.name}" }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -143,7 +143,7 @@ public class MangaInfoFragment extends BaseRxFragment<MangaInfoPresenter> {
|
||||
|
||||
// If manga source is known update source TextView.
|
||||
if (mangaSource != null) {
|
||||
source.setText(mangaSource.getName());
|
||||
source.setText(mangaSource.getVisibleName());
|
||||
}
|
||||
|
||||
// Update genres TextView.
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
package eu.kanade.tachiyomi.ui.setting
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import android.support.v7.preference.DialogPreference
|
||||
import android.support.v7.preference.Preference
|
||||
import android.support.v7.preference.PreferenceCategory
|
||||
import android.view.View
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.source.base.Source
|
||||
import eu.kanade.tachiyomi.widget.preference.MangaSyncLoginDialog
|
||||
import eu.kanade.tachiyomi.widget.preference.SourceLoginDialog
|
||||
|
||||
class SettingsAccountsFragment : SettingsNestedFragment() {
|
||||
|
||||
companion object {
|
||||
|
||||
fun newInstance(resourcePreference: Int, resourceTitle: Int): SettingsNestedFragment {
|
||||
val fragment = SettingsAccountsFragment()
|
||||
fragment.setArgs(resourcePreference, resourceTitle)
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
|
||||
val sourceCategory by lazy { findPreference("pref_category_source_accounts") as PreferenceCategory }
|
||||
val syncCategory by lazy { findPreference("pref_category_manga_sync_accounts") as PreferenceCategory }
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
val themedContext = preferenceManager.context
|
||||
|
||||
for (source in getSourcesWithLogin()) {
|
||||
val pref = SourcePreference(themedContext).apply {
|
||||
isPersistent = false
|
||||
title = source.name
|
||||
key = source.id.toString()
|
||||
dialogLayoutResource = R.layout.pref_account_login
|
||||
}
|
||||
|
||||
sourceCategory.addPreference(pref)
|
||||
}
|
||||
|
||||
for (sync in settingsActivity.syncManager.services) {
|
||||
val pref = SyncPreference(themedContext).apply {
|
||||
isPersistent = false
|
||||
title = sync.name
|
||||
key = sync.id.toString()
|
||||
dialogLayoutResource = R.layout.pref_account_login
|
||||
}
|
||||
|
||||
syncCategory.addPreference(pref)
|
||||
}
|
||||
}
|
||||
|
||||
fun getSourcesWithLogin(): List<Source> {
|
||||
return settingsActivity.sourceManager.sources.filter { it.isLoginRequired }
|
||||
}
|
||||
|
||||
override fun onDisplayPreferenceDialog(preference: Preference) {
|
||||
if (preference is SourcePreference) {
|
||||
val fragment = SourceLoginDialog.newInstance(preference)
|
||||
fragment.setTargetFragment(this, 0)
|
||||
fragment.show(childFragmentManager, null)
|
||||
} else if (preference is SyncPreference) {
|
||||
val fragment = MangaSyncLoginDialog.newInstance(preference)
|
||||
fragment.setTargetFragment(this, 0)
|
||||
fragment.show(childFragmentManager, null)
|
||||
} else {
|
||||
super.onDisplayPreferenceDialog(preference)
|
||||
}
|
||||
}
|
||||
|
||||
class SourcePreference(context: Context) : DialogPreference(context) {}
|
||||
|
||||
class SyncPreference(context: Context) : DialogPreference(context) {}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
package eu.kanade.tachiyomi.ui.setting
|
||||
|
||||
import android.os.Bundle
|
||||
import android.support.v7.preference.PreferenceFragmentCompat
|
||||
import android.support.v14.preference.PreferenceFragment
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.cache.ChapterCache
|
||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||
@@ -28,19 +28,19 @@ class SettingsActivity : BaseActivity() {
|
||||
setupToolbar(toolbar)
|
||||
|
||||
if (savedState == null) {
|
||||
supportFragmentManager.beginTransaction()
|
||||
.replace(R.id.settings_content,SettingsMainFragment())
|
||||
fragmentManager.beginTransaction()
|
||||
.replace(R.id.settings_content, SettingsMainFragment())
|
||||
.commit()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onBackPressed() {
|
||||
if (!supportFragmentManager.popBackStackImmediate()) {
|
||||
if (!fragmentManager.popBackStackImmediate()) {
|
||||
super.onBackPressed()
|
||||
}
|
||||
}
|
||||
|
||||
class SettingsMainFragment : PreferenceFragmentCompat() {
|
||||
class SettingsMainFragment : PreferenceFragment() {
|
||||
|
||||
override fun onCreatePreferences(savedState: Bundle?, s: String?) {
|
||||
addPreferencesFromResource(R.xml.pref_main)
|
||||
@@ -57,8 +57,12 @@ class SettingsActivity : BaseActivity() {
|
||||
SettingsDownloadsFragment.newInstance(R.xml.pref_downloads, R.string.pref_category_downloads)
|
||||
}
|
||||
|
||||
registerSubpreference(R.string.pref_category_accounts_key) {
|
||||
SettingsAccountsFragment.newInstance(R.xml.pref_accounts, R.string.pref_category_accounts)
|
||||
registerSubpreference(R.string.pref_category_sources_key) {
|
||||
SettingsSourcesFragment.newInstance(R.xml.pref_sources, R.string.pref_category_sources)
|
||||
}
|
||||
|
||||
registerSubpreference(R.string.pref_category_sync_key) {
|
||||
SettingsSyncFragment.newInstance(R.xml.pref_sync, R.string.pref_category_sync)
|
||||
}
|
||||
|
||||
registerSubpreference(R.string.pref_category_advanced_key) {
|
||||
@@ -75,7 +79,7 @@ class SettingsActivity : BaseActivity() {
|
||||
(activity as BaseActivity).setToolbarTitle(getString(R.string.label_settings))
|
||||
}
|
||||
|
||||
private fun registerSubpreference(preferenceResource: Int, func: () -> PreferenceFragmentCompat) {
|
||||
private fun registerSubpreference(preferenceResource: Int, func: () -> PreferenceFragment) {
|
||||
findPreference(getString(preferenceResource)).setOnPreferenceClickListener {
|
||||
val fragment = func()
|
||||
fragmentManager.beginTransaction()
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
package eu.kanade.tachiyomi.ui.setting
|
||||
|
||||
import android.os.Bundle
|
||||
import android.support.v7.preference.PreferenceFragmentCompat
|
||||
import android.support.v14.preference.PreferenceFragment
|
||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||
|
||||
open class SettingsNestedFragment : PreferenceFragmentCompat() {
|
||||
open class SettingsNestedFragment : PreferenceFragment() {
|
||||
|
||||
companion object {
|
||||
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
package eu.kanade.tachiyomi.ui.setting
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.support.v14.preference.MultiSelectListPreference
|
||||
import android.support.v7.preference.Preference
|
||||
import android.support.v7.preference.PreferenceGroup
|
||||
import android.view.View
|
||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||
import eu.kanade.tachiyomi.data.preference.getOrDefault
|
||||
import eu.kanade.tachiyomi.data.source.base.Source
|
||||
import eu.kanade.tachiyomi.data.source.getLanguages
|
||||
import eu.kanade.tachiyomi.widget.preference.LoginPreference
|
||||
import eu.kanade.tachiyomi.widget.preference.SourceLoginDialog
|
||||
import rx.Subscription
|
||||
|
||||
class SettingsSourcesFragment : SettingsNestedFragment() {
|
||||
|
||||
companion object {
|
||||
const val SOURCE_CHANGE_REQUEST = 120
|
||||
|
||||
fun newInstance(resourcePreference: Int, resourceTitle: Int): SettingsNestedFragment {
|
||||
val fragment = SettingsSourcesFragment()
|
||||
fragment.setArgs(resourcePreference, resourceTitle)
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
|
||||
val languagesPref by lazy { findPreference("pref_source_languages") as MultiSelectListPreference }
|
||||
val sourcesPref by lazy { findPreference("pref_sources") as PreferenceGroup }
|
||||
|
||||
var languagesSubscription: Subscription? = null
|
||||
|
||||
override fun onViewCreated(view: View, savedState: Bundle?) {
|
||||
val langs = getLanguages()
|
||||
|
||||
val entryKeys = langs.map { it.code }
|
||||
languagesPref.entries = langs.map { it.lang }.toTypedArray()
|
||||
languagesPref.entryValues = entryKeys.toTypedArray()
|
||||
languagesPref.values = preferences.enabledLanguages().getOrDefault()
|
||||
|
||||
languagesSubscription = preferences.enabledLanguages().asObservable()
|
||||
.subscribe { languages ->
|
||||
sourcesPref.removeAll()
|
||||
|
||||
val enabledSources = settingsActivity.sourceManager.getSources()
|
||||
.filter { it.lang.code in languages }
|
||||
|
||||
for (source in enabledSources) {
|
||||
if (source.isLoginRequired) {
|
||||
val pref = createSource(source)
|
||||
sourcesPref.addPreference(pref)
|
||||
}
|
||||
}
|
||||
|
||||
// Hide category if it doesn't have any child
|
||||
sourcesPref.isVisible = sourcesPref.preferenceCount > 0
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
languagesSubscription?.unsubscribe()
|
||||
super.onDestroyView()
|
||||
}
|
||||
|
||||
fun createSource(source: Source): Preference {
|
||||
return LoginPreference(preferenceManager.context).apply {
|
||||
key = PreferencesHelper.SOURCE_ACCOUNT_USERNAME + source.id
|
||||
title = source.visibleName
|
||||
|
||||
setOnPreferenceClickListener {
|
||||
val fragment = SourceLoginDialog.newInstance(source)
|
||||
fragment.setTargetFragment(this@SettingsSourcesFragment, SOURCE_CHANGE_REQUEST)
|
||||
fragment.show(childFragmentManager, null)
|
||||
true
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
if (requestCode == SOURCE_CHANGE_REQUEST) {
|
||||
val pref = findPreference(PreferencesHelper.SOURCE_ACCOUNT_USERNAME + resultCode) as? LoginPreference
|
||||
pref?.notifyChanged()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package eu.kanade.tachiyomi.ui.setting
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.support.v7.preference.PreferenceCategory
|
||||
import android.view.View
|
||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||
import eu.kanade.tachiyomi.widget.preference.LoginPreference
|
||||
import eu.kanade.tachiyomi.widget.preference.MangaSyncLoginDialog
|
||||
|
||||
class SettingsSyncFragment : SettingsNestedFragment() {
|
||||
|
||||
companion object {
|
||||
const val SYNC_CHANGE_REQUEST = 121
|
||||
|
||||
fun newInstance(resourcePreference: Int, resourceTitle: Int): SettingsNestedFragment {
|
||||
val fragment = SettingsSyncFragment()
|
||||
fragment.setArgs(resourcePreference, resourceTitle)
|
||||
return fragment
|
||||
}
|
||||
}
|
||||
|
||||
val syncCategory by lazy { findPreference("pref_category_manga_sync_accounts") as PreferenceCategory }
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
val themedContext = preferenceManager.context
|
||||
|
||||
for (sync in settingsActivity.syncManager.services) {
|
||||
val pref = LoginPreference(themedContext).apply {
|
||||
key = PreferencesHelper.MANGASYNC_ACCOUNT_USERNAME + sync.id
|
||||
title = sync.name
|
||||
|
||||
setOnPreferenceClickListener {
|
||||
val fragment = MangaSyncLoginDialog.newInstance(sync)
|
||||
fragment.setTargetFragment(this@SettingsSyncFragment, SYNC_CHANGE_REQUEST)
|
||||
fragment.show(childFragmentManager, null)
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
syncCategory.addPreference(pref)
|
||||
}
|
||||
}
|
||||
|
||||
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
|
||||
if (requestCode == SYNC_CHANGE_REQUEST) {
|
||||
val pref = findPreference(PreferencesHelper.MANGASYNC_ACCOUNT_USERNAME + resultCode) as? LoginPreference
|
||||
pref?.notifyChanged()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user