package com.duckduckgo.mobile.android.broadcast;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.annotation.SuppressLint;
import android.app.DownloadManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.util.Log;
import android.widget.Toast;
import com.duckduckgo.mobile.android.R;
import com.duckduckgo.mobile.android.util.DDGUtils;
@SuppressLint("NewApi")
public class DownloadReceiver extends BroadcastReceiver {
protected final String TAG = "DownloadReceiver";
DownloadManager downloadManager = null;
public DownloadReceiver() {
}
public DownloadReceiver(DownloadManager downloadManager) {
this.downloadManager = downloadManager;
}
public void setDownloadManager(DownloadManager downloadManager) {
this.downloadManager = downloadManager;
}
@Override
public void onReceive(Context context, Intent intent) {
if(downloadManager == null) {
downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
}
long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
Uri uri = null;
String mimeType = null;
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) {
uri = downloadManager.getUriForDownloadedFile(downloadId);
mimeType = downloadManager.getMimeTypeForDownloadedFile(downloadId);
}
else {
Cursor c = downloadManager.query(new DownloadManager.Query().setFilterById(downloadId));
if (c.moveToFirst()) {
int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {
mimeType = c.getString(c.getColumnIndex(DownloadManager.COLUMN_MEDIA_TYPE));
String uriString = c.getString(c
.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
uri = Uri.parse(uriString);
}
else {
// download failed somehow, LOG the reason
int columnReason = c.getColumnIndex(DownloadManager.COLUMN_REASON);
int reason = c.getInt(columnReason);
String failedReason = "";
switch(reason){
case DownloadManager.ERROR_CANNOT_RESUME:
failedReason = "ERROR_CANNOT_RESUME";
break;
case DownloadManager.ERROR_DEVICE_NOT_FOUND:
failedReason = "ERROR_DEVICE_NOT_FOUND";
break;
case DownloadManager.ERROR_FILE_ALREADY_EXISTS:
failedReason = "ERROR_FILE_ALREADY_EXISTS";
break;
case DownloadManager.ERROR_FILE_ERROR:
failedReason = "ERROR_FILE_ERROR";
break;
case DownloadManager.ERROR_HTTP_DATA_ERROR:
failedReason = "ERROR_HTTP_DATA_ERROR";
break;
case DownloadManager.ERROR_INSUFFICIENT_SPACE:
failedReason = "ERROR_INSUFFICIENT_SPACE";
break;
case DownloadManager.ERROR_TOO_MANY_REDIRECTS:
failedReason = "ERROR_TOO_MANY_REDIRECTS";
break;
case DownloadManager.ERROR_UNHANDLED_HTTP_CODE:
failedReason = "ERROR_UNHANDLED_HTTP_CODE";
break;
case DownloadManager.ERROR_UNKNOWN:
failedReason = "ERROR_UNKNOWN";
break;
}
Log.v(TAG, "Download fail reason: " + failedReason);
}
}
}
// if download failed somehow, skip content viewing intent
if(uri == null || mimeType == null)
return;
String downPath = null;
{
int idxSlash = mimeType.indexOf('/') + 1;
String ext = "tmp";
if(idxSlash != -1) {
ext = mimeType.substring(idxSlash);
}
FileOutputStream downOutput = null;
downPath = context.getFilesDir().getAbsolutePath() + File.separator + "down." + ext;
try {
downOutput = context.openFileOutput("down."+ext, Context.MODE_WORLD_READABLE);
InputStream in = context.getContentResolver().openInputStream(uri);
byte buf[] = new byte[1024];
int readSize = 0;
// read downloaded file
while ( (readSize = in.read(buf)) != -1 ) {
downOutput.write(buf,0,readSize);
}
downOutput.close();
} catch (FileNotFoundException e1) {
Toast.makeText(context, context.getString(R.string.ErrorDownloadOpenFail), Toast.LENGTH_LONG).show();
e1.printStackTrace();
}
catch (IOException e1) {
Toast.makeText(context, context.getString(R.string.ErrorDownloadOpenFail), Toast.LENGTH_LONG).show();
e1.printStackTrace();
}
}
// intent to view content
Intent viewIntent = new Intent(Intent.ACTION_VIEW);
if(downPath != null) {
viewIntent.setDataAndType(Uri.fromFile(new File(downPath)), mimeType);
}
else {
viewIntent.setDataAndType(uri, mimeType);
}
viewIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
DDGUtils.execIntentIfSafe(context, viewIntent);
}
}