/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠD uck Duck Go Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . duck duck go . app . bookmarks . ui Ċ Ċ import Ġandroid . net . Uri Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . ListAdapter Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . duck duck go . app . bookmarks . model . Saved Site Ċ import Ġcom . duck duck go . app . browser . R Ċ import Ġcom . duck duck go . app . browser . favicon . Fav icon Manager Ċ import Ġcom . duck duck go . app . global . base Host Ċ import Ġcom . duck duck go . mobile . android . ui . menu . PopupMenu Ċ import Ġcom . duck duck go . mobile . android . ui . view . Two Line ListItem Ċ import Ġkotlinx . android . synt hetic . main . view _ saved _ site _ empty _ hint . view .* Ċ import Ġkotlinx . android . synt hetic . main . view _ saved _ site _ section _ title . view .* Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠBook marks Adapter ( ĊĠĠĠ Ġprivate Ġval Ġlayout Inflater : ĠLayoutInflater , ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠBook marks ViewModel , ĊĠĠĠ Ġprivate Ġval Ġlifecycle Owner : ĠLifecycle Owner , ĊĠĠĠ Ġprivate Ġval Ġfav icon Manager : ĠF av icon Manager Ċ ) Ġ: ĠList Adapter < Book marks Adapter . Book marks Item Types , ĠBook mark Screen View Hold ers >( Book marks Diff Callback ()) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBO OK MARK _ SECTION _ TITLE _ TYPE Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEMPTY _ STATE _ TYPE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBO OK MARK _ TYPE Ġ= Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠBook marks Item Types ĊĠĠĠ Ġobject ĠHeader Ġ: ĠBook marks Item Types ĊĠĠĠ Ġobject ĠEmpty Hint Ġ: ĠBook marks Item Types ĊĠĠĠ Ġdata Ġclass ĠBook mark Item ( val Ġbookmark : ĠSaved Site . Bookmark ) Ġ: ĠBook marks Item Types ĊĊĠĠĠ Ġvar Ġbookmark Items : ĠList < Book marks Item Types > Ġ= Ġempty List () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġgenerate New List ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubmit List ( field ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate New List ( value : ĠList < Book marks Item Types >): ĠList < Book marks Item Types > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( Header ) Ġ+ Ġ( if Ġ( value . isEmpty ()) ĠlistOf ( Empty Hint ) Ġelse Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠBook mark Screen View Hold ers Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( view Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBO OK MARK _ TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġinflater . inflate ( R . layout . view _ saved _ site _ entry , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBook mark Screen View Hold ers . Book marks ViewHolder ( layout Inflater , Ġview , ĠviewModel , Ġlifecycle Owner , Ġfav icon Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBO OK MARK _ SECTION _ TITLE _ TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġinflater . inflate ( R . layout . view _ saved _ site _ section _ title , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBook mark Screen View Hold ers . Section Title ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEMPTY _ STATE _ TYPE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġinflater . inflate ( R . layout . view _ saved _ site _ empty _ hint , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBook mark Screen View Hold ers . Empty Hint ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" view Type Ġnot Ġfound ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ= Ġbookmark Items . size ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠBook mark Screen View Hold ers , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBook mark Screen View Hold ers . Book marks ViewHolder Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . update (( bookmark Items [ position ] Ġas ĠBook mark Item ). bookmark ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBook mark Screen View Hold ers . Section Title Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBook mark Screen View Hold ers . Empty Hint Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( bookmark Items [ position ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHeader Ġ-> ĠBO OK MARK _ SECTION _ TITLE _ TYPE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEmpty Hint Ġ-> ĠEMPTY _ STATE _ TYPE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠBO OK MARK _ TYPE ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠBook mark Screen View Hold ers ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĊĠĠĠ Ġclass ĠSection Title ( item View : ĠView ) Ġ: ĠBook mark Screen View Hold ers ( item View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġbind () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . saved Site Section Title . setText ( R . string . bookmarks Section Title ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠEmpty Hint ( item View : ĠView ) Ġ: ĠBook mark Screen View Hold ers ( item View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġbind () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . saved Site Empty Hint . setText ( R . string . bookmarks Empty Hint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBook marks ViewHolder ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlayout Inflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ ĠitemView : ĠView , ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠviewModel : ĠBook marks ViewModel , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlifecycle Owner : ĠLifecycle Owner , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfav icon Manager : ĠF av icon Manager ĊĠĠĠ Ġ) Ġ: ĠBook mark Screen View Hold ers ( item View ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate ( bookmark : ĠSaved Site . Bookmark ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtwo ListItem Ġ= ĠitemView Ġas ĠTwo Line ListItem ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtwo ListItem . setContent Description ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠitemView . context . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . bookmark Overflow Content Description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbookmark . title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtwo ListItem . setTitle ( bookmark . title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtwo ListItem . set Subtitle ( parse Display Url ( bookmark . url )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Fav icon ( bookmark . url ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtwo ListItem . set Overflow ClickListener Ġ{ Ġanchor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Over Flow Menu ( anchor , Ġbookmark ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtwo ListItem . set ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Selected ( bookmark ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Fav icon ( url : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfav icon Manager . load To View From Local Or Fallback ( url Ġ= Ġurl , Ġview Ġ= ĠitemView . findViewById ( R . id . image )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġparse Display Url ( url String : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠUri . parse ( url String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġuri . base Host Ġ?: Ġreturn Ġurl String ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġshow Over Flow Menu ( anchor : ĠView , Ġbookmark : ĠSaved Site . Bookmark ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpopup Menu Ġ= ĠPopup Menu ( layout Inflater , ĠR . layout . popup _ window _ edit _ delete _ menu ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġpopup Menu . content View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpopup Menu . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon MenuItem Clicked ( view . findViewById ( R . id . edit )) Ġ{ Ġedit Bookmark ( bookmark ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon MenuItem Clicked ( view . findViewById ( R . id . delete )) Ġ{ Ġdelete Bookmark ( bookmark ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpopup Menu . show ( item View , Ġanchor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġedit Bookmark ( bookmark : ĠSaved Site . Bookmark ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on Edit Saved Site Requested ( bookmark ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġdelete Bookmark ( bookmark : ĠSaved Site . Bookmark ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . onDelete Saved Site Requested ( bookmark ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ