diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fecd4b629..4196d2503 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ - @@ -34,14 +35,17 @@ android:name="android.app.searchable" android:resource="@xml/search" /> + + android:exported="false" + android:grantUriPermissions="true"> diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt new file mode 100644 index 000000000..5dafed16d --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/common/BasePreferenceFragment.kt @@ -0,0 +1,24 @@ +package org.koitharu.kotatsu.ui.common + +import android.content.Context +import androidx.annotation.StringRes +import androidx.preference.Preference +import androidx.preference.PreferenceFragmentCompat +import org.koin.core.KoinComponent +import org.koin.core.inject +import org.koitharu.kotatsu.core.prefs.AppSettings + +abstract class BasePreferenceFragment(@StringRes private val titleId: Int) : + PreferenceFragmentCompat(), KoinComponent { + + protected val settings by inject() + + override fun onAttach(context: Context) { + super.onAttach(context) + activity?.setTitle(titleId) + } + + fun findPreference(@StringRes keyId: Int): T? = + findPreference(getString(keyId)) + +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/main/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/main/MainActivity.kt index c626bd3d1..dbb2397ae 100644 --- a/app/src/main/java/org/koitharu/kotatsu/ui/main/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/ui/main/MainActivity.kt @@ -15,6 +15,7 @@ import org.koitharu.kotatsu.ui.main.list.favourites.FavouritesListFragment import org.koitharu.kotatsu.ui.main.list.history.HistoryListFragment import org.koitharu.kotatsu.ui.main.list.local.LocalListFragment import org.koitharu.kotatsu.ui.main.list.remote.RemoteListFragment +import org.koitharu.kotatsu.ui.settings.SettingsActivity import org.koitharu.kotatsu.utils.SearchHelper class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener { @@ -70,6 +71,10 @@ class MainActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedList R.id.nav_history -> setPrimaryFragment(HistoryListFragment.newInstance()) R.id.nav_favourites -> setPrimaryFragment(FavouritesListFragment.newInstance()) R.id.nav_local_storage -> setPrimaryFragment(LocalListFragment.newInstance()) + R.id.nav_action_settings -> { + startActivity(SettingsActivity.newIntent(this)) + return true + } else -> return false } drawer.closeDrawers() diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt new file mode 100644 index 000000000..6786a0f79 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/AppearanceSettingsFragment.kt @@ -0,0 +1,58 @@ +package org.koitharu.kotatsu.ui.settings + +import android.content.SharedPreferences +import android.os.Bundle +import android.view.View +import androidx.collection.arrayMapOf +import androidx.preference.Preference +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.prefs.ListMode +import org.koitharu.kotatsu.ui.common.BasePreferenceFragment +import org.koitharu.kotatsu.ui.main.list.ListModeSelectDialog + +class AppearanceSettingsFragment : BasePreferenceFragment(R.string.appearance), + SharedPreferences.OnSharedPreferenceChangeListener { + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + addPreferencesFromResource(R.xml.pref_appearance) + + findPreference(R.string.key_list_mode)?.summary = + listModes[settings.listMode]?.let(::getString) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + settings.subscribe(this) + } + + override fun onDestroyView() { + settings.unsubscribe(this) + super.onDestroyView() + } + + override fun onPreferenceTreeClick(preference: Preference?): Boolean { + return when (preference?.key) { + getString(R.string.key_list_mode) -> { + ListModeSelectDialog.show(childFragmentManager) + true + } + else -> super.onPreferenceTreeClick(preference) + } + } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + when (key) { + getString(R.string.key_list_mode) -> findPreference(R.string.key_list_mode)?.summary = + listModes[settings.listMode]?.let(::getString) + } + } + + private companion object { + + val listModes = arrayMapOf( + ListMode.DETAILED_LIST to R.string.detailed_list, + ListMode.GRID to R.string.grid, + ListMode.LIST to R.string.list + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsActivity.kt new file mode 100644 index 000000000..6888d2123 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsActivity.kt @@ -0,0 +1,27 @@ +package org.koitharu.kotatsu.ui.settings + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.ui.common.BaseActivity + +class SettingsActivity : BaseActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_settings) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + + if (supportFragmentManager.findFragmentById(R.id.container) == null) { + supportFragmentManager.beginTransaction() + .replace(R.id.container, SettingsHeadersFragment()) + .commit() + } + } + + companion object { + + fun newIntent(context: Context) = Intent(context, SettingsActivity::class.java) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsHeadersFragment.kt b/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsHeadersFragment.kt new file mode 100644 index 000000000..1b4badafc --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/ui/settings/SettingsHeadersFragment.kt @@ -0,0 +1,12 @@ +package org.koitharu.kotatsu.ui.settings + +import android.os.Bundle +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.ui.common.BasePreferenceFragment + +class SettingsHeadersFragment : BasePreferenceFragment(R.string.settings) { + + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + addPreferencesFromResource(R.xml.pref_headers) + } +} \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/PreferenceExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/PreferenceExt.kt new file mode 100644 index 000000000..39efea10c --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/PreferenceExt.kt @@ -0,0 +1,33 @@ +package org.koitharu.kotatsu.utils.ext + +import androidx.preference.EditTextPreference +import androidx.preference.ListPreference + +fun ListPreference.bindSummary(listener: (String) -> Boolean = { true }) { + summary = entries.getOrNull(findIndexOfValue(value)) + this.setOnPreferenceChangeListener { preference, newValue -> + newValue as String + preference as ListPreference + val res = listener(newValue) + if (res) { + preference.summary = preference.entries.getOrNull(preference.findIndexOfValue(newValue)) + } + res + } +} + +fun EditTextPreference.bindSummary( + formatter: (String) -> String = { it }, + listener: (String) -> Boolean = { true } +) { + summary = formatter(text) + this.setOnPreferenceChangeListener { preference, newValue -> + newValue as String + preference as EditTextPreference + val res = listener(newValue) + if (res) { + preference.summary = formatter(newValue) + } + res + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_palette.xml b/app/src/main/res/drawable/ic_palette.xml new file mode 100644 index 000000000..a3f5c142b --- /dev/null +++ b/app/src/main/res/drawable/ic_palette.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml new file mode 100644 index 000000000..a2edb3abb --- /dev/null +++ b/app/src/main/res/layout/activity_settings.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2e7498103..5a03a3933 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -55,4 +55,5 @@ Sort order Genre Filter + Appearance \ No newline at end of file diff --git a/app/src/main/res/xml/pref_appearance.xml b/app/src/main/res/xml/pref_appearance.xml new file mode 100644 index 000000000..3187a5c20 --- /dev/null +++ b/app/src/main/res/xml/pref_appearance.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_headers.xml b/app/src/main/res/xml/pref_headers.xml new file mode 100644 index 000000000..15ba1b36a --- /dev/null +++ b/app/src/main/res/xml/pref_headers.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file