package Ġcy . ac . uc y . cs . any place . lib . android . view models Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . text . Sp ann able String Ċ import Ġandroid . text . style . ForegroundColor Span Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . lifecycle .* Ċ import Ġandroidx . preference . Preference Ċ import Ġcy . ac . uc y . cs . any place . lib . R Ċ import Ġcy . ac . uc y . cs . any place . lib . android . LOG Ċ import Ġcy . ac . uc y . cs . any place . lib . android . consts . CONST . Companion . EXCEPTION _ MSG _ HTTP _ FOR BID EN Ċ import Ġcy . ac . uc y . cs . any place . lib . android . consts . CONST . Companion . MSG _ ERR _ N PE Ċ import Ġcy . ac . uc y . cs . any place . lib . android . consts . CONST . Companion . MSG _ ERR _ ONLY _ SSL Ċ import Ġcy . ac . uc y . cs . any place . lib . android . data . Repository Ċ import Ġcy . ac . uc y . cs . any place . lib . android . data . datastore . DataStore Misc Ċ import Ġcy . ac . uc y . cs . any place . lib . android . data . datastore . DataStore Server Ċ import Ġcy . ac . uc y . cs . any place . lib . android . data . datastore . DataStore User Ċ import Ġcy . ac . uc y . cs . any place . lib . android . data . datastore . Query Select Space Ċ import Ġcy . ac . uc y . cs . any place . lib . android . data . db . entities . Space Entity Ċ import Ġcy . ac . uc y . cs . any place . lib . android . data . db . entities . Space Type Ċ import Ġcy . ac . uc y . cs . any place . lib . android . data . db . entities . User Ownership Ċ import Ġcy . ac . uc y . cs . any place . lib . android . extensions . TAG Ċ import Ġcy . ac . uc y . cs . any place . lib . android . extensions . app Ċ import Ġcy . ac . uc y . cs . any place . lib . android . utils . Any place Utils Ċ import Ġcy . ac . uc y . cs . any place . lib . android . utils . Gen Utils Ċ import Ġcy . ac . uc y . cs . any place . lib . android . utils . network . Ret rofit Holder Ċ import Ġcy . ac . uc y . cs . any place . lib . models . Spaces Ċ import Ġcy . ac . uc y . cs . any place . lib . models . Version Ċ import Ġcy . ac . uc y . cs . any place . lib . network . Network Result Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġretrofit 2 . Response Ċ import Ġjava . lang . Exception Ċ import Ġjava . lang . NullPointerException Ċ import Ġjava . net . Connect Exception Ċ import Ġjava . net . Unknown ServiceException Ċ import Ġjavax . inject . Inject Ċ Ċ // ĠTODO : ĠPM ĠSE PAR ATE ĠCORE ĠAPP Ġ( Main ViewModel ) Ġwith Ġsomething Ġspecific Ċ // Ġ Ġ( e . g . ĠSpace ViewModel , ĠLogin ) Ċ Ċ @ H ilt ViewModel Ċ class ĠMain ViewModel Ġ@ Inject Ġconstructor ( ĊĠ Ġapp : ĠApplication , ĊĠ Ġprivate Ġval Ġrepository : ĠRepository , ĊĠ Ġprivate Ġval Ġretrofit Holder : ĠRet rofit Holder , ĊĠ Ġprivate Ġval Ġdata Store Server : ĠData Store Server , ĊĠ Ġprivate Ġval Ġdata Store Misc : ĠData Store Misc , ĊĠ Ġprivate Ġval Ġdata Store User : ĠData Store User , ĊĠ Ġ): ĠAndroid ViewModel ( app ) Ġ{ ĊĊĠ Ġ// ĠP REFER ENCES ĊĠ Ġval Ġserver Preferences Ġ= Ġdata Store Server . read Server Prefs ĊĊĠ Ġ//// ĠRET RO FIT ĊĠ Ġ// //// ĠMutable ĠData ĊĠ Ġval Ġversion Response : ĠMutable LiveData < Network Result < Version >> Ġ= ĠMutable LiveData () ĊĊĠ Ġvar Ġnetwork Status Ġ= Ġfalse ĊĠ Ġ/** Ġnormal Ġvar , Ġfilled Ġby Ġthe Ġobserver Ġ( Select Space Activity ) Ġ*/ ĊĠ Ġvar Ġback Online Ġ= Ġfalse ĊĠ Ġvar Ġread Back Online Ġ= Ġdata Store Misc . read Back Online . as LiveData () ĊĊĠ Ġvar Ġread User LoggedIn Ġ= Ġdata Store User . read User . as LiveData () ĊĊĠ Ġvar Ġback From Settings = Ġfalse Ġ// ĠINFO Ġfilled Ġby Ġthe Ġobserver Ġ( collected Ġfrom Ġthe Ġfragment ) ĊĠ Ġvar Ġread Back From Settings = Ġdata Store Misc . read Back From Settings . as LiveData () ĊĊĠ Ġfun Ġdisplay Backend Version ( version Preferences : ĠPreference ?) Ġ= ĊĠĠĠ ĠviewModel Scope . launch Ġ{ Ġdisplay Backend Version Safe Call ( version Preferences ) Ġ} ĊĊĠ Ġprivate Ġsuspend Ġfun Ġdisplay Backend Version Safe Call ( version Preferences : ĠPreference ?) Ġ{ ĊĠĠĠ ĠLOG . D 4 ( TAG , Ġ" getVersion Safe Call : Ġ${ ret rofit Holder . base URL }") ĊĠĠĠ Ġversion Preferences ?. summary Ġ= Ġ" re aching Ġserver Ġ.. " ĊĊĠĠĠ Ġvar Ġmsg Ġ= Ġ"" ĊĠĠĠ Ġvar Ġexception Ġ: ĠException ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġversion Color Ġ: ĠFore ground Color Span ? Ġ= Ġnull ĊĠĠĠĠĊĠĠĠ Ġif Ġ( app . has Internet Connection ()) Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrepository . remote . getVersion () ĊĠĠĠĠĠĠĠ Ġversion Response . value Ġ= Ġhandle Version Response ( response ) ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġversion Response . value !!. data ĊĠĠĠĠĠĠĠ Ġif Ġ( version Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġpretty Version Ġ= ĠAny place Utils . pretty Version ( version ) ĊĠĠĠĠĠĠĠĠĠ Ġmsg Ġ= Ġ"$ pretty Version Ġ( connected : Ġ${ Gen Utils . pretty Time () })" ĊĠĠĠĠĠĠĠĠĠ Ġversion Preferences ?. icon Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġexception Ġ= ĠException (" Failed Ġto Ġget Ġversion .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġcatch ( e : ĠUnknown ServiceException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . E ( TAG , Ġ" EXCEPTION : Ġ${ e . message }") ĊĠĠĠĠĠĠĠ Ġexception Ġ= Ġe ĊĠĠĠĠĠĠĠ Ġe . let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . message ?. contains ( EXCEPTION _ MSG _ HTTP _ FOR BID EN ) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= ĠException ( MSG _ ERR _ ONLY _ SSL ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġversion Response . value Ġ= ĠNetwork Result . Error ( e . message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġcatch ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . E ( TAG , Ġ" EXCEPTION : Ġ${ e . message }") ĊĠĠĠĠĠĠĠ Ġexception Ġ= Ġwhen Ġ( e ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġis ĠNullPointerException Ġ-> ĠException ( MSG _ ERR _ N PE ) ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġversion Response . value Ġ= ĠNetwork Result . Error ( exception ?. message ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġexception Ġ= ĠException (" No Ġinternet Ġconnection .") ĊĠĠĠ Ġ} ĊĠĠĠ Ġexception ?. let Ġ{ Ġit Ġ-> ĊĠĠĠĠĠ Ġmsg Ġ= Ġit . message . toString () ĊĠĠĠĠĠ Ġversion Preferences ?. setIcon ( R . drawable . ic _ sad ) ĊĠĠĠĠĠ ĠLOG . E ( msg ) ĊĠĠĠĠĠ ĠLOG . E ( it ) ĊĊĠĠĠĠĠ Ġversion Color Ġ= ĠFore ground Color Span ( app . getColor ( R . color . red Dark )) ĊĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠ Ġversion Preferences ?. setIcon ( R . drawable . ic _ happy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsp ann able Msg Ġ= ĠSp ann able String ( msg ) ĊĠĠĠ Ġversion Color ?. let Ġ{ Ġsp ann able Msg . set Span ( version Color , Ġ 0 , Ġsp ann able Msg . length , Ġ 0 ) Ġ} ĊĠĠĠ Ġversion Preferences ?. summary Ġ= Ġsp ann able Msg ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġhandle Version Response ( response : ĠResponse < Version >): ĠNetwork Result < Version >? Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠ Ġresponse . message (). toString (). contains (" timeout ") Ġ-> ĠNetwork Result . Error (" Timeout .") ĊĠĠĠĠĠ Ġresponse . body () !!. version . isEmpty () Ġ-> ĠNetwork Result . Error (" Version Ġnot Ġfound .") ĊĠĠĠĠĠ Ġresponse . is Successful Ġ-> ĠNetwork Result . Success ( response . body () !! ) Ġ// Ġcan Ġbe Ġnullable ĊĠĠĠĠĠ Ġelse Ġ-> ĠNetwork Result . Error (" Cannot Ġreach Ġserver .") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġshow Network Status () Ġ{ ĊĠĠĠ Ġif Ġ(! network Status ) Ġ{ ĊĠĠĠĠĠ ĠToast . makeText ( getApplication (), Ġ" No Ġinternet Ġconnection !", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠ Ġsave Back Online ( true ) ĊĠĠĠ Ġ} Ġelse Ġif ( network Status Ġ&& Ġback Online ) Ġ Ġ{ ĊĠĠĠĠĠ ĠToast . makeText ( getApplication (), Ġ" Back Ġonline !", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠ Ġsave Back Online ( false ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġsave Back Online ( value : ĠBoolean ) Ġ= ĊĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠ Ġdata Store Misc . save Back Online ( value ) ĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġset Back From Settings () Ġ= Ġsave Back From Settings ( true ) ĊĠ Ġfun Ġunset Back From Settings () Ġ= Ġsave Back From Settings ( false ) ĊĊĠ Ġprivate Ġfun Ġsave Back From Settings ( value : ĠBoolean ) Ġ= ĊĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ Ġ Ġdata Store Misc . save Back From Settings ( value ) Ġ} Ċ } Ċ