package Ġspace . n arr ate . way lan . android . ui . search Ċ Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġspace . n arr ate . way lan . android . R Ċ import Ġspace . n arr ate . way lan . android . ui . search . She lf Action Model .* Ċ import Ġspace . n arr ate . way lan . android . util . Soft Input Model Ċ import Ġspace . n arr ate . way lan . core . data . firestore . users . User Word Ċ import Ġspace . n arr ate . way lan . core . data . prefs . Orientation Ċ import Ġspace . n arr ate . way lan . core . data . prefs . Rotation Manager Ċ import Ġspace . n arr ate . way lan . core . data . prefs . Rotation Utils Ċ import Ġspace . n arr ate . way lan . core . repo . Analytics Repository Ċ import Ġspace . n arr ate . way lan . core . repo . UserRepository Ċ import Ġspace . n arr ate . way lan . core . repo . Word Repository Ċ import Ġspace . n arr ate . way lan . core . ui . Navigator Ċ import Ġspace . n arr ate . way lan . core . ui . common . Event Ċ import Ġspace . n arr ate . way lan . core . util . Merged LiveData Ċ import Ġspace . n arr ate . way lan . core . util . map Transform Ċ import Ġspace . n arr ate . way lan . core . util . switch Map Transform Ċ Ċ /** Ċ Ġ* ĠA ĠViewModel Ġfor Ġ[ Search Fragment ] Ċ Ġ*/ Ċ class ĠSearch ViewModel ( ĊĠĠĠ Ġprivate Ġval Ġword Repository : ĠWord Repository , ĊĠĠĠ Ġprivate Ġval Ġuser Repository : ĠUser Repository , ĊĠĠĠ Ġprivate Ġval Ġanalytics Repository : ĠAnalytics Repository , ĊĠĠĠ Ġprivate Ġval Ġnavigator : ĠNavigator Ċ ): ĠViewModel (), ĠRotation Manager . Observer , ĠRotation Manager . Pattern Observer Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsearch Input : ĠMutable LiveData < String > Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġval Ġsearch Results : ĠLive Data < List < Search Item Model >> Ġ= Ġsearch Input ĊĠĠĠĠĠĠĠ Ġ. switch Map Transform Ġ{ Ġif Ġ( it . isEmpty ()) Ġget Recent () Ġelse Ġget Search ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Transform Ġ{ Ġif Ġ( it . isEmpty ()) Ġadd Header ( it ) Ġelse Ġit Ġ} ĊĊĠĠĠ Ġval Ġsearch She lf Row Model : ĠLive Data < Search She lf Action Row Model > ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠSearch She lf Action Row LiveData ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigator . current Destination , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentUser Word , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . trend ing List Filter Live , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ search Sheet Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ search Sheet State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ context ual Sheet Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ context ual Sheet State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ soft Input Model ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġ_ current Word : ĠMutable LiveData < String > Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġprivate Ġval ĠcurrentUser Word : ĠLive Data < User Word > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ current Word . switch Map Transform Ġ{ Ġword Repository . getUser Word ( it ) Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ soft Input Model : ĠMutable LiveData < Soft Input Model > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġprivate Ġval Ġ_ search Sheet Offset : ĠMutable LiveData < Float > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġprivate Ġval Ġ_ search Sheet State : ĠMutable LiveData < Int > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġprivate Ġval Ġ_ context ual Sheet Offset : ĠMutable LiveData < Float > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġprivate Ġval Ġ_ context ual Sheet State : ĠMutable LiveData < Int > Ġ= ĠMutable LiveData () ĊĊĠĠĠ Ġprivate Ġval Ġ_ should Close Sheet : ĠMutable LiveData < Event < Boolean >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġshould Close Sheet : ĠLive Data < Event < Boolean >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ should Close Sheet ĊĊĠĠĠ Ġprivate Ġval Ġ_ should Close Keyboard : ĠMutable LiveData < Event < Boolean >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġshould Close Keyboard : ĠLive Data < Event < Boolean >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ should Close Keyboard ĊĊĠĠĠ Ġprivate Ġval Ġ_ should Open Context ual Sheet : ĠMutable LiveData < Event < Boolean >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġshould Open Context ual Sheet : ĠLive Data < Event < Boolean >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ should Open Context ual Sheet ĊĊĠĠĠ Ġval Ġkeyboard Height : ĠLive Data < Float > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ soft Input Model . map Transform Ġ{ Ġit . height . toFloat () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ should Show Details : ĠMutable LiveData < Event < String >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġshould Show Details : ĠLive Data < Event < String >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ should Show Details ĊĊĠĠĠ Ġprivate Ġval Ġ_ should Show Settings : ĠMutable LiveData < Event < Boolean >> Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġshould Show Settings : ĠLive Data < Event < Boolean >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ should Show Settings ĊĊĠĠĠ Ġprivate Ġval Ġ_ should Show Orientation Prompt : ĠMutable LiveData < Event < Orientation Prompt Model >> ĊĠĠĠĠĠĠĠ Ġ= ĠMutable LiveData () ĊĠĠĠ Ġval Ġshould Show Orientation Prompt : ĠLive Data < Event < Orientation Prompt Model >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ should Show Orientation Prompt ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch Input . value Ġ= Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Recent (): ĠLive Data < List < Search Item Model >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġword Repository . getUser Word Recent s ( 2 5 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Transform Ġ{ Ġrecent s Ġ-> Ġrecent s . map Ġ{ ĠSearch Item Model . User Word Model ( it ) Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Search ( input : ĠString ): ĠLive Data < List < Search Item Model >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMerged LiveData ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġword Repository . get Word set Words ( input ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġword Repository . get Suggest Items ( input ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġwords , Ġsuggestions Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwords Models Ġ= Ġwords . map Ġ{ ĠSearch Item Model . Word Model ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuggest Models Ġ= Ġsuggestions . map Ġ{ ĠSearch Item Model . Suggest Model ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( words Models Ġ+ Ġsuggest Models ). distinct By Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSearch Item Model . Word Model Ġ-> Ġitem . word . word ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSearch Item Model . Suggest Model Ġ-> Ġitem . suggest Item . term ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Header ( list : ĠList < Search Item Model >): ĠList < Search Item Model > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( list . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . to Mutable List (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( 0 , ĠSearch Item Model . Header Model ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . search _ banner _ body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Current Word Changed ( word : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ current Word . value Ġ= Ġword ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Soft Input Changed ( model : ĠSoft Input Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ soft Input Model . value Ġ= Ġmodel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Search Sheet Offset Changed ( offset : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ search Sheet Offset . value Ġ= Ġoffset ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Search Sheet StateChanged ( state : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ search Sheet State . value Ġ= Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Context ual Sheet Offset Changed ( offset : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ context ual Sheet Offset . value Ġ= Ġoffset ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Context ual Sheet StateChanged ( state : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ context ual Sheet State . value Ġ= Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Search Input TextChanged ( input : ĠCharSequence ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsearch Input . value Ġ= Ġinput ?. toString () Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon She lf Action Clicked ( action : ĠShe lf Action Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠShare Action Ġ-> Ġ{ Ġ/* ĠDo Ġnothing Ġ*/ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF avorite Action Ġ-> ĠsetUser Word F avor ited ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUn favorite Action Ġ-> ĠsetUser Word F avor ited ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFilter Action Ġ-> Ġ_ should Open Context ual Sheet . value Ġ= ĠEvent ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠClose Sheet Action Ġ-> Ġ_ should Close Sheet . value Ġ= ĠEvent ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠClose Keyboard Action Ġ-> Ġ_ should Close Keyboard . value Ġ= ĠEvent ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSettings Action Ġ-> Ġ_ should Show Settings . value Ġ= ĠEvent ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUser Word F avor ited ( new Favorite Value : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġ_ current Word . value Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġword Repository . setUser Word Favorite ( id , Ġnew Favorite Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Word Clicked ( item : ĠSearch Item Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġword Ġ= Ġwhen Ġ( item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSearch Item Model . Word Model Ġ-> Ġitem . word . word ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSearch Item Model . User Word Model Ġ-> Ġitem . user Word . word ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSearch Item Model . Suggest Model Ġ-> Ġitem . suggest Item . term ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġanalytics Repository . log Search Word Event ( word , Ġword , Ġitem :: class . java . simple Name ) ĊĠĠĠĠĠĠĠ Ġ_ should Show Details . value Ġ= ĠEvent ( word ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe Ġusers Ġ[ Orientation ] Ġpreference . ĠThis Ġprefer enced Ġis Ġw atched Ġby Ġthe Ġapp , Ġwhich Ġwill ĊĠĠĠĠ Ġ* Ġsend Ġa Ġbroadcast Ġto Ġbe Ġreceived Ġby Ġall Ġrelevant Ġcomponents Ġ( active ĠActiv ities ) Ġwhich Ġwill ĊĠĠĠĠ Ġ* Ġhandle Ġcalling Ġthe Ġappropriate ĠActivity Ġmethods . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġorientation ĠThe Ġorientation Ġthe Ġapp Ġshould Ġbe Ġset Ġto ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Orientation Prompt Clicked ( orientation Prompt : ĠOrientation Prompt Model ) Ġ{ ĊĠĠĠĠĠĠĠ Ġuser Repository . orientation Lock Ġ= Ġorientation Prompt . orientation To Request ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠRotation Manager Ġcallbacks ĊĊĠĠĠ Ġoverride Ġfun Ġon Locked Rotate ( ĊĠĠĠĠĠĠĠ Ġold : ĠRotation Manager . Rotation Event , ĊĠĠĠĠĠĠĠ Ġnew : ĠRotation Manager . Rotation Event , ĊĠĠĠĠĠĠĠ Ġlocked To : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// do Ġnothing ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Unlock ed Orientation Change ( ĊĠĠĠĠĠĠĠ Ġold : ĠRotation Manager . Rotation Event , ĊĠĠĠĠĠĠĠ Ġnew : ĠRotation Manager . Rotation Event ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Rotation Utils . is Por trait To Land scape ( old , Ġnew )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . portrait To Land scape Orientation Change Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user Repository . portrait To Land scape Orientation Change Count Ġ== Ġ 2 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ should Show Orientation Prompt . value Ġ= ĠEvent ( Orientation Prompt Model . Lock To Land scape ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . from Activity Info Screen Orientation ( new . orientation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Rotation Utils . is Land scape To Por trait ( old , Ġnew )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Repository . land scape To Por trait Orientation Change Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user Repository . land scape To Por trait Orientation Change Count Ġ== Ġ 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ should Show Orientation Prompt . value Ġ= ĠEvent ( Orientation Prompt Model . Lock To Por trait ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . from Activity Info Screen Orientation ( new . orientation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Locked Rotate Pattern Seen ( ĊĠĠĠĠĠĠĠ Ġpattern : ĠList < Rotation Manager . Rotation Event >, ĊĠĠĠĠĠĠĠ Ġlocked To : ĠInt , ĊĠĠĠĠĠĠĠ Ġobserved Since : ĠLong ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Rotation Utils . is Lik ely Unlock Desired Scenario ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpattern , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocked To , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserved Since , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . nano Time () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// should Ġsuggest Ġunlock ing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ should Show Orientation Prompt . value Ġ= ĠEvent ( Orientation Prompt Model . Unlock Orientation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . UNSPECIFIED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Unlock ed Orientation Pattern Seen ( pattern : ĠList < Rotation Manager . Rotation Event >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// do Ġnothing . Ġmaybe Ġmove Ġto Ġpattern Ġmatching Ġover Ġorientation Ġchange Ġcounts ĊĠĠĠ Ġ} Ċ } ĊĊ