From 4b5c14cbd5b62e44f6cd4def18c3fc27d29339e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Fri, 20 Sep 2019 19:12:05 +0200 Subject: [PATCH] APIv2: Prepare schemes --- .idea/copyright/kubasz.xml | 6 ++++ .idea/copyright/profiles_settings.xml | 3 ++ .../edziennik/api/v2/Constants.kt | 21 +++++++++++ .../edziennik/api/v2/Endpoints.kt | 36 +++++++++++++++++++ .../edziennik/api/v2/LoginMethods.kt | 6 ++++ .../api/v2/interfaces/ILoginMethod.kt | 4 +++ .../edziennik/api/v2/librus/Librus.kt | 2 +- .../api/v2/librus/data/LibrusApiGrades.kt | 18 ++++++++++ .../v2/librus/data/LibrusSynergiaGrades.kt | 4 +++ .../edziennik/api/v2/librus/login/LoginJst.kt | 11 ++++-- .../api/v2/{ => models}/ApiLoginResult.kt | 2 +- .../edziennik/api/v2/models/DataEndpoint.kt | 4 --- .../edziennik/api/v2/models/DataStore.kt | 5 +++ .../edziennik/api/v2/models/Endpoint.kt | 26 ++++++++++++++ .../edziennik/api/v2/models/Feature.kt | 2 ++ .../api/v2/{ => models}/FirstLoginResult.kt | 2 +- .../edziennik/api/v2/models/LoginMethod.kt | 29 +++++++++++++++ 17 files changed, 172 insertions(+), 9 deletions(-) create mode 100644 .idea/copyright/kubasz.xml create mode 100644 .idea/copyright/profiles_settings.xml create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/api/v2/Endpoints.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/api/v2/LoginMethods.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/api/v2/interfaces/ILoginMethod.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusApiGrades.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusSynergiaGrades.kt rename app/src/main/java/pl/szczodrzynski/edziennik/api/v2/{ => models}/ApiLoginResult.kt (78%) delete mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/DataEndpoint.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/Endpoint.kt rename app/src/main/java/pl/szczodrzynski/edziennik/api/v2/{ => models}/FirstLoginResult.kt (79%) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/LoginMethod.kt diff --git a/.idea/copyright/kubasz.xml b/.idea/copyright/kubasz.xml new file mode 100644 index 00000000..2a54803f --- /dev/null +++ b/.idea/copyright/kubasz.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 00000000..61f16974 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/Constants.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/Constants.kt index 3aae0da1..0fa7e319 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/Constants.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/Constants.kt @@ -1,5 +1,10 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2019-9-19. + */ + package pl.szczodrzynski.edziennik.api.v2 +internal const val FEATURE_ANY = -1 const val FEATURE_ALL = 0 const val FEATURE_TIMETABLE = 1 const val FEATURE_AGENDA = 2 @@ -17,9 +22,25 @@ const val LOGIN_TYPE_IUCZNIOWIE = 3 const val LOGIN_TYPE_VULCAN = 4 const val LOGIN_TYPE_DEMO = 20 +// LOGIN MODES const val LOGIN_MODE_LIBRUS_EMAIL = 0 const val LOGIN_MODE_LIBRUS_SYNERGIA = 1 const val LOGIN_MODE_LIBRUS_JST = 2 +const val LOGIN_MODE_MOBIDZIENNIK_WEB = 0 +const val LOGIN_MODE_IDZIENNIK_WEB = 0 +const val LOGIN_MODE_VULCAN_WEB = 0 + +// LOGIN METHODS +const val LOGIN_METHOD_NOT_NEEDED = -1 +const val LOGIN_METHOD_LIBRUS_PORTAL = 0 +const val LOGIN_METHOD_LIBRUS_API = 1 +const val LOGIN_METHOD_LIBRUS_SYNERGIA = 2 +const val LOGIN_METHOD_LIBRUS_MESSAGES = 3 +const val LOGIN_METHOD_MOBIDZIENNIK_API = 0 +const val LOGIN_METHOD_IDZIENNIK_WEB = 0 +const val LOGIN_METHOD_IDZIENNIK_API = 1 +const val LOGIN_METHOD_VULCAN_WEB = 0 +const val LOGIN_METHOD_VULCAN_API = 1 const val LIBRUS_USER_AGENT = "Dalvik/2.1.0 Android LibrusMobileApp" const val LIBRUS_CLIENT_ID = "wmSyUMo8llDAs4y9tJVYY92oyZ6h4lAt7KCuy0Gv" diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/Endpoints.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/Endpoints.kt new file mode 100644 index 00000000..bcbc0cc9 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/Endpoints.kt @@ -0,0 +1,36 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2019-9-20. + */ + +package pl.szczodrzynski.edziennik.api.v2 + +import android.util.Log +import pl.szczodrzynski.edziennik.api.v2.librus.data.LibrusApiGrades +import pl.szczodrzynski.edziennik.api.v2.librus.data.LibrusSynergiaGrades +import pl.szczodrzynski.edziennik.api.v2.models.Endpoint + +const val ENDPOINT_LIBRUS_API_ME = 0 +const val ENDPOINT_LIBRUS_API_GRADES = 0 +const val ENDPOINT_LIBRUS_SYNERGIA_GRADES = 0 + +val librusEndpoints = listOf( + Endpoint(LOGIN_TYPE_LIBRUS, 1, listOf(), LibrusSynergiaGrades::class.java) { _, _ -> LOGIN_METHOD_LIBRUS_SYNERGIA }, + Endpoint(LOGIN_TYPE_LIBRUS, 1, listOf(), LibrusApiGrades::class.java) { _, _ -> LOGIN_METHOD_LIBRUS_API } +) + +/* + SYNC: + + look up all endpoints for the given API and given features + + load "next sync timers" for every endpoint + + exclude every endpoint which does not need to sync now + + check all needed login methods + create a login method list, using methods' dependencies as well + use all login methods, saving completed logins to data store + + instantiate all endpoint classes and sync them (writing to data store, returns onSuccess or error Callback) + + */ diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/LoginMethods.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/LoginMethods.kt new file mode 100644 index 00000000..aed463b5 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/LoginMethods.kt @@ -0,0 +1,6 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2019-9-20. + */ + +package pl.szczodrzynski.edziennik.api.v2 + diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/interfaces/ILoginMethod.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/interfaces/ILoginMethod.kt new file mode 100644 index 00000000..440a5693 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/interfaces/ILoginMethod.kt @@ -0,0 +1,4 @@ +package pl.szczodrzynski.edziennik.api.v2.interfaces + +interface ILoginMethod { +} \ No newline at end of file diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/Librus.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/Librus.kt index 8ba1f79e..82544fa6 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/Librus.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/Librus.kt @@ -99,7 +99,7 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore) : | |__| |____) | | | \____/|_____/ |*/ private fun loginJst() { - LoginJst(app, loginStore, syncCallback) { + LoginJst(app, null, loginStore, syncCallback) { if (profile == null) { firstLoginSynergia() return@LoginJst diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusApiGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusApiGrades.kt new file mode 100644 index 00000000..261a4476 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusApiGrades.kt @@ -0,0 +1,18 @@ +package pl.szczodrzynski.edziennik.api.v2.librus.data + +import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.api.interfaces.ProgressCallback +import pl.szczodrzynski.edziennik.api.v2.models.DataStore +import pl.szczodrzynski.edziennik.datamodels.LoginStore +import pl.szczodrzynski.edziennik.datamodels.Profile + +class LibrusGrades(val app: App, + val profile: Profile, + val loginStore: LoginStore, + val dataStore: DataStore, + val callback: ProgressCallback, + val onSuccess: () -> Unit) { + init { + + } +} \ No newline at end of file diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusSynergiaGrades.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusSynergiaGrades.kt new file mode 100644 index 00000000..a1693141 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusSynergiaGrades.kt @@ -0,0 +1,4 @@ +package pl.szczodrzynski.edziennik.api.v2.librus.data + +class LibrusSynergiaGrades { +} \ No newline at end of file diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LoginJst.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LoginJst.kt index 78ed7672..f21290eb 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LoginJst.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LoginJst.kt @@ -2,10 +2,17 @@ package pl.szczodrzynski.edziennik.api.v2.librus.login import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.api.interfaces.ProgressCallback -import pl.szczodrzynski.edziennik.api.v2.ApiLoginResult +import pl.szczodrzynski.edziennik.api.v2.interfaces.ILoginMethod import pl.szczodrzynski.edziennik.datamodels.LoginStore +import pl.szczodrzynski.edziennik.datamodels.Profile -class LoginJst(val app: App, val loginStore: LoginStore, val callback: ProgressCallback, val onSuccess: () -> Unit) { +class LoginJst( + app: App, + profile: Profile?, + loginStore: LoginStore, + callback: ProgressCallback, + onSuccess: () -> Unit +): ILoginMethod(app, profile, loginStore, callback, onSuccess) { companion object { private const val TAG = "librus.LoginJst" } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/ApiLoginResult.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/ApiLoginResult.kt similarity index 78% rename from app/src/main/java/pl/szczodrzynski/edziennik/api/v2/ApiLoginResult.kt rename to app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/ApiLoginResult.kt index 30b0edad..366f7a73 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/ApiLoginResult.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/ApiLoginResult.kt @@ -1,4 +1,4 @@ -package pl.szczodrzynski.edziennik.api.v2 +package pl.szczodrzynski.edziennik.api.v2.models import pl.szczodrzynski.edziennik.api.AppError import pl.szczodrzynski.edziennik.datamodels.LoginStore diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/DataEndpoint.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/DataEndpoint.kt deleted file mode 100644 index 0505dac3..00000000 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/DataEndpoint.kt +++ /dev/null @@ -1,4 +0,0 @@ -package pl.szczodrzynski.edziennik.api.v2.models - -class DataEndpoint() { -} \ No newline at end of file diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/DataStore.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/DataStore.kt index 552340fa..23d500a8 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/DataStore.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/DataStore.kt @@ -7,6 +7,9 @@ import pl.szczodrzynski.edziennik.datamodels.* import pl.szczodrzynski.edziennik.models.Date data class DataStore(private val appDb: AppDb, val profileId: Int) { + + val loginMethods = mutableListOf() + val teacherList: LongSparseArray = LongSparseArray() val subjectList: LongSparseArray = LongSparseArray() val teamList = mutableListOf() @@ -43,6 +46,8 @@ data class DataStore(private val appDb: AppDb, val profileId: Int) { } fun clear() { + loginMethods.clear() + teacherList.clear() subjectList.clear() teamList.clear() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/Endpoint.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/Endpoint.kt new file mode 100644 index 00000000..d760b3ab --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/Endpoint.kt @@ -0,0 +1,26 @@ +package pl.szczodrzynski.edziennik.api.v2.models + +import pl.szczodrzynski.edziennik.datamodels.LoginStore +import pl.szczodrzynski.edziennik.datamodels.Profile + +/** + * A Endpoint descriptor class. + * + * The API runs appropriate endpoints in order to fulfill its + * [Feature] list. + * An endpoint may have its [LoginMethod] dependencies which will be + * satisfied by the API before the [endpointClass]'s constructor is invoked. + * + * @param loginType type of the e-register this endpoint handles + * @param endpointId a unique ID of this endpoint + * @param featureIds a [List] of [Feature]s (their IDs) this endpoint can download + * @param endpointClass a [Class] which constructor will be invoked when a data download is needed + * @param requiredLoginMethod a lambda returning a required login method (which will be called before this). May differ depending on the [Profile] and/or [LoginStore]. + */ +class Endpoint( + val loginType: Int, + val endpointId: Int, + val featureIds: List, + val endpointClass: Class<*>, + val requiredLoginMethod: (profile: Profile?, loginStore: LoginStore) -> Int +) \ No newline at end of file diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/Feature.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/Feature.kt index b502fe85..f83c4801 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/Feature.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/Feature.kt @@ -1,5 +1,7 @@ package pl.szczodrzynski.edziennik.api.v2.models +import pl.szczodrzynski.edziennik.api.v2.endpoint + data class Feature(val featureId: Int, val loginOptions: Map>) { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/FirstLoginResult.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/FirstLoginResult.kt similarity index 79% rename from app/src/main/java/pl/szczodrzynski/edziennik/api/v2/FirstLoginResult.kt rename to app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/FirstLoginResult.kt index 92d3da9e..362846fd 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/FirstLoginResult.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/FirstLoginResult.kt @@ -1,4 +1,4 @@ -package pl.szczodrzynski.edziennik.api.v2 +package pl.szczodrzynski.edziennik.api.v2.models import pl.szczodrzynski.edziennik.api.AppError import pl.szczodrzynski.edziennik.datamodels.Profile diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/LoginMethod.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/LoginMethod.kt new file mode 100644 index 00000000..9b00bf0b --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/models/LoginMethod.kt @@ -0,0 +1,29 @@ +/* + * Copyright (c) Kuba Szczodrzyński 2019-9-20. + */ + +package pl.szczodrzynski.edziennik.api.v2.models + +import pl.szczodrzynski.edziennik.datamodels.LoginStore +import pl.szczodrzynski.edziennik.datamodels.Profile + +/** + * A Login Method descriptor class. + * + * This is used by the API to satisfy all [Endpoint]s' dependencies. + * A login method may have its own dependencies which need to be + * satisfied before the [loginMethodClass]'s constructor is invoked. + * + * @param loginType type of the e-register this login method handles + * @param loginMethodId a unique ID of this login method + * @param featureIds a [List] of [Feature]s (their IDs) this login method can provide access to + * @param loginMethodClass a [Class] which constructor will be invoked when a log in is needed + * @param requiredLoginMethod a lambda returning a required login method (which will be called before this). May differ depending on the [Profile] and/or [LoginStore]. + */ +class LoginMethod( + val loginType: Int, + val loginMethodId: Int, + val featureIds: List, + val loginMethodClass: Class<*>, + val requiredLoginMethod: (profile: Profile?, loginStore: LoginStore) -> Int +) \ No newline at end of file