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

Commit 0bb5f094 authored by Yorke Lee's avatar Yorke Lee
Browse files

Fix some voicemail playback bugs

* Don't fetch voicemail until playback is started
* Prevent multiple voicemail fetches for the same voicemail
* Fixed an issue where the seekbar would be stuck in the same
position even after seeking
* Fix for playback position getting reset after the voicemail
view is scrolled out of view and back in
* Respect the invariant that if mMediaPlayer is null, mPrepared
is always false. This fixes potential NPEs when resuming playback.

Bug: 22127956
Bug: 22333494

Change-Id: I5c419424950c0e21317cbd133ca6f7e1edd9fd31
parent 4d6b0d46
Loading
Loading
Loading
Loading
+31 −23
Original line number Diff line number Diff line
@@ -75,14 +75,7 @@ public class VoicemailPlaybackLayout extends LinearLayout
        private final Object mLock = new Object();
        @GuardedBy("mLock") private ScheduledFuture<?> mScheduledFuture;

        public PositionUpdater(int durationMs, ScheduledExecutorService executorService) {
            mDurationMs = durationMs;
            mExecutorService = executorService;
        }

        @Override
        public void run() {
            post(new Runnable() {
        private Runnable mUpdateClipPositionRunnable = new Runnable() {
            @Override
            public void run() {
                int currentPositionMs = 0;
@@ -95,15 +88,21 @@ public class VoicemailPlaybackLayout extends LinearLayout
                }
                setClipPosition(currentPositionMs, mDurationMs);
            }
            });
        };

        public PositionUpdater(int durationMs, ScheduledExecutorService executorService) {
            mDurationMs = durationMs;
            mExecutorService = executorService;
        }

        @Override
        public void run() {
            post(mUpdateClipPositionRunnable);
        }

        public void startUpdating() {
            synchronized (mLock) {
                if (mScheduledFuture != null) {
                    mScheduledFuture.cancel(false);
                    mScheduledFuture = null;
                }
                cancelPendingRunnables();
                mScheduledFuture = mExecutorService.scheduleAtFixedRate(
                        this, 0, SLIDER_UPDATE_PERIOD_MILLIS, TimeUnit.MILLISECONDS);
            }
@@ -111,11 +110,16 @@ public class VoicemailPlaybackLayout extends LinearLayout

        public void stopUpdating() {
            synchronized (mLock) {
                cancelPendingRunnables();
            }
        }

        private void cancelPendingRunnables() {
            if (mScheduledFuture != null) {
                    mScheduledFuture.cancel(false);
                mScheduledFuture.cancel(true);
                mScheduledFuture = null;
            }
            }
            removeCallbacks(mUpdateClipPositionRunnable);
        }
    }

@@ -139,7 +143,7 @@ public class VoicemailPlaybackLayout extends LinearLayout

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            setClipPosition(seekBar.getProgress(), seekBar.getMax());
            setClipPosition(progress, seekBar.getMax());
        }
    };

@@ -246,6 +250,10 @@ public class VoicemailPlaybackLayout extends LinearLayout
            onSpeakerphoneOn(mPresenter.isSpeakerphoneOn());
        }

        if (mPositionUpdater != null) {
            mPositionUpdater.stopUpdating();
            mPositionUpdater = null;
        }
        mPositionUpdater = new PositionUpdater(duration, executorService);
        mPositionUpdater.startUpdating();
    }
+19 −3
Original line number Diff line number Diff line
@@ -207,6 +207,11 @@ public class VoicemailPlaybackPresenter
            mPosition = savedInstanceState.getInt(CLIP_POSITION_KEY, 0);
            mIsPlaying = savedInstanceState.getBoolean(IS_PLAYING_STATE_KEY, false);
        }

        if (mMediaPlayer == null) {
            mIsPrepared = false;
            mIsPlaying = false;
        }
    }

    /**
@@ -240,9 +245,14 @@ public class VoicemailPlaybackPresenter

            mVoicemailUri = voicemailUri;
            mDuration.set(0);
            mIsPlaying = startPlayingImmediately;

            if (startPlayingImmediately) {
                // Since setPlaybackView can get called during the view binding process, we don't
                // want to reset mIsPlaying to false if the user is currently playing the
                // voicemail and the view is rebound.
                mIsPlaying = startPlayingImmediately;
                checkForContent();
            }

            // Default to earpiece.
            mView.onSpeakerphoneOn(false);
@@ -284,6 +294,7 @@ public class VoicemailPlaybackPresenter
        if (mMediaPlayer != null) {
            mMediaPlayer.release();
            mMediaPlayer = null;
            mIsPrepared = false;
        }

        if (mActivity != null) {
@@ -489,6 +500,7 @@ public class VoicemailPlaybackPresenter
        mIsPrepared = true;

        mDuration.set(mMediaPlayer.getDuration());
        mPosition = mMediaPlayer.getCurrentPosition();

        mView.enableUiElements();
        Log.d(TAG, "onPrepared: mPosition=" + mPosition);
@@ -561,6 +573,10 @@ public class VoicemailPlaybackPresenter
     */
    public void resumePlayback() {
        if (!mIsPrepared) {
            // If we haven't downloaded the voicemail yet, attempt to download it.
            checkForContent();
            mIsPlaying = true;

            return;
        }

@@ -607,7 +623,7 @@ public class VoicemailPlaybackPresenter

        mIsPlaying = false;

        if (mMediaPlayer.isPlaying()) {
        if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
            mMediaPlayer.pause();
        }