/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 . ĠCar los ĠRen Ã© ĠR amos ĠL Ã³ pe z . ĠAll Ġrights Ġreserved . Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . c rr l . beat player . ui . fragments ĊĊ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . support . v 4 . media . session . Playback State Compat Ċ import Ġandroid . view .* Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . os . bundle Of Ċ import Ġandroidx . recyclerview . widget . Simple Item Animator Ċ import Ġcom . c rr l . beat player . R Ċ import Ġcom . c rr l . beat player . alert dialog . AlertDialog Ċ import Ġcom . c rr l . beat player . alert dialog . enums . Alert Type Ċ import Ġcom . c rr l . beat player . alert dialog . sty lers . Alert Item Style Ċ import Ġcom . c rr l . beat player . databinding . Fragment Song Detail Binding Ċ import Ġcom . c rr l . beat player . extensions .* Ċ import Ġcom . c rr l . beat player . interfaces . Item Moved Listener Ċ import Ġcom . c rr l . beat player . models . Media Item Data Ċ import Ġcom . c rr l . beat player . models . Song Ċ import Ġcom . c rr l . beat player . ui . adapters . Queue Adapter Ċ import Ġcom . c rr l . beat player . ui . adapters . Song Detail Adapter Ċ import Ġcom . c rr l . beat player . ui . fragments . base . Base Song Detail Fragment Ċ import Ġcom . c rr l . beat player . ui . transformers . base . Base Transformer Ċ import Ġcom . c rr l . beat player . ui . view models . Playlist ViewModel Ċ import Ġcom . c rr l . beat player . ui . view models . Settings ViewModel Ċ import Ġcom . c rr l . beat player . ui . view models . Song ViewModel Ċ import Ġcom . c rr l . beat player . utils . Auto Clear Binding Ċ import Ġcom . c rr l . beat player . utils . Beat Constants . BIND _ STATE _ BOUND Ċ import Ġcom . c rr l . beat player . utils . Beat Constants . FROM _ POSITION _ KEY Ċ import Ġcom . c rr l . beat player . utils . Beat Constants . SON G _ ID _ DEFAULT Ċ import Ġcom . c rr l . beat player . utils . Beat Constants . SWAP _ ACTION Ċ import Ġcom . c rr l . beat player . utils . Beat Constants . TO _ POSITION _ KEY Ċ import Ġcom . c rr l . beat player . utils . General Utils Ċ import Ġcom . c rr l . beat player . utils . General Utils . getS ong Uri Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġkotlinx . android . synt hetic . main . fragment _ song _ detail .* Ċ import Ġkotlinx . android . synt hetic . main . song _ detail _ item .* Ċ import Ġkotlinx . coroutines . Dispatch ers . IO Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . k oin . android . ext . android . get Ċ import Ġorg . k oin . android x . view model . ext . android . shared ViewModel Ċ import Ġkotlin . math . abs Ċ Ċ class ĠSong Detail Fragment Ġ: ĠBase Song Detail Fragment (), ĠItem Moved Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġbinding Ġby ĠAuto Clear Binding < Fragment Song Detail Binding >( this ) ĊĠĠĠ Ġprivate Ġval Ġsong ViewModel Ġby Ġshared ViewModel < Song ViewModel >() ĊĠĠĠ Ġprivate Ġval Ġplaylist ViewModel Ġby Ġshared ViewModel < Playlist ViewModel >() ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= Ġinflater . inflate With Binding ( R . layout . fragment _ song _ detail , Ġcontainer ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit View Components () ĊĊĠĠĠĠĠĠĠ Ġsong Detail ViewModel . current Data . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Needed ( song ViewModel . getS ong ById ( it . id ), Ġempty List (), Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Song Wave Graph ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsong Detail ViewModel . time . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Ġ= Ġsong Detail ViewModel . current Data . value ?. duration Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . seek Bar . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġprogress . percent To Ms ( total ). fix To Step ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( t Ġ!= Ġit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġit . fix To Percent ( total ). fix Percent Bounds () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Container . setOnClickListener Ġ{ Ġshow Queue List () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsong Detail ViewModel . currentState . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsong Detail ViewModel . update ( it . position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . state Ġ== ĠPlay back State Compat . STATE _ PLAY ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsong Detail ViewModel . update ( BIND _ STATE _ BOUND ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġsong Detail ViewModel . update () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbinding . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . viewModel Ġ= Ġsong Detail ViewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . settings ViewModel Ġ= Ġget () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . lifecycle Owner Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . execute Pending Bindings () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Song Detail View () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsong Detail Adapter Ġ= ĠSong Detail Adapter ( main ViewModel ) ĊĊĠĠĠĠĠĠĠ Ġbinding . song List . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġsong Detail Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Item Changed Listener Ġ{ Ġ_, Ġposition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Id Ġ= Ġsong Detail ViewModel . current Data . value ?. id Ġ?: Ġ- 1 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Song Ġ= Ġsong Detail Adapter . song List [ position ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Id Ġ!= Ġselected Song . id ) Ġmain ViewModel . media Item Clicked ( selected Song . to Media Item ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( item Animator Ġas ĠSimple Item Animator ). supports Change Animations Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Slide On Fl ing ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Item Transition Time Millis ( 1 5 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Slide On Fl ing Threshold ( 5 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsong Detail ViewModel . queue Data . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsong Detail Adapter . update Data ( it . queue . to Song List ( get ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsong Detail ViewModel . current Data . observe ( view Lifecycle Owner ) Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Position Ġ= Ġsong Detail Adapter . current Position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsong Detail Adapter . current Position Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsong Detail Adapter . song List . indexOf First Ġ{ Ġit . id Ġ== Ġitem . id Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Position Ġ== Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ observe Ġbinding . song List . scrollTo Position ( song Detail Adapter . current Position ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( song Detail Adapter . current Position Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( song Detail Adapter . current Position Ġ- Ġlast Position ) Ġ> Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . song List . scrollTo Position ( song Detail Adapter . current Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( settings Utility . did Stop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . song List . scrollTo Position ( song Detail Adapter . current Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsettings Utility . did Stop Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġbinding . song List . smooth Scroll To Position ( song Detail Adapter . current Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . song List . setItem Transformer ( getCurrent Transformer ()) ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detach () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Detach () ĊĠĠĠĠĠĠĠ Ġsong Detail ViewModel . update ( byte ArrayOf ()) ĊĠĠĠĠĠĠĠ Ġsong Detail ViewModel . update () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetCurrent Transformer (): ĠBase Transformer Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGeneral Utils . get Transformer FromString ( settings Utility . currentItem Transformer ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Song Wave Graph ( item : ĠMedia Item Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Ġ= Ġwith Context ( IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( item . id Ġ== ĠS ONG _ ID _ DEFAULT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGeneral Utils . audio 2 Raw ( context !! , Ġsettings Utility . intent Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġbyte ArrayOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠGeneral Utils . audio 2 Raw ( context !! , Ġget Song Uri ( item . id )) Ġ?: Ġbyte ArrayOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsong Detail ViewModel . update ( raw ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( raw . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . sn ackbar ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCUSTOM , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . raw _ error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ LONG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠgetString ( R . string . retry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Song Wave Graph ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Queue List () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstyle Ġ= ĠAlert Item Style (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextColor Ġ= Ġactivity ?. getColor By Theme ( R . attr . title TextColor ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected TextColor Ġ= Ġactivity ?. getColor By Theme ( R . attr . color Accent ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠbackgroundColor Ġ= Ġactivity ?. getColor By Theme ( R . attr . color Primary Secondary 2 ) !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġqueue Adapter Ġ= ĠQueue Adapter ( view Lifecycle Owner , Ġsong Detail ViewModel ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem ClickListener Ġ= Ġthis @ Song Detail Fragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Moved Listener Ġ= Ġthis @ Song Detail Fragment ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsong Detail ViewModel . queue Data . observe Once Ġ{ Ġqueue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġqueue Adapter . update DataSet ( queue . queue . to Song List ( get ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠAlertDialog ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠgetString ( R . string . queue _ title ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= ĠgetString ( R . string . queue _ msg ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= Ġstyle , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠAlert Type . QUEUE _ LIST , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġqueue Adapter ĊĠĠĠĠĠĠĠ Ġ). show ( activity Ġas ĠAppCompatActivity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit View Components () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseek Bar . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonStart Tracking Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsong Detail ViewModel . update () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Stop Tracking Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Item Data Ġ= Ġsong Detail ViewModel . current Data . value Ġ?: ĠMedia Item Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . transport Controls () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . seek To (( it Ġ* Ġmedia Item Data . duration Ġ/ Ġ 1 0 0 ). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Progress Changed Ġ= Ġ{ Ġposition , Ġby User Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( by User ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmedia Item Data Ġ= Ġsong Detail ViewModel . current Data . value Ġ?: ĠMedia Item Data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsong Detail ViewModel . update (( position Ġ* Ġmedia Item Data . duration Ġ/ Ġ 1 0 0 ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġshared Song . setOnClickListener Ġ{ Ġshare Item () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinit Song Detail View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Item Click ( view : ĠView , Ġposition : ĠInt , Ġitem : ĠSong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmain ViewModel . media Item Clicked ( item . to Media Item ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon PopupMenu Click ( view : ĠView , Ġposition : ĠInt , Ġitem : ĠSong , Ġitem List : ĠList < Song >) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on PopupMenu Click ( view , Ġposition , Ġitem , Ġitem List ) ĊĠĠĠĠĠĠĠ Ġpower Menu ?. show As Anchor Right Top ( view ) ĊĠĠĠĠĠĠĠ Ġplaylist ViewModel . play Lists (). observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Playlist Menu ( it , Ġitem ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġitem Moved ( from : ĠInt , Ġto : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmain ViewModel . transport Controls ()?. send Custom Action ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSW AP _ ACTION , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbundle Of ( FROM _ POSITION _ KEY Ġto Ġfrom , ĠTO _ POSITION _ KEY Ġto Ġto ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ