From c907a8df37b5619fce14ab459cf87e9cca95fb57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sun, 17 Nov 2019 23:16:13 +0100 Subject: [PATCH] [APIv2] Librus: better error handling. Timetable: fix widget crashing with NPE. --- .../edziennik/WidgetTimetable.kt | 4 +- .../szczodrzynski/edziennik/api/v2/Errors.kt | 7 +- .../edziennik/api/v2/librus/data/LibrusApi.kt | 8 ++ .../api/v2/librus/data/LibrusMessages.kt | 19 ++- .../api/v2/librus/data/LibrusSynergia.kt | 11 +- .../api/v2/librus/login/LibrusLoginApi.kt | 11 +- .../v2/librus/login/LibrusLoginMessages.kt | 122 +++++++++++++----- .../api/v2/librus/login/LibrusLoginPortal.kt | 2 +- .../v2/librus/login/LibrusLoginSynergia.kt | 9 +- .../ui/modules/login/LoginLibrusFragment.java | 4 +- .../modules/timetable/v2/TimetableFragment.kt | 2 - .../WidgetTimetableListProvider.java | 3 +- app/src/main/res/values/errors.xml | 16 ++- 13 files changed, 159 insertions(+), 59 deletions(-) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/WidgetTimetable.kt b/app/src/main/java/pl/szczodrzynski/edziennik/WidgetTimetable.kt index ab5d21da..ea5deca1 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/WidgetTimetable.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/WidgetTimetable.kt @@ -214,8 +214,8 @@ class WidgetTimetable : AppWidgetProvider() { model.lessonId = lesson.id model.lessonDate = timetableDate - model.startTime = lesson.startTime - model.endTime = lesson.endTime + model.startTime = lesson.displayStartTime + model.endTime = lesson.displayEndTime // check if the lesson has already passed or it's currently in progress if (lesson.displayDate == today) { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/Errors.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/Errors.kt index a3b41c45..0704d2a0 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/Errors.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/Errors.kt @@ -41,7 +41,6 @@ const val ERROR_REQUEST_HTTP_410 = 56 const val ERROR_REQUEST_HTTP_500 = 57 const val ERROR_RESPONSE_EMPTY = 100 const val ERROR_LOGIN_DATA_MISSING = 101 -const val ERROR_LOGIN_DATA_INVALID = 102 const val ERROR_PROFILE_MISSING = 105 const val ERROR_INVALID_LOGIN_MODE = 110 const val ERROR_LOGIN_METHOD_NOT_SATISFIED = 111 @@ -99,6 +98,12 @@ const val ERROR_LOGIN_LIBRUS_PORTAL_REFRESH_INVALID = 172 const val ERROR_LOGIN_LIBRUS_PORTAL_REFRESH_REVOKED = 173 const val ERROR_LIBRUS_SYNERGIA_OTHER = 174 const val ERROR_LIBRUS_SYNERGIA_MAINTENANCE = 175 +const val ERROR_LIBRUS_MESSAGES_MAINTENANCE = 176 +const val ERROR_LIBRUS_MESSAGES_ERROR = 177 +const val ERROR_LIBRUS_MESSAGES_OTHER = 178 +const val ERROR_LOGIN_LIBRUS_MESSAGES_INVALID_LOGIN = 179 +const val ERROR_LOGIN_LIBRUS_PORTAL_INVALID_LOGIN = 180 +const val ERROR_LIBRUS_API_MAINTENANCE = 181 const val ERROR_LOGIN_MOBIDZIENNIK_WEB_INVALID_LOGIN = 201 const val ERROR_LOGIN_MOBIDZIENNIK_WEB_OLD_PASSWORD = 202 diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusApi.kt index 4f8d12eb..837695d3 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusApi.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusApi.kt @@ -32,6 +32,13 @@ open class LibrusApi(open val data: DataLibrus) { val callback = object : JsonCallbackHandler() { override fun onSuccess(json: JsonObject?, response: Response?) { + if (response?.code() == HTTP_UNAVAILABLE) { + data.error(ApiError(tag, ERROR_LIBRUS_API_MAINTENANCE) + .withApiResponse(json) + .withResponse(response)) + return + } + if (json == null && response?.parserErrorBody == null) { data.error(ApiError(TAG, ERROR_RESPONSE_EMPTY) .withResponse(response)) @@ -104,6 +111,7 @@ open class LibrusApi(open val data: DataLibrus) { .allowErrorCode(HTTP_BAD_REQUEST) .allowErrorCode(HTTP_FORBIDDEN) .allowErrorCode(HTTP_UNAUTHORIZED) + .allowErrorCode(HTTP_UNAVAILABLE) .callback(callback) .build() .enqueue() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusMessages.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusMessages.kt index a94124b1..7de22502 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusMessages.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusMessages.kt @@ -15,7 +15,6 @@ import org.jsoup.parser.Parser import pl.szczodrzynski.edziennik.api.v2.* import pl.szczodrzynski.edziennik.api.v2.librus.DataLibrus import pl.szczodrzynski.edziennik.api.v2.models.ApiError -import pl.szczodrzynski.edziennik.get import pl.szczodrzynski.edziennik.utils.Utils.d import java.io.StringWriter import javax.xml.parsers.DocumentBuilderFactory @@ -43,19 +42,19 @@ open class LibrusMessages(open val data: DataLibrus) { val callback = object : TextCallbackHandler() { override fun onSuccess(text: String?, response: Response?) { if (text.isNullOrEmpty()) { - data.error(ApiError(LibrusSynergia.TAG, ERROR_RESPONSE_EMPTY) + data.error(ApiError(TAG, ERROR_RESPONSE_EMPTY) .withResponse(response)) return } - // TODO: Finish error handling - - if ("error" in text) { - when ("(.*)".toRegex().find(text)?.get(1)) { - "eAccessDeny" -> data.error(ApiError(tag, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED) - .withResponse(response) - .withApiResponse(text)) - } + when { + text.contains("Niepoprawny login i/lub hasło.") -> data.error(TAG, ERROR_LOGIN_LIBRUS_MESSAGES_INVALID_LOGIN, response, text) + text.contains("stop.png") -> data.error(TAG, ERROR_LIBRUS_SYNERGIA_ACCESS_DENIED, response, text) + text.contains("eAccessDeny") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED, response, text) + text.contains("OffLine") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_MAINTENANCE, response, text) + text.contains("error") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ERROR, response, text) + text.contains("eVarWhitThisNameNotExists") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED, response, text) + text.contains("") -> data.error(TAG, ERROR_LIBRUS_MESSAGES_OTHER, response, text) } try { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusSynergia.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusSynergia.kt index b45c0aa8..b112fa72 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusSynergia.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/data/LibrusSynergia.kt @@ -14,7 +14,7 @@ import pl.szczodrzynski.edziennik.utils.Utils.d open class LibrusSynergia(open val data: DataLibrus) { companion object { - const val TAG = "LibrusSynergia" + private const val TAG = "LibrusSynergia" } val profileId @@ -29,6 +29,15 @@ open class LibrusSynergia(open val data: DataLibrus) { val callback = object : TextCallbackHandler() { override fun onSuccess(text: String?, response: Response?) { + val location = response?.headers()?.get("Location") + if (location?.endsWith("przerwa_techniczna") == true) { + // double checking for maintenance? + data.error(ApiError(TAG, ERROR_LIBRUS_SYNERGIA_MAINTENANCE) + .withApiResponse(text) + .withResponse(response)) + return + } + if (text.isNullOrEmpty()) { data.error(ApiError(TAG, ERROR_RESPONSE_EMPTY) .withResponse(response)) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginApi.kt index fe8bd5cd..8b4e0542 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginApi.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginApi.kt @@ -16,8 +16,7 @@ import pl.szczodrzynski.edziennik.getInt import pl.szczodrzynski.edziennik.getString import pl.szczodrzynski.edziennik.getUnixDate import pl.szczodrzynski.edziennik.utils.Utils.d -import java.net.HttpURLConnection.HTTP_BAD_REQUEST -import java.net.HttpURLConnection.HTTP_UNAUTHORIZED +import java.net.HttpURLConnection.* class LibrusLoginApi { companion object { @@ -117,6 +116,13 @@ class LibrusLoginApi { private val tokenCallback = object : JsonCallbackHandler() { override fun onSuccess(json: JsonObject?, response: Response?) { + if (response?.code() == HTTP_UNAVAILABLE) { + data.error(ApiError(TAG, ERROR_LIBRUS_API_MAINTENANCE) + .withApiResponse(json) + .withResponse(response)) + return + } + if (json == null) { data.error(ApiError(TAG, ERROR_RESPONSE_EMPTY) .withResponse(response)) @@ -176,6 +182,7 @@ class LibrusLoginApi { .post() .allowErrorCode(HTTP_BAD_REQUEST) .allowErrorCode(HTTP_UNAUTHORIZED) + .allowErrorCode(HTTP_UNAVAILABLE) .callback(tokenCallback) .build() .enqueue() diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginMessages.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginMessages.kt index 95503944..99381fcb 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginMessages.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginMessages.kt @@ -6,20 +6,57 @@ package pl.szczodrzynski.edziennik.api.v2.librus.login import im.wangchao.mhttp.Request import im.wangchao.mhttp.Response +import im.wangchao.mhttp.body.MediaTypeUtils import im.wangchao.mhttp.callback.TextCallbackHandler import okhttp3.Cookie import pl.szczodrzynski.edziennik.api.v2.* import pl.szczodrzynski.edziennik.api.v2.librus.DataLibrus import pl.szczodrzynski.edziennik.api.v2.models.ApiError import pl.szczodrzynski.edziennik.getUnixDate -import pl.szczodrzynski.edziennik.utils.Utils import pl.szczodrzynski.edziennik.utils.Utils.d +import java.io.StringWriter +import javax.xml.parsers.DocumentBuilderFactory +import javax.xml.transform.OutputKeys +import javax.xml.transform.TransformerFactory +import javax.xml.transform.dom.DOMSource +import javax.xml.transform.stream.StreamResult class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) { companion object { private const val TAG = "LoginLibrusMessages" } + private val callback by lazy { object : TextCallbackHandler() { + override fun onSuccess(text: String?, response: Response?) { + val location = response?.headers()?.get("Location") + when { + location?.contains("MultiDomainLogon") == true -> loginWithSynergia(location) + location?.contains("AutoLogon") == true -> { + saveSessionId(response, text) + onSuccess() + } + + text?.contains("ok") == true -> { + saveSessionId(response, text) + onSuccess() + } + text?.contains("Niepoprawny login i/lub hasło.") == true -> data.error(TAG, ERROR_LOGIN_LIBRUS_MESSAGES_INVALID_LOGIN, response, text) + text?.contains("stop.png") == true -> data.error(TAG, ERROR_LIBRUS_SYNERGIA_ACCESS_DENIED, response, text) + text?.contains("eAccessDeny") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED, response, text) + text?.contains("OffLine") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_MAINTENANCE, response, text) + text?.contains("error") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ERROR, response, text) + text?.contains("eVarWhitThisNameNotExists") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED, response, text) + text?.contains("") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_OTHER, response, text) + } + } + + override fun onFailure(response: Response?, throwable: Throwable?) { + data.error(ApiError(TAG, ERROR_REQUEST_FAILURE) + .withResponse(response) + .withThrowable(throwable)) + } + }} + init { run { if (data.profile == null) { data.error(ApiError(TAG, ERROR_PROFILE_MISSING)) @@ -41,7 +78,7 @@ class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) { if (data.loginMethods.contains(LOGIN_METHOD_LIBRUS_SYNERGIA)) { loginWithSynergia() } - else if (data.apiLogin != null && data.apiPassword != null && false) { + else if (data.apiLogin != null && data.apiPassword != null) { loginWithCredentials() } else { @@ -54,7 +91,44 @@ class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) { * XML (Flash messages website) login method. Uses a Synergia login and password. */ private fun loginWithCredentials() { + d(TAG, "Request: Librus/Login/Messages - $LIBRUS_MESSAGES_URL/Login") + val docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder() + val doc = docBuilder.newDocument() + val serviceElement = doc.createElement("service") + val headerElement = doc.createElement("header") + val dataElement = doc.createElement("data") + val loginElement = doc.createElement("login") + loginElement.appendChild(doc.createTextNode(data.apiLogin)) + dataElement.appendChild(loginElement) + val passwordElement = doc.createElement("login") + passwordElement.appendChild(doc.createTextNode(data.apiPassword)) + dataElement.appendChild(passwordElement) + val keyStrokeElement = doc.createElement("KeyStroke") + val keysElement = doc.createElement("Keys") + val upElement = doc.createElement("Up") + keysElement.appendChild(upElement) + val downElement = doc.createElement("Down") + keysElement.appendChild(downElement) + keyStrokeElement.appendChild(keysElement) + dataElement.appendChild(keyStrokeElement) + serviceElement.appendChild(headerElement) + serviceElement.appendChild(dataElement) + doc.appendChild(serviceElement) + val transformer = TransformerFactory.newInstance().newTransformer() + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes") + val stringWriter = StringWriter() + transformer.transform(DOMSource(doc), StreamResult(stringWriter)) + val requestXml = stringWriter.toString() + + Request.builder() + .url("$LIBRUS_MESSAGES_URL/Login") + .userAgent(SYNERGIA_USER_AGENT) + .setTextBody(requestXml, MediaTypeUtils.APPLICATION_XML) + .post() + .callback(callback) + .build() + .enqueue() } /** @@ -63,37 +137,6 @@ class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) { private fun loginWithSynergia(url: String = "https://synergia.librus.pl/wiadomosci2") { d(TAG, "Request: Librus/Login/Messages - $url") - val callback = object : TextCallbackHandler() { - override fun onSuccess(text: String?, response: Response?) { - val location = response?.headers()?.get("Location") - when { - location?.contains("MultiDomainLogon") == true -> loginWithSynergia(location) - location?.contains("AutoLogon") == true -> { - var sessionId = data.app.cookieJar.getCookie("wiadomosci.librus.pl", "DZIENNIKSID") - sessionId = sessionId?.replace("-MAINT", "") - if (sessionId == null) { - data.error(ApiError(TAG, ERROR_LOGIN_LIBRUS_MESSAGES_NO_SESSION_ID) - .withResponse(response) - .withApiResponse(text)) - return - } - data.messagesSessionId = sessionId - data.messagesSessionIdExpiryTime = response.getUnixDate() + 45 * 60 /* 45min */ - onSuccess() - } - - text?.contains("eAccessDeny") == true -> data.error(TAG, ERROR_LIBRUS_MESSAGES_ACCESS_DENIED, response, text) - text?.contains("stop.png") == true -> data.error(TAG, ERROR_LIBRUS_SYNERGIA_ACCESS_DENIED, response, text) - } - } - - override fun onFailure(response: Response?, throwable: Throwable?) { - data.error(ApiError(TAG, ERROR_REQUEST_FAILURE) - .withResponse(response) - .withThrowable(throwable)) - } - } - Request.builder() .url(url) .userAgent(SYNERGIA_USER_AGENT) @@ -103,4 +146,17 @@ class LibrusLoginMessages(val data: DataLibrus, val onSuccess: () -> Unit) { .build() .enqueue() } + + private fun saveSessionId(response: Response?, text: String?) { + var sessionId = data.app.cookieJar.getCookie("wiadomosci.librus.pl", "DZIENNIKSID") + sessionId = sessionId?.replace("-MAINT", "") // dunno what's this + if (sessionId == null) { + data.error(ApiError(TAG, ERROR_LOGIN_LIBRUS_MESSAGES_NO_SESSION_ID) + .withResponse(response) + .withApiResponse(text)) + return + } + data.messagesSessionId = sessionId + data.messagesSessionIdExpiryTime = response.getUnixDate() + 45 * 60 /* 45min */ + } } \ No newline at end of file diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginPortal.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginPortal.kt index dc129626..19ffef22 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginPortal.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginPortal.kt @@ -120,7 +120,7 @@ class LibrusLoginPortal(val data: DataLibrus, val onSuccess: () -> Unit) { override fun onFailure(response: Response, throwable: Throwable) { if (response.code() == 403 || response.code() == 401) { - data.error(ApiError(TAG, ERROR_LOGIN_DATA_INVALID) + data.error(ApiError(TAG, ERROR_LOGIN_LIBRUS_PORTAL_INVALID_LOGIN) .withResponse(response) .withThrowable(throwable)) return diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginSynergia.kt b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginSynergia.kt index 46fbfe2d..73f4ec9c 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginSynergia.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/api/v2/librus/login/LibrusLoginSynergia.kt @@ -7,7 +7,6 @@ package pl.szczodrzynski.edziennik.api.v2.librus.login import com.google.gson.JsonObject import im.wangchao.mhttp.Request import im.wangchao.mhttp.Response -import im.wangchao.mhttp.callback.JsonCallbackHandler import im.wangchao.mhttp.callback.TextCallbackHandler import okhttp3.Cookie import pl.szczodrzynski.edziennik.api.v2.* @@ -16,7 +15,6 @@ import pl.szczodrzynski.edziennik.api.v2.librus.data.LibrusApi import pl.szczodrzynski.edziennik.api.v2.models.ApiError import pl.szczodrzynski.edziennik.getString import pl.szczodrzynski.edziennik.getUnixDate -import pl.szczodrzynski.edziennik.utils.Utils import pl.szczodrzynski.edziennik.utils.Utils.d import java.net.HttpURLConnection @@ -86,6 +84,13 @@ class LibrusLoginSynergia(override val data: DataLibrus, val onSuccess: () -> Un val callback = object : TextCallbackHandler() { override fun onSuccess(json: String?, response: Response?) { val location = response?.headers()?.get("Location") + if (location?.endsWith("przerwa_techniczna") == true) { + data.error(ApiError(TAG, ERROR_LIBRUS_SYNERGIA_MAINTENANCE) + .withApiResponse(json) + .withResponse(response)) + return + } + if (location?.endsWith("centrum_powiadomien") == true) { val sessionId = data.app.cookieJar.getCookie("synergia.librus.pl", "DZIENNIKSID") if (sessionId == null) { diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusFragment.java b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusFragment.java index d7abdc57..0008f133 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusFragment.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusFragment.java @@ -19,7 +19,7 @@ import pl.szczodrzynski.edziennik.api.v2.models.ApiError; import pl.szczodrzynski.edziennik.databinding.FragmentLoginLibrusBinding; import pl.szczodrzynski.edziennik.ui.modules.error.ErrorSnackbar; -import static pl.szczodrzynski.edziennik.api.v2.ErrorsKt.ERROR_LOGIN_DATA_INVALID; +import static pl.szczodrzynski.edziennik.api.v2.ErrorsKt.ERROR_LOGIN_LIBRUS_PORTAL_INVALID_LOGIN; import static pl.szczodrzynski.edziennik.api.v2.ErrorsKt.ERROR_LOGIN_LIBRUS_PORTAL_NOT_ACTIVATED; import static pl.szczodrzynski.edziennik.data.db.modules.login.LoginStore.LOGIN_TYPE_LIBRUS; @@ -57,7 +57,7 @@ public class LoginLibrusFragment extends Fragment { ApiError error = LoginActivity.error; if (error != null) { switch (error.getErrorCode()) { - case ERROR_LOGIN_DATA_INVALID: + case ERROR_LOGIN_LIBRUS_PORTAL_INVALID_LOGIN: b.loginPasswordLayout.setError(getString(R.string.login_error_incorrect_login_or_password)); break; case ERROR_LOGIN_LIBRUS_PORTAL_NOT_ACTIVATED: diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/v2/TimetableFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/v2/TimetableFragment.kt index e97421fd..6ee0e6bd 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/v2/TimetableFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/timetable/v2/TimetableFragment.kt @@ -5,7 +5,6 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -131,7 +130,6 @@ class TimetableFragment : Fragment(), CoroutineScope { b.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { override fun onPageScrollStateChanged(state: Int) { if (b.refreshLayout != null) { - Log.d(TAG, "State $state") b.refreshLayout.isEnabled = state == ViewPager.SCROLL_STATE_IDLE } } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/widgets/timetable/WidgetTimetableListProvider.java b/app/src/main/java/pl/szczodrzynski/edziennik/widgets/timetable/WidgetTimetableListProvider.java index 83881d8d..c8252537 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/widgets/timetable/WidgetTimetableListProvider.java +++ b/app/src/main/java/pl/szczodrzynski/edziennik/widgets/timetable/WidgetTimetableListProvider.java @@ -173,7 +173,8 @@ public class WidgetTimetableListProvider implements RemoteViewsService.RemoteVie intent.putExtra("endTime", lesson.endTime.getStringValue()); views.setOnClickFillInIntent(R.id.widgetTimetableRoot, intent); - views.setTextViewText(R.id.widgetTimetableTime, lesson.startTime.getStringHM() + " - " + lesson.endTime.getStringHM()); + if (lesson.startTime != null && lesson.endTime != null) + views.setTextViewText(R.id.widgetTimetableTime, lesson.startTime.getStringHM() + " - " + lesson.endTime.getStringHM()); views.setViewVisibility(R.id.widgetTimetableEvent1, View.GONE); views.setViewVisibility(R.id.widgetTimetableEvent2, View.GONE); diff --git a/app/src/main/res/values/errors.xml b/app/src/main/res/values/errors.xml index 1642ea4c..e6718985 100644 --- a/app/src/main/res/values/errors.xml +++ b/app/src/main/res/values/errors.xml @@ -72,6 +72,12 @@ ERROR_LOGIN_LIBRUS_PORTAL_REFRESH_REVOKED ERROR_LIBRUS_SYNERGIA_OTHER ERROR_LIBRUS_SYNERGIA_MAINTENANCE + ERROR_LIBRUS_MESSAGES_MAINTENANCE + ERROR_LIBRUS_MESSAGES_ERROR + ERROR_LIBRUS_MESSAGES_OTHER + ERROR_LOGIN_LIBRUS_MESSAGES_INVALID_LOGIN + ERROR_LOGIN_LIBRUS_PORTAL_INVALID_LOGIN + ERROR_LIBRUS_API_MAINTENANCE ERROR_LOGIN_MOBIDZIENNIK_WEB_INVALID_LOGIN ERROR_LOGIN_MOBIDZIENNIK_WEB_OLD_PASSWORD @@ -165,7 +171,7 @@ Wymagana akceptacja regulaminu Błąd zmiany hasła Wymagana zmiana hasła - Nieprawidłowe dane logowania + Librus API: nieprawidłowe dane logowania Inny błąd logowania do API Brak tokenu CSRF Konto LIBRUS nie zostało aktywowane @@ -206,7 +212,13 @@ ERROR_LOGIN_LIBRUS_PORTAL_REFRESH_INVALID ERROR_LOGIN_LIBRUS_PORTAL_REFRESH_REVOKED ERROR_LIBRUS_SYNERGIA_OTHER - ERROR_LIBRUS_SYNERGIA_MAINTENANCE + Librus Synergia: przerwa techniczna + Librus Wiadomości: przerwa techniczna + ERROR_LIBRUS_MESSAGES_ERROR + ERROR_LIBRUS_MESSAGES_OTHER + Librus Wiadomości: nieprawidłowe dane logowania + Librus Portal: nieprawidłowe dane logowania + Librus API: przerwa techniczna ERROR_LOGIN_MOBIDZIENNIK_WEB_INVALID_LOGIN ERROR_LOGIN_MOBIDZIENNIK_WEB_OLD_PASSWORD