diff --git a/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt b/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt index c31327323..7818583e9 100644 --- a/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt @@ -15,7 +15,8 @@ import com.github.libretube.preferences.PreferenceHelper import com.github.libretube.util.RetrofitInstance import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.squareup.picasso.Picasso -import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import retrofit2.HttpException import java.io.IOException @@ -74,7 +75,7 @@ class PlaylistsAdapter( private fun deletePlaylist(id: String, token: String, position: Int) { fun run() { - GlobalScope.launch { + CoroutineScope(Dispatchers.IO).launch { val response = try { RetrofitInstance.authApi.deletePlaylist(token, PlaylistId(id)) } catch (e: IOException) { @@ -84,7 +85,6 @@ class PlaylistsAdapter( } catch (e: HttpException) { Log.e(TAG, "HttpException, unexpected response") return@launch - } finally { } try { if (response.message == "ok") { diff --git a/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt b/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt index 558311751..55748f397 100644 --- a/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/SearchAdapter.kt @@ -155,7 +155,7 @@ class SearchAdapter( } root.setOnLongClickListener { val playlistId = item.url!!.replace("/playlist?list=", "") - PlaylistOptionsDialog(playlistId, root.context) + PlaylistOptionsDialog(playlistId, false, root.context) .show(childFragmentManager, "PlaylistOptionsDialog") true } diff --git a/app/src/main/java/com/github/libretube/dialogs/LoginDialog.kt b/app/src/main/java/com/github/libretube/dialogs/LoginDialog.kt index ce75cde27..75983feb6 100644 --- a/app/src/main/java/com/github/libretube/dialogs/LoginDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/LoginDialog.kt @@ -84,6 +84,7 @@ class LoginDialog : DialogFragment() { PreferenceHelper.setUsername(requireContext(), login.username!!) requireMainActivityRestart = true dialog?.dismiss() + activity?.recreate() } } } diff --git a/app/src/main/java/com/github/libretube/dialogs/LogoutDialog.kt b/app/src/main/java/com/github/libretube/dialogs/LogoutDialog.kt index b039f1a57..a7192efd4 100644 --- a/app/src/main/java/com/github/libretube/dialogs/LogoutDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/LogoutDialog.kt @@ -29,6 +29,7 @@ class LogoutDialog : DialogFragment() { Toast.makeText(context, R.string.loggedout, Toast.LENGTH_SHORT).show() PreferenceHelper.setToken(requireContext(), "") dialog?.dismiss() + activity?.recreate() } binding.title.text = ThemeHelper.getStyledAppName(requireContext()) diff --git a/app/src/main/java/com/github/libretube/dialogs/PlaylistOptionsDialog.kt b/app/src/main/java/com/github/libretube/dialogs/PlaylistOptionsDialog.kt index b6be1b7a7..bd2124123 100644 --- a/app/src/main/java/com/github/libretube/dialogs/PlaylistOptionsDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/PlaylistOptionsDialog.kt @@ -20,16 +20,23 @@ import java.io.IOException class PlaylistOptionsDialog( private val playlistId: String, + private val isOwner: Boolean, context: Context ) : DialogFragment() { val TAG = "PlaylistOptionsDialog" - private val optionsList = listOf( + private var optionsList = listOf( context.getString(R.string.clonePlaylist), context.getString(R.string.share) ) override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + if (isOwner) { + optionsList = optionsList + + context?.getString(R.string.deletePlaylist)!! - + context?.getString(R.string.clonePlaylist)!! + } + val dialog = MaterialAlertDialogBuilder(requireContext()) .setNegativeButton(R.string.cancel) { dialog, _ -> dialog.dismiss() @@ -41,12 +48,12 @@ class PlaylistOptionsDialog( optionsList ) ) { _, which -> - when (which) { + when (optionsList[which]) { // Clone the playlist to the users Piped account - 0 -> { + context?.getString(R.string.clonePlaylist) -> { val token = PreferenceHelper.getToken(requireContext()) if (token != "") { - importPlaylist(token!!, playlistId) + importPlaylist(token, playlistId) } else { Toast.makeText( context, @@ -56,11 +63,15 @@ class PlaylistOptionsDialog( } } // share the playlist - 1 -> { + context?.getString(R.string.share) -> { val shareDialog = ShareDialog(playlistId, true) - // using parentFragmentManager is important here + // using parentFragmentManager, childFragmentManager doesn't work here shareDialog.show(parentFragmentManager, "ShareDialog") } + context?.getString(R.string.deletePlaylist) -> { + val token = PreferenceHelper.getToken(requireContext()) + deletePlaylist(playlistId, token) + } } } return dialog.show() @@ -82,4 +93,22 @@ class PlaylistOptionsDialog( } run() } + + private fun deletePlaylist(id: String, token: String) { + fun run() { + CoroutineScope(Dispatchers.IO).launch { + val response = try { + RetrofitInstance.authApi.deletePlaylist(token, PlaylistId(id)) + } catch (e: IOException) { + println(e) + Log.e(TAG, "IOException, you might not have internet connection") + return@launch + } catch (e: HttpException) { + Log.e(TAG, "HttpException, unexpected response") + return@launch + } + } + } + run() + } } diff --git a/app/src/main/java/com/github/libretube/dialogs/VideoOptionsDialog.kt b/app/src/main/java/com/github/libretube/dialogs/VideoOptionsDialog.kt index 54ffa88dc..f1c5952cc 100644 --- a/app/src/main/java/com/github/libretube/dialogs/VideoOptionsDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/VideoOptionsDialog.kt @@ -43,14 +43,14 @@ class VideoOptionsDialog(private val videoId: String, context: Context) : Dialog ) { _, which -> // For now, this checks the position of the option with the position that is in the // list. I don't like it, but we will do like this for now. - when (which) { + when (optionsList[which]) { // This for example will be the "Background mode" option - 0 -> { + context?.getString(R.string.playOnBackground) -> { BackgroundMode.getInstance() .playOnBackgroundMode(requireContext(), videoId) } // Add Video to Playlist Dialog - 1 -> { + context?.getString(R.string.addToPlaylist) -> { val token = PreferenceHelper.getToken(requireContext()) if (token != "") { val newFragment = AddtoPlaylistDialog() @@ -62,7 +62,7 @@ class VideoOptionsDialog(private val videoId: String, context: Context) : Dialog Toast.makeText(context, R.string.login_first, Toast.LENGTH_SHORT).show() } } - 2 -> { + context?.getString(R.string.share) -> { val shareDialog = ShareDialog(videoId, false) // using parentFragmentManager is important here shareDialog.show(parentFragmentManager, "ShareDialog") diff --git a/app/src/main/java/com/github/libretube/fragments/PlaylistFragment.kt b/app/src/main/java/com/github/libretube/fragments/PlaylistFragment.kt index a9352fba1..9cc6cede6 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlaylistFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlaylistFragment.kt @@ -11,6 +11,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.github.libretube.R import com.github.libretube.adapters.PlaylistAdapter import com.github.libretube.databinding.FragmentPlaylistBinding +import com.github.libretube.dialogs.PlaylistOptionsDialog import com.github.libretube.preferences.PreferenceHelper import com.github.libretube.util.RetrofitInstance import retrofit2.HttpException @@ -72,11 +73,18 @@ class PlaylistFragment : Fragment() { binding.playlistUploader.text = response.uploader binding.playlistTotVideos.text = getString(R.string.videoCount, response.videos.toString()) + val user = PreferenceHelper.getUsername(requireContext()) - var isOwner = false - if (response.uploaderUrl == null && response.uploader.equals(user, true)) { - isOwner = true + // check whether the user owns the playlist + val isOwner = response.uploaderUrl == null && + response.uploader.equals(user, true) + + // show playlist options + binding.optionsMenu.setOnClickListener { + val optionsDialog = PlaylistOptionsDialog(playlistId!!, isOwner, requireContext()) + optionsDialog.show(childFragmentManager, "PlaylistOptionsDialog") } + playlistAdapter = PlaylistAdapter( response.relatedStreams!!.toMutableList(), playlistId!!, diff --git a/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt b/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt index 6e23c80e0..fc902b685 100644 --- a/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt +++ b/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt @@ -171,8 +171,9 @@ class InstanceSettings : PreferenceFragmentCompat() { } val login = findPreference("login_register") + val token = PreferenceHelper.getToken(requireContext()) + if (token != "") login?.setTitle(R.string.logout) login?.setOnPreferenceClickListener { - val token = PreferenceHelper.getToken(requireContext()) if (token == "") { val newFragment = LoginDialog() newFragment.show(childFragmentManager, "Login") diff --git a/app/src/main/res/drawable/ic_three_dots.xml b/app/src/main/res/drawable/ic_three_dots.xml new file mode 100644 index 000000000..64b529cd8 --- /dev/null +++ b/app/src/main/res/drawable/ic_three_dots.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index fe0f24e73..62af48c28 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -9,9 +9,7 @@ + android:layout_height="match_parent"> diff --git a/app/src/main/res/layout/fragment_playlist.xml b/app/src/main/res/layout/fragment_playlist.xml index 2265ea7a1..3cdc13a80 100644 --- a/app/src/main/res/layout/fragment_playlist.xml +++ b/app/src/main/res/layout/fragment_playlist.xml @@ -23,14 +23,30 @@ android:layout_height="match_parent" android:orientation="vertical"> - + android:orientation="horizontal"> + + + + + +