forked from github/wulkanowy-mirror
Add change password snackbar (#1336)
This commit is contained in:
parent
b4b9d91ea6
commit
4a38a0be70
@ -3,8 +3,6 @@ package io.github.wulkanowy.ui.base
|
|||||||
import android.app.ActivityManager
|
import android.app.ActivityManager
|
||||||
import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK
|
import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK
|
||||||
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
|
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
import android.os.Build.VERSION.SDK_INT
|
|
||||||
import android.os.Build.VERSION_CODES.LOLLIPOP
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
@ -19,6 +17,7 @@ import io.github.wulkanowy.ui.modules.login.LoginActivity
|
|||||||
import io.github.wulkanowy.utils.FragmentLifecycleLogger
|
import io.github.wulkanowy.utils.FragmentLifecycleLogger
|
||||||
import io.github.wulkanowy.utils.getThemeAttrColor
|
import io.github.wulkanowy.utils.getThemeAttrColor
|
||||||
import io.github.wulkanowy.utils.lifecycleAwareVariable
|
import io.github.wulkanowy.utils.lifecycleAwareVariable
|
||||||
|
import io.github.wulkanowy.utils.openInternetBrowser
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
abstract class BaseActivity<T : BasePresenter<out BaseView>, VB : ViewBinding> :
|
abstract class BaseActivity<T : BasePresenter<out BaseView>, VB : ViewBinding> :
|
||||||
@ -43,13 +42,11 @@ abstract class BaseActivity<T : BasePresenter<out BaseView>, VB : ViewBinding> :
|
|||||||
supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentLifecycleLogger, true)
|
supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentLifecycleLogger, true)
|
||||||
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
|
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
|
||||||
|
|
||||||
if (SDK_INT >= LOLLIPOP) {
|
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
setTaskDescription(
|
setTaskDescription(
|
||||||
ActivityManager.TaskDescription(null, null, getThemeAttrColor(R.attr.colorSurface))
|
ActivityManager.TaskDescription(null, null, getThemeAttrColor(R.attr.colorSurface))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
override fun showError(text: String, error: Throwable) {
|
override fun showError(text: String, error: Throwable) {
|
||||||
if (messageContainer != null) {
|
if (messageContainer != null) {
|
||||||
@ -77,6 +74,14 @@ abstract class BaseActivity<T : BasePresenter<out BaseView>, VB : ViewBinding> :
|
|||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun showChangePasswordSnackbar(redirectUrl: String) {
|
||||||
|
messageContainer?.let {
|
||||||
|
Snackbar.make(it, R.string.error_password_change_required, LENGTH_LONG)
|
||||||
|
.setAction(R.string.all_change) { openInternetBrowser(redirectUrl) }
|
||||||
|
.show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun openClearLoginView() {
|
override fun openClearLoginView() {
|
||||||
startActivity(LoginActivity.getStartIntent(this)
|
startActivity(LoginActivity.getStartIntent(this)
|
||||||
.apply { addFlags(FLAG_ACTIVITY_CLEAR_TASK or FLAG_ACTIVITY_NEW_TASK) })
|
.apply { addFlags(FLAG_ACTIVITY_CLEAR_TASK or FLAG_ACTIVITY_NEW_TASK) })
|
||||||
|
@ -30,6 +30,10 @@ abstract class BaseDialogFragment<VB : ViewBinding> : DialogFragment(), BaseView
|
|||||||
(activity as? BaseActivity<*, *>)?.openClearLoginView()
|
(activity as? BaseActivity<*, *>)?.openClearLoginView()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun showChangePasswordSnackbar(redirectUrl: String) {
|
||||||
|
(activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl)
|
||||||
|
}
|
||||||
|
|
||||||
override fun showErrorDetailsDialog(error: Throwable) {
|
override fun showErrorDetailsDialog(error: Throwable) {
|
||||||
ErrorDialog.newInstance(error).show(childFragmentManager, error.toString())
|
ErrorDialog.newInstance(error).show(childFragmentManager, error.toString())
|
||||||
}
|
}
|
||||||
|
@ -45,4 +45,8 @@ abstract class BaseFragment<VB : ViewBinding>(@LayoutRes layoutId: Int) : Fragme
|
|||||||
override fun openClearLoginView() {
|
override fun openClearLoginView() {
|
||||||
(activity as? BaseActivity<*, *>)?.openClearLoginView()
|
(activity as? BaseActivity<*, *>)?.openClearLoginView()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun showChangePasswordSnackbar(redirectUrl: String) {
|
||||||
|
(activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,7 @@ open class BasePresenter<T : BaseView>(
|
|||||||
showErrorMessage = view::showError
|
showErrorMessage = view::showError
|
||||||
onSessionExpired = view::showExpiredDialog
|
onSessionExpired = view::showExpiredDialog
|
||||||
onNoCurrentStudent = view::openClearLoginView
|
onNoCurrentStudent = view::openClearLoginView
|
||||||
|
onPasswordChangeRequired = view::showChangePasswordSnackbar
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,4 +11,6 @@ interface BaseView {
|
|||||||
fun openClearLoginView()
|
fun openClearLoginView()
|
||||||
|
|
||||||
fun showErrorDetailsDialog(error: Throwable)
|
fun showErrorDetailsDialog(error: Throwable)
|
||||||
|
|
||||||
|
fun showChangePasswordSnackbar(redirectUrl: String)
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package io.github.wulkanowy.ui.base
|
|||||||
import android.content.res.Resources
|
import android.content.res.Resources
|
||||||
import io.github.wulkanowy.data.exceptions.NoCurrentStudentException
|
import io.github.wulkanowy.data.exceptions.NoCurrentStudentException
|
||||||
import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException
|
import io.github.wulkanowy.sdk.scrapper.login.BadCredentialsException
|
||||||
|
import io.github.wulkanowy.sdk.scrapper.login.PasswordChangeRequiredException
|
||||||
import io.github.wulkanowy.utils.getString
|
import io.github.wulkanowy.utils.getString
|
||||||
import io.github.wulkanowy.utils.security.ScramblerException
|
import io.github.wulkanowy.utils.security.ScramblerException
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
@ -16,6 +17,8 @@ open class ErrorHandler @Inject constructor(protected val resources: Resources)
|
|||||||
|
|
||||||
var onNoCurrentStudent: () -> Unit = {}
|
var onNoCurrentStudent: () -> Unit = {}
|
||||||
|
|
||||||
|
var onPasswordChangeRequired: (String) -> Unit = {}
|
||||||
|
|
||||||
fun dispatch(error: Throwable) {
|
fun dispatch(error: Throwable) {
|
||||||
Timber.e(error, "An exception occurred while the Wulkanowy was running")
|
Timber.e(error, "An exception occurred while the Wulkanowy was running")
|
||||||
proceed(error)
|
proceed(error)
|
||||||
@ -24,6 +27,7 @@ open class ErrorHandler @Inject constructor(protected val resources: Resources)
|
|||||||
protected open fun proceed(error: Throwable) {
|
protected open fun proceed(error: Throwable) {
|
||||||
showErrorMessage(resources.getString(error), error)
|
showErrorMessage(resources.getString(error), error)
|
||||||
when (error) {
|
when (error) {
|
||||||
|
is PasswordChangeRequiredException -> onPasswordChangeRequired(error.redirectUrl)
|
||||||
is ScramblerException, is BadCredentialsException -> onSessionExpired()
|
is ScramblerException, is BadCredentialsException -> onSessionExpired()
|
||||||
is NoCurrentStudentException -> onNoCurrentStudent()
|
is NoCurrentStudentException -> onNoCurrentStudent()
|
||||||
}
|
}
|
||||||
@ -33,5 +37,6 @@ open class ErrorHandler @Inject constructor(protected val resources: Resources)
|
|||||||
showErrorMessage = { _, _ -> }
|
showErrorMessage = { _, _ -> }
|
||||||
onSessionExpired = {}
|
onSessionExpired = {}
|
||||||
onNoCurrentStudent = {}
|
onNoCurrentStudent = {}
|
||||||
|
onPasswordChangeRequired = {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,6 +58,10 @@ class AdvancedFragment : PreferenceFragmentCompat(),
|
|||||||
(activity as? BaseActivity<*, *>)?.showExpiredDialog()
|
(activity as? BaseActivity<*, *>)?.showExpiredDialog()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun showChangePasswordSnackbar(redirectUrl: String) {
|
||||||
|
(activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl)
|
||||||
|
}
|
||||||
|
|
||||||
override fun openClearLoginView() {
|
override fun openClearLoginView() {
|
||||||
(activity as? BaseActivity<*, *>)?.openClearLoginView()
|
(activity as? BaseActivity<*, *>)?.openClearLoginView()
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,10 @@ class AppearanceFragment : PreferenceFragmentCompat(),
|
|||||||
(activity as? BaseActivity<*, *>)?.showExpiredDialog()
|
(activity as? BaseActivity<*, *>)?.showExpiredDialog()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun showChangePasswordSnackbar(redirectUrl: String) {
|
||||||
|
(activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl)
|
||||||
|
}
|
||||||
|
|
||||||
override fun openClearLoginView() {
|
override fun openClearLoginView() {
|
||||||
(activity as? BaseActivity<*, *>)?.openClearLoginView()
|
(activity as? BaseActivity<*, *>)?.openClearLoginView()
|
||||||
}
|
}
|
||||||
|
@ -107,6 +107,10 @@ class NotificationsFragment : PreferenceFragmentCompat(),
|
|||||||
(activity as? BaseActivity<*, *>)?.showExpiredDialog()
|
(activity as? BaseActivity<*, *>)?.showExpiredDialog()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun showChangePasswordSnackbar(redirectUrl: String) {
|
||||||
|
(activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl)
|
||||||
|
}
|
||||||
|
|
||||||
override fun openClearLoginView() {
|
override fun openClearLoginView() {
|
||||||
(activity as? BaseActivity<*, *>)?.openClearLoginView()
|
(activity as? BaseActivity<*, *>)?.openClearLoginView()
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,10 @@ class SyncFragment : PreferenceFragmentCompat(),
|
|||||||
(activity as? BaseActivity<*, *>)?.showExpiredDialog()
|
(activity as? BaseActivity<*, *>)?.showExpiredDialog()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun showChangePasswordSnackbar(redirectUrl: String) {
|
||||||
|
(activity as? BaseActivity<*, *>)?.showChangePasswordSnackbar(redirectUrl)
|
||||||
|
}
|
||||||
|
|
||||||
override fun openClearLoginView() {
|
override fun openClearLoginView() {
|
||||||
(activity as? BaseActivity<*, *>)?.openClearLoginView()
|
(activity as? BaseActivity<*, *>)?.openClearLoginView()
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ fun Context.getCompatDrawable(@DrawableRes drawableRes: Int, @ColorRes colorRes:
|
|||||||
fun Context.getCompatBitmap(@DrawableRes drawableRes: Int, @ColorRes colorRes: Int) =
|
fun Context.getCompatBitmap(@DrawableRes drawableRes: Int, @ColorRes colorRes: Int) =
|
||||||
getCompatDrawable(drawableRes, colorRes)?.toBitmap()
|
getCompatDrawable(drawableRes, colorRes)?.toBitmap()
|
||||||
|
|
||||||
fun Context.openInternetBrowser(uri: String, onActivityNotFound: (uri: String) -> Unit) {
|
fun Context.openInternetBrowser(uri: String, onActivityNotFound: (uri: String) -> Unit = {}) {
|
||||||
Intent.parseUri(uri, 0).let {
|
Intent.parseUri(uri, 0).let {
|
||||||
if (it.resolveActivity(packageManager) != null) startActivity(it)
|
if (it.resolveActivity(packageManager) != null) startActivity(it)
|
||||||
else onActivityNotFound(uri)
|
else onActivityNotFound(uri)
|
||||||
|
@ -678,6 +678,7 @@
|
|||||||
<!--Others-->
|
<!--Others-->
|
||||||
<string name="all_copied">Copied</string>
|
<string name="all_copied">Copied</string>
|
||||||
<string name="all_undo">Undo</string>
|
<string name="all_undo">Undo</string>
|
||||||
|
<string name="all_change">Change</string>
|
||||||
|
|
||||||
|
|
||||||
<!--Update helper-->
|
<!--Update helper-->
|
||||||
|
Loading…
x
Reference in New Issue
Block a user