x5_x{rJS6OcSyx_d#hN$$}PPdEV@iXqe_$4pgep{5~#pUJx
zOE+;`-rvpnz(+meP4gV9(o-A$zG`G{QaSv-P}XJXj`xg@EML!>w#Zq5VM&mi+p!q2
zpA%=V{Jq|ksUSVVhFfFz@gsLk;}=`@ZCJ57yQOQzQA_<*vkR{}FwWU|_quq=+bB(y
zS6obczTc}p_F3MxYRffFg>$Y6Z4c*58*}K_Ig74Xdr>~ShRII2BfGAssL0RN)z$XE
zmi;$=nXmBuFuTpAb?=cRW@gbZ>9@kUj;?q*b7q@tYRnS>=U+1a-Wa!^nzL5+#4ek}Wuk+7|b95W!xUb~-_Winl=xXzIi-S&t
zstQf8yME)!n^%nX2QHn{dm-BObkaHnhOlf=5fO>SIvTUraWf@c`^AgDtwwGhI=9H+lNRKqU`F
zb?YP1x3{Z5&&~0Ccj7?agcA(WukP=k8s))o@Fq*cx@Uo6C*a51bM{F+KJnsWS*_x2>9z%>v9k@i6OLD;3o$&uxwClr$KnNU^4B)#aWr)B
z8y&0>W00)aX`-X_t(zSfRv*t0y1YSg
z#;TXn;@8vjs;WM^sk^iae6>{e+Pk|dA^n7C?Qf}S#?al>+<$YpkM(ZuW+-@<;3{A7
zfYE4<5U1)rb9M
zncuLmjZMci^#<3f?hVV&@)hn#+;xck`rm1@cJcgkXlxEz(Gazk_lnl~y0@m&`&>h^
zKKcn<>zjDRe&=B)vCGre32b;`oPJJ)-}XyDZ^FjyB2D}$t+^8&Yi6o-bbVN{`SARh
zUnv)>*N12YzFLzmF=_YY$JxEkGFn@frv#V-@%yMM-F*{9cnnf~S~TVyBq
ztY~A%kZ$VoN(uI5SK+^QB`NI3qi+3{H`-4+O&c7)vlc(!Qg$O~KYwLA>+g#D+j4KW
zY~@(Tuz#Li^46$Y3lozsd1|!{3nSWAw!KrUJ!5$!NmE4r?uJCEWgD*x3C)|o@?y+Q
zhq+1ae;FqvOcT9zCzhi@%P*tm%C{MO6PmYw+aPMv(LdXI`PReJIQR}tjL>NQelXB|
z(J9eg_PV-jEff_WnyS@aa`Bek`DNw%=f~VdHCvXrdN?p-nQyY2blQHIpW)3HEq@&B
zWH;aKV7V&Tz@IMCQ+fNrgX8B*x_Xx^S)$)Km4P`eWu8Lqs>x1HAsk1G7~7cC-e&Bq
z`BU@Dm3xKrn-{kj%O^Qs6JS_b+sP8jHs>DKk>5{?eu^Zti0)q6vB)k@zjl@OG-08X
zg>5QqlO%t=pL(jbvV%u*QVQS11ZLTH3hiqY8RXAR;g`$%+j~;4)oEi>lJaezL)sT)
z7u#*~P*l-XYFW1QjQj+4)~!;jgP!U?o2bYxoTA_ud!A+f{v0d0$5x3h!9dapo{v
z{|^yXR@SYi7yk;Xaq9OgHSFvPJSg8`l(GBFw!}o)f6Ig3M!ixIa^SnV)c=EU={xJ~
zx!ISQ^5v&Hr$$ws57D~1ucM>G?*Plyzb}>U#xI{bZ`~*M7S$;e85twaO}lET^=eXx6${M9pSbmo3w6g_t-#d6rkA0sTlh`{Q*O|>xYwd(2C2#gx?tP@%C%5wV+K=oN
z-Cv*FXlT%}u(4HA-reu*Yx_t?=*rUMKk9$^?q7agKV`CWTePL!l6{92vN+kRepbxy
zb8HLzwad*}ZrbVor*1AbJUlKeEE$n={e{~mI{0%`-qLEVs8i@sHG49Lh5zWWZ@+w3
z+H5-F{bYiPPS2Mwo8+%#eex^%^zrtg!}6ky@p?s7M?e0ns*5Y?n42_D<*>M4XM#$F
zg4(j<>sPL94=~@-IqASfft9zMFjr
z7ngKu4E9=ckn6>}C3XkTUojN>#1fUe)BGuCO`*?{WFuDlzmaxsOO^6fRNv-Gim{zt
zzxcs*!w=?P+dBH49|l^9`0|*$lqW|-wC9U<{jqH8DQsOVnOv?j`-A9*%k!UZ_!qA+
z^@-@roZ_gA7qJz`9{&5MQ4~C*#hQ7K?4M_c79Y%MY<6H;#$M{%)D%^(I$eL3bob5D&?Wa?z3E$iEPIEO<2+xF87=9WMHRtk8ve7zGu4->2-GwkyY4yR
zZ(h(P_5I72#XaOScK^dvt~vWd(n)2D-S#W5rfi6b`;(FLM#IM0=Jc_;x=5w7?>|4-
z?!xp=;`B@2(;NvZ6=r(tzoo@&uk<)o_2=SA*lWRRNnEB{Ccd8C|
za;f4A#+6)Yf=Uw>r2CwioGj9%8~ie-VVibqRqaaK&5chaZs&j1{NSDV)m>}qldngP
zB;FMNtG%ceydUm8TVB`>OTOxxfnl*<0|_jZX%
zQ@-pkyy6(w@W$|)&Nk(Ag_DZ28_sXF`)OwyT2L~-w_o0WzN@y4FjtN3RGXPPXJ#Il
z7u(^P+s{%b?Qvnk)T5s`1Z6Z$zjG%PR=K*{|6Lliv(RWRZ&*Nf-`8W?PAO^nCxp6*
zAJG5b8&!McTm0mcTvl!_HvQ=bzV5sKm5p5@{qbf)
z-?R58QsV!u2$7rZDSyGLSx0Mgs@sGo0j3vaUp@IZah{*s>W~zNqE8#$A3Zv@AbR$R
zSLvN9{yNoRk39NW>evr2xuee^>Zx>O%H<=Q9cO>|pm%uEg~cCw^qbd5EYh20
zWzHdns=$cNfAp*5_b)9}({;`Lm_v<;{l=zjv;&^OCxBWAlSa>LE+MFZJl>{?l|!
zXPV4$B_6F8=L!xxAIzEHJ@?6SyQ!ze`@>gzKQmT}uvY%DN@i9@(nrRc7k~IgyCzLf
z-LzCzNqPR!y+>`2?M;h{KRVA*rdq96b#J`&q>gs4qnjJ8EEE_7J97M5>^5%v>%MHs
znwbm2rk`UL^jSKwRj+iPO8Xf``P9>gMY}Hj>+HUcXo_J(OmV_GpM)DB0nV-jce1*)p;7i|m-V=Z1w$a#u_F@N5%j
z@XY2(sVycGkIK%P6!fRa=}-~dpR|~F25b9GcY95|CLUd@c_gxZGh<1*NVlDeapV-i
zJcY)2wny&BUA*Ye@9Qi*kT$p@^n
z@zAsX>s0gS3}0JC-8zrw&o>0IiSFL+dvh<})HQW?Cmk?}Ii>7sn3LsZp*Qs>`_zsC
z?}{IP-=9jkUpsTsrpNqScggS>&lc?w>YSWt`*-j1Uo4>x{;GUizp-4CGkPA}y6DZ?
zCr{@3o96y<*4wMDcHn%PmHpJar&-GKD_f46?9pu8-4XR8L+S=x^YNLUc=B3xIGaJtdJ>ATsJ^Ki!V*iFulX;u}_<8nC
zYMsc%Dmi0L&64<e$&6ynK_B)Z`|NFc6Qp;v8LASo$H2$qLsT&JUZ=ifIsoO
zi9^?iias49Ri^oZlV;BIJK0EY9Bvh?b%#_F1^S5IF~
z5zsikOhLJ0ijSD9-v{B>aq7#KhbtaCvMOOK=bfo;RaLC(3@2t+2p@31wLnasb9H}k
zkly~;Q?~4mcRKW@eU^#jB3{myr{+X4{y2F3@JuVQ)6b>s4{|;5e(*g(>4lXs;>Gjpebs)yI{f6xo{Lii=4(wA4`69qaq_%K!DEdN8~)@^
zTA1Px!EtVh`%jh0h8x=wfBian-JR8XyMseRt&Zwb^DBqy{p?Q{v_3k-z*Uj;^s`)d
zw{&s3%MtFv#>VZR-XC=I-+N8w|7#=nv+o>*cB>l-eb_snqc`%7RhMeP4jZ8~)`Q^-
z7#ejr@~>zd-*2QiD==W|erv5&{_l6}P&{vvYxOX6X3k6ND-&h3rqBNsv2e#HOJ%k>
zJ`qq#t5t&KGO64ga!}#aDll`AfA0{w5p0*~~dPH=6T@okNSX&Ka(WKL5=`
z&+>RZlgJAA!s^5k)WpPN?6Uav0pZC_{b@W)be*J3GNwz&+zAvGx)doc_AQ|-BI5g<
zW4+aPB*d;U|3CKrgZUn|^{GeG&bschy)N?RQ2GIXt?UVm><=OnXSLO)Ej@9`JoUcr
zrKYX>9hvsMckMm0*~!^Br6W;DvGHY!p<;_9(OSETm(+r-2K1wad
zbI))Jo?qf()IC*u=8*tngDeSyjT`K{1zq|D(OK&gc6e^kV5@%@hOG
z7Rw+OBLlY1w4P&1lUlmc1d5yg+q!(&mmqke`G)D4#=9~PR4;hDubp^kio_h5e@c^B
zI!+|zb;K*z
-
+
+
@@ -36,13 +37,14 @@
+ tools:ignore="DataExtractionRules,UnusedAttribute">
(ARGUMENT_KEY)
val binding = DialogErrorBinding.inflate(layoutInflater)
binding.bindErrorDetails(error)
diff --git a/app/src/main/java/io/github/wulkanowy/ui/base/ThemeManager.kt b/app/src/main/java/io/github/wulkanowy/ui/base/ThemeManager.kt
index 2d83bbbf9..e1c234575 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/base/ThemeManager.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/base/ThemeManager.kt
@@ -1,6 +1,9 @@
package io.github.wulkanowy.ui.base
+import android.content.pm.PackageInfo
+import android.content.pm.PackageManager
import android.content.pm.PackageManager.GET_ACTIVITIES
+import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
@@ -41,9 +44,8 @@ class ThemeManager @Inject constructor(private val preferencesRepository: Prefer
)
}
- private fun isThemeApplicable(activity: AppCompatActivity) =
- activity.packageManager
- .getPackageInfo(activity.packageName, GET_ACTIVITIES)
+ private fun isThemeApplicable(activity: AppCompatActivity): Boolean =
+ getPackageInfo(activity)
.activities
.singleOrNull { it.name == activity::class.java.canonicalName }
?.theme
@@ -52,4 +54,14 @@ class ThemeManager @Inject constructor(private val preferencesRepository: Prefer
|| it == R.style.WulkanowyTheme_Login || it == R.style.WulkanowyTheme_Login_Black
|| it == R.style.WulkanowyTheme_MessageSend || it == R.style.WulkanowyTheme_MessageSend_Black
}
+
+ @Suppress("DEPRECATION")
+ private fun getPackageInfo(activity: AppCompatActivity): PackageInfo {
+ return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+ activity.packageManager.getPackageInfo(
+ activity.packageName,
+ PackageManager.PackageInfoFlags.of(GET_ACTIVITIES.toLong())
+ )
+ } else activity.packageManager.getPackageInfo(activity.packageName, GET_ACTIVITIES)
+ }
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt
index c6fe8a69b..41b97b075 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountdetails/AccountDetailsFragment.kt
@@ -6,6 +6,7 @@ import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AlertDialog
+import androidx.core.os.bundleOf
import androidx.core.view.get
import androidx.core.view.isVisible
import dagger.hilt.android.AndroidEntryPoint
@@ -21,6 +22,7 @@ import io.github.wulkanowy.ui.modules.studentinfo.StudentInfoFragment
import io.github.wulkanowy.ui.modules.studentinfo.StudentInfoView
import io.github.wulkanowy.utils.createNameInitialsDrawable
import io.github.wulkanowy.utils.nickOrName
+import io.github.wulkanowy.utils.serializable
import javax.inject.Inject
@AndroidEntryPoint
@@ -37,10 +39,9 @@ class AccountDetailsFragment :
private const val ARGUMENT_KEY = "Data"
- fun newInstance(student: Student) =
- AccountDetailsFragment().apply {
- arguments = Bundle().apply { putSerializable(ARGUMENT_KEY, student) }
- }
+ fun newInstance(student: Student) = AccountDetailsFragment().apply {
+ arguments = bundleOf(ARGUMENT_KEY to student)
+ }
}
@Suppress("DEPRECATION")
@@ -52,7 +53,7 @@ class AccountDetailsFragment :
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = FragmentAccountDetailsBinding.bind(view)
- presenter.onAttachView(this, requireArguments()[ARGUMENT_KEY] as Student)
+ presenter.onAttachView(this, requireArguments().serializable(ARGUMENT_KEY))
}
override fun initView() {
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditDialog.kt
index 21a7a492d..6e2bc8c44 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditDialog.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountedit/AccountEditDialog.kt
@@ -4,11 +4,13 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.core.os.bundleOf
import androidx.recyclerview.widget.GridLayoutManager
import dagger.hilt.android.AndroidEntryPoint
import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.databinding.DialogAccountEditBinding
import io.github.wulkanowy.ui.base.BaseDialogFragment
+import io.github.wulkanowy.utils.serializable
import javax.inject.Inject
@AndroidEntryPoint
@@ -24,12 +26,9 @@ class AccountEditDialog : BaseDialogFragment(), Accoun
private const val ARGUMENT_KEY = "student_with_semesters"
- fun newInstance(student: Student) =
- AccountEditDialog().apply {
- arguments = Bundle().apply {
- putSerializable(ARGUMENT_KEY, student)
- }
- }
+ fun newInstance(student: Student) = AccountEditDialog().apply {
+ arguments = bundleOf(ARGUMENT_KEY to student)
+ }
}
override fun onCreate(savedInstanceState: Bundle?) {
@@ -45,7 +44,7 @@ class AccountEditDialog : BaseDialogFragment(), Accoun
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
- presenter.onAttachView(this, requireArguments()[ARGUMENT_KEY] as Student)
+ presenter.onAttachView(this, requireArguments().serializable(ARGUMENT_KEY))
}
override fun initView() {
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountquick/AccountQuickDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountquick/AccountQuickDialog.kt
index 4279102e1..d23978f5f 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountquick/AccountQuickDialog.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/account/accountquick/AccountQuickDialog.kt
@@ -4,6 +4,7 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.core.os.bundleOf
import androidx.recyclerview.widget.LinearLayoutManager
import dagger.hilt.android.AndroidEntryPoint
import io.github.wulkanowy.data.db.entities.StudentWithSemesters
@@ -13,6 +14,7 @@ import io.github.wulkanowy.ui.modules.account.AccountAdapter
import io.github.wulkanowy.ui.modules.account.AccountFragment
import io.github.wulkanowy.ui.modules.account.AccountItem
import io.github.wulkanowy.ui.modules.main.MainActivity
+import io.github.wulkanowy.utils.serializable
import javax.inject.Inject
@AndroidEntryPoint
@@ -30,9 +32,7 @@ class AccountQuickDialog : BaseDialogFragment(), Acco
fun newInstance(studentsWithSemesters: List) =
AccountQuickDialog().apply {
- arguments = Bundle().apply {
- putSerializable(STUDENTS_ARGUMENT_KEY, studentsWithSemesters.toTypedArray())
- }
+ arguments = bundleOf(STUDENTS_ARGUMENT_KEY to studentsWithSemesters.toTypedArray())
}
}
@@ -49,8 +49,8 @@ class AccountQuickDialog : BaseDialogFragment(), Acco
@Suppress("UNCHECKED_CAST")
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
- val studentsWithSemesters =
- (requireArguments()[STUDENTS_ARGUMENT_KEY] as Array).toList()
+ val studentsWithSemesters = requireArguments()
+ .serializable>(STUDENTS_ARGUMENT_KEY).toList()
presenter.onAttachView(this, studentsWithSemesters)
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt
index 9b5c63e4c..eab24f91d 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/attendance/AttendanceDialog.kt
@@ -4,11 +4,13 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment
import io.github.wulkanowy.data.db.entities.Attendance
import io.github.wulkanowy.databinding.DialogAttendanceBinding
import io.github.wulkanowy.utils.descriptionRes
import io.github.wulkanowy.utils.lifecycleAwareVariable
+import io.github.wulkanowy.utils.serializable
import io.github.wulkanowy.utils.toFormattedString
class AttendanceDialog : DialogFragment() {
@@ -22,16 +24,14 @@ class AttendanceDialog : DialogFragment() {
private const val ARGUMENT_KEY = "Item"
fun newInstance(exam: Attendance) = AttendanceDialog().apply {
- arguments = Bundle().apply { putSerializable(ARGUMENT_KEY, exam) }
+ arguments = bundleOf(ARGUMENT_KEY to exam)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, 0)
- arguments?.run {
- attendance = getSerializable(ARGUMENT_KEY) as Attendance
- }
+ attendance = requireArguments().serializable(ARGUMENT_KEY)
}
override fun onCreateView(
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceDialog.kt
index 477b762b9..7834b6e8b 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceDialog.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/conference/ConferenceDialog.kt
@@ -4,11 +4,13 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.core.os.bundleOf
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
import io.github.wulkanowy.data.db.entities.Conference
import io.github.wulkanowy.databinding.DialogConferenceBinding
import io.github.wulkanowy.utils.lifecycleAwareVariable
+import io.github.wulkanowy.utils.serializable
import io.github.wulkanowy.utils.toFormattedString
class ConferenceDialog : DialogFragment() {
@@ -22,16 +24,14 @@ class ConferenceDialog : DialogFragment() {
private const val ARGUMENT_KEY = "item"
fun newInstance(conference: Conference) = ConferenceDialog().apply {
- arguments = Bundle().apply { putSerializable(ARGUMENT_KEY, conference) }
+ arguments = bundleOf(ARGUMENT_KEY to conference)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, 0)
- arguments?.let {
- conference = it.getSerializable(ARGUMENT_KEY) as Conference
- }
+ conference = requireArguments().serializable(ARGUMENT_KEY)
}
override fun onCreateView(
@@ -57,4 +57,4 @@ class ConferenceDialog : DialogFragment() {
conferenceDialogAgendaTitle.isVisible = conference.agenda.isNotBlank()
}
}
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamDialog.kt
index 41adc008a..876b563f9 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamDialog.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/exam/ExamDialog.kt
@@ -4,12 +4,14 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment
import io.github.wulkanowy.R
import io.github.wulkanowy.data.db.entities.Exam
import io.github.wulkanowy.databinding.DialogExamBinding
import io.github.wulkanowy.utils.lifecycleAwareVariable
import io.github.wulkanowy.utils.openCalendarEventAdd
+import io.github.wulkanowy.utils.serializable
import io.github.wulkanowy.utils.toFormattedString
import java.time.LocalTime
@@ -24,16 +26,14 @@ class ExamDialog : DialogFragment() {
private const val ARGUMENT_KEY = "Item"
fun newInstance(exam: Exam) = ExamDialog().apply {
- arguments = Bundle().apply { putSerializable(ARGUMENT_KEY, exam) }
+ arguments = bundleOf(ARGUMENT_KEY to exam)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, 0)
- arguments?.run {
- exam = getSerializable(ARGUMENT_KEY) as Exam
- }
+ exam = requireArguments().serializable(ARGUMENT_KEY)
}
override fun onCreateView(
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsDialog.kt
index 34594111f..a1ef2ec5a 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsDialog.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/details/GradeDetailsDialog.kt
@@ -5,6 +5,7 @@ import android.view.LayoutInflater
import android.view.View
import android.view.View.GONE
import android.view.ViewGroup
+import androidx.core.os.bundleOf
import androidx.fragment.app.DialogFragment
import io.github.wulkanowy.R
import io.github.wulkanowy.data.db.entities.Grade
@@ -27,22 +28,19 @@ class GradeDetailsDialog : DialogFragment() {
private const val COLOR_THEME_KEY = "Theme"
- fun newInstance(grade: Grade, colorTheme: GradeColorTheme) =
- GradeDetailsDialog().apply {
- arguments = Bundle().apply {
- putSerializable(ARGUMENT_KEY, grade)
- putSerializable(COLOR_THEME_KEY, colorTheme)
- }
- }
+ fun newInstance(grade: Grade, colorTheme: GradeColorTheme) = GradeDetailsDialog().apply {
+ arguments = bundleOf(
+ ARGUMENT_KEY to grade,
+ COLOR_THEME_KEY to colorTheme
+ )
+ }
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, 0)
- arguments?.run {
- grade = getSerializable(ARGUMENT_KEY) as Grade
- gradeColorTheme = getSerializable(COLOR_THEME_KEY) as GradeColorTheme
- }
+ grade = requireArguments().serializable(ARGUMENT_KEY)
+ gradeColorTheme = requireArguments().serializable(COLOR_THEME_KEY)
}
override fun onCreateView(
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt
index 2af59c011..edc384c5e 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/grade/statistics/GradeStatisticsFragment.kt
@@ -15,6 +15,7 @@ import io.github.wulkanowy.ui.modules.grade.GradeFragment
import io.github.wulkanowy.ui.modules.grade.GradeView
import io.github.wulkanowy.utils.dpToPx
import io.github.wulkanowy.utils.getThemeAttrColor
+import io.github.wulkanowy.utils.serializable
import io.github.wulkanowy.utils.setOnItemSelectedListener
import javax.inject.Inject
@@ -48,8 +49,8 @@ class GradeStatisticsFragment :
messageContainer = binding.gradeStatisticsRecycler
presenter.onAttachView(
view = this,
- type = savedInstanceState?.getSerializable(SAVED_CHART_TYPE) as? GradeStatisticsItem.DataType,
- subjectName = savedInstanceState?.getSerializable(SAVED_SUBJECT_NAME) as? String,
+ type = savedInstanceState?.serializable(SAVED_CHART_TYPE),
+ subjectName = savedInstanceState?.serializable(SAVED_SUBJECT_NAME),
)
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt
index f9d463510..5e2cc65dc 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/homework/details/HomeworkDetailsDialog.kt
@@ -7,6 +7,7 @@ import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
+import androidx.core.os.bundleOf
import androidx.recyclerview.widget.LinearLayoutManager
import dagger.hilt.android.AndroidEntryPoint
import io.github.wulkanowy.R
@@ -14,6 +15,7 @@ import io.github.wulkanowy.data.db.entities.Homework
import io.github.wulkanowy.databinding.DialogHomeworkBinding
import io.github.wulkanowy.ui.base.BaseDialogFragment
import io.github.wulkanowy.utils.openInternetBrowser
+import io.github.wulkanowy.utils.serializable
import javax.inject.Inject
@AndroidEntryPoint
@@ -35,16 +37,14 @@ class HomeworkDetailsDialog : BaseDialogFragment(), Homew
private const val ARGUMENT_KEY = "Item"
fun newInstance(homework: Homework) = HomeworkDetailsDialog().apply {
- arguments = Bundle().apply { putSerializable(ARGUMENT_KEY, homework) }
+ arguments = bundleOf(ARGUMENT_KEY to homework)
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NO_TITLE, 0)
- arguments?.run {
- homework = getSerializable(ARGUMENT_KEY) as Homework
- }
+ homework = requireArguments().serializable(ARGUMENT_KEY)
}
override fun onCreateView(
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt
index aac60b56d..8f237e537 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/LoginActivity.kt
@@ -2,8 +2,11 @@ package io.github.wulkanowy.ui.modules.login
import android.content.Context
import android.content.Intent
+import android.content.pm.PackageManager
+import android.os.Build.VERSION_CODES.TIRAMISU
import android.os.Bundle
import android.view.MenuItem
+import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.fragment.app.commit
import dagger.hilt.android.AndroidEntryPoint
@@ -16,6 +19,9 @@ import io.github.wulkanowy.ui.modules.login.form.LoginFormFragment
import io.github.wulkanowy.ui.modules.login.recover.LoginRecoverFragment
import io.github.wulkanowy.ui.modules.login.studentselect.LoginStudentSelectFragment
import io.github.wulkanowy.ui.modules.login.symbol.LoginSymbolFragment
+import io.github.wulkanowy.ui.modules.main.MainActivity
+import io.github.wulkanowy.ui.modules.notifications.NotificationsFragment
+import io.github.wulkanowy.utils.AppInfo
import io.github.wulkanowy.utils.UpdateHelper
import javax.inject.Inject
@@ -28,6 +34,9 @@ class LoginActivity : BaseActivity(), Logi
@Inject
lateinit var updateHelper: UpdateHelper
+ @Inject
+ lateinit var appInfo: AppInfo
+
companion object {
fun getStartIntent(context: Context) = Intent(context, LoginActivity::class.java)
}
@@ -55,7 +64,7 @@ class LoginActivity : BaseActivity(), Logi
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
- if (item.itemId == android.R.id.home) onBackPressed()
+ if (item.itemId == android.R.id.home) onBackPressedDispatcher.onBackPressed()
return true
}
@@ -71,6 +80,22 @@ class LoginActivity : BaseActivity(), Logi
openFragment(LoginStudentSelectFragment.newInstance(studentsWithSemesters))
}
+ fun navigateToNotifications() {
+ val isNotificationsPermissionRequired = appInfo.systemVersion >= TIRAMISU
+ val isPermissionGranted = ContextCompat.checkSelfPermission(
+ this, "android.permission.POST_NOTIFICATIONS"
+ ) == PackageManager.PERMISSION_GRANTED
+
+ if (isNotificationsPermissionRequired && !isPermissionGranted) {
+ openFragment(NotificationsFragment.newInstance(), clearBackStack = true)
+ } else navigateToFinish()
+ }
+
+ fun navigateToFinish() {
+ startActivity(MainActivity.getStartIntent(this))
+ finish()
+ }
+
fun onAdvancedLoginClick() {
openFragment(LoginAdvancedFragment.newInstance())
}
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt
index 786bbfce8..b9afba986 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/recover/LoginRecoverFragment.kt
@@ -98,7 +98,7 @@ class LoginRecoverFragment :
loginRecoverButton.setOnClickListener { presenter.onRecoverClick() }
loginRecoverErrorRetry.setOnClickListener { presenter.onRecoverClick() }
loginRecoverErrorDetails.setOnClickListener { presenter.onDetailsClick() }
- loginRecoverLogin.setOnClickListener { (activity as LoginActivity).onBackPressed() }
+ loginRecoverLogin.setOnClickListener { (activity as LoginActivity).onBackPressedDispatcher.onBackPressed() }
}
with(bindingLocal.loginRecoverHost) {
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt
index c42a4e9d1..03aced14e 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectFragment.kt
@@ -13,10 +13,10 @@ import io.github.wulkanowy.data.repositories.PreferencesRepository
import io.github.wulkanowy.databinding.FragmentLoginStudentSelectBinding
import io.github.wulkanowy.ui.base.BaseFragment
import io.github.wulkanowy.ui.modules.login.LoginActivity
-import io.github.wulkanowy.ui.modules.main.MainActivity
import io.github.wulkanowy.utils.AppInfo
import io.github.wulkanowy.utils.openEmailClient
import io.github.wulkanowy.utils.openInternetBrowser
+import io.github.wulkanowy.utils.serializable
import javax.inject.Inject
@AndroidEntryPoint
@@ -51,7 +51,7 @@ class LoginStudentSelectFragment :
binding = FragmentLoginStudentSelectBinding.bind(view)
presenter.onAttachView(
view = this,
- students = requireArguments().getSerializable(ARG_STUDENTS) as List,
+ students = requireArguments().serializable(ARG_STUDENTS),
)
}
@@ -79,9 +79,8 @@ class LoginStudentSelectFragment :
}
}
- override fun openMainView() {
- startActivity(MainActivity.getStartIntent(requireContext()))
- requireActivity().finish()
+ override fun navigateToNext() {
+ (requireActivity() as LoginActivity).navigateToNotifications()
}
override fun showProgress(show: Boolean) {
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt
index 3455b3cf1..5a40a6bc3 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectPresenter.kt
@@ -100,7 +100,7 @@ class LoginStudentSelectPresenter @Inject constructor(
}
is Resource.Success -> {
syncManager.startOneTimeSyncWorker(quiet = true)
- view?.openMainView()
+ view?.navigateToNext()
logRegisterEvent(studentsWithSemesters)
}
is Resource.Error -> {
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt
index f2acd76c5..8d403271b 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/studentselect/LoginStudentSelectView.kt
@@ -9,7 +9,7 @@ interface LoginStudentSelectView : BaseView {
fun updateData(data: List>)
- fun openMainView()
+ fun navigateToNext()
fun showProgress(show: Boolean)
diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt
index 36c40d156..ab27ecf3f 100644
--- a/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt
+++ b/app/src/main/java/io/github/wulkanowy/ui/modules/login/symbol/LoginSymbolFragment.kt
@@ -18,11 +18,7 @@ import io.github.wulkanowy.databinding.FragmentLoginSymbolBinding
import io.github.wulkanowy.ui.base.BaseFragment
import io.github.wulkanowy.ui.modules.login.LoginActivity
import io.github.wulkanowy.ui.modules.login.LoginData
-import io.github.wulkanowy.utils.AppInfo
-import io.github.wulkanowy.utils.hideSoftInput
-import io.github.wulkanowy.utils.openEmailClient
-import io.github.wulkanowy.utils.openInternetBrowser
-import io.github.wulkanowy.utils.showSoftInput
+import io.github.wulkanowy.utils.*
import javax.inject.Inject
@AndroidEntryPoint
@@ -54,7 +50,7 @@ class LoginSymbolFragment :
binding = FragmentLoginSymbolBinding.bind(view)
presenter.onAttachView(
view = this,
- loginData = requireArguments().getSerializable(SAVED_LOGIN_DATA) as LoginData,
+ loginData = requireArguments().serializable(SAVED_LOGIN_DATA),
)
}
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 5cd6fa103..d332ee350 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
@@ -6,6 +6,8 @@ import android.os.Build.VERSION_CODES.P
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
+import androidx.activity.OnBackPressedCallback
+import androidx.activity.addCallback
import androidx.core.view.ViewCompat
import androidx.core.view.isVisible
import androidx.fragment.app.DialogFragment
@@ -50,6 +52,8 @@ class MainActivity : BaseActivity(), MainVie
@Inject
lateinit var appInfo: AppInfo
+ private var onBackCallback: OnBackPressedCallback? = null
+
private var accountMenu: MenuItem? = null
private val overlayProvider by lazy { ElevationOverlayProvider(this) }
@@ -88,6 +92,9 @@ class MainActivity : BaseActivity(), MainVie
this.savedInstanceState = savedInstanceState
messageContainer = binding.mainMessageContainer
updateHelper.messageContainer = binding.mainFragmentContainer
+ onBackCallback = onBackPressedDispatcher.addCallback(this, enabled = false) {
+ presenter.onBackPressed()
+ }
val destination = intent.getStringExtra(EXTRA_START_DESTINATION)
?.takeIf { savedInstanceState == null }
@@ -266,6 +273,7 @@ class MainActivity : BaseActivity(), MainVie
analytics.popCurrentScreen(navController.currentFrag!!::class.simpleName)
navController.pushFragment(fragment)
+ onBackCallback?.isEnabled = !isRootView
}
override fun popView(depth: Int) {
@@ -273,10 +281,7 @@ class MainActivity : BaseActivity