Sfoglia il codice sorgente

Added sorting option to main menu

Vadik Sirekanyan 5 anni fa
parent
commit
1356dd78aa

+ 4 - 2
app/src/main/java/com/sirekanyan/knigopis/feature/MainPresenter.kt

@@ -9,6 +9,7 @@ import com.sirekanyan.knigopis.model.CurrentTab.BOOKS_TAB
 import com.sirekanyan.knigopis.model.CurrentTab.NOTES_TAB
 import com.sirekanyan.knigopis.repository.AuthRepository
 import com.sirekanyan.knigopis.repository.Configuration
+import com.sirekanyan.knigopis.repository.Sorting
 import com.sirekanyan.knigopis.repository.Theme
 
 interface MainPresenter : Presenter {
@@ -46,6 +47,7 @@ class MainPresenterImpl(
         get() = currentTab?.let { MainPresenterState(it) }
 
     override fun init(tab: CurrentTab?) {
+        view.setSortOptionChecked(config.sorting)
         view.setThemeOptionChecked(Theme.getCurrent())
         val defaultTab = if (auth.isAuthorized()) BOOKS_TAB else NOTES_TAB
         this.currentTab = tab ?: defaultTab
@@ -114,9 +116,9 @@ class MainPresenterImpl(
         }
     }
 
-    override fun onToolbarClicked() {
+    override fun onSortOptionClicked(sorting: Sorting) {
         if (currentTab == BOOKS_TAB) {
-            config.sortingMode = if (config.sortingMode == 0) 1 else 0
+            config.sorting = sorting
             refresh(isForce = true)
         }
     }

+ 16 - 7
app/src/main/java/com/sirekanyan/knigopis/feature/MainView.kt

@@ -11,6 +11,7 @@ import com.sirekanyan.knigopis.common.extensions.isNightMode
 import com.sirekanyan.knigopis.common.extensions.show
 import com.sirekanyan.knigopis.model.CurrentTab
 import com.sirekanyan.knigopis.model.CurrentTab.*
+import com.sirekanyan.knigopis.repository.Sorting
 import com.sirekanyan.knigopis.repository.Theme
 import com.sirekanyan.knigopis.repository.cache.COMMON_PREFS_NAME
 import kotlinx.android.extensions.LayoutContainer
@@ -31,14 +32,15 @@ interface MainView {
     fun setNavigation(itemId: Int)
     fun showLoginOption(isVisible: Boolean)
     fun showProfileOption(isVisible: Boolean)
+    fun setSortOptionChecked(sorting: Sorting)
     fun setThemeOptionChecked(theme: Theme)
 
     interface Callbacks {
         fun onNavigationClicked(itemId: Int)
-        fun onToolbarClicked()
         fun onLoginOptionClicked()
         fun onProfileOptionClicked()
         fun onAboutOptionClicked()
+        fun onSortOptionClicked(sorting: Sorting)
         fun onThemeOptionClicked(theme: Theme)
     }
 
@@ -55,9 +57,8 @@ class MainViewImpl(
 
     init {
         toolbar.inflateMenu(R.menu.options)
-        toolbar.setOnClickListener {
-            callbacks.onToolbarClicked()
-        }
+        val sortOptions = Sorting.values().map(Sorting::id)
+        val themeOptions = Theme.values().map(Theme::id)
         toolbar.setOnMenuItemClickListener { item ->
             when (item.itemId) {
                 R.id.option_login -> {
@@ -72,9 +73,12 @@ class MainViewImpl(
                     callbacks.onAboutOptionClicked()
                     true
                 }
-                R.id.option_light_theme,
-                R.id.option_dark_theme,
-                R.id.option_default_theme -> {
+                in sortOptions -> {
+                    item.isChecked = true
+                    callbacks.onSortOptionClicked(Sorting.getById(item.itemId))
+                    true
+                }
+                in themeOptions -> {
                     item.isChecked = true
                     callbacks.onThemeOptionClicked(Theme.getById(item.itemId))
                     true
@@ -117,6 +121,7 @@ class MainViewImpl(
         booksPage.show(tab == BOOKS_TAB)
         usersPage.show(tab == USERS_TAB)
         notesPage.show(tab == NOTES_TAB)
+        toolbar.menu.findItem(R.id.option_sort).isVisible = tab == BOOKS_TAB
     }
 
     override fun showNavigation(isVisible: Boolean) {
@@ -144,6 +149,10 @@ class MainViewImpl(
         profileOption.isVisible = isVisible
     }
 
+    override fun setSortOptionChecked(sorting: Sorting) {
+        toolbar.menu.findItem(sorting.id).isChecked = true
+    }
+
     override fun setThemeOptionChecked(theme: Theme) {
         toolbar.menu.findItem(theme.id).isChecked = true
     }

+ 5 - 4
app/src/main/java/com/sirekanyan/knigopis/repository/BookOrganizer.kt

@@ -25,10 +25,11 @@ class PlannedBookOrganizerImpl(
 ) : BookOrganizer<PlannedBook> {
 
     override fun sort(books: List<PlannedBook>): List<PlannedBook> =
-        if (config.sortingMode == 0) {
-            books.sortedByDescending(PlannedBook::priority)
-        } else {
-            books.sortedByDescending(PlannedBook::updatedAt)
+        when (config.sorting) {
+            Sorting.DEFAULT -> books.sortedByDescending(PlannedBook::priority)
+            Sorting.BY_TIME -> books.sortedByDescending(PlannedBook::updatedAt)
+            Sorting.BY_TITLE -> books.sortedBy(PlannedBook::title)
+            Sorting.BY_AUTHOR -> books.sortedBy(PlannedBook::author)
         }
 
     override fun group(books: List<PlannedBook>): List<BookModel> {

+ 2 - 3
app/src/main/java/com/sirekanyan/knigopis/repository/Configuration.kt

@@ -3,17 +3,16 @@ package com.sirekanyan.knigopis.repository
 import android.app.Application
 import android.content.Context.MODE_PRIVATE
 import com.sirekanyan.knigopis.repository.config.enumPreference
-import com.sirekanyan.knigopis.repository.config.intPreference
 
 private const val PREFS_NAME = "config"
 
 interface Configuration {
     var theme: Theme
-    var sortingMode: Int
+    var sorting: Sorting
 }
 
 class ConfigurationImpl(context: Application) : Configuration {
     internal val prefs = context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE)
     override var theme by enumPreference(Theme.DEFAULT)
-    override var sortingMode by intPreference()
+    override var sorting by enumPreference(Sorting.DEFAULT)
 }

+ 17 - 0
app/src/main/java/com/sirekanyan/knigopis/repository/Sorting.kt

@@ -0,0 +1,17 @@
+package com.sirekanyan.knigopis.repository
+
+import androidx.annotation.IdRes
+import com.sirekanyan.knigopis.R
+
+enum class Sorting(@IdRes val id: Int) {
+
+    DEFAULT(R.id.option_sort_by_progress),
+    BY_TIME(R.id.option_sort_by_time),
+    BY_TITLE(R.id.option_sort_by_title),
+    BY_AUTHOR(R.id.option_sort_by_author);
+
+    companion object {
+        fun getById(@IdRes id: Int): Sorting = values().find { it.id == id } ?: DEFAULT
+    }
+
+}

+ 1 - 0
app/src/main/java/com/sirekanyan/knigopis/repository/config/PropertyDelegate.kt

@@ -19,6 +19,7 @@ class PreferenceDelegate<T>(
 
 }
 
+@Suppress("Unused")
 fun intPreference(): PreferenceDelegate<Int> =
     PreferenceDelegate({ key -> getInt(key, 0) }, { key, value -> putInt(key, value) })
 

+ 21 - 0
app/src/main/res/menu/options.xml

@@ -16,6 +16,27 @@
         android:visible="false"
         app:showAsAction="never" />
 
+    <item
+        android:id="@+id/option_sort"
+        android:title="@string/main_option_sort">
+        <menu>
+            <group android:checkableBehavior="single">
+                <item
+                    android:id="@+id/option_sort_by_progress"
+                    android:title="@string/main_option_sort_by_progress" />
+                <item
+                    android:id="@+id/option_sort_by_time"
+                    android:title="@string/main_option_sort_by_time" />
+                <item
+                    android:id="@+id/option_sort_by_title"
+                    android:title="@string/main_option_sort_by_title" />
+                <item
+                    android:id="@+id/option_sort_by_author"
+                    android:title="@string/main_option_sort_by_author" />
+            </group>
+        </menu>
+    </item>
+
     <item android:title="@string/main_option_theme">
         <menu>
             <group android:checkableBehavior="single">

+ 5 - 0
app/src/main/res/values/strings.xml

@@ -21,6 +21,11 @@
     <string name="main.option.login">Login</string>
     <string name="main.option.profile">Profile</string>
     <string name="main.option.about">About</string>
+    <string name="main_option_sort">Sort</string>
+    <string name="main_option_sort_by_progress">By progress</string>
+    <string name="main_option_sort_by_time">By update time</string>
+    <string name="main_option_sort_by_title">By title</string>
+    <string name="main_option_sort_by_author">By author</string>
     <string name="main_option_theme">Theme</string>
     <string name="main_option_theme_light">Light</string>
     <string name="main_option_theme_dark">Dark</string>