mirror of
https://github.com/Michatec/michas-droid.git
synced 2026-05-30 18:02:43 +02:00
Persist sort order
This commit is contained in:
@@ -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 = ""
|
||||
|
||||
Reference in New Issue
Block a user