Fix bug (#1947162)
The bug (1947162) is caused by the fact that sometimes, surfaceChanged() is called after onCompletion().
In surfaceChanged(), start() is called automatically. The fix is to use a flag is avoid calling start()
when onCompletion() has been called already.
diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java
index 6d3a2d3..20dd8a6 100644
--- a/core/java/android/widget/VideoView.java
+++ b/core/java/android/widget/VideoView.java
@@ -55,6 +55,7 @@
private SurfaceHolder mSurfaceHolder = null;
private MediaPlayer mMediaPlayer = null;
private boolean mIsPrepared;
+ private boolean mIsPlaybackCompleted;
private int mVideoWidth;
private int mVideoHeight;
private int mSurfaceWidth;
@@ -260,7 +261,7 @@
mSeekWhenPrepared = 0;
}
if (mStartWhenPrepared) {
- mMediaPlayer.start();
+ start();
mStartWhenPrepared = false;
if (mMediaController != null) {
mMediaController.show();
@@ -281,7 +282,7 @@
mSeekWhenPrepared = 0;
}
if (mStartWhenPrepared) {
- mMediaPlayer.start();
+ start();
mStartWhenPrepared = false;
}
}
@@ -291,6 +292,7 @@
private MediaPlayer.OnCompletionListener mCompletionListener =
new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
+ mIsPlaybackCompleted = true;
if (mMediaController != null) {
mMediaController.hide();
}
@@ -405,7 +407,9 @@
mMediaPlayer.seekTo(mSeekWhenPrepared);
mSeekWhenPrepared = 0;
}
- mMediaPlayer.start();
+ if (!mIsPlaybackCompleted) {
+ start();
+ }
if (mMediaController != null) {
mMediaController.show();
}
@@ -490,6 +494,7 @@
}
public void start() {
+ mIsPlaybackCompleted = false;
if (mMediaPlayer != null && mIsPrepared) {
mMediaPlayer.start();
mStartWhenPrepared = false;