/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . core . splash screen Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . os . Build . VERSION . PRE VIEW _ SDK _ INT Ċ import Ġandroid . os . Build . VERSION . SDK _ INT Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View . On Layout ChangeListener Ċ import Ġandroid . view . View Tree Observer . On Pre Draw Listener Ċ import Ġandroid . widget . ImageView Ċ import Ġandroidx . annotation . MainThread Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . core . splash screen . Splash Screen . Keep On Screen Condition Ċ Ċ /** Ċ Ġ* ĠCompat ibly Ġclass Ġfor Ġthe ĠSpl ash Screen ĠAPI Ġintroduced Ġin ĠAPI Ġ 3 1 . Ċ Ġ* Ċ Ġ* ĠOn ĠAPI Ġ 3 1 + Ġ( Android Ġ 1 2 +) Ġthis Ġclass Ġcalls Ġthe Ġplatform Ġmethods . Ċ Ġ* Ċ Ġ* ĠPri or ĠAPI Ġ 3 1 , Ġthe Ġplatform Ġbehavior Ġis Ġreplic ated Ġwith Ġthe Ġexception Ġof Ġthe ĠAnimated ĠVector Ċ Ġ* ĠDrawable Ġsupport Ġon Ġthe Ġlaunch Ġscreen . Ċ Ġ* Ċ Ġ* ĠTo Ġuse Ġthis Ġclass , Ġthe Ġtheme Ġof Ġthe Ġstarting ĠActivity Ġneeds Ġset Ġ[ R . style . Theme _ Splash Screen ] Ġas Ċ Ġ* Ġits Ġparent Ġand Ġthe Ġ[ R . attr . window Splash Screen Animated Icon ] Ġand Ġ[ R . attr . post Splash Screen Theme ]` Ċ Ġ* Ġattribute Ġneed Ġto Ġbe Ġset . Ċ Ġ*/ Ċ @ Suppress Lint (" Custom Splash Screen ") Ċ public Ġclass ĠSpl ash Screen Ġprivate Ġconstructor ( activity : ĠActivity ) Ġ{ ĊĊĠĠĠ Ġ@ Suppress Lint (" New Api ") Ġ// ĠTODO ( 1 8 8 8 9 7 3 9 9 ) ĠRemove Ġonce Ġ" S " Ġis Ġfinal ized ĊĠĠĠ Ġprivate Ġval Ġimpl Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ ĠSDK _ INT Ġ>= Ġ 3 1 Ġ-> ĠImp l 3 1 ( activity ) ĊĠĠĠĠĠĠĠ ĠSDK _ INT Ġ== Ġ 3 0 Ġ&& ĠPRE VIEW _ SDK _ INT Ġ> Ġ 0 Ġ-> ĠImp l 3 1 ( activity ) ĊĠĠĠĠĠĠĠ ĠSDK _ INT Ġ>= Ġ 2 3 Ġ-> ĠImp l 2 3 ( activity ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠImp l ( activity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġa Ġ[ Splash Screen ] Ġinstance Ġassociated Ġwith Ġthis Ġ[ Activity ] Ġand Ġhandles ĊĠĠĠĠĠĠĠĠ Ġ* Ġsetting Ġthe Ġtheme Ġto Ġ[ R . attr . post Splash Screen Theme ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġneeds Ġto Ġbe Ġcalled Ġbefore Ġ[ Activity . set ContentView ] Ġor Ġother Ġview Ġoperation Ġon ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġroot Ġview Ġ( e . g Ġsetting Ġflags ). ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠAlternatively , Ġif Ġa Ġ[ Splash Screen ] Ġinstance Ġis Ġnot Ġrequired , Ġthe Ġthem Ġcan Ġmanually Ġbe ĊĠĠĠĠĠĠĠĠ Ġ* Ġset Ġusing Ġ[ Activity . set Theme ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġpublic Ġfun ĠActivity . install Splash Screen (): ĠSpl ash Screen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplash Screen Ġ= ĠSpl ash Screen ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplash Screen . install () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsplash Screen ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġcondition Ġto Ġkeep Ġthe Ġsplash Ġscreen Ġvisible . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġsplash Ġwill Ġstay Ġvisible Ġuntil Ġthe Ġcondition Ġisn 't Ġmet Ġanymore . ĊĠĠĠĠ Ġ* ĠThe Ġcondition Ġis Ġevaluated Ġbefore Ġeach Ġrequest Ġto Ġdraw Ġthe Ġapplication , Ġso Ġit Ġneeds Ġto Ġbe ĊĠĠĠĠ Ġ* Ġfast Ġto Ġavoid Ġblocking Ġthe ĠUI . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcondition ĠThe Ġcondition Ġevaluated Ġto Ġdecide Ġwhether Ġto Ġkeep Ġthe Ġsplash Ġscreen Ġon ĊĠĠĠĠ Ġ* Ġscreen ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġset Keep Visible Condition ( condition : ĠKeep On Screen Condition ) Ġ{ ĊĠĠĠĠĠĠĠ Ġimpl . set Keep Visible Condition ( condition ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġa Ġlistener Ġthat Ġwill Ġbe Ġcalled Ġwhen Ġthe Ġsplash screen Ġis Ġready Ġto Ġbe Ġremoved . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġa Ġlistener Ġis Ġset , Ġthe Ġsplash screen Ġwon 't Ġbe Ġautomatically Ġremoved Ġand Ġthe Ġapplication ĊĠĠĠĠ Ġ* Ġneeds Ġto Ġmanually Ġcall Ġ[ Splash Screen View Provider . remove ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIF Ġno Ġlistener Ġis Ġset , Ġthe Ġsplash screen Ġwill Ġbe Ġautomatically Ġremoved Ġonce Ġthe Ġapp Ġis ĊĠĠĠĠ Ġ* Ġready Ġto Ġdraw . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġlistener Ġwill Ġbe Ġcalled Ġon Ġthe Ġui Ġthread . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġ[ On Exit Animation Listener ] Ġthat Ġwill Ġbe Ġcalled Ġwhen Ġthe Ġsplash Ġscreen ĊĠĠĠĠ Ġ* Ġis Ġready Ġto Ġbe Ġdis missed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġset Keep Visible Condition ĊĠĠĠĠ Ġ* Ġ@ see ĠOn Exit Animation Listener ĊĠĠĠĠ Ġ* Ġ@ see ĠSpl ash Screen View Provider ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ SuppressWarnings (" Executor Registration ") Ġ// ĠAlways Ġruns Ġon Ġthe ĠMain Thread ĊĠĠĠ Ġpublic Ġfun Ġset On Exit Animation Listener ( listener : ĠOn Exit Animation Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġimpl . setOn Exit Animation Listener ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinstall () Ġ{ ĊĠĠĠĠĠĠĠ Ġimpl . install () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠListener Ġto Ġbe Ġpassed Ġin Ġ[ Splash Screen . setOn Exit Animation Listener ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġlistener Ġwill Ġbe Ġcalled Ġonce Ġthe Ġsplash Ġscreen Ġis Ġready Ġto Ġbe Ġremoved Ġand Ġprovides Ġa ĊĠĠĠĠ Ġ* Ġreference Ġto Ġa Ġ[ Splash Screen View Provider ] Ġthat Ġcan Ġbe Ġused Ġto Ġcustomize Ġthe Ġexit ĊĠĠĠĠ Ġ* Ġanimation Ġof Ġthe Ġsplash Ġscreen . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġinterface ĠOn Exit Animation Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCallback Ġcalled Ġwhen Ġthe Ġsplash Ġscreen Ġis Ġready Ġto Ġbe Ġdis missed . ĠThe Ġcaller Ġis ĊĠĠĠĠĠĠĠĠ Ġ* Ġresponsible Ġfor Ġanim ating Ġand Ġremoving Ġsplash Ġscreen Ġusing Ġthe Ġprovided ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ splash Screen View Provider ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġcaller Ġ** must ** Ġcall Ġ[ Splash Screen View Provider . remove ] Ġonce Ġit 's Ġdone Ġwith Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġsplash Ġscreen . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġsplash Screen View Provider ĠAn Ġobject Ġholding Ġa Ġreference Ġto Ġthe Ġdisplayed Ġsplash ĊĠĠĠĠĠĠĠĠ Ġ* Ġscreen . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ MainThread ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġon Splash Screen Exit ( splash Screen View Provider : ĠSpl ash Screen View Provider ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCondition Ġevaluated Ġto Ġcheck Ġif Ġthe Ġsplash Ġscreen Ġshould Ġremain Ġon Ġscreen ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġsplash Ġscreen Ġwill Ġstay Ġvisible Ġuntil Ġthe Ġcondition Ġisn 't Ġmet Ġanymore . ĊĠĠĠĠ Ġ* ĠThe Ġcondition Ġis Ġevaluated Ġbefore Ġeach Ġrequest Ġto Ġdraw Ġthe Ġapplication , Ġso Ġit Ġneeds Ġto Ġbe ĊĠĠĠĠ Ġ* Ġfast Ġto Ġavoid Ġblocking Ġthe ĠUI . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġinterface ĠKeep On Screen Condition Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCallback Ġevaluated Ġbefore Ġevery Ġrequests Ġto Ġdraw Ġthe ĠActivity . ĠIf Ġit Ġreturns Ġ` true `, Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġsplash Ġscreen Ġwill Ġbe Ġkept Ġvisible Ġto Ġhide Ġthe ĠActivity Ġbelow . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġcallback Ġis Ġevaluated Ġin Ġthe Ġmain Ġthread . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ MainThread ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġshould Keep On Screen (): ĠBoolean ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġopen Ġclass ĠImp l ( val Ġactivity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfinal Theme Id : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġbackground Res Id : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar ĠbackgroundColor : ĠInt ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġicon : ĠInt Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġvar Ġsplash Screen Wait Predicate Ġ= ĠKeep On Screen Condition Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġanimation Listener : ĠOn Exit Animation Listener ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġm Splash Screen View Provider : ĠSpl ash Screen View Provider ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġinstall () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtyped Value Ġ= ĠTyped Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Theme Ġ= Ġactivity . theme ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Theme . resolve Attribute ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . attr . window Splash Screen Background , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Res Id Ġ= Ġtyped Value . resourceId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbackgroundColor Ġ= Ġtyped Value . data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Theme . resolve Attribute ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . attr . window Splash Screen Animated Icon , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Ġ= Ġtyped Value . resourceId ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Post Splash Screen Theme ( current Theme , Ġtyped Value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġset Post Splash Screen Theme ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Theme : ĠResources . Theme , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Value : ĠTyped Value ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Theme . resolve Attribute ( R . attr . post Splash Screen Theme , Ġtyped Value , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Theme Id Ġ= Ġtyped Value . resourceId ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( final Theme Id Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . set Theme ( final Theme Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠResources . NotFoundException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cannot Ġset ĠApp Theme . ĠNo Ġtheme Ġvalue Ġdefined Ġfor Ġattribute Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . resources . getResource Name ( R . attr . post Splash Screen Theme ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġset Keep Visible Condition ( keep On Screen Condition : ĠKeep On Screen Condition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplash Screen Wait Predicate Ġ= Ġkeep On Screen Condition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent View Ġ= Ġactivity . findViewById < View >( android . R . id . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġcontent View . view Tree Observer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . add On Pre Draw Listener ( object Ġ: ĠOn Pre Draw Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Draw (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( splash Screen Wait Predicate . should Keep On Screen ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent View . view Tree Observer . remove On Pre Draw Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Splash Screen View Provider ?. let (:: dispatch On Exit Animation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġset On Exit Animation Listener ( exit Animation Listener : ĠOn Exit Animation Listener ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Listener Ġ= Ġexit Animation Listener ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplash Screen View Provider Ġ= ĠSpl ash Screen View Provider ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Background Res Id Ġ= Ġbackground Res Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal BackgroundColor Ġ= ĠbackgroundColor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( final Background Res Id Ġ!= Ġnull Ġ&& Ġfinal Background Res Id Ġ!= ĠResources . ID _ NULL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplash Screen View Provider . view . setBackground Resource ( final Background Res Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( final BackgroundColor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplash Screen View Provider . view . set BackgroundColor ( final BackgroundColor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplash Screen View Provider . view . background Ġ= Ġactivity . window . decor View . background ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplash Screen View Provider . view . findViewById < ImageView >( R . id . splash screen _ icon _ view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setBackground Resource ( icon ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplash Screen View Provider . view . add On Layout ChangeListener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠOn Layout ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Layout Change ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview : ĠView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Left : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Top : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Right : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Bottom : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Insets ( view , Ġsplash Screen View Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! view . is Attached To Window ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . remove On Layout ChangeListener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! splash Screen Wait Predicate . should Keep On Screen ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch On Exit Animation ( splash Screen View Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Splash Screen View Provider Ġ= Ġsplash Screen View Provider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdispatch On Exit Animation ( splash Screen View Provider : ĠSpl ash Screen View Provider ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Listener Ġ= Ġanimation Listener Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Listener Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplash Screen View Provider . view . post On Animation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Listener . on Splash Screen Exit ( splash Screen View Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAdjust Ġthe Ġin sets Ġto Ġavoid Ġany Ġjump Ġbetween Ġthe Ġactual Ġsplash Ġscreen Ġand Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* ĠSpl ash Screen ĠView ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġopen Ġfun Ġadjust Insets ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview : ĠView , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplash Screen View Provider : ĠSpl ash Screen View Provider ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo - op ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġ@ Requires Api ( 2 3 ) ĊĠĠĠ Ġprivate Ġclass ĠImp l 2 3 ( activity : ĠActivity ) Ġ: ĠImp l ( activity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadjust Insets ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview : ĠView , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplash Screen View Provider : ĠSpl ash Screen View Provider ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOffset Ġthe Ġicon Ġif Ġthe Ġin sets Ġhave Ġchanged ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Window Insets Ġ= Ġview . root Window Insets ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġty Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Window Insets . system Window Inset Top Ġ- Ġroot Window Insets . system Window Inset Bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplash Screen View Provider . icon View . translation Y Ġ= Ġ- ty . toFloat () Ġ/ Ġ 2 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( 3 1 ) Ġ// ĠTODO ( 1 8 8 8 9 7 3 9 9 ) ĠUpdate Ġto Ġ" S " Ġonce Ġfinal ized ĊĠĠĠ Ġprivate Ġclass ĠImp l 3 1 ( activity : ĠActivity ) Ġ: ĠImp l ( activity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpre Draw Listener : ĠOn Pre Draw Listener ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġinstall () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Post Splash Screen Theme ( activity . theme , ĠTyped Value ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset Keep Visible Condition ( keep On Screen Condition : ĠKeep On Screen Condition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplash Screen Wait Predicate Ġ= Ġkeep On Screen Condition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent View Ġ= Ġactivity . findViewById < View >( android . R . id . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobserver Ġ= Ġcontent View . view Tree Observer ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pre Draw Listener Ġ!= Ġnull Ġ&& Ġobserver . is Alive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . remove On Pre Draw Listener ( pre Draw Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpre Draw Listener Ġ= Ġobject Ġ: ĠOn Pre Draw Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Draw (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( splash Screen Wait Predicate . should Keep On Screen ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent View . view Tree Observer . remove On Pre Draw Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobserver . add On Pre Draw Listener ( pre Draw Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset On Exit Animation Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Animation Listener : ĠOn Exit Animation Listener ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . splash Screen . setOn Exit Animation Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplash Screen View Provider Ġ= ĠSpl ash Screen View Provider ( it , Ġactivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Animation Listener . on Splash Screen Exit ( splash Screen View Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }