/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 . Ġ- ĠLe bo gang ĠB ants ij ang Ċ Ġ* Ċ Ġ* ĠĠĠ Ġ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 . le bo gang . gens ys music . ui Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Build Ċ import Ġandroid . view . Gesture Detector Ċ import Ġandroid . view . Motion Event Ċ import Ġandroidx . core . view . Gesture Detector Compat Ċ import Ġandroidx . navigation . find Nav Controller Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Behavior Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . le bo gang . gens ys music . R Ċ import Ġcom . le bo gang . gens ys music . databinding . Activity Main Binding Ċ import Ġcom . le bo gang . gens ys music . service . Music Queue Ċ import Ġcom . le bo gang . gens ys music . service . Music Service Ċ import Ġcom . le bo gang . gens ys music . service helpers . On StateChanged Listener Ċ import Ġcom . le bo gang . gens ys music . service helpers . Playback State Ċ import Ġcom . le bo gang . gens ys music . service helpers . Repeat S ate Ċ import Ġcom . le bo gang . gens ys music . settings . Player Background Type Ċ import Ġcom . le bo gang . gens ys music . settings . Player Settings Ċ import Ġcom . le bo gang . gens ys music . ui . helpers . Bottom Sheet Helper Ċ import Ġcom . le bo gang . gens ys music . ui . helpers . Seek Bar Helper Ċ import Ġcom . le bo gang . gens ys music . utils . Seek Bar Th reader Ċ import Ġcom . le bo gang . gens ys music . utils . G lide Manager Ċ Ċ @ Suppress Lint (" Click ableView Accessibility ") Ċ class ĠPlayer ( private Ġval Ġactivity : ĠMainActivity , Ġprivate Ġval Ġview Binding : ĠActivity Main Binding ): ĠBottom Sheet Helper () ĊĠĠĠĠĠĠĠ Ġ, ĠOn StateChanged Listener { ĊĠĠĠ Ġprivate Ġval Ġplayer Settings Ġ= ĠPlayer Settings ( activity ) ĊĠĠĠ Ġvar Ġmusic Service : ĠMusic Service ? Ġ= Ġnull ĊĠĠĠ Ġlateinit Ġvar Ġseek Bar Th reader : Seek Bar Th reader ĊĠĠĠ Ġprivate Ġval Ġbottom Sheet Ġ= ĠBottom Sheet Behavior . from ( view Binding . player . bottom Sheet ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠBottom Sheet Behavior . STATE _ HIDDEN ĊĠĠĠĠĠĠĠ Ġadd Bottom Sheet Callback ( this @ Player ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġgesture Detector Ġ= ĠGest ure Detector Compat ( activity , Ġobject Ġ: ĠGest ure Detector . Simple On Gesture Listener (){ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Double Tap ( e : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmusic Service ?. toggle Play Pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinit OnClick s () ĊĠĠĠĠĠĠĠ ĠMusic Queue . current Audio . observe ( activity , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// launcher ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . show Launcher () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . launcher View . title View . text Ġ= Ġit . title ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . launcher View . subtitle View . text Ġ= Ġit . artist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . launcher View . progress Bar . max Ġ= Ġit . duration . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lide Manager ( activity ). load Audio Art ( it . get Art Uri (), Ġview Binding . launcher View . imageView ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// player ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . player . title View . text Ġ= Ġit . title ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . player . subtitle View . text Ġ= Ġit . artist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . player . third Title . text Ġ= Ġit . album ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . player . seek Bar . max Ġ= Ġit . duration . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . player . duration View . text Ġ= Ġit . duration Formatted ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lide Manager ( activity ). load Audio Art Circular Crop ( it . get Art Uri (), Ġview Binding . player . imageView ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange Background () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġif Ġ( player Settings . get Background Type () Ġ== ĠPlayer Background Type . G IF ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Gif () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit OnClick s (){ ĊĠĠĠĠĠĠĠ Ġview Binding . launcher View . root . setOnClickListener Ġ{ Ġshow Sheet () Ġ} ĊĠĠĠĠĠĠĠ Ġview Binding . player . volume View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . P ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= Ġactivity . find Nav Controller ( R . id . nav Fragment Container ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . navigate ( R . id . audio Processing Dialog ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( view Binding . root ," Not ĠSupported ", ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview Binding . launcher View . queue View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= Ġactivity . find Nav Controller ( R . id . nav Fragment Container ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . navigate ( R . id . queue Dialog ) Ġ} ĊĠĠĠĠĠĠĠ Ġview Binding . launcher View . play Pause View . setOnClickListener Ġ{ Ġmusic Service ?. toggle Play Pause () Ġ} ĊĠĠĠĠĠĠĠ Ġview Binding . player . seek Bar . setOn Seek Bar ChangeListener ( object Ġ: ĠSeek Bar Helper (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprogress Changed ( progress : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmusic Service ?. seek To ( progress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġview Binding . player . previous View . setOnClickListener Ġ{ Ġmusic Service ?. skip To Previous () Ġ} ĊĠĠĠĠĠĠĠ Ġview Binding . player . play Pause View . setOnClickListener Ġ{ Ġmusic Service ?. toggle Play Pause () Ġ} ĊĠĠĠĠĠĠĠ Ġview Binding . player . next View . setOnClickListener Ġ{ Ġmusic Service ?. skip To Next () Ġ} ĊĠĠĠĠĠĠĠ Ġview Binding . player . queue View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= Ġactivity . find Nav Controller ( R . id . nav Fragment Container ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . navigate ( R . id . queue Dialog ) Ġ} ĊĠĠĠĠĠĠĠ Ġview Binding . player . share View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠIntent . ACTION _ SEND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġ" audio /* " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMusic Queue . current Audio . value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent . EXTRA _ STREAM , Ġit . get Uri ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . startActivity ( Intent . create Chooser ( intent ," Share Ġfrom ĠGen esis ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview Binding . player . repeat View . setOnClickListener Ġ{ Ġmusic Service ?. change Repeat Mode () Ġ} ĊĠĠĠĠĠĠĠ Ġview Binding . player . back View . setOnClickListener Ġ{ Ġhide Sheet () Ġ} ĊĠĠĠĠĠĠĠ Ġview Binding . player . gif View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= Ġactivity . find Nav Controller ( R . id . nav Fragment Container ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . navigate ( R . id . player Background Dialog ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġgest ures ĊĠĠĠĠĠĠĠ Ġview Binding . player . art View . setOn Touch Listener Ġ{ Ġ_, Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgesture Detector . on Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġchange Background (){ ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠMusic Queue . current Audio . value ?. get Art Uri () ĊĠĠĠĠĠĠĠ Ġuri ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( player Settings . get Background Type ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer Background Type . NONE Ġ-> Ġview Binding . player . art View . setImage Bitmap ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer Background Type . ADAP TI VE _ BL UR RY Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide Manager ( activity ). load Bl urred ( activity , it , view Binding . player . art View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer Background Type . ADAP TI VE _ IMAGE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠG lide Manager ( activity ). load Audio Art ( it , Ġview Binding . player . art View ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlayer Background Type . G IF Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// do Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Gif (){ ĊĠĠĠĠĠĠĠ ĠG lide Manager ( activity ). load Gif ( activity , view Binding . player . art View ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Sheet Showing (): Boolean { ĊĠĠĠĠĠĠĠ Ġif Ġ( bottom Sheet . state Ġ== ĠBottom Sheet Behavior . STATE _ EXP AN DED ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Sheet () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Sheet (){ ĊĠĠĠĠĠĠĠ Ġbottom Sheet . state Ġ= ĠBottom Sheet Behavior . STATE _ HIDDEN ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Sheet (){ ĊĠĠĠĠĠĠĠ Ġbottom Sheet . state Ġ= ĠBottom Sheet Behavior . STATE _ EXP AN DED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon StateChanged ( newState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( newState Ġ== ĠBottom Sheet Behavior . STATE _ HALF _ EXP AN DED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet . state Ġ= ĠBottom Sheet Behavior . STATE _ EXP AN DED ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( newState Ġ== ĠBottom Sheet Behavior . STATE _ EXP AN DED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . player . art View . request Focus () ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . player . art View . clear Focus () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Playback Changed ( playback State : ĠPlay back State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( playback State Ġ== ĠPlay back State . PLAY ING ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . launcher View . play Pause View . setImage Resource ( R . drawable . ic _ pause ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . player . play Pause View . setImage Resource ( R . drawable . ic _ pause ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . launcher View . play Pause View . setImage Resource ( R . drawable . ic _ play ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . player . play Pause View . setImage Resource ( R . drawable . ic _ play ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġseek Bar Th reader . on Playback StateChanged ( playback State ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetState Listener (): ĠOn StateChanged Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Repeat Mode Change ( repeat S ate : ĠRepeat S ate ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( repeat S ate ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRepeat S ate . REPEAT _ NONE Ġ-> Ġview Binding . player . repeat View . setImage Resource ( R . drawable . ic _ repeat _ none ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRepeat S ate . REPEAT _ ALL Ġ-> Ġview Binding . player . repeat View . setImage Resource ( R . drawable . ic _ repeat ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRepeat S ate . REPEAT _ ONE Ġ-> Ġview Binding . player . repeat View . setImage Resource ( R . drawable . ic _ repeat _ one ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRepeat S ate . SH UFF LE _ ALL Ġ-> Ġview Binding . player . repeat View . setImage Resource ( R . drawable . ic _ shuffle ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ