package Ġso y . gab im ore no . gab in im ble . presentation . main . detail Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . ViewGroup Ċ import Ġorg . k oin . android x . view model . ext . android . viewModel Ċ import Ġorg . k oin . core . parameter . parameters Of Ċ import Ġso y . gab im ore no . gab in im ble . Build Config Ċ import Ġso y . gab im ore no . gab in im ble . R Ċ import Ġso y . gab im ore no . gab in im ble . cored omain . Song Ċ import Ġso y . gab im ore no . gab in im ble . databinding . Fragment Main Detail Binding Ċ import Ġso y . gab im ore no . gab in im ble . domain . Offset To Alpha Calculator Ċ import Ġso y . gab im ore no . gab in im ble . lib base . fragment . Base Fragment Ċ import Ġso y . gab im ore no . gab in im ble . lib framework . extension . debug Toast Ċ import Ġso y . gab im ore no . gab in im ble . lib framework . extension . exhaustive Ċ import Ġso y . gab im ore no . gab in im ble . lib framework . extension . g one Ċ import Ġso y . gab im ore no . gab in im ble . lib framework . extension . visible Ċ import Ġso y . gab im ore no . gab in im ble . lib framework . extension . with Args Ċ import Ġso y . gab im ore no . gab in im ble . presentation . main . service . Player Service Ċ Ċ class ĠMain Detail Fragment Ġ: ĠBase Fragment < ĊĠĠĠ ĠFragment Main Detail Binding , ĊĠĠĠ ĠMain Detail ViewModel . ViewState , ĊĠĠĠ ĠMain Detail ViewModel . View Events , ĊĠĠĠ ĠMain Detail ViewModel ĊĠĠĠ Ġ> (), ĊĠĠĠ ĠOffset To Alpha Calculator Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARG _ SON G _ FILENAME Ġ= Ġ" ARG _ SON G _ FILENAME " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARG _ SON G _ ID Ġ= Ġ" ARG _ SON G _ ID " ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilename : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsong Id : ĠLong , ĊĠĠĠĠĠĠĠ Ġ) Ġ= ĠMain Detail Fragment (). with Args Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠARG _ SON G _ FILENAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilename ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Long ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠARG _ SON G _ ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsong Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġview Binding : Ġ( LayoutInflater , ĠViewGroup ?) Ġ-> ĠFragment Main Detail Binding Ġ= Ġ{ Ġlayout Inflater , Ġview Group Ġ-> ĊĠĠĠĠĠĠĠ ĠFragment Main Detail Binding . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Inflater , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Group , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval ĠviewModel : ĠMain Detail ViewModel Ġby ĠviewModel () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġrequire Arguments (). getString ( ARG _ SON G _ FILENAME ) !! ĊĠĠĠĠĠĠĠ Ġval Ġsong Id Ġ= Ġrequire Arguments (). getLong ( ARG _ SON G _ ID ) ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠMain Detail ViewModel . Params ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilename Ġ= Ġfilename , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsong Id Ġ= Ġsong Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġparameters Of ( params ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ ĠviewModel . handle On Resume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinit UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Top Buttons () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Top Buttons () Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġib Back . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . handle Back Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġib Share . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . handle Share Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġib Send Email . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . handle Send Email Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġib Rate . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . handle Rate Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrender ViewState ( view State : ĠMain Detail ViewModel . ViewState ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( view State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMain Detail ViewModel . ViewState . Loading Ġ-> Ġshow Loading () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMain Detail ViewModel . ViewState . Error Ġ-> Ġshow Error () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMain Detail ViewModel . ViewState . Content Ġ-> Ġshow Content ( view State . song ) ĊĠĠĠĠĠĠĠ Ġ}. exhaustive ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Content ( song : ĠSong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhide Loading () ĊĠĠĠĠĠĠĠ Ġwith ( binding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( song ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . init Player ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpv , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv Name . text Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv Description . text Ġ= Ġdescription ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . pb . visible () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Loading () Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . pb . g one () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġhide Loading () ĊĠĠĠĠĠĠĠ Ġdebug Toast (" Error ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle View Event ( view Event : ĠMain Detail ViewModel . View Events ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( view Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMain Detail ViewModel . View Events . Navigate To Back Ġ-> Ġrequire Activity (). on Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMain Detail ViewModel . View Events . Share Ġ-> Ġshare () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMain Detail ViewModel . View Events . Send Email Ġ-> Ġsend Email () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMain Detail ViewModel . View Events . Rate Ġ-> Ġrate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMain Detail ViewModel . View Events . Play Player Ġ-> Ġplay Player ( view Event . song ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMain Detail ViewModel . View Events . Stop Player Ġ-> Ġstop Player () ĊĠĠĠĠĠĠĠ Ġ}. exhaustive ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshare () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsend Intent Ġ= ĠIntent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . EXTRA _ TEXT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . share _ song _ text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ" text / plain " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġshare Intent Ġ= ĠIntent . create Chooser ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Intent , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( share Intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Email () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ SEND TO ) ĊĠĠĠĠĠĠĠ Ġintent . data Ġ= ĠUri . parse (" mailto :") ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . EXTRA _ EMAIL , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( getString ( R . string . email _ to )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . EXTRA _ SUBJECT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . email _ subject ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . create Chooser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . email _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp PackageName Ġ= Ġif Ġ( Build Config . DEBUG ) Ġ" com . app ac ou stic . rt " Ġelse Ġrequire Context (). packageName ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" market :// details ? id =$ app PackageName ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" https :// play . google . com / store / apps / details ? id =$ app PackageName ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay Player ( song : ĠSong ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPlayer Service . start ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsong ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Player () Ġ{ ĊĠĠĠĠĠĠĠ ĠPlayer Service . stop ( require Context ()) ĊĠĠĠ Ġ} Ċ } Ċ