package com.hawkbrowser.app;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.hawkbrowser.R;
import com.hawkbrowser.base.AlertDialogCheck;
import com.hawkbrowser.base.MimeManager;
import com.hawkbrowser.shell.HawkBrowser;
import com.hawkbrowser.util.CommonUtil;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.TabWidget;
import android.widget.TextView;
import android.widget.TabHost.TabSpec;
public class DownloadActivity extends Activity
implements DownloadManager.Listener,
FileListAdapter.Listener, View.OnClickListener {
private static final String DOWNLOAD_TAB_ID = "download";
private static final String FILE_TAB_ID = "file";
private TabHost mTabHost;
private TabWidget mTabWidget;
private File mCurrentFolder;
private DownloadExpListAdapter mDownloadListAdapter;
private FileListAdapter mFileListAdapter;
private DownloadManager mDownloadManager;
private List<DownloadItem> mItemsToBeDelete;
private List<File> mFilesToBeDelete;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.download);
mDownloadManager = HawkBrowser.getDownloadMgr(this);
initLayout();
setupListeners();
loadDownloadItems();
}
private void initLayout() {
mTabHost = (TabHost) findViewById(android.R.id.tabhost);
mTabHost.setup();
mTabWidget = mTabHost.getTabWidget();
TabSpec tabDownload = mTabHost.newTabSpec(DOWNLOAD_TAB_ID);
tabDownload.setContent(R.id.download_download);
Resources rc = getResources();
View vb = getCustomTab(
rc.getString(R.string.download_management), true);
tabDownload.setIndicator(vb);
mTabHost.addTab(tabDownload);
TabSpec tabFile = mTabHost.newTabSpec(FILE_TAB_ID);
View vh = getCustomTab(
rc.getString(R.string.file_management), false);
tabFile.setContent(R.id.download_file);
tabFile.setIndicator(vh);
mTabHost.addTab(tabFile);
}
private void setupListeners() {
mTabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
for(int i = 0; i < mTabWidget.getChildCount(); ++i) {
ViewGroup twChild = (ViewGroup) mTabWidget.getChildAt(i);
View lineView = twChild.findViewById(
R.id.download_custom_tab_line);
if(i != mTabHost.getCurrentTab()) {
lineView.setVisibility(View.INVISIBLE);
} else {
lineView.setVisibility(View.VISIBLE);
}
}
if(tabId.equals(FILE_TAB_ID) && (null == mCurrentFolder)) {
loadFileSystem();
}
boolean toolbarViewEditable = false;
if(tabId.equals(DOWNLOAD_TAB_ID)) {
toolbarViewEditable = mDownloadListAdapter.getEditable();
} else {
toolbarViewEditable = mFileListAdapter.getEditable();
}
refreshToolbarView(toolbarViewEditable);
}
});
View back = mTabHost.findViewById(R.id.download_return);
back.setOnClickListener(this);
View management = mTabHost.findViewById(R.id.download_management);
management.setOnClickListener(this);
View finish = mTabHost.findViewById(R.id.download_finish);
finish.setOnClickListener(this);
View delete = mTabHost.findViewById(R.id.download_deletetask);
delete.setOnClickListener(this);
View clear = mTabHost.findViewById(R.id.download_clear);
clear.setOnClickListener(this);
}
// View.onClickListener
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.download_return:
finish();
return;
case R.id.download_management:
refreshToolbarView(true);
refreshAdapterView(true);
return;
case R.id.download_finish:
refreshToolbarView(false);
refreshAdapterView(false);
return;
case R.id.download_deletetask:
if(mTabHost.getCurrentTabTag().equals(DOWNLOAD_TAB_ID)) {
mItemsToBeDelete = mDownloadListAdapter.getCheckedItems();
deleteDownloadItems();
} else {
mFilesToBeDelete = mFileListAdapter.getCheckedItems();
deleteFiles();
}
return;
case R.id.download_clear:
if(mTabHost.getCurrentTabTag().equals(DOWNLOAD_TAB_ID)) {
mItemsToBeDelete = mDownloadManager.getNonActiveItems();
deleteDownloadItems();
} else {
mFilesToBeDelete = mFileListAdapter.getAllItems();
deleteFiles();
}
return;
}
}
private void deleteDownloadItems() {
AlertDialogCheck dlg = new AlertDialogCheck(
R.string.confirm_delete_task, R.string.ok, R.string.cancel,
new AlertDialogCheck.Listener() {
@Override
public void onClick(boolean isConfirmed,
boolean isChecked) {
// TODO Auto-generated method stub
if(isConfirmed) {
for(DownloadItem item : mItemsToBeDelete) {
mDownloadManager.deleteDownloadItem(item);
if(isChecked) {
File f = new File(item.localFilePath());
f.delete();
}
}
if(isChecked) {
loadFileSystem();
}
loadDownloadItems();
}
}
});
dlg.show(this);
}
private void deleteFiles() {
CommonUtil.showDialog(this, R.string.confirm_delet_file,
R.string.ok, R.string.cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int btn) {
// TODO Auto-generated method stub
if(DialogInterface.BUTTON_POSITIVE == btn) {
for(File f : mFilesToBeDelete) {
CommonUtil.deleteFile(f);
}
loadFileSystem();
}
}
});
}
private void deleteItems() {
if(mTabHost.getCurrentTabTag().equals(DOWNLOAD_TAB_ID)) {
AlertDialogCheck dlg = new AlertDialogCheck(
R.string.confirm_delete_task, R.string.ok, R.string.cancel,
new AlertDialogCheck.Listener() {
@Override
public void onClick(boolean isConfirmed,
boolean isChecked) {
// TODO Auto-generated method stub
if(isConfirmed) {
List<DownloadItem> items =
mDownloadListAdapter.getCheckedItems();
for(DownloadItem item : items) {
mDownloadManager.deleteDownloadItem(item);
if(isChecked) {
File f = new File(item.localFilePath());
f.delete();
}
}
if(isChecked) {
loadFileSystem();
}
loadDownloadItems();
}
}
});
dlg.show(this);
} else {
CommonUtil.showDialog(this, R.string.confirm_delet_file,
R.string.ok, R.string.cancel,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int btn) {
// TODO Auto-generated method stub
if(DialogInterface.BUTTON_POSITIVE == btn) {
for(File f : mFileListAdapter.getCheckedItems()) {
CommonUtil.deleteFile(f);
}
loadFileSystem();
}
}
});
}
}
private void refreshToolbarView(boolean bEditable) {
View toolBarShow = mTabHost.findViewById(R.id.download_show_view);
toolBarShow.setVisibility(bEditable ? View.GONE : View.VISIBLE);
View toolBar = mTabHost.findViewById(R.id.download_management_view);
toolBar.setVisibility(bEditable ? View.VISIBLE : View.GONE);
Button delete = (Button)
mTabHost.findViewById(R.id.download_deletetask);
View reDownload = mTabHost.findViewById(R.id.download_redownload);
if(mTabHost.getCurrentTabTag().equals(DOWNLOAD_TAB_ID)) {
reDownload.setVisibility(View.VISIBLE);
delete.setEnabled(
mDownloadListAdapter.getCheckedItems().size() > 0);
} else {
reDownload.setVisibility(View.INVISIBLE);
delete.setEnabled(
mFileListAdapter.getCheckedItems().size() > 0);
}
}
private void refreshAdapterView(boolean bEditable) {
if(mTabHost.getCurrentTabTag().equals(DOWNLOAD_TAB_ID)) {
mDownloadListAdapter.setEditable(bEditable);
mDownloadListAdapter.notifyDataSetChanged();
} else {
mFileListAdapter.setEditable(bEditable);
mFileListAdapter.setData(mCurrentFolder);
mFileListAdapter.notifyDataSetChanged();
}
}
private View getCustomTab(String title, boolean isSelectable) {
ViewGroup vg = (ViewGroup) LayoutInflater.from(this).inflate(
R.layout.download_custom_tab, null);
TextView titleView = (TextView)
vg.findViewById(R.id.download_custom_tab_title);
titleView.setText(title);
if(!isSelectable) {
View lineView = vg.findViewById(R.id.download_custom_tab_line);
lineView.setVisibility(View.INVISIBLE);
}
return vg;
}
private void loadDownloadItems() {
List<DownloadItem> items = mDownloadManager.getItems();
mDownloadListAdapter = new DownloadExpListAdapter(this, items);
ExpandableListView listView = (ExpandableListView)
mTabHost.findViewById(R.id.download_download);
listView.setGroupIndicator(null);
listView.setAdapter(mDownloadListAdapter);
listView.setOnChildClickListener(mDownloadListAdapter);
if(mDownloadListAdapter.getChildrenCount(0) > 0) {
listView.expandGroup(0);
}
}
private void loadFileSystem() {
if(null == mCurrentFolder) {
mCurrentFolder = new File(CommonUtil.getOurExtDataDir());
}
if(null == mFileListAdapter) {
mFileListAdapter = new FileListAdapter(this, mCurrentFolder);
mFileListAdapter.setListener(this);
ListView listView = (ListView)
mTabHost.findViewById(R.id.download_file);
listView.setAdapter(mFileListAdapter);
listView.setOnItemClickListener(mFileListAdapter);
} else {
mFileListAdapter.setData(mCurrentFolder);
mFileListAdapter.notifyDataSetChanged();
}
}
@Override
public void onProgressUpdate(DownloadItem item) {
mDownloadListAdapter.notifyDataSetChanged();
}
@Override
public void onDownloadFinished(DownloadItem item) {
List<DownloadItem> items = mDownloadManager.getItems();
mDownloadListAdapter.setData(items);
mDownloadListAdapter.notifyDataSetChanged();
// Expand the last group
ExpandableListView listView = (ExpandableListView)
mTabHost.findViewById(R.id.download_download);
listView.expandGroup(mDownloadListAdapter.getGroupCount() - 1);
}
@Override
public void onDownloadStoped(DownloadItem item) {
mDownloadListAdapter.notifyDataSetChanged();
}
public void onDownloadItemClick(DownloadItem item) {
Log.d("download", String.format("onDownloadItemClick: %s, %s",
item.name(), item.status()));
switch(item.status()) {
case FINISHED:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + item.localFilePath()),
"application/vnd.android.package-archive");
startActivity(intent);
break;
case ONPROGRESS:
mDownloadManager.stop(item);
break;
case PAUSED:
mDownloadManager.continueDownload(item);
break;
}
}
@Override
public void onFileItemClick(File file) {
if(null == file) {
// return to parent folder is click
mCurrentFolder = mCurrentFolder.getParentFile();
loadFileSystem();
} else {
if(file.isDirectory()) {
mCurrentFolder = file;
loadFileSystem();
} else {
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(
Uri.parse("file://" + file.getPath()),
MimeManager.instance().getMimeType(file.getPath()));
startActivity(intent);
} catch(ActivityNotFoundException e) {
e.printStackTrace();
CommonUtil.showTips(this, R.string.open_file_no_app);
}
}
}
}
@Override
public void onFileItemChecked(File file) {
refreshToolbarView(true);
}
public void onDownloadItemChecked(DownloadItem item) {
refreshToolbarView(true);
}
protected void onStart() {
super.onStart();
mDownloadManager.setEventListener(this);
}
@Override
protected void onResume() {
super.onResume();
mDownloadManager.setEventListener(this);
}
@Override
protected void onPause() {
super.onPause();
mDownloadManager.setEventListener(null);
}
@Override
protected void onStop() {
super.onStop();
mDownloadManager.setEventListener(null);
}
}