From 933cff7ae68d8e5b7d24e5fc7ff1c7030c5a8f12 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sat, 18 Feb 2023 10:14:05 +0100 Subject: [PATCH 1/2] Replace unneeded activity restarts --- .../libretube/constants/PreferenceKeys.kt | 1 + .../ui/dialogs/DeleteAccountDialog.kt | 8 +-- .../libretube/ui/dialogs/LoginDialog.kt | 7 +-- .../libretube/ui/dialogs/LogoutDialog.kt | 9 ++-- .../ui/preferences/InstanceSettings.kt | 53 +++++++++++-------- app/src/main/res/xml/instance_settings.xml | 7 +++ 6 files changed, 52 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt index cce1a2107..71b3576e1 100644 --- a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt +++ b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt @@ -48,6 +48,7 @@ object PreferenceKeys { const val CUSTOM_INSTANCE = "customInstance" const val CLEAR_CUSTOM_INSTANCES = "clearCustomInstances" const val LOGIN_REGISTER = "login_register" + const val LOGOUT = "logout" const val DELETE_ACCOUNT = "delete_account" /** diff --git a/app/src/main/java/com/github/libretube/ui/dialogs/DeleteAccountDialog.kt b/app/src/main/java/com/github/libretube/ui/dialogs/DeleteAccountDialog.kt index 295a91bbd..951f33bbb 100644 --- a/app/src/main/java/com/github/libretube/ui/dialogs/DeleteAccountDialog.kt +++ b/app/src/main/java/com/github/libretube/ui/dialogs/DeleteAccountDialog.kt @@ -4,7 +4,6 @@ import android.app.Dialog import android.os.Bundle import android.util.Log import android.widget.Toast -import androidx.core.app.ActivityCompat import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope import com.github.libretube.R @@ -15,7 +14,9 @@ import com.github.libretube.extensions.TAG import com.github.libretube.helpers.PreferenceHelper import com.google.android.material.dialog.MaterialAlertDialogBuilder -class DeleteAccountDialog : DialogFragment() { +class DeleteAccountDialog( + private val onLogout: () -> Unit +) : DialogFragment() { private lateinit var binding: DialogDeleteAccountBinding override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { @@ -51,8 +52,7 @@ class DeleteAccountDialog : DialogFragment() { } Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() - PreferenceHelper.setToken("") - ActivityCompat.recreate(requireActivity()) + onLogout.invoke() dialog?.dismiss() } } diff --git a/app/src/main/java/com/github/libretube/ui/dialogs/LoginDialog.kt b/app/src/main/java/com/github/libretube/ui/dialogs/LoginDialog.kt index 9a6afdeeb..5b58bcb87 100644 --- a/app/src/main/java/com/github/libretube/ui/dialogs/LoginDialog.kt +++ b/app/src/main/java/com/github/libretube/ui/dialogs/LoginDialog.kt @@ -4,7 +4,6 @@ import android.app.Dialog import android.os.Bundle import android.util.Log import android.widget.Toast -import androidx.core.app.ActivityCompat import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope import com.github.libretube.R @@ -16,7 +15,9 @@ import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.util.TextUtils import com.google.android.material.dialog.MaterialAlertDialogBuilder -class LoginDialog : DialogFragment() { +class LoginDialog( + private val onLogin: () -> Unit +) : DialogFragment() { private lateinit var binding: DialogLoginBinding override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { @@ -96,8 +97,8 @@ class LoginDialog : DialogFragment() { PreferenceHelper.setToken(response.token) PreferenceHelper.setUsername(login.username) + onLogin.invoke() dialog?.dismiss() - ActivityCompat.recreate(requireActivity()) } } diff --git a/app/src/main/java/com/github/libretube/ui/dialogs/LogoutDialog.kt b/app/src/main/java/com/github/libretube/ui/dialogs/LogoutDialog.kt index 3d48aacf5..bae6ae263 100644 --- a/app/src/main/java/com/github/libretube/ui/dialogs/LogoutDialog.kt +++ b/app/src/main/java/com/github/libretube/ui/dialogs/LogoutDialog.kt @@ -4,14 +4,15 @@ import android.annotation.SuppressLint import android.app.Dialog import android.os.Bundle import android.widget.Toast -import androidx.core.app.ActivityCompat import androidx.fragment.app.DialogFragment import com.github.libretube.R import com.github.libretube.databinding.DialogLogoutBinding import com.github.libretube.helpers.PreferenceHelper import com.google.android.material.dialog.MaterialAlertDialogBuilder -class LogoutDialog : DialogFragment() { +class LogoutDialog( + private val onLogout: () -> Unit +) : DialogFragment() { private lateinit var binding: DialogLogoutBinding @SuppressLint("SetTextI18n") @@ -24,9 +25,9 @@ class LogoutDialog : DialogFragment() { binding.user.text.toString() + " (" + user + ")" binding.logout.setOnClickListener { Toast.makeText(context, R.string.loggedout, Toast.LENGTH_SHORT).show() - PreferenceHelper.setToken("") + + onLogout.invoke() dialog?.dismiss() - ActivityCompat.recreate(requireActivity()) } return MaterialAlertDialogBuilder(requireContext()) diff --git a/app/src/main/java/com/github/libretube/ui/preferences/InstanceSettings.kt b/app/src/main/java/com/github/libretube/ui/preferences/InstanceSettings.kt index e08b71a4a..7bcd0c6ba 100644 --- a/app/src/main/java/com/github/libretube/ui/preferences/InstanceSettings.kt +++ b/app/src/main/java/com/github/libretube/ui/preferences/InstanceSettings.kt @@ -27,6 +27,7 @@ import kotlinx.coroutines.withContext class InstanceSettings : BasePreferenceFragment() { override val titleResourceId: Int = R.string.instance + private val token get() = PreferenceHelper.getToken() override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.instance_settings, rootKey) @@ -37,7 +38,7 @@ class InstanceSettings : BasePreferenceFragment() { RetrofitInstance.url = newValue.toString() if (!PreferenceHelper.getBoolean(PreferenceKeys.AUTH_INSTANCE_TOGGLE, false)) { RetrofitInstance.authUrl = newValue.toString() - logout() + logoutAndUpdateUI() } RetrofitInstance.lazyMgr.reset() ActivityCompat.recreate(requireActivity()) @@ -54,8 +55,7 @@ class InstanceSettings : BasePreferenceFragment() { // save new auth url RetrofitInstance.authUrl = newValue.toString() RetrofitInstance.lazyMgr.reset() - logout() - ActivityCompat.recreate(requireActivity()) + logoutAndUpdateUI() true } @@ -63,7 +63,6 @@ class InstanceSettings : BasePreferenceFragment() { findPreference(PreferenceKeys.AUTH_INSTANCE_TOGGLE) authInstanceToggle?.setOnPreferenceChangeListener { _, newValue -> authInstance.isVisible = newValue == true - logout() // either use new auth url or the normal api url if auth instance disabled RetrofitInstance.authUrl = if (newValue == false) { RetrofitInstance.url @@ -71,14 +70,14 @@ class InstanceSettings : BasePreferenceFragment() { authInstance.value } RetrofitInstance.lazyMgr.reset() - ActivityCompat.recreate(requireActivity()) + logoutAndUpdateUI() true } val customInstance = findPreference(PreferenceKeys.CUSTOM_INSTANCE) customInstance?.setOnPreferenceClickListener { - val newFragment = CustomInstanceDialog() - newFragment.show(childFragmentManager, CustomInstanceDialog::class.java.name) + CustomInstanceDialog() + .show(childFragmentManager, CustomInstanceDialog::class.java.name) true } @@ -92,25 +91,32 @@ class InstanceSettings : BasePreferenceFragment() { } val login = findPreference(PreferenceKeys.LOGIN_REGISTER) - val token = PreferenceHelper.getToken() - if (token != "") login?.setTitle(R.string.logout) - login?.setOnPreferenceClickListener { - if (token == "") { - val newFragment = LoginDialog() - newFragment.show(childFragmentManager, LoginDialog::class.java.name) - } else { - val newFragment = LogoutDialog() - newFragment.show(childFragmentManager, LogoutDialog::class.java.name) - } + val logout = findPreference(PreferenceKeys.LOGOUT) + val deleteAccount = findPreference(PreferenceKeys.DELETE_ACCOUNT) + login?.isVisible = token.isEmpty() + logout?.isVisible = token.isNotEmpty() + deleteAccount?.isEnabled = token.isNotEmpty() + + login?.setOnPreferenceClickListener { + LoginDialog { + login.isVisible = false + logout?.isVisible = true + deleteAccount?.isEnabled = true + } + .show(childFragmentManager, LoginDialog::class.java.name) + true + } + + logout?.setOnPreferenceClickListener { + LogoutDialog(this::logoutAndUpdateUI) + .show(childFragmentManager, LogoutDialog::class.java.name) true } - val deleteAccount = findPreference(PreferenceKeys.DELETE_ACCOUNT) - deleteAccount?.isEnabled = PreferenceHelper.getToken() != "" deleteAccount?.setOnPreferenceClickListener { - val newFragment = DeleteAccountDialog() - newFragment.show(childFragmentManager, DeleteAccountDialog::class.java.name) + DeleteAccountDialog(this::logoutAndUpdateUI) + .show(childFragmentManager, DeleteAccountDialog::class.java.name) true } } @@ -153,8 +159,11 @@ class InstanceSettings : BasePreferenceFragment() { } } - private fun logout() { + private fun logoutAndUpdateUI() { PreferenceHelper.setToken("") Toast.makeText(context, getString(R.string.loggedout), Toast.LENGTH_SHORT).show() + findPreference(PreferenceKeys.LOGIN_REGISTER)?.isVisible = true + findPreference(PreferenceKeys.LOGOUT)?.isVisible = false + findPreference(PreferenceKeys.DELETE_ACCOUNT)?.isEnabled = false } } diff --git a/app/src/main/res/xml/instance_settings.xml b/app/src/main/res/xml/instance_settings.xml index c40b9e370..b22176484 100644 --- a/app/src/main/res/xml/instance_settings.xml +++ b/app/src/main/res/xml/instance_settings.xml @@ -48,6 +48,13 @@ app:key="login_register" app:title="@string/login_register" /> + + Date: Sat, 18 Feb 2023 10:20:49 +0100 Subject: [PATCH 2/2] Better login/register error messages --- .../com/github/libretube/ui/dialogs/LoginDialog.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/java/com/github/libretube/ui/dialogs/LoginDialog.kt b/app/src/main/java/com/github/libretube/ui/dialogs/LoginDialog.kt index 5b58bcb87..45305cd07 100644 --- a/app/src/main/java/com/github/libretube/ui/dialogs/LoginDialog.kt +++ b/app/src/main/java/com/github/libretube/ui/dialogs/LoginDialog.kt @@ -7,13 +7,17 @@ import android.widget.Toast import androidx.fragment.app.DialogFragment import androidx.lifecycle.lifecycleScope import com.github.libretube.R +import com.github.libretube.api.JsonHelper import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.obj.Login +import com.github.libretube.api.obj.Token import com.github.libretube.databinding.DialogLoginBinding import com.github.libretube.extensions.TAG import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.util.TextUtils import com.google.android.material.dialog.MaterialAlertDialogBuilder +import kotlinx.serialization.decodeFromString +import retrofit2.HttpException class LoginDialog( private val onLogin: () -> Unit @@ -76,6 +80,12 @@ class LoginDialog( } else { RetrofitInstance.authApi.login(login) } + } catch (e: HttpException) { + val errorMessage = e.response()?.errorBody()?.string()?.let { + JsonHelper.json.decodeFromString(it).error + } ?: context?.getString(R.string.server_error) ?: "" + Toast.makeText(context, errorMessage, Toast.LENGTH_SHORT).show() + return@launchWhenCreated } catch (e: Exception) { Log.e(TAG(), e.toString()) Toast.makeText(context, e.localizedMessage, Toast.LENGTH_SHORT).show()