package Ġco il . sample Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroidx . core . graphics . to Color Int Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . Saved State Handle Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġco il . fetch . Video Frame Fetcher . Companion . VIDEO _ FRAME _ MIC ROS _ KEY Ċ import Ġco il . request . Parameters Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġok io . buffer Ċ import Ġok io . source Ċ import Ġorg . json . JSONArray Ċ import Ġkotlin . random . Random Ċ Ċ class ĠMain ViewModel ( application : ĠApplication , Ġhandle : ĠSaved State Handle ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġscreen LiveData : ĠMutable LiveData < Screen > Ġ= ĠMutable LiveData ( Screen . List ) Ġ// ĠDo Ġnot Ġpersist . ĊĠĠĠ Ġprivate Ġval Ġimages LiveData : ĠMutable LiveData < List < Image >> Ġ= ĠMutable LiveData ( emptyList ()) Ġ// ĠDo Ġnot Ġpersist . ĊĠĠĠ Ġprivate Ġval Ġasset Type LiveData : ĠMutable LiveData < Asset Type > Ġ= Ġhandle . get LiveData (" asset _ type ", ĠAsset Type . JPG ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġload Images ( asset Type LiveData . require Value ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscreens (): ĠLive Data < Screen > Ġ= Ġscreen LiveData ĊĊĠĠĠ Ġfun Ġset Screen ( screen : ĠScreen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscreen LiveData . post Value ( screen ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġasset Types (): ĠLive Data < Asset Type > Ġ= Ġasset Type LiveData ĊĊĠĠĠ Ġfun Ġset Asset Type ( asset Type : ĠAsset Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġasset Type LiveData . post Value ( asset Type ) ĊĠĠĠĠĠĠĠ Ġload Images ( asset Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġimages (): ĠLive Data < List < Image >> Ġ= Ġimages LiveData ĊĊĠĠĠ Ġfun Ġon Back Pressed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( screen LiveData . value Ġis ĠScreen . Detail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscreen LiveData . value Ġ= ĠScreen . List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Images ( asset Type : ĠAsset Type ) Ġ= ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimages Ġ= Ġmutable ListOf < Image >() ĊĊĠĠĠĠĠĠĠ Ġif Ġ( asset Type Ġ== ĠAsset Type . MP 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġ 5 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Frame Micro s Ġ= ĠRandom . next Long ( 6 2 0 0 0 0 0 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= ĠParameters . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ( VIDEO _ FRAME _ MIC ROS _ KEY , Ġvideo Frame Micro s , Ġvideo Frame Micro s . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimages Ġ+= ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġ" file :/// android _ asset /${ asset Type . fileName }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġrandom Color (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġ 1 2 8 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġ 7 2 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters Ġ= Ġparameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= ĠJSONArray ( context . assets . open ( asset Type . fileName ). source (). buffer (). read Utf 8 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil Ġjson . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Ġ= Ġjson . getJSONObject ( index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( asset Type Ġ== ĠAsset Type . JPG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġimage . getJSONObject (" urls "). getString (" regular ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġimage . getString (" color "). to Color Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl Ġ= Ġimage . getString (" url ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġrandom Color () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimages Ġ+= ĠImage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= Ġurl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġcolor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġimage . getInt (" width "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġimage . getInt (" height ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġimages LiveData . post Value ( images ) ĊĠĠĠ Ġ} Ċ } Ċ