package Ġcom . m ichael po hl . lo opy player 2 . common Ċ Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . view . View Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . recyclerview . widget . Divider Item Decoration Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . m ichael po hl . lo opy player 2 . model . AppState Repository Ċ import Ġcom . m ichael po hl . shared . File Model Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . File Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . math . round ToInt Ċ Ċ @ Suppress (" Too Many Functions ") Ċ Ċ fun ĠBoolean . to Visibility ( hide Instead G one : ĠBoolean Ġ= Ġfalse ): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this ) ĠView . VISIBLE Ġelse Ġif Ġ( hide Instead G one ) ĠView . IN VISIBLE Ġelse ĠView . GONE Ċ } Ċ Ċ fun Ġ< T Ġ: ĠAny > ĠMutable LiveData < T >. immutable (): ĠLive Data < T > Ġ{ ĊĠĠĠ Ġreturn Ġthis Ċ } Ċ Ċ /** Ċ Ġ* ĠAdds Ġa Ġbottom Ġdivider Ġto Ġa ĠRecyclerView Ċ Ġ* Ġ@ param Ġdivider Drawable Ġthe ĠDrawable Ġto Ġbe Ġused . ĠIf Ġno Ġdrawable Ġis Ġspecified , Ġthe Ġstandard Ġdivider _ horizontal . xml Ċ Ġ* Ġwill Ġbe Ġused . If Ġno Ġdrawable Ġis Ġfound Ġat Ġall , Ġthe Ġfunction Ġlogs Ġa Ġwarning Ċ Ġ*/ Ċ fun ĠRecyclerView . set Divider ( divider Drawable : ĠInt ) Ġ{ ĊĠĠĠ Ġcontext ?. get Drawable ( divider Drawable )?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdivider Ġ= ĠDiv ider Item Decoration ( context , ĠLinearLayoutManager . VERTICAL ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Drawable ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . addItem Decoration ( divider ) ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ?: ĠTim ber . w (" Tri ed Ġto Ġadd ĠDiv ider Item Decoration Ġto Ġa ĠRecyclerView , Ġbut Ġthe Ġdrawable Ġwas Ġnot Ġfound !") Ċ } Ċ Ċ /** Ċ Ġ* ĠConvenience Ġmethod Ġfor Ġgetting ĠStrings Ġeasily Ġinside Ġa ĠViewHolder Ġclass Ċ Ġ* Ġ@ param Ġresource Id Ġid Ġof Ġthe Ġdesired Ġstring Ċ Ġ*/ Ċ @ Suppress (" Spread Operator ") Ċ fun ĠRecyclerView . ViewHolder . getString ( resourceId : ĠInt , Ġvar arg Ġformat Args : ĠAny ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġthis . item View . context . resources . getString ( resourceId , Ġ* format Args ) Ċ } Ċ Ċ fun Ġ< T Ġ: ĠView > ĠView . find ( id : ĠInt ): ĠT Ġ{ ĊĠĠĠ Ġreturn Ġthis . findViewById ( id ) Ċ } Ċ Ċ / ******************************** ***** Ċ Ġ* ĠExtension Ġfunctions Ġfor ĠViews ĠĠĠĠ Ġ* Ċ Ġ********************************* ****/ Ċ Ċ fun ĠView . show () Ġ{ ĊĠĠĠ Ġthis . visibility Ġ= ĠView . VISIBLE Ċ } Ċ Ċ fun ĠView . hide () Ġ{ ĊĠĠĠ Ġthis . visibility Ġ= ĠView . IN VISIBLE Ċ } Ċ Ċ fun ĠView . g one () Ġ{ ĊĠĠĠ Ġthis . visibility Ġ= ĠView . GONE Ċ } Ċ Ċ fun ĠView . getColor ( resource : ĠInt ): ĠInt Ġ{ ĊĠĠĠ Ġreturn ĠContext Compat . getColor ( context , Ġresource ) Ċ } Ċ Ċ /** Ċ Ġ* ĠRemember Ġthat Ġyou Ġcan Ġonly Ġchange Ġthe Ġheight Ġif Ġthe Ġview Ġis Ġalready Ġmeasured , Ċ Ġ* Ġso Ġthis Ġfunction Ġwill Ġcrash Ġthe Ġapp Ġif Ġyou Ġuse Ġit Ġbefore Ġmeas uring , Ġsince Ġno Ċ Ġ* ĠLayout Params Ġexist Ġyet . Ċ Ġ*/ Ċ fun ĠView . set Height ( new Height : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġparams Ġ= Ġthis . layout Params ĊĠĠĠ Ġparams . height Ġ= Ġnew Height ĊĠĠĠ Ġthis . layout Params Ġ= Ġparams Ċ } Ċ Ċ fun ĠView . set Height ( new Height : ĠFloat ) Ġ{ ĊĠĠĠ Ġval Ġparams Ġ= Ġthis . layout Params ĊĠĠĠ Ġparams . height Ġ= ĠMath . round ( new Height ) ĊĠĠĠ Ġthis . layout Params Ġ= Ġparams Ċ } Ċ Ċ fun ĠView . getString ( resourceId : ĠInt ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġthis . resources . getString ( resourceId ) Ċ } Ċ Ċ /** Ċ Ġ* ĠConvenience Ġmethod Ġfor Ġgetting ĠDraw ables Ġeasily Ġinside Ġa ĠView Ċ Ġ* Ġ@ param Ġresource Id Ġid Ġof Ġthe Ġdesired ĠDrawable Ċ Ġ*/ Ċ fun ĠView . get Drawable ( resourceId : ĠInt ): ĠDrawable ? Ġ{ ĊĠĠĠ Ġreturn ĠContext Compat . get Drawable ( this . context , Ġresource Id ) Ċ } Ċ Ċ fun ĠLong . convert FileSize To MB (): ĠDouble Ġ{ ĊĠĠĠ Ġreturn Ġ( this . toDouble ()) Ġ/ Ġ( 1 0 2 4 Ġ* Ġ 1 0 2 4 ) Ċ } Ċ Ċ fun ĠList < File >. to File Models ( types : ĠSet < AppState Repository . Companion . Audio FileType >? Ġ= Ġnull ): ĠList < File Model > Ġ{ ĊĠĠĠ Ġreturn Ġthis . map Ġ{ Ġit . to File Model ( types ) Ġ}. filter Ġ{ Ġit Ġ! is ĠFile Model . File Ġ} Ċ } Ċ Ċ fun ĠFile . to File Model ( allowed Types : ĠSet < AppState Repository . Companion . Audio FileType >? Ġ= Ġnull ): ĠFile Model Ġ{ ĊĠĠĠ Ġ// Ġwe 're Ġonly Ġinterested Ġin Ġfiles Ġsuitable Ġfor Ġthe Ġapp Ġso Ġwe Ġfilter Ġthe Ġrest Ġout ĊĠĠĠ Ġval Ġsub Files Ġ= Ġ( this . list Files () Ġ?: ĠarrayOf < File >()) ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isFile Ġ&& Ġit . is Accepted Audio Type ( allowed Types ) Ġ} ĊĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . is Folder () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Model . Folder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Files . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Files . any Ġ{ Ġfile Ġ-> Ġfile . isDirectory Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Files . any Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( allowed Types Ġ!= Ġnull ) Ġfile . is Accepted Audio Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Types ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġelse Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . is Accepted Audio Type ( allowed Types ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Model . Audio File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . length (). convert FileSize To MB (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . extension , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Model . File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . length (). convert FileSize To MB (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . extension ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠFile . is Accepted Audio Type ( types : ĠSet < AppState Repository . Companion . Audio FileType >? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġextension Ġ= Ġthis . extension ĊĠĠĠ Ġtypes ?. forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . suffix Ġ== Ġextension ) Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse Ċ } Ċ Ċ fun ĠString . has Accepted Audio File Extension ( types : ĠSet < AppState Repository . Companion . Audio FileType >): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġextension Ġ= Ġthis . substring After Last (".") ĊĠĠĠ Ġtypes . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it . suffix Ġ== Ġextension ) Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfalse Ċ } Ċ Ċ fun ĠRecyclerView . ViewHolder . get Drawable ( resourceId : ĠInt ): ĠDrawable ? Ġ{ ĊĠĠĠ Ġreturn ĠContext Compat . get Drawable ( this . item View . context , Ġresource Id ) Ċ } Ċ Ċ fun ĠDouble . round To ( num Fraction Digits : ĠInt ): ĠDouble Ġ{ ĊĠĠĠ Ġval Ġfactor Ġ= Ġ 1 0 . 0 . pow ( num Fraction Digits . toDouble ()) ĊĠĠĠ Ġreturn Ġ( this Ġ* Ġfactor ). round ToInt () Ġ/ Ġfactor Ċ } Ċ Ċ fun ĠFile . is Folder (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġthis . isDirectory Ċ } Ċ