diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 806288a1a..a81b333f3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -68,3 +68,135 @@ jobs: PLAY_SERVICE_ACCOUNT_EMAIL: ${{ secrets.PLAY_SERVICE_ACCOUNT_EMAIL }} PLAY_STORE_PASSWORD: ${{ secrets.PLAY_STORE_PASSWORD }} run: ./gradlew publishPlayRelease -PenableFirebase --stacktrace; + + deploy-appcenter: + name: Deploy to App Center + runs-on: ubuntu-latest + timeout-minutes: 10 + environment: app-center + if: github.ref != 'refs/heads/develop' + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: 11 + - uses: actions/cache@v2 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*') }} + - name: Set run number with offset + env: + BUILD_NUMBER_OFFSET: ${{ secrets.BUILD_NUMBER_OFFSET }} + run: echo "RUN_NUMBER=$((GITHUB_RUN_NUMBER+BUILD_NUMBER_OFFSET))" >> $GITHUB_ENV + - name: Prepare build configuration + run: | + sed -i -e "s#applicationIdSuffix \".dev\"#applicationIdSuffix \".${GITHUB_HEAD_REF//[-.\/]/_}\"#" app/build.gradle + sed -i -e "s#.dev\"#.${GITHUB_HEAD_REF//[-.\/]/_}\"#" app/src/debug/google-services.json + sed -i -e "s#.dev\"#.${GITHUB_HEAD_REF//[-.\/]/_}\"#" app/src/debug/agconnect-services.json + sed -i -e '/versionNameSuffix/d' app/build.gradle + - name: Add signing config + run: | + cat >> app/build.gradle <> $GITHUB_ENV + - name: Add signing config + run: | + cat >> app/build.gradle <; -} +-keep class com.google.android.material.tabs.** { *; } \ No newline at end of file diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt index 00d5aae87..cb718c724 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceFragment.kt @@ -192,7 +192,7 @@ class AttendanceFragment : BaseFragment(R.layout.frag } override fun showContent(show: Boolean) { - binding. attendanceRecycler.visibility = if (show) VISIBLE else GONE + binding.attendanceRecycler.visibility = if (show) VISIBLE else GONE } override fun showRefresh(show: Boolean) { diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt index 68802c0c7..b03db91af 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendancePresenter.kt @@ -190,35 +190,48 @@ class AttendancePresenter @Inject constructor( flowWithResourceIn { val student = studentRepository.getCurrentStudent() val semester = semesterRepository.getCurrentSemester(student) - attendanceRepository.getAttendance(student, semester, currentDate, currentDate, forceRefresh) + attendanceRepository.getAttendance( + student, + semester, + currentDate, + currentDate, + forceRefresh + ) }.onEach { when (it.status) { Status.LOADING -> { view?.showExcuseButton(false) if (!it.data.isNullOrEmpty()) { + val filteredAttendance = if (prefRepository.isShowPresent) { + it.data + } else { + it.data.filter { item -> !item.presence } + } + view?.run { enableSwipe(true) showRefresh(true) showProgress(false) - showContent(true) - updateData(it.data.let { items -> - if (prefRepository.isShowPresent) items - else items.filter { item -> !item.presence } - }.sortedBy { item -> item.number }) + showEmpty(filteredAttendance.isEmpty()) + showContent(filteredAttendance.isNotEmpty()) + updateData(filteredAttendance.sortedBy { item -> item.number }) } } } Status.SUCCESS -> { Timber.i("Loading attendance result: Success") + val filteredAttendance = if (prefRepository.isShowPresent) { + it.data.orEmpty() + } else { + it.data?.filter { item -> !item.presence }.orEmpty() + } + view?.apply { - updateData(it.data!!.let { items -> - if (prefRepository.isShowPresent) items - else items.filter { item -> !item.presence } - }.sortedBy { item -> item.number }) - showEmpty(it.data.isEmpty()) + updateData(filteredAttendance.sortedBy { item -> item.number }) + showEmpty(filteredAttendance.isEmpty()) showErrorView(false) - showContent(it.data.isNotEmpty()) - showExcuseButton(it.data.any { item -> item.excusable }) + showContent(filteredAttendance.isNotEmpty()) + showExcuseButton(filteredAttendance.any { item -> item.excusable }) } analytics.logEvent( "load_data", diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt index 06b3e9316..b3ef3037a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeFragment.kt @@ -10,6 +10,7 @@ import android.view.View.VISIBLE import androidx.appcompat.app.AlertDialog import dagger.hilt.android.AndroidEntryPoint import io.github.wulkanowy.R +import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.databinding.FragmentGradeBinding import io.github.wulkanowy.ui.base.BaseFragment import io.github.wulkanowy.ui.base.BaseFragmentPagerAdapter @@ -121,11 +122,9 @@ class GradeFragment : BaseFragment(R.layout.fragment_grade semesterSwitchMenu?.isVisible = show } - override fun showSemesterDialog(selectedIndex: Int) { - val choices = arrayOf( - getString(R.string.grade_semester, 1), - getString(R.string.grade_semester, 2) - ) + override fun showSemesterDialog(selectedIndex: Int, semesters: List) { + val choices = semesters.map { getString(R.string.grade_semester, it.semesterName) } + .toTypedArray() AlertDialog.Builder(requireContext()) .setSingleChoiceItems(choices, selectedIndex) { dialog, which -> diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt index bfc504d2c..c467c421e 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradePresenter.kt @@ -49,7 +49,9 @@ class GradePresenter @Inject constructor( } fun onSemesterSwitch(): Boolean { - if (semesters.isNotEmpty()) view?.showSemesterDialog(selectedIndex - 1) + if (semesters.isNotEmpty()) { + view?.showSemesterDialog(selectedIndex - 1, semesters.slice(0..1)) + } return true } @@ -137,11 +139,17 @@ class GradePresenter @Inject constructor( private fun loadChild(index: Int, forceRefresh: Boolean = false) { Timber.d("Load grade tab child. Selected semester: $selectedIndex, semesters: ${semesters.joinToString { it.semesterName.toString() }}") - semesters.first { it.semesterName == selectedIndex }.semesterId.also { - if (forceRefresh || loadedSemesterId[index] != it) { - Timber.i("Load grade child view index: $index") - view?.notifyChildLoadData(index, it, forceRefresh) - } + + val newSelectedSemesterId = try { + semesters.first { it.semesterName == selectedIndex }.semesterId + } catch (e: NoSuchElementException) { + Timber.e(e, "Selected semester no exists") + return + } + + if (forceRefresh || loadedSemesterId[index] != newSelectedSemesterId) { + Timber.i("Load grade child view index: $index") + view?.notifyChildLoadData(index, newSelectedSemesterId, forceRefresh) } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt index 7b52daa88..104f8505a 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/GradeView.kt @@ -1,5 +1,6 @@ package io.github.wulkanowy.ui.modules.grade +import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.ui.base.BaseView interface GradeView : BaseView { @@ -18,7 +19,7 @@ interface GradeView : BaseView { fun showSemesterSwitch(show: Boolean) - fun showSemesterDialog(selectedIndex: Int) + fun showSemesterDialog(selectedIndex: Int, semesters: List) fun setCurrentSemesterName(semester: Int, schoolYear: Int) diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 2b2079331..5fda72106 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -291,7 +291,7 @@ class MainActivity : BaseActivity(), MainVie ): Boolean { val fragment = supportFragmentManager.fragmentFactory.instantiate(classLoader, pref.fragment) - navController.pushFragment(fragment) + pushView(fragment) return true } @@ -305,6 +305,8 @@ class MainActivity : BaseActivity(), MainVie } override fun switchMenuView(position: Int) { + if (supportFragmentManager.isStateSaved) return + analytics.popCurrentScreen(navController.currentFrag!!::class.simpleName) navController.switchTab(position) } @@ -322,6 +324,8 @@ class MainActivity : BaseActivity(), MainVie } override fun showAccountPicker(studentWithSemesters: List) { + if (supportFragmentManager.isStateSaved) return + navController.showDialogFragment(AccountQuickDialog.newInstance(studentWithSemesters)) } @@ -339,15 +343,21 @@ class MainActivity : BaseActivity(), MainVie } fun showDialogFragment(dialog: DialogFragment) { + if (supportFragmentManager.isStateSaved) return + navController.showDialogFragment(dialog) } fun pushView(fragment: Fragment) { + if (supportFragmentManager.isStateSaved) return + analytics.popCurrentScreen(navController.currentFrag!!::class.simpleName) navController.pushFragment(fragment) } override fun popView(depth: Int) { + if (supportFragmentManager.isStateSaved) return + analytics.popCurrentScreen(navController.currentFrag!!::class.simpleName) navController.safelyPopFragments(depth) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt index 857779838..ffcfcb614 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainPresenter.kt @@ -113,7 +113,7 @@ class MainPresenter @Inject constructor( private fun showCurrentStudentAvatar() { val currentStudent = - studentsWitSemesters!!.single { it.student.isCurrent }.student + studentsWitSemesters?.singleOrNull { it.student.isCurrent }?.student ?: return view?.showStudentAvatar(currentStudent) } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt index 03ad7ba09..fba2f0407 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/schoolandteachers/school/SchoolFragment.kt @@ -53,13 +53,14 @@ class SchoolFragment : BaseFragment(R.layout.fragment_sch override fun updateData(data: School) { with(binding) { - schoolName.text = data.name - schoolAddress.text = data.address.ifBlank { "-" } + val noDataString = getString(R.string.all_no_data) + schoolName.text = data.name.ifBlank { noDataString } + schoolAddress.text = data.address.ifBlank { noDataString } schoolAddressButton.visibility = if (data.address.isNotBlank()) VISIBLE else GONE - schoolTelephone.text = data.contact.ifBlank { "-" } + schoolTelephone.text = data.contact.ifBlank { noDataString } schoolTelephoneButton.visibility = if (data.contact.isNotBlank()) VISIBLE else GONE - schoolHeadmaster.text = data.headmaster - schoolPedagogue.text = data.pedagogue + schoolHeadmaster.text = data.headmaster.ifBlank { noDataString } + schoolPedagogue.text = data.pedagogue.ifBlank { noDataString } } } diff --git a/app/src/main/play/release-notes/pl-PL/default.txt b/app/src/main/play/release-notes/pl-PL/default.txt index 35320c1ea..2b0af6e5a 100644 --- a/app/src/main/play/release-notes/pl-PL/default.txt +++ b/app/src/main/play/release-notes/pl-PL/default.txt @@ -1,11 +1,6 @@ -Wersja 1.1.0 +Wersja 1.1.1 -- dodaliśmy wyświetlanie inicjałów imienia ucznia jako awatar widoczny w aplikacji -- dodaliśmy historię szczęśliwego numerka -- dodaliśmy język słowacki -- zmieniliśmy kolor górnego i dolnego paska systemowego lepiej dostosowując je do aplikacji -- zmieniliśmy wygląd ustawień dzieląc je na sekcje -- naprawiliśmy problem dublujących się czasem ocen -- naprawiliśmy kilka innych błędów i poprawiliśmy stabilność aplikacji +- naprawiliśmy wyświetlanie planu lekcji +- naprawiliśmy kilka rzadkich problemów ze stabilnością Pełna lista zmian: https://github.com/wulkanowy/wulkanowy/releases diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 4745e1717..8c8ad7291 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -192,7 +192,7 @@ Důvod nepřítomnosti (volitelný) Poslat - Nepřítomnost úspěšně omluvena! + Žádost o omluvu nepřítomnosti byla úspěšně odeslána! Musíte vybrat alespoň jednu nepřítomnost! Ospravedlnit diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a0994b422..391fdd21f 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -176,7 +176,7 @@ Abwesenheitsgrund (optional) Senden - Abwesenheit erfolgreich entschuldigt! + Absence excuse request sent successfully! Sie müssen mindestens eine Abwesenheit auswählen! Verzeihung diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 6542a5bc6..569df4bc8 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -192,7 +192,7 @@ Absence reason (optional) Send - Absence excused successfully! + Absence excuse request sent successfully! You must select at least one absence! Excuse diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 3f69d2a86..0d4395838 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -192,7 +192,7 @@ Powód nieobecności (opcjonalny) Wyślij - Usprawiedliwiono pomyślnie! + Prośba o usprawiedliwienie została pomyślnie wysłana! Musisz wybrać co najmniej jedną nieobecność! Usprawiedliw @@ -317,7 +317,7 @@ Pokaż historię Historia numerków - Brak informacji o szczęśliwych numerach + Brak informacji o szczęśliwych numerkach Dostęp mobilny Brak urządzeń diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 02407bbd0..b614ac9e9 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -192,7 +192,7 @@ Причина отсутствия (необязательно) Послать - Статус отсутствия изменён + Absence excuse request sent successfully! Выберите хотя-бы одно отсутствие Изменить статус diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 32bd8067e..601bd880e 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -192,7 +192,7 @@ Dôvod neprítomnosti (voliteľný) Poslať - Neprítomnosť úspešne ospravedlnená! + Žiadosť o ospravedlnenie neprítomnosti bola úspešne odoslaná! Musíte vybrať aspoň jednu neprítomnosť! Ospravedlniť diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 64e147e74..61a6bb3f2 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -192,7 +192,7 @@ Причина відсутності (необов’язково) Надіслати - Змінено статус відсутності + Absence excuse request sent successfully! Оберіть хоча б одну відсутність Змінити статус diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 574c21b04..db5ed7b49 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -194,7 +194,7 @@ Absence reason (optional) Send - Absence excused successfully! + Absence excuse request sent successfully! You must select at least one absence! Excuse