package Ġcom . github . ap og nu . ot ter . playback Ċ Ċ import Ġandroid . app . Notification Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . media . Media Metadata Ċ import Ġandroid . support . v 4 . media . Media Metadata Compat Ċ import Ġandroid . support . v 4 . media . session . Media Session Compat Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . app . Notification Manager Compat Ċ import Ġandroidx . media . app . Notification Compat . Media Style Ċ import Ġcom . github . ap og nu . ot ter . R Ċ import Ġcom . github . ap og nu . ot ter . activities . MainActivity Ċ import Ġcom . github . ap og nu . ot ter . utils .* Ċ import Ġcom . squareup . pic asso . Pic asso Ċ import Ġkotlinx . coroutines . Dispatch ers . IO Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠMedia Controls Manager ( val Ġcontext : ĠService , Ġprivate Ġval Ġmedia Session : ĠMedia Session Compat ) Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġconst Ġval ĠNOT IFICATION _ ACTION _ OPEN _ QUEUE Ġ= Ġ 0 ĊĠĠĠ Ġconst Ġval ĠNOT IFICATION _ ACTION _ PREVIOUS Ġ= Ġ 1 ĊĠĠĠ Ġconst Ġval ĠNOT IFICATION _ ACTION _ TO GGLE Ġ= Ġ 2 ĊĠĠĠ Ġconst Ġval ĠNOT IFICATION _ ACTION _ NEXT Ġ= Ġ 3 ĊĠ Ġ} ĊĊĠ Ġprivate Ġvar Ġnotification : ĠNotification ? Ġ= Ġnull ĊĊĠ Ġfun Ġupdate Notification ( track : ĠTrack ?, Ġplaying : ĠBoolean ) Ġ{ ĊĠĠĠ Ġif Ġ( notification Ġ== Ġnull Ġ&& Ġ! playing ) Ġreturn ĊĊĠĠĠ Ġtrack ?. let Ġ{ ĊĠĠĠĠĠ Ġval Ġstate Icon Ġ= Ġwhen Ġ( playing ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠR . drawable . pause ĊĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠR . drawable . play ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ ĠGlobal Scope . launch ( IO ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġopen Intent Ġ= ĠIntent ( context , ĠMainActivity :: class . java ). apply Ġ{ Ġaction Ġ= ĠNOT IFICATION _ ACTION _ OPEN _ QUEUE . toString () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġopen Pending Intent Ġ= ĠPending Intent . getActivity ( context , Ġ 0 , Ġopen Intent , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcover Url Ġ= Ġmaybe Normalize Url ( track . album . cover . original ) ĊĠĠĠĠĠĠĠ Ġval Ġcover Ġ= Ġcover Url ?. run Ġ{ ĠPic asso . get (). load ( cover Url ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġmedia Session . set Metadata ( Media Metadata Compat . Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġput String ( Media Metadata . METADATA _ KEY _ AR TI ST , Ġtrack . artist . name ) ĊĠĠĠĠĠĠĠĠĠ Ġput String ( Media Metadata . METADATA _ KEY _ TITLE , Ġtrack . title ) ĊĠĠĠĠĠĠĠĠĠ Ġput Long ( Media Metadata . METADATA _ KEY _ DURATION , Ġ( track . best Upload ()?. duration ?. to Long () Ġ?: Ġ 0 L ) Ġ* Ġ 1 0 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠ Ġcover ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Bitmap ( Media Metadata . METADATA _ KEY _ AL BU M _ ART , Ġit . get ()) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. build ()) ĊĊĠĠĠĠĠĠĠ Ġnotification Ġ= ĠNotification Compat . Builder ( ĊĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠ ĠApp Context . NOTIFICATION _ CHANNEL _ MEDIA _ CONTROL ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ. set Show When ( false ) ĊĠĠĠĠĠĠĠĠĠ Ġ. setStyle ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Style () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Media Session ( media Session . session Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Show Actions In Compact View ( 0 , Ġ 1 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ot ter icon ) ĊĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cover Ġ!= Ġnull ) Ġset Large Icon ( cover . get ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġthis ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( track . title ) ĊĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( track . artist . name ) ĊĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( open Pending Intent ) ĊĠĠĠĠĠĠĠĠĠ Ġ. set Channel Id ( AppContext . NOTIFICATION _ CHANNEL _ MEDIA _ CONTROL ) ĊĠĠĠĠĠĠĠĠĠ Ġ. addAction ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . previous , Ġcontext . getString ( R . string . control _ previous ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNOT IFICATION _ ACTION _ PREVIOUS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ. addAction ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Icon , Ġcontext . getString ( R . string . control _ toggle ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNOT IFICATION _ ACTION _ TO GGLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ. addAction ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . next , Ġcontext . getString ( R . string . control _ next ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNOT IFICATION _ ACTION _ NEXT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġnotification ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠNotification Manager Compat . from ( context ). notify ( AppContext . NOTIFICATION _ MEDIA _ CONTROL , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( playing ) Ġtick () ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġtick () Ġ{ ĊĠĠĠ Ġnotification ?. let Ġ{ ĊĠĠĠĠĠ Ġcontext . start Foreground ( AppContext . NOTIFICATION _ MEDIA _ CONTROL , Ġit ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġaction ( icon : ĠInt , Ġtitle : ĠString , Ġid : ĠInt ): ĠNotification Compat . Action Ġ{ ĊĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠMedia Control Action Receiver :: class . java ). apply Ġ{ Ġaction Ġ= Ġid . toString () Ġ} ĊĠĠĠ Ġval Ġpending Intent Ġ= ĠPending Intent . get Broadcast ( context , Ġid , Ġintent , Ġ 0 ) ĊĊĠĠĠ Ġreturn ĠNotification Compat . Action . Builder ( icon , Ġtitle , Ġpending Intent ). build () ĊĠ Ġ} Ċ } Ċ Ċ class ĠMedia Control Action Receiver Ġ: ĠBroadcast Receiver () Ġ{ ĊĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĠĠĠ Ġwhen Ġ( intent ?. action ) Ġ{ ĊĠĠĠĠĠ ĠMedia Controls Manager . NOTIFICATION _ ACTION _ PREVIOUS . toString () Ġ-> ĠCommand Bus . send ( ĊĠĠĠĠĠĠĠ ĠCommand . Previous Track ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ ĠMedia Controls Manager . NOTIFICATION _ ACTION _ TO GGLE . toString () Ġ-> ĠCommand Bus . send ( ĊĠĠĠĠĠĠĠ ĠCommand . Toggle State ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ ĠMedia Controls Manager . NOTIFICATION _ ACTION _ NEXT . toString () Ġ-> ĠCommand Bus . send ( ĊĠĠĠĠĠĠĠ ĠCommand . Next Track ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ