From e761a0ec8ae79febc85af21ca8c97041e352e907 Mon Sep 17 00:00:00 2001 From: Kacper Ziubryniewicz Date: Sun, 17 May 2020 23:04:44 +0200 Subject: [PATCH] [API/Gdynia] Add first login and login page. --- .../pl/szczodrzynski/edziennik/Extensions.kt | 10 +++ .../edziennik/data/api/Constants.kt | 2 + .../edziennik/data/api/Errors.kt | 1 + .../edziennik/data/api/LoginMethods.kt | 6 ++ .../data/api/edziennik/EdziennikTask.kt | 2 + .../data/api/edziennik/gdynia/DataGdynia.kt | 15 ++++ .../data/api/edziennik/gdynia/Gdynia.kt | 34 ++++++++- .../api/edziennik/gdynia/GdyniaFeatures.kt | 9 +++ .../api/edziennik/gdynia/data/GdyniaData.kt | 42 +++++++++++ .../api/edziennik/gdynia/data/GdyniaWeb.kt | 63 ++++++++++++++++ .../gdynia/firstlogin/GdyniaFirstLogin.kt | 71 ++++++++++++++++++ .../edziennik/template/data/TemplateData.kt | 2 +- .../edziennik/ui/modules/login/LoginInfo.kt | 31 ++++++++ .../main/res/drawable/login_logo_gdynia.png | Bin 0 -> 11407 bytes .../login_logo_podlasie.png | Bin .../res/drawable/login_mode_gdynia_web.png | Bin 0 -> 1716 bytes .../login_mode_podlasie_api.png | Bin app/src/main/res/values/errors.xml | 2 + app/src/main/res/values/strings.xml | 3 + 19 files changed, 289 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/GdyniaFeatures.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/data/GdyniaData.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/data/GdyniaWeb.kt create mode 100644 app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/firstlogin/GdyniaFirstLogin.kt create mode 100644 app/src/main/res/drawable/login_logo_gdynia.png rename app/src/main/res/{drawable-nodpi => drawable}/login_logo_podlasie.png (100%) create mode 100644 app/src/main/res/drawable/login_mode_gdynia_web.png rename app/src/main/res/{drawable-xhdpi => drawable}/login_mode_podlasie_api.png (100%) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt index 2443679b..c6d023b2 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt @@ -1247,3 +1247,13 @@ operator fun Iterable>.get(key: K): V? { } fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) } + +fun String?.nullIfEmpty() = when { + this.isNullOrEmpty() -> null + else -> this +} + +fun String?.nullIfBlank() = when { + this.isNullOrBlank() -> null + else -> this +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt index d524a6dc..e1d08573 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Constants.kt @@ -126,3 +126,5 @@ const val PODLASIE_API_USER_ENDPOINT = "/pobierzDaneUcznia" const val GDYNIA_WEB_URL = "https://nasze.miasto.gdynia.pl/ed_miej" const val GDYNIA_WEB_LOGIN = "login.pl" const val GDYNIA_WEB_LOGIN_CHECK = "login_check.pl" +const val GDYNIA_WEB_START = "zest_start.pl" +const val GDYNIA_WEB_DISPLAY = "display.pl" diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Errors.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Errors.kt index 6df17843..48fd3abf 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Errors.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/Errors.kt @@ -233,5 +233,6 @@ const val ERROR_ONEDRIVE_DOWNLOAD = 930 const val EXCEPTION_VULCAN_WEB_LOGIN = 931 const val EXCEPTION_VULCAN_WEB_REQUEST = 932 const val EXCEPTION_PODLASIE_API_REQUEST = 940 +const val EXCEPTION_GDYNIA_WEB_REQUEST = 950 const val LOGIN_NO_ARGUMENTS = 1201 diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/LoginMethods.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/LoginMethods.kt index b2f3cd88..651970ca 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/LoginMethods.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/LoginMethods.kt @@ -5,6 +5,7 @@ package pl.szczodrzynski.edziennik.data.api import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.login.EdudziennikLoginWeb +import pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.login.GdyniaLoginWeb 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.librus.login.LibrusLoginApi @@ -154,6 +155,11 @@ val podlasieLoginMethods = listOf( const val LOGIN_TYPE_GDYNIA = 7 const val LOGIN_MODE_GDYNIA_WEB = 0 const val LOGIN_METHOD_GDYNIA_WEB = 100 +val gdyniaLoginMethods = listOf( + LoginMethod(LOGIN_TYPE_GDYNIA, LOGIN_METHOD_GDYNIA_WEB, GdyniaLoginWeb::class.java) + .withIsPossible { _, _ -> true } + .withRequiredLoginMethod { _, _ -> LOGIN_METHOD_NOT_NEEDED } +) val templateLoginMethods = listOf( LoginMethod(LOGIN_TYPE_TEMPLATE, LOGIN_METHOD_TEMPLATE_WEB, TemplateLoginWeb::class.java) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt index 4d3f0aca..0e9aaac7 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/EdziennikTask.kt @@ -9,6 +9,7 @@ import pl.szczodrzynski.edziennik.App import pl.szczodrzynski.edziennik.R import pl.szczodrzynski.edziennik.data.api.* import pl.szczodrzynski.edziennik.data.api.edziennik.edudziennik.Edudziennik +import pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.Gdynia 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.mobidziennik.Mobidziennik @@ -82,6 +83,7 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa LOGIN_TYPE_IDZIENNIK -> Idziennik(app, profile, loginStore, taskCallback) LOGIN_TYPE_EDUDZIENNIK -> Edudziennik(app, profile, loginStore, taskCallback) LOGIN_TYPE_PODLASIE -> Podlasie(app, profile, loginStore, taskCallback) + LOGIN_TYPE_GDYNIA -> Gdynia(app, profile, loginStore, taskCallback) LOGIN_TYPE_TEMPLATE -> Template(app, profile, loginStore, taskCallback) else -> null } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/DataGdynia.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/DataGdynia.kt index 936e914a..86e1ac40 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/DataGdynia.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/DataGdynia.kt @@ -34,6 +34,21 @@ class DataGdynia(app: App, profile: Profile?, loginStore: LoginStore) : Data(app get() { mLoginPassword = mLoginPassword ?: loginStore.getLoginData("password", null); return mLoginPassword } set(value) { loginStore.putLoginData("password", value); mLoginPassword = value } + private var mStudentLogin: String? = null + var studentLogin: String? + get() { mStudentLogin = mStudentLogin ?: profile?.getStudentData("studentLogin", null); return mStudentLogin } + set(value) { profile?.putStudentData("studentLogin", value) ?: return; mStudentLogin = value } + + private var mStudentAlias: String? = null + var studentAlias: String? + get() { mStudentAlias = mStudentAlias ?: profile?.getStudentData("studentAlias", null); return mStudentAlias } + set(value) { profile?.putStudentData("studentAlias", value) ?: return; mStudentAlias = value } + + private var mStudentEmail: String? = null + var studentEmail: String? + get() { mStudentEmail = mStudentEmail ?: profile?.getStudentData("studentEmail", null); return mStudentEmail } + set(value) { profile?.putStudentData("studentEmail", value) ?: return; mStudentEmail = value } + /* __ __ _ \ \ / / | | \ \ /\ / /__| |__ diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/Gdynia.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/Gdynia.kt index 5e3cc3d6..a76bce42 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/Gdynia.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/Gdynia.kt @@ -6,9 +6,14 @@ package pl.szczodrzynski.edziennik.data.api.edziennik.gdynia import com.google.gson.JsonObject import pl.szczodrzynski.edziennik.App +import pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.data.GdyniaData +import pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.firstlogin.GdyniaFirstLogin +import pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.login.GdyniaLogin +import pl.szczodrzynski.edziennik.data.api.gdyniaLoginMethods 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.entity.LoginStore import pl.szczodrzynski.edziennik.data.db.entity.Profile import pl.szczodrzynski.edziennik.data.db.entity.Teacher @@ -19,7 +24,7 @@ import pl.szczodrzynski.edziennik.utils.Utils class Gdynia(val app: App, val profile: Profile?, val loginStore: LoginStore, val callback: EdziennikCallback) : EdziennikInterface { companion object { -private const val TAG = "Gdynia" + private const val TAG = "Gdynia" } val internalErrorList = mutableListOf() @@ -32,8 +37,29 @@ private const val TAG = "Gdynia" } } - override fun sync(featureIds: List, viewId: Int?, onlyEndpoints: List?, arguments: JsonObject?) { + private fun completed() { + data.saveData() + callback.onCompleted() + } + /* _______ _ _ _ _ _ + |__ __| | /\ | | (_) | | | + | | | |__ ___ / \ | | __ _ ___ _ __ _| |_| |__ _ __ ___ + | | | '_ \ / _ \ / /\ \ | |/ _` |/ _ \| '__| | __| '_ \| '_ ` _ \ + | | | | | | __/ / ____ \| | (_| | (_) | | | | |_| | | | | | | | | + |_| |_| |_|\___| /_/ \_\_|\__, |\___/|_| |_|\__|_| |_|_| |_| |_| + __/ | + |__*/ + override fun sync(featureIds: List, viewId: Int?, onlyEndpoints: List?, arguments: JsonObject?) { + data.arguments = arguments + data.prepare(gdyniaLoginMethods, GdyniaFeatures, featureIds, viewId, onlyEndpoints) + Utils.d(TAG, "LoginMethod IDs: ${data.targetLoginMethodIds}") + Utils.d(TAG, "Endpoint IDs: ${data.targetEndpointIds}") + GdyniaLogin(data) { + GdyniaData(data) { + completed() + } + } } override fun getMessage(message: MessageFull) { @@ -65,7 +91,9 @@ private const val TAG = "Gdynia" } override fun firstLogin() { - TODO("Not yet implemented") + GdyniaFirstLogin(data) { + completed() + } } override fun cancel() { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/GdyniaFeatures.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/GdyniaFeatures.kt new file mode 100644 index 00000000..10817d2c --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/GdyniaFeatures.kt @@ -0,0 +1,9 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2020-5-17 + */ + +package pl.szczodrzynski.edziennik.data.api.edziennik.gdynia + +import pl.szczodrzynski.edziennik.data.api.models.Feature + +val GdyniaFeatures = listOf() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/data/GdyniaData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/data/GdyniaData.kt new file mode 100644 index 00000000..f6b33c26 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/data/GdyniaData.kt @@ -0,0 +1,42 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2020-5-17 + */ + +package pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.data + +import pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.DataGdynia +import pl.szczodrzynski.edziennik.utils.Utils + +class GdyniaData(val data: DataGdynia, val onSuccess: () -> Unit) { + companion object { + private const val TAG = "GdyniaData" + } + + init { + nextEndpoint(onSuccess) + } + + private fun nextEndpoint(onSuccess: () -> Unit) { + if (data.targetEndpointIds.isEmpty()) { + onSuccess() + return + } + if (data.cancelled) { + onSuccess() + return + } + val id = data.targetEndpointIds.firstKey() + val lastSync = data.targetEndpointIds.remove(id) + useEndpoint(id, lastSync) { + data.progress(data.progressStep) + nextEndpoint(onSuccess) + } + } + + private fun useEndpoint(endpointId: Int, lastSync: Long?, onSuccess: (endpointId: Int) -> Unit) { + Utils.d(TAG, "Using endpoint $endpointId. Last sync time = $lastSync") + when (endpointId) { + else -> onSuccess(endpointId) + } + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/data/GdyniaWeb.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/data/GdyniaWeb.kt new file mode 100644 index 00000000..7ed11dd3 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/data/GdyniaWeb.kt @@ -0,0 +1,63 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2020-5-17 + */ + +package pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.data + +import im.wangchao.mhttp.Request +import im.wangchao.mhttp.Response +import im.wangchao.mhttp.callback.TextCallbackHandler +import pl.szczodrzynski.edziennik.data.api.* +import pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.DataGdynia +import pl.szczodrzynski.edziennik.data.api.models.ApiError +import pl.szczodrzynski.edziennik.utils.Utils.d + +open class GdyniaWeb(open val data: DataGdynia, open val lastSync: Long?) { + companion object { + private const val TAG = "GdyniaWeb" + } + + fun webGet(tag: String, endpoint: String, parameters: Map? = null, onSuccess: (text: String) -> Unit) { + val url = "$GDYNIA_WEB_URL/$endpoint" + d(tag, "Request: Gdynia/Web - $url") + + val callback = object : TextCallbackHandler() { + override fun onSuccess(text: String?, response: Response?) { + if (text == null || response == null) { + data.error(ApiError(tag, ERROR_RESPONSE_EMPTY) + .withResponse(response) + .withApiResponse(text)) + return + } + + try { + onSuccess(text) + } catch (e: Exception) { + data.error(ApiError(tag, EXCEPTION_GDYNIA_WEB_REQUEST) + .withApiResponse(text) + .withResponse(response) + .withThrowable(e)) + } + } + + override fun onFailure(response: Response?, throwable: Throwable?) { + data.error(ApiError(tag, ERROR_REQUEST_FAILURE) + .withResponse(response) + .withThrowable(throwable)) + } + } + + Request.builder() + .url(url) + .userAgent(SYSTEM_USER_AGENT) + .apply { + parameters?.forEach { (key, value) -> + addParameter(key, value) + } + } + .get() + .callback(callback) + .build() + .enqueue() + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/firstlogin/GdyniaFirstLogin.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/firstlogin/GdyniaFirstLogin.kt new file mode 100644 index 00000000..f8789156 --- /dev/null +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/gdynia/firstlogin/GdyniaFirstLogin.kt @@ -0,0 +1,71 @@ +/* + * Copyright (c) Kacper Ziubryniewicz 2020-5-17 + */ + +package pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.firstlogin + +import org.greenrobot.eventbus.EventBus +import org.jsoup.Jsoup +import pl.szczodrzynski.edziennik.* +import pl.szczodrzynski.edziennik.data.api.GDYNIA_WEB_DISPLAY +import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_GDYNIA +import pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.DataGdynia +import pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.data.GdyniaWeb +import pl.szczodrzynski.edziennik.data.api.edziennik.gdynia.login.GdyniaLoginWeb +import pl.szczodrzynski.edziennik.data.api.events.FirstLoginFinishedEvent +import pl.szczodrzynski.edziennik.data.db.entity.Profile + +class GdyniaFirstLogin(val data: DataGdynia, val onSuccess: () -> Unit) { + companion object { + private const val TAG = "GdyniaFirstLogin" + } + + private val web = GdyniaWeb(data, null) + private val profileList = mutableListOf() + + init { + val loginStoreId = data.loginStore.id + val loginStoreType = LOGIN_TYPE_GDYNIA + + GdyniaLoginWeb(data) { + web.webGet(TAG, GDYNIA_WEB_DISPLAY, parameters = mapOf( + "form" to "zmiana_danych" + )) { html -> + run { + val doc = Jsoup.parse(html) + + val firstName = doc.selectFirst("#f_imie")?.`val`() ?: return@run + val lastName = doc.selectFirst("#f_nazwisko")?.`val`() ?: return@run + val studentNameLong = "$firstName $lastName".fixName() + val studentNameShort = studentNameLong.getShortName() + + val login = doc.selectFirst("#f_login").`val`().nullIfBlank() + val alias = doc.selectFirst("#f_kod_logowania").`val`().nullIfBlank() + val email = doc.selectFirst("#f_email")?.`val`().nullIfBlank() + + val subname = alias ?: email ?: data.loginUsername + + val profile = Profile( + loginStoreId, + loginStoreId, + loginStoreType, + studentNameLong, + subname, + studentNameLong, + studentNameShort, + null + ).apply { + studentData["studentLogin"] = login + studentData["studentAlias"] = alias + studentData["studentEmail"] = email + } + + profileList.add(profile) + } + + EventBus.getDefault().postSticky(FirstLoginFinishedEvent(profileList, data.loginStore)) + onSuccess() + } + } + } +} diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/data/TemplateData.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/data/TemplateData.kt index 3489555f..8a47b680 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/data/TemplateData.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/template/data/TemplateData.kt @@ -34,7 +34,7 @@ class TemplateData(val data: DataTemplate, val onSuccess: () -> Unit) { } val id = data.targetEndpointIds.firstKey() val lastSync = data.targetEndpointIds.remove(id) - useEndpoint(id, lastSync) { endpointId -> + useEndpoint(id, lastSync) { data.progress(data.progressStep) nextEndpoint(onSuccess) } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginInfo.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginInfo.kt index d7230356..f108d99a 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginInfo.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginInfo.kt @@ -361,6 +361,37 @@ object LoginInfo { errorCodes = mapOf() ) ) + ), + Register( + loginType = LOGIN_TYPE_GDYNIA, + internalName = "gdynia", + registerName = R.string.login_type_gdynia, + registerLogo = R.drawable.login_logo_gdynia, + loginModes = listOf( + Mode( + loginMode = LOGIN_MODE_GDYNIA_WEB, + name = R.string.login_mode_gdynia_web, + icon = R.drawable.login_mode_gdynia_web, + guideText = R.string.login_mode_gdynia_web_guide, + credentials = listOf( + Credential( + keyName = "username", + name = R.string.login_hint_username, + icon = CommunityMaterial.Icon.cmd_account_outline, + emptyText = R.string.login_error_no_username, + invalidText = R.string.login_error_incorrect_username, + errorCodes = mapOf(), + isRequired = true, + validationRegex = "^[a-zA-Z0-9_\\-.]+$", + caseMode = Credential.CaseMode.UNCHANGED + ), + getPasswordCredential("password") + ), + errorCodes = mapOf( + ERROR_LOGIN_GDYNIA_WEB_INVALID_CREDENTIALS to R.string.login_error_incorrect_login_or_password + ) + ) + ) ) ) } diff --git a/app/src/main/res/drawable/login_logo_gdynia.png b/app/src/main/res/drawable/login_logo_gdynia.png new file mode 100644 index 0000000000000000000000000000000000000000..f53cb628a1ce5ed0639ea622c9e3b8a1908f9c58 GIT binary patch literal 11407 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-nodpi/login_logo_podlasie.png b/app/src/main/res/drawable/login_logo_podlasie.png similarity index 100% rename from app/src/main/res/drawable-nodpi/login_logo_podlasie.png rename to app/src/main/res/drawable/login_logo_podlasie.png diff --git a/app/src/main/res/drawable/login_mode_gdynia_web.png b/app/src/main/res/drawable/login_mode_gdynia_web.png new file mode 100644 index 0000000000000000000000000000000000000000..452ed2827e0c704d6b77e422cf10065528fb45ff GIT binary patch literal 1716 zcmV;l221&gP)*#nQ$2$0kbk<|c|*AkM}0GHYTnA;VT*8rK^0GizZo7VuF-T<7~0G-(Yp4$MQ z+#Q(K1)$v^nb#tk*b1TEC7an0qTdaq+7zSU5vAJ~q~R5&-5ICeE~DBUsNXQ8+a9Ul zF{Rxhs^K%H-XyEyCavQruH-kX+$yi-IIP_$vEe$c-#o71J+I+Eu;MYb`J`nRk`I>y5>y1 z=vcewS-j|4z3EuLX~OAh!|G_oV6q#qD&(=XJ*DcE{;=$m)2>>v_uTdd%&x%V2!X?t;weea`TM&FZnuX@t+~v(IaV z(CoC(Y=+V8kI(Ig((aJZ?z+%)h|}+p(eH}X@R!o+lGE^z)$Ewl?32{;ywrY~)a||1 zf5Fs-o7V2a)rXwd@59!Jo!Icj*NL9l@uS)6pW5=E+w;ZRk)_-1q1^Sx+mfc-@6Fni z$J~>r-SDp4@W|bi&fJu!-to-bo3GvRso(O=-JG!A^3L9!vfuN~-=xssp0nWe&fulg z-=(zS_0Qp^xZ&^B;HI_W_qpQm*5RknAc?Q!_DgT-|EEA>-OO5#n9~c z;q1oI?fByD$I|Zk;qT7q?a$Zm^waSA+V1+;@b&5M(A)3(-tYC_@b=mA_TcgO>GIj( z^7-oX+T-*3@$%d2^xNe0`|$JP?DgE`_5A4d_VM-O>Gt>L_xug_vY&O z`0@Dd^!VrN`T6qq`SSVh?E3rj`1|L;#2d9Y_EG010qNS#tmYE+YT{E+YYWr9XB6000McNliru*5uT`ot4Kr#=yAoK69QT+kqyG=NHl=xJ$^Rkpg)+6w;rJ!i4gcw%ZGUTUYIa~ zl`pSLBhDl0rF0@=6;3~+5Vkni^Nlepc|0NT^%e?;gV`WC&$~-wc0eZ%j0XUdL&L5N zaj<%!aE%!TSy_NQ%gv7-=a>&Tuum5<`!ygOL{b%#ZxcK8^Zqc9i;X1Rk?AtY{gW(K zm>J{vr^EwYAHa$U5(kVUxJ<6En0r@Gjkya7z-xVybZhxSOAIsDykQ}fE9LzY6=2yT zVSgVDdE9U*>SjT}t^P&kd&zM)Bvo z7fmq2S|GG24i^Cy{6DIE2$KLckgN$IMHXF+)+L|*X|*zxJW(bHUI;)Va^zBMyJaU* z=!s$_*CJ>YDP4JVo#~t`=M8f^GC=5OFvrx>@)S1M>M5;8S^tE%xCrn?U1%h0;>NsRmhj6c1py}-Rw{KoEsGi`< zC4g_umIwrZOBssPJ7~ktFVfnQHv5D`vmI9+bdomN{~$Zd3CFA}T->FgS}ZP0nWu>A zM)Ii=VsCe%A)Zo9tHN`y=tIci&6qP=sT;ZP^(mfXIndOq7n8|*w1Tw!sh5S&eFn2?Jy#OvIiWI-P z>@I_>O_j-ml33hO3=d|{Q4G)2@bf^A zsz1)Ojp$&8DPH@Q#2)W)!g+)&n?Uov_dKqlmRo6OZg#Vq4cl*T=VwW&?wEXCEPTION_VULCAN_WEB_LOGIN EXCEPTION_VULCAN_WEB_REQUEST EXCEPTION_PODLASIE_API_REQUEST + EXCEPTION_GDYNIA_WEB_REQUEST LOGIN_NO_ARGUMENTS @@ -385,6 +386,7 @@ EXCEPTION_VULCAN_WEB_LOGIN EXCEPTION_VULCAN_WEB_REQUEST Zgłoś błąd: wyjątek w API PPE + Zgłoś błąd: wyjątek w dzienniku Platformy Miejskiej Gdyni Nie podano parametrów diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 207f12f0..dd61772c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1357,4 +1357,7 @@ Podaj token aplikacji mobilnej. Logowanie do PPE… Logowanie do dziennika gdyńskiego… + Platforma Miejska Gdyni + Zaloguj używając nazwy użytkownika i hasła + Podaj nazwę użytkownika oraz hasło, za pomocą których logujesz się na stronie internetowej dziennika.