package Ġru . ad on ix is . pus ht otal k Ċ Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . media . Audio DeviceInfo Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . media . Audio Manager .* Ċ import Ġandroid . os . Build Ċ import Ġandroid . preference . Preference Manager Ċ import Ġandroid . util . Log Ċ import Ġandroidx . annotation . Nullable Ċ import Ġorg . webrtc . Thread Utils Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . HashSet ĊĊ Ċ class ĠRT CA udio Manager ( context : ĠContext ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAudio Device Ġis Ġthe Ġnames Ġof Ġpossible Ġaudio Ġdevices Ġthat Ġwe Ġcurrently ĊĠĠĠĠ Ġ* Ġsupport . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġenum Ġclass ĠAudio Device Ġ{ ĊĠĠĠĠĠĠĠ ĠSPE AK ER _ PHONE , ĠW I RED _ HEAD SET , ĠE AR PI E CE , ĠNONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠAudio Manager Ġstate . Ġ Ġ*/ ĊĠĠĠ Ġenum Ġclass ĠAudio Manager State Ġ{ ĊĠĠĠĠĠĠĠ ĠUN INITIAL IZED , ĠPRE INITIAL IZED , ĠRUN NING ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSelected Ġaudio Ġdevice Ġchange Ġevent . Ġ Ġ*/ ĊĠĠĠ Ġinterface ĠAudio Manager Events Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCallback Ġfired Ġonce Ġaudio Ġdevice Ġis Ġchanged Ġor Ġlist Ġof Ġavailable Ġaudio Ġdevices Ġchanged . ĊĠĠĠĠĠĠĠ Ġfun Ġon Audio Device Changed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Audio Device : ĠAudio Device ?, Ġavailable Audio Devices : ĠSet < Audio Device ?> ? ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġapp rtc Context : ĠContext ĊĊĠĠĠ Ġ@ Nullable ĊĠĠĠ Ġprivate Ġval Ġaudio Manager : ĠAudio Manager ĊĊĠĠĠ Ġ@ Nullable ĊĠĠĠ Ġprivate Ġvar Ġaudio Manager Events : ĠAudio Manager Events ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġam State : ĠAudio Manager State ĊĠĠĠ Ġprivate Ġvar Ġsaved Audio Mode Ġ= ĠAudio Manager . MODE _ INVALID ĊĠĠĠ Ġprivate Ġvar Ġsaved Is Speaker Phone On Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġsaved Is Micro phone Mute Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġhas W ired Head set Ġ= Ġfalse ĊĊĠĠĠ Ġ// ĠDefault Ġaudio Ġdevice ; Ġspeaker Ġphone Ġfor Ġvideo Ġcalls Ġor Ġe arp iece Ġfor Ġaudio ĊĠĠĠ Ġ// Ġonly Ġcalls . ĊĠĠĠ Ġprivate Ġvar Ġdefault Audio Device : ĠAudio Device ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠContains Ġthe Ġcurrently Ġselected Ġaudio Ġdevice . ĊĠĠĠ Ġ// ĠThis Ġdevice Ġis Ġchanged Ġautomatically Ġusing Ġa Ġcertain Ġscheme Ġwhere Ġe . g . ĊĠĠĠ Ġ// Ġa Ġw ired Ġhead set Ġ" wins " Ġover Ġspeaker Ġphone . ĠIt Ġis Ġalso Ġpossible Ġfor Ġa ĊĠĠĠ Ġ// Ġuser Ġto Ġexplicitly Ġselect Ġa Ġdevice Ġ( and Ġover rid Ġany Ġpredefined Ġscheme ). ĊĠĠĠ Ġ// ĠSee Ġ| user Selected Audio Device | Ġfor Ġdetails . ĊĠĠĠ Ġprivate Ġvar Ġselected Audio Device : ĠAudio Device ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠContains Ġthe Ġuser - selected Ġaudio Ġdevice Ġwhich Ġoverrides Ġthe Ġpredefined ĊĠĠĠ Ġ// Ġselection Ġscheme . ĊĠĠĠ Ġprivate Ġvar Ġuser Selected Audio Device : ĠAudio Device ? Ġ= Ġnull ĊĊĠĠĠ Ġ// ĠContains Ġspeaker phone Ġsetting : Ġauto , Ġtrue Ġor Ġfalse ĊĠĠĠ Ġ@ Nullable ĊĠĠĠ Ġprivate Ġval Ġuse Speaker phone : ĠString ? ĊĊĊĠĠĠ Ġ// ĠContains Ġa Ġlist Ġof Ġavailable Ġaudio Ġdevices . ĠA ĠSet Ġcollection Ġis Ġused Ġto ĊĠĠĠ Ġ// Ġavoid Ġduplicate Ġelements . ĊĠĠĠ Ġprivate Ġvar Ġaudio Devices : ĠMutable Set < Audio Device ?> Ġ= ĠHashSet () ĊĊĠĠĠ Ġ// ĠBroadcast Ġreceiver Ġfor Ġw ired Ġhead set Ġintent Ġbroadcast s . ĊĠĠĠ Ġprivate Ġval Ġw ired Head set Receiver : ĠBroadcast Receiver ĊĊĠĠĠ Ġ// ĠCallback Ġmethod Ġfor Ġchanges Ġin Ġaudio Ġfocus . ĊĠĠĠ Ġ@ Nullable ĊĠĠĠ Ġprivate Ġvar Ġaudio Focus ChangeListener : ĠOn Audio Focus ChangeListener ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġspeaker Mute () Ġ{ ĊĠĠĠĠĠĠĠ Ġaudio Manager . adjust Volume ( STREAM _ SYSTEM , ĠAD JUST _ M UTE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġspeaker Un mute () Ġ{ ĊĠĠĠĠĠĠĠ Ġaudio Manager . adjust Volume ( STREAM _ SYSTEM , ĠAD JUST _ UN M UTE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĠReceiver Ġwhich Ġhandles Ġchanges Ġin Ġw ired Ġhead set Ġavailability . Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠW ired Head set Receiver () Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġintent . getInt Extra (" state ", ĠSTATE _ UN PLU GG ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmicro phone Ġ= Ġintent . getInt Extra (" micro phone ", ĠHAS _ NO _ MIC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġintent . getString Extra (" name ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" W ired Head set Receiver . on Receive " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ": Ġ" Ġ+ Ġ" a =" Ġ+ Ġintent . action . toString () Ġ+ Ġ", Ġs =" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( state Ġ== ĠSTATE _ UN PLU GG ED ) Ġ" un plug ged " Ġelse Ġ" plug ged "). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ", Ġm =" Ġ+ Ġ( if Ġ( micro phone Ġ== ĠHAS _ MIC ) Ġ" mic " Ġelse Ġ" no Ġmic "). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ", Ġn =" Ġ+ Ġname . toString () Ġ+ Ġ", Ġsb =" Ġ+ Ġis Initial Sticky Broadcast ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas W ired Head set Ġ= Ġ( state Ġ== ĠSTATE _ PLU GG ED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Audio Device State () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSTATE _ UN PLU GG ED Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSTATE _ PLU GG ED Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠHAS _ NO _ MIC Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠHAS _ MIC Ġ= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstart ( audio Manager Events : ĠAudio Manager Events ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" start ") ĊĠĠĠĠĠĠĠ ĠThread Utils . check Is On MainThread () ĊĠĠĠĠĠĠĠ Ġif Ġ( am State Ġ== ĠAudio Manager State . RUNNING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Audio Manager Ġis Ġalready Ġactive ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġelse Ġif Ġ( am State Ġ== ĠAudio Manager State . UN INITIAL IZED ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġpre Init Audio () Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġperhaps Ġcall Ġnew Ġmethod Ġcalled Ġpre Init Audio () Ġhere Ġif ĠUN INITIAL IZED . ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Audio Manager Ġstarts ...") ĊĠĠĠĠĠĠĠ Ġthis . audio Manager Events Ġ= Ġaudio Manager Events ĊĠĠĠĠĠĠĠ Ġam State Ġ= ĠAudio Manager State . RUNNING ĊĊĠĠĠĠĠĠĠ Ġ// ĠStore Ġcurrent Ġaudio Ġstate Ġso Ġwe Ġcan Ġrestore Ġit Ġwhen Ġstop () Ġis Ġcalled . ĊĠĠĠĠĠĠĠ Ġsaved Audio Mode Ġ= Ġaudio Manager . mode ĊĠĠĠĠĠĠĠ Ġsaved Is Speaker Phone On Ġ= Ġaudio Manager . is Speaker phone On ĊĠĠĠĠĠĠĠ Ġsaved Is Micro phone Mute Ġ= Ġaudio Manager . is Micro phone Mute ĊĠĠĠĠĠĠĠ Ġhas W ired Head set Ġ= Ġhas W ired Head set () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġan ĠAudio Manager . On Audio Focus ChangeListener Ġinstance . ĊĠĠĠĠĠĠĠ Ġaudio Focus ChangeListener Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOn Audio Focus ChangeListener Ġ{ Ġfocus Change Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCalled Ġon Ġthe Ġlistener Ġto Ġnotify Ġif Ġthe Ġaudio Ġfocus Ġfor Ġthis Ġlistener Ġhas Ġbeen Ġchanged . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġ| focus Change | Ġvalue Ġindicates Ġwhether Ġthe Ġfocus Ġwas Ġg ained , Ġwhether Ġthe Ġfocus Ġwas Ġlost , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġwhether Ġthat Ġloss Ġis Ġtransient , Ġor Ġwhether Ġthe Ġnew Ġfocus Ġholder Ġwill Ġhold Ġit Ġfor Ġan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġunknown Ġamount Ġof Ġtime . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtypeOf Change : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( focus Change ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ GAIN Ġ-> ĠtypeOf Change Ġ= Ġ" AUDIO FOCUS _ GAIN " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ GAIN _ TRAN SI ENT Ġ-> ĠtypeOf Change Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" AUDIO FOCUS _ GAIN _ TRAN SI ENT " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ GAIN _ TRAN SI ENT _ EXCL USIVE Ġ-> ĠtypeOf Change Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" AUDIO FOCUS _ GAIN _ TRAN SI ENT _ EXCL USIVE " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ GAIN _ TRAN SI ENT _ MAY _ DU CK Ġ-> ĠtypeOf Change Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" AUDIO FOCUS _ GAIN _ TRAN SI ENT _ MAY _ DU CK " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ LO SS Ġ-> ĠtypeOf Change Ġ= Ġ" AUDIO FOCUS _ LO SS " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ LO SS _ TRAN SI ENT Ġ-> ĠtypeOf Change Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" AUDIO FOCUS _ LO SS _ TRAN SI ENT " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ LO SS _ TRAN SI ENT _ CAN _ DU CK Ġ-> ĠtypeOf Change Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" AUDIO FOCUS _ LO SS _ TRAN SI ENT _ CAN _ DU CK " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠtypeOf Change Ġ= Ġ" AUDIO FOCUS _ INVALID " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" on Audio Focus Change : Ġ$ type Of Change ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRequest Ġaudio Ġp layout Ġfocus Ġ( without Ġdu ck ing ) Ġand Ġinstall Ġlistener Ġfor Ġchanges Ġin Ġfocus . ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġaudio Manager . request Audio Focus ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Focus ChangeListener , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . STREAM _ VOICE _ CALL , ĠAudio Manager . AUDIO FOCUS _ GAIN _ TRAN SI ENT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== ĠAudio Manager . AUDIO FOCUS _ REQUEST _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Audio Ġfocus Ġrequest Ġgranted Ġfor ĠV O ICE _ CALL Ġstreams ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Audio Ġfocus Ġrequest Ġfailed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġby Ġsetting ĠMODE _ IN _ COMM UN ICATION Ġas Ġdefault Ġaudio Ġmode . ĠIt Ġis ĊĠĠĠĠĠĠĠ Ġ// Ġrequired Ġto Ġbe Ġin Ġthis Ġmode Ġwhen Ġp layout Ġand / or Ġrecording Ġstarts Ġfor ĊĠĠĠĠĠĠĠ Ġ// Ġbest Ġpossible ĠVo IP Ġperformance . ĊĠĠĠĠĠĠĠ Ġaudio Manager . mode Ġ= ĠAudio Manager . MODE _ IN _ COMM UN ICATION ĊĊĠĠĠĠĠĠĠ Ġ// ĠAlways Ġdisable Ġmicro phone Ġmute Ġduring Ġa ĠWeb RTC Ġcall . ĊĠĠĠĠĠĠĠ Ġset Micro phone Mute ( false ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġinitial Ġdevice Ġstates . ĊĠĠĠĠĠĠĠ Ġuser Selected Audio Device Ġ= ĠAudio Device . NONE ĊĠĠĠĠĠĠĠ Ġselected Audio Device Ġ= ĠAudio Device . NONE ĊĠĠĠĠĠĠĠ Ġaudio Devices . clear () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġinitial Ġselection Ġof Ġaudio Ġdevice . ĠThis Ġsetting Ġcan Ġlater Ġbe Ġchanged ĊĠĠĠĠĠĠĠ Ġ// Ġeither Ġby Ġadding / re moving Ġa ĠBT Ġor Ġw ired Ġhead set Ġor Ġby Ġcover ing / un cover ing ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġprox imity Ġsensor . ĊĠĠĠĠĠĠĠ Ġupdate Audio Device State () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRegister Ġreceiver Ġfor Ġbroadcast Ġintent s Ġrelated Ġto Ġadding / re moving Ġa ĊĠĠĠĠĠĠĠ Ġ// Ġw ired Ġhead set . ĊĠĠĠĠĠĠĠ Ġregister Receiver ( w ired Head set Receiver , ĠIntent Filter ( Intent . ACTION _ HEAD SET _ PL UG )) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Audio Manager Ġstarted ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" stop ") ĊĠĠĠĠĠĠĠ ĠThread Utils . check Is On MainThread () ĊĠĠĠĠĠĠĠ Ġif Ġ( am State Ġ!= ĠAudio Manager State . RUNNING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Trying Ġto Ġstop ĠAudio Manager Ġin Ġincorrect Ġstate : Ġ$ am State " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġam State Ġ= ĠAudio Manager State . UN INITIAL IZED ĊĠĠĠĠĠĠĠ Ġunregister Receiver ( w ired Head set Receiver ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRestore Ġpreviously Ġstored Ġaudio Ġstates . ĊĠĠĠĠĠĠĠ Ġset Speaker phone On ( saved Is Speaker Phone On ) ĊĠĠĠĠĠĠĠ Ġset Micro phone Mute ( saved Is Micro phone Mute ) ĊĠĠĠĠĠĠĠ Ġaudio Manager . mode Ġ= Ġsaved Audio Mode ĊĊĠĠĠĠĠĠĠ Ġ// ĠAb and on Ġaudio Ġfocus . ĠG ives Ġthe Ġprevious Ġfocus Ġowner , Ġif Ġany , Ġfocus . ĊĠĠĠĠĠĠĠ Ġaudio Manager . ab and on Audio Focus ( audio Focus ChangeListener ) ĊĠĠĠĠĠĠĠ Ġaudio Focus ChangeListener Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Ab and oned Ġaudio Ġfocus Ġfor ĠV O ICE _ CALL Ġstreams ") ĊĊĠĠĠĠĠĠĠ Ġaudio Manager Events Ġ= Ġnull ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Audio Manager Ġstopped ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠChanges Ġselection Ġof Ġthe Ġcurrently Ġactive Ġaudio Ġdevice . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Audio Device Internal ( device : ĠAudio Device ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" set Audio Device Internal ( device =$ device )") ĊĠĠĠĠĠĠĠ Ġif Ġ( audio Devices . contains ( device )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( device ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Device . SPE AK ER _ PHONE Ġ-> Ġset Speaker phone On ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Device . EAR PI E CE Ġ-> Ġset Speaker phone On ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Device . WI RED _ HEAD SET Ġ-> Ġset Speaker phone On ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLog . e ( TAG , Ġ" Invalid Ġaudio Ġdevice Ġselection ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġselected Audio Device Ġ= Ġdevice ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChanges Ġdefault Ġaudio Ġdevice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠsetDefault Audio Device ( default Device : ĠAudio Device ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠThread Utils . check Is On MainThread () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( default Device ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Device . SPE AK ER _ PHONE Ġ-> Ġdefault Audio Device Ġ= Ġdefault Device ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Device . EAR PI E CE Ġ-> Ġif Ġ( has E arp iece ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Audio Device Ġ= Ġdefault Device ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Audio Device Ġ= ĠAudio Device . SPE AK ER _ PHONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ// Log . e ( TAG , Ġ" Invalid Ġdefault Ġaudio Ġdevice Ġselection ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Audio Device Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" setDefault Audio Device ( device =$ default Audio Device )") ĊĠĠĠĠĠĠĠ Ġupdate Audio Device State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠChanges Ġselection Ġof Ġthe Ġcurrently Ġactive Ġaudio Ġdevice . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġselect Audio Device ( device : ĠAudio Device ) Ġ{ ĊĠĠĠĠĠĠĠ ĠThread Utils . check Is On MainThread () ĊĠĠĠĠĠĠĠ Ġif Ġ(! audio Devices . contains ( device )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Can Ġnot Ġselect Ġ$ device Ġfrom Ġavailable Ġ$ audio Devices " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġuser Selected Audio Device Ġ= Ġdevice ĊĠĠĠĠĠĠĠ Ġupdate Audio Device State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġcurrent Ġset Ġof Ġavailable / selectable Ġaudio Ġdevices . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġget Audio Devices (): ĠSet < Audio Device > Ġ{ ĊĠĠĠĠĠĠĠ ĠThread Utils . check Is On MainThread () ĊĠĠĠĠĠĠĠ Ġreturn ĠCollections . unmodifiable Set ( HashSet ( audio Devices )) Ġas ĠSet < Audio Device > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġcurrently Ġselected Ġaudio Ġdevice . Ġ Ġ*/ ĊĠĠĠ Ġfun Ġget Selected Audio Device (): ĠAudio Device ? Ġ{ ĊĠĠĠĠĠĠĠ ĠThread Utils . check Is On MainThread () ĊĠĠĠĠĠĠĠ Ġreturn Ġselected Audio Device ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠHelper Ġmethod Ġfor Ġreceiver Ġregistration . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġregister Receiver ( receiver : ĠBroadcast Receiver , Ġfilter : ĠIntent Filter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġapp rtc Context . register Receiver ( receiver , Ġfilter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠHelper Ġmethod Ġfor Ġun registration Ġof Ġan Ġexisting Ġreceiver . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġunregister Receiver ( receiver : ĠBroadcast Receiver ) Ġ{ ĊĠĠĠĠĠĠĠ Ġapp rtc Context . unregister Receiver ( receiver ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSets Ġthe Ġspeaker Ġphone Ġmode . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Speaker phone On ( on : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwas On Ġ= Ġaudio Manager . is Speaker phone On ĊĠĠĠĠĠĠĠ Ġif Ġ( was On Ġ== Ġon ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaudio Manager . is Speaker phone On Ġ= Ġon ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSets Ġthe Ġmicro phone Ġmute Ġstate . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Micro phone Mute ( on : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwas Mut ed Ġ= Ġaudio Manager . is Micro phone Mute ĊĠĠĠĠĠĠĠ Ġif Ġ( was Mut ed Ġ== Ġon ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaudio Manager . is Micro phone Mute Ġ= Ġon ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGets Ġthe Ġcurrent Ġe arp iece Ġstate . Ġ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhas E arp iece (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġapp rtc Context . get PackageManager (). has System Feature ( PackageManager . FEATURE _ TELE PHONY ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġa Ġw ired Ġhead set Ġis Ġconnected Ġor Ġnot . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġnot Ġa Ġvalid Ġindication Ġthat Ġaudio Ġplayback Ġis Ġactually Ġover ĊĠĠĠĠ Ġ* Ġthe Ġw ired Ġhead set Ġas Ġaudio Ġrouting Ġdepends Ġon Ġother Ġconditions . ĠWe ĊĠĠĠĠ Ġ* Ġonly Ġuse Ġit Ġas Ġan Ġearly Ġindicator Ġ( during Ġinitialization ) Ġof Ġan Ġattached ĊĠĠĠĠ Ġ* Ġw ired Ġhead set . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Deprecated ("") ĊĠĠĠ Ġprivate Ġfun Ġhas W ired Head set (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaudio Manager . is W ired Head setOn ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdevices Ġ= Ġaudio Manager . get Devices ( Audio Manager . GET _ DEVICES _ INPUT S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( device : ĠAudio DeviceInfo Ġin Ġdevices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġdevice . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠAudio DeviceInfo . TYPE _ WI RED _ HEAD SET ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" has W ired Head set : Ġfound Ġw ired Ġhead set ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( type Ġ== ĠAudio DeviceInfo . TYPE _ USB _ DEVICE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" has W ired Head set : Ġfound ĠUSB Ġaudio Ġdevice ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġlist Ġof Ġpossible Ġaudio Ġdevices Ġand Ġmake Ġnew Ġdevice Ġselection . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Audio Device State () Ġ{ ĊĠĠĠĠĠĠĠ ĠThread Utils . check Is On MainThread () ĊĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ(" --- Ġupdate Audio Device State : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" w ired Ġhead set =" Ġ+ Ġhas W ired Head set ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ(" Device Ġstatus : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" available =" Ġ+ Ġaudio Devices Ġ+ Ġ", Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" selected =" Ġ+ Ġselected Audio Device Ġ+ Ġ", Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" user Ġselected =" Ġ+ Ġuser Selected Audio Device ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġset Ġof Ġavailable Ġaudio Ġdevices . ĊĠĠĠĠĠĠĠ Ġval Ġnew Audio Devices : ĠMutable Set < Audio Device ?> Ġ= ĠHashSet () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has W ired Head set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġa Ġw ired Ġhead set Ġis Ġconnected , Ġthen Ġit Ġis Ġthe Ġonly Ġpossible Ġoption . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Audio Devices . add ( Audio Device . WI RED _ HEAD SET ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġw ired Ġhead set , Ġhence Ġthe Ġaudio - device Ġlist Ġcan Ġcontain Ġspeaker ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġphone Ġ( on Ġa Ġtablet ), Ġor Ġspeaker Ġphone Ġand Ġe arp iece Ġ( on Ġmobile Ġphone ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Audio Devices . add ( Audio Device . SPE AK ER _ PHONE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has E arp iece ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Audio Devices . add ( Audio Device . EAR PI E CE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠStore Ġstate Ġwhich Ġis Ġset Ġto Ġtrue Ġif Ġthe Ġdevice Ġlist Ġhas Ġchanged . ĊĠĠĠĠĠĠĠ Ġvar Ġaudio Device Set Updated Ġ= Ġaudio Devices Ġ!= Ġnew Audio Devices ĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġexisting Ġaudio Ġdevice Ġset . ĊĠĠĠĠĠĠĠ Ġaudio Devices Ġ= Ġnew Audio Devices ĊĠĠĠĠĠĠĠ Ġ// ĠCorrect Ġuser Ġselected Ġaudio Ġdevices Ġif Ġneeded . ĊĠĠĠĠĠĠĠ Ġif Ġ( has W ired Head set Ġ&& Ġuser Selected Audio Device Ġ== ĠAudio Device . SPE AK ER _ PHONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġuser Ġselected Ġspeaker Ġphone , Ġbut Ġthen Ġplug ged Ġw ired Ġhead set Ġthen Ġmake ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġw ired Ġhead set Ġas Ġuser Ġselected Ġdevice . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Selected Audio Device Ġ= ĠAudio Device . WI RED _ HEAD SET ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! has W ired Head set Ġ&& Ġuser Selected Audio Device Ġ== ĠAudio Device . WI RED _ HEAD SET ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġuser Ġselected Ġw ired Ġhead set , Ġbut Ġthen Ġun plug ged Ġw ired Ġhead set Ġthen Ġmake ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġspeaker Ġphone Ġas Ġuser Ġselected Ġdevice . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser Selected Audio Device Ġ= ĠAudio Device . SPE AK ER _ PHONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġselected Ġaudio Ġdevice . ĊĠĠĠĠĠĠĠ Ġval Ġnew Audio Device : ĠAudio Device ? ĊĠĠĠĠĠĠĠ Ġif Ġ( has W ired Head set ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġa Ġw ired Ġhead set Ġis Ġconnected , Ġbut ĠBluetooth Ġis Ġnot , Ġthen Ġw ired Ġhead set Ġis Ġused Ġas ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġaudio Ġdevice . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Audio Device Ġ= ĠAudio Device . WI RED _ HEAD SET ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġw ired Ġhead set Ġand Ġno ĠBluetooth , Ġhence Ġthe Ġaudio - device Ġlist Ġcan Ġcontain Ġspeaker ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġphone Ġ( on Ġa Ġtablet ), Ġor Ġspeaker Ġphone Ġand Ġe arp iece Ġ( on Ġmobile Ġphone ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ| default Audio Device | Ġcontains Ġeither ĠAudio Device . SPE AK ER _ PHONE Ġor ĠAudio Device . EAR PI E CE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdepending Ġon Ġthe Ġuser 's Ġselection . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Audio Device Ġ= Ġdefault Audio Device ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠSwitch Ġto Ġnew Ġdevice Ġbut Ġonly Ġif Ġthere Ġhas Ġbeen Ġany Ġchanges . ĊĠĠĠĠĠĠĠ Ġif Ġ( new Audio Device Ġ!= Ġselected Audio Device Ġ|| Ġaudio Device Set Updated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġthe Ġrequired Ġdevice Ġswitch . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Audio Device Internal ( new Audio Device ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , Ġ(" New Ġdevice Ġstatus : Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" available =" Ġ+ Ġaudio Devices Ġ+ Ġ", Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" selected =" Ġ+ Ġnew Audio Device ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( audio Manager Events Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNotify Ġa Ġlistening Ġclient Ġthat Ġaudio Ġdevice Ġhas Ġbeen Ġchanged . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Manager Events !!. on Audio Device Changed ( selected Audio Device , Ġaudio Devices ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" --- Ġupdate Audio Device State Ġdone ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" App RT CA udio Manager " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSPE AK ER PHONE _ AUTO Ġ= Ġ" auto " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSPE AK ER PHONE _ TRUE Ġ= Ġ" true " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSPE AK ER PHONE _ FALSE Ġ= Ġ" false " ĊĊĠĠĠĠĠĠĠ Ġ/** ĠCon struction . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( context : ĠContext ): ĠRT CA udio Manager Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRT CA udio Manager ( context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" ctor ") ĊĠĠĠĠĠĠĠ ĠThread Utils . check Is On MainThread () ĊĠĠĠĠĠĠĠ Ġapp rtc Context Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġaudio Manager Ġ= Ġcontext . getSystem Service ( Context . AUDIO _ SERVICE ) Ġas ĠAudio Manager ĊĠĠĠĠĠĠĠ Ġw ired Head set Receiver Ġ= ĠW ired Head set Receiver () ĊĠĠĠĠĠĠĠ Ġam State Ġ= ĠAudio Manager State . UN INITIAL IZED ĊĠĠĠĠĠĠĠ Ġval Ġshared Preferences Ġ= ĠPreference Manager . getDefault SharedPreferences ( context ) ĊĠĠĠĠĠĠĠ Ġuse Speaker phone Ġ= Ġshared Preferences . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . pref _ speaker phone _ key ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . pref _ speaker phone _ default ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" use Speaker phone : Ġ$ use Speaker phone ") ĊĠĠĠĠĠĠĠ Ġif Ġ(( use Speaker phone Ġ== ĠSPE AK ER PHONE _ FALSE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Audio Device Ġ= ĠAudio Device . EAR PI E CE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Audio Device Ġ= ĠAudio Device . SPE AK ER _ PHONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" default Audio Device : Ġ$ default Audio Device ") ĊĠĠĠ Ġ} Ċ }