blob: 0a1196f8a7209be3267961325df98d8873fac925 [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.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiScanner;
import android.net.wifi.WifiScanner.ScanData;
import android.net.wifi.WifiScanner.ScanSettings;
import android.os.AsyncTask;
import android.os.PowerManager;
import android.os.SystemClock;
import android.util.Log;
/**
* Call wifi Gscan whenever an alarm is received.
*/
public class WifiGScanReceiver extends BroadcastReceiver {
int mScanCount = 0;
GScanTask mGScanTask;
PMCMainActivity mPMCMainActivity;
private WifiManager mWifiManager;
private Context mContext;
private PowerManager.WakeLock mWakeLock;
private WifiScanner mScan;
private ScanSettings mScanSettings;
private int mAlarmInterval;
private AlarmManager mAlarmManager;
private PendingIntent mAlarmIntent;
public WifiGScanReceiver(PMCMainActivity activity, ScanSettings settings, int interval,
AlarmManager alarmManager, PendingIntent alarmIntent) {
mPMCMainActivity = activity;
mScanSettings = settings;
mScanCount = 0;
mAlarmInterval = interval;
mAlarmManager = alarmManager;
mAlarmIntent = alarmIntent;
}
@Override
public void onReceive(Context context, Intent intent) {
if (mGScanTask != null && mGScanTask.getStatus() != AsyncTask.Status.FINISHED) {
Log.e(PMCMainActivity.TAG, "Previous Gscan still running.");
try {
mGScanTask.get();
} catch (Exception e) {
Log.e(PMCMainActivity.TAG, "Gscan 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();
mScan = (WifiScanner) context.getSystemService(Context.WIFI_SCANNING_SERVICE);
Log.i(PMCMainActivity.TAG, "Starting GScan Task");
mGScanTask = new GScanTask();
mGScanTask.execute(mScanSettings);
}
scheduleGscan();
}
/**
* Schedule the next Gscan.
*/
public void scheduleGscan() {
Log.i(PMCMainActivity.TAG, "Scheduling the next gscan after " + mAlarmInterval);
mAlarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + mAlarmInterval, mAlarmIntent);
}
/**
* Cancel the Gscans.
*/
public void cancelGScan() {
mAlarmManager.cancel(mAlarmIntent);
if (mGScanTask != null) mGScanTask.cancel(true);
}
class GScanTask extends AsyncTask<ScanSettings, Integer, String> {
WifiScanListener mWifiScanListener;
Boolean mScanCompleted = false;
GScanTask() {
mWifiScanListener = new WifiScanListener();
}
@Override
protected String doInBackground(ScanSettings... settings) {
//android.os.Debug.waitForDebugger();
Log.d(PMCMainActivity.TAG, "Starting background task for gscan with channel");
int waitCount = 0;
try {
mScanCompleted = false;
mScan.startBackgroundScan(settings[0], mWifiScanListener);
while (!mScanCompleted) {
if (waitCount >= 100) {
return "Timeout, scan results avaiable action didn't triggered";
} else {
Thread.sleep(100);
waitCount += 1;
}
}
mScanCount += 1;
waitCount = 0;
Log.d(PMCMainActivity.TAG, "Number of scan completed " + mScanCount);
publishProgress(mScanCount);
} catch (Exception e) {
Log.e(PMCMainActivity.TAG, e.toString());
return e.toString();
} finally {
mScan.stopBackgroundScan(mWifiScanListener);
}
return null;
}
@Override
protected void onCancelled(String result) {
mWakeLock.release();
}
@Override
protected void onProgressUpdate(Integer... values) {
Log.d(PMCMainActivity.TAG, "GScanTask onProgressUpdate updating the UI");
mPMCMainActivity.updateProgressStatus("Total Gscan completed :: "
+ Integer.toString(values[0].intValue()));
}
@Override
protected void onPostExecute(String error) {
if (error != null) {
Log.e(PMCMainActivity.TAG, error);
mPMCMainActivity.updateProgressStatus(error);
}
mWakeLock.release();
}
private class WifiScanListener implements WifiScanner.ScanListener {
WifiScanListener() {
}
@Override
public void onSuccess() {
Log.d(PMCMainActivity.TAG, "onSuccess called");
}
@Override
public void onFailure(int reason, String description) {
Log.d(PMCMainActivity.TAG, "onFailure called");
}
@Override
public void onPeriodChanged(int periodInMs) {
Log.d(PMCMainActivity.TAG, "onPeriodChanged called");
}
@Override
public void onFullResult(ScanResult fullScanResult) {
Log.d(PMCMainActivity.TAG, "onFullResult called");
}
@Override
public void onResults(ScanData[] results) {
Log.d(PMCMainActivity.TAG, "onResult WifiScanListener called");
mScanCompleted = true;
}
}
}
}