/* �ٿ�UI */
package gov.anzong.mediaplayer;
import gov.anzong.mediaplayer.CommonGestures.TouchListener;
import gov.anzong.mediaplayer.R;
import gov.anzong.util.FunctionUtil;
import io.vov.vitamio.MediaPlayer;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.media.AudioManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.telephony.TelephonyManager;
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.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
public class MediaController extends FrameLayout {
private MediaPlayerControl mPlayer;
private static Activity mContext;
private PopupWindow mWindow;
private PopupWindow videoqualityWindow;
private View mAnchor;
private View mRoot;
private ImageButton mLock;
private ImageButton mScreenToggle;
private SeekBar mProgress;
private TextView mTime;
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, mediacontroller_back;
private int selectedposition = 1;
private View mMediaController;
private long toposition = -1l;
private View mControlsLayout;
private View mSystemInfoLayout;
private TextView mDateTime;
private TextView mDownloadRate;
private static TextView mWifiRate;
private TextView mFileName;
private TextView mBatteryLevel;
private Button mModeButton;
private TextView mOperationInfo;
private RelativeLayout relativeLayout_volume, relativeLayout_brightness;
private ProgressBar volumeProgressBar, brightnessProgressBar;
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 int mSpeed = 0;
private boolean istoanotherposition = false;
private int pressbacktime = 0;
public MediaController(Context context) {
super(context);
mContext = (Activity) context;
initFloatingWindow();
initResources();
}
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 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
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) {
}
}
}
@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.INVISIBLE);
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 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mRoot.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
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);
mTime = (TextView) v.findViewById(R.id.mediacontroller_time_total);
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);
mWifiRate = (TextView) v.findViewById(R.id.wifi_rate);
mBatteryLevel = (TextView) v.findViewById(R.id.battery_level);
mControlsLayout = v.findViewById(R.id.mediacontroller_controls);
mLock = (ImageButton) v.findViewById(R.id.mediacontroller_lock);
mLock.setOnClickListener(mLockClickListener);
mScreenToggle = (ImageButton) v
.findViewById(R.id.mediacontroller_screen_size);
mScreenToggle.setOnClickListener(mScreenToggleListener);
mPauseButton = (ImageButton) v
.findViewById(R.id.mediacontroller_play_pause);
mPauseButton.setOnClickListener(mPauseListener);
mediacontroller_back = (ImageButton) v
.findViewById(R.id.mediacontroller_back);
mediacontroller_back.setOnClickListener(mMediacontroller_backListener);
mProgress = (SeekBar) v.findViewById(R.id.mediacontroller_seekbar);
mProgress.setOnSeekBarChangeListener(mSeekListener);
mProgress.setMax(DEFAULT_SEEKBAR_VALUE);
mOperationInfo = (TextView) v.findViewById(R.id.operation_info);
mModeButton = (Button) v.findViewById(R.id.mode_spinner);
mModeButton.setText("��ͨ");
mModeButton.setOnClickListener(videoquality());
relativeLayout_volume = (RelativeLayout) findViewById(R.id.relativeLayout_volume);
relativeLayout_brightness = (RelativeLayout) findViewById(R.id.relativeLayout_brightness);
volumeProgressBar = (ProgressBar) findViewById(R.id.volumeProgressBar);
brightnessProgressBar = (ProgressBar) findViewById(R.id.brightnessProgressBar);
}
public OnClickListener videoquality() {
OnClickListener videoqualityonclick = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
show();
final View mLayout; // �����б�IJ���
final ListView mListView; // �����б�ؼ�
final BaseAdapter adaptervideoQuality;
LayoutInflater inflater = ((LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE));
mLayout = inflater.inflate(R.layout.spinnerlistview, null);
mListView = (ListView) mLayout.findViewById(R.id.mlistview);
mListView.setCacheColorHint(Color.TRANSPARENT);
adaptervideoQuality = adaptervideoQuality(inflater);
mListView.setAdapter(adaptervideoQuality);
videoqualityWindow = new PopupWindow(mLayout,
mModeButton.getWidth(),
ViewGroup.LayoutParams.WRAP_CONTENT);
videoqualityWindow.setContentView(mLayout);
videoqualityWindow.setFocusable(true);
videoqualityWindow.setBackgroundDrawable(new BitmapDrawable());
videoqualityWindow.setOutsideTouchable(true);
int[] location = new int[2];
mModeButton.getLocationOnScreen(location);
videoqualityWindow.showAtLocation(mLayout, Gravity.TOP
| Gravity.LEFT, location[0],
mSystemInfoLayout.getHeight());
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
show();
selectedposition = position;
mModeButton.setText((String) mListView
.getItemAtPosition(position));
switch (position) {
case 1:
mPlayer.setVideoQuality(MediaPlayer.VIDEOQUALITY_MEDIUM);
break;
case 2:
mPlayer.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH);
break;
case 0:
default:
mPlayer.setVideoQuality(MediaPlayer.VIDEOQUALITY_LOW);
break;
}
setOperationInfo(
"��Ƶ������"
+ (String) mListView
.getItemAtPosition(position),
1500);
adaptervideoQuality.notifyDataSetChanged();
}
});
}
};
return videoqualityonclick;
}
public BaseAdapter adaptervideoQuality(final LayoutInflater inflater) {
BaseAdapter adaptervideoQuality = new BaseAdapter() {
@Override
public int getCount() {
// TODO Auto-generated method stub
return mContext.getResources().getStringArray(
R.array.videoquality).length; // ѡ���ܸ���
}
@Override
public String getItem(int arg0) {
// TODO Auto-generated method stub
return mContext.getResources().getStringArray(
R.array.videoquality)[arg0];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int arg0, View convertView, ViewGroup arg2) {
// TODO Auto-generated method stub
View v = convertView;
if (v == null) {
v = inflater.inflate(R.layout.listtextview, null);
}
TextView TV = (TextView) v
.findViewById(R.id.spinner_dropdown_item_textview);
TV.setText(mContext.getResources().getStringArray(
R.array.videoquality)[arg0]);
if (selectedposition == arg0) {
TV.setTextColor(mContext.getResources().getColor(
R.color.listviewtextcolorseleted));
} else {
TV.setTextColor(Color.WHITE);
}
return v;
}
};
return adaptervideoQuality;
}
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 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);
}
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);
if (videoqualityWindow != null) {
videoqualityWindow.dismiss();
}
} catch (IllegalArgumentException ex) {
}
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);
mProgress.setEnabled(false);
mPauseButton.setClickable(false);
mModeButton.setClickable(false);
mediacontroller_back.setClickable(false);
mScreenToggle.setClickable(false);
if (mScreenLocked != toLock)
setOperationInfo(
mContext.getString(R.string.video_screen_locked), 1000);
if (videoqualityWindow != null)
videoqualityWindow.dismiss();
} else {
mLock.setImageResource(R.drawable.mediacontroller_unlock);
mProgress.setEnabled(true);
mPauseButton.setClickable(true);
mModeButton.setClickable(true);
mediacontroller_back.setClickable(true);
mScreenToggle.setClickable(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(currentTimeString());
c.mWifiRate.setText(FunctionUtil.getNetworkClass(mContext));
sendEmptyMessageDelayed(MSG_TIME_TICK, TIME_TICK_INTERVAL);
break;
case MSG_HIDE_OPERATION_INFO:
c.mOperationInfo.setVisibility(View.INVISIBLE);
break;
case MSG_HIDE_OPERATION_VOLLUM:
c.relativeLayout_volume.setVisibility(View.INVISIBLE);
break;
}
}
};
private static String currentTimeString() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
return sdf.format(new java.util.Date());
}
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;
mTime.setText(length2time(position) + "/" + length2time(mDuration));
return position;
}
public void initDuration() {
if (mPlayer != null && mDuration <= 0l) {
mDuration = mPlayer.getDuration();
}
}
/**
* �����ȳ���ת��Ϊ����ʱ��
*/
private String length2time(long length) {
int totalSeconds = (int) (length / 1000);
int seconds = totalSeconds % 60;
int minutes = (totalSeconds / 60) % 60;
int hours = totalSeconds / 3600;
return hours > 0 ? String.format("%02d:%02d:%02d", hours, minutes,
seconds) : String.format("%02d:%02d", minutes, seconds);
}
public static String generateTime(long time) {
int totalSeconds = (int) (time / 1000);
int seconds = totalSeconds % 60;
int minutes = (totalSeconds / 60) % 60;
int hours = totalSeconds / 3600;
return hours > 0 ? String.format("%02d:%02d:%02d", hours, minutes,
seconds) : String.format("%02d:%02d", minutes, seconds);
}
@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() {
long mVideo_current_length;
String total_length;
@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;
initDuration();
mSpeed = 0;
toposition = -1l;
istoanotherposition = false;
total_length = length2time(mDuration);
mVideo_current_length = mPlayer.getCurrentPosition();// ��ǰ���ų���
}
@Override
public void onLeftSlide(float percent) {
setBrightness(mBrightness + percent);
}
@Override
public void onGestureEnd() {
relativeLayout_volume.setVisibility(View.INVISIBLE);
relativeLayout_brightness.setVisibility(View.INVISIBLE);
if (istoanotherposition) {
istoanotherposition = false;
mPlayer.seekTo(toposition);
}
}
@Override
public void onRightSlide(float percent) {
int v = (int) (percent * mMaxVolume) + mVolume;
setVolume(v);
}
@Override
public void onVideoSpeed(float distanceX) {
if (distanceX > 0) {// ���� --
--mSpeed;
} else if (distanceX < 0) {// ���һ��� ++
++mSpeed;
}
int i = mSpeed * 1000;// �������
long mVideo_start_length = mVideo_current_length + i;// ���֮��
if (mVideo_start_length >= mDuration) {
mVideo_start_length = (long) mDuration;
} else if (mVideo_start_length <= 0) {
mVideo_start_length = 0L;
}
istoanotherposition = true;
toposition = (long) mVideo_start_length;
String start_length = length2time(mVideo_start_length);
int pasttime = (int) ((mVideo_start_length - mVideo_current_length) / 1000l);
String pasttimestr;
if (pasttime >= 0) {
pasttimestr = "+" + String.valueOf(pasttime);
} else {
pasttimestr = String.valueOf(pasttime);
}
setOperationInfo(start_length + "/" + total_length + "\n"
+ pasttimestr + "��", 500);
}
@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) {
relativeLayout_volume.setVisibility(View.VISIBLE);
if (v > mMaxVolume)
v = mMaxVolume;
else if (v < 0)
v = 0;
mAM.setStreamVolume(AudioManager.STREAM_MUSIC, v, 0);
int voltmp = (int) (100 * v / mMaxVolume);
volumeProgressBar.setProgress(voltmp);
if (voltmp <= 0) {
setOperationInfo("����", 1500);
} else {
setOperationInfo("������" + String.valueOf(voltmp) + "%", 1500);
}
}
private void setBrightness(float f) {
relativeLayout_brightness.setVisibility(View.VISIBLE);
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);
int britmp = (int) ((lp.screenBrightness - 0.01f) / 0.99f * 100);
brightnessProgressBar.setProgress(britmp);
setOperationInfo("���ȣ�" + String.valueOf(britmp) + "%", 1500);
}
@Override
public boolean onTrackballEvent(MotionEvent ev) {
show(DEFAULT_TIME_OUT);
return false;
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
int keyCode = event.getKeyCode();
int keyMode = event.getAction();
if (keyMode == KeyEvent.ACTION_DOWN) {
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() && keyCode != KeyEvent.KEYCODE_BACK) {
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) {
pressbacktime++;
if (pressbacktime > 1) {
release();
}
mPlayer.stop(pressbacktime);
return true;
} else {
show(DEFAULT_TIME_OUT);
}
return super.dispatchKeyEvent(event);
} else {
return super.dispatchKeyEvent(event);
}
}
@TargetApi(11)
private void showSystemUi(boolean visible) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
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) {
}
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 mMediacontroller_backListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mContext != null) {
mContext.finish();
}
}
};
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 OnSeekBarChangeListener mSeekListener = new OnSeekBarChangeListener() {
private boolean wasStopped = false;
long mVideo_current_length;
@Override
public void onStartTrackingTouch(SeekBar bar) {
mDragging = true;
show(3600000);
mVideo_current_length = mPlayer.getCurrentPosition() / 1000l;// ��ǰ���ų���
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 = length2time(newposition);
if (mInstantSeeking)
mPlayer.seekTo(newposition);
int plustime = (int) (newposition / 1000 - mVideo_current_length);
String plustimestr = "";
if (plustime >= 0) {
plustimestr = "\n+" + String.valueOf(plustime) + "��";
} else {
plustimestr = "\n" + String.valueOf(plustime) + "��";
}
setOperationInfo(time + "/" + length2time(mDuration) + plustimestr,
1500);
}
@Override
public void onStopTrackingTouch(SeekBar bar) {
if (!mInstantSeeking) {
mPlayer.seekTo((mDuration * bar.getProgress()) / 1000);
} else if (wasStopped) {
mPlayer.pause();
}
mOperationInfo.setVisibility(View.INVISIBLE);
show(DEFAULT_TIME_OUT);
mHandler.removeMessages(MSG_SHOW_PROGRESS);
mAM.setStreamMute(AudioManager.STREAM_MUSIC, false);
mDragging = false;
mHandler.sendEmptyMessageDelayed(MSG_SHOW_PROGRESS, 1000);
}
};
public interface MediaPlayerControl {
void start();
void pause();
void stop(int pressbacktime);
void seekTo(long pos);
void setVideoQuality(int quality);
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);
}
}