diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt index 7197ea10..30c3a3e0 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt @@ -853,7 +853,7 @@ class MainActivity : AppCompatActivity(), CoroutineScope { @Subscribe(threadMode = ThreadMode.MAIN) fun onUserActionRequiredEvent(event: UserActionRequiredEvent) { - app.userActionManager.execute(this, event.profileId, event.type) + app.userActionManager.execute(this, event.profileId, event.type, event.params) } private fun fragmentToSyncName(currentFragment: Int): Int { @@ -914,7 +914,8 @@ class MainActivity : AppCompatActivity(), CoroutineScope { app.userActionManager.execute( this, extras.getInt("profileId"), - extras.getInt("type") + extras.getInt("type"), + extras.getBundle("params"), ) true } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/UserActionRequiredEvent.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/UserActionRequiredEvent.kt index 49b510c2..da68f3e8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/UserActionRequiredEvent.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/events/UserActionRequiredEvent.kt @@ -4,11 +4,14 @@ package pl.szczodrzynski.edziennik.data.api.events -data class UserActionRequiredEvent(val profileId: Int, val type: Int) { +import android.os.Bundle + +data class UserActionRequiredEvent(val profileId: Int, val type: Int, val params: Bundle?) { companion object { const val LOGIN_DATA_MOBIDZIENNIK = 101 const val LOGIN_DATA_LIBRUS = 102 const val LOGIN_DATA_VULCAN = 104 const val CAPTCHA_LIBRUS = 202 + const val OAUTH_USOS = 701 } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/ApiError.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/ApiError.kt index bb5d20cc..b631ed7d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/ApiError.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/models/ApiError.kt @@ -5,6 +5,7 @@ package pl.szczodrzynski.edziennik.data.api.models import android.content.Context +import android.os.Bundle import com.google.gson.JsonObject import im.wangchao.mhttp.Request import im.wangchao.mhttp.Response @@ -30,6 +31,7 @@ class ApiError(val tag: String, var errorCode: Int) { var request: Request? = null var response: Response? = null var isCritical = true + var params: Bundle? = null fun withThrowable(throwable: Throwable?): ApiError { this.throwable = throwable @@ -58,6 +60,11 @@ class ApiError(val tag: String, var errorCode: Int) { return this } + fun withParams(bundle: Bundle): ApiError { + this.params = bundle + return this + } + fun getStringText(context: Context): String { return context.resources.getIdentifier("error_${errorCode}", "string", context.packageName).let { if (it != 0) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginProgressFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginProgressFragment.kt index 03abbc2b..ee29575e 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginProgressFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginProgressFragment.kt @@ -137,9 +137,8 @@ class LoginProgressFragment : Fragment(), CoroutineScope { return } - app.userActionManager.execute(activity, event.profileId, event.type, onSuccess = { code -> - args.putString("recaptchaCode", code) - args.putLong("recaptchaTime", System.currentTimeMillis()) + app.userActionManager.execute(activity, event.profileId, event.type, event.params, onSuccess = { params -> + args.putAll(params) doFirstLogin(args) }, onFailure = { activity.error(ApiError(TAG, ERROR_CAPTCHA_NEEDED)) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/UserActionManager.kt b/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/UserActionManager.kt index dbe05325..76d5733d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/UserActionManager.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/utils/managers/UserActionManager.kt @@ -7,6 +7,7 @@ package pl.szczodrzynski.edziennik.utils.managers import android.app.NotificationManager import android.app.PendingIntent import android.content.Context +import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.app.NotificationCompat import org.greenrobot.eventbus.EventBus @@ -14,9 +15,11 @@ import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.MainActivity import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.data.api.ERROR_CAPTCHA_LIBRUS_PORTAL +import pl.szczodrzynski.edziennik.data.api.ERROR_USOS_OAUTH_LOGIN_REQUEST import pl.szczodrzynski.edziennik.data.api.edziennik.EdziennikTask import pl.szczodrzynski.edziennik.data.api.events.UserActionRequiredEvent import pl.szczodrzynski.edziennik.data.api.models.ApiError +import pl.szczodrzynski.edziennik.ext.Bundle import pl.szczodrzynski.edziennik.ext.Intent import pl.szczodrzynski.edziennik.ext.JsonObject import pl.szczodrzynski.edziennik.ext.pendingIntentFlag @@ -27,18 +30,21 @@ class UserActionManager(val app: App) { private const val TAG = "UserActionManager" } - fun requiresUserAction(apiError: ApiError): Boolean { - return apiError.errorCode == ERROR_CAPTCHA_LIBRUS_PORTAL + fun requiresUserAction(apiError: ApiError) = when (apiError.errorCode) { + ERROR_CAPTCHA_LIBRUS_PORTAL -> true + ERROR_USOS_OAUTH_LOGIN_REQUEST -> true + else -> false } fun sendToUser(apiError: ApiError) { val type = when (apiError.errorCode) { ERROR_CAPTCHA_LIBRUS_PORTAL -> UserActionRequiredEvent.CAPTCHA_LIBRUS + ERROR_USOS_OAUTH_LOGIN_REQUEST -> UserActionRequiredEvent.OAUTH_USOS else -> 0 } if (EventBus.getDefault().hasSubscriberForEvent(UserActionRequiredEvent::class.java)) { - EventBus.getDefault().post(UserActionRequiredEvent(apiError.profileId ?: -1, type)) + EventBus.getDefault().post(UserActionRequiredEvent(apiError.profileId ?: -1, type, apiError.params)) return } @@ -46,6 +52,7 @@ class UserActionManager(val app: App) { val text = app.getString(when (type) { UserActionRequiredEvent.CAPTCHA_LIBRUS -> R.string.notification_user_action_required_captcha_librus + UserActionRequiredEvent.OAUTH_USOS -> R.string.notification_user_action_required_oauth_usos else -> R.string.notification_user_action_required_text }, apiError.profileId) @@ -54,7 +61,8 @@ class UserActionManager(val app: App) { MainActivity::class.java, "action" to "userActionRequired", "profileId" to (apiError.profileId ?: -1), - "type" to type + "type" to type, + "params" to apiError.params, ) val pendingIntent = PendingIntent.getActivity(app, System.currentTimeMillis().toInt(), intent, PendingIntent.FLAG_ONE_SHOT or pendingIntentFlag()) @@ -78,23 +86,41 @@ class UserActionManager(val app: App) { activity: AppCompatActivity, profileId: Int?, type: Int, - onSuccess: ((code: String) -> Unit)? = null, + params: Bundle? = null, + onSuccess: ((params: Bundle) -> Unit)? = null, onFailure: (() -> Unit)? = null ) { - if (type != UserActionRequiredEvent.CAPTCHA_LIBRUS) - return + when (type) { + UserActionRequiredEvent.CAPTCHA_LIBRUS -> executeLibrus(activity, profileId, onSuccess, onFailure) + UserActionRequiredEvent.OAUTH_USOS -> executeOauth(activity, profileId, params, onSuccess, onFailure) + } + } + private fun executeLibrus( + activity: AppCompatActivity, + profileId: Int?, + onSuccess: ((params: Bundle) -> Unit)? = null, + onFailure: (() -> Unit)? = null, + ) { if (profileId == null) return // show captcha dialog // use passed onSuccess listener, else sync profile LibrusCaptchaDialog( activity = activity, - onSuccess = onSuccess ?: { code -> - EdziennikTask.syncProfile(profileId, arguments = JsonObject( - "recaptchaCode" to code, - "recaptchaTime" to System.currentTimeMillis() - )).enqueue(activity) + onSuccess = { code -> + if (onSuccess != null) { + val params = Bundle( + "recaptchaCode" to code, + "recaptchaTime" to System.currentTimeMillis(), + ) + onSuccess(params) + } else { + EdziennikTask.syncProfile(profileId, arguments = JsonObject( + "recaptchaCode" to code, + "recaptchaTime" to System.currentTimeMillis(), + )).enqueue(activity) + } }, onFailure = onFailure ).show() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 66ac0299..393248c9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1541,4 +1541,5 @@ USOS Logowanie z użyciem przeglądarki TODO + USOS - wymagane logowanie z użyciem przeglądarki