Index: media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java |
diff --git a/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java b/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java |
index 0f0cfb61e08428eb477c9de493d4d60fff342293..4e827b091190d664a6f61fb99f7144d7c8aabb9c 100644 |
--- a/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java |
+++ b/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java |
@@ -5,15 +5,22 @@ |
package org.chromium.media; |
import android.content.BroadcastReceiver; |
+import android.content.ContentResolver; |
import android.content.Context; |
import android.content.Intent; |
import android.content.IntentFilter; |
import android.content.pm.PackageManager; |
+import android.database.ContentObserver; |
import android.media.AudioFormat; |
import android.media.AudioManager; |
import android.media.AudioRecord; |
import android.media.AudioTrack; |
+import android.net.Uri; |
import android.os.Build; |
+import android.os.Handler; |
+import android.os.Looper; |
+import android.provider.Settings; |
+import android.provider.Settings.System; |
import android.util.Log; |
import org.chromium.base.CalledByNative; |
@@ -33,10 +40,17 @@ class AudioManagerAndroid { |
private final AudioManager mAudioManager; |
private final Context mContext; |
+ private final long mNativeAudioManagerAndroid; |
private BroadcastReceiver mReceiver; |
private boolean mOriginalSpeakerStatus; |
+ private final ContentResolver mContentResolver; |
+ private SettingsObserver mSettingsObserver = null; |
+ private SettinsObserverThread mSettinsObserverThread = null; |
+ private int mCurrentVolume; |
+ private final Object mSettingsObserverLock = new Object(); |
+ |
@CalledByNative |
public void setMode(int mode) { |
try { |
@@ -48,13 +62,17 @@ class AudioManagerAndroid { |
} |
@CalledByNative |
- private static AudioManagerAndroid createAudioManagerAndroid(Context context) { |
- return new AudioManagerAndroid(context); |
+ private static AudioManagerAndroid createAudioManagerAndroid( |
+ Context context, |
+ long nativeAudioManagerAndroid) { |
+ return new AudioManagerAndroid(context, nativeAudioManagerAndroid); |
} |
- private AudioManagerAndroid(Context context) { |
+ private AudioManagerAndroid(Context context, long nativeAudioManagerAndroid) { |
mContext = context; |
+ mNativeAudioManagerAndroid = nativeAudioManagerAndroid; |
mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE); |
+ mContentResolver = mContext.getContentResolver(); |
} |
@CalledByNative |
@@ -84,10 +102,28 @@ class AudioManagerAndroid { |
} |
}; |
mContext.registerReceiver(mReceiver, filter); |
+ |
+ mSettinsObserverThread = new SettinsObserverThread(); |
tommi (sloooow) - chröme
2013/12/02 18:36:00
s/mSettinsObserverThread/mSettingsObserverThread
s
wjia(left Chromium)
2013/12/02 21:49:49
Done.
|
+ mSettinsObserverThread.start(); |
+ synchronized(mSettingsObserverLock) { |
+ try { |
+ mSettingsObserverLock.wait(); |
+ } catch (InterruptedException e) { |
+ Log.e(TAG, "unregisterHeadsetReceiver exception: " + e.getMessage()); |
+ } |
+ } |
} |
@CalledByNative |
public void unregisterHeadsetReceiver() { |
+ if (mSettinsObserverThread != null ) { |
+ mSettinsObserverThread = null; |
+ } |
+ if (mSettingsObserver != null) { |
+ mContentResolver.unregisterContentObserver(mSettingsObserver); |
+ mSettingsObserver = null; |
+ } |
+ |
mContext.unregisterReceiver(mReceiver); |
mReceiver = null; |
mAudioManager.setSpeakerphoneOn(mOriginalSpeakerStatus); |
@@ -165,4 +201,39 @@ class AudioManagerAndroid { |
DEFAULT_FRAME_PER_BUFFER : Integer.parseInt(framesPerBuffer)); |
} |
+ private class SettingsObserver extends ContentObserver { |
+ SettingsObserver() { |
+ super(new Handler()); |
+ mContentResolver.registerContentObserver(Settings.System.CONTENT_URI, true, this); |
+ } |
+ |
+ @Override |
+ public void onChange(boolean selfChange) { |
+ super.onChange(selfChange); |
+ int volume = mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL); |
+ nativeSetMute(mNativeAudioManagerAndroid, (volume == 0)); |
+ } |
+ } |
+ |
+ private native void nativeSetMute(long nativeAudioManagerAndroid, boolean state); |
+ |
+ private class SettinsObserverThread extends Thread { |
+ SettinsObserverThread() { |
+ super("SettinsObserver"); |
+ } |
+ |
+ @Override |
+ public void run() { |
+ // Set this thread up so the handler will work on it. |
+ Looper.prepare(); |
+ |
+ synchronized(mSettingsObserverLock) { |
+ mSettingsObserver = new SettingsObserver(); |
+ mSettingsObserverLock.notify(); |
+ } |
+ |
+ // Listen for volume change. |
+ Looper.loop(); |
+ } |
+ } |
} |