package Ġjp . blank tar . ru um usic . we ar Ċ Ċ import Ġjava . util . Stack Ċ import Ġkotlin . concurrent . thread Ċ Ċ import Ġandroid . app . Fragment Ċ import Ġandroid . graphics . Point Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroidx . recyclerview . widget . Linear Snap Helper Ċ import Ġandroid . support . we arable . view . Cur ved Child LayoutManager Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ Ċ import Ġkotlinx . android . synt hetic . main . fragment _ playlist .* ĊĊ Ċ class ĠDirectory Log ( val Ġdir : ĠDirectory ) Ġ{ ĊĠĠĠ Ġvar Ġscroll Position Ġ= Ġ 0 Ċ } ĊĊ Ċ class ĠPlaylist Fragment ( val Ġclient : ĠR uu Client ) Ġ: ĠFragment () Ġ{ ĊĠĠĠ Ġvar Ġstatus Updated Ġ= Ġfalse ĊĊĠĠĠ Ġval Ġhandler Ġ= ĠHandler () ĊĊĠĠĠ Ġval Ġsnap Helper Ġ= Ġandroidx . recyclerview . widget . Linear Snap Helper () ĊĊĠĠĠ Ġval Ġdirectory Stack Ġ= ĠStack < Directory Log >() ĊĊĠĠĠ Ġvar Ġdirectory : ĠDirectory ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( x ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! directory Stack . empty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= Ġlist . layout Manager Ġas ĠCur ved Child LayoutManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Stack . peek (). scroll Position Ġ= Ġlayout . findFirst Visible Item Position () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Stack . push ( Directory Log ( x !! )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . change Directory ( x , Ġclient . status . rootPath Ġ== Ġx . path ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Round Display Ġ&& Ġ( x . all . size Ġ> Ġ 1 Ġ|| Ġclient . status . rootPath Ġ!= Ġx . path Ġ&& Ġx . all . isNotEmpty ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġon Music Changed : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater ?, Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater !!. inflate ( R . layout . fragment _ playlist , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġis Round Display ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġlist . padding Top Ġ> Ġ 0 ĊĊĠĠĠ Ġprivate Ġval Ġadapter Ġ= ĠPlaylist Adapter () ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlist . layout Manager Ġ= ĠCur ved Child LayoutManager ( context ) ĊĊĠĠĠĠĠĠĠ Ġadapter . on Parent ClickListener Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Directory By Path ( directory !!. parent Path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadapter . on Directory ClickListener Ġ= Ġ{ Ġdir : ĠString Ġ-> Ġset Directory By Path ( dir ) Ġ} ĊĠĠĠĠĠĠĠ Ġadapter . on Music ClickListener Ġ= Ġ{ Ġmusic : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . play ( music ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Music Changed ?. invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlist . adapter Ġ= Ġadapter ĊĊĠĠĠĠĠĠĠ Ġsnap Helper . attach To RecyclerView ( list ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Round Display ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= ĠPoint () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . window Manager . default Display . getSize ( point ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . set Padding ( 0 , Ġpoint . y Ġ/ Ġ 2 , Ġ 0 , Ġpoint . y Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Enter Ambient () Ġ{} ĊĊĠĠĠ Ġfun Ġon Exit Ambient () Ġ{} ĊĊĠĠĠ Ġfun Ġon Status Updated ( s : ĠStatus ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! status Updated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Directory By Path ( s . rootPath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Updated Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( directory ?. path ?. startsWith ( s . rootPath ) Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Directory By Path ( s . rootPath ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġloading Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġset Directory By Path ( path : ĠString , Ġcallback : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ(! directory Stack . empty () Ġ&& Ġ! path . startsWith ( directory Stack . peek (). dir . path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Stack . pop () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! directory Stack . empty () Ġ&& Ġdirectory Stack . peek (). dir . path Ġ== Ġpath ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlog Ġ= Ġdirectory Stack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Ġ= Ġlog . dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscroll To ( log . scroll Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġloading Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġhandler . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loading ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġ 3 0 0 ) ĊĊĠĠĠĠĠĠĠ Ġthread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġd Ġ= Ġclient . get Directory ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Ġ= Ġd ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback ?. invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscroll To ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġlist . find ViewHolder For Adapter Position ( position )?. item View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpos Ġ= Ġsnap Helper . calculate Distance To Final Snap ( list . layout Manager !! , Ġview ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . scroll By ( pos [ 0 ], Ġpos [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . scrollTo Position ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġscroll To ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġscroll To ( directory !!. all . indexOf ( name ) Ġ+ Ġif Ġ( client . status . rootPath Ġ== Ġclient . status . music Path ) Ġ 0 Ġelse Ġ 1 ) ĊĠĠĠ Ġ} Ċ } Ċ