diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 29204aff..7643783a 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -15,6 +15,7 @@
xmlns:android
+
^$
@@ -25,6 +26,7 @@
xmlns:.*
+
^$
@@ -36,6 +38,7 @@
.*:id
+
http://schemas.android.com/apk/res/android
@@ -46,6 +49,7 @@
.*:name
+
http://schemas.android.com/apk/res/android
@@ -56,6 +60,7 @@
name
+
^$
@@ -66,6 +71,7 @@
style
+
^$
@@ -76,6 +82,7 @@
.*
+
^$
@@ -87,6 +94,7 @@
.*
+
http://schemas.android.com/apk/res/android
@@ -98,6 +106,7 @@
.*
+
.*
diff --git a/.idea/dictionaries/Kuba.xml b/.idea/dictionaries/Kuba.xml
index 7910687c..592a5d5e 100644
--- a/.idea/dictionaries/Kuba.xml
+++ b/.idea/dictionaries/Kuba.xml
@@ -5,6 +5,7 @@
ciasteczko
csrf
edziennik
+ elearning
gson
hebe
idziennik
diff --git a/app/build.gradle b/app/build.gradle
index 72c03e94..c0af6190 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -152,7 +152,8 @@ dependencies {
implementation "pl.droidsonroids.retrofit2:converter-jspoon:1.3.2"
// Szkolny.eu libraries/forks
- implementation "eu.szkolny:agendacalendarview:1799f8ef47"
+ implementation "eu.szkolny:android-snowfall:1ca9ea2da3"
+ implementation "eu.szkolny:agendacalendarview:5431f03098"
implementation "eu.szkolny:cafebar:5bf0c618de"
implementation "eu.szkolny.fslogin:lib:2.0.0"
implementation "eu.szkolny:material-about-library:1d5ebaf47c"
@@ -180,7 +181,6 @@ dependencies {
implementation "com.github.bassaer:chatmessageview:2.0.1"
implementation "com.github.CanHub:Android-Image-Cropper:2.2.2"
implementation "com.github.ChuckerTeam.Chucker:library:3.0.1"
- implementation "com.github.jetradarmobile:android-snowfall:1.2.0"
implementation "com.github.wulkanowy.uonet-request-signer:hebe-jvm:a99ca50a31"
implementation("com.heinrichreimersoftware:material-intro") { version { strictly "1.5.8" } }
implementation "com.hypertrack:hyperlog:0.0.10"
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 4d84d11d..0816fb00 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -32,8 +32,9 @@
-keepnames class pl.szczodrzynski.edziennik.ui.widgets.luckynumber.WidgetLuckyNumberProvider
-keepnames class androidx.appcompat.view.menu.MenuBuilder { setHeaderTitleInt(java.lang.CharSequence); }
--keepclassmembernames class androidx.appcompat.view.menu.StandardMenuPopup { private *; }
-keepnames class androidx.appcompat.view.menu.MenuPopupHelper { showPopup(int, int, boolean, boolean); }
+-keepclassmembernames class androidx.appcompat.view.menu.StandardMenuPopup { private *; }
+-keepclassmembernames class androidx.appcompat.view.menu.MenuItemImpl { private *; }
-keepclassmembernames class com.mikepenz.materialdrawer.widget.MiniDrawerSliderView { private *; }
diff --git a/app/src/main/assets/pl-changelog.html b/app/src/main/assets/pl-changelog.html
index 2219ad8c..27c85f0f 100644
--- a/app/src/main/assets/pl-changelog.html
+++ b/app/src/main/assets/pl-changelog.html
@@ -1,13 +1,13 @@
-
Wersja 4.7, 2021-04-07
+Wersja 4.8, 2021-05-26
- - Szkolny.eu jest teraz open source! Zapraszamy na stronę https://szkolny.eu/ po więcej ważnych informacji.
- - Poprawiono wybieranie obrazków (tła nagłówka, tła aplikacji oraz profilu) z dowolnego źródła.
- - Ukończono tłumaczenie na język angielski. @MarcinK50
- - Dodano ekran informacji o kompilacji w Ustawieniach.
- - Zaktualizowano ekran licencji open source.
- - Naprawiono zatrzymanie aplikacji na Androidzie 4.4 i starszych.
- - Naprawiono problemy z połączeniem internetowym na Androidzie 4.4 i starszych.
- - Zoptymalizowano wielkość aplikacji.
+ - Dodano ikony dla powiadomień. @Luncenok
+ - Terminarz: opcje konfiguracji, widok kompaktowy, grupowanie wydarzeń, znaczki nieprzeczytanych, nowe ikony i wiele innych usprawnień.
+ - Wiadomości: usprawiono wyszukiwanie - zapisywanie szukanego tekstu po wejściu w wiadomość.
+ - Wiadomości: dodano opcję konfiguracji podpisu przy wysyłaniu wiadomości.
+ - Plan lekcji: dodano znacznik aktualnej pory dnia w planie lekcji.
+ - Powiadomienia: dodano szczegółowy opis po rozwinięciu.
+ - Wydarzenia: nowy rodzaj "lekcja online".
+ - Naprawiono odbieranie nagrody w easter egg'u.
diff --git a/app/src/main/cpp/szkolny-signing.cpp b/app/src/main/cpp/szkolny-signing.cpp
index f2b1cf8a..9af553cb 100644
--- a/app/src/main/cpp/szkolny-signing.cpp
+++ b/app/src/main/cpp/szkolny-signing.cpp
@@ -9,7 +9,7 @@
/*secret password - removed for source code publication*/
static toys AES_IV[16] = {
- 0xda, 0x9f, 0xd4, 0x2b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
+ 0x71, 0xcf, 0xdf, 0x13, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
unsigned char *agony(unsigned int laugh, unsigned char *box, unsigned char *heat);
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt
index a07634a1..8d3b59d1 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/Extensions.kt
@@ -15,6 +15,7 @@ import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Bundle
import android.text.*
+import android.text.style.CharacterStyle
import android.text.style.ForegroundColorSpan
import android.text.style.StrikethroughSpan
import android.text.style.StyleSpan
@@ -552,28 +553,46 @@ fun CharSequence?.asBoldSpannable(): Spannable {
spannable.setSpan(StyleSpan(Typeface.BOLD), 0, spannable.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
return spannable
}
-fun CharSequence.asSpannable(vararg spans: Any, substring: String? = null, ignoreCase: Boolean = false, ignoreDiacritics: Boolean = false): Spannable {
+fun CharSequence.asSpannable(
+ vararg spans: CharacterStyle,
+ substring: CharSequence? = null,
+ ignoreCase: Boolean = false,
+ ignoreDiacritics: Boolean = false
+): Spannable {
val spannable = SpannableString(this)
- if (substring == null) {
- spans.forEach {
- spannable.setSpan(it, 0, spannable.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
- }
- }
- else if (substring.isNotEmpty()) {
- val string =
- if (ignoreDiacritics)
- this.cleanDiacritics()
- else this
+ substring?.let { substr ->
+ val string = if (ignoreDiacritics)
+ this.cleanDiacritics()
+ else
+ this
+ val search = if (ignoreDiacritics)
+ substr.cleanDiacritics()
+ else
+ substr.toString()
- var index = string.indexOf(substring, ignoreCase = ignoreCase)
- .takeIf { it != -1 } ?: indexOf(substring, ignoreCase = ignoreCase)
- while (index >= 0) {
- spans.forEach {
- spannable.setSpan(it, index, index + substring.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
+ var index = 0
+ do {
+ index = string.indexOf(
+ string = search,
+ startIndex = index,
+ ignoreCase = ignoreCase
+ )
+
+ if (index >= 0) {
+ spans.forEach {
+ spannable.setSpan(
+ CharacterStyle.wrap(it),
+ index,
+ index + substring.length,
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
+ )
+ }
+ index += substring.length.coerceAtLeast(1)
}
- index = string.indexOf(substring, startIndex = index + 1, ignoreCase = ignoreCase)
- .takeIf { it != -1 } ?: indexOf(substring, startIndex = index + 1, ignoreCase = ignoreCase)
- }
+ } while (index >= 0)
+
+ } ?: spans.forEach {
+ spannable.setSpan(it, 0, spannable.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
}
return spannable
}
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
index 8dd83bf2..2cd4f7b7 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/MainActivity.kt
@@ -21,6 +21,7 @@ import androidx.lifecycle.Observer
import androidx.navigation.NavOptions
import com.danimahardhika.cafebar.CafeBar
import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.jetradarmobile.snowfall.SnowfallView
import com.mikepenz.iconics.IconicsDrawable
import com.mikepenz.iconics.typeface.library.community.material.CommunityMaterial
import com.mikepenz.iconics.utils.colorInt
@@ -81,12 +82,9 @@ import pl.szczodrzynski.edziennik.ui.modules.settings.ProfileManagerFragment
import pl.szczodrzynski.edziennik.ui.modules.settings.SettingsFragment
import pl.szczodrzynski.edziennik.ui.modules.timetable.TimetableFragment
import pl.szczodrzynski.edziennik.ui.modules.webpush.WebPushFragment
-import pl.szczodrzynski.edziennik.utils.SwipeRefreshLayoutNoTouch
-import pl.szczodrzynski.edziennik.utils.Themes
-import pl.szczodrzynski.edziennik.utils.Utils
+import pl.szczodrzynski.edziennik.utils.*
import pl.szczodrzynski.edziennik.utils.Utils.d
import pl.szczodrzynski.edziennik.utils.Utils.dpToPx
-import pl.szczodrzynski.edziennik.utils.appManagerIntentList
import pl.szczodrzynski.edziennik.utils.models.Date
import pl.szczodrzynski.edziennik.utils.models.NavTarget
import pl.szczodrzynski.navlib.*
@@ -470,9 +468,21 @@ class MainActivity : AppCompatActivity(), CoroutineScope {
// IT'S WINTER MY DUDES
val today = Date.getToday()
- if ((today.month == 12 || today.month == 1) && app.config.ui.snowfall) {
+ if ((today.month % 11 == 1) && app.config.ui.snowfall) {
b.rootFrame.addView(layoutInflater.inflate(R.layout.snowfall, b.rootFrame, false))
}
+ else if (app.config.ui.eggfall && BigNightUtil().isDataWielkanocyNearDzisiaj()) {
+ val eggfall = layoutInflater.inflate(R.layout.eggfall, b.rootFrame, false) as SnowfallView
+ eggfall.setSnowflakeBitmaps(listOf(
+ BitmapFactory.decodeResource(resources, R.drawable.egg1),
+ BitmapFactory.decodeResource(resources, R.drawable.egg2),
+ BitmapFactory.decodeResource(resources, R.drawable.egg3),
+ BitmapFactory.decodeResource(resources, R.drawable.egg4),
+ BitmapFactory.decodeResource(resources, R.drawable.egg5),
+ BitmapFactory.decodeResource(resources, R.drawable.egg6)
+ ))
+ b.rootFrame.addView(eggfall)
+ }
// WHAT'S NEW DIALOG
if (app.config.appVersion < BuildConfig.VERSION_CODE) {
diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/config/ConfigSync.kt b/app/src/main/java/pl/szczodrzynski/edziennik/config/ConfigSync.kt
index 068400a1..387e5cf7 100644
--- a/app/src/main/java/pl/szczodrzynski/edziennik/config/ConfigSync.kt
+++ b/app/src/main/java/pl/szczodrzynski/edziennik/config/ConfigSync.kt
@@ -6,6 +6,7 @@ package pl.szczodrzynski.edziennik.config
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
+import pl.szczodrzynski.edziennik.BuildConfig
import pl.szczodrzynski.edziennik.config.utils.get
import pl.szczodrzynski.edziennik.config.utils.getIntList
import pl.szczodrzynski.edziennik.config.utils.set
@@ -123,6 +124,19 @@ class ConfigSync(private val config: Config) {
private var mRegisterAvailability: Map? = null
var registerAvailability: Map
- get() { mRegisterAvailability = mRegisterAvailability ?: config.values.get("registerAvailability", null as String?)?.let { it -> gson.fromJson