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