diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/content/Preferences.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/content/Preferences.kt index 1256617..4588cf4 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/content/Preferences.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/content/Preferences.kt @@ -5,6 +5,7 @@ import android.content.SharedPreferences import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.subjects.PublishSubject import nya.kitsunyan.foxydroid.R +import nya.kitsunyan.foxydroid.entity.ProductItem import java.net.Proxy object Preferences { @@ -13,7 +14,7 @@ object Preferences { private val subject = PublishSubject.create>() private val keys = sequenceOf(Key.AutoSync, Key.IncompatibleVersions, Key.ProxyHost, Key.ProxyPort, Key.ProxyType, - Key.Theme, Key.UpdateNotify, Key.UpdateUnstable).map { Pair(it.name, it) }.toMap() + Key.SortOrder, Key.Theme, Key.UpdateNotify, Key.UpdateUnstable).map { Pair(it.name, it) }.toMap() fun init(context: Context) { preferences = context.getSharedPreferences("${context.packageName}_preferences", Context.MODE_PRIVATE) @@ -77,12 +78,13 @@ object Preferences { } sealed class Key(val name: String, val default: Value) { + object AutoSync: Key("auto_sync", Value.EnumerationValue(Preferences.AutoSync.Wifi)) object IncompatibleVersions: Key("incompatible_versions", Value.BooleanValue(false)) object ProxyHost: Key("proxy_host", Value.StringValue("localhost")) object ProxyPort: Key("proxy_port", Value.IntValue(9050)) object ProxyType: Key("proxy_type", Value.EnumerationValue(Preferences.ProxyType.Direct)) + object SortOrder: Key("sort_order", Value.EnumerationValue(Preferences.SortOrder.Name)) object Theme: Key("theme", Value.EnumerationValue(Preferences.Theme.Light)) - object AutoSync: Key("auto_sync", Value.EnumerationValue(Preferences.AutoSync.Wifi)) object UpdateNotify: Key("update_notify", Value.BooleanValue(true)) object UpdateUnstable: Key("update_unstable", Value.BooleanValue(false)) } @@ -105,6 +107,15 @@ object Preferences { object Socks: ProxyType("socks", Proxy.Type.SOCKS) } + sealed class SortOrder(override val valueString: String, val order: ProductItem.Order): Enumeration { + override val values: List + get() = listOf(Name, Added, Update) + + object Name: SortOrder("name", ProductItem.Order.NAME) + object Added: SortOrder("added", ProductItem.Order.DATE_ADDED) + object Update: SortOrder("update", ProductItem.Order.LAST_UPDATE) + } + sealed class Theme(override val valueString: String, val resId: Int): Enumeration { override val values: List get() = listOf(Light, Dark) diff --git a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/TabsFragment.kt b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/TabsFragment.kt index 351f98a..4829d71 100644 --- a/src/main/kotlin/nya/kitsunyan/foxydroid/screen/TabsFragment.kt +++ b/src/main/kotlin/nya/kitsunyan/foxydroid/screen/TabsFragment.kt @@ -32,8 +32,8 @@ import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.schedulers.Schedulers import nya.kitsunyan.foxydroid.R +import nya.kitsunyan.foxydroid.content.Preferences import nya.kitsunyan.foxydroid.database.Database -import nya.kitsunyan.foxydroid.entity.ProductItem import nya.kitsunyan.foxydroid.service.Connection import nya.kitsunyan.foxydroid.service.SyncService import nya.kitsunyan.foxydroid.utility.RxUtils @@ -52,7 +52,6 @@ class TabsFragment: ScreenFragment() { private const val STATE_SHOW_CATEGORIES = "showCategories" private const val STATE_CATEGORIES = "categories" private const val STATE_CATEGORY = "category" - private const val STATE_ORDER = "order" } private class Layout(view: View) { @@ -87,7 +86,6 @@ class TabsFragment: ScreenFragment() { private var searchQuery = "" private var categories = emptyList() private var category = "" - private var order = ProductItem.Order.NAME private val syncConnection = Connection(SyncService::class.java, onBind = { _, _ -> viewPager?.let { @@ -96,6 +94,7 @@ class TabsFragment: ScreenFragment() { } }) + private var sortOrderDisposable: Disposable? = null private var categoriesDisposable: Disposable? = null private var categoriesAnimator: ValueAnimator? = null @@ -152,16 +151,13 @@ class TabsFragment: ScreenFragment() { .setIcon(Utils.getToolbarIcon(toolbar.context, R.drawable.ic_sort)) .let { menu -> menu.item.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS) - val items = ProductItem.Order.values().map { order -> - menu - .add(order.titleResId) - .setOnMenuItemClickListener { item -> - this@TabsFragment.order = order - item.isChecked = true - productFragments.forEach { it.setOrder(order) } + val items = Preferences.Key.SortOrder.default.value.values + .map { sortOrder -> menu + .add(sortOrder.order.titleResId) + .setOnMenuItemClickListener { + Preferences[Preferences.Key.SortOrder] = sortOrder true - } - } + } } menu.setGroupCheckable(0, true, true) Pair(menu.item, items) } @@ -221,9 +217,12 @@ class TabsFragment: ScreenFragment() { category = savedInstanceState?.getString(STATE_CATEGORY).orEmpty() layout.categoryChange.setOnClickListener { showCategories = categories.isNotEmpty() && !showCategories } - order = savedInstanceState?.getString(STATE_ORDER)?.let(ProductItem.Order::valueOf) ?: ProductItem.Order.NAME - sortOrderMenu!!.second[order.ordinal].isChecked = true - productFragments.forEach { it.setOrder(order) } + updateOrder() + sortOrderDisposable = Preferences.observable.subscribe { + if (it == Preferences.Key.SortOrder) { + updateOrder() + } + } val content = view.findViewById(R.id.fragment_content)!! @@ -303,6 +302,8 @@ class TabsFragment: ScreenFragment() { viewPager = null syncConnection.unbind(requireContext()) + sortOrderDisposable?.dispose() + sortOrderDisposable = null categoriesDisposable?.dispose() categoriesDisposable = null categoriesAnimator?.cancel() @@ -317,7 +318,6 @@ class TabsFragment: ScreenFragment() { outState.putByte(STATE_SHOW_CATEGORIES, if (showCategories) 1 else 0) outState.putStringArrayList(STATE_CATEGORIES, ArrayList(categories)) outState.putString(STATE_CATEGORY, category) - outState.putString(STATE_ORDER, order.name) } override fun onViewStateRestored(savedInstanceState: Bundle?) { @@ -336,7 +336,7 @@ class TabsFragment: ScreenFragment() { if (view != null && childFragment is ProductsFragment) { childFragment.setSearchQuery(searchQuery) childFragment.setCategory(category) - childFragment.setOrder(order) + childFragment.setOrder(Preferences[Preferences.Key.SortOrder].order) } } @@ -381,6 +381,12 @@ class TabsFragment: ScreenFragment() { syncConnection.binder?.setUpdateNotificationBlocker(blockerFragment) } + private fun updateOrder() { + val order = Preferences[Preferences.Key.SortOrder].order + sortOrderMenu!!.second[order.ordinal].isChecked = true + productFragments.forEach { it.setOrder(order) } + } + private fun updateCategory() { if (category.isNotEmpty() && categories.indexOf(category) < 0) { category = ""