1package com.android.pmc;
2
3import android.app.AlarmManager;
4import android.app.PendingIntent;
5import android.content.BroadcastReceiver;
6import android.content.Context;
7import android.content.Intent;
8import android.content.IntentFilter;
9import android.net.wifi.WifiManager;
10import android.os.AsyncTask;
11import android.os.PowerManager;
12import android.os.SystemClock;
13import android.util.Log;
14
15/**
16 * Call wifi scan whenever an alarm is received.
17 */
18public 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