2021-02-04 20:15:58 +01:00
|
|
|
package org.moire.ultrasonic.fragment
|
2020-11-16 19:14:44 +01:00
|
|
|
|
|
|
|
import android.os.Bundle
|
2021-02-04 20:15:58 +01:00
|
|
|
import android.view.LayoutInflater
|
2020-11-16 19:14:44 +01:00
|
|
|
import android.view.MenuItem
|
|
|
|
import android.view.View
|
2021-02-04 20:15:58 +01:00
|
|
|
import android.view.ViewGroup
|
|
|
|
import androidx.fragment.app.Fragment
|
2020-11-16 19:14:44 +01:00
|
|
|
import androidx.lifecycle.Observer
|
2021-02-04 20:15:58 +01:00
|
|
|
import androidx.navigation.fragment.findNavController
|
2020-11-16 19:14:44 +01:00
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager
|
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
|
|
|
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
|
|
|
|
import org.koin.android.ext.android.inject
|
|
|
|
import org.koin.android.viewmodel.ext.android.viewModel
|
|
|
|
import org.moire.ultrasonic.R
|
|
|
|
import org.moire.ultrasonic.data.ActiveServerProvider
|
|
|
|
import org.moire.ultrasonic.domain.Artist
|
2021-02-04 20:15:58 +01:00
|
|
|
import org.moire.ultrasonic.fragment.FragmentTitle.Companion.setTitle
|
|
|
|
import org.moire.ultrasonic.subsonic.DownloadHandler
|
|
|
|
import org.moire.ultrasonic.subsonic.ImageLoaderProvider
|
2020-11-16 19:14:44 +01:00
|
|
|
import org.moire.ultrasonic.util.Constants
|
|
|
|
import org.moire.ultrasonic.util.Util
|
2021-04-02 05:00:01 +02:00
|
|
|
import org.moire.ultrasonic.view.SelectMusicFolderView
|
2020-11-16 19:14:44 +01:00
|
|
|
|
2021-03-01 17:24:25 +01:00
|
|
|
/**
|
|
|
|
* Displays the list of Artists from the media library
|
|
|
|
*/
|
2021-02-04 20:15:58 +01:00
|
|
|
class SelectArtistFragment : Fragment() {
|
2020-11-16 19:14:44 +01:00
|
|
|
private val activeServerProvider: ActiveServerProvider by inject()
|
|
|
|
private val serverSettingsModel: ServerSettingsModel by viewModel()
|
|
|
|
private val artistListModel: ArtistListModel by viewModel()
|
2021-02-04 20:15:58 +01:00
|
|
|
private val imageLoaderProvider: ImageLoaderProvider by inject()
|
|
|
|
private val downloadHandler: DownloadHandler by inject()
|
2020-11-16 19:14:44 +01:00
|
|
|
|
|
|
|
private var refreshArtistListView: SwipeRefreshLayout? = null
|
|
|
|
private var artistListView: RecyclerView? = null
|
|
|
|
private lateinit var viewManager: RecyclerView.LayoutManager
|
|
|
|
private lateinit var viewAdapter: ArtistRowAdapter
|
2021-04-02 05:00:01 +02:00
|
|
|
private var selectFolderHeader: SelectMusicFolderView? = null
|
2020-11-16 19:14:44 +01:00
|
|
|
|
2021-02-04 20:15:58 +01:00
|
|
|
@Override
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
|
|
Util.applyTheme(this.context)
|
2020-11-16 19:14:44 +01:00
|
|
|
super.onCreate(savedInstanceState)
|
2021-02-04 20:15:58 +01:00
|
|
|
}
|
|
|
|
|
2021-02-14 15:55:16 +01:00
|
|
|
override fun onCreateView(
|
|
|
|
inflater: LayoutInflater,
|
|
|
|
container: ViewGroup?,
|
|
|
|
savedInstanceState: Bundle?
|
|
|
|
): View? {
|
2021-02-04 20:15:58 +01:00
|
|
|
return inflater.inflate(R.layout.select_artist, container, false)
|
|
|
|
}
|
2020-11-16 19:14:44 +01:00
|
|
|
|
2021-02-04 20:15:58 +01:00
|
|
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
|
|
|
refreshArtistListView = view.findViewById(R.id.select_artist_refresh)
|
2020-11-16 19:14:44 +01:00
|
|
|
refreshArtistListView!!.setOnRefreshListener {
|
|
|
|
artistListModel.refresh(refreshArtistListView!!)
|
|
|
|
}
|
|
|
|
|
2021-05-09 10:25:04 +02:00
|
|
|
if (!ActiveServerProvider.isOffline() &&
|
2021-05-09 08:35:15 +02:00
|
|
|
!Util.getShouldUseId3Tags()
|
2021-04-02 05:00:01 +02:00
|
|
|
) {
|
|
|
|
selectFolderHeader = SelectMusicFolderView(
|
|
|
|
requireContext(), view as ViewGroup,
|
2021-04-10 04:41:38 +02:00
|
|
|
{ selectedFolderId ->
|
2021-05-09 10:25:04 +02:00
|
|
|
if (!ActiveServerProvider.isOffline()) {
|
2021-04-02 05:00:01 +02:00
|
|
|
val currentSetting = activeServerProvider.getActiveServer()
|
|
|
|
currentSetting.musicFolderId = selectedFolderId
|
|
|
|
serverSettingsModel.updateItem(currentSetting)
|
|
|
|
}
|
2021-04-10 04:41:38 +02:00
|
|
|
viewAdapter.notifyDataSetChanged()
|
2021-04-02 05:00:01 +02:00
|
|
|
artistListModel.refresh(refreshArtistListView!!)
|
|
|
|
}
|
2021-02-14 15:55:16 +01:00
|
|
|
)
|
2021-04-02 05:00:01 +02:00
|
|
|
}
|
2021-02-04 20:15:58 +01:00
|
|
|
|
|
|
|
val title = arguments?.getString(Constants.INTENT_EXTRA_NAME_ALBUM_LIST_TITLE)
|
2020-11-16 19:14:44 +01:00
|
|
|
|
|
|
|
if (title == null) {
|
2021-02-04 20:15:58 +01:00
|
|
|
setTitle(
|
|
|
|
this,
|
2021-05-09 10:25:04 +02:00
|
|
|
if (ActiveServerProvider.isOffline())
|
2021-02-14 15:55:16 +01:00
|
|
|
R.string.music_library_label_offline
|
2020-11-16 19:14:44 +01:00
|
|
|
else R.string.music_library_label
|
|
|
|
)
|
|
|
|
} else {
|
2021-02-04 20:15:58 +01:00
|
|
|
setTitle(this, title)
|
2020-11-16 19:14:44 +01:00
|
|
|
}
|
2021-02-04 20:15:58 +01:00
|
|
|
|
|
|
|
val refresh = arguments?.getBoolean(Constants.INTENT_EXTRA_NAME_REFRESH) ?: false
|
2020-11-16 19:14:44 +01:00
|
|
|
|
2020-11-18 21:46:46 +01:00
|
|
|
artistListModel.getMusicFolders()
|
2020-11-16 19:14:44 +01:00
|
|
|
.observe(
|
2021-02-04 20:15:58 +01:00
|
|
|
viewLifecycleOwner,
|
2020-11-16 19:14:44 +01:00
|
|
|
Observer { changedFolders ->
|
|
|
|
if (changedFolders != null) {
|
2021-04-10 04:41:38 +02:00
|
|
|
viewAdapter.notifyDataSetChanged()
|
|
|
|
selectFolderHeader!!.setData(
|
|
|
|
activeServerProvider.getActiveServer().musicFolderId,
|
|
|
|
changedFolders
|
|
|
|
)
|
2020-11-16 19:14:44 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
val artists = artistListModel.getArtists(refresh, refreshArtistListView!!)
|
|
|
|
artists.observe(
|
2021-02-04 20:15:58 +01:00
|
|
|
viewLifecycleOwner, Observer { changedArtists -> viewAdapter.setData(changedArtists) }
|
2020-11-16 19:14:44 +01:00
|
|
|
)
|
|
|
|
|
2021-02-04 20:15:58 +01:00
|
|
|
viewManager = LinearLayoutManager(this.context)
|
2020-11-16 19:14:44 +01:00
|
|
|
viewAdapter = ArtistRowAdapter(
|
|
|
|
artists.value ?: listOf(),
|
2021-04-02 05:00:01 +02:00
|
|
|
selectFolderHeader,
|
2020-11-16 19:14:44 +01:00
|
|
|
{ artist -> onItemClick(artist) },
|
|
|
|
{ menuItem, artist -> onArtistMenuItemSelected(menuItem, artist) },
|
2021-02-04 20:15:58 +01:00
|
|
|
imageLoaderProvider.getImageLoader()
|
2020-11-16 19:14:44 +01:00
|
|
|
)
|
|
|
|
|
2021-02-04 20:15:58 +01:00
|
|
|
artistListView = view.findViewById<RecyclerView>(R.id.select_artist_list).apply {
|
2020-11-16 19:14:44 +01:00
|
|
|
setHasFixedSize(true)
|
|
|
|
layoutManager = viewManager
|
|
|
|
adapter = viewAdapter
|
|
|
|
}
|
2021-02-04 20:15:58 +01:00
|
|
|
super.onViewCreated(view, savedInstanceState)
|
2020-11-16 19:14:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private fun onItemClick(artist: Artist) {
|
2021-02-04 20:15:58 +01:00
|
|
|
val bundle = Bundle()
|
|
|
|
bundle.putString(Constants.INTENT_EXTRA_NAME_ID, artist.id)
|
|
|
|
bundle.putString(Constants.INTENT_EXTRA_NAME_NAME, artist.name)
|
|
|
|
bundle.putString(Constants.INTENT_EXTRA_NAME_PARENT_ID, artist.id)
|
|
|
|
bundle.putBoolean(Constants.INTENT_EXTRA_NAME_ARTIST, true)
|
|
|
|
findNavController().navigate(R.id.selectArtistToSelectAlbum, bundle)
|
2020-11-16 19:14:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private fun onArtistMenuItemSelected(menuItem: MenuItem, artist: Artist): Boolean {
|
|
|
|
when (menuItem.itemId) {
|
|
|
|
R.id.artist_menu_play_now ->
|
2021-02-14 15:55:16 +01:00
|
|
|
downloadHandler.downloadRecursively(
|
|
|
|
this,
|
|
|
|
artist.id,
|
2021-03-01 17:24:25 +01:00
|
|
|
save = false,
|
|
|
|
append = false,
|
|
|
|
autoPlay = true,
|
|
|
|
shuffle = false,
|
|
|
|
background = false,
|
|
|
|
playNext = false,
|
|
|
|
unpin = false,
|
|
|
|
isArtist = true
|
2021-02-14 15:55:16 +01:00
|
|
|
)
|
2020-11-16 19:14:44 +01:00
|
|
|
R.id.artist_menu_play_next ->
|
2021-02-14 15:55:16 +01:00
|
|
|
downloadHandler.downloadRecursively(
|
|
|
|
this,
|
|
|
|
artist.id,
|
2021-03-01 17:24:25 +01:00
|
|
|
save = false,
|
|
|
|
append = false,
|
|
|
|
autoPlay = true,
|
|
|
|
shuffle = true,
|
|
|
|
background = false,
|
|
|
|
playNext = true,
|
|
|
|
unpin = false,
|
|
|
|
isArtist = true
|
2021-02-14 15:55:16 +01:00
|
|
|
)
|
2020-11-16 19:14:44 +01:00
|
|
|
R.id.artist_menu_play_last ->
|
2021-02-14 15:55:16 +01:00
|
|
|
downloadHandler.downloadRecursively(
|
|
|
|
this,
|
|
|
|
artist.id,
|
2021-03-01 17:24:25 +01:00
|
|
|
save = false,
|
|
|
|
append = true,
|
|
|
|
autoPlay = false,
|
|
|
|
shuffle = false,
|
|
|
|
background = false,
|
|
|
|
playNext = false,
|
|
|
|
unpin = false,
|
|
|
|
isArtist = true
|
2021-02-14 15:55:16 +01:00
|
|
|
)
|
2020-11-16 19:14:44 +01:00
|
|
|
R.id.artist_menu_pin ->
|
2021-02-14 15:55:16 +01:00
|
|
|
downloadHandler.downloadRecursively(
|
|
|
|
this,
|
|
|
|
artist.id,
|
2021-03-01 17:24:25 +01:00
|
|
|
save = true,
|
|
|
|
append = true,
|
|
|
|
autoPlay = false,
|
|
|
|
shuffle = false,
|
|
|
|
background = false,
|
|
|
|
playNext = false,
|
|
|
|
unpin = false,
|
|
|
|
isArtist = true
|
2021-02-14 15:55:16 +01:00
|
|
|
)
|
2020-11-16 19:14:44 +01:00
|
|
|
R.id.artist_menu_unpin ->
|
2021-02-14 15:55:16 +01:00
|
|
|
downloadHandler.downloadRecursively(
|
|
|
|
this,
|
|
|
|
artist.id,
|
2021-03-01 17:24:25 +01:00
|
|
|
save = false,
|
|
|
|
append = false,
|
|
|
|
autoPlay = false,
|
|
|
|
shuffle = false,
|
|
|
|
background = false,
|
|
|
|
playNext = false,
|
|
|
|
unpin = true,
|
|
|
|
isArtist = true
|
2021-02-14 15:55:16 +01:00
|
|
|
)
|
2020-11-16 19:14:44 +01:00
|
|
|
R.id.artist_menu_download ->
|
2021-02-14 15:55:16 +01:00
|
|
|
downloadHandler.downloadRecursively(
|
|
|
|
this,
|
|
|
|
artist.id,
|
2021-03-01 17:24:25 +01:00
|
|
|
save = false,
|
|
|
|
append = false,
|
|
|
|
autoPlay = false,
|
|
|
|
shuffle = false,
|
|
|
|
background = true,
|
|
|
|
playNext = false,
|
|
|
|
unpin = false,
|
|
|
|
isArtist = true
|
2021-02-14 15:55:16 +01:00
|
|
|
)
|
2020-11-16 19:14:44 +01:00
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
2021-02-14 15:55:16 +01:00
|
|
|
}
|