blob: c42d6c4112af81086eb90ad441ed6df1310d2240 [file] [log] [blame]
Alexandre Lision6d867b92013-10-25 15:36:28 -04001package org.sflphone.utils;
2
3import org.sflphone.service.SipService;
4
Alexandre Lision63870a72013-10-28 16:33:47 -04005import android.content.Context;
6import android.media.AudioManager;
Alexandre Lision6e9c7e52013-10-29 15:54:11 -04007import android.media.AudioManager.OnAudioFocusChangeListener;
Alexandre Lision6d867b92013-10-25 15:36:28 -04008import android.os.Handler;
9import android.util.Log;
10
Alexandre Lision35577132013-12-06 15:21:15 -050011public class MediaManager implements OnAudioFocusChangeListener {
Alexandre Lision6d867b92013-10-25 15:36:28 -040012
13 private static final String TAG = MediaManager.class.getSimpleName();
14 private SipService mService;
15 private SettingsContentObserver mSettingsContentObserver;
Alexandre Lision63870a72013-10-28 16:33:47 -040016 AudioManager mAudioManager;
Alexandre Lisionf02190d2013-12-12 17:26:12 -050017 private Ringer ringer;
Alexandre Lision6d867b92013-10-25 15:36:28 -040018
19 public MediaManager(SipService aService) {
20 mService = aService;
21 mSettingsContentObserver = new SettingsContentObserver(mService, new Handler());
Alexandre Lision63870a72013-10-28 16:33:47 -040022 mAudioManager = (AudioManager) aService.getSystemService(Context.AUDIO_SERVICE);
Alexandre Lisionf02190d2013-12-12 17:26:12 -050023
24 ringer = new Ringer(aService);
Alexandre Lision6d867b92013-10-25 15:36:28 -040025 }
26
27 public void startService() {
28 mService.getApplicationContext().getContentResolver()
29 .registerContentObserver(android.provider.Settings.System.CONTENT_URI, true, mSettingsContentObserver);
30 }
31
32 public void stopService() {
33 Log.i(TAG, "Remove media manager....");
34 mService.getApplicationContext().getContentResolver().unregisterContentObserver(mSettingsContentObserver);
35 }
36
Alexandre Lision63870a72013-10-28 16:33:47 -040037 public AudioManager getAudioManager() {
38 return mAudioManager;
39 }
40
Alexandre Lisionbaeeb212013-12-09 12:54:47 -050041 public void obtainAudioFocus(boolean requestSpeakerOn) {
Alexandre Lision6e9c7e52013-10-29 15:54:11 -040042 mAudioManager.requestAudioFocus(this, Compatibility.getInCallStream(false), AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
Alexandre Lision7e390652013-12-06 16:58:22 -050043 mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
Alexandre Lisionc985b362013-12-10 17:45:03 -050044 if(requestSpeakerOn && !mAudioManager.isWiredHeadsetOn()){
Alexandre Lisionbaeeb212013-12-09 12:54:47 -050045 RouteToSpeaker();
46 }
Alexandre Lision6e9c7e52013-10-29 15:54:11 -040047 }
48
49 @Override
50 public void onAudioFocusChange(int arg0) {
Alexandre Lision35577132013-12-06 15:21:15 -050051
Alexandre Lision6e9c7e52013-10-29 15:54:11 -040052 }
53
Alexandre Lision35577132013-12-06 15:21:15 -050054 public void abandonAudioFocus() {
55 mAudioManager.abandonAudioFocus(this);
56 if (mAudioManager.isSpeakerphoneOn()) {
57 mAudioManager.setSpeakerphoneOn(false);
58 }
Alexandre Lision7e390652013-12-06 16:58:22 -050059 mAudioManager.setMode(AudioManager.MODE_NORMAL);
Alexandre Lision35577132013-12-06 15:21:15 -050060 }
61
62 public void RouteToSpeaker() {
63 mAudioManager.setSpeakerphoneOn(true);
64 }
65
66 public void RouteToInternalSpeaker() {
67 mAudioManager.setSpeakerphoneOn(false);
68 }
Alexandre Lisionf02190d2013-12-12 17:26:12 -050069
70
71 /**
72 * Start ringing announce for a given contact.
73 * It will also focus audio for us.
74 * @param remoteContact the contact to ring for. May resolve the contact ringtone if any.
75 */
76 synchronized public void startRing(String remoteContact) {
77
78 if(!ringer.isRinging()) {
79 ringer.ring(remoteContact, "USELESS");
80 }else {
81 Log.d(TAG, "Already ringing ....");
82 }
83
84 }
85
86 /**
87 * Stop all ringing. <br/>
88 * Warning, this will not unfocus audio.
89 */
90 synchronized public void stopRing() {
91 if(ringer.isRinging()) {
92 ringer.stopRing();
93 }
94 }
Alexandre Lision6d867b92013-10-25 15:36:28 -040095}