package Ġme . na ing a un gl uu . km mpr act ice . android . ui Ċ Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . layout .* Ċ import Ġandroidx . compose . foundation . lazy . Lazy Column Ċ import Ġandroidx . compose . foundation . lazy . items Indexed Ċ import Ġandroidx . compose . foundation . lazy . remember Lazy List State Ċ import Ġandroidx . compose . foundation . selection . toggle able Ċ import Ġandroidx . compose . foundation . shape . Rounded Corner Shape Ċ import Ġandroidx . compose . material .* Ċ import Ġandroidx . compose . material . icons . Icons Ċ import Ġandroidx . compose . material . icons . filled . Cancel Ċ import Ġandroidx . compose . runtime .* Ċ import Ġandroidx . compose . runtime . snapshots . Snapshot State Map Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . focus . Focus Request er Ċ import Ġandroidx . compose . ui . focus . focus Request er Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . compose . ui . window . Dialog Ċ import Ġkotlinx . coroutines . launch Ċ import Ġme . na ing a un gl uu . km mpr act ice . TimeZone Helper Ċ import Ġme . na ing a un gl uu . km mpr act ice . TimeZone Helper Impl Ċ Ċ fun Ġis Selected ( selected States : ĠMap < Int , ĠBoolean >, Ġindex : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġ( selected States . containsKey ( index ) Ġ&& Ġ( true Ġ== Ġselected States [ index ])) Ċ } Ċ Ċ @ Composable Ċ fun ĠAdd TimeZone Dialog ( ĊĠĠĠ Ġtimezone Helper : ĠTime Zone Helper Ġ= ĠTime Zone Helper Impl (), ĊĠĠĠ Ġon Add : Ġ( List < String >) Ġ-> ĠUnit , ĊĠĠĠ Ġon Dismiss : Ġ() Ġ-> ĠUnit Ċ ) Ġ= ĠDialog ( ĊĠĠĠ Ġon Dismiss Request Ġ= Ġon Dismiss Ċ ) Ġ{ ĊĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( Material Theme . colors . background , Ġshape Ġ= ĠRo unded Corner Shape ( 8 . dp )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 1 6 . dp ) ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Zone Strings Ġby Ġremember Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable State Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimezone Helper . getTime Zone Strings (). toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġselected States Ġ= Ġremember Ġ{ ĠSnapshot State Map < Int , ĠBoolean >() Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlist State Ġ= Ġremember Lazy List State () ĊĠĠĠĠĠĠĠ Ġval Ġsearch Value Ġ= Ġremember Ġ{ Ġmutable State Of ("") Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcoroutine Scope Ġ= Ġremember Coroutine Scope () ĊĠĠĠĠĠĠĠ Ġval Ġfocus Request er Ġ= Ġremember Ġ{ ĠFocus Request er () Ġ} ĊĠĠĠĠĠĠĠ ĠOut lined TextField ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Line Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġsearch Value . value , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. focus Request er ( focus Request er ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Value . value Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( search Value . value . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Outlined TextField ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġsearch Zones ( search Value . value , Ġtime Zone Strings Ġ= Ġtime Zone Strings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist State . animate Scroll To Item ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrailing Icon Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcon Button ( onClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsearch Value . value Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcon ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIcons . Filled . Cancel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt int Ġ= ĠMaterial Theme . colors . secondary , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġ" Cancel ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠDis posable Effect ( Unit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Request er . request Focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Dispose Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠSp acer ( modifier Ġ= ĠModifier . size ( 1 6 . dp )) ĊĠĠĠĠĠĠĠ ĠLazy Column ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. height ( 1 5 0 . dp ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Padding Ġ= ĠPadding Values ( 1 6 . dp ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġlist State , ĊĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems Indexed ( time Zone Strings ) Ġ{ Ġi , Ġtimezone Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSurface ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( 8 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġif Ġ( isSelected ( selected States , Ġi )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Theme . colors . primary Ġelse ĠMaterial Theme . colors . background ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRow ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toggle able ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġis Selected ( selected States , Ġi ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected States [ i ] Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( timezone ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠSp acer ( modifier Ġ= ĠModifier . size ( 1 6 . dp )) ĊĠĠĠĠĠĠĠ ĠRow ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . align ( Alignment . End ), ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠButton ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ" Cancel ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSp acer ( modifier Ġ= ĠModifier . size ( 1 6 . dp )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠButton ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetTime zones ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected States Ġ= Ġselected States , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Zone Strings Ġ= Ġtime Zone Strings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( text Ġ= Ġ" Add ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġsearch Zones ( search String : ĠString , Ġtime Zone Strings : ĠList < String >): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġtimezone Ġ= Ġtime Zone Strings . first OrNull Ġ{ Ġit . startsWith ( search String , Ġignore Case Ġ= Ġtrue ) Ġ} ĊĠĠĠ Ġif Ġ( timezone Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtimezone Ġ= Ġtime Zone Strings . first OrNull Ġ{ Ġit . contains ( search String , Ġignore Case Ġ= Ġtrue ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( timezone Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtime Zone Strings . indexOf ( timezone ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ- 1 Ċ } Ċ Ċ fun ĠgetTime zones ( selected States : ĠMap < Int , ĠBoolean >, Ġtime Zone Strings : ĠList < String >): ĠList < String > Ġ{ ĊĠĠĠ Ġval Ġtimezone Indexes Ġ= Ġselected States . map Ġ{ Ġif Ġ( it . value ) Ġit . key Ġelse Ġ- 1 Ġ} ĊĠĠĠ Ġval Ġtime zones Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġtimezone Indexes . forEach Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime zones . add ( time Zone Strings [ index ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtime zones Ċ } Ċ