Compare commits

...

23 Commits
2.0.5 ... 2.0.8

Author SHA1 Message Date
391f38485d Merge branch 'release/2.0.8' 2023-06-01 23:43:06 +02:00
fecd5c707d Version 2.0.8 2023-06-01 23:43:01 +02:00
fa44295d59 New Crowdin updates (#2231) 2023-06-01 23:37:01 +02:00
5306044173 Add custom register host field on login screen (#2221) 2023-06-01 23:22:10 +02:00
c1b86674c2 Merge branch 'release/2.0.7' into develop 2023-06-01 11:00:01 +02:00
fd482777e8 Merge branch 'release/2.0.7' 2023-06-01 10:59:55 +02:00
d4ae0d56d6 Version 2.0.7 2023-06-01 10:59:50 +02:00
63487249b8 New Crowdin updates (#2211) 2023-06-01 10:31:42 +02:00
1bc0f2d214 Add character limit to attendance excuse content (#2222) 2023-06-01 10:30:50 +02:00
41bde45731 Bump androidx.viewpager2:viewpager2 from 1.1.0-beta01 to 1.1.0-beta02 (#2227) 2023-05-31 15:19:25 +00:00
556f42195b Bump com.android.tools.build:gradle from 8.0.1 to 8.0.2 (#2228) 2023-05-31 15:18:55 +00:00
06fd7b0c36 Bump com.google.firebase:firebase-bom from 32.0.0 to 32.1.0 (#2225) 2023-05-31 15:18:30 +00:00
db4e4d8cef Bump com.huawei.hms:hianalytics from 6.10.0.300 to 6.10.0.301 (#2224) 2023-05-31 15:18:07 +00:00
48e4a9fec5 Bump org.sonarsource.scanner.gradle:sonarqube-gradle-plugin (#2223) 2023-05-31 15:17:48 +00:00
70333737cf Bump androidx.activity:activity-ktx from 1.7.1 to 1.7.2 (#2226) 2023-05-31 15:16:42 +00:00
3096fa1538 Bump about_libraries from 10.6.3 to 10.7.0 (#2214) 2023-05-24 21:50:17 +00:00
19ed121466 Bump io.coil-kt:coil from 2.3.0 to 2.4.0 (#2215) 2023-05-24 21:32:28 +00:00
e7733bfa2a Bump com.google.android.gms:play-services-ads from 22.0.0 to 22.1.0 (#2216) 2023-05-24 21:31:38 +00:00
b9b464ea9b Merge branch 'release/2.0.6' into develop 2023-05-23 16:26:43 +02:00
cc46b3b124 Merge branch 'release/2.0.6' 2023-05-23 16:26:36 +02:00
092e86b621 Version 2.0.6 2023-05-23 16:26:31 +02:00
c170614461 Add R8 rule for Wulkanowy SDK (#2220) 2023-05-23 14:09:48 +02:00
6ce8e00ebf Merge branch 'release/2.0.5' into develop 2023-05-23 02:37:55 +02:00
39 changed files with 2624 additions and 86 deletions

View File

@ -23,8 +23,8 @@ android {
testApplicationId "io.github.tests.wulkanowy" testApplicationId "io.github.tests.wulkanowy"
minSdkVersion 21 minSdkVersion 21
targetSdkVersion 33 targetSdkVersion 33
versionCode 127 versionCode 130
versionName "2.0.5" versionName "2.0.8"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
resValue "string", "app_name", "Wulkanowy" resValue "string", "app_name", "Wulkanowy"
@ -165,7 +165,7 @@ play {
defaultToAppBundles = false defaultToAppBundles = false
track = 'production' track = 'production'
releaseStatus = com.github.triplet.gradle.androidpublisher.ReleaseStatus.IN_PROGRESS releaseStatus = com.github.triplet.gradle.androidpublisher.ReleaseStatus.IN_PROGRESS
userFraction = 0.50d userFraction = 0.25d
updatePriority = 1 updatePriority = 1
enabled.set(false) enabled.set(false)
} }
@ -196,7 +196,7 @@ ext {
} }
dependencies { dependencies {
implementation 'io.github.wulkanowy:sdk:2.0.5' implementation 'io.github.wulkanowy:sdk:2.0.8'
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
@ -205,14 +205,14 @@ dependencies {
implementation "androidx.core:core-ktx:1.10.1" implementation "androidx.core:core-ktx:1.10.1"
implementation 'androidx.core:core-splashscreen:1.0.1' implementation 'androidx.core:core-splashscreen:1.0.1'
implementation "androidx.activity:activity-ktx:1.7.1" implementation "androidx.activity:activity-ktx:1.7.2"
implementation "androidx.appcompat:appcompat:1.6.1" implementation "androidx.appcompat:appcompat:1.6.1"
implementation "androidx.fragment:fragment-ktx:1.5.7" implementation "androidx.fragment:fragment-ktx:1.5.7"
implementation "androidx.annotation:annotation:1.6.0" implementation "androidx.annotation:annotation:1.6.0"
implementation "androidx.preference:preference-ktx:1.2.0" implementation "androidx.preference:preference-ktx:1.2.0"
implementation "androidx.recyclerview:recyclerview:1.3.0" implementation "androidx.recyclerview:recyclerview:1.3.0"
implementation "androidx.viewpager2:viewpager2:1.1.0-beta01" implementation "androidx.viewpager2:viewpager2:1.1.0-beta02"
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0"
implementation "androidx.constraintlayout:constraintlayout:2.1.4" implementation "androidx.constraintlayout:constraintlayout:2.1.4"
implementation "androidx.coordinatorlayout:coordinatorlayout:1.2.0" implementation "androidx.coordinatorlayout:coordinatorlayout:1.2.0"
@ -246,22 +246,22 @@ dependencies {
implementation "at.favre.lib:slf4j-timber:1.0.1" implementation "at.favre.lib:slf4j-timber:1.0.1"
implementation 'com.github.bastienpaulfr:Treessence:1.0.5' implementation 'com.github.bastienpaulfr:Treessence:1.0.5'
implementation "com.mikepenz:aboutlibraries-core:$about_libraries" implementation "com.mikepenz:aboutlibraries-core:$about_libraries"
implementation "io.coil-kt:coil:2.3.0" implementation "io.coil-kt:coil:2.4.0"
implementation "io.github.wulkanowy:AppKillerManager:3.0.1" implementation "io.github.wulkanowy:AppKillerManager:3.0.1"
implementation 'me.xdrop:fuzzywuzzy:1.4.0' implementation 'me.xdrop:fuzzywuzzy:1.4.0'
implementation 'com.fredporciuncula:flow-preferences:1.9.1' implementation 'com.fredporciuncula:flow-preferences:1.9.1'
implementation 'org.apache.commons:commons-text:1.10.0' implementation 'org.apache.commons:commons-text:1.10.0'
playImplementation platform('com.google.firebase:firebase-bom:32.0.0') playImplementation platform('com.google.firebase:firebase-bom:32.1.0')
playImplementation 'com.google.firebase:firebase-analytics-ktx' playImplementation 'com.google.firebase:firebase-analytics-ktx'
playImplementation 'com.google.firebase:firebase-messaging:' playImplementation 'com.google.firebase:firebase-messaging:'
playImplementation 'com.google.firebase:firebase-crashlytics:' playImplementation 'com.google.firebase:firebase-crashlytics:'
playImplementation 'com.google.firebase:firebase-config-ktx' playImplementation 'com.google.firebase:firebase-config-ktx'
playImplementation 'com.google.android.play:core:1.10.3' playImplementation 'com.google.android.play:core:1.10.3'
playImplementation 'com.google.android.play:core-ktx:1.8.1' playImplementation 'com.google.android.play:core-ktx:1.8.1'
playImplementation 'com.google.android.gms:play-services-ads:22.0.0' playImplementation 'com.google.android.gms:play-services-ads:22.1.0'
hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.300' hmsImplementation 'com.huawei.hms:hianalytics:6.10.0.301'
hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.0.300' hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.9.0.300'
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker" releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker"

View File

@ -26,6 +26,7 @@
#Config for Material Components #Config for Material Components
-keep class com.google.android.material.tabs.** { *; } -keep class com.google.android.material.tabs.** { *; }
#Config for HMS SDK #Config for HMS SDK
-keepattributes *Annotation* -keepattributes *Annotation*
-keepattributes Exceptions -keepattributes Exceptions
@ -35,3 +36,7 @@
-keep class com.huawei.hianalytics.**{*;} -keep class com.huawei.hianalytics.**{*;}
-keep class com.huawei.updatesdk.**{*;} -keep class com.huawei.updatesdk.**{*;}
-keep class com.huawei.hms.**{*;} -keep class com.huawei.hms.**{*;}
#Config for Wulkanowy SDK
-keep,allowobfuscation,allowshrinking class retrofit2.Response

File diff suppressed because it is too large Load Diff

View File

@ -49,6 +49,7 @@ import javax.inject.Singleton
AutoMigration(from = 47, to = 48), AutoMigration(from = 47, to = 48),
AutoMigration(from = 51, to = 52), AutoMigration(from = 51, to = 52),
AutoMigration(from = 54, to = 55, spec = Migration55::class), AutoMigration(from = 54, to = 55, spec = Migration55::class),
AutoMigration(from = 55, to = 56),
], ],
version = AppDatabase.VERSION_SCHEMA, version = AppDatabase.VERSION_SCHEMA,
exportSchema = true exportSchema = true
@ -57,7 +58,7 @@ import javax.inject.Singleton
abstract class AppDatabase : RoomDatabase() { abstract class AppDatabase : RoomDatabase() {
companion object { companion object {
const val VERSION_SCHEMA = 55 const val VERSION_SCHEMA = 56
fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf(
Migration2(), Migration2(),

View File

@ -19,6 +19,9 @@ data class Student(
@ColumnInfo(name = "scrapper_base_url") @ColumnInfo(name = "scrapper_base_url")
val scrapperBaseUrl: String, val scrapperBaseUrl: String,
@ColumnInfo(name = "scrapper_domain_suffix", defaultValue = "")
val scrapperDomainSuffix: String,
@ColumnInfo(name = "mobile_base_url") @ColumnInfo(name = "mobile_base_url")
val mobileBaseUrl: String, val mobileBaseUrl: String,

View File

@ -55,6 +55,7 @@ fun SdkRegisterUser.mapToPojo(password: String?) = RegisterUser(
fun RegisterStudent.mapToStudentWithSemesters( fun RegisterStudent.mapToStudentWithSemesters(
user: RegisterUser, user: RegisterUser,
scrapperDomainSuffix: String,
symbol: RegisterSymbol, symbol: RegisterSymbol,
unit: RegisterUnit, unit: RegisterUnit,
colors: List<Long>, colors: List<Long>,
@ -76,6 +77,7 @@ fun RegisterStudent.mapToStudentWithSemesters(
studentName = "$studentName $studentSurname", studentName = "$studentName $studentSurname",
loginMode = user.loginMode.name, loginMode = user.loginMode.name,
scrapperBaseUrl = user.scrapperBaseUrl.orEmpty(), scrapperBaseUrl = user.scrapperBaseUrl.orEmpty(),
scrapperDomainSuffix = scrapperDomainSuffix,
mobileBaseUrl = symbol.hebeBaseUrl.orEmpty(), mobileBaseUrl = symbol.hebeBaseUrl.orEmpty(),
certificateKey = symbol.keyId.orEmpty(), certificateKey = symbol.keyId.orEmpty(),
privateKey = symbol.privatePem.orEmpty(), privateKey = symbol.privatePem.orEmpty(),

View File

@ -43,22 +43,14 @@ class StudentRepository @Inject constructor(
.getStudentsFromHebe(token, pin, symbol, "") .getStudentsFromHebe(token, pin, symbol, "")
.mapToPojo(null) .mapToPojo(null)
suspend fun getStudentsScrapper(
email: String,
password: String,
scrapperBaseUrl: String,
symbol: String
): RegisterUser = sdk
.getUserSubjectsFromScrapper(email, password, scrapperBaseUrl, symbol)
.mapToPojo(password)
suspend fun getUserSubjectsFromScrapper( suspend fun getUserSubjectsFromScrapper(
email: String, email: String,
password: String, password: String,
scrapperBaseUrl: String, scrapperBaseUrl: String,
domainSuffix: String,
symbol: String symbol: String
): RegisterUser = sdk ): RegisterUser = sdk
.getUserSubjectsFromScrapper(email, password, scrapperBaseUrl, symbol) .getUserSubjectsFromScrapper(email, password, scrapperBaseUrl, domainSuffix, symbol)
.mapToPojo(password) .mapToPojo(password)
suspend fun getStudentsHybrid( suspend fun getStudentsHybrid(

View File

@ -6,5 +6,6 @@ data class LoginData(
val login: String, val login: String,
val password: String, val password: String,
val baseUrl: String, val baseUrl: String,
val domainSuffix: String,
val symbol: String?, val symbol: String?,
) : Serializable ) : Serializable

View File

@ -5,6 +5,7 @@ import android.view.View
import android.view.View.GONE import android.view.View.GONE
import android.view.View.VISIBLE import android.view.View.VISIBLE
import android.widget.ArrayAdapter import android.widget.ArrayAdapter
import androidx.core.view.isVisible
import androidx.core.widget.doOnTextChanged import androidx.core.widget.doOnTextChanged
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import io.github.wulkanowy.R import io.github.wulkanowy.R
@ -55,6 +56,9 @@ class LoginAdvancedFragment :
get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())) get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString()))
.orEmpty() .orEmpty()
override val formDomainSuffix: String
get() = binding.loginFormDomainSuffix.text.toString().trim()
override val formHostSymbol: String override val formHostSymbol: String
get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())) get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString()))
.orEmpty() .orEmpty()
@ -279,6 +283,7 @@ class LoginAdvancedFragment :
loginFormUsernameLayout.visibility = VISIBLE loginFormUsernameLayout.visibility = VISIBLE
loginFormPassLayout.visibility = VISIBLE loginFormPassLayout.visibility = VISIBLE
loginFormHostLayout.visibility = VISIBLE loginFormHostLayout.visibility = VISIBLE
loginFormDomainSuffixLayout.isVisible = true
loginFormPinLayout.visibility = GONE loginFormPinLayout.visibility = GONE
loginFormSymbolLayout.visibility = VISIBLE loginFormSymbolLayout.visibility = VISIBLE
loginFormTokenLayout.visibility = GONE loginFormTokenLayout.visibility = GONE
@ -290,6 +295,7 @@ class LoginAdvancedFragment :
loginFormUsernameLayout.visibility = VISIBLE loginFormUsernameLayout.visibility = VISIBLE
loginFormPassLayout.visibility = VISIBLE loginFormPassLayout.visibility = VISIBLE
loginFormHostLayout.visibility = VISIBLE loginFormHostLayout.visibility = VISIBLE
loginFormDomainSuffixLayout.isVisible = true
loginFormPinLayout.visibility = GONE loginFormPinLayout.visibility = GONE
loginFormSymbolLayout.visibility = VISIBLE loginFormSymbolLayout.visibility = VISIBLE
loginFormTokenLayout.visibility = GONE loginFormTokenLayout.visibility = GONE
@ -301,6 +307,7 @@ class LoginAdvancedFragment :
loginFormUsernameLayout.visibility = GONE loginFormUsernameLayout.visibility = GONE
loginFormPassLayout.visibility = GONE loginFormPassLayout.visibility = GONE
loginFormHostLayout.visibility = GONE loginFormHostLayout.visibility = GONE
loginFormDomainSuffixLayout.isVisible = false
loginFormPinLayout.visibility = VISIBLE loginFormPinLayout.visibility = VISIBLE
loginFormSymbolLayout.visibility = VISIBLE loginFormSymbolLayout.visibility = VISIBLE
loginFormTokenLayout.visibility = VISIBLE loginFormTokenLayout.visibility = VISIBLE

View File

@ -154,6 +154,7 @@ class LoginAdvancedPresenter @Inject constructor(
login = view?.formUsernameValue.orEmpty().trim(), login = view?.formUsernameValue.orEmpty().trim(),
password = view?.formPassValue.orEmpty().trim(), password = view?.formPassValue.orEmpty().trim(),
baseUrl = view?.formHostValue.orEmpty().trim(), baseUrl = view?.formHostValue.orEmpty().trim(),
domainSuffix = view?.formDomainSuffix.orEmpty().trim(),
symbol = view?.formSymbolValue.orEmpty().trim().getNormalizedSymbol(), symbol = view?.formSymbolValue.orEmpty().trim().getNormalizedSymbol(),
) )
when (it.data.symbols.size) { when (it.data.symbols.size) {
@ -186,6 +187,7 @@ class LoginAdvancedPresenter @Inject constructor(
val email = view?.formUsernameValue.orEmpty() val email = view?.formUsernameValue.orEmpty()
val password = view?.formPassValue.orEmpty() val password = view?.formPassValue.orEmpty()
val endpoint = view?.formHostValue.orEmpty() val endpoint = view?.formHostValue.orEmpty()
val domainSuffix = view?.formDomainSuffix.orEmpty()
val pin = view?.formPinValue.orEmpty() val pin = view?.formPinValue.orEmpty()
val symbol = view?.formSymbolValue.orEmpty() val symbol = view?.formSymbolValue.orEmpty()
@ -193,8 +195,8 @@ class LoginAdvancedPresenter @Inject constructor(
return when (Sdk.Mode.valueOf(view?.formLoginType.orEmpty())) { return when (Sdk.Mode.valueOf(view?.formLoginType.orEmpty())) {
Sdk.Mode.HEBE -> studentRepository.getStudentsApi(pin, symbol, token) Sdk.Mode.HEBE -> studentRepository.getStudentsApi(pin, symbol, token)
Sdk.Mode.SCRAPPER -> studentRepository.getStudentsScrapper( Sdk.Mode.SCRAPPER -> studentRepository.getUserSubjectsFromScrapper(
email, password, endpoint, symbol email, password, endpoint, domainSuffix, symbol
) )
Sdk.Mode.HYBRID -> studentRepository.getStudentsHybrid( Sdk.Mode.HYBRID -> studentRepository.getStudentsHybrid(

View File

@ -12,6 +12,8 @@ interface LoginAdvancedView : BaseView {
val formHostValue: String val formHostValue: String
val formDomainSuffix: String
val formHostSymbol: String val formHostSymbol: String
val formLoginType: String val formLoginType: String

View File

@ -45,6 +45,9 @@ class LoginFormFragment : BaseFragment<FragmentLoginFormBinding>(R.layout.fragme
get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())) get() = hostValues.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString()))
.orEmpty() .orEmpty()
override val formDomainSuffix: String
get() = binding.loginFormDomainSuffix.text.toString()
override val formHostSymbol: String override val formHostSymbol: String
get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString())) get() = hostSymbols.getOrNull(hostKeys.indexOf(binding.loginFormHost.text.toString()))
.orEmpty() .orEmpty()
@ -204,6 +207,10 @@ class LoginFormFragment : BaseFragment<FragmentLoginFormBinding>(R.layout.fragme
binding.loginFormContainer.visibility = if (show) VISIBLE else GONE binding.loginFormContainer.visibility = if (show) VISIBLE else GONE
} }
override fun showDomainSuffixInput(show: Boolean) {
binding.loginFormDomainSuffixLayout.isVisible = show
}
override fun showOtherOptionsButton(show: Boolean) { override fun showOtherOptionsButton(show: Boolean) {
binding.loginFormAdvancedButton.isVisible = show binding.loginFormAdvancedButton.isVisible = show
} }
@ -256,6 +263,7 @@ class LoginFormFragment : BaseFragment<FragmentLoginFormBinding>(R.layout.fragme
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
presenter.updateUsernameLabel() presenter.updateUsernameLabel()
presenter.updateCustomDomainSuffixVisibility()
} }
override fun openEmail(lastError: String) { override fun openEmail(lastError: String) {

View File

@ -1,8 +1,13 @@
package io.github.wulkanowy.ui.modules.login.form package io.github.wulkanowy.ui.modules.login.form
import androidx.core.net.toUri import androidx.core.net.toUri
import io.github.wulkanowy.data.* import io.github.wulkanowy.data.logResourceStatus
import io.github.wulkanowy.data.onResourceError
import io.github.wulkanowy.data.onResourceLoading
import io.github.wulkanowy.data.onResourceNotLoading
import io.github.wulkanowy.data.onResourceSuccess
import io.github.wulkanowy.data.repositories.StudentRepository import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.data.resourceFlow
import io.github.wulkanowy.ui.base.BasePresenter import io.github.wulkanowy.ui.base.BasePresenter
import io.github.wulkanowy.ui.modules.login.LoginData import io.github.wulkanowy.ui.modules.login.LoginData
import io.github.wulkanowy.ui.modules.login.LoginErrorHandler import io.github.wulkanowy.ui.modules.login.LoginErrorHandler
@ -56,10 +61,17 @@ class LoginFormPresenter @Inject constructor(
} else if (formUsernameValue == "jan@fakelog.cf" && formPassValue == "jan123") { } else if (formUsernameValue == "jan@fakelog.cf" && formPassValue == "jan123") {
setCredentials("", "") setCredentials("", "")
} }
updateCustomDomainSuffixVisibility()
updateUsernameLabel() updateUsernameLabel()
} }
} }
fun updateCustomDomainSuffixVisibility() {
view?.run {
showDomainSuffixInput("customSuffix" in formHostValue)
}
}
fun updateUsernameLabel() { fun updateUsernameLabel() {
view?.run { view?.run {
setUsernameLabel(if ("email" !in formHostValue) nicknameLabel else emailLabel) setUsernameLabel(if ("email" !in formHostValue) nicknameLabel else emailLabel)
@ -91,6 +103,7 @@ class LoginFormPresenter @Inject constructor(
val email = view?.formUsernameValue.orEmpty().trim() val email = view?.formUsernameValue.orEmpty().trim()
val password = view?.formPassValue.orEmpty().trim() val password = view?.formPassValue.orEmpty().trim()
val host = view?.formHostValue.orEmpty().trim() val host = view?.formHostValue.orEmpty().trim()
val domainSuffix = view?.formDomainSuffix.orEmpty().trim()
val symbol = view?.formHostSymbol.orEmpty().trim() val symbol = view?.formHostSymbol.orEmpty().trim()
if (!validateCredentials(email, password, host)) return if (!validateCredentials(email, password, host)) return
@ -100,6 +113,7 @@ class LoginFormPresenter @Inject constructor(
email = email, email = email,
password = password, password = password,
scrapperBaseUrl = host, scrapperBaseUrl = host,
domainSuffix = domainSuffix,
symbol = symbol symbol = symbol
) )
} }
@ -112,7 +126,7 @@ class LoginFormPresenter @Inject constructor(
} }
} }
.onResourceSuccess { .onResourceSuccess {
val loginData = LoginData(email, password, host, symbol) val loginData = LoginData(email, password, host, domainSuffix, symbol)
when (it.symbols.size) { when (it.symbols.size) {
0 -> view?.navigateToSymbol(loginData) 0 -> view?.navigateToSymbol(loginData)
else -> view?.navigateToStudentSelect(loginData, it) else -> view?.navigateToStudentSelect(loginData, it)

View File

@ -14,6 +14,8 @@ interface LoginFormView : BaseView {
val formHostValue: String val formHostValue: String
val formDomainSuffix: String
val formHostSymbol: String val formHostSymbol: String
val nicknameLabel: String val nicknameLabel: String
@ -56,6 +58,8 @@ interface LoginFormView : BaseView {
fun showContent(show: Boolean) fun showContent(show: Boolean)
fun showDomainSuffixInput(show: Boolean)
fun showOtherOptionsButton(show: Boolean) fun showOtherOptionsButton(show: Boolean)
fun showVersion() fun showVersion()

View File

@ -241,6 +241,7 @@ class LoginStudentSelectPresenter @Inject constructor(
item.student.mapToStudentWithSemesters( item.student.mapToStudentWithSemesters(
user = registerUser, user = registerUser,
symbol = item.symbol, symbol = item.symbol,
scrapperDomainSuffix = loginData.domainSuffix,
unit = item.unit, unit = item.unit,
colors = appInfo.defaultColorsForAvatar, colors = appInfo.defaultColorsForAvatar,
) )

View File

@ -62,6 +62,7 @@ class LoginSymbolPresenter @Inject constructor(
email = loginData.login, email = loginData.login,
password = loginData.password, password = loginData.password,
scrapperBaseUrl = loginData.baseUrl, scrapperBaseUrl = loginData.baseUrl,
domainSuffix = loginData.domainSuffix,
symbol = loginData.symbol.orEmpty(), symbol = loginData.symbol.orEmpty(),
) )
}.onEach { user -> }.onEach { user ->

View File

@ -16,6 +16,7 @@ fun Sdk.init(student: Student): Sdk {
mobileBaseUrl = student.mobileBaseUrl mobileBaseUrl = student.mobileBaseUrl
} else { } else {
scrapperBaseUrl = student.scrapperBaseUrl scrapperBaseUrl = student.scrapperBaseUrl
domainSuffix = student.scrapperDomainSuffix
loginType = Sdk.ScrapperLoginType.valueOf(student.loginType) loginType = Sdk.ScrapperLoginType.valueOf(student.loginType)
} }

View File

@ -1,9 +1,7 @@
Wersja 2.0.5 Wersja 2.0.8
zaktualizowaliśmy wygląd aplikacji na (częściowo) zgodny z wytycznymi Material 3 poprawiliśmy wyświetlanie kilku rodzajów zmian w planie lekcji
— dodaliśmy możliwość zmiany kolejności pozycji w menu dolnym — dodaliśmy limit znaków w okienku usprawiedliwiania
poprawiliśmy sposób wyświetlania błędu o nieprawidłowym haśle na ekranie logowania naprawiliśmy wyświetlanie frekwencji w szkołach, gdzie działa już system eduOne (ciągle jednak brak opcji usprawiedliwiania)
— od teraz zmiana ustawień liczenia średniej automatycznie odświeży listę ocen
— dodaliśmy okienko na wpisanie numeru PESEL, gdy dziennik wymaga dodatkowej autoryzacji dostępu
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
@ -8,13 +9,18 @@
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
style="@style/Widget.Material3.TextInputLayout.OutlinedBox" style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
app:counterEnabled="true"
app:counterMaxLength="256">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/excuseReason" android:id="@+id/excuseReason"
style="@style/Widget.Material3.TextInputEditText.OutlinedBox"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:hint="@string/attendance_excuse_dialog_reason" /> android:layout_weight="1"
android:hint="@string/attendance_excuse_dialog_reason"
android:maxLength="256" />
<requestFocus /> <requestFocus />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>

View File

@ -172,7 +172,7 @@
android:layout_marginBottom="16dp" android:layout_marginBottom="16dp"
android:hint="@string/login_host_hint" android:hint="@string/login_host_hint"
android:orientation="vertical" android:orientation="vertical"
app:layout_constraintBottom_toTopOf="@+id/loginFormTokenLayout" app:layout_constraintBottom_toTopOf="@+id/loginFormDomainSuffixLayout"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginFormPassLayout"> app:layout_constraintTop_toBottomOf="@+id/loginFormPassLayout">
@ -185,6 +185,31 @@
tools:ignore="Deprecated,LabelFor" /> tools:ignore="Deprecated,LabelFor" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/loginFormDomainSuffixLayout"
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginLeft="24dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="24dp"
android:layout_marginRight="24dp"
android:hint="@string/login_domain_suffix_hint"
app:errorEnabled="true"
app:layout_constraintBottom_toTopOf="@+id/loginFormSymbolLayout"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginFormHostLayout">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/loginFormDomainSuffix"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textShortMessage"
android:maxLines="1" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout <com.google.android.material.textfield.TextInputLayout
android:id="@+id/loginFormTokenLayout" android:id="@+id/loginFormTokenLayout"
style="@style/Widget.Material3.TextInputLayout.OutlinedBox" style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
@ -200,7 +225,7 @@
app:layout_constraintBottom_toTopOf="@+id/loginFormSymbolLayout" app:layout_constraintBottom_toTopOf="@+id/loginFormSymbolLayout"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginFormHostLayout"> app:layout_constraintTop_toBottomOf="@+id/loginFormDomainSuffixLayout">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/loginFormToken" android:id="@+id/loginFormToken"

View File

@ -239,6 +239,32 @@
tools:ignore="Deprecated,LabelFor" /> tools:ignore="Deprecated,LabelFor" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/loginFormDomainSuffixLayout"
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="24dp"
android:layout_marginLeft="24dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="24dp"
android:layout_marginRight="24dp"
android:hint="@string/login_domain_suffix_hint"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginFormHostLayout"
tools:ignore="HardcodedText">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/loginFormDomainSuffix"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:importantForAutofill="no"
android:inputType="text"
android:maxLines="1"
tools:targetApi="o" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.button.MaterialButton <com.google.android.material.button.MaterialButton
android:id="@+id/loginFormAdvancedButton" android:id="@+id/loginFormAdvancedButton"
style="@style/Widget.Material3.Button.OutlinedButton" style="@style/Widget.Material3.Button.OutlinedButton"
@ -264,7 +290,7 @@
android:layout_marginEnd="24dp" android:layout_marginEnd="24dp"
android:text="@string/login_sign_in" android:text="@string/login_sign_in"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/loginFormHostLayout" /> app:layout_constraintTop_toBottomOf="@+id/loginFormDomainSuffixLayout" />
<TextView <TextView
android:id="@+id/loginFormPrivacyLink" android:id="@+id/loginFormPrivacyLink"

View File

@ -37,6 +37,7 @@
<string name="login_login_pesel_email_hint">Přihlášení, číslo PESEL nebo e-mail</string> <string name="login_login_pesel_email_hint">Přihlášení, číslo PESEL nebo e-mail</string>
<string name="login_password_hint">Heslo</string> <string name="login_password_hint">Heslo</string>
<string name="login_host_hint">Variace deníku UONET+</string> <string name="login_host_hint">Variace deníku UONET+</string>
<string name="login_domain_suffix_hint">Custom domain suffix</string>
<string name="login_type_api">Mobile API</string> <string name="login_type_api">Mobile API</string>
<string name="login_type_scrapper">Scraper</string> <string name="login_type_scrapper">Scraper</string>
<string name="login_type_hybrid">Hybridní</string> <string name="login_type_hybrid">Hybridní</string>

View File

@ -37,6 +37,7 @@
<string name="login_login_pesel_email_hint">Login, PESEL or e-mail</string> <string name="login_login_pesel_email_hint">Login, PESEL or e-mail</string>
<string name="login_password_hint">Password</string> <string name="login_password_hint">Password</string>
<string name="login_host_hint">UONET+ register variant</string> <string name="login_host_hint">UONET+ register variant</string>
<string name="login_domain_suffix_hint">Custom domain suffix</string>
<string name="login_type_api">Mobile API</string> <string name="login_type_api">Mobile API</string>
<string name="login_type_scrapper">Scraper</string> <string name="login_type_scrapper">Scraper</string>
<string name="login_type_hybrid">Hybrid</string> <string name="login_type_hybrid">Hybrid</string>

View File

@ -37,6 +37,7 @@
<string name="login_login_pesel_email_hint">Anmeldung, PESEL oder e-mail</string> <string name="login_login_pesel_email_hint">Anmeldung, PESEL oder e-mail</string>
<string name="login_password_hint">Passwort</string> <string name="login_password_hint">Passwort</string>
<string name="login_host_hint">UONET+ Registervariante</string> <string name="login_host_hint">UONET+ Registervariante</string>
<string name="login_domain_suffix_hint">Custom domain suffix</string>
<string name="login_type_api">Mobile API</string> <string name="login_type_api">Mobile API</string>
<string name="login_type_scrapper">Scraper</string> <string name="login_type_scrapper">Scraper</string>
<string name="login_type_hybrid">Hybride</string> <string name="login_type_hybrid">Hybride</string>

View File

@ -37,6 +37,7 @@
<string name="login_login_pesel_email_hint">Login, PESEL or e-mail</string> <string name="login_login_pesel_email_hint">Login, PESEL or e-mail</string>
<string name="login_password_hint">Password</string> <string name="login_password_hint">Password</string>
<string name="login_host_hint">UONET+ register variant</string> <string name="login_host_hint">UONET+ register variant</string>
<string name="login_domain_suffix_hint">Custom domain suffix</string>
<string name="login_type_api">Mobile API</string> <string name="login_type_api">Mobile API</string>
<string name="login_type_scrapper">Scraper</string> <string name="login_type_scrapper">Scraper</string>
<string name="login_type_hybrid">Hybrid</string> <string name="login_type_hybrid">Hybrid</string>

View File

@ -37,6 +37,7 @@
<string name="login_login_pesel_email_hint">Login, PESEL lub adres e-mail</string> <string name="login_login_pesel_email_hint">Login, PESEL lub adres e-mail</string>
<string name="login_password_hint">Hasło</string> <string name="login_password_hint">Hasło</string>
<string name="login_host_hint">Odmiana dziennika UONET+</string> <string name="login_host_hint">Odmiana dziennika UONET+</string>
<string name="login_domain_suffix_hint">Niestandardowy sufiks domeny</string>
<string name="login_type_api">Mobilne API</string> <string name="login_type_api">Mobilne API</string>
<string name="login_type_scrapper">Scraper</string> <string name="login_type_scrapper">Scraper</string>
<string name="login_type_hybrid">Hybrydowe</string> <string name="login_type_hybrid">Hybrydowe</string>

View File

@ -37,6 +37,7 @@
<string name="login_login_pesel_email_hint">Логин, PESEL или электронная почта</string> <string name="login_login_pesel_email_hint">Логин, PESEL или электронная почта</string>
<string name="login_password_hint">Пароль</string> <string name="login_password_hint">Пароль</string>
<string name="login_host_hint">Тип дневника UONET+</string> <string name="login_host_hint">Тип дневника UONET+</string>
<string name="login_domain_suffix_hint">Custom domain suffix</string>
<string name="login_type_api">Мобильный API</string> <string name="login_type_api">Мобильный API</string>
<string name="login_type_scrapper">Scraper</string> <string name="login_type_scrapper">Scraper</string>
<string name="login_type_hybrid">Hybrid</string> <string name="login_type_hybrid">Hybrid</string>
@ -682,7 +683,7 @@
<string name="all_cancel">Отменить</string> <string name="all_cancel">Отменить</string>
<!--Timetable Widget--> <!--Timetable Widget-->
<string name="widget_timetable_no_items">Нет уроков</string> <string name="widget_timetable_no_items">Нет уроков</string>
<string name="widget_timetable_last_synchronization">Synchronized on %1$s at %2$s</string> <string name="widget_timetable_last_synchronization">Синхронизировано %1$s в %2$s</string>
<string name="widget_timetable_theme_title">Выбрать тему</string> <string name="widget_timetable_theme_title">Выбрать тему</string>
<string name="widget_timetable_theme_light">Светлая</string> <string name="widget_timetable_theme_light">Светлая</string>
<string name="widget_timetable_theme_dark">Тёмная</string> <string name="widget_timetable_theme_dark">Тёмная</string>
@ -778,7 +779,7 @@
<string name="pref_advanced_category_summary">Значения плюса и минуса, расчёт средней оценки</string> <string name="pref_advanced_category_summary">Значения плюса и минуса, расчёт средней оценки</string>
<string name="pref_advanced_category">Расширенные</string> <string name="pref_advanced_category">Расширенные</string>
<string name="pref_about_category_summary">Версия приложения, разработчики, соц. сети</string> <string name="pref_about_category_summary">Версия приложения, разработчики, соц. сети</string>
<string name="pref_ads_category_summary">Displaying advertisements, project support</string> <string name="pref_ads_category_summary">Посмотреть рекламу, чтобы поддержать проект</string>
<!--Notification Channels--> <!--Notification Channels-->
<string name="channel_new_grades">Новые оценки</string> <string name="channel_new_grades">Новые оценки</string>
<string name="channel_new_homework">Новое домашнее задание</string> <string name="channel_new_homework">Новое домашнее задание</string>
@ -810,14 +811,14 @@
<string name="menu_order_confirm_content">Для сохранения изменений необходимо перезапустить приложение</string> <string name="menu_order_confirm_content">Для сохранения изменений необходимо перезапустить приложение</string>
<string name="menu_order_confirm_restart">Перезапустить</string> <string name="menu_order_confirm_restart">Перезапустить</string>
<!--Auth--> <!--Auth-->
<string name="auth_api_error">Authorization has been rejected. The data provided does not match the records in the secretary\'s office.</string> <string name="auth_api_error">Авторизация отклонена. Предоставленные данные не соответствуют записям в кабинете секретаря.</string>
<string name="auth_invalid_error">Invalid PESEL</string> <string name="auth_invalid_error">Неправильный номер PESEL</string>
<string name="auth_pesel">PESEL</string> <string name="auth_pesel">Номер PESEL</string>
<string name="auth_button">Authorize</string> <string name="auth_button">Authorize</string>
<string name="auth_success">Authorization completed successfully</string> <string name="auth_success">Авторизация прошла успешно</string>
<string name="auth_title">Authorization</string> <string name="auth_title">Авторизация</string>
<string name="auth_description">To operate the application, we need to confirm your identity. Please enter the student\'s PESEL &lt;b&gt;%1$s&lt;/b&gt; in the field below</string> <string name="auth_description">Для работы приложения нам необходимо подтвердить вашу личность. Введите PESEL учащегося &lt;b&gt;%1$s&lt;/b&gt; в поле ниже</string>
<string name="auth_button_skip">Skip for now</string> <string name="auth_button_skip">Пропустить сейчас</string>
<!--Errors--> <!--Errors-->
<string name="error_no_internet">Интернет-соединение отсутствует</string> <string name="error_no_internet">Интернет-соединение отсутствует</string>
<string name="error_invalid_device_datetime">Произошла ошибка. Проверьте время на вашем устройстве</string> <string name="error_invalid_device_datetime">Произошла ошибка. Проверьте время на вашем устройстве</string>

View File

@ -37,6 +37,7 @@
<string name="login_login_pesel_email_hint">Prihlásenie, číslo PESEL alebo e-mail</string> <string name="login_login_pesel_email_hint">Prihlásenie, číslo PESEL alebo e-mail</string>
<string name="login_password_hint">Heslo</string> <string name="login_password_hint">Heslo</string>
<string name="login_host_hint">Variácia denníka UONET+</string> <string name="login_host_hint">Variácia denníka UONET+</string>
<string name="login_domain_suffix_hint">Custom domain suffix</string>
<string name="login_type_api">Mobile API</string> <string name="login_type_api">Mobile API</string>
<string name="login_type_scrapper">Scraper</string> <string name="login_type_scrapper">Scraper</string>
<string name="login_type_hybrid">Hybridné</string> <string name="login_type_hybrid">Hybridné</string>

View File

@ -37,6 +37,7 @@
<string name="login_login_pesel_email_hint">Логін, PESEL або e-mail</string> <string name="login_login_pesel_email_hint">Логін, PESEL або e-mail</string>
<string name="login_password_hint">Пароль</string> <string name="login_password_hint">Пароль</string>
<string name="login_host_hint">Тип щоденника UONET+</string> <string name="login_host_hint">Тип щоденника UONET+</string>
<string name="login_domain_suffix_hint">Custom domain suffix</string>
<string name="login_type_api">Мobile API</string> <string name="login_type_api">Мobile API</string>
<string name="login_type_scrapper">Scraper</string> <string name="login_type_scrapper">Scraper</string>
<string name="login_type_hybrid">Hybrid</string> <string name="login_type_hybrid">Hybrid</string>
@ -682,7 +683,7 @@
<string name="all_cancel">Скасувати</string> <string name="all_cancel">Скасувати</string>
<!--Timetable Widget--> <!--Timetable Widget-->
<string name="widget_timetable_no_items">Немаэ уроків</string> <string name="widget_timetable_no_items">Немаэ уроків</string>
<string name="widget_timetable_last_synchronization">Synchronized on %1$s at %2$s</string> <string name="widget_timetable_last_synchronization">Синхронізовано %1$s в %2$s</string>
<string name="widget_timetable_theme_title">Увібрати тему</string> <string name="widget_timetable_theme_title">Увібрати тему</string>
<string name="widget_timetable_theme_light">Яскрава</string> <string name="widget_timetable_theme_light">Яскрава</string>
<string name="widget_timetable_theme_dark">Темна</string> <string name="widget_timetable_theme_dark">Темна</string>
@ -810,14 +811,14 @@
<string name="menu_order_confirm_content">Додаток потрібно перезавантажити для збереження змін</string> <string name="menu_order_confirm_content">Додаток потрібно перезавантажити для збереження змін</string>
<string name="menu_order_confirm_restart">Перезавантажити</string> <string name="menu_order_confirm_restart">Перезавантажити</string>
<!--Auth--> <!--Auth-->
<string name="auth_api_error">Authorization has been rejected. The data provided does not match the records in the secretary\'s office.</string> <string name="auth_api_error">Авторизацію відхилено. Надані дані не збігаються із записами в кабінеті секретаря.</string>
<string name="auth_invalid_error">Invalid PESEL</string> <string name="auth_invalid_error">Неправильний PESEL</string>
<string name="auth_pesel">PESEL</string> <string name="auth_pesel">Число PESEL</string>
<string name="auth_button">Authorize</string> <string name="auth_button">Authorize</string>
<string name="auth_success">Authorization completed successfully</string> <string name="auth_success">Authorization completed successfully</string>
<string name="auth_title">Authorization</string> <string name="auth_title">Авторизувати</string>
<string name="auth_description">To operate the application, we need to confirm your identity. Please enter the student\'s PESEL &lt;b&gt;%1$s&lt;/b&gt; in the field below</string> <string name="auth_description">Для роботи програми нам потрібно підтвердити вашу особу. Будь ласка, введіть число PESEL &lt;b&gt;%1$s&lt;/b&gt; студента в поле нижче</string>
<string name="auth_button_skip">Skip for now</string> <string name="auth_button_skip">Поки що пропустити</string>
<!--Errors--> <!--Errors-->
<string name="error_no_internet">Немає з\'єднання з інтернетом</string> <string name="error_no_internet">Немає з\'єднання з інтернетом</string>
<string name="error_invalid_device_datetime">Сталася помилка. Перевірте годинник пристрою</string> <string name="error_invalid_device_datetime">Сталася помилка. Перевірте годинник пристрою</string>

View File

@ -20,6 +20,7 @@
<item>Gmina Ulan-Majorat - Platforma oświatowa</item> <item>Gmina Ulan-Majorat - Platforma oświatowa</item>
<item>Gmina Ozorków - Platforma edukacyjna</item> <item>Gmina Ozorków - Platforma edukacyjna</item>
<item>Gmina Łopiennik Górny - Platforma oświatowa</item> <item>Gmina Łopiennik Górny - Platforma oświatowa</item>
<item>@string/login_domain_suffix_hint</item>
<item>Fakelog</item> <item>Fakelog</item>
</string-array> </string-array>
<string-array name="hosts_values"> <string-array name="hosts_values">
@ -42,6 +43,7 @@
<item>https://vulcan.net.pl/?login</item> <item>https://vulcan.net.pl/?login</item>
<item>https://vulcan.net.pl/?login</item> <item>https://vulcan.net.pl/?login</item>
<item>https://vulcan.net.pl/?login</item> <item>https://vulcan.net.pl/?login</item>
<item>https://vulcan.net.pl/?email&amp;customSuffix</item>
<item>https://fakelog.cf/?email</item> <item>https://fakelog.cf/?email</item>
</string-array> </string-array>
<string-array name="hosts_symbols"> <string-array name="hosts_symbols">
@ -64,6 +66,7 @@
<item>gminaulanmajorat</item> <item>gminaulanmajorat</item>
<item>gminaozorkow</item> <item>gminaozorkow</item>
<item>gminalopiennikgorny</item> <item>gminalopiennikgorny</item>
<item>Default</item>
<item>powiatwulkanowy</item> <item>powiatwulkanowy</item>
</string-array> </string-array>
</resources> </resources>

View File

@ -42,6 +42,7 @@
<string name="login_login_pesel_email_hint">Login, PESEL or e-mail</string> <string name="login_login_pesel_email_hint">Login, PESEL or e-mail</string>
<string name="login_password_hint">Password</string> <string name="login_password_hint">Password</string>
<string name="login_host_hint">UONET+ register variant</string> <string name="login_host_hint">UONET+ register variant</string>
<string name="login_domain_suffix_hint">Custom domain suffix</string>
<string name="login_type_api">Mobile API</string> <string name="login_type_api">Mobile API</string>
<string name="login_type_scrapper">Scraper</string> <string name="login_type_scrapper">Scraper</string>
<string name="login_type_hybrid">Hybrid</string> <string name="login_type_hybrid">Hybrid</string>

View File

@ -50,6 +50,7 @@ fun getSemesterPojo(diaryId: Int, semesterId: Int, start: LocalDate, end: LocalD
fun getStudentEntity(mode: Sdk.Mode = Sdk.Mode.HEBE) = Student( fun getStudentEntity(mode: Sdk.Mode = Sdk.Mode.HEBE) = Student(
scrapperBaseUrl = "http://fakelog.cf", scrapperBaseUrl = "http://fakelog.cf",
scrapperDomainSuffix = "",
email = "jan@fakelog.cf", email = "jan@fakelog.cf",
certificateKey = "", certificateKey = "",
classId = 0, classId = 0,

View File

@ -296,6 +296,7 @@ class GradeRepositoryTest {
private fun createGrades(grades: List<SdkGrade>): Grades = Grades( private fun createGrades(grades: List<SdkGrade>): Grades = Grades(
details = grades, details = grades,
summary = listOf(), summary = listOf(),
descriptive = emptyList(),
isAverage = false, isAverage = false,
isPoints = false, isPoints = false,
isForAdults = false, isForAdults = false,

View File

@ -201,6 +201,7 @@ class GetMailboxByStudentUseCaseTest {
schoolShortName: String = "test", schoolShortName: String = "test",
) = Student( ) = Student(
scrapperBaseUrl = "http://fakelog.cf", scrapperBaseUrl = "http://fakelog.cf",
scrapperDomainSuffix = "",
email = "jan@fakelog.cf", email = "jan@fakelog.cf",
certificateKey = "", certificateKey = "",
classId = 0, classId = 0,

View File

@ -47,6 +47,7 @@ class GradeAverageProviderTest {
private val student = Student( private val student = Student(
scrapperBaseUrl = "", scrapperBaseUrl = "",
scrapperDomainSuffix = "",
mobileBaseUrl = "", mobileBaseUrl = "",
loginType = "", loginType = "",
loginMode = "SCRAPPER", loginMode = "SCRAPPER",

View File

@ -130,7 +130,7 @@ class LoginFormPresenterTest {
@Test @Test
fun loginTest() { fun loginTest() {
coEvery { coEvery {
repository.getUserSubjectsFromScrapper(any(), any(), any(), any()) repository.getUserSubjectsFromScrapper(any(), any(), any(), any(), any())
} returns registerUser } returns registerUser
every { loginFormView.formUsernameValue } returns "@" every { loginFormView.formUsernameValue } returns "@"
@ -149,7 +149,7 @@ class LoginFormPresenterTest {
@Test @Test
fun loginEmptyTest() { fun loginEmptyTest() {
coEvery { coEvery {
repository.getUserSubjectsFromScrapper(any(), any(), any(), any()) repository.getUserSubjectsFromScrapper(any(), any(), any(), any(), any())
} returns registerUser } returns registerUser
every { loginFormView.formUsernameValue } returns "@" every { loginFormView.formUsernameValue } returns "@"
every { loginFormView.formPassValue } returns "123456" every { loginFormView.formPassValue } returns "123456"
@ -167,7 +167,7 @@ class LoginFormPresenterTest {
@Test @Test
fun loginEmptyTwiceTest() { fun loginEmptyTwiceTest() {
coEvery { coEvery {
repository.getUserSubjectsFromScrapper(any(), any(), any(), any()) repository.getUserSubjectsFromScrapper(any(), any(), any(), any(), any())
} returns registerUser } returns registerUser
every { loginFormView.formUsernameValue } returns "@" every { loginFormView.formUsernameValue } returns "@"
every { loginFormView.formPassValue } returns "123456" every { loginFormView.formPassValue } returns "123456"
@ -187,12 +187,7 @@ class LoginFormPresenterTest {
fun loginErrorTest() { fun loginErrorTest() {
val testException = IOException("test") val testException = IOException("test")
coEvery { coEvery {
repository.getUserSubjectsFromScrapper( repository.getUserSubjectsFromScrapper(any(), any(), any(), any(), any())
any(),
any(),
any(),
any()
)
} throws testException } throws testException
every { loginFormView.formUsernameValue } returns "@" every { loginFormView.formUsernameValue } returns "@"
every { loginFormView.formPassValue } returns "123456" every { loginFormView.formPassValue } returns "123456"

View File

@ -55,6 +55,7 @@ class LoginStudentSelectPresenterTest {
password = "", password = "",
baseUrl = "", baseUrl = "",
symbol = null, symbol = null,
domainSuffix = "",
) )
private val subject = RegisterStudent( private val subject = RegisterStudent(

View File

@ -1,7 +1,7 @@
buildscript { buildscript {
ext { ext {
kotlin_version = '1.8.21' kotlin_version = '1.8.21'
about_libraries = '10.6.3' about_libraries = '10.7.0'
hilt_version = "2.46.1" hilt_version = "2.46.1"
} }
repositories { repositories {
@ -13,14 +13,14 @@ buildscript {
dependencies { dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
classpath 'com.android.tools.build:gradle:8.0.1' classpath 'com.android.tools.build:gradle:8.0.2'
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version" classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
classpath 'com.google.gms:google-services:4.3.15' classpath 'com.google.gms:google-services:4.3.15'
classpath 'com.huawei.agconnect:agcp:1.9.0.300' classpath 'com.huawei.agconnect:agcp:1.9.0.300'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5'
classpath "com.github.triplet.gradle:play-publisher:3.6.0" classpath "com.github.triplet.gradle:play-publisher:3.6.0"
classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0" classpath "ru.cian:huawei-publish-gradle-plugin:1.4.0"
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.0.0.2929" classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:4.1.0.3113"
classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0" classpath "gradle.plugin.com.star-zero.gradle:githook:1.2.0"
classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:$about_libraries"
} }

View File

@ -1,28 +1,13 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
#
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m org.gradle.jvmargs=-Xmx1536m
# #
android.enableJetifier=true
android.useAndroidX=true
android.defaults.buildfeatures.buildconfig=true
android.nonTransitiveRClass=false
android.nonFinalResIds=false
#
kotlin.code.style=official
kapt.use.worker.api=true
kapt.include.compile.classpath=false kapt.include.compile.classpath=false
kotlin.code.style=official
#
android.useAndroidX=true
android.enableJetifier=true
android.nonTransitiveRClass=false
android.defaults.buildfeatures.buildconfig=true
# #
# https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-Guides/agc-common-faq-0000001063210244#section17273113244910 # https://developer.huawei.com/consumer/en/doc/development/AppGallery-connect-Guides/agc-common-faq-0000001063210244#section17273113244910
apmsInstrumentationEnabled=false apmsInstrumentationEnabled=false
#
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true