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