package Ġdol phin . android . apps . Blood Service App . ui Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . os . Message Ċ import Ġandroid . text . Sp ann able Ċ import Ġandroid . text . Sp anned Ċ import Ġandroid . text . method . Link Movement Method Ċ import Ġandroid . text . style . Clickable Span Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Stub Ċ import Ġandroid . view . View Tree Observer Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġcom . google . android . gms . ads . Mobile Ads Ċ import Ġcom . google . android . gms . common . Connection Result Ċ import Ġcom . google . android . gms . common . Google Api Availability Ċ import Ġcom . google . firebase . remote config . Firebase Remote Config Ċ import Ġcom . google . firebase . remote config . Firebase Remote Config Settings Ċ import Ġdol phin . android . apps . Blood Service App . Build Config Ċ import Ġdol phin . android . apps . Blood Service App . R Ċ import Ġdol phin . android . apps . Blood Service App . pref . Prefs Util Ċ import Ġdol phin . android . util . Locale Utils Ċ import Ġdol phin . android . util . Package Utils Ċ import Ġjava . lang . ref . Weak Reference Ċ Ċ class ĠSpl ash Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Splash Activity " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġconfig : ĠFirebase Remote Config ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhandler : ĠMy Handler ĊĠĠĠ Ġprivate Ġval Ġready Ġ= ĠMutable LiveData ( false ) ĊĊĠĠĠ Ġoverride Ġfun Ġattach Base Context ( new Base : ĠContext ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . attach Base Context ( Locale Utils . on Attach ( new Base !! )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ splash ) ĊĠĠĠĠĠĠĠ Ġhandler Ġ= ĠMy Handler ( this ) ĊĊĠĠĠĠĠĠĠ ĠfindViewById < TextView >( android . R . id . title )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Info Ġ= ĠPackage Utils . get Package Info ( context , Ġthis :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . P ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Info ?. long Version Code ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Info ?. version Code ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ"-" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// developer . android . com / about / versions / 1 2 / features / splash - screen # implement ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġup Ġan ĠOn Pre Draw Listener Ġto Ġthe Ġroot Ġview . ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Pre Draw Listener () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! check Google Api Availability ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy App : ĠMy Application Ġ= Ġapplication Ġas ĠMy Application Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġmy App . set Google Play Service NotSupported () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġstart MainActivity () ĊĠĠĠĠĠĠĠ Ġprepare Remote Config () ĊĠĠĠĠĠĠĠ Ġhandler . send Empty Message Delayed ( 1 , Ġ 1 0 0 0 ) Ġ// Ġshow Ġloading ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Google Api Availability (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġhttp :// stackoverflow . com / a / 3 1 0 1 6 7 6 1 / 2 6 7 3 8 5 9 ĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġgoogle Ġplay Ġservice Ġand Ġauthentication ĊĠĠĠĠĠĠĠ Ġval Ġgoogle API Ġ= ĠGoogle Api Availability . getInstance () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġgoogle API . is Google Play Services Available ( this ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= ĠConnection Result . SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġgoogle API . getError String ( result )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= ĠfindViewById < TextView >( android . R . id . message ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextView . text Ġ= Ġgoogle API . getError String ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= Ġgoogle API . getError Dialog ( this , Ġresult , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog ?. setOn Dismiss Listener Ġ{ Ġprepare Remote Config () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog ?. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse Ġ// Ġdon 't Ġshow Ġprogress Ġbar ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Remote Config () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGoogle ĠMobile ĠA ds ĠSDK Ġversion Ġ 1 7 . 0 . 0 ĊĠĠĠĠĠĠĠ ĠMobile Ads . initialize ( this ) Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . adapter Status Map . values . forEach Ġ{ Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v ( TAG , Ġ" Mobile Ads : Ġ${ s . initialization State . name } Ġ${ s . description }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconfig Ġ= ĠFirebase Remote Config . getInstance () ĊĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= ĠFirebase Remote Config Settings . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMinimum Fetch Interval InSeconds ( if Ġ( Build Config . DEBUG ) Ġ 6 0 Ġelse Ġ 4 3 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġconfig . set Config Settings Async ( settings ) ĊĠĠĠĠĠĠĠ Ġconfig . set Defaults Async ( R . xml . remote _ config _ defaults ) ĊĠĠĠĠĠĠĠ Ġfetch Firebase Remote Config () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfetch Firebase Remote Config () Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig . fetch And Activate (). add On Complete Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Privacy Policy Review () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Privacy Policy Review () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= ĠP refs Util . getDefault Preference ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġupdate Code Ġ= ĠFirebase Remote Config . getInstance (). getLong (" privacy _ policy _ update _ code ") ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġprivate Ġpolicy Ġhas Ġbeen Ġupdated ĊĠĠĠĠĠĠĠ Ġif Ġ(! prefs . getBoolean ( Navigation Drawer Fragment . PRE F _ USER _ LE ARN ED _ DRAW ER , Ġfalse ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . getLong ( MainActivity . PRE F _ PRIVATE _ POLICY , Ġ 0 ) Ġ< Ġupdate Code ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < View Stub >( android . R . id . list )?. inflate () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < View >( android . R . id . text 2 )?. setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefs . edit (). put Long ( MainActivity . PRE F _ PRIVATE _ POLICY , Ġupdate Code ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart MainActivity () Ġ// Ġconfirm Ġpolicy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// stackoverflow . com / q / 5 1 8 3 6 4 5 / 2 6 7 3 8 5 9 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠgetString ( R . string . splash _ privacy _ policy _ review ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠgetString ( R . string . app _ privacy _ policy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartIndex Ġ= Ġtext . indexOf ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspan Ġ= ĠSp ann able . Factory . getInstance (). new Sp ann able ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspan . set Span ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠClick able Span () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠToast . makeText ( this @ Splash Activity , Ġ" !", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings Fragment . show Privacy Policy Review ( this @ Splash Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex , ĠstartIndex Ġ+ Ġtarget . length , ĠSp anned . SPAN _ EXCL USIVE _ EXCL USIVE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( android . R . id . text 1 )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Text ( span ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovement Method Ġ= ĠLink Movement Method . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart MainActivity () Ġ// Ġeverything Ġis Ġready ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhandler . remove Messages ( 1 ) Ġ// Ġcancel Ġdelay Ġmessage Ġto Ġshow Ġloading ĊĠĠĠĠĠĠĠ Ġhandler . send Empty Message ( 0 ) Ġ// Ġhide Ġloading ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart MainActivity () Ġ{ ĊĠĠĠĠĠĠĠ Ġready . post Value ( true ) ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TASK ĊĠĠĠĠĠĠĠ Ġoverride Pending Transition ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġoverride Pending Transition ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġoverride Pending Transition ( 0 , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( check Google Api Availability ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepare Remote Config () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . send Empty Message ( 1 ) Ġ// Ġshow Ġloading ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" on Activity Result Ġstill Ġno Ġgoogle Ġapi ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠMy Handler ( a : ĠSpl ash Activity ) Ġ: ĠHandler ( Looper . get Main Looper ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġactivity Ġ= ĠWeak Reference ( a ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . get ()?. handle Message ( msg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( android . R . id . progress )?. visibility Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( msg . what Ġ== Ġ 1 ) ĠView . VISIBLE Ġelse ĠView . IN VISIBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Pre Draw Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġhttps :// developer . android . com / about / versions / 1 2 / features / splash - screen # implement ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġup Ġan ĠOn Pre Draw Listener Ġto Ġthe Ġroot Ġview . ĊĠĠĠĠĠĠĠ Ġval Ġcontent : ĠView Ġ= ĠfindViewById ( android . R . id . content ) ĊĠĠĠĠĠĠĠ Ġcontent . view Tree Observer . add On Pre Draw Listener ( object Ġ: ĠView Tree Observer . On Pre Draw Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Draw (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġthe Ġinitial Ġdata Ġis Ġready . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( ready . value Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġcontent Ġis Ġready ; Ġstart Ġdrawing . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent . view Tree Observer . remove On Pre Draw Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġcontent Ġis Ġnot Ġready ; Ġsuspend . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ