From 6e5a43751bb71db042b574c12e8a576bec7bd326 Mon Sep 17 00:00:00 2001
From: Nathen
Date: Sat, 9 Jul 2016 16:23:21 +0800
Subject: [PATCH 1/8] handler replace runOnMainThread
---
.../jiecao/jcvideoplayer_lib/JCVideoPlayer.java | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java
index 7c64da08a..082768093 100644
--- a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java
+++ b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java
@@ -7,6 +7,7 @@
import android.graphics.SurfaceTexture;
import android.media.AudioManager;
import android.media.MediaPlayer;
+import android.os.Handler;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;
@@ -90,6 +91,8 @@ public abstract class JCVideoPlayer extends FrameLayout implements View.OnClickL
public static boolean WIFI_TIP_DIALOG_SHOWED = false;
+ protected Handler mHandler = new Handler();
+
public JCVideoPlayer(Context context) {
super(context);
init(context);
@@ -631,14 +634,12 @@ protected class ProgressTimerTask extends TimerTask {
@Override
public void run() {
if (mCurrentState == CURRENT_STATE_PLAYING || mCurrentState == CURRENT_STATE_PAUSE) {
- if (getContext() != null && getContext() instanceof Activity) {
- ((Activity) getContext()).runOnUiThread(new Runnable() {
- @Override
- public void run() {
- setTextAndProgress(0);
- }
- });
- }
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ setTextAndProgress(0);
+ }
+ });
}
}
}
From a0cf5d6b983bc33d9d83a778c41f508315b7b7d6 Mon Sep 17 00:00:00 2001
From: Nathen
Date: Sat, 9 Jul 2016 16:33:03 +0800
Subject: [PATCH 2/8] log for buffer update and progress
---
.../main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java
index 082768093..5dd87b57e 100644
--- a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java
+++ b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java
@@ -564,6 +564,7 @@ public void onCompletion() {
@Override
public void onBufferingUpdate(int percent) {
if (mCurrentState != CURRENT_STATE_NORMAL && mCurrentState != CURRENT_STATE_PREPAREING) {
+ Log.v(TAG, "onBufferingUpdate " + percent + " [" + this.hashCode() + "] ");
setTextAndProgress(percent);
}
}
@@ -634,6 +635,9 @@ protected class ProgressTimerTask extends TimerTask {
@Override
public void run() {
if (mCurrentState == CURRENT_STATE_PLAYING || mCurrentState == CURRENT_STATE_PAUSE) {
+ int position = getCurrentPositionWhenPlaying();
+ int duration = getDuration();
+ Log.v(TAG, "onProgressUpdate " + position + "/" + duration + " [" + this.hashCode() + "] ");
mHandler.post(new Runnable() {
@Override
public void run() {
From 5d5542821faff51b1bff38180a80d77ce5e7c379 Mon Sep 17 00:00:00 2001
From: Nathen
Date: Sat, 9 Jul 2016 19:32:53 +0800
Subject: [PATCH 3/8] update fresco demo
---
.../jiecaovideoplayer/LoadImageActivity.java | 2 +-
.../View/JCVideoPlayerStandardFresco.java | 434 +++++++++++++-----
.../jcvideoplayer_lib/JCVideoPlayer.java | 14 +-
.../JCVideoPlayerStandard.java | 8 +-
.../{JCUtils.java => Utils.java} | 2 +-
5 files changed, 335 insertions(+), 125 deletions(-)
rename jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/{JCUtils.java => Utils.java} (98%)
diff --git a/app/src/main/java/fm/jiecao/jiecaovideoplayer/LoadImageActivity.java b/app/src/main/java/fm/jiecao/jiecaovideoplayer/LoadImageActivity.java
index 1aa40984a..bd7ed0431 100644
--- a/app/src/main/java/fm/jiecao/jiecaovideoplayer/LoadImageActivity.java
+++ b/app/src/main/java/fm/jiecao/jiecaovideoplayer/LoadImageActivity.java
@@ -74,7 +74,7 @@ protected void onCreate(Bundle savedInstanceState) {
videoController5.setUp("http://2449.vod.myqcloud.com/2449_22ca37a6ea9011e5acaaf51d105342e3.f20.mp4",
"嫂子洗澡没");
Uri uri = Uri.parse("http://cos.myqcloud.com/1000264/qcloud_video_attachment/842646334/vod_cover/cover1458036374.jpg");
- videoController5.ivThumb.setImageURI(uri);
+ videoController5.thumbImageView.setImageURI(uri);
}
public class BitmapCache implements com.android.volley.toolbox.ImageLoader.ImageCache {
diff --git a/app/src/main/java/fm/jiecao/jiecaovideoplayer/View/JCVideoPlayerStandardFresco.java b/app/src/main/java/fm/jiecao/jiecaovideoplayer/View/JCVideoPlayerStandardFresco.java
index 55c1b0a2b..d1b672640 100644
--- a/app/src/main/java/fm/jiecao/jiecaovideoplayer/View/JCVideoPlayerStandardFresco.java
+++ b/app/src/main/java/fm/jiecao/jiecaovideoplayer/View/JCVideoPlayerStandardFresco.java
@@ -1,13 +1,21 @@
package fm.jiecao.jiecaovideoplayer.View;
import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.Dialog;
import android.content.Context;
+import android.content.DialogInterface;
+import android.text.TextUtils;
import android.util.AttributeSet;
+import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
+import android.view.Window;
+import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
+import android.widget.Toast;
import com.facebook.drawee.view.SimpleDraweeView;
@@ -16,6 +24,7 @@
import fm.jiecao.jcvideoplayer_lib.JCBuriedPointStandard;
import fm.jiecao.jcvideoplayer_lib.JCMediaManager;
+import fm.jiecao.jcvideoplayer_lib.Utils;
import fm.jiecao.jcvideoplayer_lib.JCVideoPlayer;
import fm.jiecao.jiecaovideoplayer.R;
@@ -25,14 +34,16 @@
*/
public class JCVideoPlayerStandardFresco extends JCVideoPlayer {
- protected ImageView ivBack;
- protected ProgressBar pbBottom, pbLoading;
- protected TextView tvTitle;
- public SimpleDraweeView ivThumb;
- protected ImageView ivCover;
+ public ImageView backButton;
+ public ProgressBar bottomProgressBar, loadingProgressBar;
+ public TextView titleTextView;
+ public SimpleDraweeView thumbImageView;
+ public ImageView coverImageView;
- private static Timer mDismissControlViewTimer;
- private static JCBuriedPointStandard jc_BuriedPointStandard;
+ protected static Timer DISSMISS_CONTROL_VIEW_TIMER;
+ protected DismissControlViewTimerTask mDismissControlViewTimerTask;
+
+ protected static JCBuriedPointStandard JC_BURIED_POINT_STANDARD;
public JCVideoPlayerStandardFresco(Context context) {
super(context);
@@ -45,27 +56,28 @@ public JCVideoPlayerStandardFresco(Context context, AttributeSet attrs) {
@Override
protected void init(Context context) {
super.init(context);
- pbBottom = (ProgressBar) findViewById(R.id.bottom_progressbar);
- tvTitle = (TextView) findViewById(R.id.title);
- ivBack = (ImageView) findViewById(R.id.back);
- ivThumb = (SimpleDraweeView) findViewById(R.id.thumb);
- ivCover = (ImageView) findViewById(R.id.cover);
- pbLoading = (ProgressBar) findViewById(R.id.loading);
+ bottomProgressBar = (ProgressBar) findViewById(R.id.bottom_progressbar);
+ titleTextView = (TextView) findViewById(R.id.title);
+ backButton = (ImageView) findViewById(R.id.back);
+ thumbImageView = (SimpleDraweeView) findViewById(R.id.thumb);
+ coverImageView = (ImageView) findViewById(R.id.cover);
+ loadingProgressBar = (ProgressBar) findViewById(R.id.loading);
- ivThumb.setOnClickListener(this);
- ivBack.setOnClickListener(this);
+ thumbImageView.setOnClickListener(this);
+ backButton.setOnClickListener(this);
}
@Override
public boolean setUp(String url, Object... objects) {
+ if (objects.length == 0) return false;
if (super.setUp(url, objects)) {
- tvTitle.setText(objects[0].toString());
+ titleTextView.setText(objects[0].toString());
if (mIfCurrentIsFullscreen) {
- fullscreenButton.setImageResource(R.drawable.jc_shrink);
+ fullscreenButton.setImageResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_shrink);
} else {
- fullscreenButton.setImageResource(R.drawable.jc_enlarge);
- ivBack.setVisibility(View.GONE);
+ fullscreenButton.setImageResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_enlarge);
+ backButton.setVisibility(View.GONE);
}
return true;
}
@@ -83,35 +95,63 @@ protected void setStateAndUi(int state) {
switch (mCurrentState) {
case CURRENT_STATE_NORMAL:
changeUiToNormal();
- cancelDismissControlViewTimer();
break;
case CURRENT_STATE_PREPAREING:
- changeUiToShowUiPrepareing();
+ changeUiToPrepareingShow();
startDismissControlViewTimer();
break;
case CURRENT_STATE_PLAYING:
- changeUiToShowUiPlaying();
+ changeUiToPlayingShow();
startDismissControlViewTimer();
break;
case CURRENT_STATE_PAUSE:
- changeUiToShowUiPause();
+ changeUiToPauseShow();
cancelDismissControlViewTimer();
break;
case CURRENT_STATE_ERROR:
changeUiToError();
break;
+ case CURRENT_STATE_AUTO_COMPLETE:
+ changeUiToCompleteShow();
+ cancelDismissControlViewTimer();
+ bottomProgressBar.setProgress(100);
+ break;
+ case CURRENT_STATE_PLAYING_BUFFERING_START:
+ changeUiToPlayingBufferingShow();
+ break;
}
}
@Override
public boolean onTouch(View v, MotionEvent event) {
- switch (event.getAction()) {
- case MotionEvent.ACTION_DOWN:
- cancelDismissControlViewTimer();
- break;
- case MotionEvent.ACTION_UP:
- startDismissControlViewTimer();
- break;
+ int id = v.getId();
+ if (id == R.id.surface_container) {
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ break;
+ case MotionEvent.ACTION_MOVE:
+ break;
+ case MotionEvent.ACTION_UP:
+ startDismissControlViewTimer();
+ if (mChangePosition) {
+ int duration = getDuration();
+ int progress = mSeekTimePosition * 100 / (duration == 0 ? 1 : duration);
+ bottomProgressBar.setProgress(progress);
+ }
+ if (!mChangePosition && !mChangeVolume) {
+ onClickUiToggle();
+ }
+ break;
+ }
+ } else if (id == R.id.progress) {
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ cancelDismissControlViewTimer();
+ break;
+ case MotionEvent.ACTION_UP:
+ startDismissControlViewTimer();
+ break;
+ }
}
return super.onTouch(v, event);
}
@@ -121,46 +161,87 @@ public void onClick(View v) {
super.onClick(v);
int i = v.getId();
if (i == R.id.thumb) {
+ if (TextUtils.isEmpty(mUrl)) {
+ Toast.makeText(getContext(), getResources().getString(fm.jiecao.jcvideoplayer_lib.R.string.no_url), Toast.LENGTH_SHORT).show();
+ return;
+ }
if (mCurrentState == CURRENT_STATE_NORMAL) {
- if (jc_BuriedPointStandard != null) {
- jc_BuriedPointStandard.onClickStartThumb(mUrl, mObjects);
+ if (!Utils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
+ builder.setMessage(getResources().getString(fm.jiecao.jcvideoplayer_lib.R.string.tips_not_wifi));
+ builder.setPositiveButton(getResources().getString(fm.jiecao.jcvideoplayer_lib.R.string.tips_not_wifi_confirm), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ startPlayLocic();
+ WIFI_TIP_DIALOG_SHOWED = true;
+ }
+ });
+ builder.setNegativeButton(getResources().getString(fm.jiecao.jcvideoplayer_lib.R.string.tips_not_wifi_cancel), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ });
+ builder.create().show();
+ return;
}
- prepareVideo();
- startDismissControlViewTimer();
+ startPlayLocic();
+ } else if (mCurrentState == CURRENT_STATE_AUTO_COMPLETE) {
+ onClickUiToggle();
}
} else if (i == R.id.surface_container) {
- if (jc_BuriedPointStandard != null && JCMediaManager.instance().listener == this) {
+ if (JC_BURIED_POINT_STANDARD != null && JCMediaManager.instance().listener == this) {
if (mIfCurrentIsFullscreen) {
- jc_BuriedPointStandard.onClickBlankFullscreen(mUrl, mObjects);
+ JC_BURIED_POINT_STANDARD.onClickBlankFullscreen(mUrl, mObjects);
} else {
- jc_BuriedPointStandard.onClickBlank(mUrl, mObjects);
+ JC_BURIED_POINT_STANDARD.onClickBlank(mUrl, mObjects);
}
}
- onClickUiToggle();
startDismissControlViewTimer();
} else if (i == R.id.back) {
backFullscreen();
}
}
+ private void startPlayLocic() {
+ if (JC_BURIED_POINT_STANDARD != null) {
+ JC_BURIED_POINT_STANDARD.onClickStartThumb(mUrl, mObjects);
+ }
+ prepareVideo();
+ startDismissControlViewTimer();
+ }
+
private void onClickUiToggle() {
if (mCurrentState == CURRENT_STATE_PREPAREING) {
if (bottomContainer.getVisibility() == View.VISIBLE) {
- changeUiToClearUiPrepareing();
+ changeUiToPrepareingClear();
} else {
- changeUiToShowUiPrepareing();
+ changeUiToPrepareingShow();
}
} else if (mCurrentState == CURRENT_STATE_PLAYING) {
if (bottomContainer.getVisibility() == View.VISIBLE) {
- changeUiToClearUiPlaying();
+ changeUiToPlayingClear();
} else {
- changeUiToShowUiPlaying();
+ changeUiToPlayingShow();
}
} else if (mCurrentState == CURRENT_STATE_PAUSE) {
if (bottomContainer.getVisibility() == View.VISIBLE) {
- changeUiToClearUiPause();
+ changeUiToPauseClear();
} else {
- changeUiToShowUiPause();
+ changeUiToPauseShow();
+ }
+ } else if (mCurrentState == CURRENT_STATE_AUTO_COMPLETE) {
+ if (bottomContainer.getVisibility() == View.VISIBLE) {
+ changeUiToCompleteClear();
+ } else {
+ changeUiToCompleteShow();
+ }
+ } else if (mCurrentState == CURRENT_STATE_PLAYING_BUFFERING_START) {
+ if (bottomContainer.getVisibility() == View.VISIBLE) {
+ changeUiToPlayingBufferingClear();
+ } else {
+ changeUiToPlayingBufferingShow();
}
}
}
@@ -168,15 +249,15 @@ private void onClickUiToggle() {
@Override
protected void setProgressAndTime(int progress, int secProgress, int currentTime, int totalTime) {
super.setProgressAndTime(progress, secProgress, currentTime, totalTime);
- if (progress != 0) pbBottom.setProgress(progress);
- if (secProgress != 0) pbBottom.setSecondaryProgress(secProgress);
+ if (progress != 0) bottomProgressBar.setProgress(progress);
+ if (secProgress != 0) bottomProgressBar.setSecondaryProgress(secProgress);
}
@Override
protected void resetProgressAndTime() {
super.resetProgressAndTime();
- pbBottom.setProgress(0);
- pbBottom.setSecondaryProgress(0);
+ bottomProgressBar.setProgress(0);
+ bottomProgressBar.setSecondaryProgress(0);
}
//Unified management Ui
@@ -184,129 +265,264 @@ private void changeUiToNormal() {
topContainer.setVisibility(View.VISIBLE);
bottomContainer.setVisibility(View.INVISIBLE);
startButton.setVisibility(View.VISIBLE);
- pbLoading.setVisibility(View.INVISIBLE);
- ivThumb.setVisibility(View.VISIBLE);
- ivCover.setVisibility(View.VISIBLE);
- pbBottom.setVisibility(View.INVISIBLE);
+ loadingProgressBar.setVisibility(View.INVISIBLE);
+ thumbImageView.setVisibility(View.VISIBLE);
+ coverImageView.setVisibility(View.VISIBLE);
+ bottomProgressBar.setVisibility(View.INVISIBLE);
updateStartImage();
}
- private void changeUiToShowUiPrepareing() {
+ private void changeUiToPrepareingShow() {
topContainer.setVisibility(View.VISIBLE);
bottomContainer.setVisibility(View.VISIBLE);
startButton.setVisibility(View.INVISIBLE);
- pbLoading.setVisibility(View.VISIBLE);
- ivThumb.setVisibility(View.INVISIBLE);
- ivCover.setVisibility(View.VISIBLE);
- pbBottom.setVisibility(View.INVISIBLE);
+ loadingProgressBar.setVisibility(View.VISIBLE);
+ thumbImageView.setVisibility(View.INVISIBLE);
+ coverImageView.setVisibility(View.VISIBLE);
+ bottomProgressBar.setVisibility(View.INVISIBLE);
}
- private void changeUiToClearUiPrepareing() {
-// changeUiToClearUi();
+ private void changeUiToPrepareingClear() {
topContainer.setVisibility(View.INVISIBLE);
bottomContainer.setVisibility(View.INVISIBLE);
startButton.setVisibility(View.INVISIBLE);
- ivThumb.setVisibility(View.INVISIBLE);
- pbBottom.setVisibility(View.INVISIBLE);
-// loadingProgressBar.setVisibility(View.VISIBLE);
- ivCover.setVisibility(View.VISIBLE);
+ thumbImageView.setVisibility(View.INVISIBLE);
+ bottomProgressBar.setVisibility(View.INVISIBLE);
+ coverImageView.setVisibility(View.VISIBLE);
}
- private void changeUiToShowUiPlaying() {
+ private void changeUiToPlayingShow() {
topContainer.setVisibility(View.VISIBLE);
bottomContainer.setVisibility(View.VISIBLE);
startButton.setVisibility(View.VISIBLE);
- pbLoading.setVisibility(View.INVISIBLE);
- ivThumb.setVisibility(View.INVISIBLE);
- ivCover.setVisibility(View.INVISIBLE);
- pbBottom.setVisibility(View.INVISIBLE);
+ loadingProgressBar.setVisibility(View.INVISIBLE);
+ thumbImageView.setVisibility(View.INVISIBLE);
+ coverImageView.setVisibility(View.INVISIBLE);
+ bottomProgressBar.setVisibility(View.INVISIBLE);
updateStartImage();
}
- private void changeUiToClearUiPlaying() {
- changeUiToClearUi();
- pbBottom.setVisibility(View.VISIBLE);
+ private void changeUiToPlayingClear() {
+ changeUiToClear();
+ bottomProgressBar.setVisibility(View.VISIBLE);
}
- private void changeUiToShowUiPause() {
+ private void changeUiToPauseShow() {
topContainer.setVisibility(View.VISIBLE);
bottomContainer.setVisibility(View.VISIBLE);
startButton.setVisibility(View.VISIBLE);
- pbLoading.setVisibility(View.INVISIBLE);
- ivThumb.setVisibility(View.INVISIBLE);
- ivCover.setVisibility(View.INVISIBLE);
- pbBottom.setVisibility(View.INVISIBLE);
+ loadingProgressBar.setVisibility(View.INVISIBLE);
+ thumbImageView.setVisibility(View.INVISIBLE);
+ coverImageView.setVisibility(View.INVISIBLE);
+ bottomProgressBar.setVisibility(View.INVISIBLE);
updateStartImage();
}
- private void changeUiToClearUiPause() {
- changeUiToClearUi();
- pbBottom.setVisibility(View.VISIBLE);
+ private void changeUiToPauseClear() {
+ changeUiToClear();
+ bottomProgressBar.setVisibility(View.VISIBLE);
+ }
+
+ private void changeUiToPlayingBufferingShow() {
+ topContainer.setVisibility(View.VISIBLE);
+ bottomContainer.setVisibility(View.VISIBLE);
+ startButton.setVisibility(View.INVISIBLE);
+ loadingProgressBar.setVisibility(View.VISIBLE);
+ thumbImageView.setVisibility(View.INVISIBLE);
+ coverImageView.setVisibility(View.INVISIBLE);
+ bottomProgressBar.setVisibility(View.INVISIBLE);
+ }
+
+ private void changeUiToPlayingBufferingClear() {
+ topContainer.setVisibility(View.INVISIBLE);
+ bottomContainer.setVisibility(View.INVISIBLE);
+ startButton.setVisibility(View.INVISIBLE);
+ loadingProgressBar.setVisibility(View.VISIBLE);
+ thumbImageView.setVisibility(View.INVISIBLE);
+ coverImageView.setVisibility(View.INVISIBLE);
+ bottomProgressBar.setVisibility(View.VISIBLE);
+ updateStartImage();
}
- private void changeUiToClearUi() {
+ private void changeUiToClear() {
topContainer.setVisibility(View.INVISIBLE);
bottomContainer.setVisibility(View.INVISIBLE);
startButton.setVisibility(View.INVISIBLE);
- pbLoading.setVisibility(View.INVISIBLE);
- ivThumb.setVisibility(View.INVISIBLE);
- ivCover.setVisibility(View.INVISIBLE);
- pbBottom.setVisibility(View.INVISIBLE);
+ loadingProgressBar.setVisibility(View.INVISIBLE);
+ thumbImageView.setVisibility(View.INVISIBLE);
+ coverImageView.setVisibility(View.INVISIBLE);
+ bottomProgressBar.setVisibility(View.INVISIBLE);
+ }
+
+ private void changeUiToCompleteShow() {
+ topContainer.setVisibility(View.VISIBLE);
+ bottomContainer.setVisibility(View.VISIBLE);
+ startButton.setVisibility(View.VISIBLE);
+ loadingProgressBar.setVisibility(View.INVISIBLE);
+ thumbImageView.setVisibility(View.VISIBLE);
+ coverImageView.setVisibility(View.INVISIBLE);
+ bottomProgressBar.setVisibility(View.INVISIBLE);
+ updateStartImage();
+ }
+
+ private void changeUiToCompleteClear() {
+ topContainer.setVisibility(View.INVISIBLE);
+ bottomContainer.setVisibility(View.INVISIBLE);
+ startButton.setVisibility(View.VISIBLE);
+ loadingProgressBar.setVisibility(View.INVISIBLE);
+ thumbImageView.setVisibility(View.VISIBLE);
+ coverImageView.setVisibility(View.INVISIBLE);
+ bottomProgressBar.setVisibility(View.VISIBLE);
+ updateStartImage();
}
private void changeUiToError() {
topContainer.setVisibility(View.INVISIBLE);
bottomContainer.setVisibility(View.INVISIBLE);
startButton.setVisibility(View.VISIBLE);
- pbLoading.setVisibility(View.INVISIBLE);
- ivThumb.setVisibility(View.INVISIBLE);
- ivCover.setVisibility(View.VISIBLE);
- pbBottom.setVisibility(View.INVISIBLE);
+ loadingProgressBar.setVisibility(View.INVISIBLE);
+ thumbImageView.setVisibility(View.INVISIBLE);
+ coverImageView.setVisibility(View.VISIBLE);
+ bottomProgressBar.setVisibility(View.INVISIBLE);
updateStartImage();
}
private void updateStartImage() {
if (mCurrentState == CURRENT_STATE_PLAYING) {
- startButton.setImageResource(R.drawable.jc_click_pause_selector);
+ startButton.setImageResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_click_pause_selector);
} else if (mCurrentState == CURRENT_STATE_ERROR) {
- startButton.setImageResource(R.drawable.jc_click_error_selector);
+ startButton.setImageResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_click_error_selector);
+ } else {
+ startButton.setImageResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_click_play_selector);
+ }
+ }
+
+ protected Dialog mProgressDialog;
+ protected ProgressBar mDialogProgressBar;
+ protected TextView mDialogSeekTime;
+ protected TextView mDialogTotalTime;
+ protected ImageView mDialogIcon;
+
+ @Override
+ protected void showProgressDialog(float deltaX, String seekTime, int seekTimePosition, String totalTime, int totalTimeDuration) {
+ super.showProgressDialog(deltaX, seekTime, seekTimePosition, totalTime, totalTimeDuration);
+ if (mProgressDialog == null) {
+ View localView = LayoutInflater.from(getContext()).inflate(fm.jiecao.jcvideoplayer_lib.R.layout.jc_progress_dialog, null);
+ mDialogProgressBar = ((ProgressBar) localView.findViewById(R.id.duration_progressbar));
+ mDialogSeekTime = ((TextView) localView.findViewById(R.id.tv_current));
+ mDialogTotalTime = ((TextView) localView.findViewById(R.id.tv_duration));
+ mDialogIcon = ((ImageView) localView.findViewById(R.id.duration_image_tip));
+ mProgressDialog = new Dialog(getContext(), fm.jiecao.jcvideoplayer_lib.R.style.jc_style_dialog_progress);
+ mProgressDialog.setContentView(localView);
+ mProgressDialog.getWindow().addFlags(Window.FEATURE_ACTION_BAR);
+ mProgressDialog.getWindow().addFlags(32);
+ mProgressDialog.getWindow().addFlags(16);
+ mProgressDialog.getWindow().setLayout(-2, -2);
+ WindowManager.LayoutParams localLayoutParams = mProgressDialog.getWindow().getAttributes();
+ localLayoutParams.gravity = 49;
+ localLayoutParams.y = getResources().getDimensionPixelOffset(fm.jiecao.jcvideoplayer_lib.R.dimen.jc_progress_dialog_margin_top);
+ mProgressDialog.getWindow().setAttributes(localLayoutParams);
+ }
+ if (!mProgressDialog.isShowing()) {
+ mProgressDialog.show();
+ }
+
+ mDialogSeekTime.setText(seekTime);
+ mDialogTotalTime.setText(" / " + totalTime);
+ mDialogProgressBar.setProgress(seekTimePosition * 100 / totalTimeDuration);
+ if (deltaX > 0) {
+ mDialogIcon.setBackgroundResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_forward_icon);
} else {
- startButton.setImageResource(R.drawable.jc_click_play_selector);
+ mDialogIcon.setBackgroundResource(fm.jiecao.jcvideoplayer_lib.R.drawable.jc_backward_icon);
+ }
+
+ }
+
+ @Override
+ protected void dismissProgressDialog() {
+ super.dismissProgressDialog();
+ if (mProgressDialog != null) {
+ mProgressDialog.dismiss();
+ }
+ }
+
+
+ protected Dialog mVolumeDialog;
+ protected ProgressBar mDialogVolumeProgressBar;
+
+ @Override
+ protected void showVolumDialog(float deltaY, int volumePercent) {
+ super.showVolumDialog(deltaY, volumePercent);
+ if (mVolumeDialog == null) {
+ View localView = LayoutInflater.from(getContext()).inflate(fm.jiecao.jcvideoplayer_lib.R.layout.jc_volume_dialog, null);
+ mDialogVolumeProgressBar = ((ProgressBar) localView.findViewById(R.id.volume_progressbar));
+ mVolumeDialog = new Dialog(getContext(), fm.jiecao.jcvideoplayer_lib.R.style.jc_style_dialog_progress);
+ mVolumeDialog.setContentView(localView);
+ mVolumeDialog.getWindow().addFlags(8);
+ mVolumeDialog.getWindow().addFlags(32);
+ mVolumeDialog.getWindow().addFlags(16);
+ mVolumeDialog.getWindow().setLayout(-2, -2);
+ WindowManager.LayoutParams localLayoutParams = mVolumeDialog.getWindow().getAttributes();
+ localLayoutParams.gravity = 19;
+ localLayoutParams.x = getContext().getResources().getDimensionPixelOffset(fm.jiecao.jcvideoplayer_lib.R.dimen.jc_volume_dialog_margin_left);
+ mVolumeDialog.getWindow().setAttributes(localLayoutParams);
+ }
+ if (!mVolumeDialog.isShowing()) {
+ mVolumeDialog.show();
+ }
+
+ mDialogVolumeProgressBar.setProgress(volumePercent);
+ }
+
+ @Override
+ protected void dismissVolumDialog() {
+ super.dismissVolumDialog();
+ if (mVolumeDialog != null) {
+ mVolumeDialog.dismiss();
}
}
private void startDismissControlViewTimer() {
cancelDismissControlViewTimer();
- mDismissControlViewTimer = new Timer();
- mDismissControlViewTimer.schedule(new TimerTask() {
- @Override
- public void run() {
+ DISSMISS_CONTROL_VIEW_TIMER = new Timer();
+ mDismissControlViewTimerTask = new DismissControlViewTimerTask();
+ DISSMISS_CONTROL_VIEW_TIMER.schedule(mDismissControlViewTimerTask, 2500);
+ }
+
+ private void cancelDismissControlViewTimer() {
+ if (DISSMISS_CONTROL_VIEW_TIMER != null) {
+ DISSMISS_CONTROL_VIEW_TIMER.cancel();
+ }
+ if (mDismissControlViewTimerTask != null) {
+ mDismissControlViewTimerTask.cancel();
+ }
+
+ }
+
+ protected class DismissControlViewTimerTask extends TimerTask {
+
+ @Override
+ public void run() {
+ if (mCurrentState != CURRENT_STATE_NORMAL
+ && mCurrentState != CURRENT_STATE_ERROR
+ && mCurrentState != CURRENT_STATE_AUTO_COMPLETE) {
if (getContext() != null && getContext() instanceof Activity) {
((Activity) getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
- if (mCurrentState != CURRENT_STATE_NORMAL
- && mCurrentState != CURRENT_STATE_ERROR) {
- bottomContainer.setVisibility(View.INVISIBLE);
- topContainer.setVisibility(View.INVISIBLE);
- pbBottom.setVisibility(View.VISIBLE);
- startButton.setVisibility(View.INVISIBLE);
- }
+ bottomContainer.setVisibility(View.INVISIBLE);
+ topContainer.setVisibility(View.INVISIBLE);
+ bottomProgressBar.setVisibility(View.VISIBLE);
+ startButton.setVisibility(View.INVISIBLE);
}
});
}
}
- }, 2500);
- }
-
- private void cancelDismissControlViewTimer() {
- if (mDismissControlViewTimer != null) {
- mDismissControlViewTimer.cancel();
}
}
public static void setJcBuriedPointStandard(JCBuriedPointStandard jcBuriedPointStandard) {
- jc_BuriedPointStandard = jcBuriedPointStandard;
+ JC_BURIED_POINT_STANDARD = jcBuriedPointStandard;
JCVideoPlayer.setJcBuriedPoint(jcBuriedPointStandard);
}
diff --git a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java
index 5dd87b57e..253b935ca 100644
--- a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java
+++ b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayer.java
@@ -199,7 +199,7 @@ public void onClick(View v) {
return;
}
if (mCurrentState == CURRENT_STATE_NORMAL || mCurrentState == CURRENT_STATE_ERROR) {
- if (!JCUtils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) {
+ if (!Utils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setMessage(getResources().getString(R.string.tips_not_wifi));
builder.setPositiveButton(getResources().getString(R.string.tips_not_wifi_confirm), new DialogInterface.OnClickListener() {
@@ -401,8 +401,8 @@ public boolean onTouch(View v, MotionEvent event) {
mSeekTimePosition = (int) (mDownPosition + deltaX * totalTimeDuration / mScreenWidth);
if (mSeekTimePosition > totalTimeDuration)
mSeekTimePosition = totalTimeDuration;
- String seekTime = JCUtils.stringForTime(mSeekTimePosition);
- String totalTime = JCUtils.stringForTime(totalTimeDuration);
+ String seekTime = Utils.stringForTime(mSeekTimePosition);
+ String totalTime = Utils.stringForTime(totalTimeDuration);
showProgressDialog(deltaX, seekTime, mSeekTimePosition, totalTime, totalTimeDuration);
}
@@ -685,15 +685,15 @@ protected void setProgressAndTime(int progress, int secProgress, int currentTime
if (progress != 0) progressBar.setProgress(progress);
}
if (secProgress != 0) progressBar.setSecondaryProgress(secProgress);
- currentTimeTextView.setText(JCUtils.stringForTime(currentTime));
- totalTimeTextView.setText(JCUtils.stringForTime(totalTime));
+ currentTimeTextView.setText(Utils.stringForTime(currentTime));
+ totalTimeTextView.setText(Utils.stringForTime(totalTime));
}
protected void resetProgressAndTime() {
progressBar.setProgress(0);
progressBar.setSecondaryProgress(0);
- currentTimeTextView.setText(JCUtils.stringForTime(0));
- totalTimeTextView.setText(JCUtils.stringForTime(0));
+ currentTimeTextView.setText(Utils.stringForTime(0));
+ totalTimeTextView.setText(Utils.stringForTime(0));
}
protected void quitFullScreenGoToNormal() {
diff --git a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayerStandard.java b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayerStandard.java
index ea9658f1d..af1ccdeb3 100644
--- a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayerStandard.java
+++ b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCVideoPlayerStandard.java
@@ -158,7 +158,7 @@ public void onClick(View v) {
return;
}
if (mCurrentState == CURRENT_STATE_NORMAL) {
- if (!JCUtils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) {
+ if (!Utils.isWifiConnected(getContext()) && !WIFI_TIP_DIALOG_SHOWED) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setMessage(getResources().getString(R.string.tips_not_wifi));
builder.setPositiveButton(getResources().getString(R.string.tips_not_wifi_confirm), new DialogInterface.OnClickListener() {
@@ -518,10 +518,4 @@ public static void setJcBuriedPointStandard(JCBuriedPointStandard jcBuriedPointS
JCVideoPlayer.setJcBuriedPoint(jcBuriedPointStandard);
}
-// @Override
-// public void onCompletion() {
-// super.onCompletion();
-// cancelDismissControlViewTimer();
-// }
-
}
diff --git a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCUtils.java b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/Utils.java
similarity index 98%
rename from jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCUtils.java
rename to jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/Utils.java
index b3b1e2f1f..94c8bdbea 100644
--- a/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/JCUtils.java
+++ b/jcvideoplayer-lib/src/main/java/fm/jiecao/jcvideoplayer_lib/Utils.java
@@ -11,7 +11,7 @@
* Created by Nathen
* On 2016/02/21 12:25
*/
-class JCUtils {
+public class Utils {
public static String stringForTime(int timeMs) {
if (timeMs <= 0 || timeMs >= 24 * 60 * 60 * 1000) {
From 1ed2b32217a73a0ba79e877eaf5c8f164c1f0e1b Mon Sep 17 00:00:00 2001
From: Nathen
Date: Sat, 9 Jul 2016 22:07:51 +0800
Subject: [PATCH 4/8] q group
---
README-ZH.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README-ZH.md b/README-ZH.md
index ef42b3dc4..07f6c274d 100644
--- a/README-ZH.md
+++ b/README-ZH.md
@@ -7,7 +7,7 @@
-真正实现Android的全屏功能,立志成为Android平台使用最广泛的视频播放控件
+真正实现Android的全屏功能,立志成为Android平台使用最广泛的视频播放控件 Q群:490442439
##主要特点
1. 全屏时启动新`Activity`实现播放器真正的全屏功能
From 5e1ce36c5039b85edba69ee044efe04e951c1b1f Mon Sep 17 00:00:00 2001
From: Nathen
Date: Sat, 9 Jul 2016 22:14:06 +0800
Subject: [PATCH 5/8] some target
---
README-ZH.md | 2 ++
README.md | 4 +++-
2 files changed, 5 insertions(+), 1 deletion(-)
diff --git a/README-ZH.md b/README-ZH.md
index 07f6c274d..c07543e3d 100644
--- a/README-ZH.md
+++ b/README-ZH.md
@@ -9,6 +9,8 @@
真正实现Android的全屏功能,立志成为Android平台使用最广泛的视频播放控件 Q群:490442439
+正在全力研究 头条视频 和 天天快报 那样的用android.media.MediaPlayer小窗播放的功能,重点是在切换SurfaceView的时候或removeView的时候视频能连续播放.
+
##主要特点
1. 全屏时启动新`Activity`实现播放器真正的全屏功能
2. 可以完全自定义UI
diff --git a/README.md b/README.md
index dbf1e39f8..04506ca0d 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,9 @@
This project need translators, mother language is english, you can change everything edit readme, release note, formate variable and annotation.
-Android truly full-screen capabilities, the Android platform to become the most widely used video playback controls
+Android truly full-screen capabilities, the Android platform to become the most widely used video playback controls. Q Group:490442439
+
+
[中文文档](README-ZH.md)
From eb92f1c0154a2d1d496d2dc73a283c8da2a2b42b Mon Sep 17 00:00:00 2001
From: Nathen
Date: Sat, 9 Jul 2016 22:17:13 +0800
Subject: [PATCH 6/8] target
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 04506ca0d..a1333b9d2 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@ This project need translators, mother language is english, you can change everyt
Android truly full-screen capabilities, the Android platform to become the most widely used video playback controls. Q Group:490442439
-
+Now the research target is android.media.MediaPlayer setSurface by more surfaces the video is always continuous.
[中文文档](README-ZH.md)
From 220fcc9f7973e62294e8c3ee6ea184bee5c8fa67 Mon Sep 17 00:00:00 2001
From: Nathen
Date: Sat, 9 Jul 2016 22:23:11 +0800
Subject: [PATCH 7/8] readme
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index a1333b9d2..b175e1407 100644
--- a/README.md
+++ b/README.md
@@ -7,11 +7,11 @@
-This project need translators, mother language is english, you can change everything edit readme, release note, formate variable and annotation.
+* This project need translators, mother language is english, you can change everything edit readme, release note, formate variable and annotation.
+* Now the research target is android.media.MediaPlayer setSurface by more surfaces the video is always continuous.
Android truly full-screen capabilities, the Android platform to become the most widely used video playback controls. Q Group:490442439
-Now the research target is android.media.MediaPlayer setSurface by more surfaces the video is always continuous.
[中文文档](README-ZH.md)
From c3397fb6c3af21cea62bcd1ddf522b0c94772300 Mon Sep 17 00:00:00 2001
From: Nathen
Date: Sun, 10 Jul 2016 16:29:36 +0800
Subject: [PATCH 8/8] v3.6.3
---
README-ZH.md | 14 +++++++-------
README.md | 12 ++++++------
app/build.gradle | 4 ++--
downloads/jiecaovideoplayer-3.6.2-javadoc.jar | Bin 92000 -> 0 bytes
downloads/jiecaovideoplayer-3.6.2-sources.jar | Bin 17197 -> 0 bytes
downloads/jiecaovideoplayer-3.6.2.aar | Bin 73697 -> 0 bytes
...o.apk => jiecaovideoplayer-3.6.3-demo.apk} | Bin 4655765 -> 4656404 bytes
downloads/jiecaovideoplayer-3.6.3-javadoc.jar | Bin 0 -> 94838 bytes
downloads/jiecaovideoplayer-3.6.3-sources.jar | Bin 0 -> 17201 bytes
downloads/jiecaovideoplayer-3.6.3.aar | Bin 0 -> 74054 bytes
gradle/maven_push.gradle | 2 +-
jcvideoplayer-lib/build.gradle | 4 ++--
12 files changed, 18 insertions(+), 18 deletions(-)
delete mode 100644 downloads/jiecaovideoplayer-3.6.2-javadoc.jar
delete mode 100644 downloads/jiecaovideoplayer-3.6.2-sources.jar
delete mode 100644 downloads/jiecaovideoplayer-3.6.2.aar
rename downloads/{jiecaovideoplayer-3.6.2-demo.apk => jiecaovideoplayer-3.6.3-demo.apk} (72%)
create mode 100644 downloads/jiecaovideoplayer-3.6.3-javadoc.jar
create mode 100644 downloads/jiecaovideoplayer-3.6.3-sources.jar
create mode 100644 downloads/jiecaovideoplayer-3.6.3.aar
diff --git a/README-ZH.md b/README-ZH.md
index c07543e3d..cc4a2806f 100644
--- a/README-ZH.md
+++ b/README-ZH.md
@@ -2,7 +2,7 @@
--
-
+
@@ -24,28 +24,28 @@
##效果
-**[jiecaovideoplayer-3.6.2-demo.apk](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2-demo.apk)**
+**[jiecaovideoplayer-3.6.3-demo.apk](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3-demo.apk)**
![Demo Screenshot][1]
##使用
1.添加类库
```gradle
-compile 'fm.jiecao:jiecaovideoplayer:3.6.2'
+compile 'fm.jiecao:jiecaovideoplayer:3.6.3'
```
或直接下载
-* [jiecaovideoplayer-3.6.2.aar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2.aar)
-* [jiecaovideoplayer-3.6.2-javadoc.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2-javadoc.jar)
-* [jiecaovideoplayer-3.6.2-sources.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2-sources.jar)
+* [jiecaovideoplayer-3.6.3.aar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3.aar)
+* [jiecaovideoplayer-3.6.3-javadoc.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3-javadoc.jar)
+* [jiecaovideoplayer-3.6.3-sources.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3-sources.jar)
2.添加布局
```xml
+ android:lay3.6.3out_height="200dp"/>
```
3.设置视频地址、缩略图地址、标题
diff --git a/README.md b/README.md
index b175e1407..c1310b1b2 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
--
-
+
@@ -28,21 +28,21 @@ Android truly full-screen capabilities, the Android platform to become the most
## Effect
-**[jiecaovideoplayer-3.6.2-demo.apk](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2-demo.apk)**
+**[jiecaovideoplayer-3.6.3-demo.apk](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3-demo.apk)**
![Demo Screenshot][1]
## Usage
1.Import library
```gradle
-compile 'fm.jiecao:jiecaovideoplayer:3.6.2'
+compile 'fm.jiecao:jiecaovideoplayer:3.6.3'
```
Or download lib
-* [jiecaovideoplayer-3.6.2.aar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2.aar)
-* [jiecaovideoplayer-3.6.2-javadoc.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2-javadoc.jar)
-* [jiecaovideoplayer-3.6.2-sources.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.2-sources.jar)
+* [jiecaovideoplayer-3.6.3.aar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3.aar)
+* [jiecaovideoplayer-3.6.3-javadoc.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3-javadoc.jar)
+* [jiecaovideoplayer-3.6.3-sources.jar](https://raw.githubusercontent.com/lipangit/jiecaovideoplayer/develop/downloads/jiecaovideoplayer-3.6.3-sources.jar)
2.Add JCVideoPlayer in your layout
```xml
diff --git a/app/build.gradle b/app/build.gradle
index f1b343a47..f10cb18e3 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -8,8 +8,8 @@ android {
applicationId "fm.jiecao.jiecaovideoplayer"
minSdkVersion 16
targetSdkVersion 23
- versionCode 30
- versionName "3.6.2"
+ versionCode 31
+ versionName "3.6.3"
}
buildTypes {
release {
diff --git a/downloads/jiecaovideoplayer-3.6.2-javadoc.jar b/downloads/jiecaovideoplayer-3.6.2-javadoc.jar
deleted file mode 100644
index 9e6dfb7ea58a57dd38c89a24226069fc80891dcb..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 92000
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≧BJ
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