From a5d0f4212d2a0375333001c0754ff4fe0f100206 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sat, 17 Sep 2022 15:00:34 +0200 Subject: [PATCH] [UI/Login] Make Lab accessible from login page. --- .../edziennik/ui/debug/LabFragment.kt | 12 ++++-- .../edziennik/ui/debug/LabPageFragment.kt | 18 ++++++-- .../edziennik/ui/debug/LabProfileFragment.kt | 11 +++-- .../edziennik/ui/login/LoginActivity.kt | 2 + .../ui/login/LoginChooserFragment.kt | 39 ++++++++++++++++-- app/src/main/res/drawable/face_2.png | Bin 0 -> 13724 bytes app/src/main/res/layout/login_activity.xml | 18 +++++--- app/src/main/res/navigation/nav_login.xml | 7 ++++ 8 files changed, 88 insertions(+), 19 deletions(-) create mode 100644 app/src/main/res/drawable/face_2.png diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabFragment.kt index 93acec1e..ec47b5b6 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabFragment.kt @@ -8,6 +8,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -17,6 +18,8 @@ import pl.szczodrzynski.edziennik.MainActivity import pl.szczodrzynski.edziennik.databinding.TemplateFragmentBinding import pl.szczodrzynski.edziennik.ext.addOnPageSelectedListener import pl.szczodrzynski.edziennik.ui.base.lazypager.FragmentLazyPagerAdapter +import pl.szczodrzynski.edziennik.ui.login.LoginActivity +import pl.szczodrzynski.edziennik.utils.SwipeRefreshLayoutNoTouch import kotlin.coroutines.CoroutineContext class LabFragment : Fragment(), CoroutineScope { @@ -26,7 +29,7 @@ class LabFragment : Fragment(), CoroutineScope { } private lateinit var app: App - private lateinit var activity: MainActivity + private lateinit var activity: AppCompatActivity private lateinit var b: TemplateFragmentBinding private val job: Job = Job() @@ -36,11 +39,14 @@ class LabFragment : Fragment(), CoroutineScope { // local/private variables go here override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - activity = (getActivity() as MainActivity?) ?: return null + activity = (getActivity() as AppCompatActivity?) ?: return null context ?: return null app = activity.application as App b = TemplateFragmentBinding.inflate(inflater) - b.refreshLayout.setParent(activity.swipeRefreshLayout) + when (activity) { + is MainActivity -> b.refreshLayout.setParent((activity as MainActivity).swipeRefreshLayout) + is LoginActivity -> b.refreshLayout.setParent((activity as LoginActivity).swipeRefreshLayout) + } b.refreshLayout.isEnabled = false return b.root } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabPageFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabPageFragment.kt index 8c9e46fe..aecbecb1 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabPageFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabPageFragment.kt @@ -9,6 +9,7 @@ import android.os.Process import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isVisible import androidx.sqlite.db.SimpleSQLiteQuery import com.chuckerteam.chucker.api.Chucker @@ -35,7 +36,7 @@ class LabPageFragment : LazyFragment(), CoroutineScope { } private lateinit var app: App - private lateinit var activity: MainActivity + private lateinit var activity: AppCompatActivity private lateinit var b: LabFragmentBinding private val job: Job = Job() @@ -45,7 +46,7 @@ class LabPageFragment : LazyFragment(), CoroutineScope { // local/private variables go here override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - activity = (getActivity() as MainActivity?) ?: return null + activity = (getActivity() as AppCompatActivity?) ?: return null context ?: return null app = activity.application as App b = LabFragmentBinding.inflate(inflater) @@ -55,6 +56,16 @@ class LabPageFragment : LazyFragment(), CoroutineScope { override fun onPageCreated(): Boolean { b.app = app + if (app.profile.id == 0) { + b.last10unseen.isVisible = false + b.fullSync.isVisible = false + b.clearProfile.isVisible = false + b.rodo.isVisible = false + b.removeHomework.isVisible = false + b.unarchive.isVisible = false + b.profile.isVisible = false + } + b.last10unseen.onClick { launch(Dispatchers.Default) { val events = app.db.eventDao().getAllNow(App.profileId) @@ -139,7 +150,8 @@ class LabPageFragment : LazyFragment(), CoroutineScope { b.profile += profiles.map { TextInputDropDown.Item(it.id.toLong(), "${it.id} ${it.name} archived ${it.archived}", tag = it) } b.profile.select(app.profileId.toLong()) b.profile.setOnChangeListener { - activity.loadProfile(it.id.toInt()) + if (activity is MainActivity) + (activity as MainActivity).loadProfile(it.id.toInt()) return@setOnChangeListener true } diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabProfileFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabProfileFragment.kt index 995f3133..5b289ea4 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabProfileFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/debug/LabProfileFragment.kt @@ -8,6 +8,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -22,6 +23,7 @@ import pl.szczodrzynski.edziennik.ext.input import pl.szczodrzynski.edziennik.ext.set import pl.szczodrzynski.edziennik.ext.startCoroutineTimer import pl.szczodrzynski.edziennik.ui.base.lazypager.LazyFragment +import pl.szczodrzynski.edziennik.ui.login.LoginActivity import pl.szczodrzynski.edziennik.utils.SimpleDividerItemDecoration import kotlin.coroutines.CoroutineContext @@ -31,7 +33,7 @@ class LabProfileFragment : LazyFragment(), CoroutineScope { } private lateinit var app: App - private lateinit var activity: MainActivity + private lateinit var activity: AppCompatActivity private lateinit var b: TemplateListPageFragmentBinding private val job: Job = Job() @@ -45,7 +47,7 @@ class LabProfileFragment : LazyFragment(), CoroutineScope { } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - activity = (getActivity() as MainActivity?) ?: return null + activity = (getActivity() as AppCompatActivity?) ?: return null context ?: return null app = activity.application as App b = TemplateListPageFragmentBinding.inflate(inflater) @@ -142,7 +144,10 @@ class LabProfileFragment : LazyFragment(), CoroutineScope { .show() } catch (e: Exception) { - activity.error(ApiError.fromThrowable(TAG, e)) + if (activity is MainActivity) + (activity as MainActivity).error(ApiError.fromThrowable(TAG, e)) + if (activity is LoginActivity) + (activity as LoginActivity).error(ApiError.fromThrowable(TAG, e)) } }) diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginActivity.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginActivity.kt index 1f8fb442..61aa4520 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginActivity.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginActivity.kt @@ -20,6 +20,7 @@ import pl.szczodrzynski.edziennik.data.api.models.ApiError import pl.szczodrzynski.edziennik.data.db.entity.LoginStore import pl.szczodrzynski.edziennik.databinding.LoginActivityBinding import pl.szczodrzynski.edziennik.ui.error.ErrorSnackbar +import pl.szczodrzynski.edziennik.utils.SwipeRefreshLayoutNoTouch import kotlin.coroutines.CoroutineContext class LoginActivity : AppCompatActivity(), CoroutineScope { @@ -32,6 +33,7 @@ class LoginActivity : AppCompatActivity(), CoroutineScope { lateinit var navOptions: NavOptions val nav by lazy { Navigation.findNavController(this, R.id.nav_host_fragment) } val errorSnackbar: ErrorSnackbar by lazy { ErrorSnackbar(this) } + val swipeRefreshLayout: SwipeRefreshLayoutNoTouch by lazy { b.swipeRefreshLayout } private val job: Job = Job() override val coroutineContext: CoroutineContext diff --git a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginChooserFragment.kt b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginChooserFragment.kt index b793b34b..1bfe0abd 100644 --- a/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginChooserFragment.kt +++ b/app/src/main/java/pl/szczodrzynski/edziennik/ui/login/LoginChooserFragment.kt @@ -66,6 +66,8 @@ class LoginChooserFragment : Fragment(), CoroutineScope { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { if (!isAdded) return + val adapter = LoginChooserAdapter(activity, this::onLoginModeClicked) + b.versionText.setText( R.string.login_chooser_version_format, app.buildManager.versionName, @@ -73,10 +75,33 @@ class LoginChooserFragment : Fragment(), CoroutineScope { ) b.versionText.onClick { app.buildManager.showVersionDialog(activity) + if (!App.devMode) + return@onClick + if (adapter.items.firstOrNull { it is LoginInfo.Register && it.internalName == "lab" } != null) + return@onClick + adapter.items.add( + index = 0, + element = LoginInfo.Register( + loginType = 999999, + internalName = "lab", + registerName = R.string.menu_lab, + registerLogo = R.drawable.face_2, + loginModes = listOf( + LoginInfo.Mode( + loginMode = 0, + name = 0, + icon = 0, + guideText = 0, + credentials = listOf(), + errorCodes = mapOf() + ) + ) + ) + ) + adapter.notifyItemInserted(0) + b.list.smoothScrollToPosition(0) } - val adapter = LoginChooserAdapter(activity, this::onLoginModeClicked) - LoginInfo.chooserList = LoginInfo.chooserList ?: LoginInfo.list.toMutableList() @@ -164,7 +189,7 @@ class LoginChooserFragment : Fragment(), CoroutineScope { anim.fillAfter = true activity.getRootView().startAnimation(anim) - b.list.smoothScrollToPosition(0) + adapter.items.removeAll { it !is LoginInfo.Register } adapter.items.add( LoginInfo.Register( loginType = 74, @@ -183,7 +208,8 @@ class LoginChooserFragment : Fragment(), CoroutineScope { ) ) ) - adapter.notifyItemInserted(adapter.items.size - 1) + adapter.notifyDataSetChanged() + b.list.smoothScrollToPosition(adapter.items.size - 1) } when { @@ -216,6 +242,11 @@ class LoginChooserFragment : Fragment(), CoroutineScope { return } + if (loginType.internalName == "lab") { + nav.navigate(R.id.labFragment, null, activity.navOptions) + return + } + if (!app.config.privacyPolicyAccepted) { MaterialAlertDialogBuilder(activity) .setTitle(R.string.privacy_policy) diff --git a/app/src/main/res/drawable/face_2.png b/app/src/main/res/drawable/face_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c67b2ba932f6ab9cf7638c22c26a41debef1df GIT binary patch literal 13724 zcmY*=2T)UAuy+axA+*qYmlA3~lp?)@k=|=)(i9@LfCvc&PVEId^XT$7YEPcX?@JA@?hRD6n@PRde>1Ex z?4nCA|9{(4pige$`*a(6EJBbID7dZBdxQ7kn8*u=SUhMXz78&#kly9bMS)`^3-QIR zFhy!6=cHnT1Au#v!g(9}5U89@Am@;CU~ah64&^%i+(`sRbY$2LI$zL+i?wWtaRMfF zOo~$tG10k`?$qnqZ(xIXL6(RfH;6YE-uQ*(Z{875HDfaH4xky_3^4(?;kGa7RVU${ z1ZwsNz#3L!L(mh(p`DZaACFFj&PfJ{l%4%sKhWv@3kWY=GPo14Nw*1O0=p7$%yI2X z14V_r3qa3ZPbI)`u{>GKl;R3^1gf4dt4x>v`TXZ4@I62q*jGEN;{_o`3m?G4w7uo(0jOb{By;|!Ryatt%UC2I|uPm>5u zfMRdR2Lc%H?^H}PY3_0O(g zu19?G5KBpk3{MU*qi8l==Ha}J_?Dm4Xt zt5{xv){td^F@l{8dGM&3p{z(gEHf5q?&7>NUUqZ)JUL9+0Y8zq#pejRl$Gt2*mc54D8lgA$0Wu0wKwvvqktrC8C zUc*2isaWPGhpu%)*h#|CNtk2clFVZ3WfN&&?(OM~h+%_E^h<2)A3cKS=D777>BaIM z?wrHAa}90t*0Gk2N}9XQTAUc$>VPbPoe9Xu`tQLglVZZJCocI_BYRIa;d771EFDcp zYOdTvSY*MYnWi8sD(Earh1f6+swIYfAg=*r8#GUm6F$^w#`Uo>BH}aByLE;m&kZE$ zOl14;rz`eK4$`>J_1~~&4c9t+(`JccB&A|`e>5Z}EI?9!d2TzqC?x`A z-00g+73)w`z#Jzjxoh642nXy?F5anjVSgSj$e@Kb zVHJJ#{sMH_*t~C}RdBtVUZ)}aT|6yRq%iy@c}V452n?$;aKH4nQ<-Y#g^?*Wl4C++ zG{Z_X)u=G$VU1;b)%YM__5dsc6+b9Ga|eL6$@+6-IHiBAk7014=;W zfo~n93f)66D#|BjCN0fyQCEsC=L$Dfoax6^&ipP*nY-YCEX6MREB)-mBm~O`Zq^jC zq)fNw>)iS*1L_|!l}L=l9pQ_P{3D+ywt=PEzcmy0bLsN|QsV8--1nPrh`_rI|2?w? zRvY{kM@IAq+=t>UFo7b`z8Y90R>RySNC98B6nPyI9lw-5t3w%3_>Qcnx3&~5c>&Qx ziukGsEOs%i1U7#y;$?Sccej)(JE)xpIw7LzYIMNyV=y)Mi$F&w6);X{sT65+GVNDjF z4CkBYTM9*Y+?OaXtCHO0W<51qZr^|yRwY)BVw z$vg)D7gsdBdf)8aCDnf9BuFrR2c^vNYbyTVjbs_~2ypJU?^H5>2QH8899LShAD)0)K3p+U68L?=~DBckVWP zp#s$Y!Las9UI-t~=rTVfi?{Ge{8RFvpZsL1^WY~hEDt(oYI0Z1qnIEmsmSn`r>uZ# zfiVUnjZV?{C19R|{|jmIf=o;1m!dO03v$^?=<;LoO#fAO@-p=gH-j^T22eOhC4qc|u!8A43zZ%^fZn68EmRvu;T&yCDL$>U{`H z1${R;SU57&lhSiByWZPyUwG+igFoV(Go&tldNFaZn=}(Gcihn>MRtIxWsNSOktH~@ z*6!EPpQ2B@4V6{Xg6+*4O0iQVrKD@O{d>VeJC$eUJ~uD%Atl5LZFl`{M?FX zb_ZSn=JhMRpYGs=_Uw8lgG@X#{!YW50%v6b$SfpJs~nu*Q_h*7AK1yH1rYS&X7#pM z0B7<_m9-f9F_Y92me22Oy?pBrO7y;$jr3brt7+GPlMi(0y@N-u*XU|Z0lKOVcp5Y_ zEBrZGkuf_sSeLz)Y9jSX+Ihq9SD+{%Lz%HLEw~TTNp1}Z)4NR1FeLdQID6U zeisM4Nn{`1#Dw?~;JwRFn2B*Sv+q^k3OTZ7j?T#88(B==bhBrvS?yHB2kawE1arzT?mJ z*t~sLx_0;wz!P}2aELBP^qZN*Hc?Fs-frZ|YCu|hgWLGrov5r09RAzx1*40;Xf%A) zj>@kRi7>Bl8Fkn~r*7C|)#;Y5UVGuS_gr3LO^7#`=A`AV2HK`^D^?K%%_}UutxSZ7 z9yT>}cPbw={bi&^rNR8JpzXwZ-;g7Sa)2#Ru0-AygJAZOm(L*x-^)XVjB>}1jTbon ztdJ`7&c9_i?p-+gTTHQ5;O*X_bNQz^@Pq_!b?u3Q6Ua@FAAvS1u6=YwBy0;HU8n_} zn^))7b9G~@p^tue1fr%M^*S~F$VzX_`^-`&%_!~ zUtpE=v74*LHq+1wJ|ZM<{rjStjU!OQ_Upw>*>f)*G@kG!l-nrwauU0%8e2^N$^yhz z{dMlJ{IJ*qOJz+2nDrlh`KKxF57Zzw02sRt+0C$H${k zJkU}!C z!(djs0@*r?LTsf{SE=9Ir`zWdI{N(?(!=#vu2Gz#7uCs%q({aD<=fqcNjC8rnGhYt zK2f3?p>Fv1AW+w^Ke9butQpWSlem-g5Ee5@o{M@*{~aBA{{>H6OL^qpD1#!u99|tOMbWm$g&MZQ#hY}?)+CapqFAy{BC=|XRlhIp;{^>q zRRy)Y7##*{OM?PWPE}T0Lgc_kbkl{KQ1Eo`|W4|zi%%M2Cq#)fP1 zX;<2E#XhzJL|mkkvYA%3ynFLiy4z`3`Ma9u$d)v0pV&9Puqy{pJCKmyu48rpLdrKW zVSsCD3(SQ_aY$O-f{sSfo7ojLV*H1MyZplA148#MgwJ;TSaHzVa*2T)D6z<`=erdY z8wh&0H^~RL|Gcg)2yxeoIAg;N-X7c{nhYSS;XjHu!uN{>4J;1PeXe|rdQ&jTFN{mu zGrK#wZ%vnc+YR$sl;B?P?6hAgC%5jKPIL1zCma2xr;#2H@cYD8i@)M4J(G@McE67HvHU+jel(yJBBvD*S>?wSKb>>603ihRSro| zASmb8JkIijO9Wins#7mgh>+ zGB=-bSu-$Vz|PCN+fUtM!d}^VJW1)2ozwh2F)q7s+^Rls*vD_6!=JE45L-C>kl1P= z0^%?qu$4=>{Q>7<;;LjwN<|7E8nDTI9%2Y|Lh=h(ByMCpkQx12IVEu3YI*b!36L;L zh@k9f&C7kKf<>L2ICQF%v(+hj?#*t7Q{JkS@16h|$1=uoU|zyb!(+0wGgy(vX?IIk zFgn$HYRgkg72e{l0)*`TuEtB7S(s`o;ExcY`Yx`MbCHfh+3GB>WZdp87xffAmp;N0 zn-$9=!wSjITiv&3y|3ETPLZYk_ErM}evPatN+14NxVdi!crE@CKpx^e0MY!y-ib!; zy1Q_>e}&!1PHDGm->A@m+r@7NbnZh=4X2(Fhw9mR*0mcdCLcu-SCy22@fq1^_kDE# zX-guED-Q(-CHJ1OF^2JE7qKS+m5J|VBre^*^+R=0ZSSX;C)mFkP9oBD<-EmA4bCLD z*QfYfmU8y&tPjjKsR)HqO@vc1R0F0q8zU~f`Ri`2>m65e$D@*^cV}_i-7h_hY>?xp z(CkasGHi^}vsq^Llw^hrkJ)*F$FsdGpGt;6e^RK=YZ#A7)%lChgmY%z0=Dx1hH?&< zjVOrHODK;A`#PW&k79Fe{)kEbe&uJ37;j8rnb?Ou{kjYlq<1&&kiNRlauYwCwJWCg z>J0?@9IlMs6`IiJg(UZQ7*45G7X4k|IRg$FDI(s23RNiN4^hr3Lh(yLeB{L7t0pIa zON#f-kLzUY1iC&2+T3&NMz=(3t76&Arj492bD9f@Gwd>5?Y}FfcRPUEPJo~kV3*d? zg78*#&MXVB+2YtW?=BAVO3rXClBP`Sy!+6YK@Oi~*4Nf#0~iYm-c7>)U6^E6uFrYE zudtqIASG%6Cqrs_mQEI;^@q{nzCUAFIbMbYVU~uy<1cq&R*KCw1LvxpQtDnLnGmiJABUdBJgE?tzlwYNOHeQ{j0dT!3)~UMpEfja69Z6K~ zmA$GETpMUpXFY6s6k3#13mD_?t;_hpj{{ftAf631H;fRiPm=oSh)1$Zcd{#t6+Um+ z_f^_OKrlOhyh7J{S=GdjyBk1i*99?RG|Rr)oh#XP=6{p5?@o35ey^zmA^wQHeV{XN z{xtiwxmm(vVp$V_A`Ei}=AkVXcIw9_O^s7>qzTH#~7R07{`M;Qhd zfqdgu6rLr@3ll3nE@1P$E-Rdi9LhUUVDe#HCU+)SH_6fo6$PhqPy^0IJ-x5;mT!QI zx6=Z3LGvi`HTTg=z)Hb5kcehB2PC@aWvn z4y13Utp>MVRXKp4S%b<>b!ppB&@7UNEWkg0AWvkN93T%ZsdN!4ZG|zrmp16AzNGTJyJmjD)A}h87NkcJumP5 zHeUQqK@(JF&%fUw#L4t#(O#fL z9?}FbSt^}X5bw!O8N7###A5^-=YY&&)1^6a1SOpMQS-Q=A6>zE?}n=oH6Yt7d$ll1 z=cW9V7tqfE|2!~x$IH$H*%4q_A1M1-4uR8EuJMkwx@s}SH~wmdPUdKHz9q_02@ z;QvO@Nej=Ywet5KaHB6b-@`hyQF(l+oEjFA7(ZE@7k#0 zXIZYmGE0V*8;xgFOmnE`FT7Y@CNa2a+XKGurkNg#S@tf;vj4}s1QbMlFqn2(Ni1)9 z&@f{n#U?tbXl|RCZtA@f!r2{oYzaAECN}^i?-Mxqlm<6Lo7a>D9SLdXo*MEd>iNW| zwdMU@womkT)|R(7sdq^{PJpUMY+Hw?EL6d4r!C9owUsw6Tls+H{IBOn%RL|mQZ&0m z%Xhk5Fyq$j0f(g?S`hP{sG)))qt~F3Th;6JCP3kj!q|7`7oMJQbKQ_ygyz^! zX?HLj+#FTZmB^4FB)yae=Yp>po4jy`)H%>`kuQ@Wz|u$D+}d2vzF3bo|KgJg$lNvm z+Y}N*g=2op&V9`3_B#W5Fp+>}aaTdWWvzmBiM9|0S)8X+gER(-1tI^EO%H_JGs%;c zx76G?vx3U|u3X~v{Pj{a?NN?S=-p~#bOCXVW6op*@Yc9r~_;lib4=p)OL4_G_1KI{I8} zu@)jryPwT*<~N(3=Qq@VoWED{^x<-yr-TdOs!>DN;GHyAdu0}y;?-!Qun}OMxlWg4$-n$(L@^(c#w18#Pd_%x+B+-H0?AOD2R*Lj@9mr{~vxMg;iC_dhibN#(9#qi!w@&i_o6UN*@kZrVr z43F>CeH&j0s!oun@IomZgG6NzhxT2Zz4=VfaL>)urk8bVQGh7t9_dvH!C^Y&g6^43 z9VjBRu8aB_WK4YZk-o~?ix+qe7iJzA^F>|ZEU3RUQB0AM=D?T*!ptuB^0FLf9^Rg5 zz7+;bOa$RT34`~m{*BFu99$@yyOB3v%gtp{kq>~JSTL#`_LMcuu-Y}~G^XyeZF_#+ zW)t%JW9^()}d^Rmf~w8C$%pIvM0tFr)9`LVZecxRHN6ka`G!z_N zcl+-|Ma7|>c=Cw1BdF8K;7?!2XX0*%HTlRFGr!ZL!l_2=JC=BGn*>%zth)9_)X?)f zs<69CXM2!~5Z!V71-ZQV67BqaA8#9Y_tRK+YH%Jt<7SZ1n!{0CQM-;)Dr0&{vqZ)* zibp+;!8Xbw#6&2Y1F!wIV?2KMiOCsn+g`i@;A&@2@55V(zjW#=k~Lu*gj%9hj!irx z0?LTFfQ3>v@xz-;XrC>qMD>e^K%1a7*C+Ti{IdB#G5*~Q#IA`yhm?Ie{G+J9GGxRi zfU%JL><`c4!(i9RU+7aY9p&U3|BdoyEDW*2|1e@syyAaLn`%M1;2CDDp^SfV+YxY{ z@cL|-Rrn3nzl_&J^P2AVK6N27d`HP<(=Dc|ToAp;1&&VT`zRzVP}cYIbsZAFLN-6Q z(s4!>G|vpn(cS#Htb45Z4T|GH$+ein;jb)Ka4ERb&Z_h5kmrBf7NAJE0AoFj7O&d4 zR~Ca@`bqyEK{wPeP}FD%V{fna{D;{RumMlE%peGn^VuAz^t-$8}2-U_77_L)@NXU0ox{+R^%1eV@lK1}w!=KMCz0AK^F%akj1jyQ57!>5*Y9&-Ycw0 z%Ju~YUg08Z5wpzt69FB2x2Ysgk^^|e`p}0vg;;TBaX|;%OOj(i=Z87D5Ufkvw|ah5 zcEA4X$%Zqu_hXBfQs<&0ovXb_L^HkOxnt(Q-!fw#Tbn^ z6lC53O#bYs31Z}31YnIX*&8$gSv#|;ASbsn5Q=np*xCAC;v_>Enwu(0eW>%)VcFV^ zEzkyX7Mj!G?lROr$BD0=UtKN-EWC)kqJQRWnh&%A3-~Pj#VbojpQ_ZlsxlIvYw=u! z(tvVgzjwI(ixzzrHSFN|WiL^=~I4Cm<$M zLf1x31@*RNZM%vAJKA;tS2l<>DQBm0Te>Vz7v1F5WD+^8S7_{Ib*k{=zHx9z2Keg1 zZDmd1`_#XrNc@5UVK#7Szci}qA66)Q2{ItAW zQIDQxD-w;fq&9Ls5K?{~{e@*L<-a8pUXJ9VqNpPepPm3jB!+&x0hw8_;BpoqASY0{ z=nymNA3Y}WI7AucEgw1$RdF@q(rA9s5cDIG3d#P`Q4av*|1=iVBUF$V`L-`_Y>5ie zZ#tA1I}cYW*VW0e25lwWVaZF8<;2ZA3mTDw(8RUN>F=?%l3$A+e`PE%RDUqTj1JV7 zH!U=NLMmpV;4r6svnX0=7*h=sq>fY=u^QsbfXXP1;w*Hb_jQ$-tX(o7>0#QK>0Gmc z2{%4VU39oEZycd>;P_y13vl9aRZx`mn1AILVCgQx@&op0l7AU{{fvWjGq(|EzF8Nv z^%)P=dF&np6V?4%>Ky>Uh59cS;2UgG+BC11ar6z%CoqC^+k$gsJVdx=qyT~ zn}t6O!ME8^&55ZCasY|OVO)(KLg&MfnHPVdO9Jlc?dO^beJ0@!%RhR3(d8tq)4I1sJj!>5+K5YsSMFqSlG*`Yd+o#MoRSDewsX?4xiEfQz zr1IK`CUq%+&#d`d2v%ds--?gE`CMyIhND<-hJ8Xz!vdCYssC}n$+)k+*}$yiaixK^ z|13gjEC(iFcQyS(@e&H!itibMD$s|nIwPNTm4uJ}{qw1CfYq?Z#m!m(cFn@?mMA3* ze}#XSrQA@@wX+gV_LrmDQbg?QCEtGxI=n<4#&-zpvfLyq5T3lLL;?)+aLBsbbleuG z@z`sEg-=8`nJ!2cRa{swY^^Pi`Ft0Gx&k=>(u9gR?CS~S?<)T$yHyXFg6b~WF-2^L zQ?F(lcPJ+u1>=&*bSK4}_R~=R`mL0D~J zl-@wVj^h_jGUxTK(&OTZfW^e3b1m?~(V|WBf0u0TCALd%UM4(wP6-V>^aB3}($keL zSJeP!9I$^GXeqGJq*hb*LsmI4=H$lE%_k>d!>Gp^+f8JSo!m>OT%NuDk_M@M!&dw2 zvUsgnRD2-R0d0&i@m&!8?DH%Dz@o_D5+sStjE)gh7nu?>I*HVuTJ$g+S>htLXrG+8 zzwvK>%uei--$^BNkg2fH3?96P`5~6C^tJ#|j_?|Bm5x2%naDUgB8k211<=#d%Hy z<5e~bA6|cKU`*Wwd^~wt4){tYkS$@W%2#5BM+t^j3hRXbcbGYnIrjLsw?Dyt$1b#u zzt2fd-RWFD+rI7OrAXjrin2EI;6@c7b4=eP1{{?V_|fVvzTWSGqw4ca&fMhA^}jdc zILEG%o4!q@Rp+Oo+BmlwjIR`|nMHbL+0rI2;Wa`IHU{Ki+hCy&efNawzodA4c<601 zef{fRb@CodWj)Nz*LI2pD`rvPF=pY=rOh(;APAbs-c$6UW4x2s^Y=y5$&+|)s+)|L zkw#MT$)nQh<}s&$#*i5I8o)&*u}vW|9OJm!uh`Bsr025scjL=yB8nm`ZNjK%*amBh zK)T^}_>_D;4nb5pkjE9NAe1B752K6GBQ}3D%ho5YSNf1vu9GIj>$4P;?b7$9O9B94 zlb4ET8~Z9BTpoCB(DoK9L@K&?egd`h*abEy=YY105BW+(^cHdDE_u-17mT<=cX7v0 z*)e|OD`*lZVn4uI!<4;>IDrbX6}=i4@m9Th;;k$XTA=Kv^B6MH?qi&&tA4v-+FLyh zFZ&i|+0^5{{@qh+`!*TEmUk1c&hpR3q~=Ct+a|1fW9!+%#Bh6@$}3yK+5i%t{jG1U z7XRSUr(2H=L`STE-?Y>)X!2cH9do>7gzi}6MdgL2dcsp54H_3Z=q^iw`;`gZ5@oc* z57F$=ki5--KO`648?sLFx%ANwXf~3N!px^QC}odqR6NSJhLHsc6^s|9Gsw`tBB!z4 z>0ME6IK0a~!T*vWbH{{vE}7SYk@7abd(>gd)CWYpQ8{~)2BI)Ombb`~mH*5wV}%f+ zbW0Po?}H=w{)y3!goA%MEG*_-wq0mp=NCH*g(YZAKTc`ScAK2UT1`8-O||)6pm}75 zJH5Ch;#X4-6Vc0|%2U7c7<-ZagdrLBS6mk!r67t>?@tP`_vvt_ z8dJ|vy(akAMx$j*=O^^}#*v%fo3zVduO{BV3HFhsUC#^;Yl<#>E0sQYPd#tT1>{}E zxCkr~IU$e@%(0Rt;IAI){a(EctjmiZKE)d9>}4p|mWwCC%w?1q8* z)0{4bQ@sWOV02!OzzP>p1Lh?qwr&60v{Ho5d?0x2@Fvj%7Is~)NSqc?u)he_Dckv0 z&JzFXk0%x05D8&$8LM-POoSWc;m)Qg8oXY;zy19{jjYPy2rL(CcS}m~y5HJvo@`F~ zN@_+Zw(<$&JN&9>Sf|b5gX=|V!FdlFSoyU1R^C|Liu}U0wN7O>4K(KK?5W5PkgpRP zee_{+X7^MGYpO8tB&6Jbd?prqAstq6Ck8h4F7SNXBh^!=dJ%N;7XylKDVV)MUi@l% z5I*A*lvE>i%t9gv+N6G%WIxk9hQ${zNZ2l?G$_*wTa+pB`!>xIl9%t-Xg><-sx}@$ zruFCNB@bRk!!j;dKl~u~pxttyhN8o7`2Koa$6e>xa0D`l5*?fn+A+1I{$g)bu9BspOGVb%Lx8?Z7aCA39JwC|rO3wFWCsm{--E0VORsIZsodWR7u@vzY#d2sYhH6vcAPa31o; zv(MW$zPz}7K_Y}~?;ri<*>I=w(sg_gcN9nvZ7W>Wn>IOo_i|qpxR!HbLqcN2>bZ86T2V>gHZ*AFsJCtB8Wt-V>`EBC`NkFJ4|5LTvb@zYc zY7G4xt1YB;X*EtbrgHnyp%kL*s~|8QG>#YOTbpRit%I@`m-=zjv@z^uAEt|&aolDZ zyA>KivJe2avD$=0cic6ex|ag}c7Hqz5}saH1Ub*R&F0=|>UjCCf|Ngm;sEpN`j&s) zE&Mu)eyOhxYaCyWmk>*0ONHjww1H@~Rx;@ih-{F^9o<4d^9^qQ>Nl4S@=Y}mt-Q`Y zE3Yd_tb*nS2Cow+4(}hQN5B$%p_e{0KEuGolb%0~L+g<=PTdFvqG;)ogmlF&ezSgd zDi4XNi%|^Q&CkY2D8b_7(L7w8?4O83(CD?lvwJG#4?u*tOe)F{zlGNobH8GurqCtX zmz8a*Jf2=l=w!`rT>D@v8i)0og7y$!$6rD!fpv>@epK?JE{ZmBLm<|A0%b=#-YSuJ zry={`EnNc*i2CQGyHgCN_q!~pe#Cc~Ft4P$xM%9wi+DY6{OPIo-&DDmw}|Szle(g>Arlx&YPfn>O~Md z7re$Qm_|eJ%_lVW4B(*KKF~ZtaJ%oy8&hWja=J6s2$w)1wx#?oFDC1>;TFAGOX!elyV!PJxQ7AlQ%Rt)%j%Ao;L&Q1=ZR5OuPl%RUZmw7JoQ9 z&&_@=LzLT_W3xd7{o!co>^3$<(UOgv<0OU#_S_JgKixyNb=`&`K5XemB<{x%tfL#C z!L>kY8gJ;o;IEEUY^HG|&O{A()pxCyAE-!U!mm$S`@mCK9aV(b!No*`1Mk>^9 z{u;T4_MPakVLu6!1>lM8DSWCsrU1`d<=D+mWwP0F*C5kN;!U5=iU8mms zucbz7z=Jq$M*O(e3$3K@GQtDCxZ_TJgR4fYgDO-slhSJ#`+d#T(p!a%z7|e$KXRWXl9R&{ z<ERGHC*Bcob^Of-9AIgKd`p%m z9bO4z63{TaP%nnnP;AK>-&ur23>QST4!v__N)|s!k%AWRQr%Sa(dn%lh&}kG2-4D5vP3vAPjxT70Hh>2uGWyFj^H z)oX|o_#(vB!rv-#Ad6)&51RR5W@#5Tnk|Ej0E-cj;SqfS%PEHUCH`GR@LprSMt=r$ zKCKS5HDHiIJ~7PeA}kYFWuvqshUOlKU`)bwSCPNUqV>2TrA;D~7W`|JeuaSu*?_oo z?ps#VN!hP6vk8G*^=aJ^mNCzL?5NNCpkjTFF(&7Gc+5RTsVSVcxyvrYEp@Er=OC$GK${&Qe+)1Yn)0Y*wGq#&r zZ03PCK-qc*+>yTs9w?4mt6ztiM_!(7E`u1WLJ{#2FXpvo`BumvLh7F4%)7zl7EZcT zTcXleEDQ2UK-{7$K)aWdOYkDyMG2%5mqroYd8h4bZO+;~Dpc3(%jR4+Y9~B5#9#r1 z$3wj<;o9%tu_YkMb0)!a^>ESZzBN|D;{K@Bb;nk642oE4l`i|fEJQxOLpvrqxh3H@ zNqtC_s4E(Ufh@}6U1jmZAS-WMFYb;mcBa8kwPt5so8+Q9gS+xL+&%^A_!svT-^0s z*7C=U*LD|?EQU15+GLMbtxt3zU)>;x>s5N#K;vl^!;~ggnk19H`RiV$9kRulcdt(c zX0JY~A2Zo`1q%F((`T$xth*%jqDcTX^O}Xds1Mp7&K!$6~wm z+)X5+dXj`T@jt2sVv*{J32T2V0tQxEn~}Ey?>)pVpsjd3ecbXWh>a7#RK;)lD+Y_s7J|%L0 - + android:layout_height="match_parent"> + + + + +