Compare commits

...

44 Commits
1.6.0 ... 1.6.4

Author SHA1 Message Date
dc74d2877b Merge branch 'release/1.6.4' 2022-05-16 23:42:46 +02:00
6534176685 Version 1.6.4 2022-05-16 23:42:40 +02:00
9542b9f231 Set "no data" string if attendance subject is blank (#1864) 2022-05-16 23:23:49 +02:00
dbba61a99f Bump coil from 1.4.0 to 2.0.0 (#1855) 2022-05-14 14:48:58 +00:00
c2496a15b8 Bump flow-preferences from 1.6.0 to 1.7.0 (#1859) 2022-05-14 14:36:09 +00:00
facf84d9a8 Bump about_libraries from 8.9.4 to 10.2.0 (#1858) 2022-05-14 14:35:58 +00:00
459c8330f9 Bump hianalytics from 6.4.1.302 to 6.5.0.300 (#1852) 2022-05-14 13:53:13 +00:00
0c8e2632a2 Bump firebase-bom from 30.0.0 to 30.0.1 (#1851) 2022-05-14 13:52:58 +00:00
b17e9deca0 Bump kotlinx-serialization-json from 1.3.2 to 1.3.3 (#1853) 2022-05-14 13:52:41 +00:00
c296e72c30 Bump mockk from 1.12.2 to 1.12.4 (#1854) 2022-05-14 13:52:16 +00:00
637125e1fc Bump hilt_version from 2.41 to 2.42 (#1856) 2022-05-14 13:51:39 +00:00
445bfda801 New Crowdin updates (#1840) 2022-05-12 21:07:14 +02:00
ebde42328a Bump agcp from 1.6.5.300 to 1.6.6.200 (#1845) 2022-05-12 19:06:15 +00:00
a0bf14b576 Bump agconnect-crash from 1.6.5.300 to 1.6.6.200 (#1843) 2022-05-12 19:05:59 +00:00
2e7caabde3 Bump firebase-bom from 29.3.1 to 30.0.0 (#1844) 2022-05-12 19:05:40 +00:00
bb052fd4c9 Bump robolectric from 4.8 to 4.8.1 (#1842) 2022-05-12 19:05:20 +00:00
28ef8c6761 Bump kotlin_version from 1.6.20 to 1.6.21 (#1837) 2022-05-03 11:46:03 +00:00
15e8e096ed Bump robolectric from 4.7.3 to 4.8 (#1839) 2022-05-03 11:38:18 +00:00
6007de017f Merge branch 'release/1.6.3' into develop 2022-04-19 09:56:12 +02:00
775b5122ef Merge branch 'release/1.6.3' 2022-04-19 09:56:06 +02:00
fed00122d7 Version 1.6.3 2022-04-19 09:56:01 +02:00
426bee882c Display timetable header as HTML on dashboard tile (#1835) 2022-04-18 16:52:28 +02:00
d37de197fc Bump firebase-bom from 29.3.0 to 29.3.1 (#1836) 2022-04-18 14:52:06 +00:00
447ece3696 Replace destination parcelable with destination json string (#1833) 2022-04-16 12:17:22 +02:00
a73f39e59c Bump agconnect-crash from 1.6.5.200 to 1.6.5.300 (#1830) 2022-04-14 02:13:09 +00:00
f912aac140 Bump gradle from 7.1.2 to 7.1.3 (#1829) 2022-04-14 02:12:20 +00:00
3caabd3e0e Bump coroutines from 1.6.0 to 1.6.1 (#1828) 2022-04-14 02:06:04 +00:00
88576271e2 Bump agcp from 1.6.5.200 to 1.6.5.300 (#1831) 2022-04-14 02:05:12 +00:00
b088551005 Bump hianalytics from 6.4.1.301 to 6.4.1.302 (#1832) 2022-04-14 02:04:53 +00:00
130e11a629 Merge branch 'release/1.6.2' into develop 2022-04-10 20:37:21 +02:00
d5e0ae7b37 Merge branch 'release/1.6.2' 2022-04-10 20:37:17 +02:00
e6f56a74a4 Version 1.6.2 2022-04-10 20:37:10 +02:00
1bc59cfa7f Another attempt to fix destination crash (#1826) 2022-04-10 20:23:46 +02:00
41bae262a5 Merge branch 'release/1.6.1' into develop 2022-04-06 17:28:55 +02:00
ae65228805 Merge branch 'release/1.6.1' 2022-04-06 17:28:50 +02:00
391ee6e621 Version 1.6.1 2022-04-06 17:27:27 +02:00
0a87df3d82 New Crowdin updates (#1817) 2022-04-06 17:19:38 +02:00
cb4ae21903 Replace Serializable to Parcelable in Destination (#1823) 2022-04-06 08:01:41 +02:00
679cf2554d Fix text in lucky number widget (#1825) 2022-04-06 08:01:11 +02:00
d473d53879 Add standard register variant as translatable string (#1824) 2022-04-05 13:56:11 +02:00
6531061b48 Fix text aligment in exam dialog (#1821) 2022-04-05 10:30:49 +02:00
3347e8fba8 Bump kotlin_version from 1.6.10 to 1.6.20 (#1818) 2022-04-05 08:10:07 +00:00
84067126a1 Bump hianalytics from 6.4.1.300 to 6.4.1.301 (#1819) 2022-04-05 08:09:46 +00:00
da9bebe923 Merge branch 'release/1.6.0' into develop 2022-04-02 22:02:01 +02:00
30 changed files with 743 additions and 754 deletions

View File

@ -22,8 +22,8 @@ android {
testApplicationId "io.github.tests.wulkanowy"
minSdkVersion 21
targetSdkVersion 31
versionCode 104
versionName "1.6.0"
versionCode 108
versionName "1.6.4"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
resValue "string", "app_name", "Wulkanowy"
@ -132,7 +132,7 @@ android {
kotlinOptions {
jvmTarget = "11"
freeCompilerArgs += ["-Xopt-in=kotlin.RequiresOptIn", "-Xjvm-default=all"]
freeCompilerArgs += ["-opt-in=kotlin.RequiresOptIn", "-Xjvm-default=all"]
}
packagingOptions {
@ -153,8 +153,8 @@ play {
defaultToAppBundles = false
track = 'production'
releaseStatus = com.github.triplet.gradle.androidpublisher.ReleaseStatus.IN_PROGRESS
userFraction = 0.25d
updatePriority = 1
userFraction = 0.50d
updatePriority = 3
enabled.set(false)
}
@ -173,16 +173,16 @@ ext {
android_hilt = "1.0.0"
room = "2.4.2"
chucker = "3.5.2"
mockk = "1.12.2"
coroutines = "1.6.0"
mockk = "1.12.4"
coroutines = "1.6.1"
}
dependencies {
implementation "io.github.wulkanowy:sdk:1.6.0"
implementation "io.github.wulkanowy:sdk:1.6.4"
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2"
implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.3"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines"
implementation "androidx.core:core-ktx:1.7.0"
@ -228,12 +228,12 @@ dependencies {
implementation "at.favre.lib:slf4j-timber:1.0.1"
implementation 'com.github.bastienpaulfr:Treessence:1.0.5'
implementation "com.mikepenz:aboutlibraries-core:$about_libraries"
implementation "io.coil-kt:coil:1.4.0"
implementation "io.coil-kt:coil:2.0.0"
implementation "io.github.wulkanowy:AppKillerManager:3.0.0"
implementation 'me.xdrop:fuzzywuzzy:1.4.0'
implementation 'com.fredporciuncula:flow-preferences:1.6.0'
implementation 'com.fredporciuncula:flow-preferences:1.7.0'
playImplementation platform('com.google.firebase:firebase-bom:29.3.0')
playImplementation platform('com.google.firebase:firebase-bom:30.0.1')
playImplementation 'com.google.firebase:firebase-analytics-ktx'
playImplementation 'com.google.firebase:firebase-messaging:'
playImplementation 'com.google.firebase:firebase-crashlytics:'
@ -241,8 +241,8 @@ dependencies {
playImplementation 'com.google.android.play:core-ktx:1.8.1'
playImplementation 'com.google.android.gms:play-services-ads:20.6.0'
hmsImplementation 'com.huawei.hms:hianalytics:6.4.1.300'
hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.6.5.200'
hmsImplementation 'com.huawei.hms:hianalytics:6.5.0.300'
hmsImplementation 'com.huawei.agconnect:agconnect-crash:1.6.6.200'
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:$chucker"
@ -255,7 +255,7 @@ dependencies {
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines"
testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
testImplementation 'org.robolectric:robolectric:4.7.3'
testImplementation 'org.robolectric:robolectric:4.8.1'
testImplementation "androidx.test:runner:1.4.0"
testImplementation "androidx.test.ext:junit:1.1.3"
testImplementation "androidx.test:core:1.4.0"

View File

@ -7,6 +7,7 @@ import javax.inject.Inject
import javax.inject.Singleton
@Singleton
@Suppress("UNUSED_PARAMETER", "unused")
class InAppReviewHelper @Inject constructor(
@ApplicationContext private val context: Context
) {
@ -14,4 +15,4 @@ class InAppReviewHelper @Inject constructor(
fun showInAppReview(activity: MainActivity) {
// do nothing
}
}
}

View File

@ -15,79 +15,41 @@ import javax.inject.Singleton
@Singleton
class ShortcutsHelper @Inject constructor(@ApplicationContext private val context: Context) {
// Destination cannot be used here as shortcuts
// require their intents to only use primitive types (see PersistableBundle.isValidType).
private val destinations = mapOf(
"grade" to Destination.Grade,
"attendance" to Destination.Attendance,
"exam" to Destination.Exam,
"timetable" to Destination.Timetable()
)
init {
initializeShortcuts()
}
fun getDestination(intent: Intent) =
destinations[intent.getStringExtra(EXTRA_SHORTCUT_DESTINATION_ID)]
private fun initializeShortcuts() {
fun initializeShortcuts() {
val shortcutsInfo = listOf(
ShortcutInfoCompat.Builder(context, "grade_shortcut")
.setShortLabel(context.getString(R.string.grade_title))
.setLongLabel(context.getString(R.string.grade_title))
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_grade))
.setIntent(SplashActivity.getStartIntent(context)
.apply {
action = Intent.ACTION_VIEW
putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "grade")
}
)
.setIntent(SplashActivity.getStartIntent(context, Destination.Grade)
.apply { action = Intent.ACTION_VIEW })
.build(),
ShortcutInfoCompat.Builder(context, "attendance_shortcut")
.setShortLabel(context.getString(R.string.attendance_title))
.setLongLabel(context.getString(R.string.attendance_title))
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_attendance))
.setIntent(SplashActivity.getStartIntent(context)
.apply {
action = Intent.ACTION_VIEW
putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "attendance")
}
)
.setIntent(SplashActivity.getStartIntent(context, Destination.Attendance)
.apply { action = Intent.ACTION_VIEW })
.build(),
ShortcutInfoCompat.Builder(context, "exam_shortcut")
.setShortLabel(context.getString(R.string.exam_title))
.setLongLabel(context.getString(R.string.exam_title))
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_exam))
.setIntent(SplashActivity.getStartIntent(context)
.apply {
action = Intent.ACTION_VIEW
putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "exam")
}
)
.setIntent(SplashActivity.getStartIntent(context, Destination.Exam)
.apply { action = Intent.ACTION_VIEW })
.build(),
ShortcutInfoCompat.Builder(context, "timetable_shortcut")
.setShortLabel(context.getString(R.string.timetable_title))
.setLongLabel(context.getString(R.string.timetable_title))
.setIcon(IconCompat.createWithResource(context, R.drawable.ic_shortcut_timetable))
.setIntent(SplashActivity.getStartIntent(context)
.apply {
action = Intent.ACTION_VIEW
putExtra(EXTRA_SHORTCUT_DESTINATION_ID, "timetable")
}
)
.setIntent(SplashActivity.getStartIntent(context, Destination.Timetable())
.apply { action = Intent.ACTION_VIEW })
.build()
)
shortcutsInfo.forEach { ShortcutManagerCompat.pushDynamicShortcut(context, it) }
}
private companion object {
private const val EXTRA_SHORTCUT_DESTINATION_ID = "shortcut_destination_id"
}
}
}

View File

@ -19,15 +19,15 @@ import kotlinx.serialization.Serializable
import java.time.LocalDate
@Serializable
sealed class Destination private constructor() : java.io.Serializable {
sealed class Destination {
/*
Type in children classes have to be as getter to avoid null in enums
https://stackoverflow.com/questions/68866453/kotlin-enum-val-is-returning-null-despite-being-set-at-compile-time
*/
abstract val type: Type
abstract val destinationType: Type
abstract val fragment: Fragment
abstract val destinationFragment: Fragment
enum class Type(val defaultDestination: Destination) {
DASHBOARD(Dashboard),
@ -47,26 +47,26 @@ sealed class Destination private constructor() : java.io.Serializable {
@Serializable
object Dashboard : Destination() {
override val type get() = Type.DASHBOARD
override val fragment get() = DashboardFragment.newInstance()
override val destinationType get() = Type.DASHBOARD
override val destinationFragment get() = DashboardFragment.newInstance()
}
@Serializable
object Grade : Destination() {
override val type get() = Type.GRADE
override val fragment get() = GradeFragment.newInstance()
override val destinationType get() = Type.GRADE
override val destinationFragment get() = GradeFragment.newInstance()
}
@Serializable
object Attendance : Destination() {
override val type get() = Type.ATTENDANCE
override val fragment get() = AttendanceFragment.newInstance()
override val destinationType get() = Type.ATTENDANCE
override val destinationFragment get() = AttendanceFragment.newInstance()
}
@Serializable
object Exam : Destination() {
override val type get() = Type.EXAM
override val fragment get() = ExamFragment.newInstance()
override val destinationType get() = Type.EXAM
override val destinationFragment get() = ExamFragment.newInstance()
}
@Serializable
@ -74,55 +74,55 @@ sealed class Destination private constructor() : java.io.Serializable {
@Serializable(with = LocalDateSerializer::class)
private val date: LocalDate? = null
) : Destination() {
override val type get() = Type.TIMETABLE
override val fragment get() = TimetableFragment.newInstance(date)
override val destinationType get() = Type.TIMETABLE
override val destinationFragment get() = TimetableFragment.newInstance(date)
}
@Serializable
object Homework : Destination() {
override val type get() = Type.HOMEWORK
override val fragment get() = HomeworkFragment.newInstance()
override val destinationType get() = Type.HOMEWORK
override val destinationFragment get() = HomeworkFragment.newInstance()
}
@Serializable
object Note : Destination() {
override val type get() = Type.NOTE
override val fragment get() = NoteFragment.newInstance()
override val destinationType get() = Type.NOTE
override val destinationFragment get() = NoteFragment.newInstance()
}
@Serializable
object Conference : Destination() {
override val type get() = Type.CONFERENCE
override val fragment get() = ConferenceFragment.newInstance()
override val destinationType get() = Type.CONFERENCE
override val destinationFragment get() = ConferenceFragment.newInstance()
}
@Serializable
object SchoolAnnouncement : Destination() {
override val type get() = Type.SCHOOL_ANNOUNCEMENT
override val fragment get() = SchoolAnnouncementFragment.newInstance()
override val destinationType get() = Type.SCHOOL_ANNOUNCEMENT
override val destinationFragment get() = SchoolAnnouncementFragment.newInstance()
}
@Serializable
object School : Destination() {
override val type get() = Type.SCHOOL
override val fragment get() = SchoolFragment.newInstance()
override val destinationType get() = Type.SCHOOL
override val destinationFragment get() = SchoolFragment.newInstance()
}
@Serializable
object LuckyNumber : Destination() {
override val type get() = Type.LUCKY_NUMBER
override val fragment get() = LuckyNumberFragment.newInstance()
override val destinationType get() = Type.LUCKY_NUMBER
override val destinationFragment get() = LuckyNumberFragment.newInstance()
}
@Serializable
object More : Destination() {
override val type get() = Type.MORE
override val fragment get() = MoreFragment.newInstance()
override val destinationType get() = Type.MORE
override val destinationFragment get() = MoreFragment.newInstance()
}
@Serializable
object Message : Destination() {
override val type get() = Type.MESSAGE
override val fragment get() = MessageFragment.newInstance()
override val destinationType get() = Type.MESSAGE
override val destinationFragment get() = MessageFragment.newInstance()
}
}
}

View File

@ -23,8 +23,9 @@ class LicenseAdapter @Inject constructor() : RecyclerView.Adapter<LicenseAdapter
val item = items[position]
with(holder.binding) {
licenseItemName.text = item.libraryName
licenseItemSummary.text = item.licenses?.firstOrNull()?.licenseName?.takeIf { it.isNotBlank() } ?: item.libraryVersion
licenseItemName.text = item.name
licenseItemSummary.text = item.licenses.firstOrNull()?.name?.takeIf { it.isNotBlank() }
?: item.artifactVersion
root.setOnClickListener { onClickListener(item) }
}

View File

@ -9,6 +9,7 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.mikepenz.aboutlibraries.Libs
import com.mikepenz.aboutlibraries.entity.Library
import com.mikepenz.aboutlibraries.util.withContext
import dagger.hilt.android.AndroidEntryPoint
import io.github.wulkanowy.R
import io.github.wulkanowy.databinding.FragmentLicenseBinding
@ -28,7 +29,9 @@ class LicenseFragment : BaseFragment<FragmentLicenseBinding>(R.layout.fragment_l
override val titleStringId get() = R.string.license_title
override val appLibraries by lazy { Libs(requireContext()).libraries }
override val appLibraries by lazy {
Libs.Builder().withContext(requireContext()).build().libraries
}
companion object {
fun newInstance() = LicenseFragment()

View File

@ -22,7 +22,7 @@ class LicensePresenter @Inject constructor(
}
fun onItemSelected(library: Library) {
view?.run { library.licenses?.firstOrNull()?.licenseDescription?.let { openLicense(it) } }
view?.run { library.licenses.firstOrNull()?.licenseContent?.let { openLicense(it) } }
}
private fun loadData() {

View File

@ -35,9 +35,11 @@ class AttendanceAdapter @Inject constructor() :
with(holder.binding) {
attendanceItemNumber.text = item.number.toString()
attendanceItemSubject.text = item.subject
attendanceItemSubject.text = item.subject.ifBlank {
root.context.getString(R.string.all_no_data)
}
attendanceItemDescription.setText(item.descriptionRes)
attendanceItemAlert.visibility = item.run { if (absence && !excused) View.VISIBLE else View.INVISIBLE }
attendanceItemAlert.isVisible = item.let { it.absence && !it.excused }
attendanceItemNumber.visibility = View.GONE
attendanceItemExcuseInfo.visibility = View.GONE
attendanceItemExcuseCheckbox.visibility = View.GONE
@ -46,7 +48,7 @@ class AttendanceAdapter @Inject constructor() :
onExcuseCheckboxSelect(item, checked)
}
when (item.excuseStatus?.let { SentExcuseStatus.valueOf(it)}) {
when (item.excuseStatus?.let { SentExcuseStatus.valueOf(it) }) {
SentExcuseStatus.WAITING -> {
attendanceItemExcuseInfo.setImageResource(R.drawable.ic_excuse_waiting)
attendanceItemExcuseInfo.visibility = View.VISIBLE

View File

@ -9,6 +9,7 @@ import android.os.Looper
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.text.parseAsHtml
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.core.view.updateMarginsRelative
@ -563,7 +564,7 @@ class DashboardAdapter @Inject constructor() : RecyclerView.Adapter<RecyclerView
) {
with(binding.dashboardLessonsItemDayHeader) {
isVisible = header != null
text = header?.content
text = header?.content?.parseAsHtml()
}
}

View File

@ -78,7 +78,7 @@ class LuckyNumberWidgetProvider : AppWidgetProvider() {
.apply {
setTextViewText(
R.id.luckyNumberWidgetNumber,
luckyNumber.dataOrNull?.toString() ?: "#"
luckyNumber.dataOrNull?.luckyNumber?.toString() ?: "#"
)
setOnClickPendingIntent(R.id.luckyNumberWidgetContainer, appIntent)
}

View File

@ -24,6 +24,8 @@ import io.github.wulkanowy.ui.base.BaseActivity
import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.account.accountquick.AccountQuickDialog
import io.github.wulkanowy.utils.*
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import timber.log.Timber
import javax.inject.Inject
@ -55,13 +57,13 @@ class MainActivity : BaseActivity<MainPresenter, ActivityMainBinding>(), MainVie
companion object {
private const val EXTRA_START_DESTINATION = "start_destination"
private const val EXTRA_START_DESTINATION = "start_destination_json"
fun getStartIntent(
context: Context,
destination: Destination? = null,
) = Intent(context, MainActivity::class.java).apply {
putExtra(EXTRA_START_DESTINATION, destination)
destination?.let { putExtra(EXTRA_START_DESTINATION, Json.encodeToString(it)) }
}
}
@ -70,9 +72,8 @@ class MainActivity : BaseActivity<MainPresenter, ActivityMainBinding>(), MainVie
override val currentStackSize get() = navController.currentStack?.size
override val currentViewTitle
get() = (navController.currentFrag as? MainView.TitledView)?.titleStringId?.let {
getString(it)
}
get() = (navController.currentFrag as? MainView.TitledView)?.titleStringId
?.let { getString(it) }
override val currentViewSubtitle get() = (navController.currentFrag as? MainView.TitledView)?.subtitleString
@ -86,7 +87,7 @@ class MainActivity : BaseActivity<MainPresenter, ActivityMainBinding>(), MainVie
messageContainer = binding.mainMessageContainer
updateHelper.messageContainer = binding.mainFragmentContainer
val destination = (intent.getSerializableExtra(EXTRA_START_DESTINATION) as Destination?)
val destination = intent.getStringExtra(EXTRA_START_DESTINATION)
?.takeIf { savedInstanceState == null }
presenter.onAttachView(this, destination)
@ -129,7 +130,7 @@ class MainActivity : BaseActivity<MainPresenter, ActivityMainBinding>(), MainVie
)
}
fragmentHideStrategy = HIDE
rootFragments = rootDestinations.map { it.fragment }
rootFragments = rootDestinations.map { it.destinationFragment }
initialize(startMenuIndex, savedInstanceState)
}
@ -230,7 +231,7 @@ class MainActivity : BaseActivity<MainPresenter, ActivityMainBinding>(), MainVie
}
override fun openMoreDestination(destination: Destination) {
pushView(destination.fragment)
pushView(destination.destinationFragment)
}
override fun notifyMenuViewReselected() {

View File

@ -19,6 +19,8 @@ import io.github.wulkanowy.ui.modules.message.MessageView
import io.github.wulkanowy.ui.modules.schoolandteachers.SchoolAndTeachersView
import io.github.wulkanowy.ui.modules.studentinfo.StudentInfoView
import io.github.wulkanowy.utils.AnalyticsHelper
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import timber.log.Timber
import java.time.Duration
import java.time.Instant
@ -30,6 +32,7 @@ class MainPresenter @Inject constructor(
private val prefRepository: PreferencesRepository,
private val syncManager: SyncManager,
private val analytics: AnalyticsHelper,
private val json: Json
) : BasePresenter<MainView>(errorHandler, studentRepository) {
private var studentsWitSemesters: List<StudentWithSemesters>? = null
@ -45,18 +48,20 @@ class MainPresenter @Inject constructor(
private val Destination?.startMenuIndex
get() = when {
this == null -> prefRepository.startMenuIndex
type in rootDestinationTypeList -> {
rootDestinationTypeList.indexOf(type)
destinationType in rootDestinationTypeList -> {
rootDestinationTypeList.indexOf(destinationType)
}
else -> 4
}
fun onAttachView(view: MainView, initDestination: Destination?) {
fun onAttachView(view: MainView, initDestinationJson: String?) {
super.onAttachView(view)
val initDestination: Destination? = initDestinationJson?.let { json.decodeFromString(it) }
val startMenuIndex = initDestination.startMenuIndex
val destinations = rootDestinationTypeList.map {
if (it == initDestination?.type) initDestination else it.defaultDestination
if (it == initDestination?.destinationType) initDestination else it.defaultDestination
}
view.initView(startMenuIndex, destinations)

View File

@ -43,7 +43,7 @@ class NotificationsCenterFragment :
override fun initView() {
notificationsCenterAdapter.onItemClickListener = { notification ->
(requireActivity() as MainActivity).pushView(notification.destination.fragment)
(requireActivity() as MainActivity).pushView(notification.destination.destinationFragment)
}
with(binding.notificationsCenterRecycler) {

View File

@ -15,6 +15,8 @@ import io.github.wulkanowy.ui.modules.Destination
import io.github.wulkanowy.ui.modules.login.LoginActivity
import io.github.wulkanowy.ui.modules.main.MainActivity
import io.github.wulkanowy.utils.openInternetBrowser
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import javax.inject.Inject
@SuppressLint("CustomSplashScreen")
@ -29,13 +31,13 @@ class SplashActivity : BaseActivity<SplashPresenter, ViewBinding>(), SplashView
companion object {
private const val EXTRA_START_DESTINATION = "start_destination"
private const val EXTRA_START_DESTINATION = "start_destination_json"
private const val EXTRA_EXTERNAL_URL = "external_url"
fun getStartIntent(context: Context, destination: Destination? = null) =
Intent(context, SplashActivity::class.java).apply {
putExtra(EXTRA_START_DESTINATION, destination)
destination?.let { putExtra(EXTRA_START_DESTINATION, Json.encodeToString(it)) }
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
}
@ -43,12 +45,12 @@ class SplashActivity : BaseActivity<SplashPresenter, ViewBinding>(), SplashView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
installSplashScreen().setKeepOnScreenCondition { true }
shortcutsHelper.initializeShortcuts()
val externalLink = intent?.getStringExtra(EXTRA_EXTERNAL_URL)
val startDestination = intent?.getSerializableExtra(EXTRA_START_DESTINATION) as Destination?
?: shortcutsHelper.getDestination(intent)
val startDestinationJson = intent?.getStringExtra(EXTRA_START_DESTINATION)
presenter.onAttachView(this, externalLink, startDestination)
presenter.onAttachView(this, externalLink, startDestinationJson)
}
override fun openLoginView() {

View File

@ -5,16 +5,21 @@ import io.github.wulkanowy.ui.base.BasePresenter
import io.github.wulkanowy.ui.base.ErrorHandler
import io.github.wulkanowy.ui.modules.Destination
import kotlinx.coroutines.launch
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json
import javax.inject.Inject
class SplashPresenter @Inject constructor(
errorHandler: ErrorHandler,
studentRepository: StudentRepository,
private val json: Json
) : BasePresenter<SplashView>(errorHandler, studentRepository) {
fun onAttachView(view: SplashView, externalUrl: String?, startDestination: Destination?) {
fun onAttachView(view: SplashView, externalUrl: String?, startDestinationJson: String?) {
super.onAttachView(view)
val startDestination: Destination? = startDestinationJson?.let { json.decodeFromString(it) }
if (!externalUrl.isNullOrBlank()) {
view.openExternalUrlAndFinish(externalUrl)
return

View File

@ -1,9 +1,5 @@
Wersja 1.6.0
Wersja 1.6.4
- dodaliśmy możliwość usuwania wielu wiadomości jednocześnie
- dodaliśmy opcję szybkiego dodawania sprawdzianów do kalendarza
- dodaliśmy średnią ucznia w wykresach ocen klasy
- naprawiliśmy rzadki błąd dotyczący problemów z automatycznym odświeżaniem ekranu startowego
- naprawiliśmy błąd z liczeniem średniej w drugim semestrze
- naprawiliśmy błąd ładowania frekwencji na GPE i Lubelskim Portalu Oświatowym
Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases

View File

@ -146,7 +146,7 @@
android:id="@+id/examDialogDeadlineDateValue"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginStart="16dp"
android:layout_marginEnd="24dp"
android:paddingStart="0dp"
android:paddingEnd="16dp"
@ -162,7 +162,7 @@
android:id="@+id/examDialogEntryDateTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="0dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="24dp"
android:text="@string/exam_entry_date"

View File

@ -71,6 +71,7 @@
<string name="login_recover_title">Obnovte svůj účet</string>
<string name="login_recover">Obnovit</string>
<string name="login_signed_in">Žák je už přihlášen</string>
<string name="login_host_standard">Standardní</string>
<!--Main-->
<string name="main_account_picker">Manažer účtů</string>
<string name="main_log_in">Přihlásit se</string>
@ -93,9 +94,9 @@
<string name="grade_summary_predicted_grade">Předpokládaná známka</string>
<string name="grade_summary_calculated_average">Vypočítaný průměr</string>
<string name="grade_summary_calculated_average_help_dialog_title">Jak funguje vypočítaný průměr?</string>
<string name="grade_summary_calculated_average_help_dialog_message">Vypočítaný průměr je aritmetický průměr vypočítaný z průměrů předmětů. Umožňuje vám to znát přibližný konečný průměr. Vypočítává se způsobem zvoleným uživatelem v nastavení aplikaci. Doporučuje se vybrat příslušnou možnost. Důvodem je rozdílný výpočet školních průměrů. Pokud vaše škola navíc uvádí průměr předmětů na stránce deníku Vulcan, aplikace si je stáhne a tyto průměry nepočítá. To lze změnit vynucením výpočtu průměru v nastavení aplikaci.\n\n<b>Průměr známek pouze z vybraného semestru</b>:\n1. Výpočet váženého průměru pro každý předmět v daném semestru\n2. Sčítání vypočítaných průměrů\n3. Výpočet aritmetického průměru součtených průměrů\n\n<b>Průměr průměrů z obou semestrů</b>:\n1. Výpočet váženého průměru pro každý předmět v semestru 1 a 2\n2. Výpočet aritmetického průměru vypočítaných průměrů za semestry 1 a 2 pro každý předmět.\n3. Sčítání vypočítaných průměrů\n4. Výpočet aritmetického průměru součtených průměrů\n\n<b>Průměr známek z celého roku:</b>\n1. Výpočet váženého průměru za rok pro každý předmět. Konečný průměr v 1. semestru je nepodstatný.\n3. Sčítání vypočítaných průměrů\n4. Výpočet aritmetického průměru součtených průměrů</string>
<string name="grade_summary_calculated_average_help_dialog_message">Vypočítaný průměr je aritmetický průměr vypočítaný z průměrů předmětů. Umožňuje vám to znát přibližný konečný průměr. Vypočítává se způsobem zvoleným uživatelem v nastavení aplikaci. Doporučuje se vybrat příslušnou možnost. Důvodem je rozdílný výpočet školních průměrů. Pokud vaše škola navíc uvádí průměr předmětů na stránce deníku Vulcan, aplikace si je stáhne a tyto průměry nepočítá. To lze změnit vynucením výpočtu průměru v nastavení aplikaci.\n\n<b>Průměr známek pouze z vybraného semestru</b>:\n1. Výpočet váženého průměru pro každý předmět v daném semestru\n2. Sčítání vypočítaných průměrů\n3. Výpočet aritmetického průměru součtených průměrů\n\n<b>Průměr průměrů z obou semestrů</b>:\n1. Výpočet váženého průměru pro každý předmět v semestru 1 a 2\n2. Výpočet aritmetického průměru vypočítaných průměrů za semestry 1 a 2 pro každý předmět.\n3. Sčítání vypočítaných průměrů\n4. Výpočet aritmetického průměru sečtených průměrů\n\n<b>Průměr známek z celého roku:</b>\n1. Výpočet váženého průměru za rok pro každý předmět. Konečný průměr v 1. semestru je nepodstatný.\n3. Sčítání vypočítaných průměrů\n4. Výpočet aritmetického průměru součtených průměrů</string>
<string name="grade_summary_final_average_help_dialog_title">Jak funguje konečný průměr?</string>
<string name="grade_summary_final_average_help_dialog_message">Konečný průměr je aritmetický průměr vypočítaný ze všech aktuálně dostupných konečných známek v daném semestru.\n\nSchéma výpočtu se skládá z následujících kroků:\n1. Sčítání konečných známek zadaných učiteli\n2. Děleno počtem předmětů, pro které už byly vydány známky</string>
<string name="grade_summary_final_average_help_dialog_message">Konečný průměr je aritmetický průměr vypočítaný ze všech aktuálně dostupných konečných známek v daném semestru.\n\nSchéma výpočtu se skládá z následujících kroků:\n1. Sčítání konečných známek zadaných učiteli\n2. Děleno počtem předmětů, pro které už byly uděleny známky</string>
<string name="grade_summary_final_average">Konečný průměr</string>
<string name="grade_summary_from_subjects">z %1$d z %2$d předmětů</string>
<string name="grade_menu_summary">Shrnutí</string>
@ -219,7 +220,7 @@
<string name="additional_lessons_end_time_error">Čas ukončení musí být pozdější než čas zahájení</string>
<!--Attendance-->
<string name="attendance_summary_button">Shrnutí frekvencí</string>
<string name="attendance_absence_school">Neprítomnosť zo školských dôvodov</string>
<string name="attendance_absence_school">Nepřítomnost ze školch důvodů</string>
<string name="attendance_absence_excused">Omluvená nepřítomnost</string>
<string name="attendance_absence_unexcused">Neomluvená nepřítomnost</string>
<string name="attendance_exemption">Osvobození</string>

View File

@ -71,6 +71,7 @@
<string name="login_recover_title">Ihr Konto wiederherstellen</string>
<string name="login_recover">Wiederherstellen</string>
<string name="login_signed_in">Student ist bereits angemeldet</string>
<string name="login_host_standard">Standard</string>
<!--Main-->
<string name="main_account_picker">Kundenbetreuer</string>
<string name="main_log_in">Anmelden</string>

View File

@ -71,6 +71,7 @@
<string name="login_recover_title">Przywróć swoje konto</string>
<string name="login_recover">Przywróć</string>
<string name="login_signed_in">Uczeń jest już zalogowany</string>
<string name="login_host_standard">Standardowa</string>
<!--Main-->
<string name="main_account_picker">Menadżer kont</string>
<string name="main_log_in">Zaloguj się</string>

View File

@ -32,7 +32,7 @@
<item>0,75</item>
</string-array>
<string-array name="grade_sorting_mode_entries">
<item>Алфавитный</item>
<item>В алфавитном порядке</item>
<item>По дате</item>
</string-array>
<string-array name="grade_color_scheme_entries">
@ -43,22 +43,22 @@
<string-array name="default_expand_grade_entries">
<item>До 1 за раз</item>
<item>Всегда развернуто</item>
<item>Неограниченные расширения</item>
<item>Неограниченно</item>
</string-array>
<string-array name="grade_average_mode_entries">
<item>Средние оценки только с выбранного семестра</item>
<item>Средние значения для обоих семестров</item>
<item>Средняя оценок со всего года</item>
<item>Средняя из оценок выбранного семестра</item>
<item>Средняя из средних оценок семестров</item>
<item>Средняя из оценок со всего года</item>
</string-array>
<string-array name="dashboard_tile_entries">
<item>Счастливый номер</item>
<item>Непрочитанные сообщения</item>
<item>Непрочитанные письма</item>
<item>Посещаемость</item>
<item>Уроки</item>
<item>Оценки</item>
<item>Домашняя работа</item>
<item>Объявления школ</item>
<item>Экзамены</item>
<item>Конференции</item>
<item>Объявления школы</item>
<item>Тесты</item>
<item>Встречи</item>
</string-array>
</resources>

View File

@ -12,92 +12,93 @@
<string name="about_title">О приложении</string>
<string name="logviewer_title">Просмотр журнала</string>
<string name="debug_title">Отладка</string>
<string name="notification_debug_title">Отладка уведомления</string>
<string name="notification_debug_title">Отладка уведомлений</string>
<string name="contributors_title">Разработчики</string>
<string name="license_title">Лицензии</string>
<string name="message_title">Сообщения</string>
<string name="send_message_title">Новое сообщение</string>
<string name="add_homework_title">Новая домашняя работа</string>
<string name="note_title">Предупреждения и свершения</string>
<string name="message_title">Письма</string>
<string name="send_message_title">Написать</string>
<string name="add_homework_title">Новое домашнее задание</string>
<string name="note_title">Замечания и свершения</string>
<string name="homework_title">Домашние задания</string>
<string name="account_title">Менеджер аккаунтов</string>
<string name="account_quick_title">Выбор учетной записи</string>
<string name="account_title">Управлять аккаунтами</string>
<string name="account_quick_title">Выбрать аккаунт</string>
<string name="account_details_title">Данные аккаунта</string>
<string name="student_info_title">Информация о студенте</string>
<string name="dashboard_title">Панель</string>
<string name="student_info_title">Информация о ученике</string>
<string name="dashboard_title">Главная</string>
<string name="notifications_center_title">Центр уведомлений</string>
<!--Subtitles-->
<string name="grade_subtitle">%1$d семестр, %2$d/%3$d</string>
<!--Login-->
<string name="login_header_default">Авторизируйтесь при помощи аккаунта ученика или родителя</string>
<string name="login_header_symbol">Введите символ со страницы регистрации: &lt;b&gt;%1$s&lt;/b&gt;</string>
<string name="login_nickname_hint">Имя пользователя</string>
<string name="login_email_hint">Электронная почта</string>
<string name="login_header_default">Воспользуйтесь аккаунтом ученика/родителя</string>
<string name="login_header_symbol">Введите symbol аккаунта со страницы регистрации: &lt;b&gt;%1$s&lt;/b&gt;</string>
<string name="login_nickname_hint">Логин</string>
<string name="login_email_hint">E-mail</string>
<string name="login_login_pesel_email_hint">Логин, PESEL или электронная почта</string>
<string name="login_password_hint">Пароль</string>
<string name="login_host_hint">UONET + вариант регистрации</string>
<string name="login_host_hint">Тип дневника UONET+</string>
<string name="login_type_api">Мобильный API</string>
<string name="login_type_scrapper">Scraper</string>
<string name="login_type_hybrid">Гибрид</string>
<string name="login_type_hybrid">Hybrid</string>
<string name="login_token_hint">Token</string>
<string name="login_pin_hint">PIN</string>
<string name="login_symbol_hint">Symbol</string>
<string name="login_sign_in">Войти</string>
<string name="login_invalid_password">Слишком короткий пароль</string>
<string name="login_invalid_password">Пароль слишком короткий</string>
<string name="login_incorrect_password_default">Данные для входа указаны неверно</string>
<string name="login_incorrect_password">%1$s. Убедитесь, что ниже выбран правильный UONET+ вариант регистра</string>
<string name="login_invalid_pin">Неправильный PIN</string>
<string name="login_incorrect_password">%1$s. Убедитесь, что ниже выбран правильный тип дневника UONET+</string>
<string name="login_invalid_pin">Неверный PIN</string>
<string name="login_invalid_token">Неверный token</string>
<string name="login_expired_token">Token просрочен</string>
<string name="login_invalid_email">Неверный адрес электронной почты</string>
<string name="login_invalid_login">Используйте назначенный логин вместо электронной почты</string>
<string name="login_invalid_custom_email">Использовать назначенный логин или email в @%1$s</string>
<string name="login_invalid_symbol">Неправильный символ</string>
<string name="login_incorrect_symbol">Студент не найден. Подтвердите символ и выбранный вариант регистра UONET+</string>
<string name="login_invalid_email">Неверный e-mail</string>
<string name="login_invalid_login">Используйте назначенный логин вместо e-mail</string>
<string name="login_invalid_custom_email">Используйте назначенный логин или email в @%1$s</string>
<string name="login_invalid_symbol">Неверный symbol</string>
<string name="login_incorrect_symbol">Ученик не найден. Проверьте symbol и выбранный тип дненика UONET+</string>
<string name="login_duplicate_student">Данный ученик уже авторизован</string>
<string name="login_symbol_helper">Этот символ можно найти на странице регистрации в &#160;<b>Ученик</b>&#160;<b>Телефонный доступ</b> &#160;<b> Зарегистрируйте мобильное устройство</b>.\n\nУбедитесь, что вы установили соответствующий вариант регистра в поле <b>Разновидностью бревна UONET+</b> на предыдущем экране. Вулкановый на данный момент не обнаруживает дошкольников</string>
<string name="login_symbol_helper">Symbol можно найти на странице регистрации в &#160;<b>Uczeń</b> →&#160;<b>Dostęp Mobilny</b>&#160;<b>Zarejestruj urządzenie mobilne</b>.\n\nУбедитесь, что вы выбрали соответствующий тип дневника в поле <b>Тип дневника UONET+</b> на предыдущем экране</string>
<string name="login_select_student">Выберите учеников для авторизации в приложении</string>
<string name="login_advanced">Другие варианты</string>
<string name="login_advanced_warning_mobile_api">В этом режиме не работают: счастливый номер, статистика класса по оценкам, статистика посещаемости и уроков, информация о школе и список зарегистрированных устройств</string>
<string name="login_advanced_warning_scraper">Scraper - режим, который показывает данные так же, как и сайт дневника</string>
<string name="login_advanced_warning_hybrid">Hybrid - это комбинация лучших функций остальных двух режимов. Он работает быстрее, чем Scraper, и вводит функции, которых нет в режиме Mobile API. Находится в экспериментальной стадии</string>
<string name="login_privacy_policy">Политика приватности</string>
<string name="login_privacy_policy">Политика конфиденциальности</string>
<string name="login_contact_header">Проблемы с авторизацией? Свяжитесь с нами!</string>
<string name="login_contact_email">Электронная почта</string>
<string name="login_contact_email">E-mail</string>
<string name="login_contact_discord">Discord</string>
<string name="login_email_intent_title">Отправить письмо</string>
<string name="login_recover_warning">Убедитесь, что вы выбрали правильный вариант регистра UONET+!</string>
<string name="login_recover_button">Я забыл свой пароль</string>
<string name="login_recover_warning">Убедитесь, что вы выбрали правильный тип дневника UONET+</string>
<string name="login_recover_button">Забыли пароль?</string>
<string name="login_recover_title">Восстановите свой аккаунт</string>
<string name="login_recover">Восстановить</string>
<string name="login_signed_in">Студент уже вошел в систему</string>
<string name="login_signed_in">Ученик уже авторизован</string>
<string name="login_host_standard">Стандартный</string>
<!--Main-->
<string name="main_account_picker">Менеджер аккаунтов</string>
<string name="main_log_in">Войти</string>
<string name="main_session_expired">Сеанс истёк</string>
<string name="main_session_relogin">Сеанс истёк, пожалуйста, войдите ещё раз</string>
<string name="main_session_relogin">Сеанс истёк, авторизуйтесь снова</string>
<!--Grade-->
<string name="grade_header">Оценка</string>
<string name="grade_semester">Семестр %d</string>
<string name="grade_semester">%d семестр</string>
<string name="grade_switch_semester">Сменить семестр</string>
<string name="grade_no_items">Оценки отсутствуют</string>
<string name="grade_no_items">Нет оценок</string>
<string name="grade_weight">Стоимость</string>
<string name="grade_weight_value">Стоимость: %s</string>
<string name="grade_comment">Комментарий</string>
<string name="grade_number_new_items">Количество новых оценок: %1$d</string>
<string name="grade_average">Средняя оценка: %1$.2f</string>
<string name="grade_points_sum">Баллы: %s</string>
<string name="grade_no_average">Средняя оценка отсутствует</string>
<string name="grade_no_average">Нет средней оценки</string>
<string name="grade_summary_points">Сумма баллов</string>
<string name="grade_summary_final_grade">Итоговая оценка</string>
<string name="grade_summary_predicted_grade">Ожидаемая оценка</string>
<string name="grade_summary_calculated_average">Рассчитанная средняя оценка</string>
<string name="grade_summary_calculated_average_help_dialog_title">Как рассчитывается средняя работа?</string>
<string name="grade_summary_calculated_average_help_dialog_message">Расчетное среднее - это среднее арифметическое, рассчитанное на основе средних значений испытуемых. Это позволяет узнать приблизительное итоговое среднее значение. Он рассчитывается способом, выбранным пользователем в настройках приложения. Рекомендуется выбрать подходящий вариант. Это потому, что расчет средних показателей школы отличается. Кроме того, если ваша школа сообщает среднее значение по предметам на странице Vulcan, приложение загружает их и не вычисляет эти средние значения. Это можно изменить, принудительно вычисляя среднее значение в настройках приложения.\n\n<b>Среднее значение только за выбранный семестр </b>:\n1. Вычисление средневзвешенного значения по каждому предмету за семестр\n2.Добавление вычисленных средних\n3. Вычисление среднего арифметического суммарных средних\n\n<b>Среднее из средних значений за оба семестра</b>:\n1.Расчет средневзвешенного значения для каждого предмета в семестрах 1 и 2\n2. Вычисление среднего арифметического рассчитанных средних значений для семестров 1 и 2 по каждому предмету.\n3. Добавление вычисленных средних\n4. Расчет среднего арифметического суммированных средних\n\n<b>Среднее значение оценок за весь год: </b>\n1. Расчет средневзвешенного значения за год по каждому предмету. Итоговое среднее значение за 1 семестр не имеет значения.\n3. Добавление вычисленных средних\n4. Расчет среднего арифметического</string>
<string name="grade_summary_final_average_help_dialog_title">Как работает окончательный средний показатель?</string>
<string name="grade_summary_final_average_help_dialog_message">Среднее арифметическое - это среднее арифметическое, рассчитанное по всем имеющимся на данный момент итоговым классам данного семестра.\n\nСхема расчета состоит из следующих шагов:\n1. Суммирование итоговых классов преподавателей\n2. Деление по количеству уже оцененных предметов</string>
<string name="grade_summary_calculated_average_help_dialog_title">Как работает \"Рассчитанная средняя оценка\"?</string>
<string name="grade_summary_calculated_average_help_dialog_message">Рассчитанная средняя оценка - это среднее арифметическое, рассчитанное на основе средних оценок по предметам. Это позволяет узнать приблизительную итоговую среднюю оценку. Она рассчитывается способом, выбранным пользователем в настройках приложения. Рекомендуется выбрать подходящий вариант, так как каждая школа по разному считает среднюю оценку. Кроме того, если ваша школа выставляет средние оценки по предметам на странице Vulcan, приложение просто загрузит их. Это можно изменить, заставив приложение считать среднюю оценку в настройках.\n\n<b>Средняя из оценок выбранного семестра</b>:\n1. Вычисление средневзвешенного значения по каждому предмету за семестр\n2.Суммирование вычисленных значений\n3. Вычисление среднего арифметического суммированных значений\n\n<b>Средняя из средних оценок семестров</b>:\n1.Расчет средневзвешенного значения для каждого предмета в семестрах. \n2. Вычисление среднего арифметического из средневзвешенных значений для каждого предмета в семестрах.\n3. Суммирование средних арифметических\n4. Вычисление среднего арифматического из суммированных значений\n\n<b>Средняя из оценок со всего года:</b>\n1. Расчет средневзвешенного значения по каждому предмету за год. Итоговое среднее значение за 1 семестр не имеет значения.\n2. Суммирование вычисленных средних\n4. Расчет среднего арифметического суммированных чисел</string>
<string name="grade_summary_final_average_help_dialog_title">Как работает \"Итоговая средняя оценка\"?</string>
<string name="grade_summary_final_average_help_dialog_message">Итоговая средняя оценка - это среднее арифметическое, рассчитанное из всех имеющихся на данный момент итоговых оценок в семестре.\n\nРассчет происходит следующим образом:\n1. Суммирование итоговых оценок, выставленных преподавателями\n2. Полученная сумма делится на число предметов, по которым выставлены оценки</string>
<string name="grade_summary_final_average">Итоговая средняя оценка</string>
<string name="grade_summary_from_subjects">от %1$d из %2$d субъектов</string>
<string name="grade_summary_from_subjects">%1$d из %2$d предметов</string>
<string name="grade_menu_summary">Итоги</string>
<string name="grade_menu_statistics">Класс</string>
<string name="grade_menu_read">Пометить как \"прочитанное\"</string>
@ -106,10 +107,10 @@
<string name="grade_statistics_points">Баллы</string>
<string name="grade_statistics_legend">Легенда</string>
<string name="grade_statistics_class_average">Средняя класса: %1$s</string>
<string name="grade_statistics_student_average">Ваша средний: %1$s</string>
<string name="grade_statistics_student_average">Ваша средняя: %1$s</string>
<string name="grade_statistics_student_grade">Ваша оценка: %1$s</string>
<string name="grade_statistics_average_class">Класс</string>
<string name="grade_statistics_average_student">Студент</string>
<string name="grade_statistics_average_student">Ученик</string>
<plurals name="grade_number_item">
<item quantity="one">%d оценка</item>
<item quantity="few">%d оценки</item>
@ -135,22 +136,22 @@
<item quantity="other">Новые итоговые оценки</item>
</plurals>
<plurals name="grade_notify_new_items">
<item quantity="one">Вы получили %1$d оценку</item>
<item quantity="few">Вы получили %1$d оценки</item>
<item quantity="many">Вы получили %1$d оценок</item>
<item quantity="other">Вы получили %1$d оценок</item>
<item quantity="one">Вы получили %1$d новую оценку</item>
<item quantity="few">Вы получили %1$d новые оценки</item>
<item quantity="many">Вы получили %1$d новых оценок</item>
<item quantity="other">Вы получили %1$d новых оценок</item>
</plurals>
<plurals name="grade_notify_new_items_predicted">
<item quantity="one">Вы получили %1$d ожидаемую оценку</item>
<item quantity="few">Вы получили %1$d ожидаемые оценки</item>
<item quantity="many">Вы получили %1$d ожидаемых оценок</item>
<item quantity="other">Вы получили %1$d ожидаемых оценок</item>
<item quantity="one">Вы получили %1$d новую ожидаемую оценку</item>
<item quantity="few">Вы получили %1$d новые ожидаемые оценки</item>
<item quantity="many">Вы получили %1$d новых ожидаемых оценок</item>
<item quantity="other">Вы получили %1$d новых ожидаемых оценок</item>
</plurals>
<plurals name="grade_notify_new_items_final">
<item quantity="one">Вы получили %1$d итоговою оценку</item>
<item quantity="few">Вы получили %1$d итоговых оценки</item>
<item quantity="many">Вы получили %1$d итоговых оценок</item>
<item quantity="other">Вы получили %1$d финальные оценки</item>
<item quantity="one">Вы получили %1$d новую итоговую оценку</item>
<item quantity="few">Вы получили %1$d новых итоговых оценки</item>
<item quantity="many">Вы получили %1$d новых итоговых оценок</item>
<item quantity="other">Вы получили %1$d новых итоговые оценки</item>
</plurals>
<!--Timetable-->
<string name="timetable_lesson">Урок</string>
@ -168,36 +169,36 @@
<string name="timetable_next">Следующий: %s</string>
<string name="timetable_later">Позже: %s</string>
<string name="timetable_notify_lesson">%1$s урок %2$d - %3$s</string>
<string name="timetable_notify_change_room">Изменить комнату с %1$s на %2$s</string>
<string name="timetable_notify_change_teacher">Изменить учителя с %1$s на %2$s</string>
<string name="timetable_notify_change_subject">Изменить тему с %1$s на %2$s</string>
<string name="timetable_notify_change_room">Аудитория изменена с %1$s на %2$s</string>
<string name="timetable_notify_change_teacher">Учитель изменён с %1$s на %2$s</string>
<string name="timetable_notify_change_subject">Тема изменена с %1$s на %2$s</string>
<plurals name="timetable_notify_new_items_title">
<item quantity="one">Изменение расписания</item>
<item quantity="few">Изменение расписания</item>
<item quantity="many">Изменение расписания</item>
<item quantity="other">Изменение расписания</item>
<item quantity="few">Изменения расписания</item>
<item quantity="many">Изменения расписания</item>
<item quantity="other">Изменения расписания</item>
</plurals>
<plurals name="timetable_notify_new_items">
<item quantity="one">%1$s - %2$d изменений в расписании</item>
<item quantity="few">%1$s - %2$d изменений в расписании</item>
<item quantity="one">%1$s - %2$d изменение в расписании</item>
<item quantity="few">%1$s - %2$d изменения в расписании</item>
<item quantity="many">%1$s - %2$d изменений в расписании</item>
<item quantity="other">%1$s - %2$d изменений в расписании</item>
<item quantity="other">%1$s - %2$d изменений в расписании</item>
</plurals>
<plurals name="timetable_notify_new_items_group">
<item quantity="one">%1$d - изменений в расписании</item>
<item quantity="few">%1$d изменение в расписании</item>
<item quantity="many">%1$d изменение в расписании</item>
<item quantity="one">%1$d изменение в расписании</item>
<item quantity="few">%1$d изменения в расписании</item>
<item quantity="many">%1$d изменений в расписании</item>
<item quantity="other">%1$d изменений в расписании</item>
</plurals>
<plurals name="timetable_number_item">
<item quantity="one">%d изменение</item>
<item quantity="few">%d изменение</item>
<item quantity="many">%d изменение</item>
<item quantity="few">%d изменения</item>
<item quantity="many">%d изменений</item>
<item quantity="other">%d изменений</item>
</plurals>
<!--Completed lessons-->
<string name="completed_lessons_title">Проведённые уроки</string>
<string name="completed_lessons_button">Просмотреть проведённые уроки</string>
<string name="completed_lessons_button">Показать проведённые уроки</string>
<string name="completed_lessons_no_items">Нет информации о проведённых уроках</string>
<string name="completed_lessons_topic">Тема</string>
<string name="completed_lessons_absence">Отсутствие</string>
@ -212,7 +213,7 @@
<string name="additional_lessons_delete_success">Дополнительный урок успешно удален</string>
<string name="additional_lessons_repeat">Повторять еженедельно</string>
<string name="additional_lessons_delete_title">Удалить дополнительный урок</string>
<string name="additional_lessons_delete_one">Просто этот урок</string>
<string name="additional_lessons_delete_one">Только этот урок</string>
<string name="additional_lessons_delete_series">Все в серии</string>
<string name="additional_lessons_start">Время начала</string>
<string name="additional_lessons_end">Время окончания</string>
@ -223,35 +224,35 @@
<string name="attendance_absence_excused">Отсутствие по уважительной причине</string>
<string name="attendance_absence_unexcused">Отсутствие по неуважительной причине</string>
<string name="attendance_exemption">Освобождение</string>
<string name="attendance_excused_lateness">Опоздание по уважительным причинам</string>
<string name="attendance_unexcused_lateness">Опоздание по неуважительным причинам</string>
<string name="attendance_excused_lateness">Опоздание по уважительной причине</string>
<string name="attendance_unexcused_lateness">Опоздание по неуважительной причине</string>
<string name="attendance_present">Присутствие</string>
<string name="attendance_deleted">Удалено</string>
<string name="attendance_unknown">Неизвестно</string>
<string name="attendance_number">Урок №</string>
<string name="attendance_no_items">Данные не найдены</string>
<string name="attendance_no_items">Нет записей</string>
<string name="attendance_excuse_dialog_reason">Причина отсутствия (необязательно)</string>
<string name="attendance_excuse_dialog_submit">Послать</string>
<string name="attendance_excuse_success">Запрос на освобождение оправдания успешно отправлен!</string>
<string name="attendance_excuse_no_selection">Выберите хотя-бы одно отсутствие</string>
<string name="attendance_excuse_title">Изменить статус</string>
<string name="attendance_excuse_dialog_submit">Отправить</string>
<string name="attendance_excuse_success">Причина отсутствия успешно отправлена.</string>
<string name="attendance_excuse_no_selection">Выберите хотя бы одно отсутствие.</string>
<string name="attendance_excuse_title">Указать причину</string>
<plurals name="attendance_notify_new_items_title">
<item quantity="one">Новое посещение</item>
<item quantity="few">Новое посещение</item>
<item quantity="many">Новое посещение</item>
<item quantity="other">Новое посещение</item>
<item quantity="one">Новая запись о посещаемости</item>
<item quantity="few">Новые записи о посещаемости</item>
<item quantity="many">Новые записи о посещаемости</item>
<item quantity="other">Новые записи о посещаемости</item>
</plurals>
<plurals name="attendance_notify_new_items">
<item quantity="one">%1$d новое посещения</item>
<item quantity="few">%1$d новое посещение</item>
<item quantity="many">%1$d новое посещение</item>
<item quantity="other">%1$d новое посещения</item>
<item quantity="one">%1$d новая запись о посещаемости</item>
<item quantity="few">%1$d новые записи о посещаемости</item>
<item quantity="many">%1$d новых записей о посещаемости</item>
<item quantity="other">%1$d новых записей о посещаемости</item>
</plurals>
<plurals name="attendance_number_item">
<item quantity="one">%d посещаемость</item>
<item quantity="few">%d посещаемость</item>
<item quantity="many">%d посещаемость</item>
<item quantity="other">%d посещаемость</item>
<item quantity="one">%d запись о посещаемости</item>
<item quantity="few">%d записи о посещаемости</item>
<item quantity="many">%d записей о посещаемости</item>
<item quantity="other">%d записей о посещаемости</item>
</plurals>
<!--Attendance summary-->
<string name="attendance_summary_total">Общая</string>
@ -260,54 +261,54 @@
<string name="exam_type">Тип</string>
<string name="exam_entry_date">Дата записи</string>
<plurals name="exam_notify_new_item_title">
<item quantity="one">Новый экзамен</item>
<item quantity="few">Новый экзамен</item>
<item quantity="many">Новый экзамен</item>
<item quantity="other">Новые экзамены</item>
<item quantity="one">Новый тест</item>
<item quantity="few">Новые тесты</item>
<item quantity="many">Новые тесты</item>
<item quantity="other">Новые тесты</item>
</plurals>
<plurals name="exam_notify_new_item_content">
<item quantity="one">%d новый экзамен</item>
<item quantity="few">%d новый экзамен</item>
<item quantity="many">%d новый экзамен</item>
<item quantity="other">%d новых экзаменов</item>
<item quantity="one">%d новый тест</item>
<item quantity="few">%d новых теста</item>
<item quantity="many">%d новых тестов</item>
<item quantity="other">%d новых тестов</item>
</plurals>
<plurals name="exam_number_item">
<item quantity="one">%d экзамен</item>
<item quantity="few">%d экзамен</item>
<item quantity="many">%d экзамен</item>
<item quantity="other">%d экзаменов</item>
<item quantity="one">%d тест</item>
<item quantity="few">%d теста</item>
<item quantity="many">%d тестов</item>
<item quantity="other">%d тестов</item>
</plurals>
<!--Message-->
<string name="message_inbox">Полученные</string>
<string name="message_sent">Отправленные</string>
<string name="message_trash">Корзина</string>
<string name="message_no_subject">(нет темы)</string>
<string name="message_no_items">Нет сообщений</string>
<string name="message_no_items">Нет писем</string>
<string name="message_from">От:</string>
<string name="message_to">Кому:</string>
<string name="message_date">Дата: %1$s</string>
<string name="message_reply">Ответ</string>
<string name="message_forward">Переслать</string>
<string name="message_select_all">Выбрать всё</string>
<string name="message_unselect_all">Снять выбор</string>
<string name="message_select_all">Выбрать все</string>
<string name="message_unselect_all">Отменить выбор</string>
<string name="message_move_to_trash">Перенести в корзину</string>
<string name="message_delete_forever">Удалить навсегда</string>
<string name="message_delete_success">Сообщение успешно удалено</string>
<string name="message_delete_success">Письмо успешно удалено</string>
<string name="message_share">Поделиться</string>
<string name="message_print">Печать</string>
<string name="message_subject">Тема</string>
<string name="message_content">Текст</string>
<string name="message_send_successful">Сообщение успешно отправлено</string>
<string name="message_not_exists">Сообщения не существует</string>
<string name="message_content">Содержание</string>
<string name="message_send_successful">Письмо успешно отправлено</string>
<string name="message_not_exists">Письма не существует</string>
<string name="message_required_recipients">Вы должны выбрать как минимум одного получателя</string>
<string name="message_content_min_length">Текст сообщения должен содержать как минимум 3 знака</string>
<string name="message_chip_only_unread">Только непрочитанные</string>
<string name="message_chip_only_with_attachments">Только с вложениями</string>
<string name="message_read">Чтение: %s</string>
<string name="message_read">Прочитано: %s</string>
<string name="message_read_by">Прочитано: %1$d из %2$d человек</string>
<plurals name="message_number_item">
<item quantity="one">%1$d сообщение</item>
<item quantity="few">%1$d сообщений</item>
<item quantity="few">%1$d сообщения</item>
<item quantity="many">%1$d сообщений</item>
<item quantity="other">%1$d сообщений</item>
</plurals>
@ -317,8 +318,8 @@
<item quantity="many">Новые сообщения</item>
<item quantity="other">Новые сообщения</item>
</plurals>
<string name="message_restore_dialog">Вы хотите восстановить черновичное сообщение?</string>
<string name="message_restore_dialog_with_recipients">Вы хотите восстановить черновик сообщения с получателями: %s?</string>
<string name="message_restore_dialog">Вы хотите восстановить черновик письма?</string>
<string name="message_restore_dialog_with_recipients">Вы хотите восстановить черновик письма с получателями: %s?</string>
<plurals name="message_notify_new_items">
<item quantity="one">Вы получили %1$d новое сообщение</item>
<item quantity="few">Вы получили %1$d новых сообщения</item>
@ -333,7 +334,7 @@
</plurals>
<string name="message_messages_deleted">Сообщение удалено</string>
<!--Note-->
<string name="note_no_items">Нет информации о заметках</string>
<string name="note_no_items">Нет записей о замечаниях и свершениях</string>
<string name="note_points">Баллы</string>
<plurals name="note_number_item">
<item quantity="one">%d предупреждение</item>
@ -344,33 +345,33 @@
<plurals name="note_new_items">
<item quantity="one">Новое предупреждение</item>
<item quantity="few">Новые предупреждения</item>
<item quantity="many">Новых предупреждений</item>
<item quantity="other">Новых предупреждений</item>
<item quantity="many">Новые предупреждения</item>
<item quantity="other">Новые предупреждения</item>
</plurals>
<plurals name="note_notify_new_items">
<item quantity="one">Вы получили %1$d предупреждение</item>
<item quantity="few">Вы получили %1$d предупреждения</item>
<item quantity="many">Вы получили %1$d предупреждений</item>
<item quantity="other">Вы получили %1$d предупреждений</item>
<item quantity="one">Вы получили %1$d новое предупреждение</item>
<item quantity="few">Вы получили %1$d новые предупреждения</item>
<item quantity="many">Вы получили %1$d новых предупреждений</item>
<item quantity="other">Вы получили %1$d новых предупреждений</item>
</plurals>
<!--Praise-->
<plurals name="praise_number_item">
<item quantity="one">%d похвала</item>
<item quantity="few">%d похвала</item>
<item quantity="many">%d похвала</item>
<item quantity="other">%d похвала</item>
<item quantity="few">%d похвалы</item>
<item quantity="many">%d похвал</item>
<item quantity="other">%d похвал</item>
</plurals>
<plurals name="praise_new_items">
<item quantity="one">Новая похвала</item>
<item quantity="few">Новые похвалы</item>
<item quantity="many">Новые свершения</item>
<item quantity="many">Новые похвалы</item>
<item quantity="other">Новые похвалы</item>
</plurals>
<plurals name="praise_notify_new_items">
<item quantity="one">Вы получили %1$d похвалу</item>
<item quantity="few">Вы получили %1$d похвалы</item>
<item quantity="many">Вы получили %1$d похвалы</item>
<item quantity="other">Вы получили %1$d похвалы</item>
<item quantity="one">Вы получили %1$d новую похвалу</item>
<item quantity="few">Вы получили %1$d новые похвалы</item>
<item quantity="many">Вы получили %1$d новых похвал</item>
<item quantity="other">Вы получили %1$d новых похвал</item>
</plurals>
<!--Neutral notes-->
<plurals name="neutral_note_number_item">
@ -386,34 +387,34 @@
<item quantity="other">Новые нейтральные замечания</item>
</plurals>
<plurals name="neutral_note_notify_new_items">
<item quantity="one">Вы получили %1$d нейтральное замечание</item>
<item quantity="few">Вы получили %1$d нейтральных замечания</item>
<item quantity="many">Вы получили %1$d нейтральных замечаний</item>
<item quantity="other">Вы получили %1$d нейтральных замечаний</item>
<item quantity="one">Вы получили %1$d новое нейтральное замечание</item>
<item quantity="few">Вы получили %1$d новые нейтральных замечания</item>
<item quantity="many">Вы получили %1$d новых нейтральных замечаний</item>
<item quantity="other">Вы получили %1$d новых нейтральных замечаний</item>
</plurals>
<!--Homework-->
<string name="homework_no_items">Нет домашних заданий</string>
<string name="homework_mark_as_done">Завершено</string>
<string name="homework_mark_as_undone">Не завершено</string>
<string name="homework_add">Добавить домашнюю работу</string>
<string name="homework_add_success">Домашняя работа успешно добавлена</string>
<string name="homework_delete_success">Домашняя работа успешно удалена</string>
<string name="homework_add">Добавить домашнее задание</string>
<string name="homework_add_success">Домашнее задание успешно добавлена</string>
<string name="homework_delete_success">Домашнее задание успешно удалена</string>
<string name="homework_attachments">Вложения</string>
<plurals name="homework_notify_new_item_title">
<item quantity="one">Новая домашняя работа</item>
<item quantity="few">Новая домашняя работа</item>
<item quantity="many">Новая домашняя работа</item>
<item quantity="other">Новая домашняя работа</item>
<item quantity="one">Новое домашнее задание</item>
<item quantity="few">Новые домашние работы</item>
<item quantity="many">Новые домашние задания</item>
<item quantity="other">Новые домашние задания</item>
</plurals>
<plurals name="homework_notify_new_item_content">
<item quantity="one">Вы получили %d новых домашних заданий</item>
<item quantity="one">Вы получили %d новое домашнее задание</item>
<item quantity="few">Вы получили %d новых домашних заданий</item>
<item quantity="many">Вы получили %d новых домашних заданий</item>
<item quantity="other">Вы получили %d новых домашних заданий</item>
</plurals>
<plurals name="homework_number_item">
<item quantity="one">%d домашних заданий</item>
<item quantity="few">%d домашних заданий</item>
<item quantity="one">%d домашнее задание</item>
<item quantity="few">%d домашних задания</item>
<item quantity="many">%d домашних заданий</item>
<item quantity="other">%d домашних заданий</item>
</plurals>
@ -422,15 +423,15 @@
<string name="lucky_number_header">Сегодняшний счастливый номер это</string>
<string name="lucky_number_empty">Нет данных о счастливом номере</string>
<string name="lucky_number_notify_new_item_title">Сегодняшний счастливый номер</string>
<string name="lucky_number_notify_new_item">Сегодняшний номер удачи: %s</string>
<string name="lucky_number_notify_new_item">Сегодняшний счастливый номер: %s</string>
<string name="lucky_number_history_button">Показать историю</string>
<!--Lucky number history-->
<string name="lucky_number_history_title">История удачных чисел</string>
<string name="lucky_number_history_empty">Нет информации о номерах удачи</string>
<string name="lucky_number_history_title">История счастливых номеров</string>
<string name="lucky_number_history_empty">Нет информации о счастливых номерах</string>
<!--Mobile devices-->
<string name="mobile_devices_title">Мобильные устройства</string>
<string name="mobile_devices_no_items">Нет устройств</string>
<string name="mobile_devices_unregister">Отменить регистрацию</string>
<string name="mobile_devices_unregister">Удалить</string>
<string name="mobile_device_removed">Устройство удалено</string>
<string name="mobile_device_qr">QR-код</string>
<string name="mobile_device_token">Token</string>
@ -456,45 +457,45 @@
<string name="conferences_title">Встречи</string>
<string name="conference_no_items">Нет информации о встречах</string>
<plurals name="conference_number_item">
<item quantity="one">%d конференция</item>
<item quantity="few">%d конференция</item>
<item quantity="many">%d конференция</item>
<item quantity="other">%d конференций</item>
<item quantity="one">%d встреча</item>
<item quantity="few">%d встречи</item>
<item quantity="many">%d встреч</item>
<item quantity="other">%d встреч</item>
</plurals>
<plurals name="conference_notify_new_item_title">
<item quantity="one">Новая конференция</item>
<item quantity="few">Новая конференция</item>
<item quantity="many">Новая конференция</item>
<item quantity="other">Новые конференции</item>
<item quantity="one">Новая встреча</item>
<item quantity="few">Новые встречи</item>
<item quantity="many">Новые встречи</item>
<item quantity="other">Новые встречи</item>
</plurals>
<plurals name="conference_notify_new_items">
<item quantity="one">У вас %1$d новая конференция</item>
<item quantity="few">У вас %1$d новая конференция</item>
<item quantity="many">У вас %1$d новая конференция</item>
<item quantity="other">У вас %1$d новых конференций</item>
<item quantity="one">У вас %1$d новая встреча</item>
<item quantity="few">У вас %1$d новые встречи</item>
<item quantity="many">У вас %1$d новых встреч</item>
<item quantity="other">У вас %1$d новых встреч</item>
</plurals>
<string name="conferences_present">Присутствует на конференции</string>
<string name="conferences_present">Присутствует на встрече</string>
<string name="conference_agenda">Повестка дня</string>
<!--Director information-->
<string name="school_announcement_title">Объявления школ</string>
<string name="school_announcement_no_items">Нет объявлений о школе</string>
<string name="school_announcement_title">Объявления школы</string>
<string name="school_announcement_no_items">Нет школьных объявлений</string>
<plurals name="school_announcement_number_item">
<item quantity="one">Объявление о школе %d</item>
<item quantity="few">Объявление о школе %d</item>
<item quantity="many">Объявление о школе %d</item>
<item quantity="other">Объявления школы %d</item>
<item quantity="one">%d школьное объявление</item>
<item quantity="few">%d школьных объявления</item>
<item quantity="many">%d школьных объявлений</item>
<item quantity="other">%d школьных объявлений</item>
</plurals>
<plurals name="school_announcement_notify_new_item_title">
<item quantity="one">Объявление о новой школе</item>
<item quantity="few">Объявление о новой школе</item>
<item quantity="many">Объявление о новой школе</item>
<item quantity="other">Объявления о новых школах</item>
<item quantity="one">Новое школьное объявление</item>
<item quantity="few">Новые школьные объявления</item>
<item quantity="many">Новые школьные объявления</item>
<item quantity="other">Новые школьные объявления</item>
</plurals>
<plurals name="school_announcement_notify_new_items">
<item quantity="one">У вас %1$d объявление о новой школе</item>
<item quantity="few">У вас %1$d объявление о новой школе</item>
<item quantity="many">У тебя %1$d новых школьных объявлений</item>
<item quantity="other">У тебя %1$d новых школьных объявлений</item>
<item quantity="one">У вас %1$d новое школьное объявление</item>
<item quantity="few">У вас %1$d новые школьных объявления</item>
<item quantity="many">У вас %1$d новых школьных объявлений</item>
<item quantity="other">У вас %1$d новых школьных объявлений</item>
</plurals>
<!--Account-->
<string name="account_add_new">Добавить аккаунт</string>
@ -504,29 +505,29 @@
<string name="account_type_student">Профиль ученика</string>
<string name="account_type_parent">Профиль родителя</string>
<string name="account_details_edit">Изменить данные</string>
<string name="account_quick_manager">Менеджер аккаунтов</string>
<string name="account_select_student">Выберите Студента</string>
<string name="account_quick_manager">Управлять аккаунтами</string>
<string name="account_select_student">Выбрать ученика</string>
<string name="account_family">Семья</string>
<string name="account_contact">Контакт</string>
<string name="account_address">Детали проживания</string>
<string name="account_personal_data">Персональные данные</string>
<string name="account_contact">Контакты</string>
<string name="account_address">Места жительства</string>
<string name="account_personal_data">Личная информация</string>
<!--About-->
<string name="about_version">Версия приложения</string>
<string name="about_contributor">Разработчики</string>
<string name="about_contributor_summary">Список разработчиков \"Вулкановый\"</string>
<string name="about_contributor_summary">Список разработчиков приложения</string>
<string name="about_feedback">Возникла ошибка?</string>
<string name="about_feedback_summary">Сообщить о ошибке</string>
<string name="about_faq">FAQ</string>
<string name="about_faq_summary">Часто задаваемые вопросы</string>
<string name="about_discord">Сервер Discord</string>
<string name="about_discord_summary">Присоединиться к сообществу приложения</string>
<string name="about_facebook">Facebook фан-страница</string>
<string name="about_twitter">Странница в твиттере</string>
<string name="about_twitter_summary">Подпишись на нас в твиттере</string>
<string name="about_facebook_summary">Поставьте лайк на нашей странице в Facebook</string>
<string name="about_privacy">Политика приватности</string>
<string name="about_facebook">Страница в Facebook</string>
<string name="about_twitter">Страница в Twitter</string>
<string name="about_twitter_summary">Следите за нами в Twitter</string>
<string name="about_facebook_summary">Лайкните нас в Facebook</string>
<string name="about_privacy">Политика конфиденциальности</string>
<string name="about_privacy_summary">Правила хранения личных данных</string>
<string name="about_system">Параметры системы</string>
<string name="about_system">Системные настройки</string>
<string name="about_system_summary">Открыть системные настройки</string>
<string name="about_homepage">Домашняя страница</string>
<string name="about_homepage_summary">Помочь в развитии приложения</string>
@ -540,23 +541,23 @@
<!--Student info-->
<string name="student_info_empty">Нет информации об ученике или семье ученика</string>
<string name="student_info_first_name">Имя</string>
<string name="student_info_second_name">Фамилия</string>
<string name="student_info_second_name">Второе имя</string>
<string name="student_info_gender">Пол</string>
<string name="student_info_polish_citizenship">Польское гражданство</string>
<string name="student_info_family_name">Фамилия</string>
<string name="student_info_family_name">Девичья фамилия</string>
<string name="student_info_parents_name">Имена матери и отца</string>
<string name="student_info_phone">Телефон</string>
<string name="student_info_phone">Домашний телефон</string>
<string name="student_info_cellphone">Сотовый телефон</string>
<string name="student_info_email">Эл. почта</string>
<string name="student_info_email">E-mail</string>
<string name="student_info_address">Адрес проживания</string>
<string name="student_info_registered_address">Адрес регистрации</string>
<string name="student_info_correspondence_address">Адрес переписки</string>
<string name="student_info_registered_address">Адрес прописки</string>
<string name="student_info_correspondence_address">Почтовый адрес</string>
<string name="student_info_full_name">Фамилия и имя</string>
<string name="student_info_kinship">Степень родства</string>
<string name="student_info_guardian_address">Адрес</string>
<string name="student_info_phones">Телефоны</string>
<string name="student_info_male">Муж</string>
<string name="student_info_female">Женская</string>
<string name="student_info_phones">Номера телефонов</string>
<string name="student_info_male">Мужской</string>
<string name="student_info_female">Женский</string>
<string name="student_info_last_name">Фамилия</string>
<string name="student_info_guardian">Опекун</string>
<!--Account edit-->
@ -564,7 +565,7 @@
<string name="account_edit_header">Добавить ник</string>
<string name="account_edit_avatar_title">Выберите цвет аватара</string>
<!--Log viewer-->
<string name="logviewer_share">Поделиться логами</string>
<string name="logviewer_share">Отправить логи</string>
<string name="logviewer_refresh">Обновить</string>
<!--Dashboard-->
<string name="dashboard_timetable_title">Уроки</string>
@ -578,20 +579,20 @@
<string name="dashboard_timetable_second_lessons_title">Далее:</string>
<string name="dashboard_timetable_third_title">Позднее:</string>
<plurals name="dashboard_timetable_third_value">
<item quantity="one">Еще %1$d урок</item>
<item quantity="few">Еще %1$d урок</item>
<item quantity="many">Еще %1$d урок</item>
<item quantity="other">Ещё %1$d уроков</item>
<item quantity="one">ещё %1$d урок</item>
<item quantity="few">ещё %1$d урока</item>
<item quantity="many">ещё %1$d уроков</item>
<item quantity="other">ещё %1$d уроков</item>
</plurals>
<string name="dashboard_timetable_third_time">до %1$s</string>
<string name="dashboard_timetable_no_lessons">Нет предстоящих занятий</string>
<string name="dashboard_timetable_error">Произошла ошибка при загрузке уроков</string>
<string name="dashboard_homework_title">Домашняя работа</string>
<string name="dashboard_homework_title">Домашнее задание</string>
<string name="dashboard_homework_no_homework">Нет домашних заданий</string>
<string name="dashboard_homework_error">Произошла ошибка при загрузке домашнего задания</string>
<plurals name="dashboard_homework_more">
<item quantity="one">Ещё %1$d домашних заданий</item>
<item quantity="few">Ещё %1$d домашних заданий</item>
<item quantity="one">Ещё %1$d домашнее задание</item>
<item quantity="few">Ещё %1$d домашних задания</item>
<item quantity="many">Ещё %1$d домашних заданий</item>
<item quantity="other">Ещё %1$d домашних заданий</item>
</plurals>
@ -599,32 +600,32 @@
<string name="dashboard_grade_title">Последние оценки</string>
<string name="dashboard_grade_no_grade">Нет новых оценок</string>
<string name="dashboard_grade_error">Произошла ошибка при загрузке оценок</string>
<string name="dashboard_announcements_title">Объявления школ</string>
<string name="dashboard_announcements_no_announcements">Нет текущих объявлений</string>
<string name="dashboard_announcements_title">Школьные объявления</string>
<string name="dashboard_announcements_no_announcements">Нет объявлений</string>
<string name="dashboard_announcements_error">Произошла ошибка при загрузке объявлений</string>
<plurals name="dashboard_announcements_more">
<item quantity="one">Ещё %1$d объявление</item>
<item quantity="few">Ещё %1$d объявление</item>
<item quantity="many">Ещё %1$d объявление</item>
<item quantity="other">Ещё %1$d объявлений</item>
<item quantity="one">ещё %1$d объявление</item>
<item quantity="few">ещё %1$d объявления</item>
<item quantity="many">ещё %1$d объявлений</item>
<item quantity="other">ещё %1$d объявлений</item>
</plurals>
<string name="dashboard_exams_title">Экзамены</string>
<string name="dashboard_exams_no_exams">Нет предстоящих экзаменов</string>
<string name="dashboard_exams_error">Произошла ошибка при загрузке экзамена</string>
<string name="dashboard_exams_title">Тесты</string>
<string name="dashboard_exams_no_exams">Нет предстоящих тестов</string>
<string name="dashboard_exams_error">Произошла ошибка при загрузке тестов</string>
<plurals name="dashboard_exams_more">
<item quantity="one">Еще %1$d экзамен</item>
<item quantity="few">Еще %1$d экзамен</item>
<item quantity="many">Еще %1$d экзамен</item>
<item quantity="other">ещё %1$d экзаменов</item>
<item quantity="one">ещё %1$d тест</item>
<item quantity="few">ещё %1$d теста</item>
<item quantity="many">ещё %1$d тестов</item>
<item quantity="other">ещё %1$d тестов</item>
</plurals>
<string name="dashboard_conferences_title">Конференции</string>
<string name="dashboard_conferences_no_conferences">Нет предстоящих конференций</string>
<string name="dashboard_conferences_error">Произошла ошибка при загрузке конференций</string>
<string name="dashboard_conferences_title">Встречи</string>
<string name="dashboard_conferences_no_conferences">Нет предстоящих встреч</string>
<string name="dashboard_conferences_error">Произошла ошибка при загрузке встреч</string>
<plurals name="dashboard_conference_more">
<item quantity="one">Еще %1$d конференция</item>
<item quantity="few">Еще %1$d конференция</item>
<item quantity="many">Еще %1$d конференция</item>
<item quantity="other">Еще %1$d конференций</item>
<item quantity="one">еще %1$d встреча</item>
<item quantity="few">еще %1$d встречи</item>
<item quantity="many">еще %1$d встреч</item>
<item quantity="other">еще %1$d встреч</item>
</plurals>
<string name="dashboard_horizontal_group_error">Произошла ошибка при загрузке данных</string>
<string name="dashboard_horizontal_group_no_data">Отсутствует</string>
@ -667,96 +668,96 @@
<!--Preferences-->
<string name="pref_view_header">Приложение</string>
<string name="pref_view_list">Окно по умолчанию</string>
<string name="pref_view_grade_average_mode">Рассчитанные средние параметры</string>
<string name="pref_view_grade_average_mode">Параметры расчёта средних оценок</string>
<string name="pref_view_grade_average_force_calc">Принудительно высчитать среднюю оценку через приложение</string>
<string name="pref_view_present">Показать присутствие</string>
<string name="pref_view_present">Показывать присутствия</string>
<string name="pref_view_app_theme">Тема</string>
<string name="pref_view_expand_grade">Расширяется оценка</string>
<string name="pref_view_expand_grade">Разворачивание оценок</string>
<string name="pref_view_timetable_show_timers">Отметить текущий урок</string>
<string name="pref_view_timetable_show_groups">Показать группы рядом с темами</string>
<string name="pref_view_grade_statistics_list">Показывать диаграммы в оценках класса</string>
<string name="pref_view_subjects_without_grades">Показать предметы без оценок</string>
<string name="pref_view_grade_color_scheme">Схема цветов оценок</string>
<string name="pref_view_grade_color_scheme">Цветовая схема оценок</string>
<string name="pref_view_grade_sorting_mode">Сортировка уроков</string>
<string name="pref_view_app_language">Язык</string>
<string name="pref_notify_header">Уведомления</string>
<string name="pref_notify_header_other">Прочее</string>
<string name="pref_notify_switch">Показывать уведомления</string>
<string name="pref_notify_upcoming_lessons_switch">Показывать уведомления о будущих уроках</string>
<string name="pref_notify_upcoming_lessons_persistent_switch">Сделать уведомления о предстоящем уроке постоянным</string>
<string name="pref_notify_upcoming_lessons_persistent_summary">Выключить, когда уведомление не отображается в чата/полосе</string>
<string name="pref_notify_open_system_settings">Открыть настройки уведомлений системы</string>
<string name="pref_notify_upcoming_lessons_switch">Показывать уведомления о предстоящих уроках</string>
<string name="pref_notify_upcoming_lessons_persistent_switch">Сделать уведомление о предстоящем уроке постоянным</string>
<string name="pref_notify_upcoming_lessons_persistent_summary">Выключите, если уведомление не отображается на умных часах</string>
<string name="pref_notify_open_system_settings">Открыть системные настройки уведомлений</string>
<string name="pref_notify_fix_sync_issues">Исправить проблемы с синхронизацией и уведомлениями</string>
<string name="pref_notify_fix_sync_issues_message">На вашем устройстве могут быть проблемы с синхронизацией данных и уведомлениями.\n\nЧтобы их исправить, вам необходимо добавить Wulkanowy в авто-старт и выключить оптимизацию/экономию батареи в настройках устройства.</string>
<string name="pref_notify_debug_switch">Показывать дебаг-уведомления</string>
<string name="pref_notify_debug_switch">Показывать отладочные уведомления</string>
<string name="pref_notify_disabled_summary">Синхронизация отключена</string>
<string name="pref_notify_notifications_piggyback_header">Официальные уведомления приложения</string>
<string name="pref_notify_notifications_piggyback">Записывать официальные уведомления</string>
<string name="pref_notify_notifications_piggyback_header">Уведомления официального приложения</string>
<string name="pref_notify_notifications_piggyback">Захватывать уведомления официального приложения</string>
<string name="pref_notify_notifications_piggyback_cancel_original">Удалить уведомления от официального приложения после захвата</string>
<string name="pref_notification_piggyback_popup_title">Показывать push-уведомления</string>
<string name="pref_notification_piggyback_popup_description">С помощью этой функции вы можете получить замену push-уведомлений, как в официальном приложении. Все, что вам нужно сделать, это разрешить Wulkanowy получать все уведомления в настройках системы.\n\nКак это работает?\nКогда вы получаете уведомление в Dziennik VULCAN, Wulkanowy будет уведомлен (это требует дополнительных прав) и запустит синхронизацию, чтобы отправить свое уведомление.\n\nТОЛЬКО ДЛЯ ПОЛЬЗОВАТЕЛЯ</string>
<string name="pref_notification_exact_alarm_popup_title">Показывать уведомления о будущих уроках</string>
<string name="pref_notification_exact_alarm_popup_descriptions">Вы должны разрешить приложению Wulkanowy установить будильник и напоминания в настройках системы, чтобы использовать эту функцию.</string>
<string name="pref_notification_piggyback_popup_title">Захват уведомлений</string>
<string name="pref_notification_piggyback_popup_description">С помощью этой функции вы можете получить аналог push-уведомлений из официального приложения. Все, что вам нужно сделать, это разрешить Wulkanowy получать все уведомления в настройках системы.\n\nКак это работает?\nКогда вы получаете уведомление в Dziennik VULCAN, Wulkanowy будет уведомлен (для этого и нужны дополнительные разрешения) и запустит синхронизацию, чтобы отправить свое уведомление.\n\nТОЛЬКО ДЛЯ ПРОДВИНУТЫХ ПОЛЬЗОВАТЕЛЕЙ</string>
<string name="pref_notification_exact_alarm_popup_title">Показывать уведомления о предстоящих уроках</string>
<string name="pref_notification_exact_alarm_popup_descriptions">Вы должны разрешить Wulkanowy устанавливать будильник и напоминания в настройках системы, чтобы использовать эту функцию.</string>
<string name="pref_notification_go_to_settings">Перейти к настройкам</string>
<string name="pref_services_header">Синхронизация</string>
<string name="pref_services_switch">Автоматическая синхронизация</string>
<string name="pref_services_suspended">Приостановить синхронизации во время каникул</string>
<string name="pref_services_suspended">Приостановлена во время каникул</string>
<string name="pref_services_interval">Интервал синхронизации</string>
<string name="pref_services_wifi">Только через Wi-Fi</string>
<string name="pref_services_force_sync">Синхронизировать</string>
<string name="pref_services_message_sync_success">Синхронизировано!</string>
<string name="pref_services_message_sync_failed">Синхронизация не удалась</string>
<string name="pref_services_sync_in_progress">Идёт синхронизация</string>
<string name="pref_services_sync_in_progress">Синхронизация...</string>
<string name="pref_services_last_full_sync_date">Последняя полная синхронизация: %s</string>
<string name="pref_other_grade_modifier_plus">Стоимость плюса</string>
<string name="pref_other_grade_modifier_minus">Стоимость минуса</string>
<string name="pref_other_fill_message_content">Отвечать с историей сообщений</string>
<string name="pref_other_optional_arithmetic_average">Показывать среднее арифметическое при отсутствии весов</string>
<string name="pref_other_optional_arithmetic_average">Показывать среднее арифметическое при отсутствии стоимости</string>
<string name="pref_ads_support_category_name">Поддержка</string>
<string name="pref_ads_support">Смотреть одиночную рекламу для поддержки проекта</string>
<string name="pref_ads_support">Посмотреть рекламу для поддержки проекта</string>
<string name="pref_ads_privacy_title">Согласие на обработку данных</string>
<string name="pref_ads_privacy_description">Для просмотра рекламы вы должны согласиться с условиями обработки данных нашей Политики конфиденциальности</string>
<string name="pref_ads_privacy_agree">Согласен</string>
<string name="pref_ads_privacy_agree">Согласиться</string>
<string name="pref_ads_privacy_link">Политика конфиденциальности</string>
<string name="pref_ads_loading">Объявление загружается</string>
<string name="pref_ads_loading">Реклама загружается</string>
<string name="pref_ads_once_per_visit">Спасибо за вашу поддержку, возвращайтесь позже для дополнительной рекламы</string>
<string name="pref_settings_advanced_title">Расширенные</string>
<string name="pref_settings_appearance_title">Внешний вид &amp; Поведение</string>
<string name="pref_settings_appearance_title">Внешний вид и поведение</string>
<string name="pref_settings_notifications_title">Уведомления</string>
<string name="pref_settings_sync_title">Синхронизация</string>
<string name="pref_settings_ads_title">Реклама</string>
<string name="pref_grades_appearance_header">Оценки</string>
<string name="pref_dashboard_appearance_header">Панель</string>
<string name="pref_dashboard_appearance_header">Главная</string>
<string name="pref_dashboard_appearance_tiles_title">Видимость плиток</string>
<string name="pref_attendance_appearance_view">Посещаемость</string>
<string name="pref_timetable_appearance_view">Расписание</string>
<string name="pref_grades_advanced_header">Оценки</string>
<string name="pref_counted_average_advanced_header">Расчетное среднее</string>
<string name="pref_counted_average_advanced_header">Рассчитанная средняя оценка</string>
<string name="pref_messages_advanced_header">Сообщения</string>
<string name="pref_appearance_category">Внешний вид &amp; Поведение</string>
<string name="pref_appearance_category_summary">Языки, темы, темы сортировки темы</string>
<string name="pref_notifications_category_summary">Уведомления приложений, проблемы с устранением</string>
<string name="pref_appearance_category">Внешний вид и поведение</string>
<string name="pref_appearance_category_summary">Язык, тема, сортировка предметов</string>
<string name="pref_notifications_category_summary">Настройки уведомлений приложения</string>
<string name="pref_notifications_category">Уведомления</string>
<string name="pref_sync_category">Синхронизация</string>
<string name="pref_sync_category_summary">Автоматическое обновление, интервал синхронизации</string>
<string name="pref_advanced_category_summary">Значения плюс и минус, средний расчет</string>
<string name="pref_sync_category_summary">Автоматическая синхронизация и её интервал</string>
<string name="pref_advanced_category_summary">Значения плюса и минуса, расчёт средней оценки</string>
<string name="pref_advanced_category">Расширенные</string>
<string name="pref_about_category_summary">Версия приложения, участники, социальные порталы</string>
<string name="pref_ads_category_summary">Отображение объявлений, поддержка проекта</string>
<string name="pref_about_category_summary">Версия приложения, разработчики, соц. сети</string>
<string name="pref_ads_category_summary">Посмотреть рекламу, чтобы поддержать преокт</string>
<!--Notification Channels-->
<string name="channel_new_grades">Новые оценки</string>
<string name="channel_new_homework">Новая домашняя работа</string>
<string name="channel_new_conference">Новые конференции</string>
<string name="channel_new_exam">Новые экзамены</string>
<string name="channel_new_homework">Новое домашнее задание</string>
<string name="channel_new_conference">Новые встречи</string>
<string name="channel_new_exam">Новые тесты</string>
<string name="channel_lucky_number">Счастливый номер</string>
<string name="channel_new_message">Новые сообщения</string>
<string name="channel_new_notes">Новые заметки</string>
<string name="channel_new_school_announcement">Объявления о новых школах</string>
<string name="channel_push">Показывать push-уведомления</string>
<string name="channel_upcoming_lessons">Будущие уроки</string>
<string name="channel_debug">Дебаг</string>
<string name="channel_change_timetable">Изменение расписания</string>
<string name="channel_new_attendance">Новое посещение</string>
<string name="channel_new_message">Новые письма</string>
<string name="channel_new_notes">Новые замечания</string>
<string name="channel_new_school_announcement">Новые школьные объявления</string>
<string name="channel_push">Push-уведомления</string>
<string name="channel_upcoming_lessons">Предстоящие уроки</string>
<string name="channel_debug">Отладка</string>
<string name="channel_change_timetable">Изменения в расписании</string>
<string name="channel_new_attendance">Новая запись о посещаемости</string>
<!--Colors-->
<string name="all_black">Чёрный</string>
<string name="all_red">Красный</string>
@ -770,16 +771,16 @@
<string name="update_download_success_button">Перезапустить</string>
<string name="update_failed">Не удалось обновить! Wulkanowy может работать некорректно. Рассмотрите возможность обновления</string>
<!--Errors-->
<string name="error_no_internet">Нет интернет-подключения</string>
<string name="error_invalid_device_datetime">Произошла ошибка. Проверьте часы вашего устройства</string>
<string name="error_timeout">Не удалось подключиться к регистрации. Серверы могут быть перегружены. Пожалуйста, повторите попытку позже</string>
<string name="error_login_failed">Не удалось загрузить данные. Пожалуйста, повторите попытку позже</string>
<string name="error_password_change_required">Необходимо изменить пароль реестра</string>
<string name="error_service_unavailable">Технический перерыв в журнале UONET + продолжается. Попробуйте позже</string>
<string name="error_unknown_uonet">Неизвестная ошибка UONET + регистр. Попробуйте позже</string>
<string name="error_unknown_app">Неизвестная ошибка приложения. Пожалуйста, повторите попытку позже</string>
<string name="error_unknown">Произошла неожиданная ошибка</string>
<string name="error_feature_disabled">Функция была выключена школой</string>
<string name="error_feature_not_available">Функция не доступна в этом режиме</string>
<string name="error_field_required">Это поле является обязательным</string>
<string name="error_no_internet">Интернет-соединение отсутствует</string>
<string name="error_invalid_device_datetime">Произошла ошибка. Проверьте время на вашем устройстве</string>
<string name="error_timeout">Не удалось подключиться к дневнику. Возможно, сервера перегружены, повторите попытку позже</string>
<string name="error_login_failed">Не удалось загрузить данные, повторите попытку позже</string>
<string name="error_password_change_required">Необходимо изменить пароль дневника</string>
<string name="error_service_unavailable">UONET+ проводит техническое обслуживание, повторите попытку позже</string>
<string name="error_unknown_uonet">Неизвестная ошибка дневника UONET+, повторите попытку позже</string>
<string name="error_unknown_app">Неизвестная ошибка приложения, повторите попытку позже</string>
<string name="error_unknown">Произошла непредвиденная ошибка</string>
<string name="error_feature_disabled">Функция отключена вашей школой</string>
<string name="error_feature_not_available">Функция недоступна в режиме Mobile API. Воспользуйтесь другим режимом</string>
<string name="error_field_required">Это поле обязательно</string>
</resources>

View File

@ -71,6 +71,7 @@
<string name="login_recover_title">Obnovte svoj účet</string>
<string name="login_recover">Obnoviť</string>
<string name="login_signed_in">Žiak je už prihlásený</string>
<string name="login_host_standard">Štandardná</string>
<!--Main-->
<string name="main_account_picker">Manažér účtov</string>
<string name="main_log_in">Prihlásiť sa</string>

View File

@ -41,24 +41,24 @@
<item>Кольори оцінок в щоденнику</item>
</string-array>
<string-array name="default_expand_grade_entries">
<item>Раз до 1</item>
<item>Завжди розгорнутий</item>
<item>Необмежена кількість розширень</item>
<item>До 1 за раз</item>
<item>Завжди розгорнуті</item>
<item>Необмежена кількість розгортань</item>
</string-array>
<string-array name="grade_average_mode_entries">
<item>Середні оцінки тільки від обраного семестру</item>
<item>Середнє значення для обох семестів</item>
<item>Середнє оцінювання за весь рік</item>
<item>Середні оцінки тільки за обраний семестр</item>
<item>Середнє значення з обох семестрів</item>
<item>Середня оцінка з цілого року</item>
</string-array>
<string-array name="dashboard_tile_entries">
<item>Щасливий номер</item>
<item>Непрочитані повідомлення</item>
<item>Непрочитані листи</item>
<item>Відвідуваність</item>
<item>Уроки</item>
<item>Оцінки</item>
<item>Домашні завдання</item>
<item>Оголошення школи</item>
<item>Тести</item>
<item>Конференції</item>
<item>Зустрічі</item>
</string-array>
</resources>

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="MissingTranslation">
<string-array name="hosts_keys">
<item>Standardowa</item>
<item>@string/login_host_standard</item>
<item>Opolska eSzkoła</item>
<item>Gdańska Platforma Edukacyjna</item>
<item>Lubelski Portal Oświatowy</item>

View File

@ -77,6 +77,7 @@
<string name="login_recover_title">Recover your account</string>
<string name="login_recover">Recover</string>
<string name="login_signed_in">Student is already signed in</string>
<string name="login_host_standard">Standard</string>
<!--Main-->

View File

@ -5,13 +5,9 @@ import io.github.wulkanowy.data.repositories.StudentRepository
import io.github.wulkanowy.services.sync.SyncManager
import io.github.wulkanowy.ui.base.ErrorHandler
import io.github.wulkanowy.utils.AnalyticsHelper
import io.mockk.MockKAnnotations
import io.mockk.Runs
import io.mockk.clearMocks
import io.mockk.every
import io.mockk.*
import io.mockk.impl.annotations.MockK
import io.mockk.just
import io.mockk.verify
import kotlinx.serialization.json.Json
import org.junit.Before
import org.junit.Test
@ -43,8 +39,14 @@ class MainPresenterTest {
clearMocks(mainView)
every { mainView.initView(any(), any()) } just Runs
presenter =
MainPresenter(errorHandler, studentRepository, prefRepository, syncManager, analytics)
presenter = MainPresenter(
errorHandler = errorHandler,
studentRepository = studentRepository,
prefRepository = prefRepository,
syncManager = syncManager,
analytics = analytics,
json = Json
)
presenter.onAttachView(mainView, null)
}

View File

@ -7,6 +7,7 @@ import io.mockk.MockKAnnotations
import io.mockk.coEvery
import io.mockk.impl.annotations.MockK
import io.mockk.verify
import kotlinx.serialization.json.Json
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@ -30,7 +31,7 @@ class SplashPresenterTest {
@Before
fun setUp() {
MockKAnnotations.init(this)
presenter = SplashPresenter(errorHandler, studentRepository)
presenter = SplashPresenter(errorHandler, studentRepository, Json)
}
@Test

View File

@ -1,8 +1,8 @@
buildscript {
ext {
kotlin_version = '1.6.10'
about_libraries = '8.9.4'
hilt_version = "2.41"
kotlin_version = '1.6.21'
about_libraries = '10.2.0'
hilt_version = "2.42"
}
repositories {
mavenCentral()
@ -13,10 +13,10 @@ buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
classpath 'com.android.tools.build:gradle:7.1.2'
classpath 'com.android.tools.build:gradle:7.1.3'
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
classpath 'com.google.gms:google-services:4.3.10'
classpath 'com.huawei.agconnect:agcp:1.6.5.200'
classpath 'com.huawei.agconnect:agcp:1.6.6.200'
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.8.1'
classpath "com.github.triplet.gradle:play-publisher:3.6.0"
classpath "ru.cian:huawei-publish-gradle-plugin:1.3.3"