package Ġcom . q fl eng . um . audio Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . drawable . Anim atable Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . storage . Storage Manager Ċ import Ġandroid . support . v 4 . media . session . Playback State Compat Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Seek Bar Ċ import Ġandroidx . activity . view Models Ċ import Ġandroidx . core . app . Activity Options Compat Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġjava . lang . reflect . Array Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ Ċ import Ġcom . q fl eng . um . Base Activity Ċ import Ġcom . q fl eng . um . R Ċ import Ġcom . q fl eng . um . Um App Ċ import Ġcom . q fl eng . um . audio . view . IL rc View Ċ import Ġcom . q fl eng . um . audio . view . L rc View Ċ import Ġcom . q fl eng . um . bean . Media Info Ċ import Ġcom . q fl eng . um . databinding . Audio Player Layout Binding Ċ import Ġcom . q fl eng . um . util . Bitmap Helper Ċ import Ġcom . q fl eng . um . util . F resco Helper Ċ import Ġcom . q fl eng . um . audio . Music Utils Ċ import Ġcom . q fl eng . um . util . Theme Helper Ċ import Ġcom . q fl eng . um . util . coroutines . do Async Ċ import Ġcom . q fl eng . um . view model . Audio Player ViewModel Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util . ArrayList Ċ Ċ /** Ċ Ġ* Ġæ Ĵ Ń æĶ¾ åĻ¨ æİ§åĪ¶ çķĮéĿ¢ Ċ Ġ* ĠCreated Ġby ĠDu ke Ċ Ġ*/ Ċ Ċ class ĠAudio Player Activity Ġ: ĠBase Activity (), ĠIL rc View Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġlaunch ( activity : ĠBase Activity , Ġtransition Views : ĠPair < View , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( activity , ĠAudio Player Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠActivity Options Compat . make Scene Transition Animation ( activity , Ġtransition Views . first , Ġtransition Views . second ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . startActivity ( intent , Ġoptions . to Bundle ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTRANS ITION _ PLAYER : ĠString Ġ= Ġ" transition _ player " ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġlateinit Ġvar Ġmedia Info : ĠMedia Info ĊĊĠĠĠ Ġval Ġaudio Player ViewModel Ġby Ġview Models < Audio Player ViewModel >() ĊĊĠĠĠ Ġval Ġv Binding Ġby Ġlazy Ġ{ ĠAudio Player Layout Binding . inflate ( layout Inflater ) Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠTheme Helper . set Trans luc ent StatusBar ( this ) ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Window (). set Shared Element Enter Transition ( new ĠF ade ()); ĊĠĠĠĠĠĠĠ Ġwindow . shared Element Exit Transition Ġ= Ġandroid . transition . Explo de () ĊĊĠĠĠĠĠĠĠ ĠsetContentView ( v Binding . root ) ĊĊĊĊĠĠĠĠĠĠĠ Ġinit View () ĊĊĠĠĠĠĠĠĠ ĠAudio Play Manager . INSTANCE . media Info Ld . observe ( this , ĠObserver < Media Info > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Audio Play Manager ", Ġ" Audio Player Activity - media Info Ld ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Info Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Play Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Player ViewModel . load L rc ( media Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind L rc ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Cover Image () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠAudio Play Manager . INSTANCE . media Play Progress Ld . observe ( this , ĠObserver < Int > Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Binding . cur Time View . text Ġ= Ġtime Format ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Binding . play Seek Bar . progress Ġ= Ġit ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Binding . play L rc View . set Index ( l rc Index ( it . to Long () Ġ* Ġ 1 0 0 0 )) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠAudio Play Manager . INSTANCE . playback State . observe ( this , ĠObserver < Int > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ PLAY ING Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Binding . play Anim View . setImage Resource ( R . drawable . vector _ drawable _ play _ pause ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ PA USED Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Binding . play Anim View . setImage Resource ( R . drawable . vector _ drawable _ play _ start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ STOP PED Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Binding . play Anim View . setImage Resource ( R . drawable . vector _ drawable _ play _ start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Cover Image () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// var Ġbitmap Drawable : ĠBitmap Drawable Ġ= ĠBitmap Drawable . createFrom Stream ( resources . open Raw Resource ( R . raw . b 1 ), Ġnull ) Ġas ĠBitmap Drawable ĊĠĠĠĠĠĠĠ Ġ// val Ġbitmap : ĠBitmap ? Ġ= ĠMusic Utils . get Bitmap From Uri ( this , ĠUri . parse ( media Info . cover )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġmedia Info . cover ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġset Blur Image Ġ= Ġfun ( in Bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Async ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Func Ġ= Ġsuspend Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Helper . blur Bitmap ( this , Ġin Bitmap , Ġ 2 . 0 F , Ġ 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobserver Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Binding . media Cover View . setImage Bitmap ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroidx . palette . graphics . Palette . from ( in Bitmap ). generate ( object Ġ: Ġandroidx . palette . graphics . Palette . Palette Async Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Generated ( palette : Ġandroidx . palette . graphics . Palette ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġpalette ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv Binding . play L rc View . setTextColor ( resources . getColor ( R . color . color Primary ), ĠColor . GRAY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠF resco Helper . load Bitmap ( media Info . cover !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Ġ= Ġapplication Context Ġas ĠUm App ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Blur Image ( app . raw Image Loader . load Image ( this , ĠR . mip map . ic _ launcher ) !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Callback Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Blur Image ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit View () Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġval Ġdrawable Ġ= Ġv Binding . play Anim View . drawable ĊĠĠĠĠĠĠĠ Ġif Ġ( drawable Ġis ĠAnim atable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( drawable Ġas ĠAnim atable ). start () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġv Binding . play Seek Bar . setOn Seek Bar ChangeListener ( object Ġ: ĠSeek Bar . On Seek Bar ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart Tracking Touch ( seek Bar : ĠSeek Bar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" onStart Tracking Touch ", Ġ" onStart Tracking Touch Ġ-- Ġ${ seek Bar . progress }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop Tracking Touch ( seek Bar : ĠSeek Bar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" on Stop Tracking Touch ", Ġ" on Stop Tracking Touch Ġ-- Ġ${ seek Bar . progress }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Play Manager . INSTANCE . seek To ( v Binding . play Seek Bar . progress . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Progress Changed ( seek Bar : ĠSeek Bar , Ġprogress : ĠInt , Ġfrom User : ĠBoolean ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" on Progress Changed "," ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĊĠĠĠĠĠĠĠ Ġv Binding . play Anim View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Play Manager . INSTANCE . play Or Pause () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġv Binding . btn Skip To Next . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Play Manager . INSTANCE . skip To Next () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġv Binding . btn Skip To Previous . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Play Manager . INSTANCE . skip To Previous () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Play Info () Ġ{ ĊĠĠĠĠĠĠĠ Ġhandler . post Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Binding . cur Time View . text Ġ= Ġtime Format ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Binding . duration Time View . text Ġ= Ġtime Format ( media Info . duration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Binding . play Seek Bar . progress Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv Binding . play Seek Bar . max Ġ= Ġmedia Info . duration ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġlateinit Ġvar Ġl rc Info : ĠL rc Info ĊĠĠĠ Ġvar Ġl rc Lists : ĠArrayList < L rc Row > Ġ= ĠArrayList ( 0 ) ĊĊĊĠĠĠ Ġpublic Ġfun Ġl rc Index ( currentTime : ĠLong ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġindex : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġl rc Lists . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġl rc Lists . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentTime Ġ< Ġl rc Lists . get ( i ). currentTime Ġ&& Ġi Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( currentTime Ġ> Ġl rc Lists . get ( i ). currentTime ) Ġ&& ĠcurrentTime Ġ< Ġl rc Lists . get ( i Ġ+ Ġ 1 ). currentTime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( i Ġ== Ġl rc Lists . size Ġ- Ġ 1 ) Ġ&& ĠcurrentTime Ġ> Ġl rc Lists . get ( i ). currentTime ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġindex ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Storage Path ( mContext : ĠContext , Ġis _ re mov ale : ĠBoolean ): ĠString ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġm Storage Manager Ġ= ĠmContext . getSystem Service ( Context . STORAGE _ SERVICE ) Ġas ĠStorage Manager ĊĠĠĠĠĠĠĠ Ġvar Ġstorage Volume Clazz : ĠClass < *> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Volume Clazz Ġ= ĠClass . forName (" android . os . storage . Storage Volume ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġget Volume List Ġ= Ġm Storage Manager . java Class . getMethod (" get Volume List ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠgetPath Ġ= Ġstorage Volume Clazz !!. getMethod (" getPath ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Remov able Ġ= Ġstorage Volume Clazz . getMethod (" is Remov able ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġget Volume List . invoke ( m Storage Manager ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= ĠArray . getLength ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstorage Volume Element Ġ= ĠArray . get ( result , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠgetPath . invoke ( storage Volume Element ) Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremov able Ġ= Ġis Remov able . invoke ( storage Volume Element ) Ġas ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is _ re mov ale Ġ== Ġremov able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠClass NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvocation TargetException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġtime Format ( time : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsimple DateFormat Ġ= ĠSimpleDateFormat (" mm : ss ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsimple DateFormat . format ( time Ġ* Ġ 1 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġbind L rc ( l rc : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( l rc . isEmpty ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġl rc Parser Ġ= ĠL rc Parse ( l rc ) ĊĠĠĠĠĠĠĠ Ġ// è¯» æŃĮ è¯į ï¼Į å¹¶ å°Ĩ æķ°æį® ä¼ł ç»Ļ æŃĮ è¯į ä¿¡æģ¯ ç±» ĊĠĠĠĠĠĠĠ Ġl rc Info Ġ= Ġl rc Parser . read L rc () ĊĠĠĠĠĠĠĠ Ġ// èİ·å¾Ĺ æŃĮ è¯į ä¸ŃçļĦ ç»ĵçĤ¹ ĊĠĠĠĠĠĠĠ Ġl rc Lists Ġ= Ġl rc Info . l rc Lists ĊĠĠĠĠĠĠĠ Ġv Binding . play L rc View . set L rc List ( l rc Info ) ĊĠĠĠ Ġ} ĊĊ Ċ } Ċ