Persist sort order

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