First draft at downloading files on demand (untested)

pull/14/head
Sam Bosley 12 years ago
parent d3ec65837b
commit 50d249dd53

@ -1,11 +1,17 @@
package com.todoroo.astrid.files;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.text.TextUtils;
@ -24,7 +30,6 @@ import com.todoroo.aacenc.RecognizerApi;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.service.Autowired;
import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Query;
import com.todoroo.andlib.utility.AndroidUtilities;
import com.todoroo.andlib.utility.DateUtilities;
@ -76,8 +81,7 @@ public class FilesControlSet extends PopupControlSet {
public void refreshMetadata() {
TodorooCursor<Metadata> cursor = metadataService.query(
Query.select(Metadata.PROPERTIES)
.where(Criterion.and(MetadataCriteria.byTaskAndwithKey(model.getId(), FileMetadata.METADATA_KEY),
FileMetadata.FILE_PATH.isNotNull())));
.where(MetadataCriteria.byTaskAndwithKey(model.getId(), FileMetadata.METADATA_KEY)));
try {
files.clear();
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
@ -142,7 +146,15 @@ public class FilesControlSet extends PopupControlSet {
private void setupFileClickListener(View view, final Metadata m) {
String fileType = m.getValue(FileMetadata.FILE_TYPE);
final String filePath = m.getValue(FileMetadata.FILE_PATH);
if (FileMetadata.FILE_TYPE_AUDIO.equals(fileType)) {
if (TextUtils.isEmpty(filePath)) {
DialogUtilities.okCancelDialog(activity, activity.getString(R.string.file_download_title),
activity.getString(R.string.file_download_body), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int which) {
downloadFile(m);
}
}, null);
} else if (FileMetadata.FILE_TYPE_AUDIO.equals(fileType)) {
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
@ -178,6 +190,92 @@ public class FilesControlSet extends PopupControlSet {
}
}
@SuppressWarnings("nls")
private void downloadFile(final Metadata m) {
final ProgressDialog pd = new ProgressDialog(activity);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage(activity.getString(R.string.file_download_progress));
pd.setMax(100);
new Thread() {
@Override
public void run() {
String urlString = m.getValue(FileMetadata.URL);
String name;
if (urlString.endsWith("/"))
urlString = urlString.substring(0, urlString.length() - 1);
int lastComponent = urlString.lastIndexOf('/');
if (lastComponent > 0)
name = urlString.substring(lastComponent + 1);
else
name = urlString;
StringBuilder filePathBuilder = new StringBuilder();
filePathBuilder.append(activity.getExternalFilesDir(FileMetadata.FILES_DIRECTORY).toString())
.append(File.separator)
.append(name);
File file = new File(filePathBuilder.toString());
try {
file.createNewFile();
} catch (IOException e) {
pd.dismiss();
Toast.makeText(activity, R.string.file_err_download, Toast.LENGTH_LONG);
return;
}
try {
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.connect();
FileOutputStream fileOutput = new FileOutputStream(file);
InputStream inputStream = urlConnection.getInputStream();
int totalSize = urlConnection.getContentLength();
int downloadedSize = 0;
byte[] buffer = new byte[1024];
int bufferLength = 0; //used to store a temporary size of the buffer
while ((bufferLength = inputStream.read(buffer)) > 0 ) {
fileOutput.write(buffer, 0, bufferLength);
downloadedSize += bufferLength;
int progress = (int) (downloadedSize*100/totalSize);
pd.setProgress(progress);
}
fileOutput.flush();
fileOutput.close();
m.setValue(FileMetadata.FILE_PATH, file.getAbsolutePath());
metadataService.save(m);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
refreshMetadata();
}
});
} catch (Exception e) {
e.printStackTrace();
file.delete();
Toast.makeText(activity, R.string.file_err_download, Toast.LENGTH_LONG);
} finally {
pd.dismiss();
}
}
}.start();
}
private void setUpFileRow(Metadata m, View row, LinearLayout parent, LayoutParams lp) {
TextView nameView = (TextView) row.findViewById(R.id.file_text);
TextView typeView = (TextView) row.findViewById(R.id.file_type);
@ -194,8 +292,14 @@ public class FilesControlSet extends PopupControlSet {
}
private String getNameString(Metadata metadata) {
File f = new File(metadata.getValue(FileMetadata.FILE_PATH));
String name = f.getName();
String path = metadata.getValue(FileMetadata.FILE_PATH);
String name;
if (TextUtils.isEmpty(path)) {
name = metadata.getValue(FileMetadata.URL);
} else {
File f = new File(path);
name = f.getName();
}
if (name.matches("\\d+_\\d+_\\w+.\\w+")) { //$NON-NLS-1$
Date date = new Date(metadata.getValue(FileMetadata.ATTACH_DATE));

@ -22,6 +22,10 @@
<string name="file_browser_err_permissions">Permissions error! Please make sure you have not blocked Astrid from accessing the SD card.</string>
<string name="file_add_picture">Attach a picture</string>
<string name="file_add_sdcard">Attach a file from your SD card</string>
<string name="file_download_title">Download file?</string>
<string name="file_download_body">This file has not been downloaded to your SD card. Download now?</string>
<string name="file_download_progress">Downloading...</string>
<string name="file_err_memory">Image is too large to fit in memory</string>
<string name="file_err_copy">Error copying file for attachment</string>
<string name="file_err_download">Error downloading file</string>
</resources>

Loading…
Cancel
Save