From 9beeca652f3b2b6fdf4c1d5d32bb1be552e12cbd Mon Sep 17 00:00:00 2001 From: len Date: Thu, 16 Jun 2016 20:52:51 +0200 Subject: [PATCH] Rewrite preferences with a modified support library v7 --- app/build.gradle | 3 +- .../ui/manga/chapter/ChaptersFragment.kt | 2 +- .../recent_updates/RecentChaptersFragment.kt | 4 +- .../ui/recently_read/RecentlyReadFragment.kt | 4 +- .../ui/setting/SettingsAboutFragment.kt | 16 +- .../tachiyomi/ui/setting/SettingsActivity.kt | 116 +++++-------- .../ui/setting/SettingsAdvancedFragment.kt | 43 ++--- .../ui/setting/SettingsDownloadsFragment.kt | 29 ++-- .../tachiyomi/ui/setting/SettingsFragment.kt | 55 ++++++ .../ui/setting/SettingsGeneralFragment.kt | 58 +++---- .../ui/setting/SettingsNestedFragment.kt | 48 ----- .../ui/setting/SettingsSourcesFragment.kt | 38 ++-- .../ui/setting/SettingsSyncFragment.kt | 26 ++- .../eu/kanade/tachiyomi/util/DiskUtils.java | 3 +- .../widget/preference/LibraryColumnsDialog.kt | 9 +- .../preference/LoginDialogPreference.kt | 7 +- .../widget/preference/MangaSyncLoginDialog.kt | 7 +- .../widget/preference/SourceLoginDialog.kt | 7 +- app/src/main/res/values-v21/themes.xml | 2 - app/src/main/res/values/themes.xml | 8 +- app/src/main/res/xml/pref_about.xml | 50 +++--- app/src/main/res/xml/pref_advanced.xml | 41 +++-- app/src/main/res/xml/pref_downloads.xml | 81 +++++---- app/src/main/res/xml/pref_general.xml | 70 ++++---- app/src/main/res/xml/pref_main.xml | 40 ----- app/src/main/res/xml/pref_reader.xml | 164 +++++++++--------- app/src/main/res/xml/pref_sources.xml | 29 ++-- app/src/main/res/xml/pref_sync.xml | 39 +++-- 28 files changed, 493 insertions(+), 506 deletions(-) create mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsFragment.kt delete mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsNestedFragment.kt delete mode 100644 app/src/main/res/xml/pref_main.xml diff --git a/app/build.gradle b/app/build.gradle index 4431d11dd..74839ead9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -94,8 +94,6 @@ dependencies { compile "com.android.support:design:$support_library_version" compile "com.android.support:recyclerview-v7:$support_library_version" compile "com.android.support:support-annotations:$support_library_version" - compile "com.android.support:preference-v7:$support_library_version" - compile "com.android.support:preference-v14:$support_library_version" compile "com.android.support:customtabs:$support_library_version" // ReactiveX @@ -162,6 +160,7 @@ dependencies { compile 'com.nononsenseapps:filepicker:2.5.2' compile 'com.github.amulyakhare:TextDrawable:558677e' compile 'com.afollestad.material-dialogs:core:0.8.5.9' + compile 'net.xpece.android:support-preference:0.8.1' // Tests testCompile 'junit:junit:4.12' diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersFragment.kt index c7bd132e1..75b33b433 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/manga/chapter/ChaptersFragment.kt @@ -61,7 +61,7 @@ class ChaptersFragment : BaseRxFragment(), ActionMode.Callbac return inflater.inflate(R.layout.fragment_manga_chapters, container, false) } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated(view: View, savedState: Bundle?) { // Init RecyclerView and adapter adapter = ChaptersAdapter(this) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersFragment.kt index a1b2dc085..ebce2d9b1 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recent_updates/RecentChaptersFragment.kt @@ -64,9 +64,9 @@ class RecentChaptersFragment /** * Called when view is created * @param view created view - * @param savedInstanceState status of saved sate + * @param savedState status of saved sate */ - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated(view: View, savedState: Bundle?) { // Init RecyclerView and adapter recycler.layoutManager = NpaLinearLayoutManager(activity) recycler.addItemDecoration(DividerItemDecoration(context.theme.getResourceDrawable(R.attr.divider_drawable))) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadFragment.kt index 6586cb48c..02acec765 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recently_read/RecentlyReadFragment.kt @@ -54,9 +54,9 @@ class RecentlyReadFragment : BaseRxFragment() { * Called when view is created * * @param view created view - * @param savedInstanceState status of saved sate + * @param savedState status of saved sate */ - override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { + override fun onViewCreated(view: View?, savedState: Bundle?) { // Initialize adapter recycler.layoutManager = NpaLinearLayoutManager(activity) adapter = RecentlyReadAdapter(this) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutFragment.kt index b0e5aa4dd..284995a36 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAboutFragment.kt @@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.setting import android.os.Bundle import android.support.v7.preference.SwitchPreferenceCompat +import android.support.v7.preference.XpPreferenceFragment import android.view.View import com.afollestad.materialdialogs.MaterialDialog import eu.kanade.tachiyomi.BuildConfig @@ -17,7 +18,7 @@ import java.text.ParseException import java.text.SimpleDateFormat import java.util.* -class SettingsAboutFragment : SettingsNestedFragment() { +class SettingsAboutFragment : SettingsFragment() { /** * Checks for new releases */ @@ -33,15 +34,16 @@ class SettingsAboutFragment : SettingsNestedFragment() { } companion object { - - fun newInstance(resourcePreference: Int, resourceTitle: Int): SettingsNestedFragment { - val fragment = SettingsAboutFragment() - fragment.setArgs(resourcePreference, resourceTitle) - return fragment + fun newInstance(rootKey: String): SettingsAboutFragment { + val args = Bundle() + args.putString(XpPreferenceFragment.ARG_PREFERENCE_ROOT, rootKey) + return SettingsAboutFragment().apply { arguments = args } } } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated(view: View, savedState: Bundle?) { + super.onViewCreated(view, savedState) + val version = findPreference(getString(R.string.pref_version)) val buildTime = findPreference(getString(R.string.pref_build_time)) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsActivity.kt index 08fc09daa..870ce706b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsActivity.kt @@ -1,97 +1,63 @@ package eu.kanade.tachiyomi.ui.setting import android.os.Bundle -import android.support.v14.preference.PreferenceFragment +import android.support.v7.preference.PreferenceFragmentCompat +import android.support.v7.preference.PreferenceScreen +import android.view.MenuItem import eu.kanade.tachiyomi.R -import eu.kanade.tachiyomi.data.cache.ChapterCache -import eu.kanade.tachiyomi.data.database.DatabaseHelper -import eu.kanade.tachiyomi.data.mangasync.MangaSyncManager -import eu.kanade.tachiyomi.data.network.NetworkHelper -import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.data.source.SourceManager import eu.kanade.tachiyomi.ui.base.activity.BaseActivity import kotlinx.android.synthetic.main.toolbar.* -import uy.kohesive.injekt.injectLazy +import net.xpece.android.support.preference.PreferenceScreenNavigationStrategy +import net.xpece.android.support.preference.PreferenceScreenNavigationStrategy.ReplaceFragment -class SettingsActivity : BaseActivity() { +class SettingsActivity : BaseActivity(), + PreferenceFragmentCompat.OnPreferenceStartScreenCallback, + PreferenceScreenNavigationStrategy.ReplaceFragment.Callbacks { - val preferences: PreferencesHelper by injectLazy() - val chapterCache: ChapterCache by injectLazy() - val db: DatabaseHelper by injectLazy() - val sourceManager: SourceManager by injectLazy() - val syncManager: MangaSyncManager by injectLazy() - val networkHelper: NetworkHelper by injectLazy() + private lateinit var replaceFragmentStrategy: ReplaceFragment override fun onCreate(savedState: Bundle?) { setAppTheme() super.onCreate(savedState) setContentView(R.layout.activity_preferences) - setupToolbar(toolbar) + replaceFragmentStrategy = ReplaceFragment(this, + R.anim.abc_fade_in, R.anim.abc_fade_out, + R.anim.abc_fade_in, R.anim.abc_fade_out) if (savedState == null) { - fragmentManager.beginTransaction() - .replace(R.id.settings_content, SettingsMainFragment()) - .commit() + supportFragmentManager.beginTransaction() + .add(R.id.settings_content, SettingsFragment.newInstance(null), "Settings") + .commit() + } + + setupToolbar(toolbar, backNavigation = false) + + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + android.R.id.home -> onBackPressed() + else -> return super.onOptionsItemSelected(item) + } + return true + } + + override fun onBuildPreferenceFragment(key: String?): PreferenceFragmentCompat { + return when (key) { + "general_screen" -> SettingsGeneralFragment.newInstance(key) + "downloads_screen" -> SettingsDownloadsFragment.newInstance(key) + "sources_screen" -> SettingsSourcesFragment.newInstance(key) + "sync_screen" -> SettingsSyncFragment.newInstance(key) + "advanced_screen" -> SettingsAdvancedFragment.newInstance(key) + "about_screen" -> SettingsAboutFragment.newInstance(key) + else -> SettingsFragment.newInstance(key) } } - override fun onBackPressed() { - if (!fragmentManager.popBackStackImmediate()) { - super.onBackPressed() - } - } - - class SettingsMainFragment : PreferenceFragment() { - - override fun onCreatePreferences(savedState: Bundle?, s: String?) { - addPreferencesFromResource(R.xml.pref_main) - - registerSubpreference(R.string.pref_category_general_key) { - SettingsGeneralFragment.newInstance(R.xml.pref_general, R.string.pref_category_general) - } - - registerSubpreference(R.string.pref_category_reader_key) { - SettingsNestedFragment.newInstance(R.xml.pref_reader, R.string.pref_category_reader) - } - - registerSubpreference(R.string.pref_category_downloads_key) { - SettingsDownloadsFragment.newInstance(R.xml.pref_downloads, R.string.pref_category_downloads) - } - - 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) { - SettingsAdvancedFragment.newInstance(R.xml.pref_advanced, R.string.pref_category_advanced) - } - - registerSubpreference(R.string.pref_category_about_key) { - SettingsAboutFragment.newInstance(R.xml.pref_about, R.string.pref_category_about) - } - } - - override fun onResume() { - super.onResume() - (activity as BaseActivity).setToolbarTitle(getString(R.string.label_settings)) - } - - private fun registerSubpreference(preferenceResource: Int, func: () -> PreferenceFragment) { - findPreference(getString(preferenceResource)).setOnPreferenceClickListener { - val fragment = func() - fragmentManager.beginTransaction() - .replace(R.id.settings_content, fragment) - .addToBackStack(fragment.javaClass.simpleName) - .commit() - true - } - } - + override fun onPreferenceStartScreen(p0: PreferenceFragmentCompat, p1: PreferenceScreen): Boolean { + replaceFragmentStrategy.onPreferenceStartScreen(supportFragmentManager, p0, p1) + return true } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedFragment.kt index afad12aa7..9d2259a67 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedFragment.kt @@ -1,38 +1,46 @@ package eu.kanade.tachiyomi.ui.setting import android.os.Bundle +import android.support.v7.preference.XpPreferenceFragment import android.view.View import com.afollestad.materialdialogs.MaterialDialog import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.cache.ChapterCache import eu.kanade.tachiyomi.data.database.DatabaseHelper +import eu.kanade.tachiyomi.data.network.NetworkHelper +import eu.kanade.tachiyomi.util.plusAssign import eu.kanade.tachiyomi.util.toast import rx.Observable -import rx.Subscription import rx.android.schedulers.AndroidSchedulers import rx.schedulers.Schedulers +import uy.kohesive.injekt.injectLazy import java.util.concurrent.atomic.AtomicInteger -class SettingsAdvancedFragment : SettingsNestedFragment() { +class SettingsAdvancedFragment : SettingsFragment() { companion object { - - fun newInstance(resourcePreference: Int, resourceTitle: Int): SettingsNestedFragment { - val fragment = SettingsAdvancedFragment() - fragment.setArgs(resourcePreference, resourceTitle) - return fragment + fun newInstance(rootKey: String): SettingsAdvancedFragment { + val args = Bundle() + args.putString(XpPreferenceFragment.ARG_PREFERENCE_ROOT, rootKey) + return SettingsAdvancedFragment().apply { arguments = args } } } + private val network: NetworkHelper by injectLazy() + + private val chapterCache: ChapterCache by injectLazy() + + private val db: DatabaseHelper by injectLazy() + private val clearCache by lazy { findPreference(getString(R.string.pref_clear_chapter_cache_key)) } private val clearDatabase by lazy { findPreference(getString(R.string.pref_clear_database_key)) } private val clearCookies by lazy { findPreference(getString(R.string.pref_clear_cookies_key)) } - private var clearCacheSubscription: Subscription? = null + override fun onViewCreated(view: View, savedState: Bundle?) { + super.onViewCreated(view, savedState) - override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { clearCache.setOnPreferenceClickListener { clearChapterCache() true @@ -40,7 +48,7 @@ class SettingsAdvancedFragment : SettingsNestedFragment() { clearCache.summary = getString(R.string.used_cache, chapterCache.readableSize) clearCookies.setOnPreferenceClickListener { - settingsActivity.networkHelper.cookies.removeAll() + network.cookies.removeAll() activity.toast(R.string.cookies_cleared) true } @@ -51,11 +59,6 @@ class SettingsAdvancedFragment : SettingsNestedFragment() { } } - override fun onDestroyView() { - clearCacheSubscription?.unsubscribe() - super.onDestroyView() - } - private fun clearChapterCache() { val deletedFiles = AtomicInteger() @@ -67,9 +70,7 @@ class SettingsAdvancedFragment : SettingsNestedFragment() { .cancelable(false) .show() - clearCacheSubscription?.unsubscribe() - - clearCacheSubscription = Observable.defer { Observable.from(files) } + subscriptions += Observable.defer { Observable.from(files) } .concatMap { file -> if (chapterCache.removeFileFromCache(file.name)) { deletedFiles.incrementAndGet() @@ -102,10 +103,4 @@ class SettingsAdvancedFragment : SettingsNestedFragment() { .show() } - private val chapterCache: ChapterCache - get() = settingsActivity.chapterCache - - private val db: DatabaseHelper - get() = settingsActivity.db - } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadsFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadsFragment.kt index 5b75577ee..9ff03c7f6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadsFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsDownloadsFragment.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.os.Bundle import android.os.Environment import android.support.v4.content.ContextCompat +import android.support.v7.preference.XpPreferenceFragment import android.support.v7.widget.RecyclerView import android.view.View import android.view.ViewGroup @@ -14,29 +15,32 @@ import com.nononsenseapps.filepicker.FilePickerActivity import com.nononsenseapps.filepicker.FilePickerFragment import com.nononsenseapps.filepicker.LogicHandler import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.util.inflate -import rx.Subscription +import eu.kanade.tachiyomi.util.plusAssign +import uy.kohesive.injekt.injectLazy import java.io.File -class SettingsDownloadsFragment : SettingsNestedFragment() { +class SettingsDownloadsFragment : SettingsFragment() { companion object { - val DOWNLOAD_DIR_CODE = 103 - fun newInstance(resourcePreference: Int, resourceTitle: Int): SettingsNestedFragment { - val fragment = SettingsDownloadsFragment() - fragment.setArgs(resourcePreference, resourceTitle) - return fragment + fun newInstance(rootKey: String): SettingsDownloadsFragment { + val args = Bundle() + args.putString(XpPreferenceFragment.ARG_PREFERENCE_ROOT, rootKey) + return SettingsDownloadsFragment().apply { arguments = args } } } + private val preferences: PreferencesHelper by injectLazy() + val downloadDirPref by lazy { findPreference(getString(R.string.pref_download_directory_key)) } - var downloadDirSubscription: Subscription? = null - override fun onViewCreated(view: View, savedState: Bundle?) { + super.onViewCreated(view, savedState) + downloadDirPref.setOnPreferenceClickListener { val currentDir = preferences.downloadsDirectory().getOrDefault() @@ -66,15 +70,10 @@ class SettingsDownloadsFragment : SettingsNestedFragment() { true } - downloadDirSubscription = preferences.downloadsDirectory().asObservable() + subscriptions += preferences.downloadsDirectory().asObservable() .subscribe { downloadDirPref.summary = it } } - override fun onDestroyView() { - downloadDirSubscription?.unsubscribe() - super.onDestroyView() - } - fun getExternalFilesDirs(): List { val defaultDir = Environment.getExternalStorageDirectory().absolutePath + File.separator + getString(R.string.app_name) + diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsFragment.kt new file mode 100644 index 000000000..da3d7aca3 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsFragment.kt @@ -0,0 +1,55 @@ +package eu.kanade.tachiyomi.ui.setting + +import android.os.Bundle +import android.support.annotation.CallSuper +import android.support.v7.preference.XpPreferenceFragment +import android.view.View +import eu.kanade.tachiyomi.R +import net.xpece.android.support.preference.PreferenceScreenNavigationStrategy +import rx.subscriptions.CompositeSubscription + +open class SettingsFragment : XpPreferenceFragment() { + + companion object { + fun newInstance(rootKey: String?): SettingsFragment { + val args = Bundle() + args.putString(XpPreferenceFragment.ARG_PREFERENCE_ROOT, rootKey) + return SettingsFragment().apply { arguments = args } + } + } + + lateinit var subscriptions: CompositeSubscription + + override final fun onCreatePreferences2(savedState: Bundle?, rootKey: String?) { + subscriptions = CompositeSubscription() + + addPreferencesFromResource(R.xml.pref_general) + addPreferencesFromResource(R.xml.pref_reader) + addPreferencesFromResource(R.xml.pref_downloads) + addPreferencesFromResource(R.xml.pref_sources) + addPreferencesFromResource(R.xml.pref_sync) + addPreferencesFromResource(R.xml.pref_advanced) + addPreferencesFromResource(R.xml.pref_about) + + // Setup root preference title. + preferenceScreen.title = activity.title + + PreferenceScreenNavigationStrategy.ReplaceFragment.onCreatePreferences(this, rootKey) + } + + @CallSuper + override fun onViewCreated(view: View, savedState: Bundle?) { + listView.isFocusable = false + } + + override fun onStart() { + super.onStart() + activity.title = preferenceScreen.title + } + + override fun onDestroyView() { + subscriptions.unsubscribe() + super.onDestroyView() + } + +} \ No newline at end of file diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralFragment.kt index 5b6b4292f..f49694f1f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralFragment.kt @@ -2,29 +2,37 @@ package eu.kanade.tachiyomi.ui.setting import android.content.Intent import android.os.Bundle -import android.support.v14.preference.MultiSelectListPreference import android.support.v4.app.TaskStackBuilder import android.support.v7.preference.Preference +import android.support.v7.preference.PreferenceFragmentCompat +import android.support.v7.preference.XpPreferenceFragment import android.view.View import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.library.LibraryUpdateAlarm -import eu.kanade.tachiyomi.ui.main.MainActivity +import eu.kanade.tachiyomi.data.preference.PreferencesHelper +import eu.kanade.tachiyomi.util.plusAssign import eu.kanade.tachiyomi.widget.preference.IntListPreference import eu.kanade.tachiyomi.widget.preference.LibraryColumnsDialog import eu.kanade.tachiyomi.widget.preference.SimpleDialogPreference +import net.xpece.android.support.preference.MultiSelectListPreference import rx.Observable -import rx.Subscription +import uy.kohesive.injekt.injectLazy + +class SettingsGeneralFragment : SettingsFragment(), + PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback { -class SettingsGeneralFragment : SettingsNestedFragment() { companion object { - fun newInstance(resourcePreference: Int, resourceTitle: Int): SettingsGeneralFragment { - val fragment = SettingsGeneralFragment(); - fragment.setArgs(resourcePreference, resourceTitle); - return fragment; + fun newInstance(rootKey: String): SettingsGeneralFragment { + val args = Bundle() + args.putString(XpPreferenceFragment.ARG_PREFERENCE_ROOT, rootKey) + return SettingsGeneralFragment().apply { arguments = args } } } + private val preferences: PreferencesHelper by injectLazy() + + val columnsPreference by lazy { findPreference(getString(R.string.pref_library_columns_dialog_key)) as SimpleDialogPreference } @@ -41,15 +49,13 @@ class SettingsGeneralFragment : SettingsNestedFragment() { findPreference(getString(R.string.pref_theme_key)) as IntListPreference } - var updateIntervalSubscription: Subscription? = null + override fun onViewCreated(view: View, savedState: Bundle?) { + super.onViewCreated(view, savedState) - var columnsSubscription: Subscription? = null - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - updateIntervalSubscription = preferences.libraryUpdateInterval().asObservable() + subscriptions += preferences.libraryUpdateInterval().asObservable() .subscribe { updateRestriction.isVisible = it > 0 } - columnsSubscription = Observable.combineLatest( + subscriptions += Observable.combineLatest( preferences.portraitColumns().asObservable(), preferences.landscapeColumns().asObservable()) { portraitColumns, landscapeColumns -> Pair(portraitColumns, landscapeColumns) } @@ -62,29 +68,21 @@ class SettingsGeneralFragment : SettingsNestedFragment() { themePreference.setOnPreferenceChangeListener { preference, newValue -> // Rebuild activity's to apply themes. - TaskStackBuilder.create(activity) - .addNextIntent(Intent(activity, MainActivity::class.java)) - .addNextIntent(activity.intent) + TaskStackBuilder.create(context) + .addNextIntentWithParentStack(Intent(activity.intent)) .startActivities() true } } - override fun onDestroyView() { - updateIntervalSubscription?.unsubscribe() - columnsSubscription?.unsubscribe() - super.onDestroyView() - - } - - override fun onDisplayPreferenceDialog(preference: Preference) { - if (preference === columnsPreference) { - val fragment = LibraryColumnsDialog.newInstance(preference) + override fun onPreferenceDisplayDialog(p0: PreferenceFragmentCompat?, p: Preference): Boolean { + if (p.key == getString(R.string.pref_library_columns_dialog_key)) { + val fragment = LibraryColumnsDialog.newInstance(p) fragment.setTargetFragment(this, 0) - fragment.show(fragmentManagerCompat, null) - } else { - super.onDisplayPreferenceDialog(preference) + fragment.show(childFragmentManager, null) + return true } + return false } private fun updateColumnsSummary(portraitColumns: Int, landscapeColumns: Int) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsNestedFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsNestedFragment.kt deleted file mode 100644 index c5659f3ad..000000000 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsNestedFragment.kt +++ /dev/null @@ -1,48 +0,0 @@ -package eu.kanade.tachiyomi.ui.setting - -import android.app.FragmentManager -import android.os.Build -import android.os.Bundle -import android.support.v14.preference.PreferenceFragment -import eu.kanade.tachiyomi.data.preference.PreferencesHelper - -open class SettingsNestedFragment : PreferenceFragment() { - - companion object { - - private val RESOURCE_FILE = "resource_file" - private val TOOLBAR_TITLE = "toolbar_title" - - fun newInstance(resourcePreference: Int, resourceTitle: Int): SettingsNestedFragment { - val fragment = SettingsNestedFragment() - fragment.setArgs(resourcePreference, resourceTitle) - return fragment - } - - } - - override fun onCreatePreferences(savedState: Bundle?, s: String?) { - addPreferencesFromResource(arguments.getInt(RESOURCE_FILE)) - } - - override fun onResume() { - super.onResume() - settingsActivity.setToolbarTitle(getString(arguments.getInt(TOOLBAR_TITLE))) - } - - fun setArgs(resourcePreference: Int, resourceTitle: Int) { - val args = Bundle() - args.putInt(RESOURCE_FILE, resourcePreference) - args.putInt(TOOLBAR_TITLE, resourceTitle) - arguments = args - } - - val settingsActivity: SettingsActivity - get() = activity as SettingsActivity - - val preferences: PreferencesHelper - get() = settingsActivity.preferences - - val fragmentManagerCompat: FragmentManager - get() = if (Build.VERSION.SDK_INT >= 17) childFragmentManager else fragmentManager -} \ No newline at end of file diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSourcesFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSourcesFragment.kt index 1d806c331..a51d848ee 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSourcesFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSourcesFragment.kt @@ -2,36 +2,45 @@ 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.support.v7.preference.XpPreferenceFragment import android.view.View +import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.data.source.Source +import eu.kanade.tachiyomi.data.source.SourceManager import eu.kanade.tachiyomi.data.source.getLanguages import eu.kanade.tachiyomi.data.source.online.LoginSource +import eu.kanade.tachiyomi.util.plusAssign import eu.kanade.tachiyomi.widget.preference.LoginPreference import eu.kanade.tachiyomi.widget.preference.SourceLoginDialog -import rx.Subscription +import net.xpece.android.support.preference.MultiSelectListPreference +import uy.kohesive.injekt.injectLazy -class SettingsSourcesFragment : SettingsNestedFragment() { +class SettingsSourcesFragment : SettingsFragment() { companion object { const val SOURCE_CHANGE_REQUEST = 120 - fun newInstance(resourcePreference: Int, resourceTitle: Int): SettingsNestedFragment { - val fragment = SettingsSourcesFragment() - fragment.setArgs(resourcePreference, resourceTitle) - return fragment + fun newInstance(rootKey: String?): SettingsSourcesFragment { + val args = Bundle() + args.putString(XpPreferenceFragment.ARG_PREFERENCE_ROOT, rootKey) + return SettingsSourcesFragment().apply { arguments = args } } } + private val preferences: PreferencesHelper by injectLazy() + + private val sourceManager: SourceManager by injectLazy() + 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?) { + super.onViewCreated(view, savedState) + val langs = getLanguages() val entryKeys = langs.map { it.code } @@ -39,11 +48,11 @@ class SettingsSourcesFragment : SettingsNestedFragment() { languagesPref.entryValues = entryKeys.toTypedArray() languagesPref.values = preferences.enabledLanguages().getOrDefault() - languagesSubscription = preferences.enabledLanguages().asObservable() + subscriptions += preferences.enabledLanguages().asObservable() .subscribe { languages -> sourcesPref.removeAll() - val enabledSources = settingsActivity.sourceManager.getOnlineSources() + val enabledSources = sourceManager.getOnlineSources() .filter { it.lang.code in languages } for (source in enabledSources.filterIsInstance(LoginSource::class.java)) { @@ -56,11 +65,6 @@ class SettingsSourcesFragment : SettingsNestedFragment() { } } - override fun onDestroyView() { - languagesSubscription?.unsubscribe() - super.onDestroyView() - } - fun createLoginSourceEntry(source: Source): Preference { return LoginPreference(preferenceManager.context).apply { key = preferences.keys.sourceUsername(source.id) @@ -69,7 +73,7 @@ class SettingsSourcesFragment : SettingsNestedFragment() { setOnPreferenceClickListener { val fragment = SourceLoginDialog.newInstance(source) fragment.setTargetFragment(this@SettingsSourcesFragment, SOURCE_CHANGE_REQUEST) - fragment.show(fragmentManagerCompat, null) + fragment.show(childFragmentManager, null) true } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSyncFragment.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSyncFragment.kt index d2a1519fe..e5180048f 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSyncFragment.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSyncFragment.kt @@ -3,28 +3,38 @@ package eu.kanade.tachiyomi.ui.setting import android.content.Intent import android.os.Bundle import android.support.v7.preference.PreferenceCategory +import android.support.v7.preference.XpPreferenceFragment import android.view.View +import eu.kanade.tachiyomi.data.mangasync.MangaSyncManager +import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.widget.preference.LoginPreference import eu.kanade.tachiyomi.widget.preference.MangaSyncLoginDialog +import uy.kohesive.injekt.injectLazy -class SettingsSyncFragment : SettingsNestedFragment() { +class SettingsSyncFragment : SettingsFragment() { companion object { const val SYNC_CHANGE_REQUEST = 121 - fun newInstance(resourcePreference: Int, resourceTitle: Int): SettingsNestedFragment { - val fragment = SettingsSyncFragment() - fragment.setArgs(resourcePreference, resourceTitle) - return fragment + fun newInstance(rootKey: String): SettingsSyncFragment { + val args = Bundle() + args.putString(XpPreferenceFragment.ARG_PREFERENCE_ROOT, rootKey) + return SettingsSyncFragment().apply { arguments = args } } } + private val syncManager: MangaSyncManager by injectLazy() + + private val preferences: PreferencesHelper by injectLazy() + val syncCategory by lazy { findPreference("pref_category_manga_sync_accounts") as PreferenceCategory } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + override fun onViewCreated(view: View, savedState: Bundle?) { + super.onViewCreated(view, savedState) + val themedContext = preferenceManager.context - for (sync in settingsActivity.syncManager.services) { + for (sync in syncManager.services) { val pref = LoginPreference(themedContext).apply { key = preferences.keys.syncUsername(sync.id) title = sync.name @@ -32,7 +42,7 @@ class SettingsSyncFragment : SettingsNestedFragment() { setOnPreferenceClickListener { val fragment = MangaSyncLoginDialog.newInstance(sync) fragment.setTargetFragment(this@SettingsSyncFragment, SYNC_CHANGE_REQUEST) - fragment.show(fragmentManagerCompat, null) + fragment.show(childFragmentManager, null) true } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/DiskUtils.java b/app/src/main/java/eu/kanade/tachiyomi/util/DiskUtils.java index 1b22cacfa..53011786b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/DiskUtils.java +++ b/app/src/main/java/eu/kanade/tachiyomi/util/DiskUtils.java @@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.util; import java.io.File; import java.io.IOException; -import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -16,7 +15,7 @@ public final class DiskUtils { String cacheKey; try { final MessageDigest mDigest = MessageDigest.getInstance("MD5"); - mDigest.update(key.getBytes(StandardCharsets.UTF_8)); + mDigest.update(key.getBytes()); cacheKey = bytesToHexString(mDigest.digest()); } catch (NoSuchAlgorithmException e) { cacheKey = String.valueOf(key.hashCode()); diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/LibraryColumnsDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/LibraryColumnsDialog.kt index 43dd099bc..1577f424d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/LibraryColumnsDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/LibraryColumnsDialog.kt @@ -1,15 +1,15 @@ package eu.kanade.tachiyomi.widget.preference import android.os.Bundle -import android.support.v14.preference.PreferenceDialogFragment import android.support.v7.preference.Preference +import android.support.v7.preference.PreferenceDialogFragmentCompat import android.view.View import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault -import eu.kanade.tachiyomi.ui.setting.SettingsActivity import kotlinx.android.synthetic.main.pref_library_columns.view.* +import uy.kohesive.injekt.injectLazy -class LibraryColumnsDialog : PreferenceDialogFragment() { +class LibraryColumnsDialog : PreferenceDialogFragmentCompat() { companion object { @@ -25,8 +25,7 @@ class LibraryColumnsDialog : PreferenceDialogFragment() { var portrait: Int = 0 var landscape: Int = 0 - val preferences: PreferencesHelper - get() = (activity as SettingsActivity).preferences + val preferences: PreferencesHelper by injectLazy() override fun onBindDialogView(view: View) { super.onBindDialogView(view) diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/LoginDialogPreference.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/LoginDialogPreference.kt index 41de3f25b..95301c45d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/LoginDialogPreference.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/LoginDialogPreference.kt @@ -1,28 +1,27 @@ package eu.kanade.tachiyomi.widget.preference import android.app.Dialog -import android.app.DialogFragment import android.content.DialogInterface import android.content.Intent import android.os.Bundle +import android.support.v4.app.DialogFragment import android.text.method.PasswordTransformationMethod import android.view.View import com.afollestad.materialdialogs.MaterialDialog import com.dd.processbutton.iml.ActionProcessButton import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.preference.PreferencesHelper -import eu.kanade.tachiyomi.ui.setting.SettingsActivity import eu.kanade.tachiyomi.widget.SimpleTextWatcher import kotlinx.android.synthetic.main.pref_account_login.view.* import rx.Subscription +import uy.kohesive.injekt.injectLazy abstract class LoginDialogPreference : DialogFragment() { var v: View? = null private set - val preferences: PreferencesHelper - get() = (activity as SettingsActivity).preferences + val preferences: PreferencesHelper by injectLazy() var requestSubscription: Subscription? = null diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/MangaSyncLoginDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/MangaSyncLoginDialog.kt index 53200eb68..63f20de60 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/MangaSyncLoginDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/MangaSyncLoginDialog.kt @@ -3,12 +3,13 @@ package eu.kanade.tachiyomi.widget.preference import android.os.Bundle import android.view.View import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.mangasync.MangaSyncManager import eu.kanade.tachiyomi.data.mangasync.MangaSyncService -import eu.kanade.tachiyomi.ui.setting.SettingsActivity import eu.kanade.tachiyomi.util.toast import kotlinx.android.synthetic.main.pref_account_login.view.* import rx.android.schedulers.AndroidSchedulers import rx.schedulers.Schedulers +import uy.kohesive.injekt.injectLazy class MangaSyncLoginDialog : LoginDialogPreference() { @@ -23,13 +24,15 @@ class MangaSyncLoginDialog : LoginDialogPreference() { } } + val syncManager: MangaSyncManager by injectLazy() + lateinit var sync: MangaSyncService override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val syncId = arguments.getInt("key") - sync = (activity as SettingsActivity).syncManager.getService(syncId)!! + sync = syncManager.getService(syncId)!! } override fun setCredentialsOnView(view: View) = with(view) { diff --git a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/SourceLoginDialog.kt b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/SourceLoginDialog.kt index 76d315da1..24061270c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/widget/preference/SourceLoginDialog.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/widget/preference/SourceLoginDialog.kt @@ -4,12 +4,13 @@ import android.os.Bundle import android.view.View import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.data.source.Source +import eu.kanade.tachiyomi.data.source.SourceManager import eu.kanade.tachiyomi.data.source.online.LoginSource -import eu.kanade.tachiyomi.ui.setting.SettingsActivity import eu.kanade.tachiyomi.util.toast import kotlinx.android.synthetic.main.pref_account_login.view.* import rx.android.schedulers.AndroidSchedulers import rx.schedulers.Schedulers +import uy.kohesive.injekt.injectLazy class SourceLoginDialog : LoginDialogPreference() { @@ -24,13 +25,15 @@ class SourceLoginDialog : LoginDialogPreference() { } } + val sourceManager: SourceManager by injectLazy() + lateinit var source: LoginSource override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val sourceId = arguments.getInt("key") - source = (activity as SettingsActivity).sourceManager.get(sourceId) as LoginSource + source = sourceManager.get(sourceId) as LoginSource } override fun setCredentialsOnView(view: View) = with(view) { diff --git a/app/src/main/res/values-v21/themes.xml b/app/src/main/res/values-v21/themes.xml index 0d0eb2e28..61f0c68af 100644 --- a/app/src/main/res/values-v21/themes.xml +++ b/app/src/main/res/values-v21/themes.xml @@ -8,7 +8,6 @@ true @android:color/transparent @color/colorPrimaryDark - @style/Theme.AlertDialog.Light @@ -19,6 +18,5 @@ true @android:color/transparent @color/colorPrimaryDark - @style/Theme.AlertDialog.Dark \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 9916beff1..5e40a8c03 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -26,7 +26,9 @@ true @style/Theme.ActionBar.Light - @style/PreferenceThemeOverlay.v14.Material + @style/PreferenceThemeOverlay.Material + @style/Theme.AlertDialog.Light + @drawable/list_item_selector_light @@ -61,7 +63,9 @@ true @style/ThemeOverlay.AppCompat.Dark.ActionBar @style/ThemeOverlay.AppCompat - @style/PreferenceThemeOverlay.v14.Material + @style/PreferenceThemeOverlay.Material + @style/Theme.AlertDialog.Dark + @style/Theme.Widget.NavigationView.Dark diff --git a/app/src/main/res/xml/pref_about.xml b/app/src/main/res/xml/pref_about.xml index e4df24e83..b706570d5 100644 --- a/app/src/main/res/xml/pref_about.xml +++ b/app/src/main/res/xml/pref_about.xml @@ -1,28 +1,34 @@ - + - + - - - - - - + - + + + + + + - + - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_advanced.xml b/app/src/main/res/xml/pref_advanced.xml index c3b0fee02..94c5a0a21 100644 --- a/app/src/main/res/xml/pref_advanced.xml +++ b/app/src/main/res/xml/pref_advanced.xml @@ -1,24 +1,31 @@ - - + - + - + - + - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_downloads.xml b/app/src/main/res/xml/pref_downloads.xml index f23a9f60b..ce777236a 100644 --- a/app/src/main/res/xml/pref_downloads.xml +++ b/app/src/main/res/xml/pref_downloads.xml @@ -1,43 +1,50 @@ - + - - - - - - - - + android:title="@string/pref_category_downloads"> - + - + - \ No newline at end of file + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_general.xml b/app/src/main/res/xml/pref_general.xml index 8d96330d3..2df9363de 100644 --- a/app/src/main/res/xml/pref_general.xml +++ b/app/src/main/res/xml/pref_general.xml @@ -1,39 +1,45 @@ - + - - - + android:title="@string/pref_category_general"> - + - + - + - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_main.xml b/app/src/main/res/xml/pref_main.xml deleted file mode 100644 index 35df58665..000000000 --- a/app/src/main/res/xml/pref_main.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/xml/pref_reader.xml b/app/src/main/res/xml/pref_reader.xml index 7a716c91f..8f27859e6 100644 --- a/app/src/main/res/xml/pref_reader.xml +++ b/app/src/main/res/xml/pref_reader.xml @@ -1,93 +1,99 @@ - + - + - + - + - + - + - + - + - - - - - - - - - - - - + + + + - + - \ No newline at end of file + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_sources.xml b/app/src/main/res/xml/pref_sources.xml index 717d4d9fb..31b2d99b7 100644 --- a/app/src/main/res/xml/pref_sources.xml +++ b/app/src/main/res/xml/pref_sources.xml @@ -1,16 +1,21 @@ - + - - - + android:title="@string/pref_category_sources"> - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_sync.xml b/app/src/main/res/xml/pref_sync.xml index a41621dd7..d9c24c54c 100644 --- a/app/src/main/res/xml/pref_sync.xml +++ b/app/src/main/res/xml/pref_sync.xml @@ -1,22 +1,27 @@ - + - + - + - + - \ No newline at end of file + + + + + \ No newline at end of file