Chromium Code Reviews| 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(); |
| + } |
| + } |
| } |