1
0
mirror of https://github.com/wulkanowy/wulkanowy.git synced 2025-01-31 22:52:44 +01: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: branches:
only: only:
- develop - develop
- 0.14.0 - 0.14.1
android: android:
licenses: 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/) [![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) [![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 ## 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: * functions from the register website:
* grades * grades
* grade statistics * grade statistics
@ -24,7 +24,7 @@ Unofficial android VULCAN UONET+ register client for student and parent
* homework * homework
* notes * notes
* lucky number * lucky number
* calculation of the average * calculation of the average independently of school's preferences
* notifications, e.g. about a new grade * notifications, e.g. about a new grade
* dark and black (AMOLED) theme * dark and black (AMOLED) theme
* offline mode * offline mode
@ -32,16 +32,16 @@ Unofficial android VULCAN UONET+ register client for student and parent
## Download ## 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" [<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
alt="Get it on Google Play" alt="Get it on Google Play"
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy) 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" [<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/) 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 ## Built With

View File

@ -11,7 +11,7 @@ Nieoficjalny klient dziennika VULCAN UONET+ dla ucznia i rodzica
## Funkcje ## 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: * funkcje ze strony internetowej dziennika:
* oceny * oceny
* statystyki ocen * statystyki ocen
@ -24,7 +24,7 @@ Nieoficjalny klient dziennika VULCAN UONET+ dla ucznia i rodzica
* zadania domowe * zadania domowe
* uwagi * uwagi
* szczęśliwy numerek * szczęśliwy numerek
* obliczanie średniej * obliczanie średniej niezależnie od preferencji szkoły
* powiadomienia np. o nowej ocenie * powiadomienia np. o nowej ocenie
* ciemny i czarny (AMOLED) motyw * ciemny i czarny (AMOLED) motyw
* tryb offilne * tryb offilne
@ -32,13 +32,13 @@ Nieoficjalny klient dziennika VULCAN UONET+ dla ucznia i rodzica
## Pobierz ## 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" [<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png"
alt="Pobierz z Google Play" alt="Pobierz z Google Play"
height="80">](https://play.google.com/store/apps/details?id=io.github.wulkanowy) 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" [<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/) 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 ## 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" testApplicationId "io.github.tests.wulkanowy"
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 29 targetSdkVersion 29
versionCode 49 versionCode 50
versionName "0.14.0" versionName "0.14.1"
multiDexEnabled true multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true vectorDrawables.useSupportLibrary = true
@ -110,9 +110,9 @@ play {
} }
ext { ext {
work_manager = "2.3.0-beta02" work_manager = "2.3.0-rc01"
room = "2.2.3" room = "2.2.3"
dagger = "2.25.3" dagger = "2.25.4"
chucker = "2.0.4" chucker = "2.0.4"
mockk = "1.9.2" mockk = "1.9.2"
} }
@ -122,14 +122,14 @@ configurations.all {
} }
dependencies { 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 "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation "androidx.core:core-ktx:1.2.0-rc01" implementation "androidx.core:core-ktx:1.2.0-rc01"
implementation "androidx.activity:activity-ktx:1.1.0-rc03" implementation "androidx.activity:activity-ktx:1.1.0-rc03"
implementation "androidx.appcompat:appcompat:1.1.0" implementation "androidx.appcompat:appcompat:1.1.0"
implementation "androidx.appcompat:appcompat-resources: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.annotation:annotation:1.1.0"
implementation "androidx.multidex:multidex:2.0.1" implementation "androidx.multidex:multidex:2.0.1"
@ -173,8 +173,8 @@ dependencies {
implementation "com.jakewharton.threetenabp:threetenabp:1.2.1" implementation "com.jakewharton.threetenabp:threetenabp:1.2.1"
implementation "com.jakewharton.timber:timber:4.7.1" implementation "com.jakewharton.timber:timber:4.7.1"
implementation "at.favre.lib:slf4j-timber:1.0.1" implementation "at.favre.lib:slf4j-timber:1.0.1"
implementation "com.squareup.okhttp3:logging-interceptor:3.12.6" implementation "com.squareup.okhttp3:logging-interceptor:3.12.7"
implementation "com.mikepenz:aboutlibraries:7.0.4" implementation "com.mikepenz:aboutlibraries-core:7.1.0"
implementation 'com.wdullaer:materialdatetimepicker:4.2.3' implementation 'com.wdullaer:materialdatetimepicker:4.2.3'
playImplementation "com.google.firebase:firebase-core:17.2.1" playImplementation "com.google.firebase:firebase-core:17.2.1"
@ -185,7 +185,7 @@ dependencies {
debugImplementation "fr.o80.chucker:library:$chucker" debugImplementation "fr.o80.chucker:library:$chucker"
debugImplementation "com.amitshekhar.android:debug-db:1.0.6" 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 "io.mockk:mockk:$mockk"
testImplementation "org.threeten:threetenbp:1.4.0" testImplementation "org.threeten:threetenbp:1.4.0"
testImplementation "org.mockito:mockito-inline:3.2.4" testImplementation "org.mockito:mockito-inline:3.2.4"

View File

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

View File

@ -47,6 +47,13 @@ class GradeStatisticsFragment : BaseFragment(), GradeStatisticsView, GradeView.G
override val isBarViewEmpty get() = gradeStatisticsChartPoints.isEmpty 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 lateinit var gradeColors: List<Pair<Int, Int>>
private val vulcanGradeColors = listOf( private val vulcanGradeColors = listOf(
@ -272,13 +279,7 @@ class GradeStatisticsFragment : BaseFragment(), GradeStatisticsView, GradeView.G
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
gradeStatisticsTypeSwitch.setOnCheckedChangeListener { _, checkedId -> gradeStatisticsTypeSwitch.setOnCheckedChangeListener { _, _ -> presenter.onTypeChange() }
presenter.onTypeChange(when (checkedId) {
R.id.gradeStatisticsTypeSemester -> ViewType.SEMESTER
R.id.gradeStatisticsTypePartial -> ViewType.PARTIAL
else -> ViewType.POINTS
})
}
} }
override fun onSaveInstanceState(outState: Bundle) { 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") Timber.i("Select grade stats semester: $type")
disposable.clear() disposable.clear()
view?.run { view?.run {
@ -214,7 +215,7 @@ class GradeStatisticsPresenter @Inject constructor(
private fun showErrorViewOnError(message: String, error: Throwable) { private fun showErrorViewOnError(message: String, error: Throwable) {
view?.run { view?.run {
if (isBarViewEmpty || isPieViewEmpty) { if ((isBarViewEmpty && currentType == ViewType.POINTS) || (isPieViewEmpty) && currentType != ViewType.POINTS) {
lastError = error lastError = error
setErrorDetails(message) setErrorDetails(message)
showErrorView(true) showErrorView(true)

View File

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

View File

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

View File

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

View File

@ -24,12 +24,45 @@ class LoginAdvancedPresenter @Inject constructor(
view.run { view.run {
initView() initView()
showOnlyScrapperModeInputs() showOnlyScrapperModeInputs()
loginErrorHandler.onBadCredentials = { with(loginErrorHandler) {
onBadCredentials = ::onBadCredentials
onInvalidToken = ::onInvalidToken
onInvalidSymbol = ::onInvalidSymbol
onInvalidPin = ::onInvalidPin
}
}
}
private fun onBadCredentials() {
view?.run {
setErrorPassIncorrect() setErrorPassIncorrect()
showSoftKeyboard() showSoftKeyboard()
Timber.i("Entered wrong username or password") 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() { fun onHostSelected() {

View File

@ -53,10 +53,16 @@ interface LoginAdvancedView : BaseView {
fun setErrorPinRequired() fun setErrorPinRequired()
fun setErrorPinInvalid(message: String)
fun setErrorSymbolRequired() fun setErrorSymbolRequired()
fun setErrorSymbolInvalid(message: String)
fun setErrorTokenRequired() fun setErrorTokenRequired()
fun setErrorTokenInvalid(message: String)
fun showOnlyHybridModeInputs() fun showOnlyHybridModeInputs()
fun showOnlyScrapperModeInputs() 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 - naprawiliśmy logowanie użytkownikom, którzy mieli przypisanych do konta uczniów ze szkół z wyłączonymi dziennikami
- naprawione zostało wyświetlanie nauczyciela, kiedy zastępstwo zostanie usunięte z danej lekcji - naprawiliśmy problemy z wysyłaniem wiadomości i odświeżaniem ocen spowodowanych ostatnią aktualizacją
- naprawiony został biały ekran w szczęśliwym numerku - 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 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:id="@+id/loginFormToken"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:imeActionLabel="@string/login_sign_in"
android:imeOptions="actionDone"
android:inputType="textCapCharacters" android:inputType="textCapCharacters"
android:maxLines="1" /> android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>

View File

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

View File

@ -28,7 +28,7 @@
<string name="login_host_hint">Dziennik</string> <string name="login_host_hint">Dziennik</string>
<string name="login_symbol_hint">Symbol</string> <string name="login_symbol_hint">Symbol</string>
<string name="login_type_api">Mobilne API</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_type_hybrid">Hybrydowe</string>
<string name="login_token_hint">Token</string> <string name="login_token_hint">Token</string>
<string name="login_pin_hint">PIN</string> <string name="login_pin_hint">PIN</string>
@ -36,6 +36,10 @@
<string name="login_sign_in">Zaloguj</string> <string name="login_sign_in">Zaloguj</string>
<string name="login_invalid_password">To hasło jest za krótkie</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_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_incorrect_symbol">Nie znaleziono ucznia. Sprawdź symbol</string>
<string name="login_field_required">To pole jest wymagane</string> <string name="login_field_required">To pole jest wymagane</string>
<string name="login_duplicate_student">Wybrany uczeń jest już zalogowany</string> <string name="login_duplicate_student">Wybrany uczeń jest już zalogowany</string>
@ -355,7 +359,7 @@
<!--Errors--> <!--Errors-->
<string name="error_no_internet">Brak połączenia z internetem</string> <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_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_service_unavailable">Dziennik jest niedostępny. Spróbuj ponownie później</string>
<string name="error_unknown">Wystąpił nieoczekiwany błąd</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_nickname_hint">Электронная почта или имя пользователя</string>
<string name="login_password_hint">Пароль</string> <string name="login_password_hint">Пароль</string>
<string name="login_host_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_symbol_hint">Symbol</string>
<string name="login_sign_in">Войти</string> <string name="login_sign_in">Войти</string>
<string name="login_invalid_password">Слишком короткий пароль</string> <string name="login_invalid_password">Слишком короткий пароль</string>
<string name="login_incorrect_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_incorrect_symbol">Не удалось найти ученика. Пожалуйста, проверьте \"symbol\"</string>
<string name="login_field_required">Это поле обязательно</string> <string name="login_field_required">Это поле обязательно</string>
<string name="login_duplicate_student">Данный ученик уже авторизован</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_symbol_helper">Вы можете найти \"symbol\" в Uczeń -&gt; Dostęp Mobilny -&gt; Zarejestruj urządzenie mobilne</string>
<string name="login_select_student">Выберите учеников для авторизации в приложении</string> <string name="login_select_student">Выберите учеников для авторизации в приложении</string>
<string name="login_advanced">Другие варианты</string>
<string name="login_privacy_policy">Политика приватности</string> <string name="login_privacy_policy">Политика приватности</string>
<string name="login_contact_header">Проблемы с авторизацией? Свяжитесь с нами!</string> <string name="login_contact_header">Проблемы с авторизацией? Свяжитесь с нами!</string>
<string name="login_contact_email">Электронная почта</string> <string name="login_contact_email">Электронная почта</string>
@ -261,6 +272,8 @@
<string name="about_version">Версия приложения</string> <string name="about_version">Версия приложения</string>
<string name="about_feedback">Сообщить о ошибке</string> <string name="about_feedback">Сообщить о ошибке</string>
<string name="about_feedback_summary">Отправить сообщение о ошибке через электронную почту</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">Сервер Discord</string>
<string name="about_discord_summary">Присоединиться к сообществу приложения</string> <string name="about_discord_summary">Присоединиться к сообществу приложения</string>
<string name="about_privacy">Политика приватности</string> <string name="about_privacy">Политика приватности</string>
@ -277,6 +290,7 @@
<!--Generic--> <!--Generic-->
<string name="all_content">Содержание</string> <string name="all_content">Содержание</string>
<string name="all_retry">Снова</string>
<string name="all_description">Описание</string> <string name="all_description">Описание</string>
<string name="all_no_description">Нет описания</string> <string name="all_no_description">Нет описания</string>
<string name="all_teacher">Учитель</string> <string name="all_teacher">Учитель</string>
@ -349,5 +363,6 @@
<string name="error_service_unavailable">Дневник недоступен. Попробуйте позже</string> <string name="error_service_unavailable">Дневник недоступен. Попробуйте позже</string>
<string name="error_unknown">Произошла неожиданная ошибка</string> <string name="error_unknown">Произошла неожиданная ошибка</string>
<string name="error_feature_disabled">Функция была выключена школой</string> <string name="error_feature_disabled">Функция была выключена школой</string>
<string name="error_feature_not_available">Функция не доступна в этом режиме</string>
</resources> </resources>

View File

@ -83,7 +83,7 @@
</string-array> </string-array>
<string-array name="grade_average_mode_entries"> <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> <item>Average of grades from the whole year</item>
</string-array> </string-array>
<string-array name="grade_average_mode_values" translatable="false"> <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_password_hint">Password</string>
<string name="login_host_hint">Register</string> <string name="login_host_hint">Register</string>
<string name="login_type_api">Mobile API</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_type_hybrid">Hybrid</string>
<string name="login_token_hint">Token</string> <string name="login_token_hint">Token</string>
<string name="login_pin_hint">PIN</string> <string name="login_pin_hint">PIN</string>
<string name="login_api_key_hint">API key</string> <string name="login_api_key_hint">API key</string>
<string name="login_symbol_hint">Symbol</string> <string name="login_symbol_hint">Symbol</string>
<string name="login_sign_in">Sign in</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_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_incorrect_symbol">Student not found. Check the symbol</string>
<string name="login_field_required">This field is required</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_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_select_student">Select students to log in to the application</string>
<string name="login_advanced">Other options</string> <string name="login_advanced">Other options</string>
@ -206,7 +210,7 @@
<!--Mobile devices--> <!--Mobile devices-->
<string name="mobile_devices_title">Mobile devices</string> <string name="mobile_devices_title">Mobile devices</string>
<string name="mobile_devices_no_items">No 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_removed">Device removed</string>
<string name="mobile_device_qr">QR code</string> <string name="mobile_device_qr">QR code</string>
<string name="mobile_device_token">Token</string> <string name="mobile_device_token">Token</string>
@ -305,7 +309,7 @@
<string name="pref_services_header">Synchronization</string> <string name="pref_services_header">Synchronization</string>
<string name="pref_services_switch">Automatic update</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_interval">Updates interval</string>
<string name="pref_services_wifi">Wi-Fi only</string> <string name="pref_services_wifi">Wi-Fi only</string>
@ -336,10 +340,11 @@
<!--Errors--> <!--Errors-->
<string name="error_no_internet">No internet connection</string> <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_timeout">Connection to the register timed out</string>
<string name="error_login_failed">Login is failed. Try again or restart the app</string> <string name="error_login_failed">Login 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_service_unavailable">The register is not available. Try again later</string>
<string name="error_unknown">An unexpected error occurred</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_disabled">Feature disabled by your school</string>
<string name="error_feature_not_available">Feature not available in this mode</string> <string name="error_feature_not_available">Feature not available in this mode</string>
</resources> </resources>

View File

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