/* �ٿ�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);
	}

}