@@ -26,8 +26,8 @@ import com.dinaraparanid.prima.utils.decorations.VerticalSpaceItemDecoration
2626import com.dinaraparanid.prima.utils.extensions.toBitmap
2727import com.dinaraparanid.prima.utils.polymorphism.*
2828import com.dinaraparanid.prima.utils.polymorphism.runOnIOThread
29- import com.dinaraparanid.prima.viewmodels.androidx.PlaylistSelectedViewModel
30- import com.dinaraparanid.prima.viewmodels.mvvm.PlaylistSelectViewModel
29+ import com.dinaraparanid.prima.viewmodels.androidx.PlaylistSelectViewModel as AndroidXPlaylistSelectViewModel
30+ import com.dinaraparanid.prima.viewmodels.mvvm.PlaylistSelectViewModel as MVVMPlaylistSelectViewModel
3131import com.dinaraparanid.prima.viewmodels.mvvm.ViewModel
3232import kotlinx.coroutines.*
3333
@@ -51,15 +51,13 @@ class PlaylistSelectFragment : MainActivityUpdatingListFragment<
5151 override var _adapter : PlaylistAdapter ? = null
5252
5353 override val viewModel by lazy {
54- ViewModelProvider (this )[PlaylistSelectedViewModel ::class .java]
54+ ViewModelProvider (this )[AndroidXPlaylistSelectViewModel ::class .java]
5555 }
5656
5757 internal companion object {
5858 private const val TRACK_KEY = " track"
5959 private const val PLAYLISTS_KEY = " playlists"
60- private const val SELECT_ALL_KEY = " select_all"
61- private const val ADD_SET_KEY = " add_set"
62- private const val REMOVE_SET_KEY = " remove_set"
60+ private const val NEW_SET_KEY = " new_set"
6361
6462 /* *
6563 * Creates new instance of fragment with params
@@ -71,7 +69,7 @@ class PlaylistSelectFragment : MainActivityUpdatingListFragment<
7169 @JvmStatic
7270 internal fun newInstance (
7371 track : AbstractTrack ,
74- playlists : CustomPlaylist .Entity . EntityList
72+ playlists : Array < CustomPlaylist .Entity >
7573 ) = PlaylistSelectFragment ().apply {
7674 arguments = Bundle ().apply {
7775 putSerializable(TRACK_KEY , track)
@@ -102,16 +100,13 @@ class PlaylistSelectFragment : MainActivityUpdatingListFragment<
102100 adapter.setCurrentList(itemList)
103101 }
104102
105- playlistList.addAll(
106- (requireArguments().getSerializable(PLAYLISTS_KEY ) as CustomPlaylist .Entity .EntityList )
107- )
108-
103+ playlistList.addAll(requireArguments().getSerializable(PLAYLISTS_KEY ) as Array <out CustomPlaylist .Entity >)
109104 track = requireArguments().getSerializable(TRACK_KEY ) as AbstractTrack
110105
111106 viewModel.load(
112- savedInstanceState?.getBoolean( SELECT_ALL_KEY ),
113- savedInstanceState ?.getSerializable(ADD_SET_KEY ) as CustomPlaylist .Entity . EntityList ? ,
114- savedInstanceState?.getSerializable( REMOVE_SET_KEY ) as CustomPlaylist . Entity . EntityList ?
107+ savedInstanceState
108+ ?.getSerializable(NEW_SET_KEY ) as Array < CustomPlaylist .Entity > ?
109+ ? : playlistList.toTypedArray()
115110 )
116111 }
117112
@@ -163,19 +158,9 @@ class PlaylistSelectFragment : MainActivityUpdatingListFragment<
163158 }
164159
165160 override fun onSaveInstanceState (outState : Bundle ) {
166- outState.putBoolean(
167- SELECT_ALL_KEY ,
168- viewModel.isAllSelectedFlow.value
169- )
170-
171- outState.putSerializable(
172- ADD_SET_KEY ,
173- viewModel.addSetFlow.value.toTypedArray()
174- )
175-
176161 outState.putSerializable(
177- REMOVE_SET_KEY ,
178- viewModel.removeSetFlow .value.toTypedArray()
162+ NEW_SET_KEY ,
163+ viewModel.newSetFlow .value.toTypedArray()
179164 )
180165
181166 super .onSaveInstanceState(outState)
@@ -191,43 +176,49 @@ class PlaylistSelectFragment : MainActivityUpdatingListFragment<
191176 when (item.itemId) {
192177 R .id.accept_selected_items -> {
193178 runOnIOThread {
194- val removes = async(Dispatchers .IO ) {
195- viewModel.removeSetFlow.value.map {
196- val task = CustomPlaylistsRepository
197- .getInstanceSynchronized()
198- .getPlaylistAsync(it.title)
179+ val oldPlaylists = playlistList.toHashSet()
199180
200- CustomPlaylistsRepository
201- .getInstanceSynchronized()
202- .removeTrackAsync(track.path, task.await()!! .id)
203- }
181+ val removes = async(Dispatchers .IO ) {
182+ oldPlaylists
183+ .filter { it !in viewModel.newSetFlow.value }
184+ .map {
185+ val task = CustomPlaylistsRepository
186+ .getInstanceSynchronized()
187+ .getPlaylistAsync(it.title)
188+
189+ CustomPlaylistsRepository
190+ .getInstanceSynchronized()
191+ .removeTrackAsync(track.path, task.await()!! .id)
192+ }
204193 }
205194
206195 val adds = async(Dispatchers .IO ) {
207- viewModel.addSetFlow.value.map {
208- val playlist = CustomPlaylistsRepository
209- .getInstanceSynchronized()
210- .getPlaylistAsync(it.title)
211- .await()!!
212-
213- CustomPlaylistsRepository .getInstanceSynchronized().addTrackAsync(
214- CustomPlaylistTrack (
215- track.androidId,
216- 0 ,
217- track.title,
218- track.artist,
219- track.album,
220- playlist.id,
221- playlist.title,
222- track.path,
223- track.duration,
224- track.relativePath,
225- track.displayName,
226- track.addDate,
227- track.trackNumberInAlbum
196+ viewModel.newSetFlow.value
197+ .filter { it !in oldPlaylists }
198+ .map {
199+ val playlist = CustomPlaylistsRepository
200+ .getInstanceSynchronized()
201+ .getPlaylistAsync(it.title)
202+ .await()!!
203+
204+ CustomPlaylistsRepository .getInstanceSynchronized().addTrackAsync(
205+ CustomPlaylistTrack (
206+ track.androidId,
207+ 0 ,
208+ track.title,
209+ track.artist,
210+ track.album,
211+ playlist.id,
212+ playlist.title,
213+ track.path,
214+ track.duration,
215+ track.relativePath,
216+ track.displayName,
217+ track.addDate,
218+ track.trackNumberInAlbum
219+ )
228220 )
229- )
230- }
221+ }
231222 }
232223
233224 launch(Dispatchers .IO ) {
@@ -248,23 +239,7 @@ class PlaylistSelectFragment : MainActivityUpdatingListFragment<
248239 }
249240
250241 R .id.select_all -> {
251- when {
252- viewModel.isAllSelectedFlow.value -> {
253- viewModel.removeSetFlow.value.apply {
254- addAll(viewModel.addSetFlow.value)
255- addAll(playlistList)
256- }
257-
258- viewModel.addSetFlow.value.clear()
259- }
260-
261- else -> {
262- viewModel.removeSetFlow.value.clear()
263- viewModel.addSetFlow.value.addAll(itemList)
264- }
265- }
266-
267- viewModel.isAllSelectedFlow.value = ! viewModel.isAllSelectedFlow.value
242+ viewModel.newSetFlow.value.addAll(itemListSearch)
268243 runOnUIThread { updateUIAsync(isLocking = true ) }
269244 }
270245 }
@@ -291,22 +266,19 @@ class PlaylistSelectFragment : MainActivityUpdatingListFragment<
291266 setEmptyTextViewVisibility(src)
292267 }
293268
294- override fun filter (models : Collection <CustomPlaylist .Entity >? , query : String ): List < CustomPlaylist . Entity > =
269+ override fun filter (models : Collection <CustomPlaylist .Entity >? , query : String ) =
295270 query.lowercase().let { lowerCase ->
296271 models?.filter { lowerCase in it.title.lowercase() } ? : listOf ()
297272 }
298273
299274 override suspend fun loadAsync () = coroutineScope {
300275 launch(Dispatchers .IO ) {
301- if (application.checkAndRequestPermissions()) {
302- val task = CustomPlaylistsRepository
303- .getInstanceSynchronized()
304- .getPlaylistsAsync()
305-
306- itemList.clear()
307- itemList.addAll(task.await())
308- Unit
309- }
276+ val task = CustomPlaylistsRepository
277+ .getInstanceSynchronized()
278+ .getPlaylistsAsync()
279+
280+ itemList.clear()
281+ itemList.addAll(task.await())
310282 }
311283 }
312284
@@ -327,13 +299,10 @@ class PlaylistSelectFragment : MainActivityUpdatingListFragment<
327299 second : CustomPlaylist .Entity
328300 ) = first.id == second.id
329301
330- /* * Set of playlists titles Optimizes search */
302+ /* * Set of playlists titles optimizes search */
303+ internal val playlistSet by lazy { playlistList.toHashSet() }
331304
332- internal val playlistSet by lazy { playlistList.toSet() }
333-
334- /* *
335- * [RecyclerView.ViewHolder] for playlists of [PlaylistAdapter]
336- */
305+ /* * [RecyclerView.ViewHolder] for playlists of [PlaylistAdapter] */
337306
338307 inner class PlaylistHolder (private val playlistBinding : ListItemSelectPlaylistBinding ) :
339308 RecyclerView .ViewHolder (playlistBinding.root),
@@ -350,11 +319,9 @@ class PlaylistSelectFragment : MainActivityUpdatingListFragment<
350319 */
351320
352321 internal fun bind (playlist : CustomPlaylist .Entity ) = playlistBinding.run {
353- viewModel = PlaylistSelectViewModel (
322+ viewModel = MVVMPlaylistSelectViewModel (
354323 playlist,
355- this @PlaylistSelectFragment.viewModel,
356- playlistSet,
357- playlistBinding.playlistSelectorButton
324+ this @PlaylistSelectFragment.viewModel
358325 )
359326
360327 if (Params .instance.areCoversDisplayed)
0 commit comments