package Ġorg . wikipedia . history Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . view . Action Mode Ċ import Ġandroidx . core . view . update LayoutParams Ċ import Ġandroidx . core . view . update Margins Relative Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . recyclerview . widget . Item Touch Helper Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġio . reactivex . rx java 3 . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . rx java 3 . core . Comp letable Ċ import Ġio . reactivex . rx java 3 . core . Observable Ċ import Ġio . reactivex . rx java 3 . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx java 3 . schedul ers . Schedulers Ċ import Ġorg . wikipedia . Back Pressed Handler Ċ import Ġorg . wikipedia . Constants Ċ import Ġorg . wikipedia . R Ċ import Ġorg . wikipedia . W ikipedia App Ċ import Ġorg . wikipedia . activity . Fragment Util Ċ import Ġorg . wikipedia . database . contract . Page History Contract Ċ import Ġorg . wikipedia . databinding . Fragment History Binding Ċ import Ġorg . wikipedia . main . MainActivity Ċ import Ġorg . wikipedia . main . Main Fragment Ċ import Ġorg . wikipedia . page . Page Available Offline Handler Ċ import Ġorg . wikipedia . reading list . database . Reading List Ċ import Ġorg . wikipedia . settings . Prefs Ċ import Ġorg . wikipedia . util . Dim en Util Ċ import Ġorg . wikipedia . util . Feedback Util Ċ import Ġorg . wikipedia . util . Resource Util Ċ import Ġorg . wikipedia . util . log . L Ċ import Ġorg . wikipedia . views .* Ċ import Ġjava . util .* Ċ Ċ class ĠHistory Fragment Ġ: ĠFragment (), ĠBack Pressed Handler Ġ{ ĊĠĠĠ Ġinterface ĠCallback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠonLoad Page ( entry : ĠHistory Entry ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠFragment History Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Search Query : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġdis pos ables Ġ= ĠComposite Disposable () ĊĠĠĠ Ġprivate Ġval Ġadapter Ġ= ĠHistory Entry Item Adapter () ĊĠĠĠ Ġprivate Ġval Ġitem Callback Ġ= ĠItem Callback () ĊĠĠĠ Ġprivate Ġvar Ġaction Mode : ĠAction Mode ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġsearch Action Mode Callback Ġ= ĠHistory Search Callback () ĊĠĠĠ Ġprivate Ġval Ġselected Entries Ġ= Ġmutable Set Of < History Entry >() ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġretain Instance Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠFragment History Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġbinding . search Empty View . set Empty Text ( R . string . search _ history _ no _ results ) ĊĠĠĠĠĠĠĠ Ġval Ġtouch Callback Ġ= ĠSw ipe able Item Touch Helper Callback ( require Context ()) ĊĠĠĠĠĠĠĠ Ġtouch Callback . swipe able Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġitem Touch Helper Ġ= ĠItem Touch Helper ( touch Callback ) ĊĠĠĠĠĠĠĠ Ġitem Touch Helper . attach To RecyclerView ( binding . history List ) ĊĠĠĠĠĠĠĠ Ġbinding . history List . layout Manager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠ Ġbinding . history List . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġbinding . history Empty Container . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ ĠsetUp Scroll Listener () ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . history List . add On Scroll Listener ( object Ġ: ĠRecyclerView . On Scroll Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Sc rolled ( re cyclerView : ĠRecyclerView , Ġdx : ĠInt , Ġdy : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Sc rolled ( re cyclerView , Ġdx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( require Activity () Ġas ĠMainActivity ). update Toolbar Elevation ( binding . history List . compute Vertical Scroll Offset () Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġreload History Items () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġaction Mode ?. finish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġdis pos ables . clear () ĊĠĠĠĠĠĠĠ Ġbinding . history List . adapter Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġbinding . history List . clear On Scroll Listeners () ĊĠĠĠĠĠĠĠ Ġadapter . clear List () ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġaction Mode ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ on Back Pressed Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( selected Entries . size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun selectAll Pages () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Empty State ( search Query : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( search Query . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Empty View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . history Empty Container . visibility Ġ= Ġif Ġ( adapter . isEmpty ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Empty View . visibility Ġ= Ġif Ġ( adapter . isEmpty ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . history Empty Container . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Page Click ( entry : ĠHistory Entry ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback ()?. on Load Page ( entry ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Clear History Click () Ġ{ ĊĠĠĠĠĠĠĠ Ġdis pos ables . add ( Comp letable . from Action Ġ{ ĠW ikipedia App . getInstance (). get Database Client ( History Entry :: class . java ). delete All () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do After Terminate Ġ{ Ġreload History Items () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfinish Action Mode () Ġ{ ĊĠĠĠĠĠĠĠ Ġaction Mode ?. finish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbegin Multi Select () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Search Action Mode Callback .` is `( action Mode )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Action Mode () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Select Page ( indexed Entry : ĠIndexed History Entry ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( indexed Entry Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( selected Entries . contains ( indexed Entry . entry )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Entries . remove ( indexed Entry . entry ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Entries . add ( indexed Entry . entry ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġselected Count Ġ= Ġselected Entries . size ĊĠĠĠĠĠĠĠ Ġif Ġ( selected Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish Action Mode () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode ?. title Ġ= Ġresources . get Quantity String ( R . plurals . multi _ items _ selected , Ġselected Count , Ġselected Count ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrefresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġif Ġ(! W ikipedia App . getInstance (). is Online Ġ&& ĠP refs . should Show History Offline Articles Toast ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( require Context (), ĠR . string . history _ offline _ articles _ toast , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP refs . should Show History Offline Articles Toast ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġun selectAll Pages () Ġ{ ĊĠĠĠĠĠĠĠ Ġselected Entries . clear () ĊĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete Selected Pages () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselected Entry List Ġ= Ġmutable ListOf < History Entry >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġselected Entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Entry List . add ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW ikipedia App . getInstance (). get Database Client ( History Entry :: class . java ). delete ( entry , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPage History Contract . Page With Image . SELECTION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġselected Entries . clear () ĊĠĠĠĠĠĠĠ Ġif Ġ( selected Entry List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Delete Items Undo Snackbar ( selected Entry List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreload History Items () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Delete Items Undo Snackbar ( entries : ĠList < History Entry >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġif Ġ( entries . size Ġ== Ġ 1 ) ĠgetString ( R . string . history _ item _ deleted , Ġentries [ 0 ]. title . display Text ) Ġelse ĠgetString ( R . string . history _ items _ deleted , Ġentries . size ) ĊĠĠĠĠĠĠĠ Ġval Ġsn ackbar Ġ= ĠFeedback Util . make Snackbar ( require Activity (), Ġmessage , ĠFeedback Util . LENGTH _ DEFAULT ) ĊĠĠĠĠĠĠĠ Ġsn ackbar . setAction ( R . string . history _ item _ delete _ undo ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠW ikipedia App . getInstance (). get Database Client ( History Entry :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġentries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . upsert ( entry , ĠPage History Contract . Page With Image . SELECTION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreload History Items () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsn ackbar . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreload History Items () Ġ{ ĊĠĠĠĠĠĠĠ Ġdis pos ables . clear () ĊĠĠĠĠĠĠĠ Ġdis pos ables . add ( Observable . from Callable Ġ{ ĠHistory Db Helper . filter History Items ( current Search Query . or Empty ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġitems Ġ-> ĠonLoad Items Finished ( items ) Ġ}) Ġ{ Ġt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL . e ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonLoad Items Finished ( emptyList ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonLoad Items Finished ( items : ĠList < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Any >() ĊĠĠĠĠĠĠĠ Ġif Ġ(! Search Action Mode Callback .` is `( action Mode )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( Search Bar ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlist . addAll ( items ) ĊĠĠĠĠĠĠĠ Ġadapter . set List ( list ) ĊĠĠĠĠĠĠĠ Ġupdate Empty State ( current Search Query ) ĊĠĠĠĠĠĠĠ Ġrequire Activity (). invalidate Options Menu () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠIndexed History Entry ( cursor : ĠCursor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġentry : ĠHistory Entry Ġ= ĠHistory Entry . DATABASE _ TABLE . from Cursor ( cursor ) ĊĠĠĠĠĠĠĠ Ġval ĠimageUrl : ĠString ? Ġ= ĠPage History Contract . Page With Image . IMAGE _ NAME . value ( cursor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠHeader ViewHolder Ġconstructor ( item View : ĠView ) Ġ: ĠDefault ViewHolder < View >( item View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġheader Text Ġ= ĠitemView . findViewById < TextView >( R . id . section _ header _ text ) !! ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind Item ( date : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Text . text Ġ= Ġdate ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠSearch Card ViewHolder Ġconstructor ( item View : ĠView ) Ġ: ĠDefault ViewHolder < View >( item View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhistory Filter Button : ĠImageView ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġclear History Button : ĠImageView ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind Item () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear History Button . visibility Ġ= Ġif Ġ( adapter . isEmpty ) ĠView . GONE Ġelse ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Filter Button . visibility Ġ= Ġif Ġ( adapter . isEmpty ) ĠView . GONE Ġelse ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadjust Search Card View ( search Card View : ĠWiki Card View ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Card View . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Added ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ post ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Card View . update LayoutParams < LinearLayout . LayoutParams > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhorizontal Margin Ġ= Ġif Ġ( Dim en Util . is Land scape ( require Context ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Card View . width Ġ/ Ġ 6 Ġ+ ĠDim en Util . rounded Dp To Px ( 3 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDim en Util . rounded Dp To Px ( 1 6 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Margins Relative ( start Ġ= Ġhorizontal Margin , Ġend Ġ= Ġhorizontal Margin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= ĠDim en Util . rounded Dp To Px ( 3 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Card View . set Card BackgroundColor ( Resource Util . get The med Color ( require Context (), ĠR . attr . color _ group _ 2 2 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch Card View Ġ= ĠitemView . findViewById < Wiki Card View >( R . id . search _ card ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvoice Search Button Ġ= ĠitemView . findViewById < View >( R . id . voice _ search _ button ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Filter Button Ġ= ĠitemView . findViewById ( R . id . history _ filter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear History Button Ġ= ĠitemView . findViewById ( R . id . history _ delete ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Card View . setOnClickListener Ġ{ Ġ( require Parent Fragment () Ġas ĠMain Fragment ). open Search Activity ( Constants . Invoke Source . NAV _ MENU , Ġnull , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvoice Search Button . setOnClickListener Ġ{ Ġ( require Parent Fragment () Ġas ĠMain Fragment ). on Feed Voice Search Requested () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Filter Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Mode Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode Ġ= Ġ( require Activity () Ġas ĠAppCompatActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start Support Action Mode ( search Action Mode Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear History Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Entries . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . dialog _ title _ clear _ history ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . dialog _ message _ clear _ history ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . dialog _ message _ clear _ history _ yes ) Ġ{ Ġ_, Ġ_ Ġ-> Ġon Clear History Click () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( R . string . dialog _ message _ clear _ history _ no , Ġnull ). create (). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Selected Pages () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFeedback Util . set Button Long Press Toast ( history Filter Button , Ġclear History Button ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadjust Search Card View ( search Card View ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠHistory Entry Item Holder Ġconstructor ( item View : ĠPage Item View < Indexed History Entry >) Ġ: ĠDefault ViewHolder < Page Item View < Indexed History Entry >>( item View ), ĠSw ipe able Item Touch Helper Callback . Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġentry : ĠHistory Entry ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind Item ( indexed Entry : ĠIndexed History Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentry Ġ= Ġindexed Entry . entry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . item Ġ= Ġindexed Entry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . setTitle ( indexed Entry . entry . title . display Text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . setDescription ( indexed Entry . entry . title . description ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . setImage Url ( indexed Entry . imageUrl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . isSelected Ġ= Ġselected Entries . contains ( indexed Entry . entry ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPage Available Offline Handler . check ( indexed Entry . entry . title ) Ġ{ Ġavailable : ĠBoolean Ġ-> Ġview . set Views Grey ed Out (! available ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Swipe () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Entries . add ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Selected Pages () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠHistory Entry Item Adapter Ġ: ĠRecyclerView . Adapter < Default ViewHolder <* >>() Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġhistory Entries Ġ= Ġmutable ListOf < Any >() ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhistory Entries . size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠisEmpty ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( item Count Ġ== Ġ 0 Ġ|| Ġitem Count Ġ== Ġ 1 Ġ&& Ġhistory Entries [ 0 ] Ġis ĠSearch Bar ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Entries [ position ] Ġis ĠSearch Bar Ġ-> ĠComp anion . VIEW _ TYPE _ SEARCH _ CARD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Entries [ position ] Ġis ĠString Ġ-> ĠComp anion . VIEW _ TYPE _ HEADER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠComp anion . VIEW _ TYPE _ ITEM ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġset List ( list : ĠMutable List < Any >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Entries Ġ= Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġclear List () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Entries . clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠDefault ViewHolder < *> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( view Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp anion . VIEW _ TYPE _ SEARCH _ CARD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( require Context ()). inflate ( R . layout . view _ history _ header _ with _ search , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Card ViewHolder ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠComp anion . VIEW _ TYPE _ HEADER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( require Context ()). inflate ( R . layout . view _ section _ header , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHeader ViewHolder ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠHistory Entry Item Holder ( Page Item View ( require Context ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠDefault ViewHolder <* >, Ġpos : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSearch Card ViewHolder Ġ-> Ġholder . bind Item () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHistory Entry Item Holder Ġ-> Ġholder . bind Item ( history Entries [ pos ] Ġas ĠIndexed History Entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ( holder Ġas ĠHeader ViewHolder ). bind Item ( history Entries [ pos ] Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Attached To Window ( holder : ĠDefault ViewHolder <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on View Attached To Window ( holder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder Ġis ĠHistory Entry Item Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . view . callback Ġ= Ġitem Callback ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon View Detached From Window ( holder : ĠDefault ViewHolder <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder Ġis ĠHistory Entry Item Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . view . callback Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on View Detached From Window ( holder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġhide Header () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( history Entries . isNotEmpty () Ġ&& Ġhistory Entries [ 0 ] Ġis ĠSearch Bar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhistory Entries . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠItem Callback Ġ: ĠPage Item View . Callback < Indexed History Entry ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonClick ( item : ĠIndexed History Entry ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Entries . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Select Page ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( item Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Page Click ( History Entry ( item . entry . title , ĠHistory Entry . SOURCE _ HISTORY )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Long Click ( item : ĠIndexed History Entry ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Multi Select () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Select Page ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Thumb Click ( item : ĠIndexed History Entry ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonClick ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Action Click ( item : ĠIndexed History Entry ?, Ġview : ĠView ) Ġ{} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon List Chip Click ( reading List : ĠReading List ) Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠHistory Search Callback Ġ: ĠSearch Action Mode Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate Action Mode ( mode : ĠAction Mode , Ġmenu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode Ġ= Ġmode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( require Parent Fragment () Ġas ĠMain Fragment ). set Bottom Nav Visible ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( binding . history List . adapter Ġas ĠHistory Entry Item Adapter ). hide Header () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . onCreate Action Mode ( mode , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Change ( s : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Search Query Ġ= Ġs . trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreload History Items () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Destroy Action Mode ( mode : ĠAction Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Destroy Action Mode ( mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Search Query Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreload History Items () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Mode Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( require Parent Fragment () Ġas ĠMain Fragment ). set Bottom Nav Visible ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Search Hint String (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrequire Context (). resources . getString ( R . string . history _ filter _ list _ hint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetParent Context (): ĠContext Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrequire Context () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcallback (): ĠCallback ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFragment Util . get Callback ( this , ĠCallback :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠSearch Bar ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠVIEW _ TYPE _ SEARCH _ CARD Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠVIEW _ TYPE _ HEADER Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠVIEW _ TYPE _ ITEM Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance (): ĠHistory Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHistory Fragment () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ