diff --git a/app/src/main/java/com/github/libretube/dialogs/AddToPlaylistDialog.kt b/app/src/main/java/com/github/libretube/dialogs/AddToPlaylistDialog.kt index a74e80ee4..1e21cbdf4 100644 --- a/app/src/main/java/com/github/libretube/dialogs/AddToPlaylistDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/AddToPlaylistDialog.kt @@ -29,21 +29,17 @@ class AddToPlaylistDialog : DialogFragment() { private lateinit var token: String override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - return activity?.let { - videoId = arguments?.getString("videoId")!! - val builder = MaterialAlertDialogBuilder(it) - // Get the layout inflater - binding = DialogAddtoplaylistBinding.inflate(layoutInflater) + videoId = arguments?.getString("videoId")!! + binding = DialogAddtoplaylistBinding.inflate(layoutInflater) + binding.title.text = ThemeHelper.getStyledAppName(requireContext()) - token = PreferenceHelper.getToken() + token = PreferenceHelper.getToken() - if (token != "") fetchPlaylists() + if (token != "") fetchPlaylists() - binding.title.text = ThemeHelper.getStyledAppName(requireContext()) - - builder.setView(binding.root) - builder.create() - } ?: throw IllegalStateException("Activity cannot be null") + return MaterialAlertDialogBuilder(requireContext()) + .setView(binding.root) + .show() } private fun fetchPlaylists() { diff --git a/app/src/main/java/com/github/libretube/dialogs/CreatePlaylistDialog.kt b/app/src/main/java/com/github/libretube/dialogs/CreatePlaylistDialog.kt index c9320a346..66f6c10e8 100644 --- a/app/src/main/java/com/github/libretube/dialogs/CreatePlaylistDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/CreatePlaylistDialog.kt @@ -23,32 +23,30 @@ class CreatePlaylistDialog : DialogFragment() { private lateinit var binding: DialogCreatePlaylistBinding override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - return activity?.let { - val builder = MaterialAlertDialogBuilder(it) - binding = DialogCreatePlaylistBinding.inflate(layoutInflater) + binding = DialogCreatePlaylistBinding.inflate(layoutInflater) - binding.title.text = ThemeHelper.getStyledAppName(requireContext()) + binding.title.text = ThemeHelper.getStyledAppName(requireContext()) - binding.cancelButton.setOnClickListener { - dismiss() + binding.cancelButton.setOnClickListener { + dismiss() + } + + token = PreferenceHelper.getToken() + + binding.createNewPlaylist.setOnClickListener { + // avoid creating the same playlist multiple times by spamming the button + binding.createNewPlaylist.setOnClickListener(null) + val listName = binding.playlistName.text.toString() + if (listName != "") { + createPlaylist(listName) + } else { + Toast.makeText(context, R.string.emptyPlaylistName, Toast.LENGTH_LONG).show() } + } - token = PreferenceHelper.getToken() - - binding.createNewPlaylist.setOnClickListener { - // avoid creating the same playlist multiple times by spamming the button - binding.createNewPlaylist.setOnClickListener(null) - val listName = binding.playlistName.text.toString() - if (listName != "") { - createPlaylist(listName) - } else { - Toast.makeText(context, R.string.emptyPlaylistName, Toast.LENGTH_LONG).show() - } - } - - builder.setView(binding.root) - builder.create() - } ?: throw IllegalStateException("Activity cannot be null") + return MaterialAlertDialogBuilder(requireContext()) + .setView(binding.root) + .show() } private fun createPlaylist(name: String) { diff --git a/app/src/main/java/com/github/libretube/dialogs/CustomInstanceDialog.kt b/app/src/main/java/com/github/libretube/dialogs/CustomInstanceDialog.kt index 48b1f0039..05d509f9e 100644 --- a/app/src/main/java/com/github/libretube/dialogs/CustomInstanceDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/CustomInstanceDialog.kt @@ -16,59 +16,57 @@ class CustomInstanceDialog : DialogFragment() { private lateinit var binding: DialogCustomInstanceBinding override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - return activity?.let { - val builder = MaterialAlertDialogBuilder(it) - binding = DialogCustomInstanceBinding.inflate(layoutInflater) + binding = DialogCustomInstanceBinding.inflate(layoutInflater) - binding.cancel.setOnClickListener { - dismiss() - } + binding.cancel.setOnClickListener { + dismiss() + } - binding.addInstance.setOnClickListener { - val customInstance = CustomInstance( - name = binding.instanceName.text.toString(), - apiUrl = binding.instanceApiUrl.text.toString(), - frontendUrl = binding.instanceFrontendUrl.text.toString() - ) + binding.addInstance.setOnClickListener { + val customInstance = CustomInstance( + name = binding.instanceName.text.toString(), + apiUrl = binding.instanceApiUrl.text.toString(), + frontendUrl = binding.instanceFrontendUrl.text.toString() + ) - if ( - customInstance.name != "" && - customInstance.apiUrl != "" && - customInstance.frontendUrl != "" - ) { - try { - // check whether the URL is valid, otherwise catch - URL(customInstance.apiUrl).toURI() - URL(customInstance.frontendUrl).toURI() + if ( + customInstance.name != "" && + customInstance.apiUrl != "" && + customInstance.frontendUrl != "" + ) { + try { + // check whether the URL is valid, otherwise catch + URL(customInstance.apiUrl).toURI() + URL(customInstance.frontendUrl).toURI() - Thread { - DatabaseHolder.db.customInstanceDao().insertAll(customInstance) - }.start() + Thread { + DatabaseHolder.db.customInstanceDao().insertAll(customInstance) + }.start() - activity?.recreate() - dismiss() - } catch (e: Exception) { - // invalid URL - Toast.makeText( - context, - getString(R.string.invalid_url), - Toast.LENGTH_SHORT - ).show() - } - } else { - // at least one empty input + activity?.recreate() + dismiss() + } catch (e: Exception) { + // invalid URL Toast.makeText( context, - context?.getString(R.string.empty_instance), + getString(R.string.invalid_url), Toast.LENGTH_SHORT ).show() } + } else { + // at least one empty input + Toast.makeText( + context, + context?.getString(R.string.empty_instance), + Toast.LENGTH_SHORT + ).show() } + } - binding.title.text = ThemeHelper.getStyledAppName(requireContext()) + binding.title.text = ThemeHelper.getStyledAppName(requireContext()) - builder.setView(binding.root) - builder.create() - } ?: throw IllegalStateException("Activity cannot be null") + return MaterialAlertDialogBuilder(requireContext()) + .setView(binding.root) + .show() } } diff --git a/app/src/main/java/com/github/libretube/dialogs/DeleteAccountDialog.kt b/app/src/main/java/com/github/libretube/dialogs/DeleteAccountDialog.kt index 88dea1817..1cb5e039c 100644 --- a/app/src/main/java/com/github/libretube/dialogs/DeleteAccountDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/DeleteAccountDialog.kt @@ -19,27 +19,25 @@ class DeleteAccountDialog : DialogFragment() { private lateinit var binding: DialogDeleteAccountBinding override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - return activity?.let { - val builder = MaterialAlertDialogBuilder(it) - binding = DialogDeleteAccountBinding.inflate(layoutInflater) + binding = DialogDeleteAccountBinding.inflate(layoutInflater) - binding.cancelButton.setOnClickListener { - dialog?.dismiss() + binding.cancelButton.setOnClickListener { + dialog?.dismiss() + } + + binding.deleteAccountConfirm.setOnClickListener { + if (binding.deletePassword.text.toString() != "") { + deleteAccount(binding.deletePassword.text.toString()) + } else { + Toast.makeText(context, R.string.empty, Toast.LENGTH_SHORT).show() } + } - binding.deleteAccountConfirm.setOnClickListener { - if (binding.deletePassword.text.toString() != "") { - deleteAccount(binding.deletePassword.text.toString()) - } else { - Toast.makeText(context, R.string.empty, Toast.LENGTH_SHORT).show() - } - } + binding.title.text = ThemeHelper.getStyledAppName(requireContext()) - binding.title.text = ThemeHelper.getStyledAppName(requireContext()) - - builder.setView(binding.root) - builder.create() - } ?: throw IllegalStateException("Activity cannot be null") + return MaterialAlertDialogBuilder(requireContext()) + .setView(binding.root) + .show() } private fun deleteAccount(password: String) { diff --git a/app/src/main/java/com/github/libretube/dialogs/DownloadDialog.kt b/app/src/main/java/com/github/libretube/dialogs/DownloadDialog.kt index 17bd96864..099f2557d 100644 --- a/app/src/main/java/com/github/libretube/dialogs/DownloadDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/DownloadDialog.kt @@ -28,29 +28,27 @@ class DownloadDialog( private lateinit var binding: DialogDownloadBinding override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - return activity?.let { - val builder = MaterialAlertDialogBuilder(it) - binding = DialogDownloadBinding.inflate(layoutInflater) + binding = DialogDownloadBinding.inflate(layoutInflater) - fetchAvailableSources() + fetchAvailableSources() - PermissionHelper.requestReadWrite(requireActivity()) + PermissionHelper.requestReadWrite(requireActivity()) - binding.title.text = ThemeHelper.getStyledAppName(requireContext()) + binding.title.text = ThemeHelper.getStyledAppName(requireContext()) - binding.audioRadio.setOnClickListener { - binding.videoSpinner.visibility = View.GONE - binding.audioSpinner.visibility = View.VISIBLE - } + binding.audioRadio.setOnClickListener { + binding.videoSpinner.visibility = View.GONE + binding.audioSpinner.visibility = View.VISIBLE + } - binding.videoRadio.setOnClickListener { - binding.audioSpinner.visibility = View.GONE - binding.videoSpinner.visibility = View.VISIBLE - } + binding.videoRadio.setOnClickListener { + binding.audioSpinner.visibility = View.GONE + binding.videoSpinner.visibility = View.VISIBLE + } - builder.setView(binding.root) - builder.create() - } ?: throw IllegalStateException("Activity cannot be null") + return MaterialAlertDialogBuilder(requireContext()) + .setView(binding.root) + .show() } private fun fetchAvailableSources() { 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 03ba1be99..dea8cc329 100644 --- a/app/src/main/java/com/github/libretube/dialogs/LoginDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/LoginDialog.kt @@ -21,40 +21,37 @@ class LoginDialog : DialogFragment() { private lateinit var binding: DialogLoginBinding override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - return activity?.let { - val builder = MaterialAlertDialogBuilder(it) - // Get the layout inflater - binding = DialogLoginBinding.inflate(layoutInflater) + binding = DialogLoginBinding.inflate(layoutInflater) - binding.login.setOnClickListener { - if (binding.username.text.toString() != "" && binding.password.text.toString() != "") { - val login = - Login(binding.username.text.toString(), binding.password.text.toString()) - login(login) - } else { - Toast.makeText(context, R.string.empty, Toast.LENGTH_SHORT).show() - } + binding.login.setOnClickListener { + if (binding.username.text.toString() != "" && binding.password.text.toString() != "") { + val login = + Login(binding.username.text.toString(), binding.password.text.toString()) + login(login) + } else { + Toast.makeText(context, R.string.empty, Toast.LENGTH_SHORT).show() } - binding.register.setOnClickListener { - if ( - binding.username.text.toString() != "" && - binding.password.text.toString() != "" - ) { - val login = Login( - binding.username.text.toString(), - binding.password.text.toString() - ) - register(login) - } else { - Toast.makeText(context, R.string.empty, Toast.LENGTH_SHORT).show() - } + } + binding.register.setOnClickListener { + if ( + binding.username.text.toString() != "" && + binding.password.text.toString() != "" + ) { + val login = Login( + binding.username.text.toString(), + binding.password.text.toString() + ) + register(login) + } else { + Toast.makeText(context, R.string.empty, Toast.LENGTH_SHORT).show() } + } - binding.title.text = ThemeHelper.getStyledAppName(requireContext()) + binding.title.text = ThemeHelper.getStyledAppName(requireContext()) - builder.setView(binding.root) - builder.create() - } ?: throw IllegalStateException("Activity cannot be null") + return MaterialAlertDialogBuilder(requireContext()) + .setView(binding.root) + .show() } private fun login(login: Login) { 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 99a5e3356..c5dd117d7 100644 --- a/app/src/main/java/com/github/libretube/dialogs/LogoutDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/LogoutDialog.kt @@ -14,25 +14,23 @@ class LogoutDialog : DialogFragment() { private lateinit var binding: DialogLogoutBinding override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - return activity?.let { - val builder = MaterialAlertDialogBuilder(it) - binding = DialogLogoutBinding.inflate(layoutInflater) + binding = DialogLogoutBinding.inflate(layoutInflater) - val user = PreferenceHelper.getUsername() + val user = PreferenceHelper.getUsername() - binding.user.text = - binding.user.text.toString() + " (" + user + ")" - binding.logout.setOnClickListener { - Toast.makeText(context, R.string.loggedout, Toast.LENGTH_SHORT).show() - PreferenceHelper.setToken("") - dialog?.dismiss() - activity?.recreate() - } + binding.user.text = + binding.user.text.toString() + " (" + user + ")" + binding.logout.setOnClickListener { + Toast.makeText(context, R.string.loggedout, Toast.LENGTH_SHORT).show() + PreferenceHelper.setToken("") + dialog?.dismiss() + activity?.recreate() + } - binding.title.text = ThemeHelper.getStyledAppName(requireContext()) + binding.title.text = ThemeHelper.getStyledAppName(requireContext()) - builder.setView(binding.root) - builder.create() - } ?: throw IllegalStateException("Activity cannot be null") + return MaterialAlertDialogBuilder(requireContext()) + .setView(binding.root) + .show() } } diff --git a/app/src/main/java/com/github/libretube/dialogs/RequireRestartDialog.kt b/app/src/main/java/com/github/libretube/dialogs/RequireRestartDialog.kt index f22b89980..5c2f3faf0 100644 --- a/app/src/main/java/com/github/libretube/dialogs/RequireRestartDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/RequireRestartDialog.kt @@ -10,16 +10,14 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder class RequireRestartDialog : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - return activity?.let { - MaterialAlertDialogBuilder(requireContext()) - .setTitle(R.string.require_restart) - .setMessage(R.string.require_restart_message) - .setPositiveButton(R.string.okay) { _, _ -> - activity?.recreate() - ThemeHelper.restartMainActivity(requireContext()) - } - .setNegativeButton(R.string.cancel, null) - .create() - } ?: throw IllegalStateException("Activity cannot be null") + return MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.require_restart) + .setMessage(R.string.require_restart_message) + .setPositiveButton(R.string.okay) { _, _ -> + activity?.recreate() + ThemeHelper.restartMainActivity(requireContext()) + } + .setNegativeButton(R.string.cancel, null) + .show() } } diff --git a/app/src/main/java/com/github/libretube/dialogs/ShareDialog.kt b/app/src/main/java/com/github/libretube/dialogs/ShareDialog.kt index 398239287..d34ef2d2d 100644 --- a/app/src/main/java/com/github/libretube/dialogs/ShareDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/ShareDialog.kt @@ -7,6 +7,7 @@ import androidx.fragment.app.DialogFragment import com.github.libretube.PIPED_FRONTEND_URL import com.github.libretube.R import com.github.libretube.YOUTUBE_FRONTEND_URL +import com.github.libretube.databinding.DialogShareBinding import com.github.libretube.db.DatabaseHolder import com.github.libretube.db.obj.CustomInstance import com.github.libretube.extensions.await @@ -17,53 +18,58 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder class ShareDialog( private val id: String, private val isPlaylist: Boolean, - private val position: Long = 0L + private val position: Long? = null ) : DialogFragment() { + private var binding: DialogShareBinding? = null override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - return activity?.let { - var shareOptions = arrayOf( - getString(R.string.piped), - getString(R.string.youtube) + var shareOptions = arrayOf( + getString(R.string.piped), + getString(R.string.youtube) + ) + val instanceUrl = getCustomInstanceFrontendUrl() + + // add instanceUrl option if custom instance frontend url available + if (instanceUrl != "") shareOptions += getString(R.string.instance) + + if (position != null) { + binding = DialogShareBinding.inflate(layoutInflater) + binding!!.timeCodeSwitch.isChecked = PreferenceHelper.getBoolean( + PreferenceKeys.SHARE_WITH_TIME_CODE, + true ) - val instanceUrl = getCustomInstanceFrontendUrl() + } - // add instanceUrl option if custom instance frontend url available - if (instanceUrl != "") shareOptions += getString(R.string.instance) - - MaterialAlertDialogBuilder(requireContext()) - .setTitle(context?.getString(R.string.share)) - .setItems( - shareOptions - ) { _, which -> - val host = when (which) { - 0 -> PIPED_FRONTEND_URL - 1 -> YOUTUBE_FRONTEND_URL - // only available for custom instances - else -> instanceUrl - } - val path = if (!isPlaylist) "/watch?v=$id" else "/playlist?list=$id" - var url = "$host$path" - if (PreferenceHelper.getBoolean( - PreferenceKeys.SHARE_WITH_TIME_CODE, - true - ) - ) { - url += "?t=$position" - } - - val intent = Intent() - intent.apply { - action = Intent.ACTION_SEND - putExtra(Intent.EXTRA_TEXT, url) - type = "text/plain" - } - context?.startActivity( - Intent.createChooser(intent, context?.getString(R.string.shareTo)) - ) + return MaterialAlertDialogBuilder(requireContext()) + .setTitle(context?.getString(R.string.share)) + .setItems( + shareOptions + ) { _, which -> + val host = when (which) { + 0 -> PIPED_FRONTEND_URL + 1 -> YOUTUBE_FRONTEND_URL + // only available for custom instances + else -> instanceUrl } - .show() - } ?: throw IllegalStateException("Activity cannot be null") + val path = if (!isPlaylist) "/watch?v=$id" else "/playlist?list=$id" + var url = "$host$path" + + if (binding != null && binding!!.timeCodeSwitch.isChecked) { + url += "?t=$position" + } + + val intent = Intent() + intent.apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_TEXT, url) + type = "text/plain" + } + context?.startActivity( + Intent.createChooser(intent, context?.getString(R.string.shareTo)) + ) + } + .setView(binding?.root) + .show() } // get the frontend url if it's a custom instance diff --git a/app/src/main/java/com/github/libretube/dialogs/UpdateDialog.kt b/app/src/main/java/com/github/libretube/dialogs/UpdateDialog.kt index 715400bdd..4b3ed8d6c 100644 --- a/app/src/main/java/com/github/libretube/dialogs/UpdateDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/UpdateDialog.kt @@ -18,27 +18,25 @@ class UpdateDialog( ) : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - return activity?.let { - MaterialAlertDialogBuilder(requireContext()) - .setTitle(context?.getString(R.string.update_available, updateInfo.name)) - .setMessage(context?.getString(R.string.update_now)) - .setNegativeButton(R.string.cancel, null) - .setPositiveButton(context?.getString(R.string.okay)) { _, _ -> - val downloadUrl = getDownloadUrl(updateInfo) - Log.i("downloadUrl", downloadUrl.toString()) - if (downloadUrl != null) { - PermissionHelper.requestReadWrite(requireActivity()) - val intent = Intent(context, UpdateService::class.java) - intent.putExtra("downloadUrl", downloadUrl) - context?.startService(intent) - } else { - val uri = Uri.parse(updateInfo.html_url) - val intent = Intent(Intent.ACTION_VIEW).setData(uri) - startActivity(intent) - } + return MaterialAlertDialogBuilder(requireContext()) + .setTitle(context?.getString(R.string.update_available, updateInfo.name)) + .setMessage(context?.getString(R.string.update_now)) + .setNegativeButton(R.string.cancel, null) + .setPositiveButton(context?.getString(R.string.okay)) { _, _ -> + val downloadUrl = getDownloadUrl(updateInfo) + Log.i("downloadUrl", downloadUrl.toString()) + if (downloadUrl != null) { + PermissionHelper.requestReadWrite(requireActivity()) + val intent = Intent(context, UpdateService::class.java) + intent.putExtra("downloadUrl", downloadUrl) + context?.startService(intent) + } else { + val uri = Uri.parse(updateInfo.html_url) + val intent = Intent(Intent.ACTION_VIEW).setData(uri) + startActivity(intent) } - .create() - } ?: throw IllegalStateException("Activity cannot be null") + } + .show() } private fun getDownloadUrl(updateInfo: UpdateInfo): String? { 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 9eb7e221b..0df687c03 100644 --- a/app/src/main/java/com/github/libretube/dialogs/VideoOptionsDialog.kt +++ b/app/src/main/java/com/github/libretube/dialogs/VideoOptionsDialog.kt @@ -37,6 +37,13 @@ class VideoOptionsDialog( context?.getString(R.string.share) ) + // remove the add to playlist option if not logged in + if (PreferenceHelper.getToken() == "") { + optionsList.remove( + context?.getString(R.string.addToPlaylist) + + ) + } /** * Check whether the player is running by observing the notification */ diff --git a/app/src/main/res/layout/dialog_share.xml b/app/src/main/res/layout/dialog_share.xml new file mode 100644 index 000000000..fe4005185 --- /dev/null +++ b/app/src/main/res/layout/dialog_share.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d33f0b529..f51fca128 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -283,7 +283,7 @@ Error Copied Download succeeded - Share with start time + Share with time code Export Subscriptions Skip buttons Show buttons to skip to the next or previous video.