Skip to content

Commit c976a36

Browse files
committed
v 1.0.0.1
1 parent 6132648 commit c976a36

30 files changed

Lines changed: 353 additions & 432 deletions

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
**Current status**
1010
------------------------
11-
**V 1.0.0.0**
11+
**V 1.0.0.1**
1212

1313
**Install**
1414
-----------------------

app/src/main/java/com/dinaraparanid/prima/MainActivity.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ import com.bumptech.glide.request.target.CustomViewTarget
4545
import com.bumptech.glide.request.transition.Transition
4646
import com.dinaraparanid.prima.core.Artist
4747
import com.dinaraparanid.prima.core.Contact
48-
import com.dinaraparanid.prima.databases.entities.custom.CustomPlaylist
4948
import com.dinaraparanid.prima.databases.repositories.CustomPlaylistsRepository
5049
import com.dinaraparanid.prima.databases.repositories.FavouriteRepository
5150
import com.dinaraparanid.prima.databases.repositories.StatisticsRepository
@@ -1785,7 +1784,7 @@ class MainActivity :
17851784
else -> resumePlayingNoLock(resumePos)
17861785
}
17871786

1788-
private suspend fun pausePlayingNoLock() {
1787+
private fun pausePlayingNoLock() {
17891788
when {
17901789
(application as MainApplication).isAudioServiceBounded ->
17911790
sendBroadcast(Intent(Broadcast_PAUSE))
@@ -2079,7 +2078,7 @@ class MainActivity :
20792078
R.id.fragment_container,
20802079
PlaylistSelectFragment.newInstance(
20812080
track,
2082-
CustomPlaylist.Entity.EntityList(task.await())
2081+
task.await().toTypedArray()
20832082
)
20842083
)
20852084
.addToBackStack(null)

app/src/main/java/com/dinaraparanid/prima/core/DefaultTrack.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,7 @@ data class DefaultTrack(
2626
displayName,
2727
addDate,
2828
trackNumberInAlbum
29-
)
29+
) {
30+
override fun equals(other: Any?) = super.equals(other)
31+
override fun hashCode() = path.hashCode()
32+
}

app/src/main/java/com/dinaraparanid/prima/databases/entities/custom/CustomPlaylist.kt

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,7 @@ class CustomPlaylist(
2727
data class Entity(
2828
@PrimaryKey(autoGenerate = true) val id: Long,
2929
val title: String
30-
) : Serializable {
31-
/** Serializable list of [CustomPlaylist]'s Entities */
32-
internal class EntityList(val entities: List<Entity>) : Serializable, Collection<Entity> {
33-
override val size = entities.size
34-
override fun contains(element: Entity) = element in entities
35-
override fun containsAll(elements: Collection<Entity>) = entities.containsAll(elements)
36-
override fun isEmpty() = entities.isEmpty()
37-
override fun iterator() = entities.listIterator()
38-
}
39-
}
30+
) : Serializable
4031

4132
constructor(ent: Entity) : this(ent.title)
4233
}

app/src/main/java/com/dinaraparanid/prima/databases/entities/custom/CustomPlaylistTrack.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,5 @@ data class CustomPlaylistTrack(
5757
return path == other.path
5858
}
5959

60-
override fun hashCode(): Int = super.hashCode()
60+
override fun hashCode() = path.hashCode()
6161
}

app/src/main/java/com/dinaraparanid/prima/fragments/track_collections/PlaylistSelectFragment.kt

Lines changed: 62 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ import com.dinaraparanid.prima.utils.decorations.VerticalSpaceItemDecoration
2626
import com.dinaraparanid.prima.utils.extensions.toBitmap
2727
import com.dinaraparanid.prima.utils.polymorphism.*
2828
import 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
3131
import com.dinaraparanid.prima.viewmodels.mvvm.ViewModel
3232
import 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

Comments
 (0)