/**
* @file FileBrowser.java
*
* @revision: none
*
* @version 0.0.1
* @author: Zenki (zhajun), zenki2001cn@163.com
* @date: 2011-8-1 下午01:10:35
*/
package com.easyview.ebook.reader.ui.controller;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.TextView;
import com.easyview.ebook.reader.engine.core.ERManager;
import com.easyview.ebook.reader.engine.core.IDatabaseService;
import com.easyview.ebook.reader.engine.core.IEngineService;
import com.easyview.ebook.reader.engine.model.Book;
import com.easyview.ebook.reader.easyviewer.R;
public class FileBrowser extends Activity {
static private final String TAG = "FileBrowser";
private SharedPreferences mSharedPreferences;
private ListView mLocalListView;
private ListView mRecentListView;
private ImageButton mBrowserLocalButton;
private ImageButton mBrowserRecentButton;
private String mScanLocalPath;
private IDatabaseService mIds;
ArrayList<RecentListItem> mRecentListItems = new ArrayList<FileBrowser.RecentListItem>();
ArrayList<LocalListItem> mLocalListItems = new ArrayList<FileBrowser.LocalListItem>();
BrowserRecentListAdapter mBrowserRecentListAdapter;
BrowserLocalListAdapter mBrowserLocalListAdapter;
static private final String EXTERNAL_PATH = "/sdcard";
static private final String UP_DIR = "..";
private final String KEY_SCAN_PATH = "scan_path";
private final int MSG_REFRESH_LOCAL_LIST = 1;
private final int MSG_REFRESH_RECENT_LIST = 2;
private final int ACITVITY_REQUEST_CODE = 0;
public static String RESULT_UPDATE_RECENT_LIST = "UpdateRecent";
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_REFRESH_LOCAL_LIST:
refreshLocalList(mScanLocalPath);
break;
case MSG_REFRESH_RECENT_LIST:
mBrowserRecentListAdapter = new BrowserRecentListAdapter(
FileBrowser.this, mRecentListItems);
mRecentListView.setAdapter(mBrowserRecentListAdapter);
break;
default:
break;
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_browser);
// 读取配置信息
mSharedPreferences = getPreferences(MODE_PRIVATE);
initView();
// 初始化Engine
IEngineService ies = (IEngineService) ERManager
.getService(ERManager.ERENGINE_SERVICE);
ies.setContext(this);
// mHandler.sendEmptyMessageDelayed(MSG_REFRESH_LOCAL_LIST, 500);
refresRecentList();
}
@Override
protected void onResume() {
loadPreferences();
registerMediaReceiver();
super.onResume();
}
@Override
protected void onPause() {
savePreferences();
unregisterMediaReceiver();
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ACITVITY_REQUEST_CODE) {
Log.e(TAG, "onActivityResult resultCode = " + resultCode);
}
}
private void loadPreferences() {
mScanLocalPath = mSharedPreferences.getString(KEY_SCAN_PATH,
EXTERNAL_PATH);
}
private void savePreferences() {
SharedPreferences.Editor edit = mSharedPreferences.edit();
edit.putString(KEY_SCAN_PATH, mScanLocalPath);
edit.commit();
}
public void initView() {
mLocalListView = (ListView) findViewById(R.id.id_file_list);
mRecentListView = (ListView) findViewById(R.id.id_recent_list);
mBrowserLocalButton = (ImageButton) findViewById(R.id.id_browser_local_path);
mBrowserRecentButton = (ImageButton) findViewById(R.id.id_browser_recent_path);
mLocalListView.setOnItemClickListener(cLocalFileItemClicked);
mRecentListView.setOnItemClickListener(cRecentFileItemClicked);
mBrowserLocalButton.setOnClickListener(mRefreshLocalListener);
mBrowserRecentButton.setOnClickListener(mRefreshRecentListener);
}
private OnItemClickListener cLocalFileItemClicked = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
ListView listView = (ListView) parent;
Bundle bundle = new Bundle();
LocalListItem item = (LocalListItem) listView
.getItemAtPosition(position);
String pathName = item.getPathName();
String fileName = item.getFileName();
File file = new File(pathName);
Log.d(TAG, "getAbsolutePath " + file.getAbsolutePath());
// 返回上一级目录
if (fileName.equals(UP_DIR)) {
refreshLocalList(file.getParent());
} else if (file.isFile()) {
bundle.putString(EasyViewer.INTENT_KEY_FILE_NAME, pathName);
Log.d(TAG, "openBook = " + pathName);
Intent i = new Intent();
ComponentName comp = new ComponentName(
"com.easyview.ebook.reader.easyviewer",
"com.easyview.ebook.reader.ui.controller.EasyViewer");
i.setComponent(comp);
i.putExtras(bundle);
// i.setAction("android.intent.action.VIEW");
startActivityForResult(i, ACITVITY_REQUEST_CODE);
} else if (file.isDirectory()) {
Log.d(TAG, "file is dir " + file.getAbsolutePath());
refreshLocalList(pathName);
}
}
};
private OnItemClickListener cRecentFileItemClicked = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
ListView listView = (ListView) parent;
Bundle bundle = new Bundle();
RecentListItem item = (RecentListItem) listView
.getItemAtPosition(position);
String pathName = item.getPathName();
File file = new File(pathName);
Log.d(TAG, "getAbsolutePath " + file.getAbsolutePath());
// 返回上一级目录
if (!file.exists()) {
// 当前文件找不到
} else {
bundle.putString(EasyViewer.INTENT_KEY_FILE_NAME, pathName);
Log.d(TAG, "openBook = " + pathName);
Intent i = new Intent();
ComponentName comp = new ComponentName(
"com.easyview.ebook.reader.easyviewer",
"com.easyview.ebook.reader.ui.controller.EasyViewer");
i.setComponent(comp);
i.putExtras(bundle);
startActivityForResult(i, ACITVITY_REQUEST_CODE);
}
}
};
private OnClickListener mRefreshLocalListener = new OnClickListener() {
@Override
public void onClick(View v) {
mLocalListView.setVisibility(View.VISIBLE);
mRecentListView.setVisibility(View.INVISIBLE);
refreshLocalList(mScanLocalPath);
}
};
private OnClickListener mRefreshRecentListener = new OnClickListener() {
@Override
public void onClick(View v) {
mLocalListView.setVisibility(View.INVISIBLE);
mRecentListView.setVisibility(View.VISIBLE);
// refresRecentList();
}
};
private void registerMediaReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
filter.addAction(Intent.ACTION_MEDIA_EJECT);
filter.addAction(Intent.ACTION_MEDIA_REMOVED);
filter.addDataScheme("file");
registerReceiver(mMediaReceiver, filter);
}
private void unregisterMediaReceiver() {
unregisterReceiver(mMediaReceiver);
}
private ArrayList<String> scanDirctory(String dirPath) {
File dir = new File(dirPath);
File[] allFiles;
String fileName;
String filePath;
ArrayList<String> fileList = new ArrayList<String>();
if ((dir != null) && dir.exists()) {
allFiles = dir.listFiles();
for (int i = 0; i < allFiles.length; i++) {
if (allFiles[i].isDirectory()) {
filePath = allFiles[i].getAbsolutePath();
fileList.add(filePath);
} else if (allFiles[i].isFile()) {
fileName = allFiles[i].getName().toLowerCase();
// Remove Adobe RMSDK support
if (fileName.endsWith("epub") || fileName.endsWith("fb2")
|| fileName.endsWith("txt")
|| fileName.endsWith("html")
|| fileName.endsWith("htm")) {
filePath = allFiles[i].getAbsolutePath();
fileList.add(filePath);
}
}
}
}
return fileList;
}
private void refreshLocalList(String scanPath) {
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
Log.e(TAG, "SD card is not exist");
return;
}
mScanLocalPath = scanPath;
ArrayList<String> fileList = scanDirctory(scanPath);
mLocalListItems.clear();
// 加入返回上层目录的..路径
if (!scanPath.equals(EXTERNAL_PATH)) {
mLocalListItems.add(new LocalListItem(UP_DIR, scanPath));
}
for (String filePath : fileList) {
String fileName = new File(filePath).getName();
mLocalListItems.add(new LocalListItem(fileName, filePath));
}
mBrowserLocalListAdapter = new BrowserLocalListAdapter(this,
mLocalListItems);
mLocalListView.setAdapter(mBrowserLocalListAdapter);
}
private class RefreshRecentThread extends Thread {
private Handler mHandler;
private Context mContext;
public RefreshRecentThread(Handler handle, Context context) {
mHandler = handle;
}
@Override
public void run() {
mIds = (IDatabaseService) ERManager
.getService(ERManager.DATABASE_SERVICE);
mRecentListItems.clear();
int len = 0;
// 查询文件名
String[] filePaths = mIds.queryBooksPath();
if (filePaths != null) {
len = filePaths.length;
}
for (int i = 0; i < len; i++) {
File file = new File(filePaths[i]);
mRecentListItems.add(new RecentListItem(file.getName(), file.getAbsolutePath(),
"", "", ""));
}
mHandler.sendEmptyMessage(MSG_REFRESH_RECENT_LIST);
// 查询其他信息
ArrayList<RecentListItem> recentListTemp = new ArrayList<FileBrowser.RecentListItem>();
len = 0;
int[] bookIds = mIds.queryBooksId();
if (bookIds != null) {
len = bookIds.length;
}
for (int i = 0; i < len; i++) {
Book book = new Book(bookIds[i]);
if (mIds.queryBook(book)) {
String fileName = book.getBookName();
String filePath = book.getBookPath();
String size = String.format("%.2f KB", (float)(book.getBookSize() / 1000.f));
String perString = book.getLastLocation();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分");
String lastTime = sdf.format(new Date(book.getLastAccessTime()));
recentListTemp.add(new RecentListItem(fileName, filePath,
size, perString, lastTime));
}
}
mRecentListItems = recentListTemp;
mHandler.sendEmptyMessage(MSG_REFRESH_RECENT_LIST);
super.run();
}
}
private void refresRecentList() {
new RefreshRecentThread(mHandler, this).start();
}
private final BroadcastReceiver mMediaReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
refreshLocalList(mScanLocalPath);
}
};
protected class LocalListItem {
String mFileName;
String mPathName;
public LocalListItem(String fileName, String pathName) {
mFileName = fileName;
mPathName = pathName;
}
public String getFileName() {
return mFileName;
}
public String getPathName() {
return mPathName;
}
}
protected class BrowserLocalListAdapter extends BaseAdapter {
LayoutInflater factory;
List<LocalListItem> mListItem;
Drawable mDrawFile;
Drawable mDrawFolder;
Context mContext;
public BrowserLocalListAdapter(Context context,
List<LocalListItem> listItems) {
mListItem = listItems;
mContext = context;
factory = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mDrawFile = context.getResources().getDrawable(R.drawable.file);
mDrawFolder = context.getResources().getDrawable(R.drawable.folder);
}
@Override
public int getCount() {
return mListItem.size();
}
@Override
public Object getItem(int position) {
return mListItem.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
ImageView imageView;
TextView textView;
if (view == null) {
view = factory.inflate(R.layout.browser_file_item, null);
}
LocalListItem item = (LocalListItem) getItem(position);
imageView = (ImageView) view
.findViewById(R.id.id_browser_filetype_image);
textView = (TextView) view.findViewById(R.id.id_browser_filename);
// set content
textView.setText(item.getFileName());
File file = new File(item.getPathName());
if (file.isDirectory()) {
imageView.setBackgroundDrawable(mDrawFolder);
} else {
imageView.setBackgroundDrawable(mDrawFile);
}
return view;
}
}
protected class RecentListItem {
String mFileName;
String mPathName;
String mSize;
String mPercent;
String mLastAccessTime;
public RecentListItem(String fileName, String pathName, String size,
String percent, String lastTime) {
mFileName = fileName;
mPathName = pathName;
mSize = size;
mPercent = percent;
mLastAccessTime = lastTime;
}
public String getFileName() {
return mFileName;
}
public String getPathName() {
return mPathName;
}
public String getSize() {
return mSize;
}
public String getPercent() {
return mPercent;
}
public String getLastTime() {
return mLastAccessTime;
}
}
protected class BrowserRecentListAdapter extends BaseAdapter {
LayoutInflater factory;
List<RecentListItem> mListItem;
Drawable mDrawFile;
Drawable mDrawFolder;
Context mContext;
public BrowserRecentListAdapter(Context context,
List<RecentListItem> listItems) {
mListItem = listItems;
mContext = context;
factory = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mDrawFile = context.getResources().getDrawable(R.drawable.file);
mDrawFolder = context.getResources().getDrawable(R.drawable.folder);
}
@Override
public int getCount() {
return mListItem.size();
}
@Override
public Object getItem(int position) {
return mListItem.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
ImageView imageView;
TextView fileNameTv;
TextView authorTv;
TextView percentAndTimeTv;
if (view == null) {
view = factory.inflate(R.layout.recent_file_item, null);
}
RecentListItem item = (RecentListItem) getItem(position);
imageView = (ImageView) view
.findViewById(R.id.id_recent_filetype_image);
fileNameTv = (TextView) view.findViewById(R.id.id_recent_filename);
authorTv = (TextView) view.findViewById(R.id.id_recent_size);
percentAndTimeTv = (TextView) view
.findViewById(R.id.id_recent_time_and_percent);
// set content
fileNameTv.setText(item.getFileName());
authorTv.setText(String.format("大小: %s", item.getSize()));
String strPercentAndTime = String.format("最后阅读: %s", item.getLastTime());
percentAndTimeTv.setText(strPercentAndTime);
imageView.setBackgroundDrawable(mDrawFile);
return view;
}
}
}