diff --git a/astrid/plugin-src/com/todoroo/astrid/files/FilesControlSet.java b/astrid/plugin-src/com/todoroo/astrid/files/FilesControlSet.java index 40a03a829..f37c0fe8b 100644 --- a/astrid/plugin-src/com/todoroo/astrid/files/FilesControlSet.java +++ b/astrid/plugin-src/com/todoroo/astrid/files/FilesControlSet.java @@ -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 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)); diff --git a/astrid/res/values/strings-premium.xml b/astrid/res/values/strings-premium.xml index fa1f22b3e..bd9831eff 100644 --- a/astrid/res/values/strings-premium.xml +++ b/astrid/res/values/strings-premium.xml @@ -22,6 +22,10 @@ Permissions error! Please make sure you have not blocked Astrid from accessing the SD card. Attach a picture Attach a file from your SD card + Download file? + This file has not been downloaded to your SD card. Download now? + Downloading... Image is too large to fit in memory Error copying file for attachment + Error downloading file