package cn.alphabets.light.ui;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import org.apache.commons.io.FilenameUtils;
import org.json.JSONObject;
import java.io.File;
import java.util.ArrayList;
import cn.alphabets.light.R;
import cn.alphabets.light.application.ABSwipeBackActivity;
import cn.alphabets.light.exception.NetworkException;
import cn.alphabets.light.log.Logger;
import cn.alphabets.light.model.GsonParser;
import cn.alphabets.light.model.ModelFile;
import cn.alphabets.light.network.Parameter;
import cn.alphabets.light.setting.Default;
import cn.alphabets.light.util.FileUtil;
/**
* Created by sh on 15/1/28.
*/
public class FileActivity extends ABSwipeBackActivity {
public static final String VALUE = "value";
public static final String VALUE_TITLE = "value_title";
public static final String LIST = "list";
public static final String TITLE = "title";
public static final String READONLY = "readonly";
public static final String THEME = "theme";
private Menu mMenu;
private FileAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设定Theme,需要在setContentView之前调用
Bundle extras = getIntent().getExtras();
if (extras != null) {
int resourceId = extras.getInt(THEME, 0);
if (resourceId != 0) {
setTheme(resourceId);
}
}
Helper.setNoIconBackActionBar(this, "Edit");
setContentView(R.layout.activity_file);
ArrayList<FileAdapter.FileItem> values = new ArrayList<FileAdapter.FileItem>();
if (extras != null) {
String title = extras.getString(TITLE);
setTitle(title);
if (extras.get(LIST) != null) {
values.addAll((ArrayList<FileAdapter.FileItem>) extras.get(LIST));
}
}
ListView fileList = (ListView) findViewById(R.id.file_list);
mAdapter = new FileAdapter(getApplicationContext(), android.R.layout.simple_list_item_1);
mAdapter.addAll(values);
fileList.setAdapter(mAdapter);
fileList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
final FileAdapter.FileItem item = mAdapter.getItem(i);
if (item.file != null) {
FileUtil.openFile(FileActivity.this, item.file);
} else {
final ProgressBar loading = (ProgressBar) view.findViewById(R.id.loading);
final ImageView downloadOrView = (ImageView) view.findViewById(R.id.download_view);
loading.setVisibility(View.VISIBLE);
downloadOrView.setVisibility(View.GONE);
DownloadTask task = new DownloadTask();
task.listener = new FileAdapter.LoadFileListener() {
@Override
public void onResult(File file) {
loading.setVisibility(View.GONE);
downloadOrView.setVisibility(View.VISIBLE);
downloadOrView.setImageDrawable(getResources().getDrawable(R.drawable.icon_view));
item.file = file;
FileUtil.openFile(FileActivity.this, item.file);
}
};
final String fileEnding = FilenameUtils.getExtension(item.fileName);
if (!"".equals(fileEnding)) {
task.execute(item.fileUrl, new File(FileUtil.getCacheDir(), item.fileUrl + "." + fileEnding).getAbsolutePath());
} else {
task.execute(item.fileUrl, new File(FileUtil.getCacheDir(), item.fileUrl).getAbsolutePath());
}
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean isReadOnly = getIntent().getExtras().getBoolean(READONLY);
if (!isReadOnly) {
MenuItem item = menu.add(Menu.NONE, android.R.id.edit, 1, "Add");
item.setIcon(R.drawable.tool_plus_white);
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
}
this.mMenu = menu;
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
// 返回
if (id == android.R.id.home) {
ArrayList<String> files = new ArrayList<>();
ArrayList<String> titles = new ArrayList<>();
for (int i = 0; i < mAdapter.getCount(); i++) {
files.add(mAdapter.getItem(i).fileUrl);
titles.add(mAdapter.getItem(i).fileName);
}
Intent data = new Intent();
data.putStringArrayListExtra(VALUE, files);
data.putStringArrayListExtra(VALUE_TITLE, titles);
setResult(RESULT_OK, data);
onBackPressed();
return true;
}
// 添加
if (id == android.R.id.edit) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("*/*");
intent.addCategory(Intent.CATEGORY_OPENABLE);
try {
startActivityForResult(Intent.createChooser(intent, getResources().getString(R.string.select_file)), 0);
} catch (android.content.ActivityNotFoundException ex) {
Dialog.toast(R.string.select_file_error);
}
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
Uri uri = data.getData();
String path = FileUtil.getFileAbsolutePath(this, uri);
if (path != null) {
final File file = new File(path);
UPLOAD(Default.UrlSendFile, new Parameter().put(path, file), new Success() {
@Override
public void onResponse(JSONObject response) {
GsonParser<ModelFile> files = GsonParser.fromJson(response, ModelFile.getListTypeToken());
String fileId = files.getData().getItems().get(0).get_id();
mAdapter.add(new FileAdapter.FileItem(file.getName(), fileId, file));
mAdapter.notifyDataSetChanged();
}
});
}
}
}
/**
* 文件下载器
*/
private static class DownloadTask extends AsyncTask<String, Void, Void> {
public FileAdapter.LoadFileListener listener;
private File result;
@Override
protected Void doInBackground(String... params) {
try {
this.result = new File(params[1]);
if (!this.result.exists()) {
FileUtil.downloadFile(params[0], new File(params[1]));
}
} catch (NetworkException e) {
Logger.e(e);
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
listener.onResult(this.result);
}
}
}