package Ġcom . amazon . iv s . multiple . players . ui . second layout Ċ Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġcom . amazon . iv s . multiple . players . App Ċ import Ġcom . amazon . iv s . multiple . players . R Ċ import Ġcom . amazon . iv s . multiple . players . common .* Ċ import Ġcom . amazon . iv s . multiple . players . databinding . Fragment Second Binding Ċ import Ġcom . amazon . iv s . multiple . players . ui . models . Second Layout Stream Ċ import Ġkotlinx . coroutines . delay Ċ import Ġtim ber . log . Tim ber Ċ import Ġkotlin . math . round ToInt Ċ Ċ class ĠSecond Layout Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Second Binding ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠSecond Layout ViewModel Ġby Ġlazy ViewModel ( ĊĠĠĠĠĠĠĠ Ġ{ Ġrequire Activity (). application Ġas ĠApp Ġ}, ĊĠĠĠĠĠĠĠ Ġ{ ĠSecond Layout ViewModel () Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġvideo Sur faces Ġget () Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġbinding . surface View A , ĊĠĠĠĠĠĠĠ Ġbinding . surface View B , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Second Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . on Buffer ing . observe Consum able ( view Lifecycle Owner ) Ġ{ Ġbuffer ing States Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer ing States . forEach Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state . player Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSecond Layout Stream . STREAM _ A . index Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . surface Buffer ing A Ġ= Ġstate . buffer ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSecond Layout Stream . STREAM _ B . index Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . surface Buffer ing B Ġ= Ġstate . buffer ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . onError . observe Consum able ( view Lifecycle Owner ) Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . show Sn ackBar ( error . errorMessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . on Size Changed . observe Consum able ( view Lifecycle Owner ) Ġ{ Ġplayer Index Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Sur faces [ player Index ]. on Ready ( player Index ) Ġ{ Ġplayer View Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Player Ġsize Ġchanged : Ġ$ player View ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Player View ( player View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . is Playing . observe Consum able ( view Lifecycle Owner ) Ġ{ Ġplaying Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . controls . is P Lay ing Ġ= Ġplaying ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . controls . play . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel . is Playing . consumed Value Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . play () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . controls . switch Stream . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Sur faces . forEach Ġ{ Ġplayer View Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer View . animate (). alpha ( 0 f ). set Duration ( SURFACE _ FA DE _ OUT _ DELAY ). start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Main Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( SURFACE _ FA DE _ OUT _ DELAY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. open Fragment ( R . id . navigation _ fragment _ third ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate On Rotation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Configuration Changed ( new Config : ĠConfiguration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Configuration Changed ( new Config ) ĊĠĠĠĠĠĠĠ Ġupdate On Rotation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġvideo Sur faces . on Ready Ġ{ Ġplayer Views Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate On Rotation () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Initializing Ġplayers ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . init Players ( require Context (), Ġplayer Views ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ ĠviewModel . release () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ ĠviewModel . onError . consume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate On Rotation () Ġ= Ġlaunch Main Ġ{ ĊĠĠĠĠĠĠĠ Ġrepeat ( MEAS URE _ REPEAT _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . on Draw n Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Sur faces . on Ready Ġ{ Ġplayer Views Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Player Constraints ( resources . configuration . orientation Ġ== ĠConfiguration . OR IENTATION _ LAND SC APE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Player Views ( player Views ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( MEAS URE _ REPEAT _ DELAY ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Player Constraints ( is Land scape : ĠBoolean ) Ġ= Ġwith ( binding ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params A Ġ= Ġstream Container A . layout Params Ġas ĠConstraint Layout . LayoutParams ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params B Ġ= Ġstream Container B . layout Params Ġas ĠConstraint Layout . LayoutParams ĊĊĠĠĠĠĠĠĠ Ġlayout Params A . clear All An chors () ĊĠĠĠĠĠĠĠ Ġlayout Params B . clear All An chors () ĊĊĠĠĠĠĠĠĠ Ġbinding . root . on Draw n Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Land scape ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params A . top To Top Ġ= Ġstream Holder . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params A . end To Start Ġ= Ġvertical Guide line . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params A . bottom To Bottom Ġ= Ġstream Holder . id ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params B . start ToEnd Ġ= Ġvertical Guide line . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params B . top To Top Ġ= Ġstream Holder . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params B . bottom To Bottom Ġ= Ġstream Holder . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params A . start To Start Ġ= Ġstream Holder . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params A . end ToEnd Ġ= Ġstream Holder . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params A . bottom To Top Ġ= Ġhorizontal Guide line . id ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params B . start To Start Ġ= Ġstream Holder . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params B . top To Bottom Ġ= Ġhorizontal Guide line . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params B . end ToEnd Ġ= Ġstream Holder . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate View Dimensions ( layout Params A , Ġlayout Params B , Ġis Land scape ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream Container A . layout Params Ġ= Ġlayout Params A ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream Container B . layout Params Ġ= Ġlayout Params B ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate View Dimensions ( ĊĠĠĠĠĠĠĠ Ġstream A : ĠConstraint Layout . LayoutParams , ĊĠĠĠĠĠĠĠ Ġstream B : ĠConstraint Layout . LayoutParams , ĊĠĠĠĠĠĠĠ Ġis Land scape : ĠBoolean ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscreen Width Ġ= Ġbinding . root . width ĊĠĠĠĠĠĠĠ Ġval Ġscreen Height Ġ= Ġbinding . root . height ĊĠĠĠĠĠĠĠ Ġvar Ġcontainer Side Ġ= ĠMIN _ CONTAINER _ SIZE ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Land scape ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( container Side Ġ< Ġscreen Height Ġ- Ġ 1 6 . dp Ġ&& Ġcontainer Side Ġ* Ġ 2 Ġ< Ġscreen Width Ġ- Ġ 2 4 . dp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Side Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( container Side Ġ< Ġscreen Width Ġ- Ġ 1 6 . dp Ġ&& Ġcontainer Side Ġ* Ġ 2 Ġ< Ġscreen Height Ġ- Ġ 2 4 . dp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Side Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstream A . width Ġ= Ġcontainer Side . round ToInt () ĊĠĠĠĠĠĠĠ Ġstream A . height Ġ= Ġcontainer Side . round ToInt () ĊĠĠĠĠĠĠĠ Ġstream B . width Ġ= Ġcontainer Side . round ToInt () ĊĠĠĠĠĠĠĠ Ġstream B . height Ġ= Ġcontainer Side . round ToInt () ĊĠĠĠ Ġ} Ċ } Ċ