Merge branch 'develop'

This commit is contained in:
Kuba Szczodrzyński 2020-08-28 15:32:36 +02:00
commit 339bb9c8f6
49 changed files with 733 additions and 594 deletions

16
.idea/compiler.xml Normal file
View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="1.7">
<module name="annotation" target="1.7" />
<module name="codegen" target="1.7" />
<module name="Szkolny.eu.agendacalendarview" target="1.8" />
<module name="Szkolny.eu.app" target="1.8" />
<module name="Szkolny.eu.cafebar" target="1.8" />
<module name="Szkolny.eu.material-about-library" target="1.8" />
<module name="Szkolny.eu.mhttp" target="1.8" />
<module name="Szkolny.eu.nachos" target="1.8" />
<module name="Szkolny.eu.szkolny-font" target="1.8" />
</bytecodeTargetLevel>
</component>
</project>

View File

@ -11,7 +11,6 @@
<item index="1" class="java.lang.String" itemvalue="org.greenrobot.eventbus.Subscribe" />
</list>
</component>
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="org.jetbrains.annotations.Nullable" />
<option name="myDefaultNotNull" value="androidx.annotation.RecentlyNonNull" />
@ -51,7 +50,7 @@
</value>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">

View File

@ -203,8 +203,8 @@ dependencies {
implementation 'com.google.android:flexbox:2.0.1'
implementation 'com.qifan.powerpermission:powerpermission:1.0.0'
implementation 'com.qifan.powerpermission:powerpermission-coroutines:1.0.0'
implementation 'com.qifan.powerpermission:powerpermission:1.3.0'
implementation 'com.qifan.powerpermission:powerpermission-coroutines:1.3.0'
implementation 'com.github.kuba2k2.FSLogin:lib:master-SNAPSHOT'
implementation 'pl.droidsonroids:jspoon:1.3.2'

View File

@ -1,9 +1,7 @@
<h3>Wersja 4.2.1, 2020-05-21</h3>
<h3>Wersja 4.3, 2020-08-26</h3>
<ul>
<li>Poprawiona błędna godzina synchronizacji danych (przesunięcie w przód o 1-2h).</li>
<li>Vulcan: Naprawione logowanie.</li>
<li>Mobidziennik: Poprawione pobieranie szczęśliwego numerka.</li>
<li>Prymus: Naprawione logowane.</li>
<li>Dodana opcja automatycznej archiwizacji profilu na nowy rok szkolny.</li>
<li>Poprawione problemy z synchronizacją oraz mieszaniem się danych.</li>
</ul>
<br>
<br>

View File

@ -9,7 +9,7 @@
/*secret password - removed for source code publication*/
static toys AES_IV[16] = {
0x43, 0xfc, 0x2d, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
0x20, 0x98, 0x82, 0x66, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat);

View File

@ -364,6 +364,9 @@ class App : MultiDexApplication(), Configuration.Provider, CoroutineScope {
if (!success) {
EventBus.getDefault().post(ProfileListEmptyEvent())
}
else {
onSuccess(profile)
}
}
}
fun profileSave() = profileSave(profile)

View File

@ -42,6 +42,7 @@ import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import androidx.viewpager.widget.ViewPager
import com.google.android.gms.security.ProviderInstaller
import com.google.android.material.button.MaterialButton
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.gson.JsonArray
import com.google.gson.JsonElement
import com.google.gson.JsonObject
@ -672,6 +673,16 @@ fun TextView.setText(@StringRes resid: Int, vararg formatArgs: Any) {
text = context.getString(resid, *formatArgs)
}
fun MaterialAlertDialogBuilder.setTitle(@StringRes resid: Int, vararg formatArgs: Any): MaterialAlertDialogBuilder {
setTitle(context.getString(resid, *formatArgs))
return this
}
fun MaterialAlertDialogBuilder.setMessage(@StringRes resid: Int, vararg formatArgs: Any): MaterialAlertDialogBuilder {
setMessage(context.getString(resid, *formatArgs))
return this
}
fun JsonObject(vararg properties: Pair<String, Any?>): JsonObject {
return JsonObject().apply {
for (property in properties) {

View File

@ -43,6 +43,7 @@ import pl.szczodrzynski.edziennik.data.api.events.*
import pl.szczodrzynski.edziennik.data.api.models.ApiError
import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
import pl.szczodrzynski.edziennik.data.db.entity.Metadata.*
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.databinding.ActivitySzkolnyBinding
import pl.szczodrzynski.edziennik.sync.AppManagerDetectedEvent
import pl.szczodrzynski.edziennik.sync.SyncWorker
@ -295,12 +296,21 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
mainSnackbar.setCoordinator(b.navView.coordinator, b.navView.bottomBar)
errorSnackbar.setCoordinator(b.navView.coordinator, b.navView.bottomBar)
if (BuildConfig.VERSION_NAME.contains("nightly")) {
b.nightlyText.isVisible = true
b.nightlyText.text = "Nightly\n"+BuildConfig.VERSION_NAME.substringAfterLast(".")
when {
BuildConfig.VERSION_NAME.contains("nightly") -> {
b.nightlyText.isVisible = true
b.nightlyText.text = "Nightly\n"+BuildConfig.VERSION_NAME.substringAfterLast(".")
}
BuildConfig.VERSION_NAME.contains("daily") -> {
b.nightlyText.isVisible = true
b.nightlyText.text = "Daily\n"+BuildConfig.VERSION_NAME.substringAfterLast(".")
}
BuildConfig.DEBUG -> {
b.nightlyText.isVisible = true
b.nightlyText.text = "Debug\n"+BuildConfig.VERSION_NAME
}
else -> b.nightlyText.isVisible = false
}
else
b.nightlyText.isVisible = false
navLoading = true
@ -399,7 +409,20 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
}
app.db.profileDao().all.observe(this, Observer { profiles ->
drawer.setProfileList(profiles.filter { it.id >= 0 }.toMutableList())
val allArchived = profiles.all { it.archived }
drawer.setProfileList(profiles.filter { it.id >= 0 && (!it.archived || allArchived) }.toMutableList())
//prepend the archived profile if loaded
if (app.profile.archived && !allArchived) {
drawer.prependProfile(Profile(
id = app.profile.id,
loginStoreId = app.profile.loginStoreId,
loginStoreType = app.profile.loginStoreType,
name = app.profile.name,
subname = "Archiwum - ${app.profile.subname}"
).also {
it.archived = true
})
}
drawer.currentProfile = App.profileId
})
@ -425,6 +448,23 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
SyncWorker.scheduleNext(app)
UpdateWorker.scheduleNext(app)
// if loaded profile is archived, switch to the up-to-date version of it
if (app.profile.archived) {
launch {
if (app.profile.archiveId != null) {
val profile = withContext(Dispatchers.IO) {
app.db.profileDao().getNotArchivedOf(app.profile.archiveId!!)
}
if (profile != null)
loadProfile(profile)
else
loadProfile(0)
} else {
loadProfile(0)
}
}
}
// APP BACKGROUND
if (app.config.ui.appBackground != null) {
try {
@ -565,6 +605,41 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
__/ |
|__*/
fun syncCurrentFeature() {
if (app.profile.archived) {
MaterialAlertDialogBuilder(this)
.setTitle(R.string.profile_archived_title)
.setMessage(
R.string.profile_archived_text,
app.profile.studentSchoolYearStart,
app.profile.studentSchoolYearStart + 1
)
.setPositiveButton(R.string.ok, null)
.show()
swipeRefreshLayout.isRefreshing = false
return
}
if (app.profile.shouldArchive()) {
MaterialAlertDialogBuilder(this)
.setTitle(R.string.profile_archiving_title)
.setMessage(
R.string.profile_archiving_format,
app.profile.dateYearEnd.formattedString
)
.setPositiveButton(R.string.ok, null)
.show()
}
if (app.profile.isBeforeYear()) {
MaterialAlertDialogBuilder(this)
.setTitle(R.string.profile_year_not_started_title)
.setMessage(
R.string.profile_year_not_started_format,
app.profile.dateSemester1Start.formattedString
)
.setPositiveButton(R.string.ok, null)
.show()
swipeRefreshLayout.isRefreshing = false
return
}
swipeRefreshLayout.isRefreshing = true
Toast.makeText(this, fragmentToSyncName(navTargetId), Toast.LENGTH_SHORT).show()
val fragmentParam = when (navTargetId) {
@ -885,23 +960,51 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
fun loadProfile(id: Int) = loadProfile(id, navTargetId)
fun loadProfile(id: Int, arguments: Bundle?) = loadProfile(id, navTargetId, arguments)
fun loadProfile(id: Int, drawerSelection: Int, arguments: Bundle? = null) {
fun loadProfile(profile: Profile) = loadProfile(
profile,
navTargetId,
null,
if (app.profile.archived) app.profile.id else null
)
private fun loadProfile(id: Int, drawerSelection: Int, arguments: Bundle? = null) {
if (App.profileId == id) {
drawer.currentProfile = app.profile.id
loadTarget(drawerSelection, arguments)
return
}
val previousArchivedId = if (app.profile.archived) app.profile.id else null
app.profileLoad(id) {
MessagesFragment.pageSelection = -1
setDrawerItems()
// the drawer profile is updated automatically when the drawer item is clicked
// update it manually when switching profiles from other source
//if (drawer.currentProfile != app.profile.id)
drawer.currentProfile = app.profileId
loadTarget(drawerSelection, arguments)
loadProfile(it, drawerSelection, arguments, previousArchivedId)
}
}
private fun loadProfile(profile: Profile, drawerSelection: Int, arguments: Bundle?, previousArchivedId: Int?) {
App.profile = profile
MessagesFragment.pageSelection = -1
setDrawerItems()
if (previousArchivedId != null) {
// prevents accidentally removing the first item if the archived profile is not shown
drawer.removeProfileById(previousArchivedId)
}
if (profile.archived) {
drawer.prependProfile(Profile(
id = profile.id,
loginStoreId = profile.loginStoreId,
loginStoreType = profile.loginStoreType,
name = profile.name,
subname = "Archiwum - ${profile.subname}"
).also {
it.archived = true
})
}
// the drawer profile is updated automatically when the drawer item is clicked
// update it manually when switching profiles from other source
//if (drawer.currentProfile != app.profile.id)
drawer.currentProfile = app.profileId
loadTarget(drawerSelection, arguments)
}
fun loadTarget(id: Int, arguments: Bundle? = null) {
var loadId = id
if (loadId == -1) {

View File

@ -25,6 +25,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.Teacher
import pl.szczodrzynski.edziennik.data.db.full.AnnouncementFull
import pl.szczodrzynski.edziennik.data.db.full.EventFull
import pl.szczodrzynski.edziennik.data.db.full.MessageFull
import pl.szczodrzynski.edziennik.utils.Utils.d
open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTask(profileId) {
companion object {
@ -71,10 +72,24 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
private var edziennikInterface: EdziennikInterface? = null
internal fun run(app: App, taskCallback: EdziennikCallback) {
if (profile?.archived == true) {
taskCallback.onError(ApiError(TAG, ERROR_PROFILE_ARCHIVED))
return
profile?.let { profile ->
if (profile.archived) {
d(TAG, "The profile $profileId is archived")
taskCallback.onError(ApiError(TAG, ERROR_PROFILE_ARCHIVED))
return
}
else if (profile.shouldArchive()) {
d(TAG, "The profile $profileId's year ended on ${profile.dateYearEnd}, archiving")
ProfileArchiver(app, profile)
}
if (profile.isBeforeYear()) {
d(TAG, "The profile $profileId's school year has not started yet; aborting sync")
cancel()
taskCallback.onCompleted()
return
}
}
edziennikInterface = when (loginStore.type) {
LOGIN_TYPE_LIBRUS -> Librus(app, profile, loginStore, taskCallback)
LOGIN_TYPE_MOBIDZIENNIK -> Mobidziennik(app, profile, loginStore, taskCallback)
@ -108,6 +123,7 @@ open class EdziennikTask(override val profileId: Int, val request: Any) : IApiTa
}
override fun cancel() {
d(TAG, "Task ${toString()} cancelling...")
edziennikInterface?.cancel()
}

View File

@ -0,0 +1,97 @@
/*
* Copyright (c) Kuba Szczodrzyński 2020-8-25.
*/
package pl.szczodrzynski.edziennik.data.api.edziennik
import android.content.Intent
import pl.szczodrzynski.edziennik.App
import pl.szczodrzynski.edziennik.Intent
import pl.szczodrzynski.edziennik.data.api.*
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.utils.Utils.d
import pl.szczodrzynski.edziennik.utils.models.Date
class ProfileArchiver(val app: App, val profile: Profile) {
companion object {
private const val TAG = "ProfileArchiver"
}
init {
if (profile.archiveId == null)
profile.archiveId = profile.id
d(TAG, "Processing ${profile.name}#${profile.id}, archiveId = ${profile.archiveId}")
profile.archived = true
app.db.profileDao().add(profile)
//app.db.metadataDao().setAllSeen(profile.id, true)
app.db.notificationDao().clear(profile.id)
app.db.endpointTimerDao().clear(profile.id)
d(TAG, "Archived profile ${profile.id} saved")
profile.archived = false
// guess the nearest school year
val today = Date.getToday()
profile.studentSchoolYearStart = when {
today.month <= profile.dateYearEnd.month -> today.year - 1
else -> today.year
}
// set default semester dates
profile.dateSemester1Start = Date(profile.studentSchoolYearStart, 9, 1)
profile.dateSemester2Start = Date(profile.studentSchoolYearStart + 1, 2, 1)
profile.dateYearEnd = Date(profile.studentSchoolYearStart + 1, 6, 30)
val oldId = profile.id
val newId = (app.db.profileDao().lastId ?: profile.id) + 1
profile.id = newId
profile.subname = "Nowy rok szkolny - ${profile.studentSchoolYearStart}"
profile.studentClassName = null
d(TAG, "New profile ID for ${profile.name}: ${profile.id}")
when (profile.loginStoreType) {
LOGIN_TYPE_LIBRUS -> {
profile.removeStudentData("isPremium")
profile.removeStudentData("pushDeviceId")
profile.removeStudentData("startPointsSemester1")
profile.removeStudentData("startPointsSemester2")
profile.removeStudentData("enablePointGrades")
profile.removeStudentData("enableDescriptiveGrades")
}
LOGIN_TYPE_MOBIDZIENNIK -> {
}
LOGIN_TYPE_VULCAN -> {
// DataVulcan.isApiLoginValid() returns false so it will update the semester
profile.removeStudentData("currentSemesterEndDate")
profile.removeStudentData("studentSemesterId")
profile.removeStudentData("studentSemesterNumber")
profile.removeStudentData("semester1Id")
profile.removeStudentData("semester2Id")
profile.removeStudentData("studentClassId")
}
LOGIN_TYPE_IDZIENNIK -> {
profile.removeStudentData("schoolYearId")
}
LOGIN_TYPE_EDUDZIENNIK -> {
}
LOGIN_TYPE_PODLASIE -> {
}
}
d(TAG, "Processed student data: ${profile.studentData}")
app.db.profileDao().add(profile)
if (app.profileId == oldId) {
val intent = Intent(
Intent.ACTION_MAIN,
"profileId" to newId
)
app.sendBroadcast(intent)
}
}
}

View File

@ -110,7 +110,6 @@ class Edudziennik(val app: App, val profile: Profile?, val loginStore: LoginStor
override fun cancel() {
d(TAG, "Cancelled")
data.cancel()
callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {

View File

@ -133,7 +133,6 @@ class Idziennik(val app: App, val profile: Profile?, val loginStore: LoginStore,
override fun cancel() {
d(TAG, "Cancelled")
data.cancel()
callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {

View File

@ -70,6 +70,14 @@ class IdziennikLoginWeb(val data: DataIdziennik, val onSuccess: () -> Unit) {
data.webSelectedRegister = registerId
}
// for profiles created after archiving
data.schoolYearId = Regexes.IDZIENNIK_LOGIN_FIRST_SCHOOL_YEAR.find(text)?.let {
it[1].toIntOrNull()
} ?: data.schoolYearId
data.profile?.studentClassName = Regexes.IDZIENNIK_LOGIN_FIRST_STUDENT.findAll(text)
.firstOrNull { it[1].toIntOrNull() == data.registerId }
?.let { "${it[5]} ${it[6]}" } ?: data.profile?.studentClassName
data.profile?.let { profile ->
Regexes.IDZIENNIK_WEB_LUCKY_NUMBER.find(text)?.also {
val number = it[1].toIntOrNull() ?: return@also

View File

@ -157,7 +157,6 @@ class Librus(val app: App, val profile: Profile?, val loginStore: LoginStore, va
override fun cancel() {
d(TAG, "Cancelled")
data.cancel()
callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {

View File

@ -36,11 +36,14 @@ class LibrusRecaptchaHelper(
}
private var timeout: Job? = null
private var timedOut = false
inner class WebViewClient : android.webkit.WebViewClient() {
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
timeout?.cancel()
onSuccess(url)
if (!timedOut) {
onSuccess(url)
}
return true
}
}
@ -50,6 +53,7 @@ class LibrusRecaptchaHelper(
webView.loadDataWithBaseURL(url, html, "text/html", "UTF-8", null)
}
timeout = startCoroutineTimer(delayMillis = 10000L) {
timedOut = true
onTimeout()
}
}

View File

@ -130,7 +130,6 @@ class Mobidziennik(val app: App, val profile: Profile?, val loginStore: LoginSto
override fun cancel() {
d(TAG, "Cancelled")
data.cancel()
callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {

View File

@ -134,7 +134,6 @@ class Podlasie(val app: App, val profile: Profile?, val loginStore: LoginStore,
override fun cancel() {
Utils.d(TAG, "Cancelled")
data.cancel()
callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {

View File

@ -100,7 +100,6 @@ class Template(val app: App, val profile: Profile?, val loginStore: LoginStore,
override fun cancel() {
d(TAG, "Cancelled")
data.cancel()
callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {

View File

@ -194,7 +194,6 @@ class Vulcan(val app: App, val profile: Profile?, val loginStore: LoginStore, va
override fun cancel() {
d(TAG, "Cancelled")
data.cancel()
callback.onCompleted()
}
private fun wrapCallback(callback: EdziennikCallback): EdziennikCallback {

View File

@ -46,6 +46,6 @@ object Signing {
/*fun provideKey(param1: String, param2: Long): ByteArray {*/
fun pleaseStopRightNow(param1: String, param2: Long): ByteArray {
return "$param1.MTIzNDU2Nzg5MDtTu0zYCV===.$param2".sha256()
return "$param1.MTIzNDU2Nzg5MDQC7Eh97U===.$param2".sha256()
}
}

View File

@ -43,7 +43,7 @@ import pl.szczodrzynski.edziennik.data.db.migration.*
LibrusLesson::class,
TimetableManual::class,
Metadata::class
], version = 88)
], version = 89)
@TypeConverters(
ConverterTime::class,
ConverterDate::class,
@ -173,7 +173,8 @@ abstract class AppDb : RoomDatabase() {
Migration85(),
Migration86(),
Migration87(),
Migration88()
Migration88(),
Migration89()
).allowMainThreadQueries().build()
}
}

View File

@ -60,4 +60,10 @@ interface ProfileDao {
@Query("UPDATE profiles SET empty = 0")
fun setAllNotEmpty()
@Query("SELECT * FROM profiles WHERE archiveId = :archiveId AND archived = 1")
fun getArchivesOf(archiveId: Int): List<Profile>
@Query("SELECT * FROM profiles WHERE archiveId = :archiveId AND archived = 0 ORDER BY profileId DESC LIMIT 1")
fun getNotArchivedOf(archiveId: Int): Profile?
}

View File

@ -28,7 +28,7 @@ import pl.szczodrzynski.navlib.getDrawableFromRes
@Entity(tableName = "profiles", primaryKeys = ["profileId"])
open class Profile(
@ColumnInfo(name = "profileId")
override val id: Int,
override var id: Int, /* needs to be var for ProfileArchiver */
val loginStoreId: Int,
val loginStoreType: Int,
@ -64,6 +64,12 @@ open class Profile(
var empty = true
var archived = false
/**
* A unique ID matching [archived] profiles with current ones
* and vice-versa.
*/
var archiveId: Int? = null
var syncEnabled = true
var enableSharedEvents = true
var registration = REGISTRATION_UNSPECIFIED
@ -85,6 +91,23 @@ open class Profile(
@delegate:Ignore
val currentSemester by lazy { dateToSemester(Date.getToday()) }
fun shouldArchive(): Boolean {
// vulcan hotfix
if (dateYearEnd.month > 6) {
dateYearEnd.month = 6
dateYearEnd.day = 30
}
// fix for when versions <4.3 synced 2020/2021 year dates to older profiles during 2020 Jun-Aug
if (dateSemester1Start.year > studentSchoolYearStart) {
val diff = dateSemester1Start.year - studentSchoolYearStart
dateSemester1Start.year -= diff
dateSemester2Start.year -= diff
dateYearEnd.year -= diff
}
return Date.getToday() >= dateYearEnd && Date.getToday().year > studentSchoolYearStart
}
fun isBeforeYear() = Date.getToday() < dateSemester1Start
var disabledNotifications: List<Long>? = null
var lastReceiversSync: Long = 0
@ -106,14 +129,18 @@ open class Profile(
get() = accountName != null
override fun getImageDrawable(context: Context): Drawable {
if (archived) {
return context.getDrawableFromRes(pl.szczodrzynski.edziennik.R.drawable.profile_archived).also {
it.colorFilter = PorterDuffColorFilter(colorFromName(name), PorterDuff.Mode.DST_OVER)
}
}
if (!image.isNullOrEmpty()) {
try {
if (image?.endsWith(".gif", true) == true) {
return GifDrawable(image ?: "")
}
else {
return RoundedBitmapDrawableFactory.create(context.resources, image ?: "")
return if (image?.endsWith(".gif", true) == true) {
GifDrawable(image ?: "")
} else {
RoundedBitmapDrawableFactory.create(context.resources, image ?: "")
//return Drawable.createFromPath(image ?: "") ?: throw Exception()
}
}
@ -125,9 +152,13 @@ open class Profile(
return context.getDrawableFromRes(R.drawable.profile).also {
it.colorFilter = PorterDuffColorFilter(colorFromName(name), PorterDuff.Mode.DST_OVER)
}
}
override fun getImageHolder(context: Context): ImageHolder {
if (archived) {
return ImageHolder(pl.szczodrzynski.edziennik.R.drawable.profile_archived, colorFromName(name))
}
return if (!image.isNullOrEmpty()) {
try {
ProfileImageHolder(image ?: "")

View File

@ -0,0 +1,10 @@
package pl.szczodrzynski.edziennik.data.db.migration
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
class Migration89 : Migration(88, 89) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE profiles ADD COLUMN archiveId INTEGER DEFAULT NULL;")
}
}

View File

@ -17,6 +17,7 @@ import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.data.db.entity.Event
import pl.szczodrzynski.edziennik.databinding.LabFragmentBinding
import pl.szczodrzynski.edziennik.ui.modules.base.lazypager.LazyFragment
import pl.szczodrzynski.edziennik.utils.TextInputDropDown
import pl.szczodrzynski.fslogin.decode
import kotlin.coroutines.CoroutineContext
@ -62,6 +63,21 @@ class LabPageFragment : LazyFragment(), CoroutineScope {
app.db.eventDao().getRawNow("UPDATE events SET homeworkBody = NULL WHERE profileId = ${App.profileId}")
}
b.unarchive.onClick {
app.profile.archived = false
app.profile.archiveId = null
app.profileSave()
}
val profiles = app.db.profileDao().allNow
b.profile.clear()
b.profile += profiles.map { TextInputDropDown.Item(it.id.toLong(), "${it.id} ${it.name} archived ${it.archived}", tag = it) }
b.profile.select(app.profileId.toLong())
b.profile.setOnChangeListener {
activity.loadProfile(it.id.toInt())
return@setOnChangeListener true
}
val colorSecondary = android.R.attr.textColorSecondary.resolveAttr(activity)
startCoroutineTimer(500L, 300L) {
val text = app.cookieJar.sessionCookies

View File

@ -33,7 +33,7 @@ class CardItemTouchHelperCallback(private val cardAdapter: HomeCardAdapter, priv
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
removeCard(viewHolder.adapterPosition)
removeCard(viewHolder.adapterPosition, cardAdapter)
cardAdapter.items.removeAt(viewHolder.adapterPosition)
cardAdapter.notifyItemRemoved(viewHolder.adapterPosition)
}

View File

@ -28,10 +28,7 @@ import pl.szczodrzynski.edziennik.data.db.entity.LoginStore
import pl.szczodrzynski.edziennik.databinding.FragmentHomeBinding
import pl.szczodrzynski.edziennik.onClick
import pl.szczodrzynski.edziennik.ui.dialogs.home.StudentNumberDialog
import pl.szczodrzynski.edziennik.ui.modules.home.cards.HomeEventsCard
import pl.szczodrzynski.edziennik.ui.modules.home.cards.HomeGradesCard
import pl.szczodrzynski.edziennik.ui.modules.home.cards.HomeLuckyNumberCard
import pl.szczodrzynski.edziennik.ui.modules.home.cards.HomeTimetableCard
import pl.szczodrzynski.edziennik.ui.modules.home.cards.*
import pl.szczodrzynski.edziennik.utils.Themes
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetPrimaryItem
import pl.szczodrzynski.navlib.bottomsheet.items.BottomSheetSeparatorItem
@ -44,8 +41,8 @@ class HomeFragment : Fragment(), CoroutineScope {
fun swapCards(fromPosition: Int, toPosition: Int, cardAdapter: HomeCardAdapter): Boolean {
val fromCard = cardAdapter.items[fromPosition]
val toCard = cardAdapter.items[toPosition]
if (fromCard.id == 100 || toCard.id == 100) {
// debug card is not swappable
if (fromCard.id >= 100 || toCard.id >= 100) {
// debug & archive cards are not swappable
return false
}
cardAdapter.items[fromPosition] = cardAdapter.items[toPosition]
@ -60,10 +57,16 @@ class HomeFragment : Fragment(), CoroutineScope {
return true
}
fun removeCard(position: Int) {
fun removeCard(position: Int, cardAdapter: HomeCardAdapter) {
val homeCards = App.config.forProfile().ui.homeCards.toMutableList()
if (position >= homeCards.size)
return
val card = cardAdapter.items[position]
if (card.id >= 100) {
// debug & archive cards are not removable
cardAdapter.notifyDataSetChanged()
return
}
homeCards.removeAt(position)
App.config.forProfile().ui.homeCards = homeCards
}
@ -160,6 +163,8 @@ class HomeFragment : Fragment(), CoroutineScope {
}
//if (App.devMode)
// items += HomeDebugCard(100, app, activity, this, app.profile)
if (app.profile.archived)
items.add(0, HomeArchiveCard(101, app, activity, this, app.profile))
val adapter = HomeCardAdapter(items)
val itemTouchHelper = ItemTouchHelper(CardItemTouchHelperCallback(adapter, b.refreshLayout))

View File

@ -0,0 +1,79 @@
/*
* Copyright (c) Kuba Szczodrzyński 2020-8-25.
*/
package pl.szczodrzynski.edziennik.ui.modules.home.cards
import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.core.view.plusAssign
import androidx.core.view.setMargins
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.*
import pl.szczodrzynski.edziennik.*
import pl.szczodrzynski.edziennik.data.db.entity.Profile
import pl.szczodrzynski.edziennik.databinding.CardHomeArchiveBinding
import pl.szczodrzynski.edziennik.ui.modules.home.HomeCard
import pl.szczodrzynski.edziennik.ui.modules.home.HomeCardAdapter
import pl.szczodrzynski.edziennik.ui.modules.home.HomeFragment
import kotlin.coroutines.CoroutineContext
class HomeArchiveCard(
override val id: Int,
val app: App,
val activity: MainActivity,
val fragment: HomeFragment,
val profile: Profile
) : HomeCard, CoroutineScope {
companion object {
private const val TAG = "HomeArchiveCard"
}
private var job: Job = Job()
override val coroutineContext: CoroutineContext
get() = job + Dispatchers.Main
override fun bind(position: Int, holder: HomeCardAdapter.ViewHolder) {
holder.root.removeAllViews()
val b = CardHomeArchiveBinding.inflate(LayoutInflater.from(holder.root.context))
b.root.layoutParams = FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT).apply {
setMargins(8.dp)
}
holder.root += b.root
b.homeArchiveText.setText(
R.string.home_archive_text,
profile.studentSchoolYearStart,
profile.studentSchoolYearStart + 1
)
b.homeArchiveClose.onClick {
launch {
val profile = profile.archiveId?.let {
withContext(Dispatchers.IO) {
app.db.profileDao().getNotArchivedOf(it)
}
}
if (profile == null) {
MaterialAlertDialogBuilder(activity)
.setTitle(R.string.home_archive_close_no_target_title)
.setMessage(R.string.home_archive_close_no_target_text, this@HomeArchiveCard.profile.name)
.setPositiveButton(R.string.ok) { _, _ ->
activity.drawer.profileSelectionOpen()
activity.drawer.open()
}
.show()
return@launch
}
activity.loadProfile(profile)
}
}
holder.root.onClick {
activity.loadTarget(MainActivity.DRAWER_ITEM_AGENDA)
}
}
override fun unbind(position: Int, holder: HomeCardAdapter.ViewHolder) = Unit
}

View File

@ -0,0 +1,19 @@
<!--
~ Copyright (c) Kuba Szczodrzyński 2020-8-25.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="128dp"
android:height="128dp"
android:viewportWidth="64"
android:viewportHeight="64">
<path
android:pathData="M54,19H10v33c0,2.209 1.791,4 4,4h36c2.209,0 4,-1.791 4,-4V19z"
android:fillColor="#ffb86b"/>
<path
android:pathData="m54,22h-44c-1.657,0 -3,-1.343 -3,-3v-5c0,-1.657 1.343,-3 3,-3h44c1.657,0 3,1.343 3,3v5c0,1.657 -1.343,3 -3,3z"
android:fillColor="#ffa54a"/>
<path
android:pathData="m37,32h-10c-1.65,0 -3,-1.35 -3,-3s1.35,-3 3,-3h10c1.65,0 3,1.35 3,3s-1.35,3 -3,3z"
android:fillColor="#69707e"/>
</vector>

View File

@ -0,0 +1,6 @@
<vector android:height="136dp" android:viewportHeight="135.5"
android:viewportWidth="135.5" android:width="136dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillAlpha="0" android:fillColor="#FF000000" android:pathData="m0,0h135.5v135.5h-135.5z"/>
<path android:fillAlpha="0.6902" android:fillColor="#fff"
android:pathData="m42.75,31.75a4,4 0,0 0,-3.453 1.984l-7,12a4,4 0,0 0,-0.547 2.016v48c0,4.372 3.628,8 8,8h56c4.372,0 8,-3.628 8,-8v-48a4,4 0,0 0,-0.547 -2.016l-7,-12a4,4 0,0 0,-3.453 -1.984zM45.047,39.75h45.406l4.664,8h-54.734zM39.75,55.75h56v40h-56zM55.75,63.75v8h24v-8z" android:strokeWidth="4"/>
</vector>

View File

@ -1,75 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_weight="1"
android:fontFamily="sans-serif-medium"
android:text="@string/card_grades_header_title"
android:textSize="18sp"
android:textStyle="bold" />
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardElevation="4dp"
app:cardCornerRadius="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/cardGradesNoData"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="8dp"
android:text="@string/card_grades_no_data"
android:textSize="14sp"
android:textStyle="italic"
android:visibility="gone" />
<LinearLayout
android:id="@+id/cardGradesList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:orientation="vertical"
android:visibility="visible">
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:textColorSecondary" />
<Button
android:id="@+id/cardGradesButton"
style="@style/Widget.MaterialComponents.Button.TextButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:gravity="center_vertical|start"
android:minHeight="0dp"
android:padding="@dimen/card_button_padding"
android:text="@string/card_grades_button" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>

View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (c) Kuba Szczodrzyński 2020-8-25.
-->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
tools:layout_margin="8dp">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/home_archive_title"
android:textAppearance="@style/NavView.TextView.Title" />
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/homeArchiveText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_margin="16dp"
android:fontFamily="sans-serif-light"
android:gravity="center_horizontal"
android:text="@string/home_archive_text"
android:textSize="16sp"
tools:text="Przeglądasz dane ucznia z roku szkolnego 2019/2020." />
<com.google.android.material.button.MaterialButton
android:id="@+id/homeArchiveClose"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/home_archive_close" />
</LinearLayout>
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
app:srcCompat="@drawable/ic_archive" />
</LinearLayout>
</layout>

View File

@ -30,7 +30,7 @@
style="@style/Widget.MaterialComponents.Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Librus Captcha" />
android:text="LIBRUS® Captcha" />
<com.google.android.material.button.MaterialButton
android:id="@+id/refreshWidget"
@ -86,4 +86,4 @@
android:text="Prune finished work" />
</LinearLayout>
</layout>
</layout>

View File

@ -17,121 +17,130 @@
android:id="@+id/noTimetableLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone"
tools:visibility="visible">
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
app:srcCompat="@drawable/ic_sync"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/NavView.TextView.Title"
android:text="@string/home_timetable_no_timetable" />
android:text="@string/home_timetable_no_timetable"
android:textAppearance="@style/NavView.TextView.Title" />
<TextView
android:id="@+id/noTimetableText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="@string/home_timetable_no_timetable_text"/>
android:layout_gravity="center_horizontal"
android:layout_margin="16dp"
android:fontFamily="sans-serif-light"
android:gravity="center_horizontal"
android:text="@string/home_timetable_no_timetable_text"
android:textSize="16sp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/noTimetableSync"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:text="@string/home_timetable_no_timetable_sync" />
</LinearLayout>
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
app:srcCompat="@drawable/ic_sync" />
</LinearLayout>
<LinearLayout
android:id="@+id/noLessonsLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone"
tools:layout_marginTop="150dp"
tools:layout_marginTop="170dp"
tools:visibility="visible">
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
app:srcCompat="@drawable/ic_timetable"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/NavView.TextView.Title"
android:text="@string/home_timetable_no_lessons" />
android:text="@string/home_timetable_no_lessons"
android:textAppearance="@style/NavView.TextView.Title" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="@string/home_timetable_no_lessons_text"/>
android:layout_gravity="center_horizontal"
android:layout_margin="16dp"
android:fontFamily="sans-serif-light"
android:gravity="center_horizontal"
android:text="@string/home_timetable_no_lessons_text"
android:textSize="16sp" />
</LinearLayout>
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
app:srcCompat="@drawable/ic_timetable" />
</LinearLayout>
<LinearLayout
android:id="@+id/notPublicLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone"
tools:layout_marginTop="220dp"
tools:layout_marginTop="270dp"
tools:visibility="visible">
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
app:srcCompat="@drawable/ic_no_timetable"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/NavView.TextView.Title"
android:text="@string/home_timetable_not_public" />
android:text="@string/home_timetable_not_public"
android:textAppearance="@style/NavView.TextView.Title" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="@string/home_timetable_not_public_text"/>
android:layout_gravity="center_horizontal"
android:layout_margin="16dp"
android:fontFamily="sans-serif-light"
android:gravity="center_horizontal"
android:text="@string/home_timetable_not_public_text"
android:textSize="16sp" />
</LinearLayout>
<ImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
app:srcCompat="@drawable/ic_no_timetable" />
</LinearLayout>
<LinearLayout
@ -139,7 +148,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:layout_marginTop="350dp">
tools:layout_marginTop="410dp">
<LinearLayout
android:layout_width="match_parent"
@ -165,15 +174,14 @@
android:layout_height="wrap_content"
android:textAppearance="@style/NavView.TextView.Helper"
tools:text="7 lekcji - 8:10 do 14:45" />
</LinearLayout>
<ImageView
android:id="@+id/settings"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="10dp"
android:background="?selectableItemBackgroundBorderless"
android:padding="10dp"
android:visibility="gone"
tools:src="@sample/settings" />
@ -181,16 +189,16 @@
android:id="@+id/bellSync"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="10dp"
android:background="?selectableItemBackgroundBorderless"
android:padding="10dp"
tools:src="@sample/settings" />
<ImageView
android:id="@+id/showCounter"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="10dp"
android:background="?selectableItemBackgroundBorderless"
android:padding="10dp"
tools:src="@sample/settings" />
</LinearLayout>
@ -234,10 +242,9 @@
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:visibility="gone"
tools:visibility="visible"
tools:max="2700"
tools:progress="780" />
tools:progress="780"
tools:visibility="visible" />
</LinearLayout>
<TextView
@ -247,7 +254,6 @@
android:layout_gravity="center_vertical"
android:gravity="center"
tools:text="zostały\n2 minuty\n35 sekund" />
</LinearLayout>
<View
@ -263,8 +269,6 @@
android:layout_height="wrap_content"
android:textAppearance="@style/NavView.TextView.Helper"
tools:text="Póżniej:\n9:05 informatyka\n10:00 urządzenia techniki komputerowej\n11:00 projektowanie lokalnych sieci komputerowych\n11:55 zajęcia z wychowawcą\n13:00 język polski\n14:05 język niemiecki" />
</LinearLayout>
</FrameLayout>
</layout>

View File

@ -1,85 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.card.MaterialCardView
android:id="@+id/cardLuckyNumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardElevation="4dp"
app:cardCornerRadius="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<com.mikepenz.iconics.view.IconicsTextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:gravity="center"
android:text="{cmd-emoticon-excited-outline}"
android:textSize="26sp"
app:fontFamily="sans-serif-condensed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text=":-)" />
<TextView
android:id="@+id/cardLuckyNumberTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginRight="8dp"
android:fontFamily="sans-serif-medium"
android:textSize="20sp"
tools:text="%d to dzisiejszy Szczęśliwy numerek." />
</LinearLayout>
<TextView
android:id="@+id/cardLuckyNumberText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
tools:text="Twój numerek to %d" />
<!--<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?attr/secondaryTextColor" />
<Button
android:id="@+id/cardLuckyNumberButton"
style="@style/Widget.AppCompat.Button.Borderless"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:gravity="center_vertical|start"
android:minWidth="0dp"
android:minHeight="0dp"
android:padding="@dimen/card_button_padding"
android:text="@string/card_login_button" />-->
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</layout>

View File

@ -1,214 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/cardTimetableTitle"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_weight="1"
android:fontFamily="sans-serif-medium"
android:text="@string/card_timetable_header_title"
android:textAppearance="@style/TextAppearance.AppCompat"
android:textSize="18sp"
android:textStyle="bold" />
<com.google.android.material.card.MaterialCardView
android:id="@+id/cardTimetable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardElevation="4dp"
app:cardCornerRadius="5dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/cardTimetableNoData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:gravity="center_horizontal"
android:text="@string/card_timetable_no_data"
android:textSize="14sp"
android:textStyle="italic"
android:visibility="gone" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cardTimetableContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="visible">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/cardTimetableHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent">
<com.mikepenz.iconics.view.IconicsImageView
android:id="@+id/cardTimetableClockIcon"
android:layout_width="48dp"
android:layout_height="48dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:padding="8dp"
app:iiv_color="?android:textColorSecondary"
app:iiv_icon="cmd-clock"
app:iiv_size="48dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@tools:sample/avatars[0]" />
<LinearLayout
android:id="@+id/test"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintEnd_toStartOf="@+id/cardTimetableBellSync"
app:layout_constraintStart_toEndOf="@+id/cardTimetableClockIcon"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/cardTimetableType"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:layout_weight="2"
android:ellipsize="end"
android:maxLines="2"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
tools:text="Czas trwania lekcji:" />
<TextView
android:id="@+id/cardTimetableSummary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:fontFamily="sans-serif-medium"
android:maxLines="2"
android:text="@string/loading"
android:textAllCaps="false"
android:textSize="16sp"
android:textStyle="bold" />
</LinearLayout>
<com.mikepenz.iconics.view.IconicsImageView
android:id="@+id/cardTimetableBellSync"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:background="?android:attr/selectableItemBackground"
android:padding="4dp"
app:iiv_color="?android:textColorSecondary"
app:iiv_icon="cmd-alarm-bell"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@android:drawable/ic_partial_secure" />
<TextView
android:id="@+id/cardTimetableTimeLeft"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintBottom_toBottomOf="@+id/cardTimetableFullscreenCounter"
app:layout_constraintStart_toEndOf="@+id/cardTimetableClockIcon"
app:layout_constraintTop_toTopOf="@+id/cardTimetableFullscreenCounter"
tools:text="Zostało 25 minut" />
<com.mikepenz.iconics.view.IconicsImageView
android:id="@+id/cardTimetableFullscreenCounter"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:background="?android:attr/selectableItemBackground"
android:padding="8dp"
app:iiv_color="?android:textColorSecondary"
app:iiv_icon="cmd-fullscreen"
app:layout_constraintStart_toEndOf="@+id/cardTimetableTimeLeft"
app:layout_constraintTop_toBottomOf="@+id/test"
tools:srcCompat="@android:drawable/ic_partial_secure" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/cardTimetableLessonOverview"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:ellipsize="end"
android:maxLines="3"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/cardTimetableHeader"
tools:text="Następne lekcje:\n11:05 matematyka\n12:00 język polski" />
<TextView
android:id="@+id/cardTimetableEventOverview"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
android:layout_marginBottom="8dp"
android:ellipsize="end"
android:maxLines="4"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/cardTimetableLessonOverview"
tools:text="Wydarzenia:\n10:00 język niemiecki sprawdzianik hehehehe nie wiem co napisać\n12:55 chemia ciekawe czy zrobi te trzy kropki na końcu heh" />
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:textColorSecondary" />
<Button
android:id="@+id/cardTimetableButton"
style="@style/Widget.MaterialComponents.Button.TextButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground"
android:gravity="center_vertical|start"
android:minHeight="0dp"
android:padding="@dimen/card_button_padding"
android:text="@string/card_timetable_button" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</layout>

View File

@ -61,6 +61,19 @@
android:layout_height="wrap_content"
android:fontFamily="monospace"
tools:text="Cookies:\n\nsynergia.librus.pl\n DZIENNIKSID=L01~1234567890abcdef"/>
<Button
android:id="@+id/unarchive"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Unarchive this profile"
android:textAllCaps="false" />
<pl.szczodrzynski.edziennik.utils.TextInputDropDown
android:id="@+id/profile"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" />
</LinearLayout>
</ScrollView>
</layout>

View File

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
~ Copyright (c) Kuba Szczodrzyński 2020-4-9.
-->
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
@ -46,6 +46,15 @@
tools:itemCount="5"
tools:listitem="@layout/login_chooser_item" />
<TextView
style="@style/TextAppearance.AppCompat.Small"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="8dp"
android:text="@string/login_copyright_notice"
android:textAlignment="center" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@ -64,7 +73,7 @@
<Space
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"/>
android:layout_weight="1" />
<com.google.android.material.button.MaterialButton
android:id="@+id/helpButton"

View File

@ -39,7 +39,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/NavView.TextView.Medium"
tools:text="Vulcan UONET+" />
tools:text="VULCAN® UONET+" />
<TextView
android:id="@+id/description"

View File

@ -55,7 +55,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/NavView.TextView.Helper"
tools:text="Musisz posiadać konto Librus Rodzina" />
tools:text="Musisz posiadać konto LIBRUS® Rodzina" />
</LinearLayout>
</LinearLayout>
</layout>

View File

@ -39,7 +39,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:textSize="24sp"
tools:text="Zaloguj się - Vulcan UONET+" />
tools:text="Zaloguj się - VULCAN® UONET+" />
<TextView
android:id="@+id/subTitle"

View File

@ -310,15 +310,15 @@
<string name="edziennik_progress_login_idziennik_api">bei iDziennik einloggen…</string>
<string name="edziennik_progress_login_idziennik_web">bei iDziennik einloggen…</string>
<string name="edziennik_progress_login_librus_api">Einloggen in die API…</string>
<string name="edziennik_progress_login_librus_messages">Einloggen bei Librus Nachrichten…</string>
<string name="edziennik_progress_login_librus_portal">Einloggen bei Librus Portal</string>
<string name="edziennik_progress_login_librus_synergia">Einloggen bei Librus Synergia…</string>
<string name="edziennik_progress_login_librus_messages">Einloggen bei LIBRUS® nachrichten…</string>
<string name="edziennik_progress_login_librus_portal">Einloggen bei LIBRUS® Rodzina</string>
<string name="edziennik_progress_login_librus_synergia">Einloggen bei LIBRUS® Synergia…</string>
<string name="edziennik_progress_login_mobidziennik_api">Einloggen bei MobiDziennik…</string>
<string name="edziennik_progress_login_mobidziennik_api2">Einloggen bei MobiDziennik…</string>
<string name="edziennik_progress_login_mobidziennik_web">Einloggen bei MobiDziennik API…</string>
<string name="edziennik_progress_login_template_api">Einloggen bei Template API…</string>
<string name="edziennik_progress_login_template_web">Einloggen bei Template WEB…</string>
<string name="edziennik_progress_login_vulcan_api">Einloggen bei Vulcan</string>
<string name="edziennik_progress_login_vulcan_api">Einloggen bei VULCAN®</string>
<string name="edziennik_szkolny_api_sync_title">Gemeinsame Ereignisse synchronisieren…</string>
<string name="edziennik_szkolny_creating_notifications">Erstellen von Benachrichtigungen…</string>
<string name="error">Fehler</string>
@ -572,13 +572,13 @@
<string name="login_iuczniowie_help_title">Hilfe - iDziennik Progman</string>
<string name="login_iuczniowie_subtitle">Melden Sie sich mit den Daten an, die Sie von Ihrer Schule erhalten haben. Bei Problemen verwenden Sie die Schaltfläche unter dem Formular.</string>
<string name="login_iuczniowie_title">Einloggen - iDziennik Progman</string>
<string name="login_librus_captcha_title">Librus - Einloggen</string>
<string name="login_librus_help_subtitle">Um die App verwenden zu können, müssen Sie über ein Librus-Konto verfügen. Sie können sie unter portal.librus.pl erstellen. Verwenden Sie die Daten, die Sie an den im Bild markierten Stellen eingeben.</string>
<string name="login_librus_help_title">Hilfe - Librus</string>
<string name="login_librus_jst_subtitle">Melden Sie sich mit dem Token und der PIN an, die Sie in der Rubrik "mobile apps" von Librus Synergia erhalten können</string>
<string name="login_librus_jst_title">Einloggen - Librus JST</string>
<string name="login_librus_subtitle">Melden Sie sich mit Ihren Librus-Kontodaten an (zuvor unter Ihrer E-Mail-Adresse erstellt). Melden Sie sich nicht mit den von Ihrer Schule erhaltenen Daten an. Bei Problemen verwenden Sie die Schaltfläche unter dem Formular.</string>
<string name="login_librus_title">Einloggen - Librus</string>
<string name="login_librus_captcha_title">LIBRUS® - Einloggen</string>
<string name="login_librus_help_subtitle">Um die App verwenden zu können, müssen Sie über ein LIBRUS® Rodzina-Konto verfügen. Sie können sie unter portal.librus.pl erstellen. Verwenden Sie die Daten, die Sie an den im Bild markierten Stellen eingeben.</string>
<string name="login_librus_help_title">Hilfe für LIBRUS® einloggen</string>
<string name="login_librus_jst_subtitle">Melden Sie sich mit dem Token und der PIN an, die Sie in der Rubrik "mobile apps" von LIBRUS® Synergia erhalten können</string>
<string name="login_librus_jst_title">Einloggen bei LIBRUS® JST</string>
<string name="login_librus_subtitle">Melden Sie sich mit Ihren LIBRUS® Rodzina-Konto daten an (zuvor unter Ihrer E-Mail-Adresse erstellt). Melden Sie sich nicht mit den von Ihrer Schule erhaltenen Daten an. Bei Problemen verwenden Sie die Schaltfläche unter dem Formular.</string>
<string name="login_librus_title">Einloggen bei LIBRUS® Synergia</string>
<string name="login_migration_error_format">Ein Migrationsfehler ist aufgetreten. Er wurde bereits gemeldet, was bedeutet, dass ich versuchen werde, ihn zu beheben.\n\nSie können die App weiterhin verwenden. Bei Problemen versuchen Sie, das Profil zu entfernen und neu zu erstellen</string>
<string name="login_migration_subtitle">Die App hat ein großes Update erhalten. Wenn bei der Operation Probleme auftreten, können Sie mich über die Hilfe und das Feedback im Menü kontaktieren.</string>
<string name="login_migration_title">Szkolny.eu wurde aktualisiert</string>
@ -604,12 +604,12 @@
<string name="login_sync_subtitle_1_format">Profil synchronisieren</string>
<string name="login_sync_title">Synchronisation…</string>
<string name="login_vulcan_help_register">Geräteregistrierung:</string>
<string name="login_vulcan_help_subtitle">Melden Sie sich bei der Desktop-Version von Vulcan E-Klassenbuch an und wählen Sie die Option \"Dostęp mobilny\". Klicken Sie \"Zarejestruj urządzenie mobilne\". Sie können die Daten eingeben oder den QR-Code scannen und nur die PIN eingeben</string>
<string name="login_vulcan_help_title">Hilfe - Vulkan UONET+</string>
<string name="login_vulcan_help_subtitle">Melden Sie sich bei der Desktop-Version von VULCAN® E-Klassenbuch an und wählen Sie die Option \"Dostęp mobilny\". Klicken Sie \"Zarejestruj urządzenie mobilne\". Sie können die Daten eingeben oder den QR-Code scannen und nur die PIN eingeben</string>
<string name="login_vulcan_help_title">Hilfe - VULCAN® UONET+</string>
<string name="login_vulcan_help_token">Erhaltene Daten:</string>
<string name="login_vulcan_qr">QR-Code scannen</string>
<string name="login_vulcan_subtitle">Wählen Sie \"Dostęp mobilny\" auf der E-Klassenbuch-Website, registrieren Sie ein neues Gerät und geben Sie die Daten ein. Bei Problemen verwenden Sie die Schaltfläche unter dem Formular.</string>
<string name="login_vulcan_title">Einloggen - Vulkan UONET+</string>
<string name="login_vulcan_title">Einloggen - VULCAN® UONET+</string>
<string name="main_menu_add">Hinzufügen…</string>
<string name="main_menu_agenda_view_type">Ansicht ändern</string>
<string name="main_menu_block_timetable">Generieren Sie einen Blockzeitplan</string>
@ -803,7 +803,7 @@
<string name="notification_updates_summary">Szkolny.eu: Update</string>
<string name="notification_updates_text">Klicken Sie zum Herunterladen der Version %s</string>
<string name="notification_updates_title">Update verfügbar</string>
<string name="notification_user_action_required_captcha_librus">Librus: erfordert eine Lösung für die Captcha-Aufgabe. Klicken Sie hier, um sich weiter im Tagebuch anzumelden.</string>
<string name="notification_user_action_required_captcha_librus">LIBRUS® Rodzina einloggen: erfordert eine Lösung für die Captcha-Aufgabe. Klicken Sie hier, um sich weiter im Tagebuch anzumelden.</string>
<string name="notification_user_action_required_text">Das Problem, das die Synchronisierung verhindert, muss vom Benutzer gelöst werden. Klicken Sie für weitere Informationen</string>
<string name="notification_user_action_required_title">Erforderliche Aktion in der App </string>
<string name="notifications_no_data">Keine Benachrichtigungen</string>
@ -854,7 +854,7 @@
<string name="settings_about_licenses_text">Open-Source-Lizenzen</string>
<string name="settings_about_privacy_policy_text">Datenschutzrichtlinie</string>
<string name="settings_about_register_title_text">E-Klassenbuch</string>
<string name="settings_about_title_subtext">© Kuba Szczodrzyński &amp;amp;&amp;amp; Kacper Ziubryniewicz\nSeptember 2018 - April 2020</string>
<string name="settings_about_title_subtext">© Kuba Szczodrzyński &amp;&amp; Kacper Ziubryniewicz\nSeptember 2018 - August 2020</string>
<string name="settings_about_update_subtext">Klicken Sie hier, um nach Aktualisierungen zu suchen</string>
<string name="settings_about_update_text">Aktualisierung</string>
<string name="settings_about_version_text">Version</string>
@ -1049,8 +1049,8 @@
<string name="sync_error_invalid_school_name">Ungültiger Schulname oder verbotene Zeichen</string>
<string name="sync_error_invalid_server_address">Die Serveradresse ist ungültig. Stellen Sie sicher, dass es korrekt eingegeben wurde und keine Leerzeichen enthält.</string>
<string name="sync_error_invalid_token">Ungültiges Token angegeben.</string>
<string name="sync_error_librus_disconnected">Das LIBRUS-Konto hat die Verbindung zum Synergia-Konto verloren. Melden Sie sich bei portal.librus.pl oder der offiziellen Librus App an und befolgen Sie die Anweisungen zur Reparatur Ihres Kontos.</string>
<string name="sync_error_librus_not_activated">Das LIBRUS-Konto wurde nicht aktiviert. Aktivieren Sie das Konto mit der E-Mail, die Sie erhalten haben.</string>
<string name="sync_error_librus_disconnected">Das LIBRUS® Rodzina-Konto hat die Verbindung zum LIBRUS® Synergia-Konto verloren. Melden Sie sich bei portal.librus.pl oder der offiziellen "LIBRUS®" App an und befolgen Sie die Anweisungen zur Reparatur Ihres Kontos.</string>
<string name="sync_error_librus_not_activated">Das LIBRUS® Rodzina-Konto wurde nicht aktiviert. Aktivieren Sie das Konto mit der E-Mail, die Sie erhalten haben.</string>
<string name="sync_error_login_error">Anmeldefehler</string>
<string name="sync_error_maintenance">Technische Pause\n\nVersuchen Sie es später erneut</string>
<string name="sync_error_no_api_url">API-Adresse nicht gefunden. Versuchen Sie erneut, sich am Gerät anzumelden.</string>
@ -1063,7 +1063,7 @@
<string name="sync_error_register_student_not_associated_format">Student %s ist diesem Konto im Klassenbuch nicht zugeordnet (Login: %s).\n\nVersuchen Sie erneut, sich anzumelden, obwohl dies möglicherweise auf eine technische Unterbrechung im E-Klassenbuch hinweist.</string>
<string name="sync_error_saving_data">Fehler beim Speichern der Daten. Melden Sie den Fehler.</string>
<string name="sync_error_ssl">Fehler beim Herstellen einer sicheren Verbindung.</string>
<string name="sync_error_synergia_not_activated">Das Synergia-Konto wurde nicht von einem Elternteil oder Erziehungsberechtigten aktiviert.\n\nLoggen Sie sich in portal.librus.pl ein und befolgen Sie die Anweisungen, um es zu aktivieren.</string>
<string name="sync_error_synergia_not_activated">Das LIBRUS® Synergia-Konto wurde nicht von einem Elternteil oder Erziehungsberechtigten aktiviert.\n\nLoggen Sie sich in portal.librus.pl ein und befolgen Sie die Anweisungen, um es zu aktivieren.</string>
<string name="sync_error_timeout">Auszeit</string>
<string name="sync_error_unknown">Unbekannter Fehler</string>
<string name="sync_feature_agenda">Stundenplan herunterladen</string>

View File

@ -310,15 +310,15 @@
<string name="edziennik_progress_login_idziennik_api">Logging in to iDziennik…</string>
<string name="edziennik_progress_login_idziennik_web">Logging in to iDziennik…</string>
<string name="edziennik_progress_login_librus_api">Logging in to the API…</string>
<string name="edziennik_progress_login_librus_messages">Logging in to Librus Messages…</string>
<string name="edziennik_progress_login_librus_portal">Logging in to Librus Portal</string>
<string name="edziennik_progress_login_librus_synergia">Logging in to Librus Synergia…</string>
<string name="edziennik_progress_login_librus_messages">Logging in to LIBRUS® messages…</string>
<string name="edziennik_progress_login_librus_portal">Logging in to LIBRUS® Rodzina</string>
<string name="edziennik_progress_login_librus_synergia">Logging in to LIBRUS® Synergia…</string>
<string name="edziennik_progress_login_mobidziennik_api">Logging in to MobiDziennik…</string>
<string name="edziennik_progress_login_mobidziennik_api2">Logging in to MobiDziennik…</string>
<string name="edziennik_progress_login_mobidziennik_web">Logging in to MobiDziennik…</string>
<string name="edziennik_progress_login_template_api">Logging in to Template API…</string>
<string name="edziennik_progress_login_template_web">Logging in to Template WEB…</string>
<string name="edziennik_progress_login_vulcan_api">Logging in to Vulcan</string>
<string name="edziennik_progress_login_vulcan_api">Logging in to VULCAN®</string>
<string name="edziennik_szkolny_api_sync_title">Syncing shared events…</string>
<string name="edziennik_szkolny_creating_notifications">Creating notifications…</string>
<string name="error">Error</string>
@ -572,13 +572,13 @@
<string name="login_iuczniowie_help_title">Help - iDziennik Progman</string>
<string name="login_iuczniowie_subtitle">Use the data which you got from your school. In case of any problems, use the button below the form.</string>
<string name="login_iuczniowie_title">Log in - iDziennik Progman</string>
<string name="login_librus_captcha_title">Librus - login</string>
<string name="login_librus_help_subtitle">In order to use the app you need a Librus account. You can create it on portal.librus.pl. Use the data you normally enter in the fields marked on the image.</string>
<string name="login_librus_help_title">Help - Librus</string>
<string name="login_librus_jst_subtitle">Log in with the token and PIN, which you can get from the "mobile apps" section of Librus Synergia.</string>
<string name="login_librus_jst_title">Log in - Librus JST</string>
<string name="login_librus_subtitle">Log in using your Librus account data (created before on your e-mail address). You can\'t login using the data provided by your school. In case of any problems, use the button below the form.</string>
<string name="login_librus_title">Log in - Librus</string>
<string name="login_librus_captcha_title">LIBRUS® - login</string>
<string name="login_librus_help_subtitle">In order to use the app you need a LIBRUS® Rodzina account. You can create it on portal.librus.pl. Use the data you normally enter in the fields marked on the image.</string>
<string name="login_librus_help_title">Help for LIBRUS® login</string>
<string name="login_librus_jst_subtitle">Log in with the token and PIN, which you can get from the "mobile apps" section of LIBRUS® Synergia.</string>
<string name="login_librus_jst_title">Log in to LIBRUS® JST</string>
<string name="login_librus_subtitle">Log in using your LIBRUS® Rodzina account data (created before on your e-mail address). You can\'t login using the data provided by your school. In case of any problems, use the button below the form.</string>
<string name="login_librus_title">Log in to LIBRUS® Synergia</string>
<string name="login_migration_error_format">A migration error has occurred. It\'s already reported, which means I\'ll try to fix it.\n\nYou can continue using the app. In case of any problems try to remove the profile and create it again.</string>
<string name="login_migration_subtitle">The app got a huge update. If you encounter any problems, feel free to contact me using the Feedback option in the menu.</string>
<string name="login_migration_title">Szkolny.eu has been updated</string>
@ -606,12 +606,12 @@
<string name="login_sync_subtitle_1_format">Syncing profile</string>
<string name="login_sync_title">Syncing…</string>
<string name="login_vulcan_help_register">Registering the device:</string>
<string name="login_vulcan_help_subtitle">Login into desktop version of Vulcan e-register and select \"Dostęp mobilny\" option. Click \"Zarejestruj urządzenie mobilne\". You can type in the data or scan the QR code and type only the PIN.</string>
<string name="login_vulcan_help_title">Help - Vulcan UONET+</string>
<string name="login_vulcan_help_subtitle">Login into desktop version of VULCAN® e-register and select \"Dostęp mobilny\" option. Click \"Zarejestruj urządzenie mobilne\". You can type in the data or scan the QR code and type only the PIN.</string>
<string name="login_vulcan_help_title">Help - VULCAN® UONET+</string>
<string name="login_vulcan_help_token">Obtained data:</string>
<string name="login_vulcan_qr">Scan QR code</string>
<string name="login_vulcan_subtitle">Choose \"Dostęp mobilny\" on e-register website, register a new device and enter the data. In case of any problems, use the button below the form.</string>
<string name="login_vulcan_title">Log in - Vulcan UONET+</string>
<string name="login_vulcan_title">Log in - VULCAN® UONET+</string>
<string name="main_menu_add">Add…</string>
<string name="main_menu_agenda_view_type">Change view</string>
<string name="main_menu_block_timetable">Generate a block timetable</string>
@ -805,7 +805,7 @@
<string name="notification_updates_summary">Szkolny.eu: update</string>
<string name="notification_updates_text">Click to download version %s</string>
<string name="notification_updates_title">Update available</string>
<string name="notification_user_action_required_captcha_librus">Librus: Captcha verification required. Click to continue logging into the e-journal.</string>
<string name="notification_user_action_required_captcha_librus">LIBRUS® Rodzina login: Captcha verification required. Click to continue logging into the e-journal.</string>
<string name="notification_user_action_required_text">The problem that prevents synchronization must be solved by the user. Click for more information.</string>
<string name="notification_user_action_required_title">Action required in the application</string>
<string name="notifications_no_data">No notifications.</string>
@ -856,7 +856,7 @@
<string name="settings_about_licenses_text">Open-source licenses</string>
<string name="settings_about_privacy_policy_text">Privacy policy</string>
<string name="settings_about_register_title_text">E-register</string>
<string name="settings_about_title_subtext">© Kuba Szczodrzyński &amp;&amp; Kacper Ziubryniewicz\nSeptember 2018 - April 2020</string>
<string name="settings_about_title_subtext">© Kuba Szczodrzyński &amp;&amp; Kacper Ziubryniewicz\nSeptember 2018 - August 2020</string>
<string name="settings_about_update_subtext">Click to check for updates</string>
<string name="settings_about_update_text">Update</string>
<string name="settings_about_version_text">Version</string>
@ -1051,8 +1051,8 @@
<string name="sync_error_invalid_school_name">Invalid school name or forbidden characters</string>
<string name="sync_error_invalid_server_address">Server address is invalid. Make sure it\'s entered correctly and doesn\'t contain whitespaces.</string>
<string name="sync_error_invalid_token">Invalid token specified.</string>
<string name="sync_error_librus_disconnected">LIBRUS account has lost connection with the Synergia account. Login on portal.librus.pl or in the Librus mobile app and follow the instructions to fix the problem.</string>
<string name="sync_error_librus_not_activated">LIBRUS account is not activated. Activate it using a link in the received e-mail.</string>
<string name="sync_error_librus_disconnected">LIBRUS® Rodzina account has lost connection with the LIBRUS® Synergia account. Login on portal.librus.pl or in the "LIBRUS®" mobile app and follow the instructions to fix the problem.</string>
<string name="sync_error_librus_not_activated">LIBRUS® account is not activated. Activate it using a link in the received e-mail.</string>
<string name="sync_error_login_error">Login error</string>
<string name="sync_error_maintenance">Maintenance</string>
<string name="sync_error_no_api_url">API address not found. Try to login again.</string>
@ -1065,7 +1065,7 @@
<string name="sync_error_register_student_not_associated_format">Student %s is not assigned to this register (login: %s).\n\nTry to log in again although this may also indicate a maintenance time.</string>
<string name="sync_error_saving_data">Error while saving data. Report the error.</string>
<string name="sync_error_ssl">Failed to establish a secure connection.</string>
<string name="sync_error_synergia_not_activated">The Synergia account hasn\'t been activated by a parent or legal guardian.\n\nLog into portal.librus.pl and follow the instructions in order to activate it.</string>
<string name="sync_error_synergia_not_activated">The LIBRUS® Synergia account hasn\'t been activated by a parent or legal guardian.\n\nLog into portal.librus.pl and follow the instructions in order to activate it.</string>
<string name="sync_error_timeout">Timeout</string>
<string name="sync_error_unknown">Unknown error</string>
<string name="sync_feature_agenda">Syncing agenda…</string>

View File

@ -222,7 +222,7 @@
<string name="error_115_reason">Brak uczniów przypisanych do konta</string>
<string name="error_3000_reason">Wymagane rozwiązanie zadania Captcha</string>
<string name="error_3001_reason">Librus: wymagane rozwiązanie zadania Captcha</string>
<string name="error_3001_reason">LIBRUS®: wymagane rozwiązanie zadania Captcha</string>
<string name="error_120_reason">CODE_INTERNAL_LIBRUS_ACCOUNT_410</string>
<string name="error_121_reason">CODE_INTERNAL_LIBRUS_SYNERGIA_EXPIRED</string>
@ -232,7 +232,7 @@
<string name="error_127_reason">Wymagana akceptacja regulaminu</string>
<string name="error_128_reason">Błąd zmiany hasła</string>
<string name="error_129_reason">Wymagana zmiana hasła</string>
<string name="error_130_reason">Librus API: nieprawidłowe dane logowania</string>
<string name="error_130_reason">LIBRUS® API: nieprawidłowe dane logowania</string>
<string name="error_131_reason">Inny błąd logowania do API</string>
<string name="error_132_reason">Brak tokenu CSRF</string>
<string name="error_133_reason">Konto LIBRUS nie zostało aktywowane</string>
@ -256,12 +256,12 @@
<string name="error_155_reason">Brak dostępu do Wiadomości</string>
<string name="error_156_reason">Brak dostępu do Synergii</string>
<string name="error_157_reason">Brak ID sesji Wiadomości</string>
<string name="error_158_reason">Odmowa dostępu do Portalu Librus</string>
<string name="error_159_reason">API Portalu Librus wyłączone</string>
<string name="error_160_reason">Konto LIBRUS utraciło połączenie z kontem Synergia. Zaloguj się na stronie portal.librus.pl lub w oficjalnej aplikacji Librus i postępuj zgodnie z instrukcją, aby naprawić konto.</string>
<string name="error_161_reason">Inny błąd Portalu Librus</string>
<string name="error_162_reason">Nie znaleziono konta Synergia. Zaloguj się na stronie portal.librus.pl, a następnie powiąż swoje konto Synergia do konta Librus Portal.</string>
<string name="error_163_reason">Inny błąd logowania do Portalu Librus</string>
<string name="error_158_reason">Odmowa dostępu do Portalu LIBRUS®</string>
<string name="error_159_reason">API Portalu LIBRUS® wyłączone</string>
<string name="error_160_reason">Konto LIBRUS® utraciło połączenie z kontem Synergia. Zaloguj się na stronie portal.librus.pl lub w oficjalnej aplikacji LIBRUS® i postępuj zgodnie z instrukcją, aby naprawić konto.</string>
<string name="error_161_reason">Inny błąd Portalu LIBRUS®</string>
<string name="error_162_reason">Nie znaleziono konta Synergia. Zaloguj się na stronie portal.librus.pl, a następnie powiąż swoje konto Synergia do konta LIBRUS® Portal.</string>
<string name="error_163_reason">Inny błąd logowania do Portalu LIBRUS®</string>
<string name="error_164_reason">ERROR_LOGIN_LIBRUS_PORTAL_CODE_EXPIRED</string>
<string name="error_165_reason">ERROR_LOGIN_LIBRUS_PORTAL_CODE_REVOKED</string>
<string name="error_166_reason">ERROR_LOGIN_LIBRUS_PORTAL_NO_CLIENT_ID</string>
@ -273,21 +273,21 @@
<string name="error_172_reason">ERROR_LOGIN_LIBRUS_PORTAL_REFRESH_INVALID</string>
<string name="error_173_reason">ERROR_LOGIN_LIBRUS_PORTAL_REFRESH_REVOKED</string>
<string name="error_174_reason">ERROR_LIBRUS_SYNERGIA_OTHER</string>
<string name="error_175_reason">Librus Synergia: przerwa techniczna</string>
<string name="error_176_reason">Librus Wiadomości: przerwa techniczna</string>
<string name="error_177_reason">Librus Wiadomości: serwer zwrócił błąd. Prześlij zgłoszenie błędu.</string>
<string name="error_178_reason">Librus Wiadomości: serwer zwrócił nieznany błąd. Prześlij zgłoszenie błędu.</string>
<string name="error_179_reason">Librus Wiadomości: nieprawidłowe dane logowania</string>
<string name="error_180_reason">Librus Portal: nieprawidłowe dane logowania</string>
<string name="error_181_reason">Librus API: przerwa techniczna</string>
<string name="error_182_reason">Librus Portal: przerwa techniczna</string>
<string name="error_175_reason">LIBRUS® Synergia: przerwa techniczna</string>
<string name="error_176_reason">LIBRUS® Wiadomości: przerwa techniczna</string>
<string name="error_177_reason">LIBRUS® Wiadomości: serwer zwrócił błąd. Prześlij zgłoszenie błędu.</string>
<string name="error_178_reason">LIBRUS® Wiadomości: serwer zwrócił nieznany błąd. Prześlij zgłoszenie błędu.</string>
<string name="error_179_reason">LIBRUS® Wiadomości: nieprawidłowe dane logowania</string>
<string name="error_180_reason">LIBRUS® Portal: nieprawidłowe dane logowania</string>
<string name="error_181_reason">LIBRUS® API: przerwa techniczna</string>
<string name="error_182_reason">LIBRUS® Portal: przerwa techniczna</string>
<string name="error_183_reason">Wystąpił problem z tablicą ogłoszeń</string>
<string name="error_184_reason">Librus: Sesja logowania wygasła. Zaloguj się ponownie.</string>
<string name="error_184_reason">LIBRUS®: Sesja logowania wygasła. Zaloguj się ponownie.</string>
<string name="error_185_reason">Urządzenie jest już zarejestrowane</string>
<string name="error_186_reason">Nie znaleziono wiadomości. Mogła zostać usunięta.</string>
<string name="error_187_reason">Nieprawidłowe dane dostępu. Sprawdź poprawność wprowadzonych danych.</string>
<string name="error_188_reason">Nie znaleziono załącznika. Mógł zostać usunięty.</string>
<string name="error_189_reason">Logowanie Librus Wiadomości: ReCaptcha przekroczono czas oczekiwania.</string>
<string name="error_189_reason">Logowanie LIBRUS® Wiadomości: ReCaptcha przekroczono czas oczekiwania.</string>
<string name="error_201_reason">Nieprawidłowy login lub hasło</string>
<string name="error_202_reason">Podano stare hasło</string>
@ -311,13 +311,13 @@
<string name="error_311_reason">Nieprawidłowy PIN: pozostała 1 próba</string>
<string name="error_312_reason">Nieprawidłowy PIN: pozostały 2 próby</string>
<string name="error_321_reason">Token wygasły, wygeneruj ponownie</string>
<string name="error_322_reason">Inny błąd logowania do Vulcana</string>
<string name="error_322_reason">Inny błąd logowania do dziennika VULCAN®</string>
<string name="error_330_reason">Dziennik przedszkolny - logowanie niemożliwe</string>
<string name="error_331_reason">Brak uczniów przypisanych do konta, bądź ukończyli oni już szkołę</string>
<string name="error_340_reason">Vulcan: przerwa techniczna</string>
<string name="error_341_reason">Vulcan: błąd żądania, zgłoś błąd</string>
<string name="error_342_reason">Vulcan: inny błąd, wyślij zgłoszenie</string>
<string name="error_343_reason">Vulcan: nie znaleziono adresu załącznika</string>
<string name="error_340_reason">VULCAN®: przerwa techniczna</string>
<string name="error_341_reason">VULCAN®: błąd żądania, zgłoś błąd</string>
<string name="error_342_reason">VULCAN®: inny błąd, wyślij zgłoszenie</string>
<string name="error_343_reason">VULCAN®: nie znaleziono adresu załącznika</string>
<string name="error_401_reason">Nieprawidłowe dane logowania</string>
<string name="error_402_reason">Nieprawidłowa nazwa szkoły</string>
@ -360,14 +360,14 @@
<string name="error_901_reason">EXCEPTION_LOGIN_LIBRUS_API_TOKEN</string>
<string name="error_902_reason">EXCEPTION_LOGIN_LIBRUS_PORTAL_TOKEN</string>
<string name="error_903_reason">EXCEPTION_LIBRUS_PORTAL_SYNERGIA_TOKEN</string>
<string name="error_904_reason">Zgłoś błąd: wyjątek w API Librus</string>
<string name="error_904_reason">Zgłoś błąd: wyjątek w API LIBRUS®</string>
<string name="error_905_reason">EXCEPTION_LIBRUS_SYNERGIA_REQUEST</string>
<string name="error_906_reason">EXCEPTION_MOBIDZIENNIK_WEB_REQUEST</string>
<string name="error_907_reason">EXCEPTION_VULCAN_API_REQUEST</string>
<string name="error_908_reason">EXCEPTION_MOBIDZIENNIK_WEB_FILE_REQUEST</string>
<string name="error_909_reason">EXCEPTION_LIBRUS_MESSAGES_FILE_REQUEST</string>
<string name="error_910_reason">EXCEPTION_NOTIFY</string>
<string name="error_911_reason">Zgłoś błąd: pobieranie wiadomości Librus</string>
<string name="error_911_reason">Zgłoś błąd: pobieranie wiadomości LIBRUS®</string>
<string name="error_912_reason">EXCEPTION_IDZIENNIK_WEB_REQUEST</string>
<string name="error_913_reason">EXCEPTION_IDZIENNIK_WEB_API_REQUEST</string>
<string name="error_914_reason">EXCEPTION_IDZIENNIK_API_REQUEST</string>

View File

@ -343,15 +343,15 @@
<string name="edziennik_progress_login_idziennik_api">Logowanie do iDziennika…</string>
<string name="edziennik_progress_login_idziennik_web">Logowanie do iDziennika…</string>
<string name="edziennik_progress_login_librus_api">Logowanie do API</string>
<string name="edziennik_progress_login_librus_messages">Logowanie do wiadomości Librus</string>
<string name="edziennik_progress_login_librus_portal">Logowanie do Portalu Librus</string>
<string name="edziennik_progress_login_librus_synergia">Logowanie do Librus Synergia</string>
<string name="edziennik_progress_login_librus_messages">Logowanie do wiadomości LIBRUS®</string>
<string name="edziennik_progress_login_librus_portal">Logowanie do Portalu LIBRUS® Rodzina</string>
<string name="edziennik_progress_login_librus_synergia">Logowanie do LIBRUS® Synergia</string>
<string name="edziennik_progress_login_mobidziennik_api">Logowanie do API MobiDziennika…</string>
<string name="edziennik_progress_login_mobidziennik_api2">Logowanie do API MobiDziennika…</string>
<string name="edziennik_progress_login_mobidziennik_web">Logowanie do MobiDziennika…</string>
<string name="edziennik_progress_login_template_api">Logowanie do Template API…</string>
<string name="edziennik_progress_login_template_web">Logowanie do Template WEB…</string>
<string name="edziennik_progress_login_vulcan_api">Logowanie do Vulcan API…</string>
<string name="edziennik_progress_login_vulcan_api">Logowanie do VULCAN® API…</string>
<string name="edziennik_szkolny_api_sync_title">Synchronizowanie udostępnionych wydarzeń…</string>
<string name="edziennik_szkolny_creating_notifications">Tworzenie powiadomień…</string>
<string name="ellipsis" translatable="false"></string>
@ -621,13 +621,13 @@
<string name="login_iuczniowie_help_title">Pomoc - iDziennik Progman</string>
<string name="login_iuczniowie_subtitle">Zaloguj się danymi, które otrzymałeś od swojej szkoły. W razie problemów skorzystaj z przycisku pod formularzem.</string>
<string name="login_iuczniowie_title">Zaloguj się - iDziennik Progman</string>
<string name="login_librus_captcha_title">Librus - logowanie</string>
<string name="login_librus_help_subtitle">Aby korzystać z aplikacji musisz posiadać konto Librus. Możesz je założyć na stronie portal.librus.pl. Użyj danych, które wpisujesz w miejsca zaznaczone na obrazku.</string>
<string name="login_librus_help_title">Pomoc - Librus</string>
<string name="login_librus_jst_subtitle">Zaloguj się tokenem i kodem PIN, który można wygenerować po zalogowanu się do Synergii w zakładce Aplikacje mobilne.</string>
<string name="login_librus_jst_title">Zaloguj się - Librus JST</string>
<string name="login_librus_subtitle">Zaloguj się danymi swojego konta Librus (założonego wcześniej na swój adres e-mail). Nie należy logować się danymi otrzymanymi ze swojej szkoły. W razie problemów skorzystaj z przycisku pod formularzem.</string>
<string name="login_librus_title">Zaloguj się - Librus</string>
<string name="login_librus_captcha_title">LIBRUS® - logowanie</string>
<string name="login_librus_help_subtitle">Aby korzystać z aplikacji musisz posiadać konto LIBRUS® Rodzina. Możesz je założyć na stronie portal.librus.pl. Użyj danych, które wpisujesz w miejsca zaznaczone na obrazku.</string>
<string name="login_librus_help_title">Pomoc do logowania LIBRUS®</string>
<string name="login_librus_jst_subtitle">Zaloguj się tokenem i kodem PIN, który można wygenerować po zalogowanu się do LIBRUS® Synergia w zakładce Aplikacje mobilne.</string>
<string name="login_librus_jst_title">Zaloguj się do LIBRUS® JST</string>
<string name="login_librus_subtitle">Zaloguj się danymi swojego konta LIBRUS® Rodzina (założonego wcześniej na swój adres e-mail). Nie należy logować się danymi otrzymanymi ze swojej szkoły. W razie problemów skorzystaj z przycisku pod formularzem.</string>
<string name="login_librus_title">Zaloguj się do LIBRUS® Synergia</string>
<string name="login_migration_error_format">Wystąpił błąd w migracji danych. Został on już zgłoszony, co oznacza, że postaram się go naprawić.\n\nMożesz zacząć korzystać z aplikacji, jednak w przypadku jakichś błędów spróbuj usunąć profil i zalogować się ponownie.</string>
<string name="login_migration_subtitle">Aplikacja otrzymała dużą aktualizację. Jeżeli będą występować jakieś problemy w działaniu, możesz się ze mną skontaktować używając pozycji Pomoc i opinie w menu.</string>
<string name="login_migration_title">Szkolny.eu został zaktualizowany</string>
@ -655,12 +655,12 @@
<string name="login_sync_subtitle_1_format">Synchronizuję profil</string>
<string name="login_sync_title">Synchronizacja…</string>
<string name="login_vulcan_help_register">Rejestracja urządzenia:</string>
<string name="login_vulcan_help_subtitle">Zaloguj się w wersji komputerowej dziennika Vulcan, a następnie wybierz opcję Dostęp mobilny. Kliknij Zarejestruj urządzenie mobilne. Możesz wpisać otrzymane dane lub zeskanować kod QR i wpisać sam kod PIN.</string>
<string name="login_vulcan_help_title">Pomoc - Vulcan UONET+</string>
<string name="login_vulcan_help_subtitle">Zaloguj się w wersji komputerowej dziennika VULCAN®, a następnie wybierz opcję Dostęp mobilny. Kliknij Zarejestruj urządzenie mobilne. Możesz wpisać otrzymane dane lub zeskanować kod QR i wpisać sam kod PIN.</string>
<string name="login_vulcan_help_title">Pomoc - VULCAN® UONET+</string>
<string name="login_vulcan_help_token">Otrzymane dane:</string>
<string name="login_vulcan_qr">Skanuj kod QR</string>
<string name="login_vulcan_subtitle">Wybierz opcję Dostęp mobilny na stronie e-dziennika, zarejestruj nowe urządzenie i wpisz otrzymane dane. W razie problemów skorzystaj z przycisku pod formularzem.</string>
<string name="login_vulcan_title">Zaloguj się - Vulcan UONET+</string>
<string name="login_vulcan_title">Zaloguj się - VULCAN® UONET+</string>
<string name="main_menu_add">Dodaj…</string>
<string name="main_menu_agenda_view_type">Zmień widok</string>
<string name="main_menu_block_timetable">Generuj blokowy plan lekcji</string>
@ -861,7 +861,7 @@
<string name="notification_updates_summary">Szkolny.eu: aktualizacja</string>
<string name="notification_updates_text">Kliknij, aby pobrać wersję %s</string>
<string name="notification_updates_title">Dostępna aktualizacja</string>
<string name="notification_user_action_required_captcha_librus">Librus: wymagane rozwiązanie zadania Captcha. Kliknij, aby kontynuować logowanie do dziennika.</string>
<string name="notification_user_action_required_captcha_librus">Logowanie do LIBRUS® Rodzina: wymagane rozwiązanie zadania Captcha. Kliknij, aby kontynuować logowanie do dziennika.</string>
<string name="notification_user_action_required_text">Problem, który uniemożliwia synchronizację musi być rozwiązany przez użytkownika. Kliknij, aby uzyskać więcej informacji.</string>
<string name="notification_user_action_required_title">Wymagane działanie w aplikacji</string>
<string name="notifications_no_data">Brak powiadomień.</string>
@ -919,7 +919,7 @@
<string name="settings_about_licenses_text">Licencje open-source</string>
<string name="settings_about_privacy_policy_text">Polityka prywatności</string>
<string name="settings_about_register_title_text">E-dziennik</string>
<string name="settings_about_title_subtext">© Kuba Szczodrzyński &amp;&amp; Kacper Ziubryniewicz\nwrzesień 2018 - kwiecień 2020</string>
<string name="settings_about_title_subtext">© Kuba Szczodrzyński &amp;&amp; Kacper Ziubryniewicz\nwrzesień 2018 - sierpień 2020</string>
<string name="settings_about_update_subtext">Kliknij, aby sprawdzić aktualizacje</string>
<string name="settings_about_update_text">Aktualizacja</string>
<string name="settings_about_version_text">Wersja</string>
@ -1118,8 +1118,8 @@
<string name="sync_error_invalid_school_name">Podano nieprawidłową nazwę szkoły lub zawiera niedozwolone znaki.</string>
<string name="sync_error_invalid_server_address">Podany adres serwera jest nieprawidłowy. Upewnij się, że jest wpisany poprawnie oraz nie zawiera żadnych spacji.\n\nWpisywany adres nie powinien zawierać części http://…mobidziennik.pl.</string>
<string name="sync_error_invalid_token">Podano nieprawidłowy token.</string>
<string name="sync_error_librus_disconnected">Konto LIBRUS utraciło połączenie z kontem Synergia. Zaloguj się na stronie portal.librus.pl lub w oficjalnej aplikacji Librus i postępuj zgodnie z instrukcją, aby naprawić konto.</string>
<string name="sync_error_librus_not_activated">Konto LIBRUS nie zostało aktywowane. Aktywuj konto korzystając z otrzymanego e-maila.</string>
<string name="sync_error_librus_disconnected">Konto LIBRUS® Rodzina utraciło połączenie z kontem LIBRUS® Synergia. Zaloguj się na stronie portal.librus.pl lub w oficjalnej aplikacji "LIBRUS®" i postępuj zgodnie z instrukcją, aby naprawić konto.</string>
<string name="sync_error_librus_not_activated">Konto LIBRUS® Rodzina nie zostało aktywowane. Aktywuj konto korzystając z otrzymanego e-maila.</string>
<string name="sync_error_login_error">Bład logowania</string>
<string name="sync_error_maintenance">Chwilowa przerwa techniczna\n\nSpróbuj ponownie później</string>
<string name="sync_error_no_api_url">Nie znaleziono adresu API. Spróbuj zalogować urządzenie ponownie.</string>
@ -1132,7 +1132,7 @@
<string name="sync_error_register_student_not_associated_format">Uczeń %s nie jest przypisany do tego konta w dzienniku (login: %s).\n\nSpróbuj zalogować się ponownie, aczkolwiek może to oznaczać przerwę techniczną e-dziennika.</string>
<string name="sync_error_saving_data">Błąd podczas zapisywania danych. Zgłoś błąd deweloperowi.</string>
<string name="sync_error_ssl">Nie można nawiązać bezpiecznego połączenia.</string>
<string name="sync_error_synergia_not_activated">Konto Synergia nie zostało potwierdzone przez rodzica/opiekuna prawnego.\n\nZaloguj się na stronie portal.librus.pl i postępuj zgodnie z instrukcjami.</string>
<string name="sync_error_synergia_not_activated">Konto LIBRUS® Synergia nie zostało potwierdzone przez rodzica/opiekuna prawnego.\n\nZaloguj się na stronie portal.librus.pl i postępuj zgodnie z instrukcjami.</string>
<string name="sync_error_timeout">Przekroczono czas oczekiwania.\n\nNiewystarczająca jakość połączenia internetowego lub przerwa techniczna e-dziennika</string>
<string name="sync_error_unknown">Nieznany błąd</string>
<string name="sync_feature_agenda">Pobieram terminarz…</string>
@ -1317,18 +1317,18 @@
<string name="attendance_details_type_id">ID rodzaju podstawowego</string>
<string name="login_chooser_title">Jaki masz e-dziennik w szkole?</string>
<string name="login_chooser_subtitle">Wybierz z jakiego e-dziennika korzysta Twoja szkoła. Jeśli masz kilka kont w różnych dziennikach, będziesz mógł je dodać później.</string>
<string name="login_register_librus" translatable="false">Librus/Synergia</string>
<string name="login_register_librus" translatable="false">LIBRUS® Rodzina / Synergia</string>
<string name="login_mode_librus_email">Zaloguj używając e-maila</string>
<string name="login_mode_librus_email_hint">Musisz posiadać konto Librus Rodzina</string>
<string name="login_mode_librus_email_hint">Musisz posiadać konto LIBRUS® Rodzina</string>
<string name="login_mode_librus_synergia">Zaloguj używając loginu i hasła</string>
<string name="login_mode_librus_synergia_hint">Użyj loginu w postaci \"9874123u\"</string>
<string name="login_mode_librus_jst">Logowanie przez platformę VULCAN</string>
<string name="login_mode_librus_jst">Logowanie przez platformę VULCAN®</string>
<string name="login_mode_librus_jst_hint">Tylko Oświata w Radomiu oraz Innowacyjny Tarnobrzeg</string>
<string name="login_type_vulcan" translatable="false">Vulcan UONET+</string>
<string name="login_type_vulcan" translatable="false">VULCAN® UONET+</string>
<string name="login_mode_vulcan_api">Użyj tokenu, symbolu i kodu PIN</string>
<string name="login_mode_vulcan_api_hint">Zarejestruj urządzenie na stronie dziennika Vulcan</string>
<string name="login_mode_vulcan_api_hint">Zarejestruj urządzenie na stronie dziennika VULCAN®</string>
<string name="login_mode_vulcan_web">Użyj e-maila/nazwy użytkownika i hasła</string>
<string name="login_mode_vulcan_web_hint">Zaloguj danymi, które podajesz na stronie e-dziennika VULCAN</string>
<string name="login_mode_vulcan_web_hint">Zaloguj danymi, które podajesz na stronie e-dziennika VULCAN®</string>
<string name="login_type_mobidziennik" translatable="false">MobiDziennik</string>
<string name="login_mode_mobidziennik_web">Zaloguj nazwą serwera, loginem i hasłem</string>
<string name="login_mode_mobidziennik_web_hint">Podaj dane, których używasz na stronie e-dziennika</string>
@ -1337,13 +1337,13 @@
<string name="login_platform_list_loading">Ładowanie listy e-dzienników…</string>
<string name="login_platform_list_loading_timeout">Jeśli trwa to za długo, sprawdź swoje połączenie internetowe i zrestartuj aplikację.</string>
<string name="login_form_title_format">Zaloguj się - %s</string>
<string name="login_mode_librus_email_guide">Zaloguj się swoim kontem Librus, które działa w oficjalnej aplikacji Librus oraz na stronie portal.librus.pl, w niebieskim formularzu.\n\nJeśli nie masz konta Librus, możesz je założyć na stronie https://portal.librus.pl/rodzina/register.</string>
<string name="login_mode_librus_synergia_guide">Podaj login otrzymany od szkoły, którym logujesz się do Synergii (fioletowy formularz).\n\nZalecane jest logowanie kontem Portal Librus (używając e-maila) w poprzednim kroku.</string>
<string name="login_mode_librus_jst_guide">Zaloguj się do Librusa na komputerze, wybierz zakładkę Aplikacje Mobilne, następnie wpisz otrzymany Token i PIN poniżej.</string>
<string name="login_mode_vulcan_api_guide">Zaloguj się do dziennika Vulcan na komputerze, wybierz zakładkę Dostęp Mobilny, kliknij przycisk Zarejestruj urządzenie mobilne. Podaj otrzymany Token, Symbol i PIN w polach poniżej.</string>
<string name="login_mode_vulcan_web_guide">Podaj dane, którymi logujesz się na stronie internetowej dziennika VULCAN lub na miejskiej platformie.</string>
<string name="login_mode_librus_email_guide">Zaloguj się swoim kontem LIBRUS® Rodzina, które działa w oficjalnej aplikacji "LIBRUS®" oraz na stronie portal.librus.pl, w niebieskim formularzu.\n\nJeśli nie masz konta LIBRUS® Rodzina, możesz je założyć na stronie https://portal.librus.pl/rodzina/register.</string>
<string name="login_mode_librus_synergia_guide">Podaj login otrzymany od szkoły, którym logujesz się do LIBRUS® Synergia (fioletowy formularz).\n\nZalecane jest logowanie kontem LIBRUS® Rodzina (używając e-maila) w poprzednim kroku.</string>
<string name="login_mode_librus_jst_guide">Zaloguj się do LIBRUS® Synergia na komputerze, wybierz zakładkę Aplikacje Mobilne, następnie wpisz otrzymany Token i PIN poniżej.</string>
<string name="login_mode_vulcan_api_guide">Zaloguj się do dziennika VULCAN® na komputerze, wybierz zakładkę Dostęp Mobilny, kliknij przycisk Zarejestruj urządzenie mobilne. Podaj otrzymany Token, Symbol i PIN w polach poniżej.</string>
<string name="login_mode_vulcan_web_guide">Podaj dane, którymi logujesz się na stronie internetowej dziennika VULCAN® lub na miejskiej platformie.</string>
<string name="login_mode_mobidziennik_web_guide">Podaj dane, których używasz do logowania na stronie MobiDziennika. Jako adres serwera możesz wpisać adres strony internetowej, na której masz MobiDziennik.</string>
<string name="edziennik_progress_login_vulcan_web_main">Logowanie do dziennika Vulcan...</string>
<string name="edziennik_progress_login_vulcan_web_main">Logowanie do dziennika VULCAN®...</string>
<string name="login_type_idziennik">iDziennik Progman / iUczniowie</string>
<string name="login_mode_idziennik_web">Zaloguj używając nazwy użytkownika i hasła</string>
<string name="login_mode_idziennik_web_hint">Podaj dane, których używasz na stronie internetowej e-dziennika</string>
@ -1356,4 +1356,16 @@
<string name="login_mode_podlasie_api">Zaloguj używając tokenu</string>
<string name="login_mode_podlasie_api_guide">Podaj token aplikacji mobilnej.</string>
<string name="edziennik_progress_login_podlasie_api">Logowanie do PPE…</string>
<string name="profile_archived_title">Profil jest archiwalny</string>
<string name="profile_archived_text">Przeglądasz dane ucznia z poprzedniego roku szkolnego (%d/%d). Synchronizacja oraz pobieranie wiadomości i niektórych zadań domowych zostały wyłączone.\n\nAby otworzyć profil ucznia z aktualnego roku, wybierz "Zamknij archiwum" na stronie głównej.</string>
<string name="profile_year_not_started_title">Wakacje ;)</string>
<string name="profile_year_not_started_format">Prawdopodobnie rok szkolny dla tego ucznia jeszcze się nie zaczął (zacznie się %s). Spróbuj wykonać synchronizację później.</string>
<string name="profile_archiving_title">Koniec roku szkolnego</string>
<string name="profile_archiving_format">Rok szkolny zakończył się %s. Dane ucznia z poprzedniego roku zostaną przeniesione do archiwum, aby można było je później przeglądać.</string>
<string name="home_archive_title">Profil archiwalny</string>
<string name="home_archive_text">Przeglądasz dane ucznia z roku szkolnego %d/%d.</string>
<string name="home_archive_close">Zamknij archiwum</string>
<string name="home_archive_close_no_target_title">Brak aktualnego profilu</string>
<string name="home_archive_close_no_target_text">Uczeń %s nie posiada profilu na tym koncie w aktualnym roku szkolnym. Prawdopodobnie ten profil został usunięty lub uczeń nie uczęszcza już do tej klasy.\n\nAby przejść do aktualnego profilu, wybierz ucznia z listy lub zaloguj się na jego konto przyciskiem Dodaj ucznia.</string>
<string name="login_copyright_notice">Znaki towarowe zamieszczone w tej aplikacji należą do ich prawowitych właścicieli i są używane wyłącznie w celach informacyjnych.</string>
</resources>

View File

@ -5,8 +5,8 @@ buildscript {
kotlin_version = '1.3.61'
release = [
versionName: "4.2.1",
versionCode: 4020199
versionName: "4.3",
versionCode: 4030099
]
setup = [
@ -17,7 +17,7 @@ buildscript {
]
versions = [
gradleAndroid : '4.0.0-beta05',
gradleAndroid : '4.1.0-rc01',
kotlin : ext.kotlin_version,
ktx : "1.2.0",

View File

@ -1,6 +1,6 @@
#Fri Dec 06 18:23:03 CET 2019
#Mon Aug 24 17:15:24 CEST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.2.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip

0
gradlew vendored Normal file → Executable file
View File

View File

@ -1,7 +1,5 @@
package im.wangchao.mhttp.internal;
import im.wangchao.mhttp.BuildConfig;
/**
* <p>Description : Version.</p>
* <p>Author : wangchao.</p>
@ -14,7 +12,7 @@ public class Version {
}
public static String userAgent() {
return moduleName().concat(BuildConfig.VERSION_NAME);
return moduleName().concat("1.10.1");
}
public static String moduleName() {