Merge pull request #3112 from Bnyro/master

Better login/register error messages
This commit is contained in:
Bnyro 2023-02-18 10:21:11 +01:00 committed by GitHub
commit ee1484fafa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 62 additions and 33 deletions

View File

@ -48,6 +48,7 @@ object PreferenceKeys {
const val CUSTOM_INSTANCE = "customInstance" const val CUSTOM_INSTANCE = "customInstance"
const val CLEAR_CUSTOM_INSTANCES = "clearCustomInstances" const val CLEAR_CUSTOM_INSTANCES = "clearCustomInstances"
const val LOGIN_REGISTER = "login_register" const val LOGIN_REGISTER = "login_register"
const val LOGOUT = "logout"
const val DELETE_ACCOUNT = "delete_account" const val DELETE_ACCOUNT = "delete_account"
/** /**

View File

@ -4,7 +4,6 @@ import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.github.libretube.R import com.github.libretube.R
@ -15,7 +14,9 @@ import com.github.libretube.extensions.TAG
import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.helpers.PreferenceHelper
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
class DeleteAccountDialog : DialogFragment() { class DeleteAccountDialog(
private val onLogout: () -> Unit
) : DialogFragment() {
private lateinit var binding: DialogDeleteAccountBinding private lateinit var binding: DialogDeleteAccountBinding
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
@ -51,8 +52,7 @@ class DeleteAccountDialog : DialogFragment() {
} }
Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.success, Toast.LENGTH_SHORT).show()
PreferenceHelper.setToken("") onLogout.invoke()
ActivityCompat.recreate(requireActivity())
dialog?.dismiss() dialog?.dismiss()
} }
} }

View File

@ -4,19 +4,24 @@ import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.util.Log import android.util.Log
import android.widget.Toast import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.api.JsonHelper
import com.github.libretube.api.RetrofitInstance import com.github.libretube.api.RetrofitInstance
import com.github.libretube.api.obj.Login import com.github.libretube.api.obj.Login
import com.github.libretube.api.obj.Token
import com.github.libretube.databinding.DialogLoginBinding import com.github.libretube.databinding.DialogLoginBinding
import com.github.libretube.extensions.TAG import com.github.libretube.extensions.TAG
import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.helpers.PreferenceHelper
import com.github.libretube.util.TextUtils import com.github.libretube.util.TextUtils
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.serialization.decodeFromString
import retrofit2.HttpException
class LoginDialog : DialogFragment() { class LoginDialog(
private val onLogin: () -> Unit
) : DialogFragment() {
private lateinit var binding: DialogLoginBinding private lateinit var binding: DialogLoginBinding
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
@ -75,6 +80,12 @@ class LoginDialog : DialogFragment() {
} else { } else {
RetrofitInstance.authApi.login(login) RetrofitInstance.authApi.login(login)
} }
} catch (e: HttpException) {
val errorMessage = e.response()?.errorBody()?.string()?.let {
JsonHelper.json.decodeFromString<Token>(it).error
} ?: context?.getString(R.string.server_error) ?: ""
Toast.makeText(context, errorMessage, Toast.LENGTH_SHORT).show()
return@launchWhenCreated
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG(), e.toString()) Log.e(TAG(), e.toString())
Toast.makeText(context, e.localizedMessage, Toast.LENGTH_SHORT).show() Toast.makeText(context, e.localizedMessage, Toast.LENGTH_SHORT).show()
@ -96,8 +107,8 @@ class LoginDialog : DialogFragment() {
PreferenceHelper.setToken(response.token) PreferenceHelper.setToken(response.token)
PreferenceHelper.setUsername(login.username) PreferenceHelper.setUsername(login.username)
onLogin.invoke()
dialog?.dismiss() dialog?.dismiss()
ActivityCompat.recreate(requireActivity())
} }
} }

View File

@ -4,14 +4,15 @@ import android.annotation.SuppressLint
import android.app.Dialog import android.app.Dialog
import android.os.Bundle import android.os.Bundle
import android.widget.Toast import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import com.github.libretube.R import com.github.libretube.R
import com.github.libretube.databinding.DialogLogoutBinding import com.github.libretube.databinding.DialogLogoutBinding
import com.github.libretube.helpers.PreferenceHelper import com.github.libretube.helpers.PreferenceHelper
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
class LogoutDialog : DialogFragment() { class LogoutDialog(
private val onLogout: () -> Unit
) : DialogFragment() {
private lateinit var binding: DialogLogoutBinding private lateinit var binding: DialogLogoutBinding
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
@ -24,9 +25,9 @@ class LogoutDialog : DialogFragment() {
binding.user.text.toString() + " (" + user + ")" binding.user.text.toString() + " (" + user + ")"
binding.logout.setOnClickListener { binding.logout.setOnClickListener {
Toast.makeText(context, R.string.loggedout, Toast.LENGTH_SHORT).show() Toast.makeText(context, R.string.loggedout, Toast.LENGTH_SHORT).show()
PreferenceHelper.setToken("")
onLogout.invoke()
dialog?.dismiss() dialog?.dismiss()
ActivityCompat.recreate(requireActivity())
} }
return MaterialAlertDialogBuilder(requireContext()) return MaterialAlertDialogBuilder(requireContext())

View File

@ -27,6 +27,7 @@ import kotlinx.coroutines.withContext
class InstanceSettings : BasePreferenceFragment() { class InstanceSettings : BasePreferenceFragment() {
override val titleResourceId: Int = R.string.instance override val titleResourceId: Int = R.string.instance
private val token get() = PreferenceHelper.getToken()
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.instance_settings, rootKey) setPreferencesFromResource(R.xml.instance_settings, rootKey)
@ -37,7 +38,7 @@ class InstanceSettings : BasePreferenceFragment() {
RetrofitInstance.url = newValue.toString() RetrofitInstance.url = newValue.toString()
if (!PreferenceHelper.getBoolean(PreferenceKeys.AUTH_INSTANCE_TOGGLE, false)) { if (!PreferenceHelper.getBoolean(PreferenceKeys.AUTH_INSTANCE_TOGGLE, false)) {
RetrofitInstance.authUrl = newValue.toString() RetrofitInstance.authUrl = newValue.toString()
logout() logoutAndUpdateUI()
} }
RetrofitInstance.lazyMgr.reset() RetrofitInstance.lazyMgr.reset()
ActivityCompat.recreate(requireActivity()) ActivityCompat.recreate(requireActivity())
@ -54,8 +55,7 @@ class InstanceSettings : BasePreferenceFragment() {
// save new auth url // save new auth url
RetrofitInstance.authUrl = newValue.toString() RetrofitInstance.authUrl = newValue.toString()
RetrofitInstance.lazyMgr.reset() RetrofitInstance.lazyMgr.reset()
logout() logoutAndUpdateUI()
ActivityCompat.recreate(requireActivity())
true true
} }
@ -63,7 +63,6 @@ class InstanceSettings : BasePreferenceFragment() {
findPreference<SwitchPreferenceCompat>(PreferenceKeys.AUTH_INSTANCE_TOGGLE) findPreference<SwitchPreferenceCompat>(PreferenceKeys.AUTH_INSTANCE_TOGGLE)
authInstanceToggle?.setOnPreferenceChangeListener { _, newValue -> authInstanceToggle?.setOnPreferenceChangeListener { _, newValue ->
authInstance.isVisible = newValue == true authInstance.isVisible = newValue == true
logout()
// either use new auth url or the normal api url if auth instance disabled // either use new auth url or the normal api url if auth instance disabled
RetrofitInstance.authUrl = if (newValue == false) { RetrofitInstance.authUrl = if (newValue == false) {
RetrofitInstance.url RetrofitInstance.url
@ -71,14 +70,14 @@ class InstanceSettings : BasePreferenceFragment() {
authInstance.value authInstance.value
} }
RetrofitInstance.lazyMgr.reset() RetrofitInstance.lazyMgr.reset()
ActivityCompat.recreate(requireActivity()) logoutAndUpdateUI()
true true
} }
val customInstance = findPreference<Preference>(PreferenceKeys.CUSTOM_INSTANCE) val customInstance = findPreference<Preference>(PreferenceKeys.CUSTOM_INSTANCE)
customInstance?.setOnPreferenceClickListener { customInstance?.setOnPreferenceClickListener {
val newFragment = CustomInstanceDialog() CustomInstanceDialog()
newFragment.show(childFragmentManager, CustomInstanceDialog::class.java.name) .show(childFragmentManager, CustomInstanceDialog::class.java.name)
true true
} }
@ -92,25 +91,32 @@ class InstanceSettings : BasePreferenceFragment() {
} }
val login = findPreference<Preference>(PreferenceKeys.LOGIN_REGISTER) val login = findPreference<Preference>(PreferenceKeys.LOGIN_REGISTER)
val token = PreferenceHelper.getToken() val logout = findPreference<Preference>(PreferenceKeys.LOGOUT)
if (token != "") login?.setTitle(R.string.logout) val deleteAccount = findPreference<Preference>(PreferenceKeys.DELETE_ACCOUNT)
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)
}
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 true
} }
val deleteAccount = findPreference<Preference>(PreferenceKeys.DELETE_ACCOUNT)
deleteAccount?.isEnabled = PreferenceHelper.getToken() != ""
deleteAccount?.setOnPreferenceClickListener { deleteAccount?.setOnPreferenceClickListener {
val newFragment = DeleteAccountDialog() DeleteAccountDialog(this::logoutAndUpdateUI)
newFragment.show(childFragmentManager, DeleteAccountDialog::class.java.name) .show(childFragmentManager, DeleteAccountDialog::class.java.name)
true true
} }
} }
@ -153,8 +159,11 @@ class InstanceSettings : BasePreferenceFragment() {
} }
} }
private fun logout() { private fun logoutAndUpdateUI() {
PreferenceHelper.setToken("") PreferenceHelper.setToken("")
Toast.makeText(context, getString(R.string.loggedout), Toast.LENGTH_SHORT).show() Toast.makeText(context, getString(R.string.loggedout), Toast.LENGTH_SHORT).show()
findPreference<Preference>(PreferenceKeys.LOGIN_REGISTER)?.isVisible = true
findPreference<Preference>(PreferenceKeys.LOGOUT)?.isVisible = false
findPreference<Preference>(PreferenceKeys.DELETE_ACCOUNT)?.isEnabled = false
} }
} }

View File

@ -48,6 +48,13 @@
app:key="login_register" app:key="login_register"
app:title="@string/login_register" /> app:title="@string/login_register" />
<Preference
android:icon="@drawable/ic_login_filled"
android:summary="@string/notgmail"
app:isPreferenceVisible="false"
app:key="logout"
app:title="@string/logout" />
<Preference <Preference
android:icon="@drawable/ic_reset" android:icon="@drawable/ic_reset"
android:summary="@string/deleteAccount_summary" android:summary="@string/deleteAccount_summary"