blob: a8a7d9a719b2bd72d18ffe5b508532caebac2d5d [file] [log] [blame]
package com.android.pmc;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.PowerManager;
import android.os.SystemClock;
import android.util.Log;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* Call wifi Download data whenever an alarm is received.
*/
public class WifiDownloadReceiver extends BroadcastReceiver {
private static final int DOWNLOAD_BUFFER_SIZE = 1024 * 4;
DownloadTask mDownloadTask;
PMCMainActivity mPMCMainActivity;
int mFileCount;
int mBytesCount;
long mDownloadStartTime;
String mDownloadURL;
private Context mContext;
private PowerManager.WakeLock mWakeLock;
private int mAlarmInterval;
private AlarmManager mAlarmManager;
private PendingIntent mAlarmIntent;
public WifiDownloadReceiver(PMCMainActivity activity, String url, int interval,
AlarmManager alarmManager, PendingIntent alarmIntent) {
mPMCMainActivity = activity;
mDownloadURL = url;
mFileCount = 0;
mBytesCount = 0;
mDownloadStartTime = -1;
mAlarmInterval = interval;
mAlarmManager = alarmManager;
mAlarmIntent = alarmIntent;
}
@Override
public void onReceive(Context context, Intent intent) {
if (mDownloadTask != null && mDownloadTask.getStatus() != AsyncTask.Status.FINISHED) {
Log.e(PMCMainActivity.TAG, "Previous download still running.");
try {
mDownloadTask.get();
} catch (Exception e) {
Log.e(PMCMainActivity.TAG, "Download cancelled.");
}
} else {
mContext = context;
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WIFITEST");
// Acquire the lock
mWakeLock.acquire();
Log.i(PMCMainActivity.TAG, "Starting Download Task");
mDownloadTask = new DownloadTask();
mDownloadTask.execute(mDownloadURL);
}
scheduleDownload();
}
/**
* Schedule the next download.
*/
public void scheduleDownload() {
if (mDownloadStartTime == -1) {
// Note down the start of all download activity
mDownloadStartTime = System.currentTimeMillis();
}
Log.i(PMCMainActivity.TAG, "Scheduling the next download after " + mAlarmInterval);
mAlarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + mAlarmInterval, mAlarmIntent);
}
/**
* Cancel the downloads.
*/
public void cancelDownload() {
mAlarmManager.cancel(mAlarmIntent);
if (mDownloadTask != null) mDownloadTask.cancel(true);
}
/**
* Returns an approximate data rate at which we're downloading the files.
* @return
*/
public int getDownloadRate() {
long durationInMilliSeconds = (System.currentTimeMillis() - mDownloadStartTime);
int durationInSeconds = (int) (durationInMilliSeconds / 1000);
return (mBytesCount / durationInSeconds);
}
class DownloadTask extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... sUrl) {
//android.os.Debug.waitForDebugger();
Log.d(PMCMainActivity.TAG, "Starting background task for downloading file");
HttpURLConnection connection = null;
try {
URL url = new URL(sUrl[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
// expect HTTP 200 OK, so we don't mistakenly save error report
// instead of the file
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
return "Server returned HTTP " + connection.getResponseCode()
+ " " + connection.getResponseMessage();
}
// this will be useful to display download percentage
// might be -1: server did not report the length
int fileLength = connection.getContentLength();
int bytesRead = downloadFile(connection);
if (fileLength != bytesRead) {
return "Expected file of size " + fileLength + " but only received "
+ bytesRead;
}
Log.d(PMCMainActivity.TAG, "Downloaded file size " + fileLength);
mFileCount += 1;
mBytesCount += fileLength;
publishProgress(mFileCount, getDownloadRate());
Thread.sleep(10000);
} catch (Exception e) {
Log.e(PMCMainActivity.TAG, e.toString());
return e.toString();
} finally {
if (connection != null) {
connection.disconnect();
}
}
return null;
}
@Override
protected void onCancelled(String result) {
mWakeLock.release();
}
@Override
protected void onProgressUpdate(Integer... values) {
Log.d(PMCMainActivity.TAG, "DownloadTask onProgressUpdate updating the UI");
mPMCMainActivity.updateProgressStatus("Total file downloaded :: "
+ values[0].toString() + ", Data rate :: "
+ values[1].toString() + " bytes/sec");
}
@Override
protected void onPostExecute(String error) {
if (error != null) {
Log.e(PMCMainActivity.TAG, error);
mPMCMainActivity.updateProgressStatus(error);
}
mWakeLock.release();
}
private int downloadFile(HttpURLConnection connection) {
if (connection == null) return -1;
int totalBytesRead = 0;
InputStream inputStream = null;
// Just read out the input file, not saving it anywhere in the device
try {
inputStream = connection.getInputStream();
int bytesRead = -1;
byte[] buffer = new byte[DOWNLOAD_BUFFER_SIZE];
while ((bytesRead = inputStream.read(buffer)) != -1) {
totalBytesRead += bytesRead;
}
} catch (Exception e) {
Log.e(PMCMainActivity.TAG, "Downloaded failed");
} finally {
try {
if (inputStream != null) inputStream.close();
} catch (Exception e) {
Log.e(PMCMainActivity.TAG, "Downloaded close failed");
}
}
return totalBytesRead;
}
}
}