1320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clowpackage com.android.pmc; 2320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow 3320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clowimport android.app.AlarmManager; 4320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clowimport android.app.PendingIntent; 5320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clowimport android.content.BroadcastReceiver; 6320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clowimport android.content.Context; 7320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clowimport android.content.Intent; 8320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clowimport android.content.IntentFilter; 9320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clowimport android.net.wifi.WifiManager; 10a3eac518e64aa0230894e4dde26c3f9714609e64Asiri Rathnayakeimport android.os.AsyncTask; 11320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clowimport android.os.PowerManager; 12320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clowimport android.os.SystemClock; 13320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clowimport android.util.Log; 14320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow 15320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow/** 16320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow * Call wifi scan whenever an alarm is received. 17320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow */ 18320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clowpublic class WifiConnScanReceiver extends BroadcastReceiver { 19320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow int mScanCount = 0; 20320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow ConnectvityScanTask mConnScanTask; 21320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow PMCMainActivity mPMCMainActivity; 22320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow private WifiManager mWifiManager; 23320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow private Context mContext; 24320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow private PowerManager.WakeLock mWakeLock; 25320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow private int mAlarmInterval; 26320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow private AlarmManager mAlarmManager; 2784acb1ec3f7d5e0f37d7176697c2fa876c413407Eric Fiselier private PendingIntent mAlarmIntent; 28320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow 29320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow public WifiConnScanReceiver(PMCMainActivity activity, int interval, AlarmManager alarmManager, 30320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow PendingIntent alarmIntent) { 31320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow mPMCMainActivity = activity; 32320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow mScanCount = 0; 33320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow mAlarmInterval = interval; 34320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow mAlarmManager = alarmManager; 35320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow mAlarmIntent = alarmIntent; 36320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow } 37320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow 38320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow @Override 39320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow public void onReceive(Context context, Intent intent) { 40320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow if (mConnScanTask != null && mConnScanTask.getStatus() != AsyncTask.Status.FINISHED) { 41320c80fecf6b50cbc89840189b90a972baf4d6fcMarshall Clow 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