Home | History | Annotate | Download | only in pmc
      1 package com.android.pmc;
      2 
      3 import android.app.AlarmManager;
      4 import android.app.PendingIntent;
      5 import android.content.BroadcastReceiver;
      6 import android.content.Context;
      7 import android.content.Intent;
      8 import android.content.IntentFilter;
      9 import android.net.wifi.WifiManager;
     10 import android.os.AsyncTask;
     11 import android.os.PowerManager;
     12 import android.os.SystemClock;
     13 import android.util.Log;
     14 
     15 /**
     16  * Call wifi scan whenever an alarm is received.
     17  */
     18 public class WifiConnScanReceiver extends BroadcastReceiver {
     19     int mScanCount = 0;
     20     ConnectvityScanTask mConnScanTask;
     21     PMCMainActivity mPMCMainActivity;
     22     private WifiManager mWifiManager;
     23     private Context mContext;
     24     private PowerManager.WakeLock mWakeLock;
     25     private int mAlarmInterval;
     26     private AlarmManager mAlarmManager;
     27     private PendingIntent mAlarmIntent;
     28 
     29     public WifiConnScanReceiver(PMCMainActivity activity, int interval, AlarmManager alarmManager,
     30                                 PendingIntent alarmIntent) {
     31         mPMCMainActivity = activity;
     32         mScanCount = 0;
     33         mAlarmInterval = interval;
     34         mAlarmManager = alarmManager;
     35         mAlarmIntent = alarmIntent;
     36     }
     37 
     38     @Override
     39     public void onReceive(Context context, Intent intent) {
     40         if (mConnScanTask != null && mConnScanTask.getStatus() != AsyncTask.Status.FINISHED) {
     41             Log.e(PMCMainActivity.TAG, "Previous connection scan still running.");
     42             try {
     43                 mConnScanTask.get();
     44             } catch (Exception e) {
     45                 Log.e(PMCMainActivity.TAG, "Connection scan cancelled.");
     46             }
     47         } else {
     48             mContext = context;
     49             PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
     50             mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WIFITEST");
     51             // Acquire the lock
     52             mWakeLock.acquire();
     53             mWifiManager = (WifiManager) context.getApplicationContext()
     54                     .getSystemService(Context.WIFI_SERVICE);
     55             Log.i(PMCMainActivity.TAG, "Starting Connectivity Scan Task");
     56             mConnScanTask = new ConnectvityScanTask();
     57             mConnScanTask.execute();
     58         }
     59         scheduleConnScan();
     60     }
     61 
     62     /**
     63      * Schedule the next connectivity scan.
     64      */
     65     public void scheduleConnScan() {
     66         Log.i(PMCMainActivity.TAG, "Scheduling the next conn scan after " + mAlarmInterval);
     67         mAlarmManager.setAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP,
     68                 SystemClock.elapsedRealtime() + mAlarmInterval, mAlarmIntent);
     69     }
     70 
     71     /**
     72      * Cancel the connectivity scans.
     73      */
     74     public void cancelConnScan() {
     75         mAlarmManager.cancel(mAlarmIntent);
     76         if (mConnScanTask != null) mConnScanTask.cancel(true);
     77     }
     78 
     79     class ConnectvityScanTask extends AsyncTask<Integer, Integer, String> {
     80         WifiScanReceiver mWifiScanReceiver;
     81         Boolean mScanCompleted = false;
     82 
     83         ConnectvityScanTask() {
     84             mWifiScanReceiver = new WifiScanReceiver();
     85             mContext.getApplicationContext().registerReceiver(mWifiScanReceiver,
     86                     new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
     87         }
     88 
     89         @Override
     90         protected String doInBackground(Integer... stime) {
     91             //android.os.Debug.waitForDebugger();
     92             int waitCount = 0;
     93             try {
     94                 mScanCompleted = false;
     95                 mWifiManager.startScan();
     96                 while (!mScanCompleted) {
     97                     if (waitCount >= 100) {
     98                         return "Timeout, scan results avaiable action didn't triggered";
     99                     } else {
    100                         Thread.sleep(100);
    101                         waitCount += 1;
    102                     }
    103                 }
    104                 waitCount = 0;
    105                 mScanCount += 1;
    106                 Log.d(PMCMainActivity.TAG, "Number of scan completed " + mScanCount);
    107                 publishProgress(mScanCount);
    108             } catch (Exception e) {
    109                 Log.e(PMCMainActivity.TAG, e.toString());
    110                 return e.toString();
    111             }
    112             return null;
    113         }
    114 
    115         @Override
    116         protected void onCancelled(String result) {
    117             mContext.getApplicationContext().unregisterReceiver(mWifiScanReceiver);
    118             mWakeLock.release();
    119         }
    120 
    121         @Override
    122         protected void onProgressUpdate(Integer... values) {
    123             Log.d(PMCMainActivity.TAG, "ConnectvityScanTask onProgressUpdate updating the UI");
    124             mPMCMainActivity.updateProgressStatus("Total Connectivity scan completed :: "
    125                     + Integer.toString(values[0].intValue()));
    126         }
    127 
    128         @Override
    129         protected void onPostExecute(String error) {
    130             if (error != null) {
    131                 Log.e(PMCMainActivity.TAG, error);
    132                 mPMCMainActivity.updateProgressStatus(error);
    133             }
    134             mContext.getApplicationContext().unregisterReceiver(mWifiScanReceiver);
    135             mWakeLock.release();
    136         }
    137 
    138         class WifiScanReceiver extends BroadcastReceiver {
    139             @Override
    140             public void onReceive(Context c, Intent intent) {
    141                 String action = intent.getAction();
    142                 if (action.equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
    143                     Log.d(PMCMainActivity.TAG, "Wifi connection scan finished, results available.");
    144                     mScanCompleted = true;
    145                 }
    146             }
    147         }
    148     }
    149 }
    150