/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 Ġmar lon lom . Ċ Ġ* Ċ Ġ* Ġ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 Ġdev . mar lon lom . apps . book bar . saved Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . widget . add TextChanged Listener Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġandroidx . navigation . nav Graph ViewModels Ċ import Ġandroidx . recyclerview . widget . Divider Item Decoration Ċ import Ġandroidx . recyclerview . widget . Item Touch Helper Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġdev . mar lon lom . apps . book bar . R Ċ import Ġdev . mar lon lom . apps . book bar . databinding . Fragment Books Saved Binding Ċ import Ġdev . mar lon lom . apps . book bar . model . database . App Database Ċ import Ġdev . mar lon lom . apps . book bar . model . database . book _ detail . Book Detail Ċ import Ġdev . mar lon lom . apps . book bar . view bindings . view Binding Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . serialization . Experimental Serialization Api Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠSaved Ġbooks Ġscreen Ġfragment Ġclass . Ċ Ġ* Ċ Ġ* Ġ@ author Ġmar lon lom Ċ Ġ*/ Ċ @ Experimental Serialization Api Ċ class ĠSaved Books Fragment Ġ: ĠFragment ( R . layout . fragment _ books _ saved ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġui Binding Ġby Ġview Binding ( Fragment Books Saved Binding :: bind ) ĊĠĠĠ Ġprivate Ġval Ġui ViewModel : ĠSaved Books Contract . ViewModel Ġby Ġnav Graph ViewModels ( R . id . navigation _ book store ) Ġ{ Ġnew ViewModel Factory () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnew ViewModel Factory (): ĠSaved Books Contract . ViewModel Factory Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . w (" Getting Ġnew ĠViewModel Ġusing Ġlocal Ġdatabase Ġfor Ġsaved Ġbooks Ġlisting Ġ... ") ĊĠĠĠĠĠĠĠ Ġval Ġapp Database Ġ= ĠApp Database . get Database ( require Context ()) ĊĠĠĠĠĠĠĠ Ġval Ġlocal DataSource Ġ= ĠSaved Books Contract . Local DataSource ( app Database ) ĊĠĠĠĠĠĠĠ Ġval Ġrepository Ġ= ĠSaved Books Contract . Repository ( local DataSource ) ĊĠĠĠĠĠĠĠ Ġreturn ĠSaved Books Contract . ViewModel Factory ( repository ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ ĠTim ber . d (" on View Created ") ĊĠĠĠĠĠĠĠ Ġsetup Screen () ĊĠĠĠĠĠĠĠ Ġobtain Saved Books () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobtain Saved Books () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" obtain Saved Books ") ĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" launch Ġ>> Ġobtaining Ġsaved Ġbooks ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui ViewModel . books . collect Ġ{ Ġbooks Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Found Books ( books ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" launch Ġ>> Ġobtaining Ġbook Ġfiltered Ġsaved Ġbooks ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui ViewModel . filtered Books . collect Ġ{ Ġitems Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" launch Ġ>> Ġnon Ġempty Ġlist Ġof Ġsaved Ġbooks ? Ġ: ${ items . isNotEmpty () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Found Books ( items ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġui ViewModel . retrieve Saved Books () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Found Books ( books : ĠList < Book Detail >) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" process Found Books Ġ-> Ġbooks Ġlist Ġis Ġnot Ġempty ? Ġ${ books . isNotEmpty () }") ĊĠĠĠĠĠĠĠ Ġ( ui Binding . list Saved Books . adapter Ġas ĠSaved Books ListAdapter ). submit List ( books ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Screen () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" setup Screen ") ĊĠĠĠĠĠĠĠ Ġui Binding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Saved Books . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Has Fixed Size ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayoutManager ( require Context (), ĠLinearLayoutManager . VERTICAL , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠSaved Books ListAdapter ( handle Saved Book ListItem Clicked ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Item Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDiv ider Item Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĠDiv ider Item Decoration . VERTICAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Touch Helper Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠItem Touch Helper ( Swipe ToDelete Callback ( handle Un saved Book ListItem Clicked )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Touch Helper . attach To RecyclerView ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text Search Saved . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd TextChanged Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Saved Book By Text ( it . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfilter Saved Book By Text ( text To Filter : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" filter Saved Book By Text : Ġ$ text To Filter ") ĊĠĠĠĠĠĠĠ Ġif Ġ( text To Filter . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui ViewModel . search Saved Books ( text To Filter ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui ViewModel . retrieve Saved Books () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhandle Saved Book ListItem Clicked : Ġ( Book Detail ) Ġ-> ĠUnit Ġ= Ġ{ Ġbook Ġ-> ĊĠĠĠĠĠĠĠ ĠTim ber . d (" handle Saved Book ListItem Clicked : Ġ$ book ") ĊĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( Saved Books Fragment Directions . goto Saved Book Details ( book . isbn 1 3 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġhandle Un saved Book ListItem Clicked : Ġ( Int , ĠBook Detail ) Ġ-> ĠUnit Ġ= ĊĠĠĠĠĠĠĠ Ġ{ Ġdeleted Position , Ġbook Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" handle Un saved Book ListItem Clicked : Ġ$ book ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġui ViewModel . toggle Saved ( book . isbn 1 3 , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). window . decor View , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . text _ saved _ books _ un saved , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Action ( R . string . label _ saved _ books _ undo _ delete ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperform Saved State Rest or ation ( deleted Position , Ġbook ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġperform Saved State Rest or ation ( deleted Position : ĠInt , Ġbook : ĠBook Detail ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsaved Books ListAdapter Ġ= Ġui Binding . list Saved Books . adapter Ġas ĠSaved Books ListAdapter ĊĠĠĠĠĠĠĠ Ġval Ġcurrent List Ġ= Ġsaved Books ListAdapter . current List . to Mutable List (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( deleted Position , Ġbook ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsaved Books ListAdapter . submit List ( Collections . unmodifiable List ( current List )) ĊĠĠĠĠĠĠĠ Ġui ViewModel . toggle Saved ( book . isbn 1 3 , Ġtrue ) ĊĠĠĠ Ġ} Ċ }