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.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<Key<*>>()
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<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 ProxyHost: Key<String>("proxy_host", Value.StringValue("localhost"))
object ProxyPort: Key<Int>("proxy_port", Value.IntValue(9050))
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 AutoSync: Key<Preferences.AutoSync>("auto_sync", Value.EnumerationValue(Preferences.AutoSync.Wifi))
object UpdateNotify: Key<Boolean>("update_notify", Value.BooleanValue(true))
object UpdateUnstable: Key<Boolean>("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<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> {
override val values: List<Theme>
get() = listOf(Light, Dark)
@@ -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<String>()
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<FrameLayout>(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 = ""