From 3ed130c62cded6c42b63a0444cc9ae43cbb82893 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 8 Jul 2022 14:00:11 +0200 Subject: [PATCH 1/6] add options dialog to playlist fragment --- .../libretube/fragments/PlaylistFragment.kt | 16 +++++++++--- app/src/main/res/drawable/ic_three_dots.xml | 10 +++++++ app/src/main/res/layout/fragment_playlist.xml | 26 +++++++++++++++---- 3 files changed, 43 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/drawable/ic_three_dots.xml 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..38b7c8c33 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 + + // show playlist options + binding.optionsMenu.setOnClickListener { + val newFragment = PlaylistOptionsDialog(playlistId!!, requireContext()) + newFragment.show(childFragmentManager, "PlaylistOptionsDialog") } + val user = PreferenceHelper.getUsername(requireContext()) + + // check whether the user owns the playlist + val isOwner = response.uploaderUrl == null && + response.uploader.equals(user, true) + playlistAdapter = PlaylistAdapter( response.relatedStreams!!.toMutableList(), playlistId!!, 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_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"> + + + + + + Date: Fri, 8 Jul 2022 14:14:25 +0200 Subject: [PATCH 2/6] add more playlist options --- .../libretube/adapters/PlaylistsAdapter.kt | 5 ++- .../libretube/adapters/SearchAdapter.kt | 2 +- .../dialogs/PlaylistOptionsDialog.kt | 44 ++++++++++++++++--- .../libretube/fragments/PlaylistFragment.kt | 14 +++--- 4 files changed, 49 insertions(+), 16 deletions(-) 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..854fd8f51 100644 --- a/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt @@ -15,6 +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.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import retrofit2.HttpException @@ -74,7 +76,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 +86,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/PlaylistOptionsDialog.kt b/app/src/main/java/com/github/libretube/dialogs/PlaylistOptionsDialog.kt index b6be1b7a7..c2181a9fd 100644 --- a/app/src/main/java/com/github/libretube/dialogs/PlaylistOptionsDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/PlaylistOptionsDialog.kt @@ -7,6 +7,8 @@ import android.util.Log import android.widget.ArrayAdapter import android.widget.Toast import androidx.fragment.app.DialogFragment +import androidx.navigation.findNavController +import androidx.navigation.fragment.findNavController import com.github.libretube.R import com.github.libretube.obj.PlaylistId import com.github.libretube.preferences.PreferenceHelper @@ -14,22 +16,30 @@ import com.github.libretube.util.RetrofitInstance import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import retrofit2.HttpException 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 +51,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 +66,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 +96,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/fragments/PlaylistFragment.kt b/app/src/main/java/com/github/libretube/fragments/PlaylistFragment.kt index 38b7c8c33..9cc6cede6 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlaylistFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlaylistFragment.kt @@ -74,16 +74,16 @@ class PlaylistFragment : Fragment() { binding.playlistTotVideos.text = getString(R.string.videoCount, response.videos.toString()) - // show playlist options - binding.optionsMenu.setOnClickListener { - val newFragment = PlaylistOptionsDialog(playlistId!!, requireContext()) - newFragment.show(childFragmentManager, "PlaylistOptionsDialog") - } val user = PreferenceHelper.getUsername(requireContext()) - // check whether the user owns the playlist val isOwner = response.uploaderUrl == null && - response.uploader.equals(user, true) + 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(), From 283e74062d6f8add565146d166c8f8b1083b3b09 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 8 Jul 2022 14:16:22 +0200 Subject: [PATCH 3/6] cleanup --- .../com/github/libretube/adapters/PlaylistsAdapter.kt | 1 - .../com/github/libretube/dialogs/PlaylistOptionsDialog.kt | 7 ++----- .../com/github/libretube/dialogs/VideoOptionsDialog.kt | 8 ++++---- 3 files changed, 6 insertions(+), 10 deletions(-) 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 854fd8f51..7818583e9 100644 --- a/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt +++ b/app/src/main/java/com/github/libretube/adapters/PlaylistsAdapter.kt @@ -17,7 +17,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.squareup.picasso.Picasso import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import retrofit2.HttpException import java.io.IOException 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 c2181a9fd..bd2124123 100644 --- a/app/src/main/java/com/github/libretube/dialogs/PlaylistOptionsDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/PlaylistOptionsDialog.kt @@ -7,8 +7,6 @@ import android.util.Log import android.widget.ArrayAdapter import android.widget.Toast import androidx.fragment.app.DialogFragment -import androidx.navigation.findNavController -import androidx.navigation.fragment.findNavController import com.github.libretube.R import com.github.libretube.obj.PlaylistId import com.github.libretube.preferences.PreferenceHelper @@ -16,7 +14,6 @@ import com.github.libretube.util.RetrofitInstance import com.google.android.material.dialog.MaterialAlertDialogBuilder import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import retrofit2.HttpException import java.io.IOException @@ -36,8 +33,8 @@ class PlaylistOptionsDialog( override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { if (isOwner) { optionsList = optionsList + - context?.getString(R.string.deletePlaylist)!! - - context?.getString(R.string.clonePlaylist)!! + context?.getString(R.string.deletePlaylist)!! - + context?.getString(R.string.clonePlaylist)!! } val dialog = MaterialAlertDialogBuilder(requireContext()) 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") From 60e9446caf65791a637a18da12cf8ab234d07342 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 8 Jul 2022 14:19:29 +0200 Subject: [PATCH 4/6] better margins --- app/src/main/res/layout/fragment_library.xml | 11 +++++------ app/src/main/res/layout/fragment_subscriptions.xml | 1 + 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index fe0f24e73..933fa31c9 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_subscriptions.xml b/app/src/main/res/layout/fragment_subscriptions.xml index 0082a2a97..68a377c56 100644 --- a/app/src/main/res/layout/fragment_subscriptions.xml +++ b/app/src/main/res/layout/fragment_subscriptions.xml @@ -33,6 +33,7 @@ android:layout_height="wrap_content" android:layout_below="@id/boogh" android:layout_centerHorizontal="true" + android:layout_marginHorizontal="10dp" android:gravity="center" android:text="@string/please_login" android:textSize="20sp" From 2fca061b766f18979d01e60aefe34781afed5b8e Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 8 Jul 2022 14:26:00 +0200 Subject: [PATCH 5/6] dynamic login/out text --- app/src/main/java/com/github/libretube/dialogs/LoginDialog.kt | 1 + .../main/java/com/github/libretube/dialogs/LogoutDialog.kt | 1 + .../java/com/github/libretube/preferences/InstanceSettings.kt | 4 +++- app/src/main/res/layout/fragment_library.xml | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) 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/preferences/InstanceSettings.kt b/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt index 6e23c80e0..24ea4701a 100644 --- a/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt +++ b/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt @@ -34,6 +34,7 @@ import java.io.IOException import java.io.InputStream import java.util.zip.ZipEntry import java.util.zip.ZipInputStream +import kotlin.math.log class InstanceSettings : PreferenceFragmentCompat() { val TAG = "InstanceSettings" @@ -171,8 +172,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/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index 933fa31c9..62af48c28 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -23,7 +23,7 @@ android:id="@+id/text_like" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginHorizontal="20dp" + android:layout_marginHorizontal="10dp" android:layout_below="@id/boogh" android:layout_centerHorizontal="true" android:gravity="center" From 97049bf451bb41cc90483a7c410a9c0c07c7759f Mon Sep 17 00:00:00 2001 From: Bnyro Date: Fri, 8 Jul 2022 14:26:14 +0200 Subject: [PATCH 6/6] cleanup --- .../java/com/github/libretube/preferences/InstanceSettings.kt | 1 - 1 file changed, 1 deletion(-) 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 24ea4701a..fc902b685 100644 --- a/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt +++ b/app/src/main/java/com/github/libretube/preferences/InstanceSettings.kt @@ -34,7 +34,6 @@ import java.io.IOException import java.io.InputStream import java.util.zip.ZipEntry import java.util.zip.ZipInputStream -import kotlin.math.log class InstanceSettings : PreferenceFragmentCompat() { val TAG = "InstanceSettings"