package Ġorg . wikipedia . search Ċ Ċ import Ġandroid . content . res . Color State List Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . collection . L ru Cache Ċ import Ġandroidx . fragment . app . Fragment Ċ 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 . Observable Ċ import Ġio . reactivex . rx java 3 . dis pos ables . Composite Disposable Ċ import Ġio . reactivex . rx java 3 . schedul ers . Schedulers Ċ import Ġorg . wikipedia . Long Press Handler Ċ import Ġorg . wikipedia . R Ċ import Ġorg . wikipedia . W ikipedia App Ċ import Ġorg . wikipedia . activity . Fragment Util . get Callback Ċ import Ġorg . wikipedia . analytics . Search Fun nel Ċ import Ġorg . wikipedia . databinding . Fragment SearchResults Binding Ċ import Ġorg . wikipedia . datac lient . Service Factory Ċ import Ġorg . wikipedia . datac lient . Wiki Site Ċ import Ġorg . wikipedia . datac lient . mw api . Mw Query Response Ċ import Ġorg . wikipedia . history . History Db Helper . find History Item Ċ import Ġorg . wikipedia . history . History Entry Ċ import Ġorg . wikipedia . page . Page Title Ċ import Ġorg . wikipedia . reading list . Long Press Menu Ċ import Ġorg . wikipedia . reading list . database . Reading List Db Helper Ċ import Ġorg . wikipedia . reading list . database . Reading List Page Ċ import Ġorg . wikipedia . util . L 1 0 n Util . set Conditional Layout Direction Ċ import Ġorg . wikipedia . util . Resource Util . get The med Color Ċ import Ġorg . wikipedia . util . StringUtil . bold en Keyword Text Ċ import Ġorg . wikipedia . util . StringUtil . from Html Ċ import Ġorg . wikipedia . views . Default ViewHolder Ċ import Ġorg . wikipedia . views . G one If Empty TextView Ċ import Ġorg . wikipedia . views . View Util . format Lang Button Ċ import Ġorg . wikipedia . views . View Util . load Image With Rounded C orners Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠSearch Results Fragment Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġinterface ĠCallback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Search Add Page ToList ( entry : ĠHistory Entry , ĠaddTo Default : ĠBoolean ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Search Move Page ToList ( source Reading List Id : ĠLong , Ġentry : ĠHistory Entry ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Search ProgressBar ( enabled : ĠBoolean ) ĊĠĠĠĠĠĠĠ Ġfun Ġnavigate To Title ( item : ĠPage Title , Ġin New Tab : ĠBoolean , Ġposition : ĠInt ) ĊĠĠĠĠĠĠĠ Ġfun Ġset Search Text ( text : ĠCharSequence ) ĊĠĠĠĠĠĠĠ Ġfun Ġget Fun nel (): ĠSearch Fun nel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠFragment SearchResults Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĠĠĠ Ġprivate Ġval Ġsearch Results Cache Ġ= ĠL ru Cache < String , ĠMutable List < SearchResult >>( MAX _ CACHE _ SIZE _ SEARCH _ RESULTS ) ĊĠĠĠ Ġprivate Ġval Ġsearch Results Count Cache Ġ= ĠL ru Cache < String , ĠList < Int >>( MAX _ CACHE _ SIZE _ SEARCH _ RESULTS ) ĊĠĠĠ Ġprivate Ġvar Ġcurrent Search Term : ĠString ? Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġlast Full Text Results : ĠSearch Results ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġtotal Results Ġ= Ġmutable ListOf < SearchResult >() ĊĠĠĠ Ġprivate Ġval Ġresults Count List Ġ= Ġmutable ListOf < Int >() ĊĠĠĠ Ġprivate Ġval Ġdis pos ables Ġ= ĠComposite Disposable () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠFragment SearchResults Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding . search Results List . layout Manager Ġ= ĠLinearLayoutManager ( require Activity ()) ĊĠĠĠĠĠĠĠ Ġbinding . search Results List . adapter Ġ= ĠSearch Result Adapter () ĊĠĠĠĠĠĠĠ Ġbinding . search Error View . back ClickListener Ġ= ĠView . OnClickListener Ġ{ Ġrequire Activity (). finish () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . search Error View . retry ClickListener Ġ= ĠView . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Error View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Search ( current Search Term , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . search Suggestion . setOnClickListener Ġ{ Ġon Suggestion Click () Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . search Error View . retry ClickListener Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġdis pos ables . clear () ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Suggestion Click () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsuggestion Ġ= Ġbinding . search Suggestion . tag Ġas ĠString ĊĠĠĠĠĠĠĠ Ġcallback ()?. get Fun nel ()?. search Did You Mean ( search Language Code ) ĊĠĠĠĠĠĠĠ Ġcallback ()?. set Search Text ( suggestion ) ĊĠĠĠĠĠĠĠ Ġstart Search ( suggestion , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . search Results Display . visibility Ġ= ĠView . VISIBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhide () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . search Results Display . visibility Ġ= ĠView . GONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġis Showing Ġget () Ġ= Ġbinding . search Results Display . visibility Ġ== ĠView . VISIBLE ĊĊĠĠĠ Ġfun Ġset Layout Direction ( lang Code : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset Conditional Layout Direction ( binding . search Results List , Ġlang Code ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart Search ( term : ĠString ?, Ġforce : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! force Ġ&& Ġcurrent Search Term Ġ== Ġterm ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcancel Search Task () ĊĠĠĠĠĠĠĠ Ġcurrent Search Term Ġ= Ġterm ĊĠĠĠĠĠĠĠ Ġif Ġ( term . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Results () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcache Result Ġ= Ġsearch Results Cache [" $ search Language Code -$ term "] ĊĠĠĠĠĠĠĠ Ġval Ġcache Results Count Ġ= Ġsearch Results Count Cache [" $ search Language Code -$ term "] ĊĠĠĠĠĠĠĠ Ġif Ġ(! cache Result . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Results () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Results ( cache Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! cache Results Count . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Results () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Results Count ( cache Results Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdo Title Prefix Search ( term , Ġforce ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear SearchResults Count Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch Results Count Cache . ev ict All () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Title Prefix Search ( search Term : ĠString , Ġforce : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcancel Search Task () ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠSystem . nano Time () ĊĠĠĠĠĠĠĠ Ġupdate ProgressBar ( true ) ĊĠĠĠĠĠĠĠ Ġdis pos ables . add ( Observable . timer ( if Ġ( force ) Ġ 0 Ġelse ĠDEL AY _ M ILL IS . to Long (), ĠTimeUnit . MILLISECONDS ). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . zip ( Service Factory . get ( Wiki Site . for Language Code ( search Language Code )). prefix Search ( search Term , ĠB ATCH _ SIZE , Ġsearch Term ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( search Term . length Ġ>= Ġ 2 ) ĠObservable . from Callable Ġ{ ĠReading List Db Helper . find Page For Search Query In Any List ( search Term ) Ġ} Ġelse ĠObservable . just ( SearchResults ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( search Term . length Ġ>= Ġ 2 ) ĠObservable . from Callable Ġ{ Ġfind History Item ( search Term ) Ġ} Ġelse ĠObservable . just ( SearchResults ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġsearch Response , Ġreading List SearchResults , Ġhistory SearchResults Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch Results Ġ= Ġif Ġ( search Response ?. query () !!. pages () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno inspection ĠConstant Conditions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Results ( search Response . query () !!. pages () !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWiki Site . for Language Code ( search Language Code ), Ġsearch Response . continu ation (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Response . suggestion ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġprefix Ġsearch Ġquery Ġwith Ġno Ġresults Ġwill Ġreturn Ġthe Ġfollowing : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ" batch complete ": Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ" query ": Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġ" search ": Ġ[] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJust Ġreturn Ġan Ġempty ĠSearch Results () Ġin Ġthis Ġcase . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Results () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Suggestion ( search Results . suggestion ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult List Ġ= Ġmutable ListOf < SearchResult >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd SearchResults From Tabs ( result List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult List . addAll ( reading List SearchResults !!. results ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult List . addAll ( history SearchResults . results ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult List . addAll ( search Results . results ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult List ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do After Terminate Ġ{ Ġupdate ProgressBar ( false ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġresults Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Error View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Results ( results , Ġsearch Term , ĠstartTime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ Ġcaught Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Error View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Error View . setError ( caught ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Results Container . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( false , ĠstartTime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd SearchResults From Tabs ( result List : ĠMutable List < SearchResult >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Search Term ?. let Ġ{ Ġterm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( term . length Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠW ikipedia App . getInstance (). tab List . forEach Ġ{ Ġtab Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab . back Stack Position Title ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . display Text . toLowerCase ( Locale . getDefault ()). contains ( term . toLowerCase ( Locale . getDefault ()))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult List . add ( SearchResult ( it , ĠSearch Result . SearchResult Type . TAB _ LIST )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Results ( result List : ĠMutable List < SearchResult >, Ġsearch Term : ĠString , ĠstartTime : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTo Ġease Ġdata Ġanalysis Ġand Ġbetter Ġmake Ġthe Ġfun nel Ġtrack Ġwith Ġuser Ġbehaviour , ĊĠĠĠĠĠĠĠ Ġ// Ġonly Ġtransmit Ġsearch Ġresults Ġevents Ġif Ġthere Ġare Ġa Ġnon zero Ġnumber Ġof Ġresults ĊĠĠĠĠĠĠĠ Ġif Ġ( result List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Results () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Results ( result List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( result List , ĠstartTime ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġtitles Ġto Ġcache ... ĊĠĠĠĠĠĠĠ Ġsearch Results Cache . put ("$ search Language Code -$ search Term ", Ġresult List ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġscroll Ġto Ġtop , Ġbut Ġpost Ġit Ġto Ġthe Ġmessage Ġqueue , Ġbecause Ġit Ġshould Ġbe Ġdone ĊĠĠĠĠĠĠĠ Ġ// Ġafter Ġthe Ġdata Ġset Ġis Ġupdated . ĊĠĠĠĠĠĠĠ Ġbinding . search Results List . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Added ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ post ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Results List . scrollTo Position ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( result List . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġkick Ġoff Ġfull Ġtext Ġsearch Ġif Ġwe Ġget Ġno Ġresults ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Full Text Search ( current Search Term , Ġnull , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Suggestion ( suggestion : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( suggestion Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Suggestion . text Ġ= Ġfrom Html ("< u >" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . search _ did _ you _ mean , Ġsuggestion ) Ġ+ Ġ"</ u >") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Suggestion . tag Ġ= Ġsuggestion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Suggestion . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Suggestion . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcancel Search Task () Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate ProgressBar ( false ) ĊĠĠĠĠĠĠĠ Ġdis pos ables . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Full Text Search ( search Term : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue Offset : ĠMap < String , ĠString > ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear On Success : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= ĠSystem . nano Time () ĊĠĠĠĠĠĠĠ Ġupdate ProgressBar ( true ) ĊĠĠĠĠĠĠĠ Ġdis pos ables . add ( Service Factory . get ( Wiki Site . for Language Code ( search Language Code )). full Text Search ( search Term , ĠB ATCH _ SIZE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue Offset ?. get (" continue "), Ġcontinue Offset ?. get (" gs ro ffset ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . query () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno inspection ĠConstant Conditions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map ĠSearch Results ( response . query () !!. pages () !! , ĠWiki Site . for Language Code ( search Language Code ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . continu ation (), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Results () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġresults Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult List Ġ= Ġresults . results ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache ( result List , Ġsearch Term !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( result List , ĠstartTime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clear On Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Results ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Error View . visibility Ġ= ĠView . GONE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfull Ġtext Ġspecial : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Full Text Results Ġ= Ġresults ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Results ( result List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ProgressBar ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result List . isEmpty ()) Ġdo SearchResults Count Observable ( search Term ) Ġelse ĠObservable . empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do After Terminate Ġ{ Ġupdate ProgressBar ( false ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresults Count Ġ= Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( results Count . isNotEmpty ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġa Ġsingleton Ġlist Ġif Ġall Ġresults Ġare Ġempty . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsum Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( count Ġin Ġresults Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsum Ġ+= Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sum Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sum Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults Count Ġ= ĠlistOf ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Results Count Cache . put ("$ search Language Code -$ search Term ", Ġresults Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Results Count ( results Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere 's Ġan Ġerror , Ġjust Ġlog Ġit Ġand Ġlet Ġthe Ġexisting Ġprefix Ġsearch Ġresults Ġbe . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( true , ĠstartTime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo SearchResults Count Observable ( search Term : ĠString ?): ĠObservable < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠObservable . from Iterable ( W ikipedia App . getInstance (). language (). app Language Codes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. concat Map Ġ{ Ġlang Code Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lang Code Ġ== Ġsearch Language Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ concat Map ĠObservable . just ( Mw Query Response ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠService Factory . get ( Wiki Site . for Language Code ( lang Code )). prefix Search ( search Term , ĠB ATCH _ SIZE , Ġsearch Term ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( response . query ()?. pages () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ flatMap ĠObservable . just ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠService Factory . get ( Wiki Site . for Language Code ( lang Code )). full Text Search ( search Term , ĠB ATCH _ SIZE , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . io ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġresponse Ġ-> Ġif Ġ( response . query ()?. pages () Ġ!= Ġnull ) Ġresponse . query () !!. pages () !!. size Ġelse Ġ 0 Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate ProgressBar ( enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcallback ()?. on Search ProgressBar ( enabled ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Results ( clear Suggestion : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . search Results Container . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġbinding . search Error View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġbinding . search Results Container . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġbinding . search Error View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġif Ġ( clear Suggestion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . search Suggestion . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlast Full Text Results Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtotal Results . clear () ĊĠĠĠĠĠĠĠ Ġresults Count List . clear () ĊĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġadapter : ĠSearch Result Adapter ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġbinding . search Results List . adapter Ġas ĠSearch Result Adapter ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Results ( results : ĠList < SearchResult >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( new Result Ġin Ġresults ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontains Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( page Title ) Ġin Ġtotal Results ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Result . page Title Ġ== ĠpageTitle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontains Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! contains ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Results . add ( new Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . search Results Container . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Results Count ( list : ĠList < Int >) Ġ{ ĊĠĠĠĠĠĠĠ Ġresults Count List . clear () ĊĠĠĠĠĠĠĠ Ġresults Count List . addAll ( list ) ĊĠĠĠĠĠĠĠ Ġbinding . search Results Container . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠSearch Results Fragment Long Press Handler ( private Ġval Ġlast Position Requested : ĠInt ) Ġ: ĠLong Press Menu . Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Open Link ( entry : ĠHistory Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ()?. navigate To Title ( entry . title , Ġfalse , Ġlast Position Requested ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Open In New Tab ( entry : ĠHistory Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ()?. navigate To Title ( entry . title , Ġtrue , Ġlast Position Requested ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Add Request ( entry : ĠHistory Entry , ĠaddTo Default : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ()?. on Search Add Page ToList ( entry , ĠaddTo Default ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Move Request ( page : ĠReading List Page ?, Ġentry : ĠHistory Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ()?. on Search Move Page ToList ( page !!. list Id , Ġentry ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠSearch Result Adapter Ġ: ĠRecyclerView . Adapter < Default ViewHolder < View >>() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( total Results . isEmpty ()) ĠVIEW _ TYPE _ NO _ RESULTS Ġelse ĠVIEW _ TYPE _ ITEM ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( total Results . isEmpty ()) Ġresults Count List . size Ġelse Ġtotal Results . size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠDefault ViewHolder < View > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( view Type Ġ== ĠVIEW _ TYPE _ ITEM ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Result Item ViewHolder ( LayoutInflater . from ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . item _ search _ result , Ġparent , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNo SearchResult Item ViewHolder ( LayoutInflater . from ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . item _ search _ no _ results , Ġparent , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠDefault ViewHolder < View >, Ġpos : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( holder Ġis ĠSearch Result Item ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind Item ( pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( holder Ġis ĠNo SearchResult Item ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind Item ( pos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠNo SearchResult Item ViewHolder ( item View : ĠView ) Ġ: ĠDefault ViewHolder < View >( item View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġaccent Color State List Ġ= ĠColor State List . valueOf ( get The med Color ( require Context (), ĠR . attr . color Accent )) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsecondary Color State List Ġ= ĠColor State List . valueOf ( get The med Color ( require Context (), ĠR . attr . material _ theme _ secondary _ color )) ĊĠĠĠĠĠĠĠ Ġfun Ġbind Item ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlang Code Ġ= ĠW ikipedia App . getInstance (). language (). app Language Codes [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Count Ġ= Ġresults Count List [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresults Text Ġ= Ġview . findViewById < TextView >( R . id . results _ text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlanguage Code Text Ġ= Ġview . findViewById < TextView >( R . id . language _ code ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults Text . text Ġ= Ġif Ġ( results Count Ġ== Ġ 0 ) ĠgetString ( R . string . search _ results _ count _ zero ) Ġelse Ġresources . get Quantity String ( R . plurals . search _ results _ count , Ġresults Count , Ġresults Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults Text . setTextColor ( if Ġ( results Count Ġ== Ġ 0 ) Ġsecondary Color State List Ġelse Ġaccent Color State List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Code Text . visibility Ġ= Ġif Ġ( results Count List . size Ġ== Ġ 1 ) ĠView . GONE Ġelse ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Code Text . text Ġ= Ġlang Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Code Text . setTextColor ( if Ġ( results Count Ġ== Ġ 0 ) Ġsecondary Color State List Ġelse Ġaccent Color State List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Code Text . background Tint List Ġ= Ġif Ġ( results Count Ġ== Ġ 0 ) Ġsecondary Color State List Ġelse Ġaccent Color State List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformat Lang Button ( language Code Text , Ġlang Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSearch Fragment . LANG _ BUTTON _ TEXT _ SIZE _ SMALL ER , ĠSearch Fragment . LANG _ BUTTON _ TEXT _ SIZE _ L ARG ER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . isEnabled Ġ= Ġresults Count Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Added ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( require Parent Fragment () Ġas ĠSearch Fragment ). setUp Language Scroll ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠSearch Result Item ViewHolder ( item View : ĠView ) Ġ: ĠDefault ViewHolder < View >( item View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġbind Item ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpageTitle Text Ġ= Ġview . findViewById < TextView >( R . id . page _ list _ item _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( page Title , Ġredirect From , Ġtype ) Ġ= Ġtotal Results [ position ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch Result Item Image Ġ= Ġview . findViewById < ImageView >( R . id . page _ list _ item _ image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearch Result Icon Ġ= Ġview . findViewById < ImageView >( R . id . page _ list _ icon ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescription Text Ġ= Ġview . findViewById < G one If Empty TextView >( R . id . page _ list _ item _ description ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġredirect Text Ġ= Ġview . findViewById < TextView >( R . id . page _ list _ item _ redirect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġredirect Arrow Ġ= Ġview . findViewById < View >( R . id . page _ list _ item _ redirect _ arrow ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( redirect From . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġredirect Text . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġredirect Arrow . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Text . text Ġ= ĠpageTitle . description ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġredirect Text . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġredirect Arrow . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġredirect Text . text Ġ= ĠgetString ( R . string . search _ redirect _ from , Ġredirect From ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Text . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ=== ĠSearch Result . SearchResult Type . SEARCH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Result Icon . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Result Icon . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Result Icon . setImage Resource ( if Ġ( type Ġ=== ĠSearch Result . SearchResult Type . HISTORY ) ĠR . drawable . ic _ history _ 2 4 Ġelse Ġif Ġ( type Ġ=== ĠSearch Result . SearchResult Type . TAB _ LIST ) ĠR . drawable . ic _ tab _ one _ 2 4 px Ġelse ĠR . drawable . ic _ bookmark _ white _ 2 4 dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhighlight Ġsearch Ġterm Ġwithin Ġthe Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbold en Keyword Text ( page Title Text , ĠpageTitle . display Text , Ġcurrent Search Term ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Result Item Image . visibility Ġ= Ġif Ġ( page Title . thumb Url . isNull OrEmpty ()) Ġif Ġ( type Ġ=== ĠSearch Result . SearchResult Type . SEARCH ) ĠView . GONE Ġelse ĠView . IN VISIBLE Ġelse ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Image With Rounded C orners ( search Result Item Image , ĠpageTitle . thumb Url ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... and Ġlast ly , Ġif Ġwe 've Ġsc rolled Ġto Ġthe Ġlast Ġitem Ġin Ġthe Ġlist , Ġthen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcontinue Ġsearching ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġtotal Results . size Ġ- Ġ 1 Ġ&& ĠW ikipedia App . getInstance (). is Online ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Full Text Results Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġfirst Ġfull Ġtext Ġsearch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Full Text Search ( current Search Term , Ġnull , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! last Full Text Results !!. continu ation . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsubsequent Ġfull Ġtext Ġsearches ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Full Text Search ( current Search Term , Ġlast Full Text Results !!. continu ation , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . is Long Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ< Ġtotal Results . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ()?. navigate To Title ( total Results [ position ]. page Title , Ġfalse , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . setOn Create ContextMenu Listener ( Long Press Handler ( view , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpageTitle , ĠHistory Entry . SOURCE _ SEARCH , ĠSearch Results Fragment Long Press Handler ( position ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcache ( result List : ĠList < SearchResult >, Ġsearch Term : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcache Key Ġ= Ġ"$ search Language Code -$ search Term " ĊĠĠĠĠĠĠĠ Ġsearch Results Cache [ cacheKey ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . addAll ( result List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Results Cache . put ( cacheKey , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog ( result List : ĠList < SearchResult >, ĠstartTime : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTo Ġease Ġdata Ġanalysis Ġand Ġbetter Ġmake Ġthe Ġfun nel Ġtrack Ġwith Ġuser Ġbehaviour , ĊĠĠĠĠĠĠĠ Ġ// Ġonly Ġtransmit Ġsearch Ġresults Ġevents Ġif Ġthere Ġare Ġa Ġnon zero Ġnumber Ġof Ġresults ĊĠĠĠĠĠĠĠ Ġif Ġ( result List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno inspection ĠConstant Conditions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ()?. get Fun nel ()?. search Results ( true , Ġresult List . size , Ġdisplay Time ( startTime ), Ġsearch Language Code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlog Error ( full Text : ĠBoolean , ĠstartTime : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġno inspection ĠConstant Conditions ĊĠĠĠĠĠĠĠ Ġcallback ()?. get Fun nel ()?. search Error ( full Text , Ġdisplay Time ( startTime ), Ġsearch Language Code ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Time ( startTime : ĠLong ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠTimeUnit . NAN O SECONDS . to Millis ( System . nano Time () Ġ- ĠstartTime ). toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcallback (): ĠCallback ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Callback ( this , ĠCallback :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsearch Language Code Ġget () Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( is Added ) Ġ( require Parent Fragment () Ġas ĠSearch Fragment ). search Language Code Ġelse ĠW ikipedia App . getInstance (). language (). app Language Code ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠVIEW _ TYPE _ ITEM Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠVIEW _ TYPE _ NO _ RESULTS Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠB ATCH _ SIZE Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEL AY _ M ILL IS Ġ= Ġ 3 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ CACHE _ SIZE _ SEARCH _ RESULTS Ġ= Ġ 4 ĊĠĠĠ Ġ} Ċ } Ċ