package mil.nga.dice.report; import android.app.Activity; import android.net.Uri; import android.os.AsyncTask; import android.util.Log; import android.webkit.URLUtil; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; /** * */ public class DownloadReportTask extends AsyncTask<String, Integer, Void> { private Report mReport; private Activity mActivity; private ReportImportCallbacks mCallbacks; private Uri mReportZipPath; public DownloadReportTask(Report report, Activity activity, ReportImportCallbacks callbacks) { mReport = report; mActivity = activity; mCallbacks = callbacks; } @Override protected Void doInBackground(String ...params) { InputStream inputStream = null; OutputStream outputStream = null; HttpURLConnection connection = null; try { URL url = new URL(params[0]); connection = (HttpURLConnection)url.openConnection(); connection.connect(); if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) { mCallbacks.downloadError(mReport, "Unexpected response from server: " + connection.getResponseCode() + " " + connection.getResponseMessage()); } // this can be -1 if the server doesn't report content length int fileLength = connection.getContentLength(); inputStream = connection.getInputStream(); String filename = URLUtil.guessFileName(params[0], connection.getHeaderField("Content-Disposition"), connection.getHeaderField("MIMEType")); mReportZipPath = Uri.fromFile(new File(ReportUtils.getReportDirectory() + "/" + filename)); outputStream = new FileOutputStream(ReportUtils.getReportDirectory() + "/" + filename); byte data[] = new byte[4096]; long total = 0; int count; while ((count = inputStream.read(data)) != -1) { total += count; if (fileLength > 0 && total % 100 == 0) { double percent = (((double)total / (double)fileLength) * 100); Integer percentComplete = (int)percent; publishProgress(percentComplete); } outputStream.write(data, 0, count); } } catch (Exception e) { Log.e("DownloadReportTask", e.getLocalizedMessage()); mCallbacks.downloadError(mReport, e.getLocalizedMessage()); } return null; } @Override protected void onProgressUpdate(Integer... values) { mCallbacks.downloadProgressPercentage(mReport, values[0]); } protected void onPostExecute(Void nothing) { mCallbacks.downloadComplete(mReport, mActivity, mReportZipPath); } }