OSDN Git Service

SettingsLib: Fix wifi crash during settings index
authorJason Monk <jmonk@android.com>
Fri, 22 May 2015 15:25:04 +0000 (11:25 -0400)
committerJason Monk <jmonk@google.com>
Fri, 22 May 2015 15:26:34 +0000 (11:26 -0400)
and test it

Bug: 21365029
Change-Id: I9a914773577dcbe591b41c9114ba4d078b5e7369

packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
packages/SettingsLib/tests/src/com/android/settingslib/wifi/WifiTrackerTest.java

index 7060c64..68803b3 100644 (file)
@@ -106,6 +106,10 @@ public class WifiTracker {
             throw new IllegalArgumentException("Must include either saved or scans");
         }
         mContext = context;
+        if (currentLooper == null) {
+            // When we aren't on a looper thread, default to the main.
+            currentLooper = Looper.getMainLooper();
+        }
         mMainHandler = new MainHandler(currentLooper);
         mWorkHandler = new WorkHandler(
                 workerLooper != null ? workerLooper : currentLooper);
index 103cd3a..479c7be 100644 (file)
@@ -171,6 +171,30 @@ public class WifiTrackerTest extends BaseTest {
         assertEquals(TEST_SSIDS[0], accessPoints.get(1).getSsid());
     }
 
+    /**
+     * This tests the case where Settings runs this on a non-looper thread for indexing.
+     */
+    public void testSavedOnlyNoLooper() {
+        mWifiTracker = new WifiTracker(mContext, mWifiListener, mLooper, true, false, true,
+                mWifiManager,  null);
+        mWifiTracker.mScanner = mWifiTracker.new Scanner();
+
+        List<WifiConfiguration> wifiConfigs = new ArrayList<WifiConfiguration>();
+        List<ScanResult> scanResults = new ArrayList<ScanResult>();
+        generateTestNetworks(wifiConfigs, scanResults, true);
+
+        // Send all of the configs and scan results to the tracker.
+        Mockito.when(mWifiManager.getConfiguredNetworks()).thenReturn(wifiConfigs);
+        Mockito.when(mWifiManager.getScanResults()).thenReturn(scanResults);
+        mWifiTracker.forceUpdate();
+
+        List<AccessPoint> accessPoints = mWifiTracker.getAccessPoints();
+        // Only expect the first two to come back in the results.
+        assertEquals("Expected number of results", 2, accessPoints.size());
+        assertEquals(TEST_SSIDS[1], accessPoints.get(0).getSsid());
+        assertEquals(TEST_SSIDS[0], accessPoints.get(1).getSsid());
+    }
+
     public void testAvailableOnly() {
         mWifiTracker = new WifiTracker(mContext, mWifiListener, mLooper, false, true, true,
                 mWifiManager, mMainLooper);