package Ġde . sch net t ler . sc ro bb ler . model Ċ Ċ import Ġandroid . media . Media Metadata Ċ import Ġandroid . text . format . Date Utils Ċ import Ġandroidx . room . Entity Ċ import Ġandroidx . room . Ignore Ċ import Ġandroidx . room . PrimaryKey Ċ import Ġjava . util . Locale Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . time . Duration Ċ import Ġkotlin . time . Duration Unit Ċ import Ġkotlin . time . Experimental Time Ċ import Ġkotlin . time . to Duration Ċ Ċ @ Opt In ( Experimental Time :: class ) Ċ @ Suppress (" Too Many Functions ") Ċ @ Entity ( tableName Ġ= Ġ" local Tracks ") Ċ data Ġclass ĠSc ro bble ( ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġartist : ĠString , ĊĠĠĠ Ġval Ġalbum : ĠString , ĊĠĠĠ Ġval Ġduration : ĠLong , ĊĊĠĠĠ Ġ@ PrimaryKey Ġval Ġtimestamp : ĠLong Ġ= ĠSystem . currentTimeMillis () Ġ/ Ġ 1 0 0 0 , ĊĠĠĠ Ġval ĠendTime : ĠLong Ġ= ĠSystem . currentTimeMillis (), ĊĠĠĠ Ġvar Ġamount Play ed : ĠLong Ġ= Ġ 0 , ĊĠĠĠ Ġval Ġplayed By : ĠString , ĊĠĠĠ Ġvar Ġstatus : ĠSc ro bble Status Ġ= ĠSc ro bble Status . VOL AT ILE , ĊĠĠĠ Ġvar Ġtracking Start : ĠLong Ġ= Ġtimestamp Ċ ) Ġ{ ĊĠĠĠ Ġ@ Ignore Ġval Ġid : ĠString Ġ= Ġname . toLowerCase ( Locale . US ) ĊĠĠĠ Ġ@ Ignore Ġval Ġurl : ĠString Ġ= Ġ" https :// www . last . fm / music /$ artist /_ /$ name " ĊĊĠĠĠ Ġval Ġplay Duration : ĠDuration ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġamount Play ed . to Duration ( Duration Unit . MILLISECONDS ) ĊĠĠĠ Ġval Ġruntime Duration : ĠDuration ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġduration . to Duration ( Duration Unit . MILLISECONDS ) ĊĠĠĠ Ġval Ġplay Percent : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ( amount Play ed . toFloat () Ġ/ Ġduration Ġ* Ġ 1 0 0 ). round ToInt () ĊĊĠĠĠ Ġprivate Ġfun Ġplayed En ough ( threshold : ĠFloat ) Ġ= Ġamount Play ed Ġ>= Ġ( duration Ġ* Ġthreshold ) ĊĠĠĠ Ġfun Ġready To Sc ro bble ( threshold : ĠFloat ) Ġ= Ġcan Be Sc ro bb led () Ġ&& Ġplayed En ough ( threshold ) Ġ// Ġthreshold Ġbetween Ġ 0 . 5 .. 1 ĊĠĠĠ Ġfun Ġtime Stamp String () Ġ= Ġtimestamp . toString () ĊĠĠĠ Ġfun Ġduration Unix () Ġ= Ġ( duration Ġ/ Ġ 1 0 0 0 ). toString () ĊĠĠĠ Ġfun Ġis Playing () Ġ= Ġstatus Ġ== ĠSc ro bble Status . PLAY ING ĊĠĠĠ Ġfun Ġis Local () Ġ= Ġis Cached () Ġ|| Ġstatus Ġ== ĠSc ro bble Status . SC RO BB LED ĊĠĠĠ Ġfun Ġis Cached () Ġ= Ġstatus Ġ== ĠSc ro bble Status . LOCAL ĊĠĠĠ Ġfun Ġtimestamp To Relative Time () Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( timestamp Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDate Utils . get Relative TimeSpan String ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ* Ġ 1 0 0 0 , ĠSystem . currentTimeMillis (), ĠDate Utils ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. MINUTE _ IN _ M ILL IS , ĠDate Utils . FORMAT _ AB BRE V _ ALL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). toString () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠ Ġfun Ġis The Same As ( track : ĠSc ro bble ?) Ġ= Ġname Ġ== Ġtrack ?. name Ġ&& Ġartist Ġ== Ġtrack . artist ĊĠĠĠ Ġprivate Ġfun Ġcan Be Sc ro bb led () Ġ= Ġduration Ġ> Ġ 3 0 0 0 0 ĊĊĠĠĠ Ġfun Ġpause () Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Amount Play ed () ĊĠĠĠĠĠĠĠ Ġstatus Ġ= ĠSc ro bble Status . PA USED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Amount Play ed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Playing ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġamount Play ed Ġ+= Ġnow Ġ- Ġtracking Start ĊĠĠĠĠĠĠĠ Ġtracking Start Ġ= Ġnow ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġplay () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Playing ()) Ġtracking Start Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġstatus Ġ= ĠSc ro bble Status . PLAY ING ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġas Last Fm Track () Ġ= ĠLast Fm Entity . Track ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠ Ġurl Ġ= Ġurl , ĊĠĠĠĠĠĠĠ Ġartist Ġ= Ġartist , ĊĠĠĠĠĠĠĠ Ġalbum Ġ= Ġalbum ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġget Artist Or Placeholder () Ġ= Ġif Ġ( artist . isBlank ()) Ġ" unknown " Ġelse Ġartist ĊĠĠĠ Ġfun ĠgetName Or Placeholder () Ġ= Ġif Ġ( name . isBlank ()) Ġ" unknown " Ġelse Ġname ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom Metadata ( metadata : ĠMedia Metadata , ĠpackageName : ĠString ): ĠSc ro bble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Ġ= Ġ( metadata . getText ( Media Metadata . METADATA _ KEY _ TITLE ) Ġ?: Ġ""). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġartist Ġ= Ġ(( metadata . getText ( Media Metadata . METADATA _ KEY _ AR TI ST ) Ġ?: Ġmetadata . getText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Metadata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. METADATA _ KEY _ AL BU M _ AR TI ST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) Ġ?: Ġ""). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalbum Ġ= Ġ( metadata . getText ( Media Metadata . METADATA _ KEY _ AL BU M ) Ġ?: Ġ""). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġmetadata . getLong ( Media Metadata . METADATA _ KEY _ DURATION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSc ro bble ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġtitle , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartist Ġ= Ġartist , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalbum Ġ= Ġalbum , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġduration , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayed By Ġ= ĠpackageName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠSc ro bble Status Ġ{ ĊĠĠĠ ĠLOCAL , ĊĠĠĠ ĠP LAY ING , ĊĠĠĠ ĠPA USED , ĊĠĠĠ ĠSC RO BB LED , ĊĠĠĠ ĠV OL AT ILE , ĊĠĠĠ ĠEXTER NAL Ċ }