package Ġcom . example . fam reen . application . screens Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . view . WindowManager Ċ import Ġandroid . widget . Adapter View Ċ import Ġcom . example . fam reen . R Ċ import Ġcom . example . fam reen . application . items . Scre ens Spinner Item Ċ import Ġcom . example . fam reen . application . logging . Logger Ċ import Ġcom . example . fam reen . application . preferences . App Preferences Ċ import Ġcom . example . fam reen . states . Screen States Ċ import Ġio . reactivex . Observer Ċ import Ġio . reactivex . ob servers . Disposable Observer Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠS cre ens ( private Ġval Ġm Service Context : ĠContext ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDI ARY _ SCREEN Ġ= Ġ" DI ARY _ SCREEN " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSEARCH _ SCREEN Ġ= Ġ" SEARCH _ SCREEN " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTRAN SL ATE _ SCREEN Ġ= Ġ" TRANSL ATE _ SCREEN " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ SCREEN Ġ= Ġ" T URN _ SCREEN " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Observer : ĠObserver < Screen States > ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Scre ens Listener : ĠAdapter View . On ItemSelected Listener ĊĠĠĠ Ġprivate Ġvar ĠmCurrent View : ĠView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm WindowManager : ĠWindow Manager Ġ= Ġm Service Context . getSystem Service ( Context . WINDOW _ SERVICE ) Ġas ĠWindow Manager ĊĊĠĠĠ Ġinit { ĊĠĠĠĠĠĠĠ Ġinit Observer () ĊĠĠĠĠĠĠĠ Ġinit Spinner Listener () ĊĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġstart (){ ĊĠĠĠĠĠĠĠ Ġm Observer . onNext ( Screen States . Open State ( DEFAULT _ SCREEN )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġinit Observer (){ ĊĠĠĠĠĠĠĠ Ġm Observer Ġ= Ġobject Ġ: ĠDis posable Observer < Screen States >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Next ( it : ĠScreen States ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( it ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠScreen States . Create State Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate View ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠScreen States . Remove State Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove View ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠScreen States . Update State Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠScreen States . Open State Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Screen ( it . screen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . log ( Log . ERROR , Ġ" init Ġscreens Ġcore Ġexception ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonComplete () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġopen Screen ( screen : ĠString ){ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( screen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDI ARY _ SCREEN Ġ-> ĠDi ary Screen ( m Service Context , m Observer , Ġm Scre ens Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSEARCH _ SCREEN Ġ-> ĠSearch Screen ( m Service Context , m Observer , Ġm Scre ens Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTRAN SL ATE _ SCREEN Ġ-> ĠTranslation Screen ( m Service Context , m Observer , Ġm Scre ens Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDEFAULT _ SCREEN Ġ-> ĠDefault Screen ( m Service Context , m Observer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġcreate View ( it : ĠScreen States . Create State ){ ĊĠĠĠĠĠĠĠ ĠmCurrent View Ġ= Ġit . view ĊĠĠĠĠĠĠĠ Ġm WindowManager . addView ( m Current View , it . params ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġremove View ( it : ĠScreen States . Remove State ){ ĊĠĠĠĠĠĠĠ ĠmCurrent View Ġ= Ġit . view ĊĠĠĠĠĠĠĠ Ġm WindowManager . remove View Immediate ( m Current View ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġupdate View ( it : ĠScreen States . Update State ){ ĊĠĠĠĠĠĠĠ ĠmCurrent View Ġ= Ġit . view ĊĠĠĠĠĠĠĠ Ġm WindowManager . update View Layout ( m Current View , it . params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Spinner Listener (){ ĊĠĠĠĠĠĠĠ Ġm Scre ens Listener Ġ= Ġobject Ġ: ĠAdapter View . On ItemSelected Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon ItemSelected ( parent : ĠAdapter View <* >, Ġview : ĠView , Ġposition : ĠInt , Ġid : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscreens Spinner Item Ġ= Ġparent . getItem At Position ( position ) Ġas ĠS cre ens Spinner Item ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( screens Spinner Item . m Image ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . img _ screens _ di ary Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Preferences . get Provider () !!. write Last Screen ( DI ARY _ SCREEN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer . onNext ( Screen States . Remove State ( m Current View Ġas ĠView )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer . onNext ( Screen States . Open State ( DI ARY _ SCREEN )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . img _ screens _ search Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Preferences . get Provider () !!. write Last Screen ( SEARCH _ SCREEN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer . onNext ( Screen States . Remove State ( m Current View Ġas ĠView )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer . onNext ( Screen States . Open State ( SEARCH _ SCREEN )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . img _ screens _ translate Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Preferences . get Provider () !!. write Last Screen ( TRANSL ATE _ SCREEN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer . onNext ( Screen States . Remove State ( m Current View Ġas ĠView )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Observer . onNext ( Screen States . Open State ( TRANSL ATE _ SCREEN )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Nothing Selected ( parent : ĠAdapter View < *> ?) Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }