package Ġcom . tech be lo ved . h ym nb ook . play lists Ċ Ċ import Ġandroidx . h ilt . lifecycle . ViewModel Inject Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġcom . tech be lo ved . h ym nb ook . data . model . Playlist Ċ import Ġcom . tech be lo ved . h ym nb ook . h ym n listing . H ym n Item Model Ċ import Ġcom . tech be lo ved . h ym nb ook . h ym n listing . Title Item Ċ import Ġcom . tech be lo ved . h ym nb ook . use cases . L ce Ċ import Ġcom . tech be lo ved . h ym nb ook . utils . Scheduler Provider Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . Observable Transformer Ċ import Ġio . reactivex . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . subjects . Publish Subject Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠPlay lists ViewModel Ġ@ ViewModel Inject Ġconstructor ( private Ġval Ġplay lists Repo : ĠPlay lists Repo , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġscheduler Provider : ĠScheduler Provider ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġplay lists Live Ġ= ĠMutable LiveData < L ce < List < H ym n Item Model >> >() ĊĊĠĠĠ Ġval Ġplay lists Data : ĠLive Data < L ce < List < H ym n Item Model >>> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġplay lists Live ĊĊĠĠĠ Ġprivate Ġval Ġ_ playlist Status : ĠMutable LiveData < Playlist Status > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġplaylist Status : ĠLive Data < Playlist Status > Ġget () Ġ= Ġ_ playlist Status ĊĊĠĠĠ Ġprivate Ġval Ġdis pos ables Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġprivate Ġval Ġdelete Subject : ĠPublish Subject < Delete Action > Ġ= ĠPublish Subject . create () ĊĊĠĠĠ Ġprivate Ġval Ġrefresh Subject : ĠPublish Subject < String > Ġ= ĠPublish Subject . create () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġload Play lists () ĊĠĠĠĠĠĠĠ Ġsetup Delete Logic () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Play lists () Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh Subject . start With (" refresh "). switch Map Ġ{ Ġplay lists Repo . get Play lists () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( play lists To Models ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. compose ( l ce Mapper ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start With ( L ce . Loading ( true )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( scheduler Provider . ui ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġplay lists Live . value Ġ= Ġit Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay lists Live . value Ġ= ĠL ce . Error ( it . message Ġ?: Ġ" error Ġgetting Ġplay lists ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġdis pos ables . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġl ce Mapper (): ĠObservable Transformer < List < T >, ĠL ce < List < T >>> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable Transformer Ġ{ Ġupstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupstream . map Ġ{ ĠL ce . Content ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay lists To Models (): ĠObservable Transformer < List < Playlist >, ĠList < H ym n Item Model >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable Transformer Ġ{ Ġupstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupstream . map Ġ{ Ġplay lists Ġ-> Ġplay lists . map Ġ{ ĠTitle Item ( it . id , Ġit . title , Ġit . description , Ġit . description ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġa Ġdelete Ġaction Ġis Ġfired , Ġwe Ġwait Ġfor Ġlike Ġ 5 Ġseconds Ġbefore Ġproceed ing . ĠIf Ġthe Ġuser Ġch oo ses Ġto Ġcancel Ġthe Ġrequest , Ġthen Ġwe Ġdo Ġnot Ġproceed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsetup Delete Logic () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġdelete Subject . switch Map Ġ{ Ġaction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDelete Action . Delete Ġ-> ĠObservable . timer ( 5 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay lists Repo . delete Playlist ById ( action . playlist Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. and Then ( Observable . just ( Playlist Status . Deleted )). cast ( Playlist Status :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. onError Resume Next ( Observable . just ( Playlist Status . Error ( Throwable (" Error Ġdeleting Ġplaylist ")), ĠPlaylist Status . None )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDelete Action . Cancel Ġ-> ĠObservable . just ( Playlist Status . None ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( scheduler Provider . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( scheduler Provider . ui ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġ_ playlist Status . value Ġ= Ġit Ġ}, Ġ{ ĠTim ber . w ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġdis pos ables . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUse Ġto Ġinitiate Ġplaylist Ġdelete . ĠThe Ġplaylist Ġis Ġtemporarily Ġremoved Ġfrom Ġthe Ġvisible Ġlist . ĠIf Ġthe Ġuser Ġch oo ses Ġto Ġundo , ĊĠĠĠĠ Ġ* Ġwe Ġwant Ġto Ġcancel Ġthe Ġdelete Ġrequest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrequest Playlist Delete ( playlist Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent List Ġ= Ġwhen Ġ( val Ġcurrent Value Ġ= Ġplay lists Live . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠL ce . Content Ġ-> Ġcurrent Value . content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠL ce . Loading Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠL ce . Error Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġplay lists Live . value Ġ= ĠL ce . Content ( current List . filter Ġ{ Ġit . id Ġ!= Ġplaylist Id Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ_ playlist Status . value Ġ= ĠPlaylist Status . Delete Requested ĊĠĠĠĠĠĠĠ Ġdelete Subject . onNext ( Delete Action . Delete ( playlist Id )) ĊĠĠĠĠĠĠĠ Ġ_ playlist Status . value Ġ= ĠPlaylist Status . None ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġundo Delete () Ġ{ ĊĠĠĠĠĠĠĠ Ġdelete Subject . onNext ( Delete Action . Cancel ) ĊĠĠĠĠĠĠĠ Ġrefresh Subject . onNext (" undo Refresh ") ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ sealed Ġclass ĠPlaylist Status Ġ{ ĊĠĠĠ Ġobject ĠDeleted Ġ: ĠPlaylist Status () ĊĠĠĠ Ġobject ĠDelete Requested Ġ: ĠPlaylist Status () ĊĠĠĠ Ġobject ĠNone Ġ: ĠPlaylist Status () ĊĠĠĠ Ġdata Ġclass ĠError ( val Ġerror : ĠThrowable ) Ġ: ĠPlaylist Status () Ċ } Ċ Ċ sealed Ġclass ĠDelete Action Ġ{ ĊĠĠĠ Ġdata Ġclass ĠDelete ( val Ġplaylist Id : ĠInt ) Ġ: ĠDelete Action () ĊĠĠĠ Ġobject ĠCancel Ġ: ĠDelete Action () Ċ } Ċ