Bladeren bron

Added dynamic sorting items from enum

Vadik Sirekanyan 5 jaren geleden
bovenliggende
commit
fdfbc727cc

+ 12 - 0
app/src/main/java/com/sirekanyan/knigopis/common/android/menu/MenuItem.kt

@@ -0,0 +1,12 @@
+package com.sirekanyan.knigopis.common.android.menu
+
+import android.view.Menu
+import android.view.MenuItem
+
+fun MenuItem.addAll(items: Array<out OptionItem>) {
+    checkNotNull(subMenu) { "submenu is not specified for item $title" }
+    items.forEach {
+        subMenu.add(Menu.NONE, it.id, Menu.NONE, it.title)
+    }
+    subMenu.setGroupCheckable(Menu.NONE, true, true)
+}

+ 14 - 0
app/src/main/java/com/sirekanyan/knigopis/common/android/menu/OptionItem.kt

@@ -0,0 +1,14 @@
+package com.sirekanyan.knigopis.common.android.menu
+
+import androidx.annotation.IdRes
+import androidx.annotation.StringRes
+
+interface OptionItem {
+
+    @get:IdRes
+    val id: Int
+
+    @get:StringRes
+    val title: Int
+
+}

+ 7 - 0
app/src/main/java/com/sirekanyan/knigopis/common/android/menu/OptionItems.kt

@@ -0,0 +1,7 @@
+package com.sirekanyan.knigopis.common.android.menu
+
+inline fun <reified T> optionIds(): List<Int> where T : Enum<T>, T : OptionItem =
+    enumValues<T>().map(OptionItem::id)
+
+inline fun <reified T> findOption(id: Int): T? where T : Enum<T>, T : OptionItem =
+    enumValues<T>().find { it.id == id }

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

@@ -6,6 +6,8 @@ import android.view.View
 import androidx.appcompat.app.AlertDialog
 import com.sirekanyan.knigopis.BuildConfig
 import com.sirekanyan.knigopis.R
+import com.sirekanyan.knigopis.common.android.menu.addAll
+import com.sirekanyan.knigopis.common.android.menu.optionIds
 import com.sirekanyan.knigopis.common.android.toast.CommonView
 import com.sirekanyan.knigopis.common.extensions.context
 import com.sirekanyan.knigopis.common.extensions.hide
@@ -60,7 +62,7 @@ class MainViewImpl(
 
     init {
         toolbar.inflateMenu(R.menu.options)
-        val sortOptions = BookSorting.values().map(BookSorting::id)
+        toolbar.menu.findItem(R.id.option_sort_books).addAll(BookSorting.values())
         val themeOptions = Theme.values().map(Theme::id)
         toolbar.setOnMenuItemClickListener { item ->
             when (item.itemId) {
@@ -76,7 +78,7 @@ class MainViewImpl(
                     callbacks.onAboutOptionClicked()
                     true
                 }
-                in sortOptions -> {
+                in optionIds<BookSorting>() -> {
                     item.isChecked = true
                     callbacks.onSortOptionClicked(BookSorting.getById(item.itemId))
                     true

+ 12 - 6
app/src/main/java/com/sirekanyan/knigopis/repository/BookSorting.kt

@@ -1,17 +1,23 @@
 package com.sirekanyan.knigopis.repository
 
 import androidx.annotation.IdRes
+import androidx.annotation.StringRes
 import com.sirekanyan.knigopis.R
+import com.sirekanyan.knigopis.common.android.menu.OptionItem
+import com.sirekanyan.knigopis.common.android.menu.findOption
 
-enum class BookSorting(@IdRes val id: Int) {
+enum class BookSorting(
+    @IdRes override val id: Int,
+    @StringRes override val title: Int
+) : OptionItem {
 
-    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);
+    DEFAULT(R.id.option_sort_by_progress, R.string.main_option_sort_by_progress),
+    BY_TIME(R.id.option_sort_by_time, R.string.main_option_sort_by_time),
+    BY_TITLE(R.id.option_sort_by_title, R.string.main_option_sort_by_title),
+    BY_AUTHOR(R.id.option_sort_by_author, R.string.main_option_sort_by_author);
 
     companion object {
-        fun getById(@IdRes id: Int): BookSorting = values().find { it.id == id } ?: DEFAULT
+        fun getById(@IdRes id: Int): BookSorting = findOption(id) ?: DEFAULT
     }
 
 }

+ 1 - 14
app/src/main/res/menu/options.xml

@@ -20,20 +20,7 @@
         android:id="@+id/option_sort_books"
         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>
+            <!-- dynamic content -->
         </menu>
     </item>
 

+ 7 - 0
app/src/main/res/values/ids.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <item name="option_sort_by_time" type="id" />
+    <item name="option_sort_by_progress" type="id" />
+    <item name="option_sort_by_title" type="id" />
+    <item name="option_sort_by_author" type="id" />
+</resources>