From 5b53f8c27dee45195dad7fb258a44316f354031b Mon Sep 17 00:00:00 2001 From: Koitharu Date: Fri, 13 Oct 2023 14:19:05 +0300 Subject: [PATCH] Improve list options configuring --- .../kotatsu/core/prefs/AppSettings.kt | 10 ++ .../ui/list/FavouritesListMenuProvider.kt | 4 +- .../ui/list/FavouritesListViewModel.kt | 4 + .../kotatsu/history/ui/HistoryListFragment.kt | 5 - .../history/ui/HistoryListMenuProvider.kt | 30 ---- .../history/ui/HistoryListViewModel.kt | 17 +-- .../kotatsu/list/ui/ListModeBottomSheet.kt | 78 ---------- .../kotatsu/list/ui/MangaListMenuProvider.kt | 3 +- .../kotatsu/list/ui/MangaListViewModel.kt | 2 +- .../list/ui/config/ListConfigBottomSheet.kt | 143 ++++++++++++++++++ app/src/main/res/drawable/ic_list_group.xml | 12 ++ ...alog_list_mode.xml => sheet_list_mode.xml} | 56 ++++++- app/src/main/res/menu/opt_history.xml | 21 --- app/src/main/res/menu/opt_list.xml | 2 +- app/src/main/res/values/strings.xml | 1 + 15 files changed, 235 insertions(+), 153 deletions(-) delete mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/list/ui/ListModeBottomSheet.kt create mode 100644 app/src/main/kotlin/org/koitharu/kotatsu/list/ui/config/ListConfigBottomSheet.kt create mode 100644 app/src/main/res/drawable/ic_list_group.xml rename app/src/main/res/layout/{dialog_list_mode.xml => sheet_list_mode.xml} (61%) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 8681d4cb5..9ea90e53e 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -72,6 +72,14 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { get() = prefs.getInt(KEY_GRID_SIZE, 100) set(value) = prefs.edit { putInt(KEY_GRID_SIZE, value) } + var historyListMode: ListMode + get() = prefs.getEnumValue(KEY_LIST_MODE_HISTORY, listMode) + set(value) = prefs.edit { putEnumValue(KEY_LIST_MODE_HISTORY, value) } + + var favoritesListMode: ListMode + get() = prefs.getEnumValue(KEY_LIST_MODE_FAVORITES, listMode) + set(value) = prefs.edit { putEnumValue(KEY_LIST_MODE_FAVORITES, value) } + var isNsfwContentDisabled: Boolean get() = prefs.getBoolean(KEY_DISABLE_NSFW, false) set(value) = prefs.edit { putBoolean(KEY_DISABLE_NSFW, value) } @@ -407,6 +415,8 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { const val TRACK_FAVOURITES = "favourites" const val KEY_LIST_MODE = "list_mode_2" + const val KEY_LIST_MODE_HISTORY = "list_mode_history" + const val KEY_LIST_MODE_FAVORITES = "list_mode_favorites" const val KEY_THEME = "theme" const val KEY_COLOR_THEME = "color_theme" const val KEY_THEME_AMOLED = "amoled_theme" diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt index c6da76d8b..f4c246b27 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/list/FavouritesListMenuProvider.kt @@ -44,9 +44,7 @@ class FavouritesListMenuProvider( } return when (menuItem.itemId) { R.id.action_edit -> { - context.startActivity( - FavouritesCategoryEditActivity.newIntent(context, viewModel.categoryId), - ) + context.startActivity(FavouritesCategoryEditActivity.newIntent(context, viewModel.categoryId)) true } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt index dea73f94f..0c2b050f4 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/favourites/ui/list/FavouritesListViewModel.kt @@ -14,6 +14,7 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.plus import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.prefs.observeAsFlow import org.koitharu.kotatsu.core.ui.util.ReversibleAction import org.koitharu.kotatsu.core.util.ext.call import org.koitharu.kotatsu.download.ui.worker.DownloadWorker @@ -40,6 +41,9 @@ class FavouritesListViewModel @Inject constructor( val categoryId: Long = savedStateHandle[ARG_CATEGORY_ID] ?: NO_ID + override val listMode = settings.observeAsFlow(AppSettings.KEY_LIST_MODE_FAVORITES) { favoritesListMode } + .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, settings.favoritesListMode) + val sortOrder: StateFlow = if (categoryId == NO_ID) { MutableStateFlow(null) } else { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListFragment.kt index 14edb0b09..56837477a 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListFragment.kt @@ -9,9 +9,7 @@ import dagger.hilt.android.AndroidEntryPoint import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.os.NetworkManageIntent import org.koitharu.kotatsu.core.ui.list.ListSelectionController -import org.koitharu.kotatsu.core.ui.util.MenuInvalidator import org.koitharu.kotatsu.core.util.ext.addMenuProvider -import org.koitharu.kotatsu.core.util.ext.observe import org.koitharu.kotatsu.databinding.FragmentListBinding import org.koitharu.kotatsu.list.ui.MangaListFragment import org.koitharu.kotatsu.list.ui.size.DynamicItemSizeResolver @@ -26,9 +24,6 @@ class HistoryListFragment : MangaListFragment() { override fun onViewBindingCreated(binding: FragmentListBinding, savedInstanceState: Bundle?) { super.onViewBindingCreated(binding, savedInstanceState) addMenuProvider(HistoryListMenuProvider(binding.root.context, viewModel)) - val menuInvalidator = MenuInvalidator(requireActivity()) - viewModel.isGroupingEnabled.observe(viewLifecycleOwner, menuInvalidator) - viewModel.sortOrder.observe(viewLifecycleOwner, menuInvalidator) } override fun onScrolledToEnd() = Unit diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListMenuProvider.kt b/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListMenuProvider.kt index c88046df8..ddd41df4a 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListMenuProvider.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListMenuProvider.kt @@ -5,12 +5,10 @@ import android.view.Menu import android.view.MenuInflater import android.view.MenuItem import androidx.core.view.MenuProvider -import androidx.core.view.forEach import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.koitharu.kotatsu.R import org.koitharu.kotatsu.core.ui.dialog.RememberSelectionDialogListener import org.koitharu.kotatsu.core.util.ext.startOfDay -import org.koitharu.kotatsu.history.domain.model.HistoryOrder import java.util.Date import java.util.concurrent.TimeUnit import com.google.android.material.R as materialR @@ -22,47 +20,19 @@ class HistoryListMenuProvider( override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { menuInflater.inflate(R.menu.opt_history, menu) - val subMenu = menu.findItem(R.id.action_order)?.subMenu ?: return - for (order in HistoryOrder.entries) { - subMenu.add(R.id.group_order, Menu.NONE, order.ordinal, order.titleResId) - } - subMenu.setGroupCheckable(R.id.group_order, true, true) } override fun onMenuItemSelected(menuItem: MenuItem): Boolean { - if (menuItem.groupId == R.id.group_order) { - val order = HistoryOrder.entries[menuItem.order] - viewModel.setSortOrder(order) - return true - } return when (menuItem.itemId) { R.id.action_clear_history -> { showClearHistoryDialog() true } - R.id.action_history_grouping -> { - viewModel.setGrouping(!menuItem.isChecked) - true - } - else -> false } } - override fun onPrepareMenu(menu: Menu) { - val order = viewModel.sortOrder.value - menu.findItem(R.id.action_order)?.subMenu?.forEach { item -> - if (item.order == order.ordinal) { - item.isChecked = true - } - } - menu.findItem(R.id.action_history_grouping)?.run { - isChecked = viewModel.isGroupingEnabled.value == true - isEnabled = order.isGroupingSupported() - } - } - private fun showClearHistoryDialog() { val selectionListener = RememberSelectionDialogListener(2) MaterialAlertDialogBuilder(context, materialR.style.ThemeOverlay_Material3_MaterialAlertDialog_Centered) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt index 779d84c4a..baa05e68c 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/history/ui/HistoryListViewModel.kt @@ -54,22 +54,21 @@ class HistoryListViewModel @Inject constructor( downloadScheduler: DownloadWorker.Scheduler, ) : MangaListViewModel(settings, downloadScheduler) { - val sortOrder: StateFlow = settings.observeAsStateFlow( + private val sortOrder: StateFlow = settings.observeAsStateFlow( scope = viewModelScope + Dispatchers.IO, key = AppSettings.KEY_HISTORY_ORDER, valueProducer = { historySortOrder }, ) - val isGroupingEnabled = settings.observeAsFlow( + override val listMode = settings.observeAsFlow(AppSettings.KEY_LIST_MODE_HISTORY) { historyListMode } + .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, settings.historyListMode) + + private val isGroupingEnabled = settings.observeAsFlow( key = AppSettings.KEY_HISTORY_GROUPING, valueProducer = { isHistoryGroupingEnabled }, ).combine(sortOrder) { g, s -> g && s.isGroupingSupported() - }.stateIn( - scope = viewModelScope + Dispatchers.Default, - started = SharingStarted.Eagerly, - initialValue = settings.isHistoryGroupingEnabled && sortOrder.value.isGroupingSupported(), - ) + } override val content = combine( sortOrder.flatMapLatest { repository.observeAllWithHistory(it) }, @@ -101,10 +100,6 @@ class HistoryListViewModel @Inject constructor( override fun onRetry() = Unit - fun setSortOrder(order: HistoryOrder) { - settings.historySortOrder = order - } - fun clearHistory(minDate: Long) { launchJob(Dispatchers.Default) { val stringRes = if (minDate <= 0) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/ListModeBottomSheet.kt b/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/ListModeBottomSheet.kt deleted file mode 100644 index 433ddbfb1..000000000 --- a/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/ListModeBottomSheet.kt +++ /dev/null @@ -1,78 +0,0 @@ -package org.koitharu.kotatsu.list.ui - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.ViewGroup -import androidx.core.view.isVisible -import androidx.fragment.app.FragmentManager -import com.google.android.material.button.MaterialButtonToggleGroup -import com.google.android.material.slider.Slider -import dagger.hilt.android.AndroidEntryPoint -import org.koitharu.kotatsu.R -import org.koitharu.kotatsu.core.prefs.AppSettings -import org.koitharu.kotatsu.core.prefs.ListMode -import org.koitharu.kotatsu.core.ui.sheet.BaseAdaptiveSheet -import org.koitharu.kotatsu.core.util.ext.setValueRounded -import org.koitharu.kotatsu.core.util.ext.showDistinct -import org.koitharu.kotatsu.core.util.progress.IntPercentLabelFormatter -import org.koitharu.kotatsu.databinding.DialogListModeBinding -import javax.inject.Inject - -@AndroidEntryPoint -class ListModeBottomSheet : - BaseAdaptiveSheet(), - Slider.OnChangeListener, - MaterialButtonToggleGroup.OnButtonCheckedListener { - - @Inject - lateinit var settings: AppSettings - - override fun onCreateViewBinding( - inflater: LayoutInflater, - container: ViewGroup?, - ) = DialogListModeBinding.inflate(inflater, container, false) - - override fun onViewBindingCreated(binding: DialogListModeBinding, savedInstanceState: Bundle?) { - super.onViewBindingCreated(binding, savedInstanceState) - val mode = settings.listMode - binding.buttonList.isChecked = mode == ListMode.LIST - binding.buttonListDetailed.isChecked = mode == ListMode.DETAILED_LIST - binding.buttonGrid.isChecked = mode == ListMode.GRID - binding.textViewGridTitle.isVisible = mode == ListMode.GRID - binding.sliderGrid.isVisible = mode == ListMode.GRID - - binding.sliderGrid.setLabelFormatter(IntPercentLabelFormatter(binding.root.context)) - binding.sliderGrid.setValueRounded(settings.gridSize.toFloat()) - binding.sliderGrid.addOnChangeListener(this) - - binding.checkableGroup.addOnButtonCheckedListener(this) - } - - override fun onButtonChecked(group: MaterialButtonToggleGroup?, checkedId: Int, isChecked: Boolean) { - if (!isChecked) { - return - } - val mode = when (checkedId) { - R.id.button_list -> ListMode.LIST - R.id.button_list_detailed -> ListMode.DETAILED_LIST - R.id.button_grid -> ListMode.GRID - else -> return - } - requireViewBinding().textViewGridTitle.isVisible = mode == ListMode.GRID - requireViewBinding().sliderGrid.isVisible = mode == ListMode.GRID - settings.listMode = mode - } - - override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) { - if (fromUser) { - settings.gridSize = value.toInt() - } - } - - companion object { - - private const val TAG = "ListModeSelectDialog" - - fun show(fm: FragmentManager) = ListModeBottomSheet().showDistinct(fm, TAG) - } -} diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/MangaListMenuProvider.kt b/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/MangaListMenuProvider.kt index fcc52e1d2..6d2518f4c 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/MangaListMenuProvider.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/MangaListMenuProvider.kt @@ -6,6 +6,7 @@ import android.view.MenuItem import androidx.core.view.MenuProvider import androidx.fragment.app.Fragment import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.list.ui.config.ListConfigBottomSheet class MangaListMenuProvider( private val fragment: Fragment, @@ -17,7 +18,7 @@ class MangaListMenuProvider( override fun onMenuItemSelected(menuItem: MenuItem): Boolean = when (menuItem.itemId) { R.id.action_list_mode -> { - ListModeBottomSheet.show(fragment.childFragmentManager) + ListConfigBottomSheet.show(fragment.childFragmentManager) true } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt b/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt index fd2448506..e8af462a8 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/MangaListViewModel.kt @@ -24,7 +24,7 @@ abstract class MangaListViewModel( ) : BaseViewModel() { abstract val content: StateFlow> - val listMode = settings.observeAsFlow(AppSettings.KEY_LIST_MODE) { listMode } + open val listMode = settings.observeAsFlow(AppSettings.KEY_LIST_MODE) { listMode } .stateIn(viewModelScope + Dispatchers.Default, SharingStarted.Eagerly, settings.listMode) val onActionDone = MutableEventFlow() val gridScale = settings.observeAsStateFlow( diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/config/ListConfigBottomSheet.kt b/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/config/ListConfigBottomSheet.kt new file mode 100644 index 000000000..8ad3796df --- /dev/null +++ b/app/src/main/kotlin/org/koitharu/kotatsu/list/ui/config/ListConfigBottomSheet.kt @@ -0,0 +1,143 @@ +package org.koitharu.kotatsu.list.ui.config + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.CompoundButton +import androidx.core.view.isVisible +import androidx.fragment.app.FragmentManager +import com.google.android.material.button.MaterialButtonToggleGroup +import com.google.android.material.slider.Slider +import dagger.hilt.android.AndroidEntryPoint +import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.prefs.AppSettings +import org.koitharu.kotatsu.core.prefs.ListMode +import org.koitharu.kotatsu.core.ui.sheet.BaseAdaptiveSheet +import org.koitharu.kotatsu.core.util.ext.setValueRounded +import org.koitharu.kotatsu.core.util.ext.showDistinct +import org.koitharu.kotatsu.core.util.progress.IntPercentLabelFormatter +import org.koitharu.kotatsu.databinding.SheetListModeBinding +import org.koitharu.kotatsu.favourites.ui.list.FavouritesListFragment +import org.koitharu.kotatsu.history.domain.model.HistoryOrder +import org.koitharu.kotatsu.history.ui.HistoryListFragment +import javax.inject.Inject + +@AndroidEntryPoint +class ListConfigBottomSheet : + BaseAdaptiveSheet(), + Slider.OnChangeListener, + MaterialButtonToggleGroup.OnButtonCheckedListener, CompoundButton.OnCheckedChangeListener, + AdapterView.OnItemSelectedListener { + + @Inject + lateinit var settings: AppSettings + + override fun onCreateViewBinding( + inflater: LayoutInflater, + container: ViewGroup?, + ) = SheetListModeBinding.inflate(inflater, container, false) + + override fun onViewBindingCreated(binding: SheetListModeBinding, savedInstanceState: Bundle?) { + super.onViewBindingCreated(binding, savedInstanceState) + val section = getSection() + val mode = when (section) { + Section.GENERAL -> settings.listMode + Section.HISTORY -> settings.historyListMode + Section.FAVORITES -> settings.favoritesListMode + } + binding.buttonList.isChecked = mode == ListMode.LIST + binding.buttonListDetailed.isChecked = mode == ListMode.DETAILED_LIST + binding.buttonGrid.isChecked = mode == ListMode.GRID + binding.textViewGridTitle.isVisible = mode == ListMode.GRID + binding.sliderGrid.isVisible = mode == ListMode.GRID + + binding.sliderGrid.setLabelFormatter(IntPercentLabelFormatter(binding.root.context)) + binding.sliderGrid.setValueRounded(settings.gridSize.toFloat()) + binding.sliderGrid.addOnChangeListener(this) + + binding.checkableGroup.addOnButtonCheckedListener(this) + + binding.switchGrouping.isVisible = section == Section.HISTORY + if (section == Section.HISTORY) { + binding.switchGrouping.isEnabled = settings.historySortOrder.isGroupingSupported() + } + binding.switchGrouping.isChecked = settings.isHistoryGroupingEnabled + binding.switchGrouping.setOnCheckedChangeListener(this) + + if (section == Section.HISTORY) { + binding.textViewOrderTitle.isVisible = true + binding.spinnerOrder.adapter = ArrayAdapter( + binding.spinnerOrder.context, + android.R.layout.simple_spinner_dropdown_item, + android.R.id.text1, + HistoryOrder.entries.map { getString(it.titleResId) }, + ) + binding.spinnerOrder.setSelection(settings.historySortOrder.ordinal, false) + binding.spinnerOrder.onItemSelectedListener = this + binding.cardOrder.isVisible = true + } + } + + override fun onButtonChecked(group: MaterialButtonToggleGroup?, checkedId: Int, isChecked: Boolean) { + if (!isChecked) { + return + } + val mode = when (checkedId) { + R.id.button_list -> ListMode.LIST + R.id.button_list_detailed -> ListMode.DETAILED_LIST + R.id.button_grid -> ListMode.GRID + else -> return + } + requireViewBinding().textViewGridTitle.isVisible = mode == ListMode.GRID + requireViewBinding().sliderGrid.isVisible = mode == ListMode.GRID + when (getSection()) { + Section.GENERAL -> settings.listMode = mode + Section.HISTORY -> settings.historyListMode = mode + Section.FAVORITES -> settings.favoritesListMode = mode + } + } + + override fun onCheckedChanged(buttonView: CompoundButton, isChecked: Boolean) { + when (buttonView.id) { + R.id.switch_grouping -> settings.isHistoryGroupingEnabled = isChecked + } + } + + override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) { + if (fromUser) { + settings.gridSize = value.toInt() + } + } + + override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { + when (parent.id) { + R.id.spinner_order -> { + val value = HistoryOrder.entries[position] + settings.historySortOrder = value + viewBinding?.switchGrouping?.isEnabled = value.isGroupingSupported() + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) = Unit + + private fun getSection(): Section = when (parentFragment) { + is HistoryListFragment -> Section.HISTORY + is FavouritesListFragment -> Section.FAVORITES + else -> Section.GENERAL + } + + enum class Section { + GENERAL, HISTORY, FAVORITES; + } + + companion object { + + private const val TAG = "ListModeSelectDialog" + + fun show(fm: FragmentManager) = ListConfigBottomSheet().showDistinct(fm, TAG) + } +} diff --git a/app/src/main/res/drawable/ic_list_group.xml b/app/src/main/res/drawable/ic_list_group.xml new file mode 100644 index 000000000..6d53cab51 --- /dev/null +++ b/app/src/main/res/drawable/ic_list_group.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/layout/dialog_list_mode.xml b/app/src/main/res/layout/sheet_list_mode.xml similarity index 61% rename from app/src/main/res/layout/dialog_list_mode.xml rename to app/src/main/res/layout/sheet_list_mode.xml index b30e21a89..1c831c94f 100644 --- a/app/src/main/res/layout/dialog_list_mode.xml +++ b/app/src/main/res/layout/sheet_list_mode.xml @@ -12,11 +12,13 @@ android:id="@+id/headerBar" android:layout_width="match_parent" android:layout_height="wrap_content" - app:title="@string/options" /> + app:title="@string/list_options" /> + android:layout_height="wrap_content" + android:scrollIndicators="top" + android:scrollbars="vertical"> + + + + + + + + + + diff --git a/app/src/main/res/menu/opt_history.xml b/app/src/main/res/menu/opt_history.xml index 3f3a973af..081c7235b 100644 --- a/app/src/main/res/menu/opt_history.xml +++ b/app/src/main/res/menu/opt_history.xml @@ -3,27 +3,6 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - - - - - - - - - - - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a73782c20..30cf3d11d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -496,4 +496,5 @@ 32-bit color mode Suggest new sources after app update Prompt to enable newly added sources after updating the application + List options