Skip to content
Snippets Groups Projects
Commit c8b33f2f authored by Nicolas Pomepuy's avatar Nicolas Pomepuy
Browse files

Improve the add to playlist dialog usability when many playlists exist

Fixes #2009
parent 3bca9a07
No related branches found
No related tags found
1 merge request!973Multiple playlist fixes
......@@ -800,5 +800,6 @@
<string name="pref_resolution_very_low">Very low definition (240p)</string>
<string name="stop_unpaubale">This media cannot be paused. Stop it instead?</string>
<string name="delete_forever">Delete forever</string>
<string name="add_to_existing_playlist">Add to existing playlist</string>
</resources>
......@@ -26,17 +26,62 @@
<TextView
android:id="@+id/textView8"
android:id="@+id/textView9"
style="@style/Theme.VLC.BottomSheetTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:minHeight="0dp"
android:text="@string/add_to_playlist"
android:text="@string/add_to_new_playlist"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/medias2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:fontFamily="sans-serif-light"
android:text="@{filesText}"
android:textSize="12sp"
android:visibility="@{isLoading ? View.GONE : View.VISIBLE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView9"
tools:text="65 medias" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/dialog_playlist_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
app:layout_constraintEnd_toStartOf="@+id/dialog_playlist_save"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/medias2">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:hint="@string/playlist_name_hint"
android:imeOptions="actionSend"
android:inputType="text" />
</com.google.android.material.textfield.TextInputLayout>
<TextView
android:id="@+id/textView8"
style="@style/Theme.VLC.BottomSheetTitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="24dp"
android:minHeight="0dp"
android:text="@string/add_to_existing_playlist"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/dialog_playlist_name" />
<TextView
android:id="@+id/medias"
android:layout_width="wrap_content"
......@@ -66,6 +111,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/medias">
......@@ -82,53 +128,6 @@
android:gravity="center_horizontal"
android:text="@string/noplaylist" />
</FrameLayout>
<!--TODO : textColorHint doesn't work -->
<TextView
android:id="@+id/textView9"
style="@style/Theme.VLC.BottomSheetTitle"
android:layout_width="0dp"
android:minHeight="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="16dp"
android:text="@string/add_to_new_playlist"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/dialog_list_container" />
<TextView
android:id="@+id/medias2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:fontFamily="sans-serif-light"
android:text="@{filesText}"
android:textSize="12sp"
android:visibility="@{isLoading ? View.GONE : View.VISIBLE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView9"
tools:text="65 medias" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/dialog_playlist_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="24dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/dialog_playlist_save"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/medias2">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:hint="@string/playlist_name_hint"
android:imeOptions="actionSend"
android:inputType="text" />
</com.google.android.material.textfield.TextInputLayout>
<Button
android:id="@+id/dialog_playlist_save"
......
......@@ -33,9 +33,7 @@ import android.widget.TextView
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_EXPANDED
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import kotlinx.coroutines.*
import org.videolan.medialibrary.Tools
import org.videolan.medialibrary.interfaces.Medialibrary
import org.videolan.medialibrary.interfaces.media.MediaWrapper
......@@ -51,7 +49,10 @@ import org.videolan.vlc.providers.FileBrowserProvider
import org.videolan.vlc.viewmodels.browser.TYPE_FILE
import org.videolan.vlc.viewmodels.browser.getBrowserModel
import java.util.*
import java.util.concurrent.atomic.AtomicBoolean
@ExperimentalCoroutinesApi
@ObsoleteCoroutinesApi
class SavePlaylistDialog : VLCBottomSheetDialogFragment(), View.OnClickListener,
TextView.OnEditorActionListener, SimpleAdapter.ClickHandler {
override fun getDefaultState(): Int = STATE_EXPANDED
......@@ -74,8 +75,9 @@ class SavePlaylistDialog : VLCBottomSheetDialogFragment(), View.OnClickListener,
private lateinit var medialibrary: Medialibrary
private val coroutineContextProvider: CoroutineContextProvider
private val alreadyAdding = AtomicBoolean(false)
override fun initialFocusedView(): View = binding.list
override fun initialFocusedView(): View = binding.dialogPlaylistName
init {
SavePlaylistDialog.registerCreator { CoroutineContextProvider() }
......@@ -88,16 +90,16 @@ class SavePlaylistDialog : VLCBottomSheetDialogFragment(), View.OnClickListener,
adapter = SimpleAdapter(this)
newTrack = try {
@Suppress("UNCHECKED_CAST")
val tracks = arguments!!.getParcelableArray(KEY_NEW_TRACKS) as Array<MediaWrapper>
val tracks = requireArguments().getParcelableArray(KEY_NEW_TRACKS) as Array<MediaWrapper>
filesText = resources.getQuantityString(R.plurals.media_quantity, tracks.size, tracks.size)
tracks
} catch (e: Exception) {
try {
arguments!!.getString(KEY_FOLDER)?.let { folder ->
requireArguments().getString(KEY_FOLDER)?.let { folder ->
isLoading = true
val viewModel = getBrowserModel(category = TYPE_FILE, url = folder, showHiddenFiles = false)
if (arguments!!.getBoolean(KEY_SUB_FOLDERS, false)) lifecycleScope.launchWhenStarted {
if (requireArguments().getBoolean(KEY_SUB_FOLDERS, false)) lifecycleScope.launchWhenStarted {
withContext(Dispatchers.IO) {
newTrack = (viewModel.provider as FileBrowserProvider).browseByUrl(folder).toTypedArray()
isLoading = false
......@@ -131,6 +133,13 @@ class SavePlaylistDialog : VLCBottomSheetDialogFragment(), View.OnClickListener,
binding.dialogPlaylistSave.setOnClickListener(this)
binding.dialogPlaylistName.editText!!.setOnEditorActionListener(this)
binding.dialogPlaylistName.editText!!.setOnKeyListener { v, keyCode, event ->
if (keyCode == KeyEvent.KEYCODE_ENTER) {
addToNewPlaylist()
true
}
false
}
binding.list.layoutManager = LinearLayoutManager(view.context)
binding.list.adapter = adapter
adapter.submitList(listOf<MediaLibraryItem>(*medialibrary.playlists.apply { forEach { it.description = resources.getQuantityString(R.plurals.media_quantity, it.tracksCount, it.tracksCount) } }))
......@@ -152,11 +161,13 @@ class SavePlaylistDialog : VLCBottomSheetDialogFragment(), View.OnClickListener,
}
private fun addToNewPlaylist() {
if (alreadyAdding.getAndSet(true)) return
val name = binding.dialogPlaylistName.editText?.text?.toString()?.trim { it <= ' ' }
?: return
lifecycleScope.launch {
withContext(Dispatchers.IO) { medialibrary.getPlaylistByName(name) }?.let {
binding.dialogPlaylistName.error = getString(R.string.playlist_existing, it.title)
alreadyAdding.set(false)
return@launch
}
dismiss()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment