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 
WifiConnScanReceiver(PMCMainActivity activity, int interval, AlarmManager alarmManager, PendingIntent alarmIntent)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
onReceive(Context context, Intent intent)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      */
scheduleConnScan()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      */
cancelConnScan()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 
ConnectvityScanTask()83         ConnectvityScanTask() {
84             mWifiScanReceiver = new WifiScanReceiver();
85             mContext.getApplicationContext().registerReceiver(mWifiScanReceiver,
86                     new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
87         }
88 
89         @Override
doInBackground(Integer... stime)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
onCancelled(String result)116         protected void onCancelled(String result) {
117             mContext.getApplicationContext().unregisterReceiver(mWifiScanReceiver);
118             mWakeLock.release();
119         }
120 
121         @Override
onProgressUpdate(Integer... values)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
onPostExecute(String error)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
onReceive(Context c, Intent intent)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