package Ġcom . mu zz ley . util . ui Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroidx . annotation . String Res Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . TextView Ċ import Ġcom . mu zz ley . Constants Ċ import Ġcom . mu zz ley . R Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Observable Emitter Ċ import Ġio . reactivex . Observable On Subscribe Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . annotations . NonNull Ċ import Ġio . reactivex . functions . Function Ċ import Ġtim ber . log . Tim ber Ċ import Ġuk . co . de an wild . material show case view . I Show case Listener Ċ import Ġuk . co . de an wild . material show case view . Material Show case View Ċ Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠShow case Builder Ġ{ ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġshow case ( activity : ĠActivity , Ġtitle : ĠString , Ġtext : ĠString , Ġbutton : ĠString , Ġv : ĠView , Ġ@ String Res Ġkey : ĠInt ): ĠObservable < Boolean > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshown ( activity , Ġkey ). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" shown : Ġ$ it , Ġkey : Ġ${ activity . getString ( key )} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow case ( activity , Ġtitle , Ġtext , Ġbutton , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġshowed Now Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Shown ( activity , Ġkey , Ġshowed Now ). map Ġ{ Ġshowed Now Ġ} Ġ// because Ġwhat Ġwe Ġwant Ġto Ġreturn Ġis Ġif Ġit Ġhas Ġshown Ġor Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġshow case ( activity : ĠActivity , Ġtitle : ĠString , Ġtext : ĠString , Ġbutton : ĠString , Ġview Id : ĠInt , Ġ@ String Res Ġkey : ĠInt ): ĠObservable < Boolean > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshown ( activity , Ġkey ). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow case ( activity , Ġtitle , Ġtext , Ġbutton , Ġactivity . findViewById ( view Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġshowed Now Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Shown ( activity , Ġkey , Ġshowed Now ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġshowed Now Ġ} Ġ// because Ġwhat Ġwe Ġwant Ġto Ġreturn Ġis Ġif Ġit Ġhas Ġshown Ġor Ġnot , Ġand Ġnot Ġif Ġit Ġwas Ġsaved ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . just ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġshow case ( activity : ĠActivity , Ġtitle : ĠString , Ġtext : ĠString , Ġbutton : ĠString , Ġtarget : ĠView ): ĠObservable < Boolean > Ġ= ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . create ( Observable On Subscribe < Boolean > Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġobject Ġ: ĠI Show case Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġon Show case Displayed ( material Show case View : ĠMaterial Show case View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġon Show case Dis missed ( material Show case View : ĠMaterial Show case View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" dis missed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onNext ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onComplete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshow case Ġ= ĠMaterial Show case View . Builder ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Mask Colour ( Context Compat . getColor ( activity , ĠR . color . on boarding Background )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle TextColor ( Context Compat . getColor ( activity , ĠR . color . on boarding TextColor )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent TextColor ( Context Compat . getColor ( activity , ĠR . color . on boarding TextColor )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Dismiss TextColor ( Context Compat . getColor ( activity , ĠR . color . on boarding TextColor )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle Text ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Dismiss Text ( button ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Dismiss On Touch ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Listener ( listener ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Delay ( 1 0 0 ) Ġ// Ġoptional Ġbut Ġstarting Ġanimations Ġimmediately Ġin ĠonCreate Ġcan Ġmake Ġthem Ġch op py ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// FIX ME : Ġugly Ġlibrary Ġhack ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtv _ content Ġ= Ġshow case . findViewById ( R . id . tv _ content ) Ġas ĠTextView ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv _ content . alpha Ġ= Ġ 1 f Ġ// undo Ġlibrary Ġob n ox ious Ġbehaviour ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d ( throwable , Ġ" Hack Ġdid Ġnot Ġwork ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow case . show ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" shown ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( throwable : ĠThrowable ) Ġ{ Ġ// Ġcould Ġbe Ġnull Ġor Ġnot Ġvisible ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( throwable , Ġ" error ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( throwable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. delay Subscription ( 1 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĊĠĠĠĠĠĠĠ Ġ// FIX ME : Ġis Ġit Ġover kill Ġto Ġwrap Ġthis Ġin Ġobservable Ġ? ĊĠĠĠĠĠĠĠ Ġ// preferences Ġare ĠIO Ġand Ġprobably Ġshould Ġnot Ġbe Ġcalled Ġin ĠMain Thread ĊĠĠĠĠĠĠĠ Ġ// so Ġwe Ġshould Ġuse Ġa ĠScheduler . io Ġsomewhere ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġshown ( context : ĠContext , Ġ@ String Res Ġanimation Folder : ĠInt ): ĠObservable < Boolean > Ġ= ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . from Callable Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// keep ing Ġthis Ġbecause Ġlegacy Ġ... ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get SharedPreferences ( Constants . ON _ BOARD ING _ PREFER ENCES , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getBoolean ( String . format ("% s _ pref ", Ġ" on boarding /" Ġ+ Ġcontext . getString ( animation Folder )), Ġfalse ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġset Shown ( context : ĠContext , Ġ@ String Res Ġanimation Folder : ĠInt , Ġvalue : ĠBoolean ): ĠObservable < Boolean > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get SharedPreferences ( Constants . ON _ BOARD ING _ PREFER ENCES , ĠContext . MODE _ PRIVATE ). edit (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Boolean ( String . format ("% s _ pref ", Ġ" on boarding /" Ġ+ Ġcontext . getString ( animation Folder )), Ġvalue ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġclear Shown ( context : ĠContext ): ĠObservable < Boolean > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . from Callable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . get SharedPreferences ( Constants . ON _ BOARD ING _ PREFER ENCES , ĠContext . MODE _ PRIVATE ). edit (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }