1
0
mirror of https://github.com/wulkanowy/wulkanowy.git synced 2024-09-20 01:49:09 -05:00

Merge branch 'release/0.14.1'

This commit is contained in:
Mikołaj Pich 2020-01-09 00:53:51 +01:00
commit 16e3a877af
21 changed files with 190 additions and 65 deletions

View File

@ -14,7 +14,7 @@ cache:
branches:
only:
- develop
- 0.14.0
- 0.14.1
android:
licenses:

View File

@ -7,11 +7,11 @@
[![F-Droid](https://img.shields.io/f-droid/v/io.github.wulkanowy.svg?style=flat-square)](https://f-droid.org/packages/io.github.wulkanowy/)
[![Last release](https://img.shields.io/github/release/wulkanowy/wulkanowy.svg?logo=github&style=flat-square)](https://github.com/wulkanowy/wulkanowy/releases)
Unofficial android VULCAN UONET+ register client for student and parent
Unofficial android VULCAN UONET+ register client for both students and their parents
## Features
* logging in using the email and password
* logging in using the email and password OR using token and pin
* functions from the register website:
* grades
* grade statistics
@ -24,7 +24,7 @@ Unofficial android VULCAN UONET+ register client for student and parent
* homework
* notes
* lucky number
* calculation of the average
* calculation of the average independently of school's preferences
* notifications, e.g. about a new grade
* dark and black (AMOLED) theme
* offline mode
@ -32,16 +32,16 @@ Unofficial android VULCAN UONET+ register client for student and parent
## Download
You can download the current beta from the Google Play or Fdroid store
You can download the current beta version from the Google Play or the F-Droid store
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
alt="Get it on Google Play"
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
alt="Get it on Fdroid"
alt="Get it on F-Droid"
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
You can also download a [development version](https://wulkanowy.github.io/#download) that includes new features prepared for the next release
You can also download a [development version](https://wulkanowy.github.io/#download) that includes new features being prepared for the next release
## Built With

View File

@ -11,7 +11,7 @@ Nieoficjalny klient dziennika VULCAN UONET+ dla ucznia i rodzica
## Funkcje
* logowanie za pomocą e-maila i hasła
* logowanie za pomocą e-maila i hasła LUB tokena i pinu
* funkcje ze strony internetowej dziennika:
* oceny
* statystyki ocen
@ -24,7 +24,7 @@ Nieoficjalny klient dziennika VULCAN UONET+ dla ucznia i rodzica
* zadania domowe
* uwagi
* szczęśliwy numerek
* obliczanie średniej
* obliczanie średniej niezależnie od preferencji szkoły
* powiadomienia np. o nowej ocenie
* ciemny i czarny (AMOLED) motyw
* tryb offilne
@ -32,13 +32,13 @@ Nieoficjalny klient dziennika VULCAN UONET+ dla ucznia i rodzica
## Pobierz
Aktualną wersję beta możesz pobrać ze sklepu Google Play lub Fdroid
Aktualną wersję beta możesz pobrać ze sklepu Google Play lub F-Droid
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
alt="Pobierz z Google Play"
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy)
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
alt="Pobierz z Fdroid"
alt="Pobierz z F-Droid"
height="80">](https://f-droid.org/packages/io.github.wulkanowy/)
@ -59,4 +59,4 @@ Wnieś swój wkład w projekt, tworząc PR lub wysyłając issue na GitHub.
## Licencja
Ten projekt jest licencjonowany w ramach Apache License 2.0 - szczegóły w pliku [LICENSE](LICENSE)
Ten projekt udostępniany jest na licencji Apache License 2.0 - szczegóły w pliku [LICENSE](LICENSE)

View File

@ -17,8 +17,8 @@ android {
testApplicationId "io.github.tests.wulkanowy"
minSdkVersion 16
targetSdkVersion 29
versionCode 49
versionName "0.14.0"
versionCode 50
versionName "0.14.1"
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
@ -110,9 +110,9 @@ play {
}
ext {
work_manager = "2.3.0-beta02"
work_manager = "2.3.0-rc01"
room = "2.2.3"
dagger = "2.25.3"
dagger = "2.25.4"
chucker = "2.0.4"
mockk = "1.9.2"
}
@ -122,14 +122,14 @@ configurations.all {
}
dependencies {
implementation "io.github.wulkanowy:sdk:0.14.0"
implementation "io.github.wulkanowy:sdk:0.14.1"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation "androidx.core:core-ktx:1.2.0-rc01"
implementation "androidx.activity:activity-ktx:1.1.0-rc03"
implementation "androidx.appcompat:appcompat:1.1.0"
implementation "androidx.appcompat:appcompat-resources:1.1.0"
implementation "androidx.fragment:fragment-ktx:1.2.0-rc04"
implementation "androidx.fragment:fragment-ktx:1.2.0-rc05"
implementation "androidx.annotation:annotation:1.1.0"
implementation "androidx.multidex:multidex:2.0.1"
@ -173,8 +173,8 @@ dependencies {
implementation "com.jakewharton.threetenabp:threetenabp:1.2.1"
implementation "com.jakewharton.timber:timber:4.7.1"
implementation "at.favre.lib:slf4j-timber:1.0.1"
implementation "com.squareup.okhttp3:logging-interceptor:3.12.6"
implementation "com.mikepenz:aboutlibraries:7.0.4"
implementation "com.squareup.okhttp3:logging-interceptor:3.12.7"
implementation "com.mikepenz:aboutlibraries-core:7.1.0"
implementation 'com.wdullaer:materialdatetimepicker:4.2.3'
playImplementation "com.google.firebase:firebase-core:17.2.1"
@ -185,7 +185,7 @@ dependencies {
debugImplementation "fr.o80.chucker:library:$chucker"
debugImplementation "com.amitshekhar.android:debug-db:1.0.6"
testImplementation "junit:junit:4.12"
testImplementation "junit:junit:4.13"
testImplementation "io.mockk:mockk:$mockk"
testImplementation "org.threeten:threetenbp:1.4.0"
testImplementation "org.mockito:mockito-inline:3.2.4"

View File

@ -38,6 +38,7 @@ class GradeDetailsHeader(
gradeHeaderAverage.text = average
gradeHeaderNumber.text = number
gradeHeaderNote.visibility = if (newGrades > 0) VISIBLE else GONE
if (newGrades > 0) gradeHeaderNote.text = newGrades.toString(10)
gradeHeaderContainer.isEnabled = isExpandable
isViewExpandable = isExpandable

View File

@ -47,6 +47,13 @@ class GradeStatisticsFragment : BaseFragment(), GradeStatisticsView, GradeView.G
override val isBarViewEmpty get() = gradeStatisticsChartPoints.isEmpty
override val currentType
get() = when (gradeStatisticsTypeSwitch.checkedRadioButtonId) {
R.id.gradeStatisticsTypeSemester -> ViewType.SEMESTER
R.id.gradeStatisticsTypePartial -> ViewType.PARTIAL
else -> ViewType.POINTS
}
private lateinit var gradeColors: List<Pair<Int, Int>>
private val vulcanGradeColors = listOf(
@ -272,13 +279,7 @@ class GradeStatisticsFragment : BaseFragment(), GradeStatisticsView, GradeView.G
override fun onResume() {
super.onResume()
gradeStatisticsTypeSwitch.setOnCheckedChangeListener { _, checkedId ->
presenter.onTypeChange(when (checkedId) {
R.id.gradeStatisticsTypeSemester -> ViewType.SEMESTER
R.id.gradeStatisticsTypePartial -> ViewType.PARTIAL
else -> ViewType.POINTS
})
}
gradeStatisticsTypeSwitch.setOnCheckedChangeListener { _, _ -> presenter.onTypeChange() }
}
override fun onSaveInstanceState(outState: Bundle) {

View File

@ -94,7 +94,8 @@ class GradeStatisticsPresenter @Inject constructor(
}
}
fun onTypeChange(type: ViewType) {
fun onTypeChange() {
val type = view?.let { it.currentType } ?: ViewType.POINTS
Timber.i("Select grade stats semester: $type")
disposable.clear()
view?.run {
@ -214,7 +215,7 @@ class GradeStatisticsPresenter @Inject constructor(
private fun showErrorViewOnError(message: String, error: Throwable) {
view?.run {
if (isBarViewEmpty || isPieViewEmpty) {
if ((isBarViewEmpty && currentType == ViewType.POINTS) || (isPieViewEmpty) && currentType != ViewType.POINTS) {
lastError = error
setErrorDetails(message)
showErrorView(true)

View File

@ -10,6 +10,8 @@ interface GradeStatisticsView : BaseView {
val isBarViewEmpty: Boolean
val currentType: ViewType
fun initView()
fun updateSubjects(data: ArrayList<String>)

View File

@ -5,6 +5,10 @@ import android.database.sqlite.SQLiteConstraintException
import com.readystatesoftware.chuck.api.ChuckCollector
import io.github.wulkanowy.R
import io.github.wulkanowy.sdk.exception.BadCredentialsException
import io.github.wulkanowy.sdk.mobile.exception.InvalidPinException
import io.github.wulkanowy.sdk.mobile.exception.InvalidSymbolException
import io.github.wulkanowy.sdk.mobile.exception.InvalidTokenException
import io.github.wulkanowy.sdk.mobile.exception.TokenDeadException
import io.github.wulkanowy.ui.base.ErrorHandler
import javax.inject.Inject
@ -15,12 +19,22 @@ class LoginErrorHandler @Inject constructor(
var onBadCredentials: () -> Unit = {}
var onInvalidToken: (String) -> Unit = {}
var onInvalidPin: (String) -> Unit = {}
var onInvalidSymbol: (String) -> Unit = {}
var onStudentDuplicate: (String) -> Unit = {}
override fun proceed(error: Throwable) {
when (error) {
is BadCredentialsException -> onBadCredentials()
is SQLiteConstraintException -> onStudentDuplicate(resources.getString(R.string.login_duplicate_student))
is TokenDeadException -> onInvalidToken(resources.getString(R.string.login_expired_token))
is InvalidTokenException -> onInvalidToken(resources.getString(R.string.login_invalid_token))
is InvalidPinException -> onInvalidPin(resources.getString(R.string.login_invalid_pin))
is InvalidSymbolException -> onInvalidSymbol(resources.getString(R.string.login_invalid_symbol))
else -> super.proceed(error)
}
}

View File

@ -4,7 +4,9 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import android.widget.ArrayAdapter
import androidx.appcompat.widget.AppCompatEditText
import androidx.core.widget.doOnTextChanged
import io.github.wulkanowy.R
import io.github.wulkanowy.data.db.entities.Student
@ -84,6 +86,9 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView {
})
}
loginFormPin.setOnEditorDoneSignIn()
loginFormPass.setOnEditorDoneSignIn()
loginFormSymbol.setAdapter(ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, resources.getStringArray(R.array.symbols_values)))
with(loginFormHost) {
@ -92,6 +97,12 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView {
}
}
private fun AppCompatEditText.setOnEditorDoneSignIn() {
setOnEditorActionListener { _, id, _ ->
if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) loginFormSignIn.callOnClick() else false
}
}
override fun setDefaultCredentials(name: String, pass: String, symbol: String, token: String, pin: String) {
loginFormName.setText(name)
loginFormPass.setText(pass)
@ -101,54 +112,75 @@ class LoginAdvancedFragment : BaseFragment(), LoginAdvancedView {
}
override fun setErrorNameRequired() {
loginFormNameLayout.run {
with(loginFormNameLayout) {
requestFocus()
error = getString(R.string.login_field_required)
}
}
override fun setErrorPassRequired(focus: Boolean) {
loginFormPassLayout.run {
with(loginFormPassLayout) {
if (focus) requestFocus()
error = getString(R.string.login_field_required)
}
}
override fun setErrorPassInvalid(focus: Boolean) {
loginFormPassLayout.run {
with(loginFormPassLayout) {
if (focus) requestFocus()
error = getString(R.string.login_invalid_password)
}
}
override fun setErrorPassIncorrect() {
loginFormPassLayout.run {
with(loginFormPassLayout) {
requestFocus()
error = getString(R.string.login_incorrect_password)
}
}
override fun setErrorPinRequired() {
loginFormPinLayout.run {
with(loginFormPinLayout) {
requestFocus()
error = getString(R.string.login_field_required)
}
}
override fun setErrorPinInvalid(message: String) {
with(loginFormPinLayout) {
requestFocus()
error = message
}
}
override fun setErrorSymbolRequired() {
loginFormSymbolLayout.run {
with(loginFormSymbolLayout) {
requestFocus()
error = getString(R.string.login_field_required)
}
}
override fun setErrorSymbolInvalid(message: String) {
with(loginFormSymbolLayout) {
requestFocus()
error = message
}
}
override fun setErrorTokenRequired() {
loginFormTokenLayout.run {
with(loginFormTokenLayout) {
requestFocus()
error = getString(R.string.login_field_required)
}
}
override fun setErrorTokenInvalid(message: String) {
with(loginFormTokenLayout) {
requestFocus()
error = message
}
}
override fun clearNameError() {
loginFormNameLayout.error = null
}

View File

@ -24,14 +24,47 @@ class LoginAdvancedPresenter @Inject constructor(
view.run {
initView()
showOnlyScrapperModeInputs()
loginErrorHandler.onBadCredentials = {
setErrorPassIncorrect()
showSoftKeyboard()
Timber.i("Entered wrong username or password")
with(loginErrorHandler) {
onBadCredentials = ::onBadCredentials
onInvalidToken = ::onInvalidToken
onInvalidSymbol = ::onInvalidSymbol
onInvalidPin = ::onInvalidPin
}
}
}
private fun onBadCredentials() {
view?.run {
setErrorPassIncorrect()
showSoftKeyboard()
Timber.i("Entered wrong username or password")
}
}
private fun onInvalidToken(message: String) {
view?.run {
setErrorTokenInvalid(message)
showSoftKeyboard()
Timber.i("Entered invalid token")
}
}
private fun onInvalidSymbol(message: String) {
view?.run {
setErrorSymbolInvalid(message)
showSoftKeyboard()
Timber.i("Entered invalid symbol")
}
}
private fun onInvalidPin(message: String) {
view?.run {
setErrorPinInvalid(message)
showSoftKeyboard()
Timber.i("Entered invalid PIN")
}
}
fun onHostSelected() {
view?.apply {
clearPassError()

View File

@ -53,10 +53,16 @@ interface LoginAdvancedView : BaseView {
fun setErrorPinRequired()
fun setErrorPinInvalid(message: String)
fun setErrorSymbolRequired()
fun setErrorSymbolInvalid(message: String)
fun setErrorTokenRequired()
fun setErrorTokenInvalid(message: String)
fun showOnlyHybridModeInputs()
fun showOnlyScrapperModeInputs()

View File

@ -1,7 +1,8 @@
Wersja 0.14.0
Wersja 0.14.1
- dodane zostały nowe opcje logowania, m.in. logowanie przez token
- naprawione zostało wyświetlanie nauczyciela, kiedy zastępstwo zostanie usunięte z danej lekcji
- naprawiony został biały ekran w szczęśliwym numerku
- naprawiliśmy logowanie użytkownikom, którzy mieli przypisanych do konta uczniów ze szkół z wyłączonymi dziennikami
- naprawiliśmy problemy z wysyłaniem wiadomości i odświeżaniem ocen spowodowanych ostatnią aktualizacją
- dodaliśmy informację o liczbie nieprzeczytanych ocen w nagłówku przedmiotu
- ulepszyliśmy informacje o błędach przy logowaniu w trybie mobilnym
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="?colorPrimary"/>
<corners android:radius="12dp"/>
</shape>

View File

@ -188,8 +188,6 @@
android:id="@+id/loginFormToken"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:imeActionLabel="@string/login_sign_in"
android:imeOptions="actionDone"
android:inputType="textCapCharacters"
android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout>

View File

@ -7,7 +7,7 @@
android:background="?selectableItemBackground"
android:paddingLeft="16dp"
android:paddingTop="10dp"
android:paddingRight="12dp"
android:paddingRight="14dp"
android:paddingBottom="10dp"
tools:context=".ui.modules.grade.details.GradeDetailsHeader"
android:paddingEnd="12dp"
@ -50,14 +50,19 @@
android:textSize="12sp"
tools:text="12 grades" />
<ImageView
<TextView
android:id="@+id/gradeHeaderNote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minWidth="20dp"
android:layout_height="20dp"
android:paddingLeft="5dp"
android:paddingRight="5dp"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:gravity="center"
android:layout_marginTop="10dp"
app:srcCompat="@drawable/ic_all_round_mark"
app:tint="?colorPrimary"
tools:ignore="contentDescription" />
android:background="@drawable/background_header_note"
android:textColor="?colorOnPrimary"
android:textSize="14sp"
tools:text="255" />
</RelativeLayout>

View File

@ -28,7 +28,7 @@
<string name="login_host_hint">Dziennik</string>
<string name="login_symbol_hint">Symbol</string>
<string name="login_type_api">Mobilne API</string>
<string name="login_type_scrapper">Scrapper</string>
<string name="login_type_scrapper">Scraper</string>
<string name="login_type_hybrid">Hybrydowe</string>
<string name="login_token_hint">Token</string>
<string name="login_pin_hint">PIN</string>
@ -36,6 +36,10 @@
<string name="login_sign_in">Zaloguj</string>
<string name="login_invalid_password">To hasło jest za krótkie</string>
<string name="login_incorrect_password">Dane logowania są niepoprawne</string>
<string name="login_invalid_pin">Nieprawidłowy PIN</string>
<string name="login_invalid_token">Nieprawidłowy token</string>
<string name="login_expired_token">Token stracił ważność</string>
<string name="login_invalid_symbol">Niepoprawny symbol</string>
<string name="login_incorrect_symbol">Nie znaleziono ucznia. Sprawdź symbol</string>
<string name="login_field_required">To pole jest wymagane</string>
<string name="login_duplicate_student">Wybrany uczeń jest już zalogowany</string>
@ -355,7 +359,7 @@
<!--Errors-->
<string name="error_no_internet">Brak połączenia z internetem</string>
<string name="error_timeout">Zbyt długie oczekiwanie na połączenie z dziennikiem</string>
<string name="error_timeout">Upłynął limit czasu na połączenie z dziennikiem</string>
<string name="error_login_failed">Logowanie nie powiodło się. Spróbuj ponownie lub zrestartuj aplikację</string>
<string name="error_service_unavailable">Dziennik jest niedostępny. Spróbuj ponownie później</string>
<string name="error_unknown">Wystąpił nieoczekiwany błąd</string>

View File

@ -28,15 +28,26 @@
<string name="login_nickname_hint">Электронная почта или имя пользователя</string>
<string name="login_password_hint">Пароль</string>
<string name="login_host_hint">Дневник</string>
<string name="login_type_api">Мобильный API</string>
<string name="login_type_scrapper">Scraper</string>
<string name="login_type_hybrid">Гибрид</string>
<string name="login_token_hint">Token</string>
<string name="login_pin_hint">PIN</string>
<string name="login_api_key_hint">клавиша API</string>
<string name="login_symbol_hint">Symbol</string>
<string name="login_sign_in">Войти</string>
<string name="login_invalid_password">Слишком короткий пароль</string>
<string name="login_incorrect_password">Указаны неверные данные</string>
<string name="login_invalid_pin">Недействительный PIN</string>
<string name="login_invalid_token">Недействительный token</string>
<string name="login_expired_token">Токен просрочен</string>
<string name="login_invalid_symbol">Недействительный symbol</string>
<string name="login_incorrect_symbol">Не удалось найти ученика. Пожалуйста, проверьте \"symbol\"</string>
<string name="login_field_required">Это поле обязательно</string>
<string name="login_duplicate_student">Данный ученик уже авторизован</string>
<string name="login_symbol_helper">Вы можете найти \"symbol\" в Uczeń -&gt; Dostęp Mobilny -&gt; Zarejestruj urządzenie mobilne</string>
<string name="login_select_student">Выберите учеников для авторизации в приложении</string>
<string name="login_advanced">Другие варианты</string>
<string name="login_privacy_policy">Политика приватности</string>
<string name="login_contact_header">Проблемы с авторизацией? Свяжитесь с нами!</string>
<string name="login_contact_email">Электронная почта</string>
@ -261,6 +272,8 @@
<string name="about_version">Версия приложения</string>
<string name="about_feedback">Сообщить о ошибке</string>
<string name="about_feedback_summary">Отправить сообщение о ошибке через электронную почту</string>
<string name="about_faq">FAQ</string>
<string name="about_faq_summary">Читайте часто задаваемые вопросы</string>
<string name="about_discord">Сервер Discord</string>
<string name="about_discord_summary">Присоединиться к сообществу приложения</string>
<string name="about_privacy">Политика приватности</string>
@ -277,6 +290,7 @@
<!--Generic-->
<string name="all_content">Содержание</string>
<string name="all_retry">Снова</string>
<string name="all_description">Описание</string>
<string name="all_no_description">Нет описания</string>
<string name="all_teacher">Учитель</string>
@ -349,5 +363,6 @@
<string name="error_service_unavailable">Дневник недоступен. Попробуйте позже</string>
<string name="error_unknown">Произошла неожиданная ошибка</string>
<string name="error_feature_disabled">Функция была выключена школой</string>
<string name="error_feature_not_available">Функция не доступна в этом режиме</string>
</resources>

View File

@ -83,7 +83,7 @@
</string-array>
<string-array name="grade_average_mode_entries">
<item>Average grades from the 2nd semester</item>
<item>Average of grades only from the 2nd semester</item>
<item>Average of grades from the whole year</item>
</string-array>
<string-array name="grade_average_mode_values" translatable="false">

View File

@ -27,18 +27,22 @@
<string name="login_password_hint">Password</string>
<string name="login_host_hint">Register</string>
<string name="login_type_api">Mobile API</string>
<string name="login_type_scrapper">Scrapper</string>
<string name="login_type_scrapper">Scraper</string>
<string name="login_type_hybrid">Hybrid</string>
<string name="login_token_hint">Token</string>
<string name="login_pin_hint">PIN</string>
<string name="login_api_key_hint">API key</string>
<string name="login_symbol_hint">Symbol</string>
<string name="login_sign_in">Sign in</string>
<string name="login_invalid_password">This password is too short</string>
<string name="login_invalid_password">Password too short</string>
<string name="login_incorrect_password">Login details are incorrect</string>
<string name="login_invalid_pin">Invalid PIN</string>
<string name="login_invalid_token">Invalid token</string>
<string name="login_expired_token">Token expired</string>
<string name="login_invalid_symbol">Invalid symbol</string>
<string name="login_incorrect_symbol">Student not found. Check the symbol</string>
<string name="login_field_required">This field is required</string>
<string name="login_duplicate_student">The selected student is already logged in</string>
<string name="login_duplicate_student">Selected student is already logged in</string>
<string name="login_symbol_helper">The symbol can be found on the register page in Uczeń -> Dostęp Mobilny -> Zarejestruj urządzenie mobilne</string>
<string name="login_select_student">Select students to log in to the application</string>
<string name="login_advanced">Other options</string>
@ -206,7 +210,7 @@
<!--Mobile devices-->
<string name="mobile_devices_title">Mobile devices</string>
<string name="mobile_devices_no_items">No devices</string>
<string name="mobile_devices_unregister">Unregister</string>
<string name="mobile_devices_unregister">Deregister</string>
<string name="mobile_device_removed">Device removed</string>
<string name="mobile_device_qr">QR code</string>
<string name="mobile_device_token">Token</string>
@ -305,7 +309,7 @@
<string name="pref_services_header">Synchronization</string>
<string name="pref_services_switch">Automatic update</string>
<string name="pref_services_suspended">Suspended on holiday</string>
<string name="pref_services_suspended">Suspended on holidays</string>
<string name="pref_services_interval">Updates interval</string>
<string name="pref_services_wifi">Wi-Fi only</string>
@ -336,10 +340,11 @@
<!--Errors-->
<string name="error_no_internet">No internet connection</string>
<string name="error_timeout">Too long waiting time for connection to the register</string>
<string name="error_login_failed">Login is failed. Try again or restart the app</string>
<string name="error_service_unavailable">The log is not available. Try again later</string>
<string name="error_timeout">Connection to the register timed out</string>
<string name="error_login_failed">Login failed. Try again or restart the app</string>
<string name="error_service_unavailable">The register is not available. Try again later</string>
<string name="error_unknown">An unexpected error occurred</string>
<string name="error_feature_disabled">Feature disabled by your school</string>
<string name="error_feature_not_available">Feature not available in this mode</string>
</resources>

View File

@ -57,6 +57,7 @@ class AttendanceRemoteTest {
subject = "Fizyka",
name = "Obecność",
date = date,
timeId = 0,
number = 0,
deleted = false,
excusable = false,
@ -65,7 +66,8 @@ class AttendanceRemoteTest {
lateness = false,
presence = false,
categoryId = 1,
absence = false
absence = false,
excuseStatus = null
)
}
}