From bc3a7fc21194ea4d83fd02f63f5c84b04c2a579c Mon Sep 17 00:00:00 2001 From: Koitharu Date: Mon, 5 Jun 2023 12:53:12 +0300 Subject: [PATCH] Reorganize settings --- .../kotatsu/core/ui/BasePreferenceFragment.kt | 14 +--- .../kotatsu/local/ui/ImportDialogFragment.kt | 8 +- ...agment.kt => DownloadsSettingsFragment.kt} | 71 +---------------- .../settings/NetworkSettingsFragment.kt | 79 +++++++++++++++++++ .../kotatsu/settings/RootSettingsFragment.kt | 2 +- .../settings/ServicesSettingsFragment.kt | 29 ++++++- .../kotatsu/settings/SettingsActivity.kt | 9 ++- ...ragment.kt => UserDataSettingsFragment.kt} | 39 ++++++++- .../settings/backup/BackupDialogFragment.kt | 7 +- .../settings/backup/BackupSettingsFragment.kt | 55 ------------- .../settings/backup/RestoreDialogFragment.kt | 9 ++- app/src/main/res/drawable/ic_data_privacy.xml | 12 +++ app/src/main/res/drawable/ic_services.xml | 4 +- .../res/layout-w600dp/activity_settings.xml | 26 +++++- app/src/main/res/values/strings.xml | 7 ++ app/src/main/res/xml/pref_appearance.xml | 28 ++++--- app/src/main/res/xml/pref_backup.xml | 23 ------ app/src/main/res/xml/pref_downloads.xml | 22 ++++++ .../{pref_content.xml => pref_network.xml} | 63 ++++----------- app/src/main/res/xml/pref_reader.xml | 19 +++-- app/src/main/res/xml/pref_root.xml | 31 +++++--- app/src/main/res/xml/pref_services.xml | 6 ++ .../{pref_history.xml => pref_user_data.xml} | 22 ++++++ 23 files changed, 333 insertions(+), 252 deletions(-) rename app/src/main/kotlin/org/koitharu/kotatsu/settings/{ContentSettingsFragment.kt => DownloadsSettingsFragment.kt} (56%) create mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/settings/NetworkSettingsFragment.kt rename app/src/main/kotlin/org/koitharu/kotatsu/settings/{HistorySettingsFragment.kt => UserDataSettingsFragment.kt} (84%) delete mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/BackupSettingsFragment.kt create mode 100644 app/src/main/res/drawable/ic_data_privacy.xml delete mode 100644 app/src/main/res/xml/pref_backup.xml create mode 100644 app/src/main/res/xml/pref_downloads.xml rename app/src/main/res/xml/{pref_content.xml => pref_network.xml} (54%) rename app/src/main/res/xml/{pref_history.xml => pref_user_data.xml} (73%) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BasePreferenceFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BasePreferenceFragment.kt index ce040a63e..23fef7433 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BasePreferenceFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/BasePreferenceFragment.kt @@ -9,10 +9,10 @@ import androidx.core.view.updatePadding import androidx.preference.PreferenceFragmentCompat import androidx.recyclerview.widget.RecyclerView import dagger.hilt.android.AndroidEntryPoint -import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.ui.util.RecyclerViewOwner import org.koitharu.kotatsu.core.ui.util.WindowInsetsDelegate +import org.koitharu.kotatsu.settings.SettingsActivity import javax.inject.Inject @Suppress("LeakingThis") @@ -44,9 +44,7 @@ abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : override fun onResume() { super.onResume() - if (titleId != 0) { - setTitle(getString(titleId)) - } + setTitle(if (titleId != 0) getString(titleId) else null) } @CallSuper @@ -56,11 +54,7 @@ abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : ) } - protected fun setTitle(title: CharSequence) { - activity?.let { - if (!it.resources.getBoolean(R.bool.is_tablet)) { - it.title = title - } - } + protected fun setTitle(title: CharSequence?) { + (activity as? SettingsActivity)?.setSectionTitle(title) } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/ImportDialogFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/ImportDialogFragment.kt index 6ff59f3a3..7436ccc65 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/ImportDialogFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/local/ui/ImportDialogFragment.kt @@ -12,7 +12,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.ui.AlertDialogFragment import org.koitharu.kotatsu.databinding.DialogImportBinding -import org.koitharu.kotatsu.settings.backup.BackupDialogFragment import org.koitharu.kotatsu.settings.backup.RestoreDialogFragment class ImportDialogFragment : AlertDialogFragment(), View.OnClickListener { @@ -64,9 +63,10 @@ class ImportDialogFragment : AlertDialogFragment(), View.On } private fun restoreBackup(uri: Uri?) { - RestoreDialogFragment.newInstance(uri ?: return) - .show(parentFragmentManager, BackupDialogFragment.TAG) - dismiss() + if (uri != null) { + RestoreDialogFragment.show(parentFragmentManager, uri) + dismiss() + } } companion object { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/DownloadsSettingsFragment.kt similarity index 56% rename from app/src/main/kotlin/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt rename to app/src/main/kotlin/org/koitharu/kotatsu/settings/DownloadsSettingsFragment.kt index 9e9091beb..151de74e5 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/DownloadsSettingsFragment.kt @@ -3,67 +3,42 @@ package org.koitharu.kotatsu.settings import android.content.SharedPreferences import android.os.Bundle import android.view.View -import androidx.preference.ListPreference import androidx.preference.Preference -import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.core.cache.ContentCache -import org.koitharu.kotatsu.core.network.DoHProvider import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.ui.dialog.StorageSelectDialog import org.koitharu.kotatsu.core.util.ext.getStorageName -import org.koitharu.kotatsu.core.util.ext.setDefaultValueCompat import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope import org.koitharu.kotatsu.download.ui.worker.DownloadWorker import org.koitharu.kotatsu.local.data.LocalStorageManager -import org.koitharu.kotatsu.parsers.util.names import org.koitharu.kotatsu.util.ext.printStackTraceDebug import java.io.File -import java.net.Proxy import javax.inject.Inject @AndroidEntryPoint -class ContentSettingsFragment : - BasePreferenceFragment(R.string.content), +class DownloadsSettingsFragment : + BasePreferenceFragment(R.string.downloads), SharedPreferences.OnSharedPreferenceChangeListener, StorageSelectDialog.OnStorageSelectListener { @Inject lateinit var storageManager: LocalStorageManager - @Inject - lateinit var contentCache: ContentCache - @Inject lateinit var downloadsScheduler: DownloadWorker.Scheduler override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.pref_content) - findPreference(AppSettings.KEY_PREFETCH_CONTENT)?.isVisible = contentCache.isCachingEnabled - findPreference(AppSettings.KEY_DOH)?.run { - entryValues = arrayOf( - DoHProvider.NONE, - DoHProvider.GOOGLE, - DoHProvider.CLOUDFLARE, - DoHProvider.ADGUARD, - ).names() - setDefaultValueCompat(DoHProvider.NONE.name) - } + addPreferencesFromResource(R.xml.pref_downloads) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) findPreference(AppSettings.KEY_LOCAL_STORAGE)?.bindStorageName() - findPreference(AppSettings.KEY_SUGGESTIONS)?.setSummary( - if (settings.isSuggestionsEnabled) R.string.enabled else R.string.disabled, - ) - bindRemoteSourcesSummary() - bindProxySummary() settings.subscribe(this) } @@ -78,29 +53,9 @@ class ContentSettingsFragment : findPreference(key)?.bindStorageName() } - AppSettings.KEY_SUGGESTIONS -> { - findPreference(AppSettings.KEY_SUGGESTIONS)?.setSummary( - if (settings.isSuggestionsEnabled) R.string.enabled else R.string.disabled, - ) - } - - AppSettings.KEY_SOURCES_HIDDEN -> { - bindRemoteSourcesSummary() - } - AppSettings.KEY_DOWNLOADS_WIFI -> { updateDownloadsConstraints() } - - AppSettings.KEY_SSL_BYPASS -> { - Snackbar.make(listView, R.string.settings_apply_restart_required, Snackbar.LENGTH_INDEFINITE).show() - } - - AppSettings.KEY_PROXY_TYPE, - AppSettings.KEY_PROXY_ADDRESS, - AppSettings.KEY_PROXY_PORT -> { - bindProxySummary() - } } } @@ -131,26 +86,6 @@ class ContentSettingsFragment : } } - private fun bindRemoteSourcesSummary() { - findPreference(AppSettings.KEY_REMOTE_SOURCES)?.run { - val total = settings.remoteMangaSources.size - summary = getString(R.string.enabled_d_of_d, total - settings.hiddenSources.size, total) - } - } - - private fun bindProxySummary() { - findPreference(AppSettings.KEY_PROXY)?.run { - val type = settings.proxyType - val address = settings.proxyAddress - val port = settings.proxyPort - summary = if (type == Proxy.Type.DIRECT || address.isNullOrEmpty() || port == 0) { - context.getString(R.string.disabled) - } else { - "$address:$port" - } - } - } - private fun updateDownloadsConstraints() { val preference = findPreference(AppSettings.KEY_DOWNLOADS_WIFI) viewLifecycleScope.launch { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/NetworkSettingsFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/NetworkSettingsFragment.kt new file mode 100644 index 000000000..48d6f6407 --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/NetworkSettingsFragment.kt @@ -0,0 +1,79 @@ +package org.koitharu.kotatsu.settings + +import android.content.SharedPreferences +import android.os.Bundle +import android.view.View +import androidx.preference.ListPreference +import androidx.preference.Preference +import com.google.android.material.snackbar.Snackbar +import dagger.hilt.android.AndroidEntryPoint +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.cache.ContentCache +import org.koitharu.kotatsu.core.network.DoHProvider +import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.ui.BasePreferenceFragment +import org.koitharu.kotatsu.core.util.ext.setDefaultValueCompat +import org.koitharu.kotatsu.parsers.util.names +import java.net.Proxy +import javax.inject.Inject + +@AndroidEntryPoint +class NetworkSettingsFragment : + BasePreferenceFragment(R.string.network), + SharedPreferences.OnSharedPreferenceChangeListener { + + @Inject + lateinit var contentCache: ContentCache + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + addPreferencesFromResource(R.xml.pref_network) + findPreference(AppSettings.KEY_PREFETCH_CONTENT)?.isVisible = contentCache.isCachingEnabled + findPreference(AppSettings.KEY_DOH)?.run { + entryValues = arrayOf( + DoHProvider.NONE, + DoHProvider.GOOGLE, + DoHProvider.CLOUDFLARE, + DoHProvider.ADGUARD, + ).names() + setDefaultValueCompat(DoHProvider.NONE.name) + } + bindProxySummary() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + settings.subscribe(this) + } + + override fun onDestroyView() { + settings.unsubscribe(this) + super.onDestroyView() + } + + override fun onSharedPreferenceChanged(prefs: SharedPreferences?, key: String?) { + when (key) { + AppSettings.KEY_SSL_BYPASS -> { + Snackbar.make(listView, R.string.settings_apply_restart_required, Snackbar.LENGTH_INDEFINITE).show() + } + + AppSettings.KEY_PROXY_TYPE, + AppSettings.KEY_PROXY_ADDRESS, + AppSettings.KEY_PROXY_PORT -> { + bindProxySummary() + } + } + } + + private fun bindProxySummary() { + findPreference(AppSettings.KEY_PROXY)?.run { + val type = settings.proxyType + val address = settings.proxyAddress + val port = settings.proxyPort + summary = if (type == Proxy.Type.DIRECT || address.isNullOrEmpty() || port == 0) { + context.getString(R.string.disabled) + } else { + "$address:$port" + } + } + } +} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/RootSettingsFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/RootSettingsFragment.kt index 7d737ee50..e3c64b76e 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/RootSettingsFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/RootSettingsFragment.kt @@ -4,7 +4,7 @@ import android.os.Bundle import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.ui.BasePreferenceFragment -class RootSettingsFragment : BasePreferenceFragment(R.string.settings) { +class RootSettingsFragment : BasePreferenceFragment(0) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.pref_root) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/ServicesSettingsFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/ServicesSettingsFragment.kt index 04bbd96ad..7e1409c9d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/ServicesSettingsFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/ServicesSettingsFragment.kt @@ -3,8 +3,10 @@ package org.koitharu.kotatsu.settings import android.accounts.AccountManager import android.content.ActivityNotFoundException import android.content.Intent +import android.content.SharedPreferences import android.net.Uri import android.os.Bundle +import android.view.View import androidx.preference.Preference import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint @@ -27,7 +29,8 @@ import org.koitharu.kotatsu.util.ext.printStackTraceDebug import javax.inject.Inject @AndroidEntryPoint -class ServicesSettingsFragment : BasePreferenceFragment(R.string.services) { +class ServicesSettingsFragment : BasePreferenceFragment(R.string.services), + SharedPreferences.OnSharedPreferenceChangeListener { @Inject lateinit var shikimoriRepository: ShikimoriRepository @@ -43,6 +46,17 @@ class ServicesSettingsFragment : BasePreferenceFragment(R.string.services) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.pref_services) + bindSuggestionsSummary() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + settings.subscribe(this) + } + + override fun onDestroyView() { + settings.unsubscribe(this) + super.onDestroyView() } override fun onResume() { @@ -53,6 +67,13 @@ class ServicesSettingsFragment : BasePreferenceFragment(R.string.services) { bindSyncSummary() } + override fun onSharedPreferenceChanged(prefs: SharedPreferences?, key: String?) { + when (key) { + AppSettings.KEY_SUGGESTIONS -> bindSuggestionsSummary() + } + } + + override fun onPreferenceTreeClick(preference: Preference): Boolean { return when (preference.key) { AppSettings.KEY_SHIKIMORI -> { @@ -156,4 +177,10 @@ class ServicesSettingsFragment : BasePreferenceFragment(R.string.services) { findPreference(AppSettings.KEY_SYNC_SETTINGS)?.isEnabled = account != null } } + + private fun bindSuggestionsSummary() { + findPreference(AppSettings.KEY_SUGGESTIONS)?.setSummary( + if (settings.isSuggestionsEnabled) R.string.enabled else R.string.disabled, + ) + } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/SettingsActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/SettingsActivity.kt index 366cd8c5e..ce3731f83 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/SettingsActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/SettingsActivity.kt @@ -24,6 +24,7 @@ import org.koitharu.kotatsu.core.ui.BaseActivity import org.koitharu.kotatsu.core.ui.util.RecyclerViewOwner import org.koitharu.kotatsu.core.util.ext.getSerializableExtraCompat import org.koitharu.kotatsu.core.util.ext.isScrolledToTop +import org.koitharu.kotatsu.core.util.ext.textAndVisible import org.koitharu.kotatsu.databinding.ActivitySettingsBinding import org.koitharu.kotatsu.main.ui.owners.AppBarOwner import org.koitharu.kotatsu.parsers.model.MangaSource @@ -121,6 +122,12 @@ class SettingsActivity : } } + fun setSectionTitle(title: CharSequence?) { + viewBinding.textViewHeader?.apply { + textAndVisible = title + } ?: setTitle(title ?: getString(R.string.settings)) + } + fun openFragment(fragment: Fragment, isFromRoot: Boolean) { val hasFragment = supportFragmentManager.findFragmentById(R.id.container) != null val isMasterDetail = viewBinding.containerMaster != null @@ -139,7 +146,7 @@ class SettingsActivity : val fragment = when (intent?.action) { ACTION_READER -> ReaderSettingsFragment() ACTION_SUGGESTIONS -> SuggestionsSettingsFragment() - ACTION_HISTORY -> HistorySettingsFragment() + ACTION_HISTORY -> UserDataSettingsFragment() ACTION_TRACKER -> TrackerSettingsFragment() ACTION_SOURCE -> SourceSettingsFragment.newInstance( intent.getSerializableExtraCompat(EXTRA_SOURCE) as? MangaSource ?: MangaSource.LOCAL, diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/UserDataSettingsFragment.kt similarity index 84% rename from app/src/main/kotlin/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt rename to app/src/main/kotlin/org/koitharu/kotatsu/settings/UserDataSettingsFragment.kt index 34b2fdb37..c21c4571d 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/UserDataSettingsFragment.kt @@ -1,7 +1,11 @@ package org.koitharu.kotatsu.settings +import android.content.ActivityNotFoundException +import android.net.Uri import android.os.Bundle import android.view.View +import androidx.activity.result.ActivityResultCallback +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.Lifecycle import androidx.preference.Preference import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -24,11 +28,14 @@ import org.koitharu.kotatsu.core.util.ext.viewLifecycleScope import org.koitharu.kotatsu.local.data.CacheDir import org.koitharu.kotatsu.local.data.LocalStorageManager import org.koitharu.kotatsu.search.domain.MangaSearchRepository +import org.koitharu.kotatsu.settings.backup.BackupDialogFragment +import org.koitharu.kotatsu.settings.backup.RestoreDialogFragment import org.koitharu.kotatsu.tracker.domain.TrackingRepository +import org.koitharu.kotatsu.util.ext.printStackTraceDebug import javax.inject.Inject @AndroidEntryPoint -class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cache) { +class UserDataSettingsFragment : BasePreferenceFragment(R.string.data_and_privacy), ActivityResultCallback { @Inject lateinit var trackerRepo: TrackingRepository @@ -48,8 +55,13 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach @Inject lateinit var shortcutsUpdater: ShortcutsUpdater + private val backupSelectCall = registerForActivityResult( + ActivityResultContracts.OpenDocument(), + this, + ) + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.pref_history) + addPreferencesFromResource(R.xml.pref_user_data) findPreference(AppSettings.KEY_SHORTCUTS)?.isVisible = shortcutsUpdater.isDynamicShortcutsAvailable() } @@ -116,10 +128,33 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach true } + AppSettings.KEY_BACKUP -> { + BackupDialogFragment.show(childFragmentManager) + true + } + + AppSettings.KEY_RESTORE -> { + try { + backupSelectCall.launch(arrayOf("*/*")) + } catch (e: ActivityNotFoundException) { + e.printStackTraceDebug() + Snackbar.make( + listView, R.string.operation_not_supported, Snackbar.LENGTH_SHORT, + ).show() + } + true + } + else -> super.onPreferenceTreeClick(preference) } } + override fun onActivityResult(result: Uri?) { + if (result != null) { + RestoreDialogFragment.show(childFragmentManager, result) + } + } + private fun clearCache(preference: Preference, cache: CacheDir) { val ctx = preference.context.applicationContext viewLifecycleScope.launch { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt index 1a93c12d9..caf25f180 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/BackupDialogFragment.kt @@ -7,6 +7,7 @@ import android.view.ViewGroup import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.core.view.isVisible +import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint @@ -101,6 +102,10 @@ class BackupDialogFragment : AlertDialogFragment() { companion object { - const val TAG = "BackupDialogFragment" + private const val TAG = "BackupDialogFragment" + + fun show(fm: FragmentManager) { + BackupDialogFragment().show(fm, TAG) + } } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/BackupSettingsFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/BackupSettingsFragment.kt deleted file mode 100644 index fbeb28594..000000000 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/BackupSettingsFragment.kt +++ /dev/null @@ -1,55 +0,0 @@ -package org.koitharu.kotatsu.settings.backup - -import android.content.ActivityNotFoundException -import android.net.Uri -import android.os.Bundle -import androidx.activity.result.ActivityResultCallback -import androidx.activity.result.contract.ActivityResultContracts -import androidx.preference.Preference -import com.google.android.material.snackbar.Snackbar -import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.core.prefs.AppSettings -import org.koitharu.kotatsu.core.ui.BasePreferenceFragment -import org.koitharu.kotatsu.util.ext.printStackTraceDebug - -class BackupSettingsFragment : - BasePreferenceFragment(R.string.backup_restore), - ActivityResultCallback { - - private val backupSelectCall = registerForActivityResult( - ActivityResultContracts.OpenDocument(), - this, - ) - - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.pref_backup) - } - - override fun onPreferenceTreeClick(preference: Preference): Boolean { - return when (preference.key) { - AppSettings.KEY_BACKUP -> { - BackupDialogFragment().show(childFragmentManager, BackupDialogFragment.TAG) - true - } - - AppSettings.KEY_RESTORE -> { - try { - backupSelectCall.launch(arrayOf("*/*")) - } catch (e: ActivityNotFoundException) { - e.printStackTraceDebug() - Snackbar.make( - listView, R.string.operation_not_supported, Snackbar.LENGTH_SHORT, - ).show() - } - true - } - - else -> super.onPreferenceTreeClick(preference) - } - } - - override fun onActivityResult(result: Uri?) { - RestoreDialogFragment.newInstance(result ?: return) - .show(childFragmentManager, BackupDialogFragment.TAG) - } -} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt index f2d0b200e..c697a63fa 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/backup/RestoreDialogFragment.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.ViewGroup import androidx.core.view.isVisible +import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels import com.google.android.material.dialog.MaterialAlertDialogBuilder import dagger.hilt.android.AndroidEntryPoint @@ -87,10 +88,12 @@ class RestoreDialogFragment : AlertDialogFragment() { companion object { const val ARG_FILE = "file" - const val TAG = "RestoreDialogFragment" + private const val TAG = "RestoreDialogFragment" - fun newInstance(uri: Uri) = RestoreDialogFragment().withArgs(1) { - putString(ARG_FILE, uri.toString()) + fun show(fm: FragmentManager, uri: Uri) { + RestoreDialogFragment().withArgs(1) { + putString(ARG_FILE, uri.toString()) + }.show(fm, TAG) } } } diff --git a/app/src/main/res/drawable/ic_data_privacy.xml b/app/src/main/res/drawable/ic_data_privacy.xml new file mode 100644 index 000000000..0697d42ee --- /dev/null +++ b/app/src/main/res/drawable/ic_data_privacy.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_services.xml b/app/src/main/res/drawable/ic_services.xml index fe6404dbc..593c9666c 100644 --- a/app/src/main/res/drawable/ic_services.xml +++ b/app/src/main/res/drawable/ic_services.xml @@ -2,10 +2,10 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" - android:tint="?attr/colorControlNormal" + android:tint="?colorControlNormal" android:viewportWidth="24" android:viewportHeight="24"> + android:pathData="M22,13.5C22,15.26 20.7,16.72 19,16.96V20A2,2 0 0,1 17,22H13.2V21.7A2.7,2.7 0 0,0 10.5,19C9,19 7.8,20.21 7.8,21.7V22H4A2,2 0 0,1 2,20V16.2H2.3C3.79,16.2 5,15 5,13.5C5,12 3.79,10.8 2.3,10.8H2V7A2,2 0 0,1 4,5H7.04C7.28,3.3 8.74,2 10.5,2C12.26,2 13.72,3.3 13.96,5H17A2,2 0 0,1 19,7V10.04C20.7,10.28 22,11.74 22,13.5M17,15H18.5A1.5,1.5 0 0,0 20,13.5A1.5,1.5 0 0,0 18.5,12H17V7H12V5.5A1.5,1.5 0 0,0 10.5,4A1.5,1.5 0 0,0 9,5.5V7H4V9.12C5.76,9.8 7,11.5 7,13.5C7,15.5 5.75,17.2 4,17.88V20H6.12C6.8,18.25 8.5,17 10.5,17C12.5,17 14.2,18.25 14.88,20H17V15Z" /> diff --git a/app/src/main/res/layout-w600dp/activity_settings.xml b/app/src/main/res/layout-w600dp/activity_settings.xml index 63aef2083..bbbd8dadf 100644 --- a/app/src/main/res/layout-w600dp/activity_settings.xml +++ b/app/src/main/res/layout-w600dp/activity_settings.xml @@ -2,6 +2,7 @@ @@ -50,10 +51,29 @@ app:layout_constraintStart_toEndOf="@id/container_master" app:layout_constraintTop_toBottomOf="@id/appbar"> - + android:layout_height="match_parent" + android:orientation="vertical"> + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5dad409f3..bd61d47ac 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -433,4 +433,11 @@ Password Authorization (optional) Invalid port number + Network + Data and privacy + Restore previously created backup + Allow zoom in gesture in webtoon mode + Show the current time and reading progress at the top of the screen + Show page numbers in bottom corner + Animate page switching diff --git a/app/src/main/res/xml/pref_appearance.xml b/app/src/main/res/xml/pref_appearance.xml index 5f2058cee..ead9e176a 100644 --- a/app/src/main/res/xml/pref_appearance.xml +++ b/app/src/main/res/xml/pref_appearance.xml @@ -3,6 +3,11 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> + + - - + + + + + + - - + android:title="@string/exit_confirmation" /> diff --git a/app/src/main/res/xml/pref_backup.xml b/app/src/main/res/xml/pref_backup.xml deleted file mode 100644 index 7fc94bcba..000000000 --- a/app/src/main/res/xml/pref_backup.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - \ 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 new file mode 100644 index 000000000..82554d8b9 --- /dev/null +++ b/app/src/main/res/xml/pref_downloads.xml @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/app/src/main/res/xml/pref_content.xml b/app/src/main/res/xml/pref_network.xml similarity index 54% rename from app/src/main/res/xml/pref_content.xml rename to app/src/main/res/xml/pref_network.xml index ccf022e00..2d3bd6e38 100644 --- a/app/src/main/res/xml/pref_content.xml +++ b/app/src/main/res/xml/pref_network.xml @@ -4,22 +4,6 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> - - - - - - + + + + - - - - - - - - - - - - - + diff --git a/app/src/main/res/xml/pref_reader.xml b/app/src/main/res/xml/pref_reader.xml index 525a46202..a078e2928 100644 --- a/app/src/main/res/xml/pref_reader.xml +++ b/app/src/main/res/xml/pref_reader.xml @@ -19,8 +19,15 @@ android:entries="@array/zoom_modes" android:key="zoom_mode" android:title="@string/scale_mode" + app:allowDividerAbove="true" app:useSimpleSummaryProvider="true" /> + + - - + android:summary="@string/reader_info_bar_summary" + android:title="@string/reader_info_bar" + app:allowDividerAbove="true" /> - - + android:title="@string/remote_sources" /> + android:fragment="org.koitharu.kotatsu.settings.NetworkSettingsFragment" + android:icon="@drawable/ic_web" + android:title="@string/network" /> + + + + + android:fragment="org.koitharu.kotatsu.settings.ServicesSettingsFragment" + android:icon="@drawable/ic_services" + android:title="@string/services" /> + + + + + + + + + + + +