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.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 = ""
|
||||||
|
|||||||
Reference in New Issue
Block a user