Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 54f4a630 authored by Sudheer Shanka's avatar Sudheer Shanka Committed by Android (Google) Code Review
Browse files

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

parents f18d70ba 33194351
Loading
Loading
Loading
Loading
+31 −16
Original line number Original line Diff line number Diff line
@@ -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();