Merge "Fix a race condition in SeekBarVolumizer." into nyc-dev

am: 54f4a63

* commit '54f4a630dcb66f0b6d5ae5b1028dc88d7971c99e':
  Fix a race condition in SeekBarVolumizer.
This commit is contained in:
Sudheer Shanka
2016-03-17 20:09:39 +00:00
committed by android-build-merger

View File

@@ -38,6 +38,8 @@ import android.util.Log;
import android.widget.SeekBar; import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.SeekBar.OnSeekBarChangeListener;
import com.android.internal.annotations.GuardedBy;
/** /**
* Turns a {@link SeekBar} into a volume control. * Turns a {@link SeekBar} into a volume control.
* @hide * @hide
@@ -67,6 +69,10 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
private Observer mVolumeObserver; private Observer mVolumeObserver;
private int mOriginalStreamVolume; private int mOriginalStreamVolume;
private int mLastAudibleStreamVolume; private int mLastAudibleStreamVolume;
// When the old handler is destroyed and a new one is created, there could be a situation where
// this is accessed at the same time in different handlers. So, access to this field needs to be
// synchronized.
@GuardedBy("this")
private Ringtone mRingtone; private Ringtone mRingtone;
private int mLastProgress = -1; private int mLastProgress = -1;
private boolean mMuted; private boolean mMuted;
@@ -174,11 +180,13 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
} }
private void onInitSample() { private void onInitSample() {
synchronized (this) {
mRingtone = RingtoneManager.getRingtone(mContext, mDefaultUri); mRingtone = RingtoneManager.getRingtone(mContext, mDefaultUri);
if (mRingtone != null) { if (mRingtone != null) {
mRingtone.setStreamType(mStreamType); mRingtone.setStreamType(mStreamType);
} }
} }
}
private void postStartSample() { private void postStartSample() {
if (mHandler == null) return; if (mHandler == null) return;
@@ -192,6 +200,8 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
if (mCallback != null) { if (mCallback != null) {
mCallback.onSampleStarting(this); mCallback.onSampleStarting(this);
} }
synchronized (this) {
if (mRingtone != null) { if (mRingtone != null) {
try { try {
mRingtone.setAudioAttributes(new AudioAttributes.Builder(mRingtone mRingtone.setAudioAttributes(new AudioAttributes.Builder(mRingtone
@@ -206,6 +216,7 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
} }
} }
} }
}
private void postStopSample() { private void postStopSample() {
if (mHandler == null) return; if (mHandler == null) return;
@@ -216,10 +227,12 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
} }
private void onStopSample() { private void onStopSample() {
synchronized (this) {
if (mRingtone != null) { if (mRingtone != null) {
mRingtone.stop(); mRingtone.stop();
} }
} }
}
public void stop() { public void stop() {
if (mHandler == null) return; // already stopped if (mHandler == null) return; // already stopped
@@ -274,8 +287,10 @@ public class SeekBarVolumizer implements OnSeekBarChangeListener, Handler.Callba
} }
public boolean isSamplePlaying() { public boolean isSamplePlaying() {
synchronized (this) {
return mRingtone != null && mRingtone.isPlaying(); return mRingtone != null && mRingtone.isPlaying();
} }
}
public void startSample() { public void startSample() {
postStartSample(); postStartSample();