/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠCl iff ord ĠLi u Ċ Ġ* Ċ Ġ* Ġ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 . mad ness . collision . unit . audio _ timer Ċ Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . media . Audio Attributes Ċ import Ġandroid . media . Audio Focus Request Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . os . Looper Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . core . app . Notification Compat Ċ import Ġandroidx . core . app . Notification Manager Compat Ċ import Ġcom . mad ness . collision . R Ċ import Ġcom . mad ness . collision . main . MainActivity Ċ import Ġcom . mad ness . collision . util .* Ċ import Ġcom . mad ness . collision . util . notice . Toast Utils Ċ import Ġcom . mad ness . collision . util . os . Os Utils Ċ import Ġcom . mad ness . collision . util . ui . app Locale Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . text . SimpleDateFormat Ċ Ċ internal Ġclass ĠAudio Timer Service : ĠService () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG _ DURATION Ġ= Ġ" duration " ĊĠĠĠĠĠĠĠ Ġvar Ġis Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtick Callbacks : ĠMutable List < Callback > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart ( context : ĠContext , Ġduration : ĠLong ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠAudio Timer Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstop Ġif Ġrunning Ġalready ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isRunning ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . stop Service ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Duration Ġ= Ġif Ġ( duration Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpref Ġ= Ġcontext . get SharedPreferences ( P . PRE F _ SETTINGS , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Hour Ġ= Ġpref . getInt ( P . AT _ TIME _ HOUR , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Minute Ġ= Ġpref . getInt ( P . AT _ TIME _ MINUTE , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( time Hour Ġ* Ġ 6 0 Ġ+ Ġtime Minute ) Ġ* Ġ 6 0 0 0 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . stop Service ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( ARG _ DURATION , Ġtarget Duration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . start Service ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast Utils . toast ( context , ĠR . string . text _ error , ĠToast . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġstop ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . stop Service ( Intent ( context , ĠAudio Timer Service :: class . java )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd Callback ( callback : ĠCallback ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtick Callbacks . add ( callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġremove Callback ( callback : ĠCallback ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtick Callbacks . remove ( callback ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠCallback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġon Tick ( target Time : ĠLong , Ġduration : ĠLong , Ġleft Time : ĠLong ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Tick ( display Text : ĠString ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Notification Manager : ĠNotification Manager Compat ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlocale Context : ĠContext ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Handler : Handler ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Runnable : ĠRunnable ĊĠĠĠ Ġprivate Ġvar Ġtarget Time : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġduration : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġsys Time Format Ġ= ĠSimpleDateFormat (" mm : ss ", ĠSystem Util . getLocale Sys ()) ĊĠĠĠ Ġprivate Ġval Ġapp Time Format Ġby Ġlazy Ġ{ ĠSimpleDateFormat (" mm : ss ", Ġapp Locale ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġnotification Id Ġ= ĠNotifications Util . ID _ AUDIO _ TIMER ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnotification Builder : ĠNotification Compat . Builder ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĠĠĠĠĠĠĠ Ġis Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġm Notification Manager Ġ= ĠNotification Manager Compat . from ( context ) ĊĠĠĠĠĠĠĠ Ġlocale Context Ġ= ĠSystem Util . getLocale Context Sys ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġis Running Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġduration Ġ= Ġintent ?. getLong Extra ( ARG _ DURATION , Ġ 0 ) Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠ Ġtarget Time Ġ= ĠSystem . currentTimeMillis () Ġ+ Ġduration ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġval Ġclick Intent Ġ= ĠIntent ( context , ĠMainActivity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extras ( MainActivity . for Item ( My Bridge . unit Name )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġclick Pending Intent Flags Ġ= Ġif Ġ( Os Utils . satisf y ( Os Utils . M )) ĠPending Intent . FLAG _ IM MUT ABLE Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġclick Pending Intent Ġ= ĠPending Intent . getActivity ( context , Ġ 0 , Ġclick Intent , Ġclick Pending Intent Flags ) ĊĠĠĠĠĠĠĠ Ġval Ġcancel Intent Ġ= ĠIntent ( context , ĠNotification Actions :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( Notification Actions . ACTION , ĠNotification Actions . ACTION _ CANCEL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcancel Pending Intent Flags Ġ= Ġif Ġ( Os Utils . satisf y ( Os Utils . M )) ĠPending Intent . FLAG _ IM MUT ABLE Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġcancel Pending Intent Ġ= ĠPending Intent . getService ( context , Ġ 0 , Ġcancel Intent , Ġcancel Pending Intent Flags ) ĊĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= ĠX . getColor ( context , Ġif Ġ( Theme Util . getIs Night ( context )) ĠR . color . primary AB l ack Ġelse ĠR . color . primary A White ) ĊĠĠĠĠĠĠĠ Ġnotification Builder Ġ= ĠNotifications Util . Builder ( context , ĠNotifications Util . CHANNEL _ AUDIO _ TIMER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ timer _ 2 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( locale Context . getString ( R . string . unit _ audio _ timer )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Category ( Notification Compat . CATEGORY _ SERVICE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( click Pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAction ( R . drawable . ic _ clear _ 2 4 , Ġlocale Context . getString ( R . string . text _ cancel ), Ġcancel Pending Intent ) ĊĠĠĠĠĠĠĠ Ġstart Foreground ( notification Id , Ġnotification Builder . build ()) ĊĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . onStart Command ( intent , Ġflags , Ġstart Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( p 0 : ĠIntent ?): ĠI Binder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġm Handler . remove Callbacks ( m Runnable ) ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ ĠThread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL ooper . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Handler Ġ= ĠHandler ( Looper . my Looper () !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Runnable Ġ= Ġrunnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Continue Ġ= Ġupdate Status () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Continue ) Ġm Handler . post Delayed ( this , Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġm Handler . remove Callbacks ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Runnable . run () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL ooper . loop () ĊĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġis Time Up : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtarget Time Ġ== Ġ 0 L Ġ|| ĠSystem . currentTimeMillis () Ġ>= Ġtarget Time ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Status (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Time Up ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomplete Work () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtick () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠLong . app Adapt ed : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠString . format ( app Locale , Ġ"% d ", Ġthis ) ĊĊĠĠĠ Ġprivate Ġval ĠLong . sys Adapt ed : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠString . format ( System Util . getLocale Sys (), Ġ"% d ", Ġthis ) ĊĊĠĠĠ Ġprivate Ġfun Ġtick () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Left Ġ= Ġtarget Time Ġ- ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġval Ġhour Ġ= Ġtime Left Ġ/ Ġ 3 6 0 0 _ 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġsys Time Ġ= Ġsys Time Format . format ( time Left ) ĊĠĠĠĠĠĠĠ Ġupdate Notification ( if Ġ( hour Ġ== Ġ 0 L ) Ġsys Time Ġelse Ġ"${ hour . sys Adapt ed }: $ sys Time ") ĊĠĠĠĠĠĠĠ Ġ// Ġmodification Ġin Ġother Ġplaces Ġduring Ġiter ating Ġcauses Ġexception ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtick Callbacks . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Tick ( target Time , Ġduration , Ġtime Left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġapp Time Ġ= Ġapp Time Format . format ( time Left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Tick ( if Ġ( hour Ġ== Ġ 0 L ) Ġapp Time Ġelse Ġ"${ hour . app Adapt ed }: $ app Time ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠConcurrent Modification Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Notification ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnotification Builder . setContent Text ( text ) ĊĠĠĠĠĠĠĠ Ġm Notification Manager . notify ( notification Id , Ġnotification Builder . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcomplete Work () Ġ{ ĊĠĠĠĠĠĠĠ Ġstop Audio ( this ) ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġtick Callbacks . iterator () ĊĠĠĠĠĠĠĠ Ġ// Ġmodification Ġin Ġother Ġplaces Ġduring Ġiter ating Ġcauses Ġexception ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Tick ( target Time , Ġduration , Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Tick ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠConcurrent Modification Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Audio ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġam Ġ= Ġcontext . getSystem Service ( Context . AUDIO _ SERVICE ) Ġas ĠAudio Manager ? Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġrequest Audio Focus ( am ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= ĠAudio Manager . AUDIO FOCUS _ REQUEST _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Brief ly ( R . string . text _ error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Audio Focus ( audio Manager : ĠAudio Manager ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Os Utils . satisf y ( Os Utils . O )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Attributes Ġ= ĠAudio Attributes . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set ContentType ( Audio Attributes . CONTENT _ TYPE _ M US IC ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudio Focus Request Ġ= ĠAudio Focus Request . Builder ( Audio Manager . AUDIO FOCUS _ GAIN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Audio Attributes ( audio Attributes ). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . request Audio Focus ( audio Focus Request ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager . request Audio Focus Legacy ( null , ĠAudio Manager . STREAM _ M US IC , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ GAIN ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" deprecation ") ĊĠĠĠ Ġprivate Ġfun ĠAudio Manager . request Audio Focus Legacy ( listener : ĠAudio Manager . On Audio Focus ChangeListener ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream Type : ĠInt , Ġduration Hint : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrequest Audio Focus ( listener , Ġstream Type , Ġduration Hint ) ĊĠĠĠ Ġ} Ċ } Ċ