package Ġio . ag ora . open live . ui Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . os . Handler Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Sparse Array Ċ import Ġandroid . view . Surface View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Relative Layout Ċ import Ġandroid . widget . TextView Ċ import Ġio . ag ora . open live . R Ċ import Ġio . ag ora . open live . stats . Stats Manager Ċ import Ġjava . util .* Ċ Ċ class ĠVideo Grid Container Ġ: ĠRelative Layout , ĠRunnable Ġ{ ĊĠĠĠ Ġprivate Ġval Ġm User View List Ġ= ĠSparse Array < ViewGroup >( MAX _ USER ) ĊĠĠĠ Ġprivate Ġval Ġm Uid List : ĠMutable List < Int > Ġ= ĠArrayList ( MAX _ USER ) ĊĠĠĠ Ġprivate Ġvar Ġm Stats Manager : ĠStats Manager ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Handler : ĠHandler ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Stat Margin Bottom Ġ= Ġ 0 Ċ // ĊĠĠĠ Ġconstructor ( context : ĠContext ?) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} Ċ // ĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ?, Ġattrs : ĠAttributeSet ?, Ġdef Style Attr : ĠInt ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Background Resource ( R . drawable . live _ room _ bg ) ĊĠĠĠĠĠĠĠ Ġm Stat Margin Bottom Ġ= Ġresources . get Dimension Pixel Size ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . dim en . live _ stat _ margin _ bottom ) ĊĠĠĠĠĠĠĠ Ġm Handler Ġ= ĠHandler ( context . main Looper ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Stats Manager ( manager : ĠStats Manager ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Stats Manager Ġ= Ġmanager ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd User Video Surface ( uid : ĠInt , Ġsurface : ĠSurface View ?, Ġis Local : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( surface Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġid Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġif Ġ( is Local ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Uid List . contains ( 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Uid List . remove ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm User View List . remove ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Uid List . size Ġ== ĠMAX _ USER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Uid List . remove At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm User View List . remove ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Uid List . contains ( uid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Uid List . remove ( uid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm User View List . remove ( uid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Uid List . size Ġ< ĠMAX _ USER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġuid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== Ġ 0 ) Ġm Uid List . add ( 0 , Ġuid ) Ġelse Ġm Uid List . add ( uid ) ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm User View List . append ( uid , Ġcreate Video View ( surface )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Stats Manager Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Stats Manager !!. add User Stats ( uid , Ġis Local ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Stats Manager !!. isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler !!. remove Callbacks ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler !!. post Delayed ( this , ĠSTAT S _ REFRESH _ INTERVAL . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest GridLayout () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Video View ( surface : ĠSurface View ): ĠViewGroup Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= ĠRelative Layout ( context ) ĊĠĠĠĠĠĠĠ Ġlayout . id Ġ= Ġsurface . hashCode () ĊĠĠĠĠĠĠĠ Ġval Ġvideo LayoutParams Ġ= ĠLayout Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT ) ĊĠĠĠĠĠĠĠ Ġlayout . addView ( surface , Ġvideo LayoutParams ) ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠTextView ( context ) ĊĠĠĠĠĠĠĠ Ġtext . id Ġ= Ġlayout . hashCode () ĊĠĠĠĠĠĠĠ Ġval Ġtext Params Ġ= ĠLayout Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠViewGroup . LayoutParams . WRAP _ CONTENT ) ĊĠĠĠĠĠĠĠ Ġtext Params . add Rule ( ALIGN _ PARENT _ BOTTOM , ĠTRUE ) ĊĠĠĠĠĠĠĠ Ġtext Params . bottom Margin Ġ= Ġm Stat Margin Bottom ĊĠĠĠĠĠĠĠ Ġtext Params . left Margin Ġ= ĠSTAT _ LEFT _ M ARGIN ĊĠĠĠĠĠĠĠ Ġtext . setTextColor ( Color . WHITE ) ĊĠĠĠĠĠĠĠ Ġtext . text Size Ġ= ĠSTAT _ TEXT _ SIZE . toFloat () ĊĠĠĠĠĠĠĠ Ġlayout . addView ( text , Ġtext Params ) ĊĠĠĠĠĠĠĠ Ġreturn Ġlayout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove User Video ( uid : ĠInt , Ġis Local : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Local Ġ&& Ġm Uid List . contains ( 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Uid List . remove ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm User View List . remove ( 0 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Uid List . contains ( uid )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Uid List . remove ( uid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm User View List . remove ( uid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Stats Manager !!. remove User Stats ( uid ) ĊĠĠĠĠĠĠĠ Ġrequest GridLayout () ĊĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler !!. remove Callbacks ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest GridLayout () Ġ{ ĊĠĠĠĠĠĠĠ Ġremove All Views () ĊĠĠĠĠĠĠĠ Ġlayout ( m Uid List . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlayout ( size : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġget Params ( size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( m User View List [ m Uid List [ i ]], Ġparams [ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Params ( size : ĠInt ): ĠArray < LayoutParams ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġmeasured Width ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġmeasured Height ĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= ĠarrayOf Null s < LayoutParams >( size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 0 ] Ġ= ĠLayout Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayout Params . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayout Params . MATCH _ PARENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 0 ] !!. add Rule ( ALIGN _ PARENT _ TOP , ĠTRUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 0 ] !!. add Rule ( ALIGN _ PARENT _ LEFT , ĠTRUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( i Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 1 ] Ġ= ĠLayout Params ( width , Ġheight Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 0 ] !!. height Ġ= Ġarray [ 1 ] !!. height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 1 ] !!. add Rule ( BE LOW , Ġm User View List [ m Uid List [ 0 ]]. id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 1 ] !!. add Rule ( ALIGN _ PARENT _ LEFT , ĠTRUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( i Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ i ] Ġ= ĠLayout Params ( width Ġ/ Ġ 2 , Ġheight Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ i Ġ- Ġ 1 ] !!. width Ġ= Ġarray [ i ] !!. width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ i ] !!. add Rule ( RIGHT _ OF , Ġm User View List [ m Uid List [ i Ġ- Ġ 1 ]]. id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ i ] !!. add Rule ( ALIGN _ TOP , Ġm User View List [ m Uid List [ i Ġ- Ġ 1 ]]. id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( i Ġ== Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ i ] Ġ= ĠLayout Params ( width Ġ/ Ġ 2 , Ġheight Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 0 ] !!. width Ġ= Ġwidth Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 1 ] !!. add Rule ( BE LOW , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 1 ] !!. add Rule ( ALIGN _ PARENT _ LEFT , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 1 ] !!. add Rule ( RIGHT _ OF , Ġm User View List [ m Uid List [ 0 ]]. id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 1 ] !!. add Rule ( ALIGN _ PARENT _ TOP , ĠTRUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 2 ] !!. add Rule ( ALIGN _ PARENT _ LEFT , ĠTRUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 2 ] !!. add Rule ( RIGHT _ OF , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 2 ] !!. add Rule ( ALIGN _ TOP , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 2 ] !!. add Rule ( BE LOW , Ġm User View List [ m Uid List [ 0 ]]. id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 3 ] !!. add Rule ( BE LOW , Ġm User View List [ m Uid List [ 1 ]]. id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarray [ 3 ] !!. add Rule ( RIGHT _ OF , Ġm User View List [ m Uid List [ 2 ]]. id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġarray ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detached From Window () ĊĠĠĠĠĠĠĠ Ġclear All Video () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear All Video () Ġ{ ĊĠĠĠĠĠĠĠ Ġremove All Views () ĊĠĠĠĠĠĠĠ Ġm User View List . clear () ĊĠĠĠĠĠĠĠ Ġm Uid List . clear () ĊĠĠĠĠĠĠĠ Ġm Handler !!. remove Callbacks ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Stats Manager Ġ!= Ġnull Ġ&& Ġm Stats Manager !!. isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġchild Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= Ġget Child At ( i ) Ġas ĠRelative Layout ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġlayout . findViewById < TextView >( layout . hashCode ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġm Stats Manager !!. get Stats Data ( m Uid List [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġdata ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info Ġ!= Ġnull ) Ġtext . text Ġ= Ġinfo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler !!. post Delayed ( this , ĠSTAT S _ REFRESH _ INTERVAL . to Long ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ USER Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTAT S _ REFRESH _ INTERVAL Ġ= Ġ 2 0 0 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTAT _ LEFT _ M ARGIN Ġ= Ġ 3 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTAT _ TEXT _ SIZE Ġ= Ġ 1 0 ĊĠĠĠ Ġ} Ċ }