blob: 15aeb1199e9634c624b790564ada176b0ee0e369 [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.content.IntentFilter;
import android.net.wifi.WifiManager;
import android.os.AsyncTask;
import android.os.PowerManager;
import android.os.SystemClock;
import android.util.Log;
/**
* Call wifi scan whenever an alarm is received.
*/
public class WifiConnScanReceiver extends BroadcastReceiver {
int mScanCount = 0;
ConnectvityScanTask mConnScanTask;
PMCMainActivity mPMCMainActivity;
private WifiManager mWifiManager;
private Context mContext;
private PowerManager.WakeLock mWakeLock;
private int mAlarmInterval;
private AlarmManager mAlarmManager;
private PendingIntent mAlarmIntent;
public WifiConnScanReceiver(PMCMainActivity activity, int interval, AlarmManager alarmManager,
PendingIntent alarmIntent) {
mPMCMainActivity = activity;
mScanCount = 0;
mAlarmInterval = interval;
mAlarmManager = alarmManager;
mAlarmIntent = alarmIntent;
}
@Override
public void onReceive(Context context, Intent intent) {
if (mConnScanTask != null && mConnScanTask.getStatus() != AsyncTask.Status.FINISHED) {
Log.e(PMCMainActivity.TAG, "Previous connection scan still running.");
try {
mConnScanTask.get();
} catch (Exception e) {
Log.e(PMCMainActivity.TAG, "Connection scan 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();
mWifiManager = (WifiManager) context.getApplicationContext()
.getSystemService(Context.WIFI_SERVICE);
Log.i(PMCMainActivity.TAG, "Starting Connectivity Scan Task");
mConnScanTask = new ConnectvityScanTask();
mConnScanTask.execute();
}
scheduleConnScan();
}
/**
* Schedule the next connectivity scan.
*/
public void scheduleConnScan() {
Log.i(PMCMainActivity.TAG, "Scheduling the next conn scan after " + mAlarmInterval);
mAlarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + mAlarmInterval, mAlarmIntent);
}
/**
* Cancel the connectivity scans.
*/
public void cancelConnScan() {
mAlarmManager.cancel(mAlarmIntent);
if (mConnScanTask != null) mConnScanTask.cancel(true);
}
class ConnectvityScanTask extends AsyncTask<Integer, Integer, String> {
WifiScanReceiver mWifiScanReceiver;
Boolean mScanCompleted = false;
ConnectvityScanTask() {
mWifiScanReceiver = new WifiScanReceiver();
mContext.getApplicationContext().registerReceiver(mWifiScanReceiver,
new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
}
@Override
protected String doInBackground(Integer... stime) {
//android.os.Debug.waitForDebugger();
int waitCount = 0;
try {
mScanCompleted = false;
mWifiManager.startScan();
while (!mScanCompleted) {
if (waitCount >= 100) {
return "Timeout, scan results avaiable action didn't triggered";
} else {
Thread.sleep(100);
waitCount += 1;
}
}
waitCount = 0;
mScanCount += 1;
Log.d(PMCMainActivity.TAG, "Number of scan completed " + mScanCount);
publishProgress(mScanCount);
} catch (Exception e) {
Log.e(PMCMainActivity.TAG, e.toString());
return e.toString();
}
return null;
}
@Override
protected void onCancelled(String result) {
mContext.getApplicationContext().unregisterReceiver(mWifiScanReceiver);
mWakeLock.release();
}
@Override
protected void onProgressUpdate(Integer... values) {
Log.d(PMCMainActivity.TAG, "ConnectvityScanTask onProgressUpdate updating the UI");
mPMCMainActivity.updateProgressStatus("Total Connectivity scan completed :: "
+ Integer.toString(values[0].intValue()));
}
@Override
protected void onPostExecute(String error) {
if (error != null) {
Log.e(PMCMainActivity.TAG, error);
mPMCMainActivity.updateProgressStatus(error);
}
mContext.getApplicationContext().unregisterReceiver(mWifiScanReceiver);
mWakeLock.release();
}
class WifiScanReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context c, Intent intent) {
String action = intent.getAction();
if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
Log.d(PMCMainActivity.TAG, "Wifi connection scan finished, results available.");
mScanCompleted = true;
}
}
}
}
}