package Ġcom . sh en jun . c org ic ore . view Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġcom . sh en jun . c org ic ore . constant . Controller Const Ċ import Ġcom . sh en jun . c org ic ore . data . Video Info Ċ import Ġcom . sh en jun . c org ic ore . framework . Video Config Ċ import Ġcom . sh en jun . c org ic ore . log . log D Ċ import Ġcom . sh en jun . c org ic ore . tools . Gesture Helper Ċ import Ġcom . sh en jun . c org ic ore . tools . getActivity Ċ import Ġcom . sh en jun . c org ic ore . view . controller . Abstract Video Controller Ċ import Ġcom . sh en jun . c org ic ore . view . listener .* Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġsh en jun Ġon Ġ 2 0 1 8 / 1 1 / 2 2 . Ċ Ġ*/ Ċ open Ġclass ĠController Video View ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠTexture Video View ( context , Ġattrs , Ġdef Style Attr ), ĠAbstract Video Controller . Event Callback , ĊĠĠĠ ĠAbstract Video Controller . Video Config Retriever Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġm Controllers Map : ĠMutable Map < String , ĠPair < Abstract Video Controller , ĠView >> Ġ= Ġmutable Map Of () ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġif Ġtwo Ġcontroller Ġin Ġlist Ġare Ġunder Ġthe Ġsame Ġkey , Ġthey Ġcannot Ġco exist Ġand Ġonly Ġthe Ġlatest Ġone Ġwill Ġshow ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Controller Group Map : ĠMutable Map < String , ĠMutable Set < Abstract Video Controller >> Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġprivate Ġvar Ġseek StartTime Ms Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġvar Ġm Config : ĠVideo Config ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġm Hide Main Controller Runnable Ġ= ĠRunnable Ġ{ Ġhide Main Controllers () Ġ} ĊĠĠĠ Ġprivate Ġval Ġm Gesture Helper : ĠGest ure Helper Ġ= ĠGest ure Helper ( context , Ġobject Ġ: ĠGest ure Helper . Gesture Event Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Single Tap () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog D (" on Single Tap ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Double Tap () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog D (" on Double Tap ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Horizontal Scroll ( ev : ĠMotion Event , Ġdelta : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog D (" on Horizontal Scroll ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Vertical Scroll ( ev : ĠMotion Event , Ġdelta : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog D (" on Vertical Scroll ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll Finish ( is Vertical : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog D (" on Scroll Finish ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġm Gesture Helper . handle Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Controller Event ( event : ĠInt , Ġextra : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠController Const . RE VERSE _ PLAY _ STATE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Hide Main Controllers Count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View Callback ?. on Oper ate Reverse Play State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠController Const . SEEK _ START Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause Hide Main Controllers Count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseek StartTime Ms Ġ= Ġextra . getLong ( Controller Const . KEY _ TIME _ MS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View Callback ?. on Oper ate Seek Start ( seek StartTime Ms ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindAll Controller Impl < Seek State Listener > Ġ{ Ġit . on Seek Start ( seek StartTime Ms ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠController Const . SEEK ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause Hide Main Controllers Count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġextra . getLong ( Controller Const . KEY _ TIME _ MS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View Callback ?. on Oper ate Seek ing ( seek StartTime Ms , Ġtime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindAll Controller Impl < Seek State Listener > Ġ{ Ġit . on Seek ing ( seek StartTime Ms , Ġtime ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠController Const . SEEK _ END Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Hide Main Controllers Count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġextra . getLong ( Controller Const . KEY _ TIME _ MS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View Callback ?. on Oper ate Seek End ( time ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindAll Controller Impl < Seek State Listener > Ġ{ Ġit . on Seek End ( time ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠController Const . VIS IBILITY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Show Ġ= Ġextra . getBoolean ( Controller Const . KEY _ SHOW , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġextra . getString ( Controller Const . KEY _ CONTROLLER _ KEY , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġm Controllers Map [ key ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pair Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Controllers Map . remove ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= Ġpair . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġpair . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Show ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhide All Other Controllers Ġ= Ġextra . getBoolean ( Controller Const . KEY _ HIDE _ ALL _ OTHER _ CONTRO LL ERS , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( hide All Other Controllers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide All Other Controllers ( controller ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġcontrollers Ġin Ġgroup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide All Other Controllers In Same Group ( controller ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . on Show View ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshow Main Controllers Ġ= Ġextra . getBoolean ( Controller Const . KEY _ SHOW _ MAIN _ CONTRO LL ERS , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Main Controllers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Main Controllers () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . on Hide View ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View Callback ?. on Oper ate Controller Visibility Event ( is Show , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠController Const . RE PLAY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View Callback ?. on Oper ate Replay () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠController Const . FIN ISH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetActivity ( context )?. finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠController Const . RETRY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View Callback ?. on Oper ate Retry () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠController Const . REFRESH _ FILL _ MODE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo View Callback ?. on Oper ate Refresh Fill Mode () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġattach Video Config ( video Config : ĠVideo Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Config Ġ= Ġvideo Config ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Video Config (): ĠVideo Config Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġm Config Ġ?: ĠVideo Config () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Controller ( controller : ĠAbstract Video Controller ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġcontroller . key () ĊĠĠĠĠĠĠĠ Ġremove Controller ( key ) ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġcontroller . create View ( context , Ġthis ) ĊĠĠĠĠĠĠĠ Ġadd View ( view ) ĊĠĠĠĠĠĠĠ Ġcontroller . event Callback Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġcontroller . set Video Config Retriever ( this ) ĊĠĠĠĠĠĠĠ Ġm Controllers Map [ key ] Ġ= Ġcontroller Ġto Ġview ĊĠĠĠĠĠĠĠ Ġcontroller . on View Created ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Controller ( controller : ĠAbstract Video Controller , Ġgroup Key : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġset Ġ= Ġm Controller Group Map [ group Key ] ĊĠĠĠĠĠĠĠ Ġif Ġ( set Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset . add ( controller ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Controller Group Map [ group Key ] Ġ= Ġmutable Set Of ( controller ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadd Controller ( controller ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetCurrent Progress ( time Ms : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ ĠfindAll Controller Impl < Progress Listener > Ġ{ Ġit . on Progress Update ( time Ms ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Duration ( time Ms : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ ĠfindAll Controller Impl < Progress Listener > Ġ{ Ġit . on Duration Update ( time Ms ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Buffer ing Percent ( percent : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ ĠfindAll Controller Impl < Progress Listener > Ġ{ Ġit . on Buffer Progress Update ( percent ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Play Pause State ( is Playing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠfindAll Controller Impl < Play Pause Listener > Ġ{ Ġit . on Play Pause StateChanged ( is Playing ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Loading State ( isLoading : ĠBoolean , Ġis Buffer ing : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠfindAll Controller Impl < Loading Listener > Ġ{ Ġit . on Loading StateChanged ( isLoading , Ġis Buffer ing ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetError State ( errorCode : ĠInt , Ġmsg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠfindAll Controller Impl < Error Listener > Ġ{ Ġit . onError ( errorCode , Ġmsg ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Complete State () Ġ{ ĊĠĠĠĠĠĠĠ ĠfindAll Controller Impl < Complete Listener > Ġ{ Ġit . on Video Complete () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Main Controllers () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Controllers Map . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . first . is Main Controller ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first . on Show View ( it . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreset Hide Main Controllers Count Down () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhide Main Controllers () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Controllers Map . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . first . is Main Controller ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . first . on Hide View ( it . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Video Info ( info : ĠVideo Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog D (" video Ġinfo Ġupdated : Ġ$ info ") ĊĠĠĠĠĠĠĠ ĠfindAll Controller Impl < Video Info Listener > Ġ{ Ġit . on Video Info Updated ( info ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Hide Main Controllers Count Down () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelay Ġ= Ġm Config ?. auto Hide Main Controller Interval Ms Ġ?: Ġ 3 0 0 0 L ĊĠĠĠĠĠĠĠ Ġremove Callbacks ( m Hide Main Controller Runnable ) ĊĠĠĠĠĠĠĠ Ġpost Delayed ( m Hide Main Controller Runnable , Ġdelay ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpause Hide Main Controllers Count Down () Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Callbacks ( m Hide Main Controller Runnable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Controller ( key : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpair Ġ= Ġm Controllers Map [ key ] ĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= Ġpair ?. first ĊĠĠĠĠĠĠĠ Ġcontroller ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Controller Re placed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . event Callback Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Video Config Retriever ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġpair ?. second ĊĠĠĠĠĠĠĠ Ġview ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove View ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide All Other Controllers ( controller : ĠAbstract Video Controller ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Controllers Map . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġit . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ!= Ġcontroller ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . on Hide View ( it . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide All Other Controllers In Same Group ( controller : ĠAbstract Video Controller ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Controller Group Map . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . contains ( controller )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . forEach Ġ{ Ġc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ!= Ġcontroller ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġm Controllers Map [ c . key ()] ?. second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . on Hide View ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠT > ĠfindAll Controller Impl ( operate : Ġ( T ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Controllers Map . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= Ġit . first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( controller Ġis ĠT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperate ( controller ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ