/*
* Copyright (C) 2012 YIXIA.COM
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.vanco.abplayer.view;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import com.vanco.abplayer.R;
import com.vanco.abplayer.util.DeviceUtils;
import com.vanco.abplayer.util.FractionalTouchDelegate;
import com.vanco.abplayer.util.Logger;
import com.vanco.abplayer.util.StringUtils;
import com.vanco.abplayer.util.ToastUtils;
import com.vanco.abplayer.view.CommonGestures.TouchListener;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Rect;
import android.graphics.RectF;
import android.media.AudioManager;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
public class MediaController extends FrameLayout {
private MediaPlayerControl mPlayer;
private Activity mContext;
private PopupWindow mWindow;
private View mAnchor;
private View mRoot;
private ImageButton mLock;
private ImageButton mScreenToggle;
private ImageButton mSnapshot;
private SeekBar mProgress;
private TextView mEndTime, mCurrentTime;
private long mDuration;
private boolean mShowing;
private boolean mScreenLocked = false;
private boolean mDragging;
private boolean mInstantSeeking = true;
private static final int DEFAULT_TIME_OUT = 3000;
private static final int DEFAULT_LONG_TIME_SHOW = 120000;
private static final int DEFAULT_SEEKBAR_VALUE = 1000;
private static final int TIME_TICK_INTERVAL = 1000;
private ImageButton mPauseButton;
private View mMediaController;
private View mControlsLayout;
private View mSystemInfoLayout;
private View mControlsButtons;
private View mMenu;
private TextView mDateTime;
private TextView mDownloadRate;
private TextView mFileName;
private TextView mBatteryLevel;
private TextView mOperationInfo;
private View mOperationVolLum;
private ImageView mVolLumNum;
private ImageView mVolLumBg;
private AudioManager mAM;
private int mMaxVolume;
private float mBrightness = 0.01f;
private int mVolume = 0;
private Handler mHandler;
private Animation mAnimSlideInTop;
private Animation mAnimSlideInBottom;
private Animation mAnimSlideOutTop;
private Animation mAnimSlideOutBottom;
private CommonGestures mGestures;
private int mVideoMode;
private ImageButton mDanmakuSend;
private ImageButton mDanmakuSwitch;
private boolean mDanmakuShow = true;
public MediaController(Context context) {
super(context);
mContext = (Activity) context;
initFloatingWindow();
initResources();
}
public void setDanmakuVisible(boolean isVisible){
if(isVisible){
mDanmakuSend.setVisibility(View.VISIBLE);
mDanmakuSwitch.setVisibility(View.VISIBLE);
}else{
mDanmakuSend.setVisibility(View.GONE);
mDanmakuSwitch.setVisibility(View.GONE);
}
}
public MediaController(Context context, boolean locked) {
this(context);
mScreenLocked = locked;
lock(mScreenLocked);
}
private void initFloatingWindow() {
mWindow = new PopupWindow(mContext);
mWindow.setFocusable(true);
mWindow.setBackgroundDrawable(null);
mWindow.setOutsideTouchable(true);
}
@TargetApi(11)
public void setWindowLayoutType() {
if (DeviceUtils.hasICS()) {
try {
mAnchor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
Method setWindowLayoutType = PopupWindow.class.getMethod("setWindowLayoutType", new Class[] { int.class });
setWindowLayoutType.invoke(mWindow, WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG);
} catch (Exception e) {
Logger.e(e);
}
}
}
@SuppressLint("NewApi")
private void initResources() {
mHandler = new MHandler(this);
mAM = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
mMaxVolume = mAM.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mGestures = new CommonGestures(mContext);
mGestures.setTouchListener(mTouchListener, true);
mAnimSlideOutBottom = AnimationUtils.loadAnimation(mContext, R.anim.slide_out_bottom);
mAnimSlideOutTop = AnimationUtils.loadAnimation(mContext, R.anim.slide_out_top);
mAnimSlideInBottom = AnimationUtils.loadAnimation(mContext, R.anim.slide_in_bottom);
mAnimSlideInTop = AnimationUtils.loadAnimation(mContext, R.anim.slide_in_top);
mAnimSlideOutBottom.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
mMediaController.setVisibility(View.GONE);
showButtons(false);
mHandler.removeMessages(MSG_HIDE_SYSTEM_UI);
mHandler.sendEmptyMessageDelayed(MSG_HIDE_SYSTEM_UI, DEFAULT_TIME_OUT);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
removeAllViews();
mRoot = inflateLayout();
mWindow.setContentView(mRoot);
mWindow.setWidth(android.view.ViewGroup.LayoutParams.MATCH_PARENT);
mWindow.setHeight(android.view.ViewGroup.LayoutParams.MATCH_PARENT);
findViewItems(mRoot);
showSystemUi(false);
if (DeviceUtils.hasHoneycomb()) {
mRoot.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if ((visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
mHandler.sendEmptyMessageDelayed(MSG_HIDE_SYSTEM_UI, DEFAULT_TIME_OUT);
}
}
});
}
}
private View inflateLayout() {
return ((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.mediacontroller, this);
}
private void findViewItems(View v) {
mMediaController = v.findViewById(R.id.mediacontroller);
mSystemInfoLayout = v.findViewById(R.id.info_panel);
mEndTime = (TextView) v.findViewById(R.id.mediacontroller_time_total);
mCurrentTime = (TextView) v.findViewById(R.id.mediacontroller_time_current);
mMenu = v.findViewById(R.id.video_menu);
mMenu.setOnClickListener(mMenuListener);
FractionalTouchDelegate.setupDelegate(mSystemInfoLayout, mMenu, new RectF(1.0f, 1f, 1.2f, 1.2f));
mFileName = (TextView) v.findViewById(R.id.mediacontroller_file_name);
mDateTime = (TextView) v.findViewById(R.id.date_time);
mDownloadRate = (TextView) v.findViewById(R.id.download_rate);
mBatteryLevel = (TextView) v.findViewById(R.id.battery_level);
mControlsLayout = v.findViewById(R.id.mediacontroller_controls);
mControlsButtons = v.findViewById(R.id.mediacontroller_controls_buttons);
mOperationInfo = (TextView) v.findViewById(R.id.operation_info);
mOperationVolLum = v.findViewById(R.id.operation_volume_brightness);
mVolLumBg = (ImageView) v.findViewById(R.id.operation_bg);
mVolLumNum = (ImageView) v.findViewById(R.id.operation_percent);
mLock = (ImageButton) v.findViewById(R.id.mediacontroller_lock);
mLock.setOnClickListener(mLockClickListener);
FractionalTouchDelegate.setupDelegate(mSystemInfoLayout, mLock, new RectF(1.0f, 1f, 1.2f, 1.2f));
mScreenToggle = (ImageButton) v.findViewById(R.id.mediacontroller_screen_size);
mScreenToggle.setOnClickListener(mScreenToggleListener);
mSnapshot = (ImageButton) v.findViewById(R.id.mediacontroller_snapshot);
mSnapshot.setOnClickListener(mSnapshotListener);
mPauseButton = (ImageButton) v.findViewById(R.id.mediacontroller_play_pause);
mPauseButton.setOnClickListener(mPauseListener);
mProgress = (SeekBar) v.findViewById(R.id.mediacontroller_seekbar);
mProgress.setOnSeekBarChangeListener(mSeekListener);
mProgress.setMax(DEFAULT_SEEKBAR_VALUE);
mDanmakuSend = (ImageButton) v.findViewById(R.id.mediacontroller_send_danmaku);
mDanmakuSend.setOnClickListener(mDanmakuSendListener);
mDanmakuSwitch = (ImageButton) v.findViewById(R.id.mediacontroller_danmaku_switch);
mDanmakuSwitch.setOnClickListener(mDanmakuSwitchListener);
}
public void setAnchorView(View view) {
mAnchor = view;
int[] location = new int[2];
mAnchor.getLocationOnScreen(location);
Rect anchorRect = new Rect(location[0], location[1], location[0] + mAnchor.getWidth(), location[1] + mAnchor.getHeight());
setWindowLayoutType();
mWindow.showAtLocation(mAnchor, Gravity.NO_GRAVITY, anchorRect.left, anchorRect.bottom);
}
public void release() {
if (mWindow != null) {
mWindow.dismiss();
mWindow = null;
}
}
private View.OnClickListener mMenuListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
mPlayer.showMenu();
}
};
private void setOperationInfo(String info, long time) {
mOperationInfo.setText(info);
mOperationInfo.setVisibility(View.VISIBLE);
mHandler.removeMessages(MSG_HIDE_OPERATION_INFO);
mHandler.sendEmptyMessageDelayed(MSG_HIDE_OPERATION_INFO, time);
}
private void setBrightnessScale(float scale) {
setGraphicOperationProgress(R.drawable.video_brightness_bg, scale);
}
private void setVolumeScale(float scale) {
setGraphicOperationProgress(R.drawable.video_volumn_bg, scale);
}
private void setGraphicOperationProgress(int bgID, float scale) {
mVolLumBg.setImageResource(bgID);
mOperationInfo.setVisibility(View.GONE);
mOperationVolLum.setVisibility(View.VISIBLE);
ViewGroup.LayoutParams lp = mVolLumNum.getLayoutParams();
lp.width = (int) (findViewById(R.id.operation_full).getLayoutParams().width * scale);
mVolLumNum.setLayoutParams(lp);
}
public void setFileName(String name) {
mFileName.setText(name);
}
public void setDownloadRate(String rate) {
mDownloadRate.setVisibility(View.VISIBLE);
mDownloadRate.setText(rate);
}
public void setBatteryLevel(String level) {
mBatteryLevel.setVisibility(View.VISIBLE);
mBatteryLevel.setText(level);
}
public void setMediaPlayer(MediaPlayerControl player) {
mPlayer = player;
updatePausePlay();
}
public void show() {
show(DEFAULT_TIME_OUT);
}
public void show(int timeout) {
if (timeout != 0) {
mHandler.removeMessages(MSG_FADE_OUT);
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_FADE_OUT), timeout);
}
if (!mShowing) {
showButtons(true);
mHandler.removeMessages(MSG_HIDE_SYSTEM_UI);
showSystemUi(true);
mPauseButton.requestFocus();
mControlsLayout.startAnimation(mAnimSlideInTop);
mSystemInfoLayout.startAnimation(mAnimSlideInBottom);
mMediaController.setVisibility(View.VISIBLE);
updatePausePlay();
mHandler.sendEmptyMessage(MSG_TIME_TICK);
mHandler.sendEmptyMessage(MSG_SHOW_PROGRESS);
mShowing = true;
}
}
public void hide() {
if (mShowing) {
try {
mHandler.removeMessages(MSG_TIME_TICK);
mHandler.removeMessages(MSG_SHOW_PROGRESS);
mControlsLayout.startAnimation(mAnimSlideOutTop);
mSystemInfoLayout.startAnimation(mAnimSlideOutBottom);
} catch (IllegalArgumentException ex) {
Logger.d("MediaController already removed");
}
mShowing = false;
}
}
private void toggleVideoMode(boolean larger, boolean recycle) {
if (larger) {
if (mVideoMode < VideoView.VIDEO_LAYOUT_ZOOM)
mVideoMode++;
else if (recycle)
mVideoMode = VideoView.VIDEO_LAYOUT_ORIGIN;
} else {
if (mVideoMode > VideoView.VIDEO_LAYOUT_ORIGIN)
mVideoMode--;
else if (recycle)
mVideoMode = VideoView.VIDEO_LAYOUT_ZOOM;
}
switch (mVideoMode) {
case VideoView.VIDEO_LAYOUT_ORIGIN:
setOperationInfo(mContext.getString(R.string.video_original), 500);
mScreenToggle.setImageResource(R.drawable.mediacontroller_sreen_size_100);
break;
case VideoView.VIDEO_LAYOUT_SCALE:
setOperationInfo(mContext.getString(R.string.video_fit_screen), 500);
mScreenToggle.setImageResource(R.drawable.mediacontroller_screen_fit);
break;
case VideoView.VIDEO_LAYOUT_STRETCH:
setOperationInfo(mContext.getString(R.string.video_stretch), 500);
mScreenToggle.setImageResource(R.drawable.mediacontroller_screen_size);
break;
case VideoView.VIDEO_LAYOUT_ZOOM:
setOperationInfo(mContext.getString(R.string.video_crop), 500);
mScreenToggle.setImageResource(R.drawable.mediacontroller_sreen_size_crop);
break;
}
mPlayer.toggleVideoMode(mVideoMode);
}
private void lock(boolean toLock) {
if (toLock) {
mLock.setImageResource(R.drawable.mediacontroller_lock);
mMenu.setVisibility(View.GONE);
mControlsButtons.setVisibility(View.GONE);
mProgress.setEnabled(false);
if (mScreenLocked != toLock)
setOperationInfo(mContext.getString(R.string.video_screen_locked), 1000);
} else {
mLock.setImageResource(R.drawable.mediacontroller_unlock);
// If you wanna to show, set mMenu visible
mMenu.setVisibility(View.GONE);
mControlsButtons.setVisibility(View.VISIBLE);
mProgress.setEnabled(true);
if (mScreenLocked != toLock)
setOperationInfo(mContext.getString(R.string.video_screen_unlocked), 1000);
}
mScreenLocked = toLock;
mGestures.setTouchListener(mTouchListener, !mScreenLocked);
}
public boolean isLocked() {
return mScreenLocked;
}
private static final int MSG_FADE_OUT = 1;
private static final int MSG_SHOW_PROGRESS = 2;
private static final int MSG_HIDE_SYSTEM_UI = 3;
private static final int MSG_TIME_TICK = 4;
private static final int MSG_HIDE_OPERATION_INFO = 5;
private static final int MSG_HIDE_OPERATION_VOLLUM = 6;
private static class MHandler extends Handler {
private WeakReference<MediaController> mc;
public MHandler(MediaController mc) {
this.mc = new WeakReference<MediaController>(mc);
}
@Override
public void handleMessage(Message msg) {
MediaController c = mc.get();
if (c == null)
return;
switch (msg.what) {
case MSG_FADE_OUT:
c.hide();
break;
case MSG_SHOW_PROGRESS:
long pos = c.setProgress();
if (!c.mDragging && c.mShowing) {
msg = obtainMessage(MSG_SHOW_PROGRESS);
sendMessageDelayed(msg, 1000 - (pos % 1000));
c.updatePausePlay();
}
break;
case MSG_HIDE_SYSTEM_UI:
if (!c.mShowing)
c.showSystemUi(false);
break;
case MSG_TIME_TICK:
c.mDateTime.setText(StringUtils.currentTimeString());
sendEmptyMessageDelayed(MSG_TIME_TICK, TIME_TICK_INTERVAL);
break;
case MSG_HIDE_OPERATION_INFO:
c.mOperationInfo.setVisibility(View.GONE);
break;
case MSG_HIDE_OPERATION_VOLLUM:
c.mOperationVolLum.setVisibility(View.GONE);
break;
}
}
};
private long setProgress() {
if (mPlayer == null || mDragging)
return 0;
long position = mPlayer.getCurrentPosition();
long duration = mPlayer.getDuration();
if (duration > 0) {
long pos = 1000L * position / duration;
mProgress.setProgress((int) pos);
}
int percent = mPlayer.getBufferPercentage();
mProgress.setSecondaryProgress(percent * 10);
mDuration = duration;
mEndTime.setText(StringUtils.generateTime(mDuration));
mCurrentTime.setText(StringUtils.generateTime(position));
return position;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mHandler.removeMessages(MSG_HIDE_SYSTEM_UI);
mHandler.sendEmptyMessageDelayed(MSG_HIDE_SYSTEM_UI, DEFAULT_TIME_OUT);
return mGestures.onTouchEvent(event) || super.onTouchEvent(event);
}
private TouchListener mTouchListener = new TouchListener() {
@Override
public void onGestureBegin() {
mBrightness = mContext.getWindow().getAttributes().screenBrightness;
mVolume = mAM.getStreamVolume(AudioManager.STREAM_MUSIC);
if (mBrightness <= 0.00f)
mBrightness = 0.50f;
if (mBrightness < 0.01f)
mBrightness = 0.01f;
if (mVolume < 0)
mVolume = 0;
}
@Override
public void onGestureEnd() {
mOperationVolLum.setVisibility(View.GONE);
}
@Override
public void onLeftSlide(float percent) {
setBrightness(mBrightness + percent);
setBrightnessScale(mContext.getWindow().getAttributes().screenBrightness);
}
@Override
public void onRightSlide(float percent) {
int v = (int) (percent * mMaxVolume) + mVolume;
setVolume(v);
}
@Override
public void onSingleTap() {
if (mShowing)
hide();
else
show();
if (mPlayer.getBufferPercentage() >= 100)
mPlayer.removeLoadingView();
}
@Override
public void onDoubleTap() {
toggleVideoMode(true, true);
}
@Override
public void onLongPress() {
doPauseResume();
}
@Override
public void onScale(float scaleFactor, int state) {
switch (state) {
case CommonGestures.SCALE_STATE_BEGIN:
mVideoMode = VideoView.VIDEO_LAYOUT_SCALE_ZOOM;
mScreenToggle.setImageResource(R.drawable.mediacontroller_sreen_size_100);
mPlayer.toggleVideoMode(mVideoMode);
break;
case CommonGestures.SCALE_STATE_SCALEING:
float currentRatio = mPlayer.scale(scaleFactor);
setOperationInfo((int) (currentRatio * 100) + "%", 500);
break;
case CommonGestures.SCALE_STATE_END:
break;
}
}
};
private void setVolume(int v) {
if (v > mMaxVolume)
v = mMaxVolume;
else if (v < 0)
v = 0;
mAM.setStreamVolume(AudioManager.STREAM_MUSIC, v, 0);
setVolumeScale((float) v / mMaxVolume);
}
private void setBrightness(float f) {
WindowManager.LayoutParams lp = mContext.getWindow().getAttributes();
lp.screenBrightness = f;
if (lp.screenBrightness > 1.0f)
lp.screenBrightness = 1.0f;
else if (lp.screenBrightness < 0.01f)
lp.screenBrightness = 0.01f;
mContext.getWindow().setAttributes(lp);
}
@Override
public boolean onTrackballEvent(MotionEvent ev) {
show(DEFAULT_TIME_OUT);
return false;
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
int keyCode = event.getKeyCode();
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_MUTE:
return super.dispatchKeyEvent(event);
case KeyEvent.KEYCODE_VOLUME_UP:
case KeyEvent.KEYCODE_VOLUME_DOWN:
mVolume = mAM.getStreamVolume(AudioManager.STREAM_MUSIC);
int step = keyCode == KeyEvent.KEYCODE_VOLUME_UP ? 1 : -1;
setVolume(mVolume + step);
mHandler.removeMessages(MSG_HIDE_OPERATION_VOLLUM);
mHandler.sendEmptyMessageDelayed(MSG_HIDE_OPERATION_VOLLUM, 500);
return true;
}
if (isLocked()) {
show();
return true;
}
if (event.getRepeatCount() == 0 && (keyCode == KeyEvent.KEYCODE_HEADSETHOOK || keyCode == KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE || keyCode == KeyEvent.KEYCODE_SPACE)) {
doPauseResume();
show(DEFAULT_TIME_OUT);
return true;
} else if (keyCode == KeyEvent.KEYCODE_MEDIA_STOP) {
if (mPlayer.isPlaying()) {
mPlayer.pause();
updatePausePlay();
}
return true;
} else if (keyCode == KeyEvent.KEYCODE_BACK) {
release();
mPlayer.stop();
return true;
} else {
show(DEFAULT_TIME_OUT);
}
return super.dispatchKeyEvent(event);
}
@TargetApi(11)
private void showSystemUi(boolean visible) {
if (DeviceUtils.hasHoneycomb()) {
int flag = visible ? 0 : View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LOW_PROFILE;
mRoot.setSystemUiVisibility(flag);
}
}
private void showButtons(boolean showButtons) {
Window window = mContext.getWindow();
WindowManager.LayoutParams layoutParams = window.getAttributes();
float val = showButtons ? -1 : 0;
try {
Field buttonBrightness = layoutParams.getClass().getField("buttonBrightness");
buttonBrightness.set(layoutParams, val);
} catch (Exception e) {
Logger.e("dimButtons", e);
}
window.setAttributes(layoutParams);
}
private void updatePausePlay() {
if (mPlayer.isPlaying())
mPauseButton.setImageResource(R.drawable.mediacontroller_pause);
else
mPauseButton.setImageResource(R.drawable.mediacontroller_play);
}
private void doPauseResume() {
if (mPlayer.isPlaying())
mPlayer.pause();
else
mPlayer.start();
updatePausePlay();
}
private View.OnClickListener mPauseListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mPlayer.isPlaying())
show(DEFAULT_LONG_TIME_SHOW);
else
show();
doPauseResume();
}
};
private View.OnClickListener mLockClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
hide();
lock(!mScreenLocked);
show();
}
};
private View.OnClickListener mScreenToggleListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
show(DEFAULT_TIME_OUT);
toggleVideoMode(true, true);
}
};
private View.OnClickListener mSnapshotListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
show(DEFAULT_TIME_OUT);
mSnapshot.setEnabled(false);
mPlayer.snapshot();
mSnapshot.setEnabled(true);
}
};
private OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() {
private boolean wasStopped = false;
@Override
public void onStartTrackingTouch(SeekBar bar) {
mDragging = true;
show(3600000);
mHandler.removeMessages(MSG_SHOW_PROGRESS);
wasStopped = !mPlayer.isPlaying();
if (mInstantSeeking) {
mAM.setStreamMute(AudioManager.STREAM_MUSIC, true);
if (wasStopped) {
mPlayer.start();
}
}
}
@Override
public void onProgressChanged(SeekBar bar, int progress, boolean fromuser) {
if (!fromuser)
return;
long newposition = (mDuration * progress) / 1000;
String time = StringUtils.generateTime(newposition);
if (mInstantSeeking)
mPlayer.seekTo(newposition);
setOperationInfo(time, 1500);
mCurrentTime.setText(time);
}
@Override
public void onStopTrackingTouch(SeekBar bar) {
if (!mInstantSeeking) {
mPlayer.seekTo((mDuration * bar.getProgress()) / 1000);
} else if (wasStopped) {
mPlayer.pause();
}
mOperationInfo.setVisibility(View.GONE);
show(DEFAULT_TIME_OUT);
mHandler.removeMessages(MSG_SHOW_PROGRESS);
mAM.setStreamMute(AudioManager.STREAM_MUSIC, false);
mDragging = false;
mHandler.sendEmptyMessageDelayed(MSG_SHOW_PROGRESS, 1000);
}
};
private View.OnClickListener mDanmakuSendListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
ToastUtils.showToast("发送弹幕(没有实现功能)");
}
};
private View.OnClickListener mDanmakuSwitchListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mDanmakuShow) {
mDanmakuSwitch.setImageResource(R.drawable.bili_player_danmaku_is_closed);
mPlayer.setDanmakushow(false);
mDanmakuShow = false;
} else {
mDanmakuSwitch.setImageResource(R.drawable.bili_player_danmaku_is_open);
mPlayer.setDanmakushow(true);
mDanmakuShow = true;
}
}
};
public interface MediaPlayerControl {
void start();
void pause();
void stop();
void seekTo(long pos);
boolean isPlaying();
long getDuration();
long getCurrentPosition();
int getBufferPercentage();
void previous();
void next();
long goForward();
long goBack();
void toggleVideoMode(int mode);
void showMenu();
void removeLoadingView();
float scale(float scale);
void snapshot();
void setDanmakushow(boolean isShow);
}
}