From 5f08e7e7cd6c87bb2e62bfd654751f908c04fa8e Mon Sep 17 00:00:00 2001 From: tzugen Date: Mon, 17 May 2021 17:14:04 +0200 Subject: [PATCH] Create a new SelectMusicFolderViewHolder instance when the Adapter is recreated, instead of reusing an old one. This lead to a crash. Also make the AlbumList use the correct placeholder, remove an unused resource file, and update the placeholder to look less clumsy. --- .../ultrasonic/fragment/AlbumListFragment.kt | 4 +- .../ultrasonic/fragment/AlbumRowAdapter.kt | 48 ++--- .../ultrasonic/fragment/ArtistListFragment.kt | 4 +- .../ultrasonic/fragment/ArtistRowAdapter.kt | 18 +- .../fragment/GenericListFragment.kt | 40 ++-- .../ultrasonic/fragment/GenericRowAdapter.kt | 54 +++++- .../fragment/TrackCollectionFragment.kt | 35 +--- .../ultrasonic/view/SelectMusicFolderView.kt | 176 +++++++++--------- .../main/res/drawable-hdpi/unknown_album.png | Bin 41767 -> 0 bytes .../src/main/res/drawable/unknown_album.xml | 21 ++- 10 files changed, 201 insertions(+), 199 deletions(-) delete mode 100644 ultrasonic/src/main/res/drawable-hdpi/unknown_album.png diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumListFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumListFragment.kt index 8722bae0..f5b4b4e4 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumListFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumListFragment.kt @@ -61,10 +61,10 @@ class AlbumListFragment : GenericListFragment onItemClick(entry) }, { menuItem, entry -> onContextMenuItemSelected(menuItem, entry) }, - imageLoaderProvider.getImageLoader() + imageLoaderProvider.getImageLoader(), + onMusicFolderUpdate ) } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumRowAdapter.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumRowAdapter.kt index 9785c9e5..2a5f1c46 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumRowAdapter.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumRowAdapter.kt @@ -7,10 +7,8 @@ package org.moire.ultrasonic.fragment -import android.view.LayoutInflater import android.view.MenuItem import android.view.View -import android.view.ViewGroup import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView @@ -18,22 +16,21 @@ import androidx.recyclerview.widget.RecyclerView import org.moire.ultrasonic.R import org.moire.ultrasonic.domain.MusicDirectory import org.moire.ultrasonic.util.ImageLoader -import org.moire.ultrasonic.view.SelectMusicFolderView /** * Creates a Row in a RecyclerView which contains the details of an Album */ class AlbumRowAdapter( albumList: List, - private var selectFolderHeader: SelectMusicFolderView?, onItemClick: (MusicDirectory.Entry) -> Unit, onContextMenuClick: (MenuItem, MusicDirectory.Entry) -> Boolean, - private val imageLoader: ImageLoader + private val imageLoader: ImageLoader, + onMusicFolderUpdate: (String?) -> Unit ) : GenericRowAdapter( - selectFolderHeader, onItemClick, onContextMenuClick, - imageLoader + imageLoader, + onMusicFolderUpdate ) { override var itemList = albumList @@ -48,20 +45,8 @@ class AlbumRowAdapter( super.notifyDataSetChanged() } - override fun onCreateViewHolder( - parent: ViewGroup, - viewType: Int - ): RecyclerView.ViewHolder { - if (viewType == TYPE_ITEM) { - val row = LayoutInflater.from(parent.context) - .inflate(layout, parent, false) - return AlbumViewHolder(row) - } - return selectFolderHeader!! - } - override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - if (holder is AlbumViewHolder) { + if (holder is ViewHolder) { val listPosition = if (selectFolderHeader != null) position - 1 else position val entry = itemList[listPosition] holder.album.text = entry.title @@ -73,7 +58,7 @@ class AlbumRowAdapter( imageLoader.loadImage( holder.coverArt, MusicDirectory.Entry().apply { coverArt = holder.coverArtId }, - false, 0, false, true, R.drawable.ic_contact_picture + false, 0, false, true, R.drawable.unknown_album ) } } @@ -88,13 +73,20 @@ class AlbumRowAdapter( /** * Holds the view properties of an Item row */ - class AlbumViewHolder( - itemView: View - ) : RecyclerView.ViewHolder(itemView) { - var album: TextView = itemView.findViewById(R.id.album_title) - var artist: TextView = itemView.findViewById(R.id.album_artist) - var details: LinearLayout = itemView.findViewById(R.id.row_album_details) - var coverArt: ImageView = itemView.findViewById(R.id.album_coverart) + class ViewHolder( + view: View + ) : RecyclerView.ViewHolder(view) { + var album: TextView = view.findViewById(R.id.album_title) + var artist: TextView = view.findViewById(R.id.album_artist) + var details: LinearLayout = view.findViewById(R.id.row_album_details) + var coverArt: ImageView = view.findViewById(R.id.album_coverart) var coverArtId: String? = null } + + /** + * Creates an instance of our ViewHolder class + */ + override fun newViewHolder(view: View): RecyclerView.ViewHolder { + return ViewHolder(view) + } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistListFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistListFragment.kt index 2f8e78a6..ddda850b 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistListFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistListFragment.kt @@ -54,10 +54,10 @@ class ArtistListFragment : GenericListFragment() { override val viewAdapter: ArtistRowAdapter by lazy { ArtistRowAdapter( liveDataItems.value ?: listOf(), - selectFolderHeader, { entry -> onItemClick(entry) }, { menuItem, entry -> onContextMenuItemSelected(menuItem, entry) }, - imageLoaderProvider.getImageLoader() + imageLoaderProvider.getImageLoader(), + onMusicFolderUpdate ) } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistRowAdapter.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistRowAdapter.kt index a021b606..dfd86ef9 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistRowAdapter.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistRowAdapter.kt @@ -17,22 +17,21 @@ import org.moire.ultrasonic.domain.Artist import org.moire.ultrasonic.domain.MusicDirectory import org.moire.ultrasonic.util.ImageLoader import org.moire.ultrasonic.util.Util -import org.moire.ultrasonic.view.SelectMusicFolderView /** * Creates a Row in a RecyclerView which contains the details of an Artist */ class ArtistRowAdapter( artistList: List, - private var selectFolderHeader: SelectMusicFolderView?, onItemClick: (Artist) -> Unit, onContextMenuClick: (MenuItem, Artist) -> Boolean, - private val imageLoader: ImageLoader + private val imageLoader: ImageLoader, + onMusicFolderUpdate: (String?) -> Unit ) : GenericRowAdapter( - selectFolderHeader, onItemClick, onContextMenuClick, - imageLoader + imageLoader, + onMusicFolderUpdate ), SectionedAdapter { @@ -51,7 +50,7 @@ class ArtistRowAdapter( } override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { - if (holder is ItemViewHolder) { + if (holder is ViewHolder) { val listPosition = if (selectFolderHeader != null) position - 1 else position holder.textView.text = itemList[listPosition].name holder.section.text = getSectionForArtist(listPosition) @@ -101,4 +100,11 @@ class ArtistRowAdapter( if (!section.isLetter()) section = '#' return section.toString() } + + /** + * Creates an instance of our ViewHolder class + */ + override fun newViewHolder(view: View): RecyclerView.ViewHolder { + return ViewHolder(view) + } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericListFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericListFragment.kt index a0b0021e..723193ad 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericListFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericListFragment.kt @@ -88,15 +88,25 @@ abstract class GenericListFragment> /** * The observer to be called if the available music folders have changed */ - val musicFolderObserver = { changedFolders: List -> - viewAdapter.notifyDataSetChanged() - selectFolderHeader?.setData( - activeServerProvider.getActiveServer().musicFolderId, - changedFolders - ) + @Suppress("CommentOverPrivateProperty") + private val musicFolderObserver = { folders: List -> + viewAdapter.setFolderList(folders, listModel.activeServer.musicFolderId) Unit } + /** + * What to do when the user has modified the folder filter + */ + val onMusicFolderUpdate = { selectedFolderId: String? -> + if (!listModel.isOffline()) { + val currentSetting = listModel.activeServer + currentSetting.musicFolderId = selectedFolderId + serverSettingsModel.updateItem(currentSetting) + } + viewAdapter.notifyDataSetChanged() + listModel.refresh(refreshListView!!, arguments) + } + /** * Whether to show the folder selector */ @@ -142,27 +152,15 @@ abstract class GenericListFragment> // Create a View Manager viewManager = LinearLayoutManager(this.context) - // Show folder selector UI if enabled - if (showFolderHeader()) { - selectFolderHeader = SelectMusicFolderView( - requireContext(), view as ViewGroup - ) { selectedFolderId -> - if (!listModel.isOffline()) { - val currentSetting = listModel.activeServer - currentSetting.musicFolderId = selectedFolderId - serverSettingsModel.updateItem(currentSetting) - } - viewAdapter.notifyDataSetChanged() - listModel.refresh(refreshListView!!, arguments) - } - } - // Hook up the view with the manager and the adapter listView = view.findViewById(recyclerViewId).apply { setHasFixedSize(true) layoutManager = viewManager adapter = viewAdapter } + + // Configure whether to show the folder header + viewAdapter.folderHeaderEnabled = showFolderHeader() } @Override diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericRowAdapter.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericRowAdapter.kt index 32714999..414c76d0 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericRowAdapter.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericRowAdapter.kt @@ -19,6 +19,7 @@ import android.widget.TextView import androidx.recyclerview.widget.RecyclerView import org.moire.ultrasonic.R import org.moire.ultrasonic.data.ActiveServerProvider +import org.moire.ultrasonic.domain.MusicFolder import org.moire.ultrasonic.util.ImageLoader import org.moire.ultrasonic.view.SelectMusicFolderView @@ -26,16 +27,20 @@ import org.moire.ultrasonic.view.SelectMusicFolderView * An abstract Adapter, which can be extended to display a List of in a RecyclerView */ abstract class GenericRowAdapter( - private var selectFolderHeader: SelectMusicFolderView?, val onItemClick: (T) -> Unit, val onContextMenuClick: (MenuItem, T) -> Boolean, - private val imageLoader: ImageLoader + private val imageLoader: ImageLoader, + private val onMusicFolderUpdate: (String?) -> Unit ) : RecyclerView.Adapter() { - open var itemList: List = listOf() protected abstract val layout: Int protected abstract val contextMenuLayout: Int + var folderHeaderEnabled: Boolean = true + var selectFolderHeader: SelectMusicFolderView? = null + var musicFolders: List = listOf() + var selectedFolder: String? = null + /** * Sets the data to be displayed in the RecyclerView */ @@ -44,6 +49,25 @@ abstract class GenericRowAdapter( notifyDataSetChanged() } + /** + * Sets the content and state of the music folder selector row + */ + fun setFolderList(changedFolders: List, selectedId: String?) { + musicFolders = changedFolders + selectedFolder = selectedId + + selectFolderHeader?.setData( + selectedFolder, + musicFolders + ) + + notifyDataSetChanged() + } + + open fun newViewHolder(view: View): RecyclerView.ViewHolder { + return ViewHolder(view) + } + override fun onCreateViewHolder( parent: ViewGroup, viewType: Int @@ -51,13 +75,27 @@ abstract class GenericRowAdapter( if (viewType == TYPE_ITEM) { val row = LayoutInflater.from(parent.context) .inflate(layout, parent, false) - return ItemViewHolder(row) + return newViewHolder(row) + } else { + val row = LayoutInflater.from(parent.context) + .inflate( + R.layout.select_folder_header, parent, false + ) + selectFolderHeader = SelectMusicFolderView(parent.context, row, onMusicFolderUpdate) + + if (musicFolders.isNotEmpty()) { + selectFolderHeader?.setData( + selectedFolder, + musicFolders + ) + } + + return selectFolderHeader!! } - return selectFolderHeader!! } override fun onViewRecycled(holder: RecyclerView.ViewHolder) { - if ((holder is ItemViewHolder) && (holder.coverArtId != null)) { + if ((holder is ViewHolder) && (holder.coverArtId != null)) { imageLoader.cancel(holder.coverArtId) } super.onViewRecycled(holder) @@ -73,7 +111,7 @@ abstract class GenericRowAdapter( } override fun getItemViewType(position: Int): Int { - return if (position == 0 && selectFolderHeader != null) TYPE_HEADER else TYPE_ITEM + return if (position == 0 && folderHeaderEnabled) TYPE_HEADER else TYPE_ITEM } internal fun createPopupMenu(view: View, position: Int): Boolean { @@ -94,7 +132,7 @@ abstract class GenericRowAdapter( /** * Holds the view properties of an Item row */ - class ItemViewHolder( + class ViewHolder( itemView: View ) : RecyclerView.ViewHolder(itemView) { var section: TextView = itemView.findViewById(R.id.row_section) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt index 8eeaf9c5..b5ecc21f 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt @@ -34,13 +34,10 @@ import java.util.Random import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.launch import org.koin.android.ext.android.inject -import org.koin.android.viewmodel.ext.android.viewModel import org.koin.core.component.KoinApiExtension import org.moire.ultrasonic.R -import org.moire.ultrasonic.data.ActiveServerProvider import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline import org.moire.ultrasonic.domain.MusicDirectory -import org.moire.ultrasonic.domain.MusicFolder import org.moire.ultrasonic.fragment.FragmentTitle.Companion.getTitle import org.moire.ultrasonic.fragment.FragmentTitle.Companion.setTitle import org.moire.ultrasonic.service.CommunicationErrorHandler @@ -57,7 +54,6 @@ import org.moire.ultrasonic.util.EntryByDiscAndTrackComparator import org.moire.ultrasonic.util.Util import org.moire.ultrasonic.view.AlbumView import org.moire.ultrasonic.view.EntryAdapter -import org.moire.ultrasonic.view.SelectMusicFolderView import org.moire.ultrasonic.view.SongView import timber.log.Timber @@ -71,7 +67,6 @@ class TrackCollectionFragment : Fragment() { private var refreshAlbumListView: SwipeRefreshLayout? = null private var albumListView: ListView? = null private var header: View? = null - private var selectFolderHeader: SelectMusicFolderView? = null private var albumButtons: View? = null private var emptyView: TextView? = null private var selectButton: ImageView? = null @@ -95,7 +90,6 @@ class TrackCollectionFragment : Fragment() { private val imageLoaderProvider: ImageLoaderProvider by inject() private val shareHandler: ShareHandler by inject() private var cancellationToken: CancellationToken? = null - private val activeServerProvider: ActiveServerProvider by inject() private val model: TrackCollectionModel by viewModels() private val random: Random = SecureRandom() @@ -131,19 +125,6 @@ class TrackCollectionFragment : Fragment() { false ) - selectFolderHeader = SelectMusicFolderView( - requireContext(), view as ViewGroup - ) { selectedFolderId -> - if (!isOffline()) { - val serverSettingsModel: ServerSettingsModel by viewModel() - val currentSetting = activeServerProvider.getActiveServer() - currentSetting.musicFolderId = selectedFolderId - serverSettingsModel.updateItem(currentSetting) - } - this.updateDisplay(true) - } - - model.musicFolders.observe(viewLifecycleOwner, musicFolderObserver) model.currentDirectory.observe(viewLifecycleOwner, defaultObserver) model.songsForGenre.observe(viewLifecycleOwner, songsForGenreObserver) @@ -622,15 +603,6 @@ class TrackCollectionFragment : Fragment() { mediaPlayerController.unpin(songs) } - private val musicFolderObserver = Observer> { changedFolders -> - if (changedFolders != null) { - selectFolderHeader!!.setData( - activeServerProvider.getActiveServer().musicFolderId, - changedFolders - ) - } - } - private val songsForGenreObserver = Observer { musicDirectory -> // Hide more button when results are less than album list size @@ -726,12 +698,9 @@ class TrackCollectionFragment : Fragment() { } } } else { - if (model.showSelectFolderHeader(arguments)) { - if (albumListView!!.headerViewsCount == 0) { - albumListView!!.addHeaderView(selectFolderHeader!!.itemView, null, false) - } - } + // TODO: This code path can be removed when getArtist has been moved to + // AlbumListFragment (getArtist returns the albums of an artist) pinButton!!.visibility = View.GONE unpinButton!!.visibility = View.GONE downloadButton!!.visibility = View.GONE diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/view/SelectMusicFolderView.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/view/SelectMusicFolderView.kt index 28d34b2d..3dcec9a4 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/view/SelectMusicFolderView.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/view/SelectMusicFolderView.kt @@ -1,89 +1,87 @@ -package org.moire.ultrasonic.view - -import android.content.Context -import android.view.LayoutInflater -import android.view.MenuItem -import android.view.ViewGroup -import android.widget.LinearLayout -import android.widget.PopupMenu -import android.widget.TextView -import androidx.recyclerview.widget.RecyclerView -import org.moire.ultrasonic.R -import org.moire.ultrasonic.domain.MusicFolder - -/** - * This little view shows the currently selected Folder (or catalog) on the music server. - * When clicked it will drop down a list of all available Folders and allow you to - * select one. The intended usage is to supply a filter to lists of artists, albums, etc - */ -class SelectMusicFolderView( - private val context: Context, - root: ViewGroup, - private val onUpdate: (String?) -> Unit -) : RecyclerView.ViewHolder( - LayoutInflater.from(context).inflate( - R.layout.select_folder_header, root, false - ) -) { - private var musicFolders: List = mutableListOf() - private var selectedFolderId: String? = null - private val folderName: TextView = itemView.findViewById(R.id.select_folder_name) - private val layout: LinearLayout = itemView.findViewById(R.id.select_folder_header) - private val MENU_GROUP_MUSIC_FOLDER = 10 - - init { - folderName.text = context.getString(R.string.select_artist_all_folders) - layout.setOnClickListener { onFolderClick() } - } - - fun setData(selectedId: String?, folders: List) { - selectedFolderId = selectedId - musicFolders = folders - if (selectedFolderId != null) { - for ((id, name) in musicFolders) { - if (id == selectedFolderId) { - folderName.text = name - break - } - } - } else { - folderName.text = context.getString(R.string.select_artist_all_folders) - } - } - - private fun onFolderClick() { - val popup = PopupMenu(context, layout) - - var menuItem = popup.menu.add( - MENU_GROUP_MUSIC_FOLDER, -1, 0, R.string.select_artist_all_folders - ) - if (selectedFolderId == null || selectedFolderId!!.isEmpty()) { - menuItem.isChecked = true - } - musicFolders.forEachIndexed { i, musicFolder -> - val (id, name) = musicFolder - menuItem = popup.menu.add(MENU_GROUP_MUSIC_FOLDER, i, i + 1, name) - if (id == selectedFolderId) { - menuItem.isChecked = true - } - } - - popup.menu.setGroupCheckable(MENU_GROUP_MUSIC_FOLDER, true, true) - - popup.setOnMenuItemClickListener { item -> onFolderMenuItemSelected(item) } - popup.show() - } - - private fun onFolderMenuItemSelected(menuItem: MenuItem): Boolean { - val selectedFolder = if (menuItem.itemId == -1) null else musicFolders[menuItem.itemId] - val musicFolderName = selectedFolder?.name - ?: context.getString(R.string.select_artist_all_folders) - selectedFolderId = selectedFolder?.id - - menuItem.isChecked = true - folderName.text = musicFolderName - onUpdate(selectedFolderId) - - return true - } -} +package org.moire.ultrasonic.view + +import android.content.Context +import android.view.MenuItem +import android.view.View +import android.widget.LinearLayout +import android.widget.PopupMenu +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import org.moire.ultrasonic.R +import org.moire.ultrasonic.domain.MusicFolder + +/** + * This little view shows the currently selected Folder (or catalog) on the music server. + * When clicked it will drop down a list of all available Folders and allow you to + * select one. The intended usage is to supply a filter to lists of artists, albums, etc + */ +class SelectMusicFolderView( + private val context: Context, + view: View, + private val onUpdate: (String?) -> Unit +) : RecyclerView.ViewHolder(view) { + private var musicFolders: List = mutableListOf() + private var selectedFolderId: String? = null + private val folderName: TextView = itemView.findViewById(R.id.select_folder_name) + private val layout: LinearLayout = itemView.findViewById(R.id.select_folder_header) + + init { + folderName.text = context.getString(R.string.select_artist_all_folders) + layout.setOnClickListener { onFolderClick() } + } + + fun setData(selectedId: String?, folders: List) { + selectedFolderId = selectedId + musicFolders = folders + if (selectedFolderId != null) { + for ((id, name) in musicFolders) { + if (id == selectedFolderId) { + folderName.text = name + break + } + } + } else { + folderName.text = context.getString(R.string.select_artist_all_folders) + } + } + + private fun onFolderClick() { + val popup = PopupMenu(context, layout) + + var menuItem = popup.menu.add( + MENU_GROUP_MUSIC_FOLDER, -1, 0, R.string.select_artist_all_folders + ) + if (selectedFolderId == null || selectedFolderId!!.isEmpty()) { + menuItem.isChecked = true + } + musicFolders.forEachIndexed { i, musicFolder -> + val (id, name) = musicFolder + menuItem = popup.menu.add(MENU_GROUP_MUSIC_FOLDER, i, i + 1, name) + if (id == selectedFolderId) { + menuItem.isChecked = true + } + } + + popup.menu.setGroupCheckable(MENU_GROUP_MUSIC_FOLDER, true, true) + + popup.setOnMenuItemClickListener { item -> onFolderMenuItemSelected(item) } + popup.show() + } + + private fun onFolderMenuItemSelected(menuItem: MenuItem): Boolean { + val selectedFolder = if (menuItem.itemId == -1) null else musicFolders[menuItem.itemId] + val musicFolderName = selectedFolder?.name + ?: context.getString(R.string.select_artist_all_folders) + selectedFolderId = selectedFolder?.id + + menuItem.isChecked = true + folderName.text = musicFolderName + onUpdate(selectedFolderId) + + return true + } + + companion object { + const val MENU_GROUP_MUSIC_FOLDER = 10 + } +} diff --git a/ultrasonic/src/main/res/drawable-hdpi/unknown_album.png b/ultrasonic/src/main/res/drawable-hdpi/unknown_album.png deleted file mode 100644 index e59b78683dde3f2977e0304bb76ece7a3aeff72b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41767 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 f1OkCT*vtO|4AwJ=9N - - + android:width="200dp" + android:height="200dp" + android:viewportWidth="100" + android:viewportHeight="100"> + +