forked from github/szkolny
[Edudziennik] Implement base of the new e-register.
This commit is contained in:
parent
a09d943344
commit
90e7b1e9c7
@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
package pl.szczodrzynski.edziennik.data.api
|
package pl.szczodrzynski.edziennik.data.api
|
||||||
|
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login.EdudziennikLoginWeb
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.login.IdziennikLoginApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.login.IdziennikLoginApi
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.login.IdziennikLoginWeb
|
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.login.IdziennikLoginWeb
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLoginApi
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.login.LibrusLoginApi
|
||||||
@ -130,6 +131,14 @@ val idziennikLoginMethods = listOf(
|
|||||||
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_IDZIENNIK_WEB }
|
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_IDZIENNIK_WEB }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const val LOGIN_TYPE_EDUDZIENNIK = 5
|
||||||
|
const val LOGIN_METHOD_EDUDZIENNIK_WEB = 100
|
||||||
|
val edudziennikLoginMethods = listOf(
|
||||||
|
LoginMethod(LOGIN_TYPE_EDUDZIENNIK, LOGIN_METHOD_EDUDZIENNIK_WEB, EdudziennikLoginWeb::class.java)
|
||||||
|
.withIsPossible { _, _ -> true }
|
||||||
|
.withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED }
|
||||||
|
)
|
||||||
|
|
||||||
val templateLoginMethods = listOf(
|
val templateLoginMethods = listOf(
|
||||||
LoginMethod(LOGIN_TYPE_TEMPLATE, LOGIN_METHOD_TEMPLATE_WEB, TemplateLoginWeb::class.java)
|
LoginMethod(LOGIN_TYPE_TEMPLATE, LOGIN_METHOD_TEMPLATE_WEB, TemplateLoginWeb::class.java)
|
||||||
.withIsPossible { _, _ -> true }
|
.withIsPossible { _, _ -> true }
|
||||||
|
@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik
|
||||||
|
|
||||||
|
import okhttp3.Cookie
|
||||||
|
import pl.szczodrzynski.edziennik.App
|
||||||
|
import pl.szczodrzynski.edziennik.currentTimeUnix
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_TEMPLATE_API
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_TEMPLATE_WEB
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.models.Data
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile
|
||||||
|
import pl.szczodrzynski.edziennik.isNotNullNorEmpty
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use http://patorjk.com/software/taag/#p=display&f=Big for the ascii art
|
||||||
|
*
|
||||||
|
* Use https://codepen.io/kubasz/pen/RwwwbGN to easily generate the student data getters/setters
|
||||||
|
*/
|
||||||
|
class DataEdudziennik(app: App, profile: Profile?, loginStore: LoginStore) : Data(app, profile, loginStore) {
|
||||||
|
|
||||||
|
fun isWebLoginValid() = webExpiryTime-30 > currentTimeUnix() && webCookie.isNotNullNorEmpty()
|
||||||
|
fun isApiLoginValid() = apiExpiryTime-30 > currentTimeUnix() && apiToken.isNotNullNorEmpty()
|
||||||
|
|
||||||
|
override fun satisfyLoginMethods() {
|
||||||
|
loginMethods.clear()
|
||||||
|
if (isWebLoginValid()) {
|
||||||
|
loginMethods += LOGIN_METHOD_TEMPLATE_WEB
|
||||||
|
app.cookieJar.saveFromResponse(null, listOf(
|
||||||
|
Cookie.Builder()
|
||||||
|
.name("AuthCookie")
|
||||||
|
.value(webCookie!!)
|
||||||
|
.domain("eregister.example.com")
|
||||||
|
.secure().httpOnly().build()
|
||||||
|
))
|
||||||
|
}
|
||||||
|
if (isApiLoginValid())
|
||||||
|
loginMethods += LOGIN_METHOD_TEMPLATE_API
|
||||||
|
}
|
||||||
|
|
||||||
|
/* __ __ _
|
||||||
|
\ \ / / | |
|
||||||
|
\ \ /\ / /__| |__
|
||||||
|
\ \/ \/ / _ \ '_ \
|
||||||
|
\ /\ / __/ |_) |
|
||||||
|
\/ \/ \___|_._*/
|
||||||
|
private var mWebCookie: String? = null
|
||||||
|
var webCookie: String?
|
||||||
|
get() { mWebCookie = mWebCookie ?: profile?.getStudentData("webCookie", null); return mWebCookie }
|
||||||
|
set(value) { profile?.putStudentData("webCookie", value) ?: return; mWebCookie = value }
|
||||||
|
|
||||||
|
private var mWebExpiryTime: Long? = null
|
||||||
|
var webExpiryTime: Long
|
||||||
|
get() { mWebExpiryTime = mWebExpiryTime ?: profile?.getStudentData("webExpiryTime", 0L); return mWebExpiryTime ?: 0L }
|
||||||
|
set(value) { profile?.putStudentData("webExpiryTime", value) ?: return; mWebExpiryTime = value }
|
||||||
|
|
||||||
|
/* _
|
||||||
|
/\ (_)
|
||||||
|
/ \ _ __ _
|
||||||
|
/ /\ \ | '_ \| |
|
||||||
|
/ ____ \| |_) | |
|
||||||
|
/_/ \_\ .__/|_|
|
||||||
|
| |
|
||||||
|
|*/
|
||||||
|
private var mApiToken: String? = null
|
||||||
|
var apiToken: String?
|
||||||
|
get() { mApiToken = mApiToken ?: profile?.getStudentData("apiToken", null); return mApiToken }
|
||||||
|
set(value) { profile?.putStudentData("apiToken", value) ?: return; mApiToken = value }
|
||||||
|
|
||||||
|
private var mApiExpiryTime: Long? = null
|
||||||
|
var apiExpiryTime: Long
|
||||||
|
get() { mApiExpiryTime = mApiExpiryTime ?: profile?.getStudentData("apiExpiryTime", 0L); return mApiExpiryTime ?: 0L }
|
||||||
|
set(value) { profile?.putStudentData("apiExpiryTime", value) ?: return; mApiExpiryTime = value }
|
||||||
|
}
|
@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject
|
||||||
|
import pl.szczodrzynski.edziennik.App
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edudziennikLoginMethods
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikData
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.firstlogin.EdudziennikFirstLogin
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login.EdudziennikLogin
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikCallback
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.interfaces.EdziennikInterface
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.prepare
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.messages.Message
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.messages.MessageFull
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile
|
||||||
|
import pl.szczodrzynski.edziennik.utils.Utils.d
|
||||||
|
|
||||||
|
class Edudziennik(val app: App, val profile: Profile?, val loginStore: LoginStore, val callback: EdziennikCallback) : EdziennikInterface {
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "Edudziennik"
|
||||||
|
}
|
||||||
|
|
||||||
|
val internalErrorList = mutableListOf<Int>()
|
||||||
|
val data: DataEdudziennik
|
||||||
|
|
||||||
|
init {
|
||||||
|
data = DataEdudziennik(app, profile, loginStore).apply {
|
||||||
|
callback = wrapCallback(this@Edudziennik.callback)
|
||||||
|
satisfyLoginMethods()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun completed() {
|
||||||
|
data.saveData()
|
||||||
|
data.notify {
|
||||||
|
callback.onCompleted()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* _______ _ _ _ _ _
|
||||||
|
|__ __| | /\ | | (_) | | |
|
||||||
|
| | | |__ ___ / \ | | __ _ ___ _ __ _| |_| |__ _ __ ___
|
||||||
|
| | | '_ \ / _ \ / /\ \ | |/ _` |/ _ \| '__| | __| '_ \| '_ ` _ \
|
||||||
|
| | | | | | __/ / ____ \| | (_| | (_) | | | | |_| | | | | | | | |
|
||||||
|
|_| |_| |_|\___| /_/ \_\_|\__, |\___/|_| |_|\__|_| |_|_| |_| |_|
|
||||||
|
__/ |
|
||||||
|
|__*/
|
||||||
|
override fun sync(featureIds: List<Int>, viewId: Int?, arguments: JsonObject?) {
|
||||||
|
data.arguments = arguments
|
||||||
|
data.prepare(edudziennikLoginMethods, EdudziennikFeatures, featureIds, viewId)
|
||||||
|
d(TAG, "LoginMethod IDs: ${data.targetLoginMethodIds}")
|
||||||
|
d(TAG, "Endpoint IDs: ${data.targetEndpointIds}")
|
||||||
|
EdudziennikLogin(data) {
|
||||||
|
EdudziennikData(data) {
|
||||||
|
completed()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getMessage(message: MessageFull) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun markAllAnnouncementsAsRead() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getAttachment(message: Message, attachmentId: Long, attachmentName: String) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun firstLogin() {
|
||||||
|
EdudziennikFirstLogin(data) {
|
||||||
|
completed()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun cancel() {
|
||||||
|
d(TAG, "Cancelled")
|
||||||
|
data.cancel()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {
|
||||||
|
return object : EdziennikCallback {
|
||||||
|
override fun onCompleted() {
|
||||||
|
callback.onCompleted()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onProgress(step: Float) {
|
||||||
|
callback.onProgress(step)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onStartProgress(stringRes: Int) {
|
||||||
|
callback.onStartProgress(stringRes)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onError(apiError: ApiError) {
|
||||||
|
when (apiError.errorCode) {
|
||||||
|
in internalErrorList -> {
|
||||||
|
// finish immediately if the same error occurs twice during the same sync
|
||||||
|
callback.onError(apiError)
|
||||||
|
}
|
||||||
|
else -> callback.onError(apiError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2019-12-23
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik
|
||||||
|
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.models.Feature
|
||||||
|
|
||||||
|
const val ENDPOINT_TEMPLATE_WEB_SAMPLE = 9991
|
||||||
|
const val ENDPOINT_TEMPLATE_WEB_SAMPLE_2 = 9992
|
||||||
|
const val ENDPOINT_TEMPLATE_API_SAMPLE = 9993
|
||||||
|
|
||||||
|
val EdudziennikFeatures = listOf(
|
||||||
|
Feature(LOGIN_TYPE_TEMPLATE, FEATURE_STUDENT_INFO, listOf(
|
||||||
|
ENDPOINT_TEMPLATE_WEB_SAMPLE to LOGIN_METHOD_TEMPLATE_WEB
|
||||||
|
), listOf(LOGIN_METHOD_TEMPLATE_WEB)),
|
||||||
|
Feature(LOGIN_TYPE_TEMPLATE, FEATURE_SCHOOL_INFO, listOf(
|
||||||
|
ENDPOINT_TEMPLATE_WEB_SAMPLE_2 to LOGIN_METHOD_TEMPLATE_WEB
|
||||||
|
), listOf(LOGIN_METHOD_TEMPLATE_WEB)),
|
||||||
|
Feature(LOGIN_TYPE_TEMPLATE, FEATURE_GRADES, listOf(
|
||||||
|
ENDPOINT_TEMPLATE_API_SAMPLE to LOGIN_METHOD_TEMPLATE_API
|
||||||
|
), listOf(LOGIN_METHOD_TEMPLATE_API))
|
||||||
|
)
|
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject
|
||||||
|
import pl.szczodrzynski.edziennik.currentTimeUnix
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.ERROR_TEMPLATE_WEB_OTHER
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.GET
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
|
|
||||||
|
open class EdudziennikApi(open val data: DataEdudziennik) {
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "TemplateApi"
|
||||||
|
}
|
||||||
|
|
||||||
|
val profileId
|
||||||
|
get() = data.profile?.id ?: -1
|
||||||
|
|
||||||
|
val profile
|
||||||
|
get() = data.profile
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This will be used by all TemplateApi* endpoints.
|
||||||
|
*
|
||||||
|
* You can customize this method's parameters to best fit the implemented e-register.
|
||||||
|
* Just make sure that [tag] and [onSuccess] is present.
|
||||||
|
*/
|
||||||
|
fun apiGet(tag: String, endpoint: String, method: Int = GET, payload: JsonObject? = null, onSuccess: (json: JsonObject?) -> Unit) {
|
||||||
|
val json = JsonObject()
|
||||||
|
json.addProperty("foo", "bar")
|
||||||
|
json.addProperty("sample", "text")
|
||||||
|
|
||||||
|
if (currentTimeUnix() % 4L == 0L) {
|
||||||
|
// let's set a 20% chance of error, just as a test
|
||||||
|
data.error(ApiError(tag, ERROR_TEMPLATE_WEB_OTHER)
|
||||||
|
.withApiResponse("404 Not Found - this is the text returned by the API"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
onSuccess(json)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data
|
||||||
|
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
||||||
|
import pl.szczodrzynski.edziennik.utils.Utils
|
||||||
|
|
||||||
|
class EdudziennikData(val data: DataEdudziennik, val onSuccess: () -> Unit) {
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "TemplateData"
|
||||||
|
}
|
||||||
|
|
||||||
|
init {
|
||||||
|
nextEndpoint(onSuccess)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun nextEndpoint(onSuccess: () -> Unit) {
|
||||||
|
if (data.targetEndpointIds.isEmpty()) {
|
||||||
|
onSuccess()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (data.cancelled) {
|
||||||
|
onSuccess()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
useEndpoint(data.targetEndpointIds.removeAt(0)) {
|
||||||
|
data.progress(data.progressStep)
|
||||||
|
nextEndpoint(onSuccess)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun useEndpoint(endpointId: Int, onSuccess: () -> Unit) {
|
||||||
|
Utils.d(TAG, "Using endpoint $endpointId")
|
||||||
|
when (endpointId) {
|
||||||
|
// TODO
|
||||||
|
else -> onSuccess()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject
|
||||||
|
import pl.szczodrzynski.edziennik.currentTimeUnix
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.ERROR_TEMPLATE_WEB_OTHER
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.GET
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
|
|
||||||
|
open class EdudziennikWeb(open val data: DataEdudziennik) {
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "TemplateWeb"
|
||||||
|
}
|
||||||
|
|
||||||
|
val profileId
|
||||||
|
get() = data.profile?.id ?: -1
|
||||||
|
|
||||||
|
val profile
|
||||||
|
get() = data.profile
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This will be used by all TemplateWeb* endpoints.
|
||||||
|
*
|
||||||
|
* You can customize this method's parameters to best fit the implemented e-register.
|
||||||
|
* Just make sure that [tag] and [onSuccess] is present.
|
||||||
|
*/
|
||||||
|
fun webGet(tag: String, endpoint: String, method: Int = GET, payload: JsonObject? = null, onSuccess: (json: JsonObject?) -> Unit) {
|
||||||
|
val json = JsonObject()
|
||||||
|
json.addProperty("foo", "bar")
|
||||||
|
json.addProperty("sample", "text")
|
||||||
|
|
||||||
|
if (currentTimeUnix() % 4L == 0L) {
|
||||||
|
// let's set a 20% chance of error, just as a test
|
||||||
|
data.error(ApiError(tag, ERROR_TEMPLATE_WEB_OTHER)
|
||||||
|
.withApiResponse("404 Not Found - this is the text returned by the API"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
onSuccess(json)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.firstlogin
|
||||||
|
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikApi
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.data.EdudziennikWeb
|
||||||
|
import pl.szczodrzynski.edziennik.data.db.modules.profiles.Profile
|
||||||
|
|
||||||
|
class EdudziennikFirstLogin(val data: DataEdudziennik, val onSuccess: () -> Unit) {
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "TemplateFirstLogin"
|
||||||
|
}
|
||||||
|
|
||||||
|
private val web = EdudziennikWeb(data)
|
||||||
|
private val api = EdudziennikApi(data)
|
||||||
|
private val profileList = mutableListOf<Profile>()
|
||||||
|
|
||||||
|
init {
|
||||||
|
/*TemplateLoginWeb(data) {
|
||||||
|
web.webGet(TAG, "get all accounts") { text ->
|
||||||
|
//val accounts = json.getJsonArray("accounts")
|
||||||
|
|
||||||
|
EventBus.getDefault().post(FirstLoginFinishedEvent(profileList, data.loginStore))
|
||||||
|
onSuccess()
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login
|
||||||
|
|
||||||
|
import pl.szczodrzynski.edziennik.R
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.LOGIN_METHOD_EDUDZIENNIK_WEB
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
||||||
|
import pl.szczodrzynski.edziennik.utils.Utils
|
||||||
|
|
||||||
|
class EdudziennikLogin(val data: DataEdudziennik, val onSuccess: () -> Unit) {
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "EdudziennikLogin"
|
||||||
|
}
|
||||||
|
|
||||||
|
private var cancelled = false
|
||||||
|
|
||||||
|
init {
|
||||||
|
nextLoginMethod(onSuccess)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun nextLoginMethod(onSuccess: () -> Unit) {
|
||||||
|
if (data.targetLoginMethodIds.isEmpty()) {
|
||||||
|
onSuccess()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (cancelled) {
|
||||||
|
onSuccess()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
useLoginMethod(data.targetLoginMethodIds.removeAt(0)) { usedMethodId ->
|
||||||
|
data.progress(data.progressStep)
|
||||||
|
if (usedMethodId != -1)
|
||||||
|
data.loginMethods.add(usedMethodId)
|
||||||
|
nextLoginMethod(onSuccess)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun useLoginMethod(loginMethodId: Int, onSuccess: (usedMethodId: Int) -> Unit) {
|
||||||
|
// this should never be true
|
||||||
|
if (data.loginMethods.contains(loginMethodId)) {
|
||||||
|
onSuccess(-1)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Utils.d(TAG, "Using login method $loginMethodId")
|
||||||
|
when (loginMethodId) {
|
||||||
|
LOGIN_METHOD_EDUDZIENNIK_WEB -> {
|
||||||
|
data.startProgress(R.string.edziennik_progress_login_template_web)
|
||||||
|
EdudziennikLoginWeb(data) { onSuccess(loginMethodId) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2019-12-22
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login
|
||||||
|
|
||||||
|
import okhttp3.Cookie
|
||||||
|
import pl.szczodrzynski.edziennik.currentTimeUnix
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.ERROR_LOGIN_DATA_MISSING
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.ERROR_PROFILE_MISSING
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.DataEdudziennik
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.models.ApiError
|
||||||
|
|
||||||
|
class EdudziennikLoginWeb(val data: DataEdudziennik, val onSuccess: () -> Unit) {
|
||||||
|
companion object {
|
||||||
|
private const val TAG = "EdudziennikLoginWeb"
|
||||||
|
}
|
||||||
|
|
||||||
|
init { run {
|
||||||
|
if (data.profile == null) {
|
||||||
|
data.error(ApiError(TAG, ERROR_PROFILE_MISSING))
|
||||||
|
return@run
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.isWebLoginValid()) {
|
||||||
|
data.app.cookieJar.saveFromResponse(null, listOf(
|
||||||
|
Cookie.Builder()
|
||||||
|
.name("AuthCookie")
|
||||||
|
.value(data.webCookie!!)
|
||||||
|
.domain("eregister.example.com")
|
||||||
|
.secure().httpOnly().build()
|
||||||
|
))
|
||||||
|
onSuccess()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
data.app.cookieJar.clearForDomain("eregister.example.com")
|
||||||
|
if (/*data.webLogin != null && data.webPassword != null && */true) {
|
||||||
|
loginWithCredentials()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
data.error(ApiError(TAG, ERROR_LOGIN_DATA_MISSING))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
|
||||||
|
fun loginWithCredentials() {
|
||||||
|
// succeed immediately
|
||||||
|
|
||||||
|
data.webCookie = "ThisIsACookie"
|
||||||
|
data.webExpiryTime = currentTimeUnix() + 45 * 60 /* 45min */
|
||||||
|
onSuccess()
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,7 @@ import com.google.gson.JsonObject
|
|||||||
import pl.szczodrzynski.edziennik.App
|
import pl.szczodrzynski.edziennik.App
|
||||||
import pl.szczodrzynski.edziennik.R
|
import pl.szczodrzynski.edziennik.R
|
||||||
import pl.szczodrzynski.edziennik.data.api.*
|
import pl.szczodrzynski.edziennik.data.api.*
|
||||||
|
import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.Edudziennik
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.Idziennik
|
import pl.szczodrzynski.edziennik.data.api.edziennik.idziennik.Idziennik
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.Librus
|
import pl.szczodrzynski.edziennik.data.api.edziennik.librus.Librus
|
||||||
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.Mobidziennik
|
import pl.szczodrzynski.edziennik.data.api.edziennik.mobidziennik.Mobidziennik
|
||||||
@ -59,6 +60,7 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
|
|||||||
LOGIN_TYPE_MOBIDZIENNIK -> Mobidziennik(app, profile, loginStore, taskCallback)
|
LOGIN_TYPE_MOBIDZIENNIK -> Mobidziennik(app, profile, loginStore, taskCallback)
|
||||||
LOGIN_TYPE_VULCAN -> Vulcan(app, profile, loginStore, taskCallback)
|
LOGIN_TYPE_VULCAN -> Vulcan(app, profile, loginStore, taskCallback)
|
||||||
LOGIN_TYPE_IDZIENNIK -> Idziennik(app, profile, loginStore, taskCallback)
|
LOGIN_TYPE_IDZIENNIK -> Idziennik(app, profile, loginStore, taskCallback)
|
||||||
|
LOGIN_TYPE_EDUDZIENNIK -> Edudziennik(app, profile, loginStore, taskCallback)
|
||||||
LOGIN_TYPE_TEMPLATE -> Template(app, profile, loginStore, taskCallback)
|
LOGIN_TYPE_TEMPLATE -> Template(app, profile, loginStore, taskCallback)
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,7 @@ public class LoginChooserFragment extends Fragment {
|
|||||||
b.loginLibrusJstLogo.setOnClickListener((v) -> nav.navigate(R.id.loginLibrusJstFragment, null, LoginActivity.navOptions));
|
b.loginLibrusJstLogo.setOnClickListener((v) -> nav.navigate(R.id.loginLibrusJstFragment, null, LoginActivity.navOptions));
|
||||||
b.loginVulcanLogo.setOnClickListener((v) -> nav.navigate(R.id.loginVulcanFragment, null, LoginActivity.navOptions));
|
b.loginVulcanLogo.setOnClickListener((v) -> nav.navigate(R.id.loginVulcanFragment, null, LoginActivity.navOptions));
|
||||||
b.loginIuczniowieLogo.setOnClickListener((v) -> nav.navigate(R.id.loginIuczniowieFragment, null, LoginActivity.navOptions));
|
b.loginIuczniowieLogo.setOnClickListener((v) -> nav.navigate(R.id.loginIuczniowieFragment, null, LoginActivity.navOptions));
|
||||||
|
b.loginEdudziennikLogo.setOnClickListener((v) -> nav.navigate(R.id.loginEdudziennikFragment, null, LoginActivity.navOptions));
|
||||||
|
|
||||||
if (LoginActivity.firstCompleted) {
|
if (LoginActivity.firstCompleted) {
|
||||||
// we are navigated here from LoginSummary
|
// we are navigated here from LoginSummary
|
||||||
|
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) Kacper Ziubryniewicz 2019-12-23
|
||||||
|
*/
|
||||||
|
|
||||||
|
package pl.szczodrzynski.edziennik.ui.modules.login
|
||||||
|
|
||||||
|
import android.os.Bundle
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.fragment.app.Fragment
|
||||||
|
import androidx.navigation.NavController
|
||||||
|
import androidx.navigation.Navigation
|
||||||
|
import pl.szczodrzynski.edziennik.App
|
||||||
|
import pl.szczodrzynski.edziennik.R
|
||||||
|
import pl.szczodrzynski.edziennik.databinding.FragmentLoginEdudziennikBinding
|
||||||
|
import pl.szczodrzynski.edziennik.ui.modules.error.ErrorSnackbar
|
||||||
|
|
||||||
|
class LoginEdudziennikFragment : Fragment() {
|
||||||
|
|
||||||
|
private val app by lazy { activity?.application as App? }
|
||||||
|
|
||||||
|
private lateinit var b: FragmentLoginEdudziennikBinding
|
||||||
|
|
||||||
|
private lateinit var nav: NavController
|
||||||
|
private lateinit var errorSnackbar: ErrorSnackbar
|
||||||
|
|
||||||
|
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
|
||||||
|
activity?.also { activity ->
|
||||||
|
nav = Navigation.findNavController(activity, R.id.nav_host_fragment)
|
||||||
|
errorSnackbar = (activity as LoginActivity).errorSnackbar
|
||||||
|
}
|
||||||
|
|
||||||
|
b = FragmentLoginEdudziennikBinding.inflate(inflater, container, false)
|
||||||
|
return b.root
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
BIN
app/src/main/res/drawable-hdpi/login_logo_edudziennik.png
Normal file
BIN
app/src/main/res/drawable-hdpi/login_logo_edudziennik.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.8 KiB |
@ -184,18 +184,17 @@
|
|||||||
android:layout_height="100dp"
|
android:layout_height="100dp"
|
||||||
android:layout_marginStart="16dp"
|
android:layout_marginStart="16dp"
|
||||||
android:layout_marginLeft="16dp"
|
android:layout_marginLeft="16dp"
|
||||||
android:layout_weight="1"
|
android:layout_weight="1">
|
||||||
android:visibility="invisible">
|
|
||||||
|
|
||||||
<!--<ImageView
|
<ImageView
|
||||||
android:id="@+id/loginIuczniowieLogo"
|
android:id="@+id/loginEdudziennikLogo"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:adjustViewBounds="true"
|
android:adjustViewBounds="true"
|
||||||
android:background="@drawable/bg_rounded_ripple"
|
android:background="@drawable/bg_rounded_ripple"
|
||||||
android:padding="16dp"
|
android:padding="16dp"
|
||||||
android:scaleType="fitCenter"
|
android:scaleType="fitCenter"
|
||||||
app:srcCompat="@drawable/login_logo_iuczniowie" />-->
|
app:srcCompat="@drawable/login_logo_edudziennik" />
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
@ -247,4 +246,4 @@
|
|||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
</layout>
|
</layout>
|
||||||
|
173
app/src/main/res/layout/fragment_login_edudziennik.xml
Normal file
173
app/src/main/res/layout/fragment_login_edudziennik.xml
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright (c) Kacper Ziubryniewicz 2019-12-23
|
||||||
|
-->
|
||||||
|
|
||||||
|
<layout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||||
|
android:id="@+id/root"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<ScrollView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<com.mikepenz.iconics.view.IconicsImageView
|
||||||
|
android:layout_width="32dp"
|
||||||
|
android:layout_height="32dp"
|
||||||
|
android:layout_marginStart="24dp"
|
||||||
|
android:layout_marginLeft="24dp"
|
||||||
|
android:layout_marginTop="48dp"
|
||||||
|
app:iiv_color="@color/colorPrimary"
|
||||||
|
app:iiv_icon="cmd-account-circle"
|
||||||
|
app:iiv_size="32dp"
|
||||||
|
tools:srcCompat="@tools:sample/avatars" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="24dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:layout_marginRight="24dp"
|
||||||
|
android:text="@string/login_edudziennik_title"
|
||||||
|
android:textSize="24sp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="24dp"
|
||||||
|
android:layout_marginTop="2dp"
|
||||||
|
android:layout_marginRight="24dp"
|
||||||
|
android:text="@string/login_edudziennik_subtitle" />
|
||||||
|
|
||||||
|
<Space
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="16dp" />
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/loginEmailLayout"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:hint="@string/login_hint_email"
|
||||||
|
app:errorEnabled="true"
|
||||||
|
app:hintAnimationEnabled="true"
|
||||||
|
app:hintEnabled="true">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/loginEmail"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:inputType="textNoSuggestions|textEmailAddress" />
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputLayout
|
||||||
|
android:id="@+id/loginPasswordLayout"
|
||||||
|
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:hint="@string/login_hint_password"
|
||||||
|
app:errorEnabled="true"
|
||||||
|
app:hintAnimationEnabled="true"
|
||||||
|
app:hintEnabled="true"
|
||||||
|
app:passwordToggleEnabled="true">
|
||||||
|
|
||||||
|
<com.google.android.material.textfield.TextInputEditText
|
||||||
|
android:id="@+id/loginPassword"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:inputType="textPassword" />
|
||||||
|
</com.google.android.material.textfield.TextInputLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<!--<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/helpButton"
|
||||||
|
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="16dp"
|
||||||
|
android:layout_marginLeft="16dp"
|
||||||
|
android:text="@string/login_help_button"
|
||||||
|
android:textAllCaps="false" />-->
|
||||||
|
|
||||||
|
<Space
|
||||||
|
android:layout_width="0.0dip"
|
||||||
|
android:layout_height="0.0dip"
|
||||||
|
android:layout_weight="1.0" />
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/loginButton"
|
||||||
|
style="@style/Widget.MaterialComponents.Button"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="end"
|
||||||
|
android:layout_marginTop="8dp"
|
||||||
|
android:layout_marginEnd="16dp"
|
||||||
|
android:layout_marginRight="16dp"
|
||||||
|
android:text="@string/login_button"
|
||||||
|
android:textAllCaps="false" />
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</LinearLayout>
|
||||||
|
</ScrollView>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginBottom="16dp"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/backButton"
|
||||||
|
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginLeft="8dp"
|
||||||
|
android:text="@string/back"
|
||||||
|
android:textAllCaps="false"
|
||||||
|
android:layout_marginStart="8dp" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||||
|
</layout>
|
@ -125,6 +125,18 @@
|
|||||||
android:id="@+id/action_loginVulcanFragment_to_loginProgressFragment"
|
android:id="@+id/action_loginVulcanFragment_to_loginProgressFragment"
|
||||||
app:destination="@id/loginProgressFragment" />
|
app:destination="@id/loginProgressFragment" />
|
||||||
</fragment>
|
</fragment>
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/loginEdudziennikFragment"
|
||||||
|
android:name="pl.szczodrzynski.edziennik.ui.modules.login.LoginEdudziennikFragment"
|
||||||
|
android:label="fragment_login_edudziennik"
|
||||||
|
tools:layout="@layout/fragment_login_edudziennik" >
|
||||||
|
<!--<action
|
||||||
|
android:id="@+id/action_loginLibrusFragment_to_loginLibrusHelpFragment"
|
||||||
|
app:destination="@id/loginLibrusHelpFragment" />-->
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_loginEdudziennikFragment_to_loginProgressFragment"
|
||||||
|
app:destination="@id/loginProgressFragment" />
|
||||||
|
</fragment>
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/loginVulcanHelpFragment"
|
android:id="@+id/loginVulcanHelpFragment"
|
||||||
android:name="pl.szczodrzynski.edziennik.ui.modules.login.LoginVulcanHelpFragment"
|
android:name="pl.szczodrzynski.edziennik.ui.modules.login.LoginVulcanHelpFragment"
|
||||||
|
@ -1126,4 +1126,6 @@
|
|||||||
<string name="widget_timetable_short_no_lessons">Brak lekcji przez nast. 7 dni.</string>
|
<string name="widget_timetable_short_no_lessons">Brak lekcji przez nast. 7 dni.</string>
|
||||||
<string name="no_lessons_today">Nie ma dzisiaj żadnych lekcji!</string>
|
<string name="no_lessons_today">Nie ma dzisiaj żadnych lekcji!</string>
|
||||||
<string name="lessons_finished">Nie ma dzisiaj więcej lekcji!</string>
|
<string name="lessons_finished">Nie ma dzisiaj więcej lekcji!</string>
|
||||||
|
<string name="login_edudziennik_title">Zaloguj się - Edudziennik</string>
|
||||||
|
<string name="login_edudziennik_subtitle">Użyj danych, którymi logujesz się do wersji komputerowej Edudziennika.</string>
|
||||||
</resources>
|
</resources>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user