package com.softwinner.TvdFileManager; import java.io.File; import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; import android.app.Dialog; import android.app.ListActivity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnKeyListener; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnBufferingUpdateListener; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnPreparedListener; import android.media.MediaPlayer.OnVideoSizeChangedListener; import android.os.Bundle; import android.util.DisplayMetrics; import android.util.Log; import android.view.Gravity; import android.view.KeyEvent; import android.view.Menu; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.widget.Button; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.softwinner.view.MenuItem; public class MainUI extends ListActivity implements SurfaceHolder.Callback, OnPreparedListener, OnBufferingUpdateListener, OnCompletionListener, OnVideoSizeChangedListener, IEventHandlerCallbacks { private static final String TAG = "MainUI"; private EventHandler mHandler; private MediaProvider mMedia; private Context mContext; private DeviceManager mDevices; private EventHandler.TableRow mTable; private EventHandler.MenuItemListener mMenuListener; private LinearLayout mThumb; private SurfaceView mVideo; private ImageView mImage; private TextView mPreview; private TextView mPath; private TextView mIndex; private ListView list; //option ����� private Dialog menuDialog; private GridView menuGrid; private View menuView; private BroadcastReceiver mReceiver; /* ���������л�ʱ��ʱˢ�� */ private Timer time = null; private TimerTask task; MenuItem sort; MenuItem copy; MenuItem paste; MenuItem cut; MenuItem delete; MenuItem rename; MenuItem mkdir; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* ����������ڵ���Ϣ */ SharedPreferences pf = getSharedPreferences("partition", 0); SharedPreferences.Editor editor = pf.edit(); editor.clear(); mMedia = new MediaProvider(this); mDevices = new DeviceManager(this); mHandler = new EventHandler(this, this, mMedia, mDevices); mTable = mHandler.new TableRow(); mMenuListener = mHandler.new MenuItemListener(); /* ������ϢԤ�������� */ mThumb = (LinearLayout) findViewById(R.id.thumb); mVideo = (SurfaceView) findViewById(R.id.thumb_movie); mImage = (ImageView) findViewById(R.id.thumbnail); Drawable bp = getResources().getDrawable(R.drawable.thumbnail_equipment); Bitmap m = ((BitmapDrawable)bp).getBitmap(); mPreview = (TextView) findViewById(R.id.preview); mPath = (TextView) findViewById(R.id.path); mIndex = (TextView) findViewById(R.id.index); mHandler.setViewResource(mVideo, mImage, mPreview, mPath, mIndex); /* ��ListView �� TableRow ��,������items�ı�ѡ���¼� */ list = getListView(); mHandler.setListAdapter(mTable, list); list.setAdapter(mTable); list.setOnItemSelectedListener(mHandler); list.setOnItemClickListener(mHandler); list.setOnItemLongClickListener(mHandler); /* ���ü����������IJ˵�item */ Button devices = (Button) findViewById(R.id.device_button); Button video = (Button) findViewById(R.id.video_button); Button picture = (Button) findViewById(R.id.picture_button); Button music = (Button) findViewById(R.id.music_button); Button file = (Button) findViewById(R.id.file_button); devices.setOnClickListener(mHandler); video.setOnClickListener(mHandler); picture.setOnClickListener(mHandler); music.setOnClickListener(mHandler); file.setOnClickListener(mHandler); /* ��ȡ�������IJ��������������� */ Bundle b = getIntent().getExtras(); if(b != null) { String action = b.getString("media_type"); if(action != null) { if(action.equals("MEDIA_TYPE_MUSIC")) { mHandler.setFilterType(mMedia.MUSIC_FILTER); music.performClick(); } else if(action.equals("MEDIA_TYPE_PICTURE")) { mHandler.setFilterType(mMedia.PICTURE_FILTER); picture.performClick(); } else if(action.equals("MEDIA_TYPE_VIDEO")) { mHandler.setFilterType(mMedia.MOVIE_FILTER); video.performClick(); } else if(action.equals("MEDIA_TYPE_ALL")) { mHandler.setFilterType(mMedia.ALLTYPE_FILTER); file.performClick(); } else { devices.performClick(); } } else { Log.d(TAG,"started by other parames"); devices.performClick(); } } else { devices.performClick(); } /* ����option�˵�����Ϣ */ createMenu(); /* �����Ȳ�ι��� */ mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String tmpstring = intent.getData().getPath(); Log.d(TAG, "devices path:" + tmpstring); if(intent.getAction().equals(intent.ACTION_MEDIA_REMOVED) || intent.getAction().equals(intent.ACTION_MEDIA_BAD_REMOVAL)) { /* �ȴ�1������ˢ�½���,������Ϊ�ײ㷢��ж���ź�ʱ����ʱʵ���ϻ�ûж�ص��豸 */ try { Thread.currentThread().sleep(500); } catch(Exception e) {}; if(mHandler.currentDir.startsWith(tmpstring) || mHandler.isDeviceList()) { showDeviceList(); } if(mDevices.isInterStoragePath(tmpstring)) { //DisplayToast(getResources().getString(R.string.flash_out)); } else if(mDevices.isSdStoragePath(tmpstring)) { DisplayToast(getResources().getString(R.string.sdcard_out)); } else if(mDevices.isUsbStoragePath(tmpstring)) { DisplayToast(getResources().getString(R.string.usb_out)); } } else if (intent.getAction().equals(intent.ACTION_MEDIA_MOUNTED)) { if(mHandler.isDeviceList()) { showDeviceList(); } if(mDevices.isInterStoragePath(tmpstring)) { //DisplayToast(getResources().getString(R.string.flash_in)); } else if(mDevices.isSdStoragePath(tmpstring)) { DisplayToast(getResources().getString(R.string.sdcard_in)); } else if(mDevices.isUsbStoragePath(tmpstring)) { DisplayToast(getResources().getString(R.string.usb_in)); } } } }; IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_MEDIA_MOUNTED); filter.addAction(Intent.ACTION_MEDIA_REMOVED); filter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL); filter.addDataScheme("file"); registerReceiver(mReceiver, filter); } private void showDeviceList() { mHandler.getDeviceList(); if(mHandler.mDataSource.size() > 0) { mHandler.getDetailForPosition(mHandler.currentPosition); } } private void DisplayToast(String str){ Toast.makeText(getBaseContext(), str, Toast.LENGTH_SHORT).show(); } @Override public boolean onCreateOptionsMenu(Menu menu) { menu.add("menu"); return super.onCreateOptionsMenu(menu); } @Override public boolean onMenuOpened(int featureId, Menu menu) { if(menuDialog == null) { setItemStatus(); DisplayMetrics metrics = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(metrics); int width = metrics.widthPixels; int height = metrics.heightPixels; menuDialog = new Dialog(MainUI.this, R.style.menu_dialog); // Window win = menuDialog.getWindow(); // LayoutParams params = new LayoutParams(); // params.y = 99999; // params.x = 0; // params.width = width; // params.height = height; // win.setAttributes(params); menuDialog.setOnKeyListener(new OnKeyListener(){ public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_MENU) { dialog.dismiss(); } return false; } }); mMenuListener.setListenedMenu(menuDialog); menuDialog.setCanceledOnTouchOutside(true); menuDialog.setContentView(menuView); Window dialogWindow = menuDialog.getWindow(); WindowManager.LayoutParams lp = dialogWindow.getAttributes(); dialogWindow.setGravity(Gravity.BOTTOM); lp.width = width; dialogWindow.setAttributes(lp); menuDialog.show(); } else { setItemStatus(); menuDialog.show(); } return false; } private void setItemStatus() { if(mHandler.isDeviceList() || mHandler.isPartitionList()) { sort.setEnabled(true); copy.setEnabled(false); paste.setEnabled(false); cut.setEnabled(false); delete.setEnabled(false); rename.setEnabled(false); mkdir.setEnabled(false); sort.setFocusable(true); copy.setFocusable(false); paste.setFocusable(false); cut.setFocusable(false); delete.setFocusable(false); rename.setFocusable(false); mkdir.setFocusable(false); return; } else if(mHandler.isReturnItemSelected()) { sort.setEnabled(true); copy.setEnabled(false); cut.setEnabled(false); delete.setEnabled(false); rename.setEnabled(false); sort.setFocusable(true); copy.setFocusable(false); cut.setFocusable(false); delete.setFocusable(false); rename.setFocusable(false); } else { sort.setEnabled(true); copy.setEnabled(true); cut.setEnabled(true); delete.setEnabled(true); rename.setEnabled(true); sort.setFocusable(true); copy.setFocusable(true); cut.setFocusable(true); delete.setFocusable(true); rename.setFocusable(true); } if(mHandler.hasFileOperate()) { paste.setEnabled(true); paste.setFocusable(true); } else { paste.setEnabled(false); paste.setFocusable(false); } mkdir.setEnabled(true); mkdir.setFocusable(true); } private void createMenu() { menuView = View.inflate(this, R.layout.gridview_menu, null); sort = (MenuItem) menuView.findViewById(R.id.sort_button); copy = (MenuItem) menuView.findViewById(R.id.copy_button); paste = (MenuItem) menuView.findViewById(R.id.paste_button); cut = (MenuItem) menuView.findViewById(R.id.cut_button); delete= (MenuItem) menuView.findViewById(R.id.delete_button); rename= (MenuItem) menuView.findViewById(R.id.rename_button); mkdir = (MenuItem) menuView.findViewById(R.id.mkdir_button); sort.setOnClickListener(mMenuListener); copy.setOnClickListener(mMenuListener); paste.setOnClickListener(mMenuListener); cut.setOnClickListener(mMenuListener); delete.setOnClickListener(mMenuListener); rename.setOnClickListener(mMenuListener); mkdir.setOnClickListener(mMenuListener); } public void playVideo(String path) { if (player != null) { player.release(); player = null; } player = new MediaPlayer(); pathname = path; holder = this.mVideo.getHolder(); holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder.addCallback(this); mImage.setVisibility(View.GONE); mVideo.setVisibility(View.GONE); mVideo.setVisibility(View.VISIBLE); } private MediaPlayer player; private String pathname; private SurfaceHolder holder; private String VTAG = "VideoPlayer"; private void play() { try { player.setDataSource(pathname); player.setDisplay(holder); int w = mVideo.getWidth(); int h = mVideo.getHeight(); if(w != 0 && h != 0) { player.enableScaleMode(true, w, h); Log.d(TAG, "set scale mode:" + String.valueOf(mVideo.getWidth()) + "*" + String.valueOf(mVideo.getHeight())); } player.prepareAsync(); player.setOnPreparedListener(this); player.setOnCompletionListener(this); player.setAudioStreamType(AudioManager.STREAM_MUSIC); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.d(VTAG, "surfaceview is changed"); Log.d(VTAG, "to:" + String.valueOf(width) + "*" + String.valueOf(height)); } @Override public void surfaceCreated(SurfaceHolder holder) { Log.d(VTAG, "surfaceview is created"); if(player != null) { play(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { Log.d(VTAG, "surfaceview is destroyed"); } @Override public void onPrepared(MediaPlayer mp) { Log.d(VTAG, "media is prepared"); try { if(player != null) { setVideoRatio(pathname); if(player.setSubGate(false) != 0) { Log.d(TAG, "fail to close subtitles"); } else { Log.d(TAG, "success close subtitles"); } startVideoPlayback(); showVideoMassage(pathname); } } catch(Exception e) { } } private void startVideoPlayback() { Log.v(TAG, "startVideoPlayback"); player.start(); } @Override public void onVideoSizeChanged(MediaPlayer mp, int width, int height) { // TODO Auto-generated method stub Log.v(VTAG, "onVideoSizeChanged called"); } @Override public void onCompletion(MediaPlayer mp) { // TODO Auto-generated method stub Log.d(VTAG, "onCompletion called"); } @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { // TODO Auto-generated method stub Log.d(VTAG, "onBufferingUpdate percent:" + percent); } /* * ʵ�ֻص��ӿ� */ @Override public void playThumbVideo(String path) { playVideo(path); } @Override public void releaseMediaPlayerAsync() { Thread thread = new Thread() { @Override public void run() { if (player != null) { player.reset(); player = null; } } }; thread.start(); } @Override public void releaseMediaPlayerSync() { if (player != null) { player.reset(); player = null; } } @Override public boolean hasReleaseMedia() { if(player == null) { return true; } else return false; } @Override public void stopPlaying() { if(player != null) { player.stop(); } } @Override public void showVideoMassage(String path) { if(player == null) return; MediaPlayer mediaData = player; //��ȡ��Ƶʱ�� long ms = mediaData.getDuration(); String Duration = getResources().getString(R.string.duration) + mHandler.toDuration((long)ms) + "\n"; //��ȡ��Ƶ�ֱ��� String wVideo = String.valueOf(mediaData.getVideoWidth()); String hVideo = String.valueOf(mediaData.getVideoHeight()); String Resolution = getResources().getString(R.string.resolution) + wVideo + "*" + hVideo + "\n"; //��ȡ��Ƶ��С String Size = getResources().getString(R.string.size) + mHandler.toSize(new File(path).length()) + "\n"; String Display = Size + Duration + Resolution ; mPreview.setText(Display); } /* * �ͷ���Դ */ @Override protected void onPause() { super.onPause(); Log.d(TAG, "activity pause"); releaseMediaPlayerAsync(); } @Override protected void onDestroy() { try{ mHandler.clear(); if(mReceiver != null) { unregisterReceiver(mReceiver); } }catch(Exception e){ Log.e(TAG, "unknow exception"); } releaseMediaPlayerAsync(); super.onDestroy(); Log.d(TAG, "activity destroy"); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_LEFT: moveToLeft(); break; case KeyEvent.KEYCODE_DPAD_RIGHT: moveToRight(); break; case KeyEvent.KEYCODE_BACK: if(mHandler.backToPreDir() == false) { exit(); } break; default: return super.onKeyDown(keyCode, event); } return true; } private void exit() { finish(); } private void moveToLeft() { int buttonId = 0; switch(mHandler.currentNavigation) { case R.id.device_button: mHandler.loadBrowseDir(); buttonId = R.id.file_button; break; case R.id.video_button: mHandler.saveBrowseDir(); buttonId = R.id.device_button; break; case R.id.picture_button: buttonId = R.id.video_button; break; case R.id.music_button: buttonId = R.id.picture_button; break; case R.id.file_button: buttonId = R.id.music_button; break; } Button bt = (Button) findViewById(buttonId); mHandler.currentNavigation = buttonId; delayToRefresh(); mHandler.setButtonSelected(bt); } private void moveToRight() { int buttonId = 0; switch(mHandler.currentNavigation) { case R.id.device_button: mHandler.loadBrowseDir(); buttonId = R.id.video_button; break; case R.id.video_button: buttonId = R.id.picture_button; break; case R.id.picture_button: buttonId = R.id.music_button; break; case R.id.music_button: buttonId = R.id.file_button; break; case R.id.file_button: mHandler.saveBrowseDir(); buttonId = R.id.device_button; break; } Button bt = (Button) findViewById(buttonId); mHandler.currentNavigation = buttonId; delayToRefresh(); mHandler.setButtonSelected(bt); } private void delayToRefresh() { if(time != null) { time.cancel(); } time = new Timer(); task = new TimerTask() { @Override public void run() { final Button mb = (Button) findViewById(mHandler.currentNavigation); mb.post(new Runnable() { @Override public void run() { mb.performClick(); } }); } }; time.schedule(task, 500); } /* ��ԭ����Ƶ�ֱ��ʵı���������Ԥ�����Ŵ��ڴ�С */ private void setVideoRatio(String path) { int vh = 0; int vw = 0; if(player != null) { vh = player.getVideoHeight(); vw = player.getVideoWidth(); } if(vw == 0 || vh == 0) { return; } int width = mThumb.getWidth(); int height = (vh * width) / vw; if(height > mThumb.getHeight()) { height = mThumb.getHeight(); } ViewGroup.LayoutParams params = mVideo.getLayoutParams(); params.width = width; params.height = height; mVideo.setLayoutParams(params); } }