From 1b2bdc0580f93b1cb3560ecc62ea1bfe8e5d5fe3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sun, 15 Mar 2020 21:46:46 +0100 Subject: [PATCH] [Login] Add QR scanner to Vulcan & Librus JST login. Implement incorrect token error in Librus JST. --- .../edziennik/data/api/Errors.kt | 1 + .../librus/data/api/LibrusApiAttendances.kt | 6 +-- .../edziennik/librus/login/LibrusLoginApi.kt | 1 + .../edziennik/ui/dialogs/QrScannerDialog.kt | 2 +- .../modules/login/LoginLibrusJstFragment.kt | 24 ++++++++- .../ui/modules/login/LoginVulcanFragment.kt | 28 ++++++++++ .../res/layout/fragment_login_librus_jst.xml | 54 +++++++++++++------ app/src/main/res/values/errors.xml | 10 ++-- 8 files changed, 102 insertions(+), 24 deletions(-) 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 5f437ca6..8df8e958 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 @@ -125,6 +125,7 @@ const val ERROR_LIBRUS_API_NOTICEBOARD_PROBLEM = 183 const val ERROR_LOGIN_LIBRUS_PORTAL_CSRF_EXPIRED = 184 const val ERROR_LIBRUS_API_DEVICE_REGISTERED = 185 const val ERROR_LIBRUS_MESSAGES_NOT_FOUND = 186 +const val ERROR_LOGIN_LIBRUS_API_INVALID_REQUEST = 187 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/data/api/edziennik/librus/data/api/LibrusApiAttendances.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendances.kt index 5e69a5a7..924e5e4d 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendances.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/data/api/LibrusApiAttendances.kt @@ -42,7 +42,7 @@ class LibrusApiAttendances(override val data: DataLibrus, val teacherId = attendance.getJsonObject("AddedBy")?.getLong("Id") val semester = attendance.getInt("Semester") ?: return@forEach val type = attendance.getJsonObject("Type")?.getLong("Id") ?: return@forEach - val typeObject = data.attendanceTypes.get(type) + val typeObject = data.attendanceTypes[type] ?: null val topic = typeObject?.name ?: "" val startTime = data.lessonRanges.get(lessonNo).startTime @@ -60,13 +60,13 @@ class LibrusApiAttendances(override val data: DataLibrus, topic, lessonDate, startTime, - typeObject.type + typeObject?.type ?: Attendance.TYPE_CUSTOM ) val addedDate = Date.fromIso(attendance.getString("AddDate") ?: return@forEach) data.attendanceList.add(attendanceObject) - if(typeObject.type != Attendance.TYPE_PRESENT) { + if(typeObject?.type != Attendance.TYPE_PRESENT) { data.metadataList.add(Metadata( profileId, Metadata.TYPE_ATTENDANCE, diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginApi.kt b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginApi.kt index 0f843a88..fe155abe 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginApi.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/data/api/edziennik/librus/login/LibrusLoginApi.kt @@ -137,6 +137,7 @@ class LibrusLoginApi { "librus_change_password_error" -> ERROR_LOGIN_LIBRUS_API_CHANGE_PASSWORD_ERROR "librus_password_change_required" -> ERROR_LOGIN_LIBRUS_API_PASSWORD_CHANGE_REQUIRED "invalid_grant" -> ERROR_LOGIN_LIBRUS_API_INVALID_LOGIN + "invalid_request" -> ERROR_LOGIN_LIBRUS_API_INVALID_REQUEST else -> ERROR_LOGIN_LIBRUS_API_OTHER }.let { errorCode -> data.error(ApiError(TAG, errorCode) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/QrScannerDialog.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/QrScannerDialog.kt index 65bcff40..d02f5a3f 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/QrScannerDialog.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/dialogs/QrScannerDialog.kt @@ -40,7 +40,7 @@ class QrScannerDialog( onShowListener?.invoke(TAG) app = activity.applicationContext as App scannerView = ZXingScannerView(activity) - scannerView.setPadding(0, 16.dp, 4.dp, 0) + scannerView.setPadding(0, 16.dp, 2.dp, 0) dialog = MaterialAlertDialogBuilder(activity) .setTitle(R.string.qr_scanner_dialog_title) .setView(scannerView) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusJstFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusJstFragment.kt index 9799d805..d4e3d445 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusJstFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginLibrusJstFragment.kt @@ -4,19 +4,27 @@ package pl.szczodrzynski.edziennik.ui.modules.login +import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.WindowManager import androidx.fragment.app.Fragment +import com.mikepenz.iconics.IconicsDrawable +import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial +import com.mikepenz.iconics.utils.colorInt +import com.mikepenz.iconics.utils.sizeDp import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.data.api.ERROR_LOGIN_LIBRUS_API_INVALID_LOGIN +import pl.szczodrzynski.edziennik.data.api.ERROR_LOGIN_LIBRUS_API_INVALID_REQUEST import pl.szczodrzynski.edziennik.data.api.LOGIN_MODE_LIBRUS_JST import pl.szczodrzynski.edziennik.data.api.LOGIN_TYPE_LIBRUS import pl.szczodrzynski.edziennik.databinding.FragmentLoginLibrusJstBinding +import pl.szczodrzynski.edziennik.ui.dialogs.QrScannerDialog import java.util.* import kotlin.coroutines.CoroutineContext @@ -47,12 +55,26 @@ class LoginLibrusJstFragment : Fragment(), CoroutineScope { activity.lastError = null startCoroutineTimer(delayMillis = 100) { when (error.errorCode) { - ERROR_LOGIN_LIBRUS_API_INVALID_LOGIN -> + ERROR_LOGIN_LIBRUS_API_INVALID_LOGIN, + ERROR_LOGIN_LIBRUS_API_INVALID_REQUEST -> b.loginCodeLayout.error = getString(R.string.login_error_incorrect_code_or_pin) } } } + b.loginQrScan.setImageDrawable(IconicsDrawable(activity) + .icon(CommunityMaterial.Icon2.cmd_qrcode_scan) + .colorInt(Color.BLACK) + .sizeDp(72)) + b.loginQrScan.onClick { + QrScannerDialog(activity, { code -> + b.loginCode.setText(code) + if (b.loginPin.requestFocus()) { + activity.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); + } + }) + } + b.helpButton.onClick { nav.navigate(R.id.loginLibrusHelpFragment, null, LoginActivity.navOptions) } b.backButton.onClick { nav.navigateUp() } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginVulcanFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginVulcanFragment.kt index 9a3f2590..63ea9834 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginVulcanFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/modules/login/LoginVulcanFragment.kt @@ -4,17 +4,25 @@ package pl.szczodrzynski.edziennik.ui.modules.login +import android.graphics.Color import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.WindowManager import androidx.fragment.app.Fragment +import com.mikepenz.iconics.IconicsDrawable +import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial +import com.mikepenz.iconics.utils.colorInt +import com.mikepenz.iconics.utils.sizeDp import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import pl.szczodrzynski.edziennik.* import pl.szczodrzynski.edziennik.data.api.* import pl.szczodrzynski.edziennik.databinding.FragmentLoginVulcanBinding +import pl.szczodrzynski.edziennik.ui.dialogs.QrScannerDialog +import pl.szczodrzynski.edziennik.utils.Utils import java.util.* import kotlin.coroutines.CoroutineContext @@ -57,6 +65,26 @@ class LoginVulcanFragment : Fragment(), CoroutineScope { } } + b.loginQrScan.setImageDrawable(IconicsDrawable(activity) + .icon(CommunityMaterial.Icon2.cmd_qrcode_scan) + .colorInt(Color.BLACK) + .sizeDp(72)) + b.loginQrScan.onClick { + QrScannerDialog(activity, { code -> + try { + val data = Utils.VulcanQrEncryptionUtils.decode(code) + "CERT#https?://.+?/([A-z]+)/mobile-api#([A-z0-9]+)#ENDCERT".toRegex().find(data)?.let { + b.loginToken.setText(it[2]) + b.loginSymbol.setText(it[1]) + if (b.loginPin.requestFocus()) { + activity.window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); + } + } + } + catch (_: Exception) {} + }) + } + b.helpButton.onClick { nav.navigate(R.id.loginVulcanHelpFragment, null, LoginActivity.navOptions) } b.backButton.onClick { nav.navigateUp() } diff --git a/app/src/main/res/layout/fragment_login_librus_jst.xml b/app/src/main/res/layout/fragment_login_librus_jst.xml index 3755af52..53390d63 100644 --- a/app/src/main/res/layout/fragment_login_librus_jst.xml +++ b/app/src/main/res/layout/fragment_login_librus_jst.xml @@ -67,24 +67,48 @@ android:layout_width="match_parent" android:layout_height="16dp" /> - + android:layout_height="match_parent" + android:orientation="horizontal"> - - + android:layout_marginLeft="16dp" + android:layout_weight="1" + android:hint="@string/login_hint_token" + app:errorEnabled="true" + app:hintAnimationEnabled="true" + app:hintEnabled="true"> + + + + + + + - \ No newline at end of file + diff --git a/app/src/main/res/values/errors.xml b/app/src/main/res/values/errors.xml index 1ac75414..7bea2a25 100644 --- a/app/src/main/res/values/errors.xml +++ b/app/src/main/res/values/errors.xml @@ -97,6 +97,7 @@ ERROR_LOGIN_LIBRUS_PORTAL_CSRF_EXPIRED ERROR_LIBRUS_API_DEVICE_REGISTERED ERROR_LIBRUS_MESSAGES_NOT_FOUND + ERROR_LOGIN_LIBRUS_API_INVALID_REQUEST ERROR_LOGIN_MOBIDZIENNIK_WEB_INVALID_LOGIN ERROR_LOGIN_MOBIDZIENNIK_WEB_OLD_PASSWORD @@ -245,7 +246,7 @@ API Portalu Librus wyłączone Konto Synergia zostało rozłączone Inny błąd Portalu Librus - Nie znaleziono konta Synergia + Nie znaleziono konta Synergia. Zaloguj się na stronie portal.librus.pl, a następnie powiąż swoje konto Synergia do konta Librus Portal. Inny błąd logowania do Portalu Librus ERROR_LOGIN_LIBRUS_PORTAL_CODE_EXPIRED ERROR_LOGIN_LIBRUS_PORTAL_CODE_REVOKED @@ -260,8 +261,8 @@ ERROR_LIBRUS_SYNERGIA_OTHER Librus Synergia: przerwa techniczna Librus Wiadomości: przerwa techniczna - ERROR_LIBRUS_MESSAGES_ERROR - ERROR_LIBRUS_MESSAGES_OTHER + Librus Wiadomości: serwer zwrócił błąd. Prześlij zgłoszenie błędu. + Librus Wiadomości: serwer zwrócił nieznany błąd. Prześlij zgłoszenie błędu. Librus Wiadomości: nieprawidłowe dane logowania Librus Portal: nieprawidłowe dane logowania Librus API: przerwa techniczna @@ -270,6 +271,7 @@ Librus: Sesja logowania wygasła. Zaloguj się ponownie. Urządzenie jest już zarejestrowane Nie znaleziono wiadomości. Mogła zostać usunięta. + Nieprawidłowe dane dostępu. Sprawdź poprawność wprowadzonych danych. Nieprawidłowy login lub hasło Podano stare hasło @@ -334,7 +336,7 @@ EXCEPTION_LOGIN_LIBRUS_API_TOKEN EXCEPTION_LOGIN_LIBRUS_PORTAL_TOKEN EXCEPTION_LIBRUS_PORTAL_SYNERGIA_TOKEN - EXCEPTION_LIBRUS_API_REQUEST + Zgłoś błąd: wyjątek w API Librus EXCEPTION_LIBRUS_SYNERGIA_REQUEST EXCEPTION_MOBIDZIENNIK_WEB_REQUEST EXCEPTION_VULCAN_API_REQUEST