package com.yamin.reader.activity;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import org.geometerplus.android.fbreader.libraryService.BookCollectionShadow;
import org.geometerplus.fbreader.fbreader.FBReaderApp;
import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import android.app.ActionBar;
import android.app.Activity;
import android.app.SearchManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;
import com.yamin.reader.R;
import com.yamin.reader.adapter.FileListAdapter;
import com.yamin.reader.database.DbDataOperation;
import com.yamin.reader.database.DbTags;
import com.yamin.reader.model.Book;
import com.yamin.reader.model.FileItem;
import com.yamin.reader.utils.ToolUtils;
import com.yamin.reader.view.LoadingDialog;
public class FileBrowserActivity extends Activity implements
View.OnClickListener{
/** Called when the activity is first created. */
private ArrayList<FileItem> items;
private ArrayList<String> searchitems;
private FileListAdapter adapter;
private File current_dir;
private ListView lvFiles;
private TextView pathTextView;
private ImageView upImage;
private static LoadingDialog loadDialog;
private PopupWindow mPopuwindow;
private LinearLayout openFileBtn;
private LinearLayout shelfFileBtn;
private LinearLayout favoriteFileBtn;
private FBReaderApp myFBReaderApp;
private ContentResolver resolver;
private final String ROOT_PATH = Environment.getExternalStorageDirectory()
.getPath();
// private LinearLayout empty_viewLayout;
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
showLoading(FileBrowserActivity.this, "搜索中...");
break;
case 1:
stopLoading();
if (searchitems != null && searchitems.size() > 0) {
Intent i = new Intent(FileBrowserActivity.this,
FileSearchResultActivity.class);
i.putStringArrayListExtra("SEARCH_LIST", searchitems);
startActivity(i);
} else {
Toast.makeText(FileBrowserActivity.this, "未匹配到文件!",
Toast.LENGTH_LONG).show();
}
break;
//
default:
break;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar bar = this.getActionBar();
bar.setDisplayShowTitleEnabled(true);
bar.setDisplayHomeAsUpEnabled(true);
bar.setDisplayShowHomeEnabled(true);
bar.setTitle(R.string.book_file_manager);
setContentView(R.layout.file_list);
resolver=getContentResolver();
myFBReaderApp = (FBReaderApp) FBReaderApp.Instance();
if (myFBReaderApp == null) {
myFBReaderApp = new FBReaderApp(FileBrowserActivity.this,
new BookCollectionShadow());
}
getCollection().bindToService(this, null);
searchitems = new ArrayList<String>();
lvFiles = (ListView) findViewById(R.id.file_path_list);
pathTextView = (TextView) findViewById(R.id.current_path_view);
upImage = (ImageView) findViewById(R.id.path_pane_up_level);
// empty_viewLayout=(LinearLayout)findViewById(R.id.empty_view);
//
browseTo(new File(ROOT_PATH));
adapter = new FileListAdapter(this, items);
lvFiles.setAdapter(adapter);
addListener();
handleIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
// Because this activity has set launchMode="singleTop", the system
// calls this method
// to deliver the intent if this actvity is currently the foreground
// activity when
// invoked again (when the user executes a search from this activity, we
// don't create
// a new instance of this activity, so the system delivers the search
// intent here)
handleIntent(intent);
}
private void handleIntent(Intent intent) {
if (Intent.ACTION_VIEW.equals(intent.getAction())) {
// handles a click on a search suggestion; launches activity to show
// word
// Intent wordIntent = new Intent(this, WordActivity.class);
// wordIntent.setData(intent.getData());
// startActivity(wordIntent);
// finish();
} else if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
// handles a search query
String pattern = intent.getStringExtra(SearchManager.QUERY);
showQuery(pattern);
}
}
//
private void showQuery(String query) {
Message message = new Message();
message.what = 0;
mHandler.sendMessage(message);
new searchThread(query).start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.bookfile_menu, menu);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(
R.id.menu_file_search).getActionView();
searchView.setSearchableInfo(searchManager
.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(true);
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_file_search:
onSearchRequested();
return true;
case android.R.id.home:
Intent i = new Intent(this, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
return true;
default:
return false;
}
}
private void addListener() {
upImage.setOnClickListener(this);
lvFiles.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view,
int position, long arg3) {
//
FileItem fi = (FileItem) adapter.getItem(position);
String fileName = fi.getFileName();
File file = new File(current_dir, fileName);
Log.i("life", file.getAbsolutePath());
if (isValidFileOrDir(file)) {
showPopupWindow(view,position);
} else {
browseTo(new File(current_dir, fileName));
}
}
});
}
private boolean isValidFileOrDir(File file) {
if (file.isDirectory()) {
return false;
} else {
String fileName = file.getName().toLowerCase();
if (fileName.endsWith(".txt") || fileName.endsWith(".html")
|| fileName.endsWith(".mobi") || fileName.endsWith(".oeb")
|| fileName.endsWith(".epub") || fileName.endsWith(".fb2")) {
return true;
}
}
return false;
}
//
private void browseUpLevel() {
if (current_dir.getParent() != null
&& !current_dir.getParent().equals("/")) {
browseTo(current_dir.getParentFile());
}
}
private void browseTo(File dir) {
if (dir.isDirectory()) {
pathTextView.setText(dir.getAbsolutePath());
this.current_dir = dir;
fill(current_dir.listFiles());
}
}
private void fill(File[] files) {
//
if (items == null) {
items = new ArrayList<FileItem>();
}
//
items.clear();
Resources res = getResources();
if (files != null) {
for (File file : files) {
//
String fileName = file.getName().toLowerCase();
Drawable icon = null;
if (file.isDirectory()) {
icon = res.getDrawable(R.drawable.folder);
FileItem item = new FileItem(fileName, icon,
file.getAbsolutePath(),
ToolUtils.FormetFileSize(file.length()));
items.add(item);
} else {
if (ToolUtils.checkEnd(fileName,
res.getStringArray(R.array.epubFile))) {
icon = res.getDrawable(R.drawable.file_epub);
} else if (ToolUtils.checkEnd(fileName,
res.getStringArray(R.array.webFile))) {
icon = res.getDrawable(R.drawable.file_html);
} else if (ToolUtils.checkEnd(fileName,
res.getStringArray(R.array.txtFile))) {
icon = res.getDrawable(R.drawable.file_txt);
} else if (ToolUtils.checkEnd(fileName,
res.getStringArray(R.array.oebFile))) {
icon = res.getDrawable(R.drawable.file_oeb);
} else if (ToolUtils.checkEnd(fileName,
res.getStringArray(R.array.mobiFile))) {
icon = res.getDrawable(R.drawable.file_mobi);
}
if (isValidFileOrDir(file)) {
FileItem item = new FileItem(fileName, icon,
file.getAbsolutePath(),
ToolUtils.FormetFileSize(file.length()));
items.add(item);
}
}
}
}
if (adapter != null)
adapter.dataChanged(items);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.path_pane_up_level:
browseUpLevel();
break;
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
if (keyCode == KeyEvent.KEYCODE_BACK) {
//
if (current_dir.getParent().equals("/")) {
finish();
} else {
browseUpLevel();
}
}
return false;
}
// 递归扫描文件夹
public void GetFiles(File filePath, String query) {
File[] files = filePath.listFiles();
if (files != null) {
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
GetFiles(files[i], query);
} else {
if (files[i].getName().toLowerCase().contains(query)) {
searchitems.add(files[i].getAbsolutePath());
Log.i("MAIN", files[i].getPath());
}
}
}
}
}
class searchThread extends Thread {
String query;
public searchThread(String query) {
this.query = query;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
File f = new File(ROOT_PATH);
GetFiles(f, query);
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message);
}
}
/*
*
*/
public static void showLoading(Activity activity, String msg) {
if (loadDialog == null) {
loadDialog = LoadingDialog.createDialog(activity, msg);
loadDialog.setCanceledOnTouchOutside(false);
}
loadDialog.show();
}
private static void stopLoading() {
if (loadDialog != null) {
loadDialog.dismiss();
loadDialog = null;
}
}
/*
* @弹出POPU MENU
*/
public void showPopupWindow(View v,int position) {
final int p=position;
LinearLayout layout = (LinearLayout) LayoutInflater.from(this).inflate(
R.layout.file_item_menu, null);
mPopuwindow = new PopupWindow(layout,
ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
openFileBtn = (LinearLayout) layout.findViewById(R.id.openFileBtn);
shelfFileBtn = (LinearLayout) layout.findViewById(R.id.shelfFileBtn);
favoriteFileBtn = (LinearLayout) layout.findViewById(R.id.favoriteFileBtn);
openFileBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ZLFile file = ZLFile.createFileByPath(items.get(p).getFilepath());
org.geometerplus.fbreader.book.Book book = getCollection().getBookByFile(file);
if (book != null) {
CoreReadActivity.openBookActivity(FileBrowserActivity.this, book, null);
FileBrowserActivity.this.overridePendingTransition(R.anim.activity_enter,
R.anim.activity_exit);
FileBrowserActivity.this.finish();
}
}
});
shelfFileBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String filename = items.get(p).getFileName();
String filepath = items.get(p).getFilepath();
// Local Book---Easy Book
Book book = new Book();
book.setBookName(filename);
book.setBookPath(filepath);
book.setBookSize(items.get(p).getFilesize());
Book b = DbDataOperation.queryBook(resolver,DbTags.FIELD_BOOK_NAME,filename);
if (b == null) {
DbDataOperation.insertToBookInfo(resolver, book);
Toast.makeText(FileBrowserActivity.this, "成功添加到书架", Toast.LENGTH_LONG).show();
}
}
});
favoriteFileBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String filename = items.get(p).getFileName();
String filepath = items.get(p).getFilepath();
// Local Book---Easy Book
Book book = new Book();
book.setBookName(filename);
book.setBookPath(filepath);
book.setBookProgress("00%");
book.setBookSize(items.get(p).getFilesize());
Date date=new Date();
//
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String bookAddTime=formatter.format(date);
book.setBookAddTime(bookAddTime);
Book b = DbDataOperation.queryBookFav(resolver,DbTags.FIELD_BOOK_NAME,filename);
if (b == null) {
DbDataOperation.insertToBookFav(resolver, book);
Toast.makeText(FileBrowserActivity.this, "成功收藏!", Toast.LENGTH_LONG).show();
}
}
});
ColorDrawable cd = new ColorDrawable(-0000);
mPopuwindow.setBackgroundDrawable(cd);
mPopuwindow.setBackgroundDrawable(cd);
mPopuwindow.setOutsideTouchable(true);
mPopuwindow.setFocusable(true);
// showAsDropDown会把里面的view作为参照物,所以要那满屏幕parent
// popupWindow.showAsDropDown(findViewById(R.id.tv_title), x, 10);
mPopuwindow.showAsDropDown(v);
}
private BookCollectionShadow getCollection() {
return (BookCollectionShadow) myFBReaderApp.Collection;
}
@Override
protected void onDestroy() {
getCollection().unbind();
Log.i("MAIN", "onDestroy()");
if(mPopuwindow!=null&&mPopuwindow.isShowing()){
mPopuwindow.dismiss();
}
super.onDestroy();
}
}