Move NetworkController broadcasts/listeners to BG

Also do some refactoring to avoid having to sets of callback interfaces
with 75% of the same data.

Bug: 19520495
Change-Id: Ife1c71174c0d6a21f924f7de3cb2f97a04c3d5a1
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
new file mode 100644
index 0000000..1cc6fa8
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.statusbar.policy;
+
+import android.os.HandlerThread;
+import android.telephony.SubscriptionInfo;
+import android.test.AndroidTestCase;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
+import com.android.systemui.statusbar.policy.NetworkControllerImpl.EmergencyListener;
+import com.android.systemui.statusbar.policy.NetworkControllerImpl.IconState;
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CallbackHandlerTest extends AndroidTestCase {
+
+    private CallbackHandler mHandler;
+    private HandlerThread mHandlerThread;
+
+    @Mock
+    private EmergencyListener mEmengencyListener;
+    @Mock
+    private SignalCallback mSignalCallback;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+
+        mHandlerThread = new HandlerThread("TestThread");
+        mHandlerThread.start();
+        mHandler = new CallbackHandler(mHandlerThread.getLooper());
+
+        MockitoAnnotations.initMocks(this);
+        mHandler.setListening(mEmengencyListener, true);
+        mHandler.setListening(mSignalCallback, true);
+    }
+
+    public void testEmergencyListener() {
+        mHandler.setEmergencyCallsOnly(true);
+        waitForCallbacks();
+
+        ArgumentCaptor<Boolean> captor = ArgumentCaptor.forClass(Boolean.class);
+        Mockito.verify(mEmengencyListener).setEmergencyCallsOnly(captor.capture());
+        assertTrue(captor.getValue());
+    }
+
+    public void testSignalCallback_setWifiIndicators() {
+        boolean enabled = true;
+        IconState status = new IconState(true, 0, "");
+        IconState qs = new IconState(true, 1, "");
+        boolean in = true;
+        boolean out = true;
+        String description = "Test";
+        mHandler.setWifiIndicators(enabled, status, qs, in, out, description);
+        waitForCallbacks();
+
+        ArgumentCaptor<Boolean> enableArg = ArgumentCaptor.forClass(Boolean.class);
+        ArgumentCaptor<IconState> statusArg = ArgumentCaptor.forClass(IconState.class);
+        ArgumentCaptor<IconState> qsArg = ArgumentCaptor.forClass(IconState.class);
+        ArgumentCaptor<Boolean> inArg = ArgumentCaptor.forClass(Boolean.class);
+        ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class);
+        ArgumentCaptor<String> descArg = ArgumentCaptor.forClass(String.class);
+        Mockito.verify(mSignalCallback).setWifiIndicators(enableArg.capture(),
+                statusArg.capture(), qsArg.capture(), inArg.capture(), outArg.capture(),
+                descArg.capture());
+        assertEquals(enabled, (boolean) enableArg.getValue());
+        assertEquals(status, statusArg.getValue());
+        assertEquals(qs, qsArg.getValue());
+        assertEquals(in, (boolean) inArg.getValue());
+        assertEquals(out, (boolean) outArg.getValue());
+        assertEquals(description, descArg.getValue());
+    }
+
+    public void testSignalCallback_setMobileDataIndicators() {
+        IconState status = new IconState(true, 0, "");
+        IconState qs = new IconState(true, 1, "");
+        int dark = 2;
+        boolean in = true;
+        boolean out = true;
+        String typeDescription = "Test 1";
+        String description = "Test 2";
+        int type = R.drawable.stat_sys_data_fully_connected_1x;
+        int qsType = R.drawable.ic_qs_signal_1x;
+        boolean wide = true;
+        int subId = 5;
+        mHandler.setMobileDataIndicators(status, qs, dark, type, qsType, in, out, typeDescription,
+                description, wide, subId);
+        waitForCallbacks();
+
+        ArgumentCaptor<IconState> statusArg = ArgumentCaptor.forClass(IconState.class);
+        ArgumentCaptor<IconState> qsArg = ArgumentCaptor.forClass(IconState.class);
+        ArgumentCaptor<Integer> darkStrengthArg = ArgumentCaptor.forClass(Integer.class);
+        ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class);
+        ArgumentCaptor<Integer> qsTypeIconArg = ArgumentCaptor.forClass(Integer.class);
+        ArgumentCaptor<Boolean> inArg = ArgumentCaptor.forClass(Boolean.class);
+        ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class);
+        ArgumentCaptor<String> typeContentArg = ArgumentCaptor.forClass(String.class);
+        ArgumentCaptor<String> descArg = ArgumentCaptor.forClass(String.class);
+        ArgumentCaptor<Boolean> wideArg = ArgumentCaptor.forClass(Boolean.class);
+        ArgumentCaptor<Integer> subIdArg = ArgumentCaptor.forClass(Integer.class);
+        Mockito.verify(mSignalCallback).setMobileDataIndicators(statusArg.capture(), qsArg.capture(),
+                darkStrengthArg.capture(), typeIconArg.capture(), qsTypeIconArg.capture(),
+                inArg.capture(), outArg.capture(), typeContentArg.capture(), descArg.capture(),
+                wideArg.capture(), subIdArg.capture());
+        assertEquals(status, statusArg.getValue());
+        assertEquals(qs, qsArg.getValue());
+        assertEquals(dark, (int) darkStrengthArg.getValue());
+        assertEquals(type, (int) typeIconArg.getValue());
+        assertEquals(qsType, (int) qsTypeIconArg.getValue());
+        assertEquals(in, (boolean) inArg.getValue());
+        assertEquals(out, (boolean) outArg.getValue());
+        assertEquals(typeDescription, typeContentArg.getValue());
+        assertEquals(description, descArg.getValue());
+        assertEquals(wide, (boolean) wideArg.getValue());
+        assertEquals(subId, (int) subIdArg.getValue());
+    }
+
+    @SuppressWarnings("unchecked")
+    public void testSignalCallback_setSubs() {
+        List<SubscriptionInfo> subs = new ArrayList<>();
+        mHandler.setSubs(subs);
+        waitForCallbacks();
+
+        ArgumentCaptor<ArrayList> subsArg = ArgumentCaptor.forClass(ArrayList.class);
+        Mockito.verify(mSignalCallback).setSubs(subsArg.capture());
+        assertTrue(subs == subsArg.getValue());
+    }
+
+    public void testSignalCallback_setNoSims() {
+        boolean noSims = true;
+        mHandler.setNoSims(noSims);
+        waitForCallbacks();
+
+        ArgumentCaptor<Boolean> noSimsArg = ArgumentCaptor.forClass(Boolean.class);
+        Mockito.verify(mSignalCallback).setNoSims(noSimsArg.capture());
+        assertEquals(noSims, (boolean) noSimsArg.getValue());
+    }
+
+    public void testSignalCallback_setEthernetIndicators() {
+        IconState state = new IconState(true, R.drawable.stat_sys_ethernet, "Test Description");
+        mHandler.setEthernetIndicators(state);
+        waitForCallbacks();
+
+        ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
+        Mockito.verify(mSignalCallback).setEthernetIndicators(iconArg.capture());
+        assertEquals(state, iconArg.getValue());
+    }
+
+    public void testSignalCallback_setIsAirplaneMode() {
+        IconState state = new IconState(true, R.drawable.stat_sys_airplane_mode, "Test Description");
+        mHandler.setIsAirplaneMode(state);
+        waitForCallbacks();
+
+        ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
+        Mockito.verify(mSignalCallback).setIsAirplaneMode(iconArg.capture());
+        assertEquals(state, iconArg.getValue());
+    }
+
+    private void waitForCallbacks() {
+        mHandlerThread.quitSafely();
+        try {
+            mHandlerThread.join();
+        } catch (InterruptedException e) {
+        }
+    }
+
+}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index 29f461e..3d5f045 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -23,6 +23,7 @@
 import android.net.ConnectivityManager;
 import android.net.NetworkCapabilities;
 import android.net.wifi.WifiManager;
+import android.os.Looper;
 import android.telephony.PhoneStateListener;
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
@@ -31,12 +32,10 @@
 import android.telephony.TelephonyManager;
 import android.util.Log;
 
-import com.android.internal.telephony.IccCardConstants;
 import com.android.internal.telephony.cdma.EriInfo;
 import com.android.systemui.SysuiTestCase;
-import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback;
 import com.android.systemui.statusbar.policy.NetworkControllerImpl.Config;
-import com.android.systemui.statusbar.policy.NetworkControllerImpl.SignalCluster;
+import com.android.systemui.statusbar.policy.NetworkControllerImpl.IconState;
 
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
@@ -59,8 +58,6 @@
     protected NetworkControllerImpl mNetworkController;
     protected MobileSignalController mMobileSignalController;
     protected PhoneStateListener mPhoneStateListener;
-    protected SignalCluster mSignalCluster;
-    protected NetworkSignalChangedCallback mNetworkSignalChangedCallback;
     private SignalStrength mSignalStrength;
     private ServiceState mServiceState;
     protected ConnectivityManager mMockCm;
@@ -68,6 +65,7 @@
     protected SubscriptionManager mMockSm;
     protected TelephonyManager mMockTm;
     protected Config mConfig;
+    protected CallbackHandler mCallbackHandler;
 
     protected int mSubId;
 
@@ -91,33 +89,36 @@
 
         mConfig = new Config();
         mConfig.hspaDataDistinguishable = true;
+        mCallbackHandler = mock(CallbackHandler.class);
         mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
-                mConfig, mock(AccessPointControllerImpl.class),
-                mock(MobileDataControllerImpl.class));
+                mConfig, Looper.getMainLooper(), mCallbackHandler,
+                mock(AccessPointControllerImpl.class), mock(MobileDataControllerImpl.class));
         setupNetworkController();
     }
 
     protected void setupNetworkController() {
         // For now just pretend to be the data sim, so we can test that too.
-        mSubId = SubscriptionManager.getDefaultDataSubId();
+        mSubId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
         SubscriptionInfo subscription = mock(SubscriptionInfo.class);
         List<SubscriptionInfo> subs = new ArrayList<SubscriptionInfo>();
         when(subscription.getSubscriptionId()).thenReturn(mSubId);
         subs.add(subscription);
         mNetworkController.setCurrentSubscriptions(subs);
         mMobileSignalController = mNetworkController.mMobileSignalControllers.get(mSubId);
+        mMobileSignalController.getState().dataSim = true;
         mPhoneStateListener = mMobileSignalController.mPhoneStateListener;
-        mSignalCluster = mock(SignalCluster.class);
-        mNetworkSignalChangedCallback = mock(NetworkSignalChangedCallback.class);
-        mNetworkController.addSignalCluster(mSignalCluster);
-        mNetworkController.addNetworkSignalChangedCallback(mNetworkSignalChangedCallback);
+
+        // Trigger blank callbacks to always get the current state (some tests don't trigger
+        // changes from default state).
+        mNetworkController.addSignalCallback(null);
     }
 
     protected NetworkControllerImpl setUpNoMobileData() {
       when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(false);
       NetworkControllerImpl networkControllerNoMobile
               = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
-                        mConfig, mock(AccessPointControllerImpl.class),
+                        mConfig, Looper.getMainLooper(), mCallbackHandler,
+                        mock(AccessPointControllerImpl.class),
                         mock(MobileDataControllerImpl.class));
 
       setupNetworkController();
@@ -242,34 +243,30 @@
     protected void verifyHasNoSims(boolean hasNoSimsVisible) {
         ArgumentCaptor<Boolean> hasNoSimsArg = ArgumentCaptor.forClass(Boolean.class);
 
-        Mockito.verify(mSignalCluster, Mockito.atLeastOnce()).setNoSims(hasNoSimsArg.capture());
-        assertEquals("No sims in status bar", hasNoSimsVisible, (boolean) hasNoSimsArg.getValue());
-
-        Mockito.verify(mNetworkSignalChangedCallback, Mockito.atLeastOnce())
-                .onNoSimVisibleChanged(hasNoSimsArg.capture());
-        assertEquals("No sims in quick settings", hasNoSimsVisible,
-                (boolean) hasNoSimsArg.getValue());
+        Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setNoSims(hasNoSimsArg.capture());
+        assertEquals("No sims", hasNoSimsVisible, (boolean) hasNoSimsArg.getValue());
     }
 
     protected void verifyLastQsMobileDataIndicators(boolean visible, int icon, int typeIcon,
             boolean dataIn, boolean dataOut) {
-        ArgumentCaptor<Integer> iconArg = ArgumentCaptor.forClass(Integer.class);
+        ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
         ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class);
-        ArgumentCaptor<Boolean> visibleArg = ArgumentCaptor.forClass(Boolean.class);
         ArgumentCaptor<Boolean> dataInArg = ArgumentCaptor.forClass(Boolean.class);
         ArgumentCaptor<Boolean> dataOutArg = ArgumentCaptor.forClass(Boolean.class);
 
-        Mockito.verify(mNetworkSignalChangedCallback, Mockito.atLeastOnce())
-                .onMobileDataSignalChanged(visibleArg.capture(), iconArg.capture(),
-                        ArgumentCaptor.forClass(String.class).capture(),
-                        typeIconArg.capture(),
-                        dataInArg.capture(),
-                        dataOutArg.capture(),
-                        ArgumentCaptor.forClass(String.class).capture(),
-                        ArgumentCaptor.forClass(String.class).capture(),
-                        ArgumentCaptor.forClass(Boolean.class).capture());
-        assertEquals("Visibility in, quick settings", visible, (boolean) visibleArg.getValue());
-        assertEquals("Signal icon in, quick settings", icon, (int) iconArg.getValue());
+        Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
+                    ArgumentCaptor.forClass(IconState.class).capture(),
+                    iconArg.capture(),
+                    ArgumentCaptor.forClass(Integer.class).capture(),
+                    ArgumentCaptor.forClass(Integer.class).capture(),
+                    typeIconArg.capture(), dataInArg.capture(), dataOutArg.capture(),
+                    ArgumentCaptor.forClass(String.class).capture(),
+                    ArgumentCaptor.forClass(String.class).capture(),
+                    ArgumentCaptor.forClass(Boolean.class).capture(),
+                    ArgumentCaptor.forClass(Integer.class).capture());
+        IconState iconState = iconArg.getValue();
+        assertEquals("Visibility in, quick settings", visible, iconState.visible);
+        assertEquals("Signal icon in, quick settings", icon, iconState.icon);
         assertEquals("Data icon in, quick settings", typeIcon, (int) typeIconArg.getValue());
         assertEquals("Data direction in, in quick settings", dataIn,
                 (boolean) dataInArg.getValue());
@@ -283,29 +280,32 @@
 
     protected void verifyLastMobileDataIndicators(boolean visible, int strengthIcon,
             int darkStrengthIcon, int typeIcon) {
-        ArgumentCaptor<Integer> strengthIconArg = ArgumentCaptor.forClass(Integer.class);
+        ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
         ArgumentCaptor<Integer> darkStrengthIconArg = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<Integer> typeIconArg = ArgumentCaptor.forClass(Integer.class);
-        ArgumentCaptor<Boolean> visibleArg = ArgumentCaptor.forClass(Boolean.class);
 
         // TODO: Verify all fields.
-        Mockito.verify(mSignalCluster, Mockito.atLeastOnce()).setMobileDataIndicators(
-                visibleArg.capture(), strengthIconArg.capture(), darkStrengthIconArg.capture(),
-                typeIconArg.capture(),
+        Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setMobileDataIndicators(
+                iconArg.capture(),
+                ArgumentCaptor.forClass(IconState.class).capture(),
+                darkStrengthIconArg.capture(), typeIconArg.capture(),
+                ArgumentCaptor.forClass(Integer.class).capture(),
+                ArgumentCaptor.forClass(Boolean.class).capture(),
+                ArgumentCaptor.forClass(Boolean.class).capture(),
                 ArgumentCaptor.forClass(String.class).capture(),
                 ArgumentCaptor.forClass(String.class).capture(),
                 ArgumentCaptor.forClass(Boolean.class).capture(),
                 ArgumentCaptor.forClass(Integer.class).capture());
+        IconState iconState = iconArg.getValue();
 
-        assertEquals("Signal strength icon in status bar", strengthIcon,
-                (int) strengthIconArg.getValue());
+        assertEquals("Signal strength icon in status bar", strengthIcon, iconState.icon);
         assertEquals("Signal strength icon (dark mode) in status bar", darkStrengthIcon,
                 (int) darkStrengthIconArg.getValue());
         assertEquals("Data icon in status bar", typeIcon, (int) typeIconArg.getValue());
-        assertEquals("Visibility in status bar", visible, (boolean) visibleArg.getValue());
+        assertEquals("Visibility in status bar", visible, iconState.visible);
     }
 
    protected void assertNetworkNameEquals(String expected) {
-       assertEquals("Network name", expected, mNetworkController.getMobileDataNetworkName());
+       assertEquals("Network name", expected, mMobileSignalController.getState().networkName);
    }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
index 3f9312d..015127d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
@@ -2,6 +2,7 @@
 
 import org.mockito.Mockito;
 
+import android.os.Looper;
 import android.telephony.TelephonyManager;
 
 public class NetworkControllerDataTest extends NetworkControllerBaseTest {
@@ -74,7 +75,8 @@
         // Switch to showing 4g icon and re-initialize the NetworkController.
         mConfig.show4gForLte = true;
         mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
-                mConfig, Mockito.mock(AccessPointControllerImpl.class),
+                mConfig, Looper.getMainLooper(), mCallbackHandler,
+                Mockito.mock(AccessPointControllerImpl.class),
                 Mockito.mock(MobileDataControllerImpl.class));
         setupNetworkController();
 
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java
index 82ced9f..f1d2acb 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerEthernetTest.java
@@ -2,6 +2,8 @@
 
 import android.net.NetworkCapabilities;
 
+import com.android.systemui.statusbar.policy.NetworkControllerImpl.IconState;
+
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
 
@@ -28,13 +30,12 @@
     }
 
     protected void verifyLastEthernetIcon(boolean visible, int icon) {
-        ArgumentCaptor<Boolean> visibleArg = ArgumentCaptor.forClass(Boolean.class);
-        ArgumentCaptor<Integer> iconArg = ArgumentCaptor.forClass(Integer.class);
+        ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
 
-        Mockito.verify(mSignalCluster, Mockito.atLeastOnce()).setEthernetIndicators(
-                visibleArg.capture(), iconArg.capture(),
-                ArgumentCaptor.forClass(String.class).capture());
-        assertEquals("Ethernet visible, in status bar", visible, (boolean) visibleArg.getValue());
-        assertEquals("Ethernet icon, in status bar", icon, (int) iconArg.getValue());
+        Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setEthernetIndicators(
+                iconArg.capture());
+        IconState iconState = iconArg.getValue();
+        assertEquals("Ethernet visible, in status bar", visible, iconState.visible);
+        assertEquals("Ethernet icon, in status bar", icon, iconState.icon);
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
index 389ad6f..a85bca2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
@@ -19,12 +19,12 @@
 
 import android.content.Intent;
 import android.net.ConnectivityManager;
+import android.os.Looper;
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
 import android.telephony.SubscriptionInfo;
 import android.telephony.TelephonyManager;
 
-import com.android.internal.telephony.IccCardConstants;
 import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.TelephonyIntents;
 import com.android.systemui.R;
@@ -41,8 +41,8 @@
         Mockito.when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(false);
         // Create a new NetworkController as this is currently handled in constructor.
         mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
-                mConfig, mock(AccessPointControllerImpl.class),
-                mock(MobileDataControllerImpl.class));
+                mConfig, Looper.getMainLooper(), mCallbackHandler,
+                mock(AccessPointControllerImpl.class), mock(MobileDataControllerImpl.class));
         setupNetworkController();
 
         verifyLastMobileDataIndicators(false, 0, 0);
@@ -61,8 +61,8 @@
         Mockito.when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(false);
         // Create a new NetworkController as this is currently handled in constructor.
         mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm,
-                mConfig, mock(AccessPointControllerImpl.class),
-                mock(MobileDataControllerImpl.class));
+                mConfig, Looper.getMainLooper(), mCallbackHandler,
+                mock(AccessPointControllerImpl.class), mock(MobileDataControllerImpl.class));
         setupNetworkController();
 
         // No Subscriptions.
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
index 2e0e9a3..d0c95b9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerWifiTest.java
@@ -6,6 +6,8 @@
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
 
+import com.android.systemui.statusbar.policy.NetworkControllerImpl.IconState;
+
 import org.mockito.ArgumentCaptor;
 import org.mockito.Mockito;
 
@@ -133,46 +135,39 @@
         ArgumentCaptor<Boolean> inArg = ArgumentCaptor.forClass(Boolean.class);
         ArgumentCaptor<Boolean> outArg = ArgumentCaptor.forClass(Boolean.class);
 
-        Mockito.verify(mNetworkSignalChangedCallback, Mockito.atLeastOnce()).onWifiSignalChanged(
-                ArgumentCaptor.forClass(Boolean.class).capture(),
-                ArgumentCaptor.forClass(Boolean.class).capture(),
-                ArgumentCaptor.forClass(Integer.class).capture(),
-                inArg.capture(), outArg.capture(),
-                ArgumentCaptor.forClass(String.class).capture(),
-                ArgumentCaptor.forClass(String.class).capture());
+        Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
+                Mockito.anyBoolean(), Mockito.any(IconState.class), Mockito.any(IconState.class),
+                inArg.capture(), outArg.capture(), Mockito.anyString());
         assertEquals("WiFi data in, in quick settings", in, (boolean) inArg.getValue());
         assertEquals("WiFi data out, in quick settings", out, (boolean) outArg.getValue());
     }
 
     protected void verifyLastQsWifiIcon(boolean enabled, boolean connected, int icon,
             String description) {
+        ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
         ArgumentCaptor<Boolean> enabledArg = ArgumentCaptor.forClass(Boolean.class);
-        ArgumentCaptor<Boolean> connectedArg = ArgumentCaptor.forClass(Boolean.class);
-        ArgumentCaptor<Integer> iconArg = ArgumentCaptor.forClass(Integer.class);
         ArgumentCaptor<String> descArg = ArgumentCaptor.forClass(String.class);
 
-        Mockito.verify(mNetworkSignalChangedCallback, Mockito.atLeastOnce()).onWifiSignalChanged(
-                enabledArg.capture(), connectedArg.capture(), iconArg.capture(),
-                ArgumentCaptor.forClass(Boolean.class).capture(),
-                ArgumentCaptor.forClass(Boolean.class).capture(),
-                ArgumentCaptor.forClass(String.class).capture(),
+        Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
+                enabledArg.capture(), Mockito.any(IconState.class),
+                iconArg.capture(), Mockito.anyBoolean(),
+                Mockito.anyBoolean(),
                 descArg.capture());
+        IconState iconState = iconArg.getValue();
         assertEquals("WiFi enabled, in quick settings", enabled, (boolean) enabledArg.getValue());
-        assertEquals("WiFi connected, in quick settings", connected,
-                (boolean) connectedArg.getValue());
-        assertEquals("WiFi signal, in quick settings", icon, (int) iconArg.getValue());
-        assertEquals("WiFI desc (ssid), in quick settings", description,
-                (String) descArg.getValue());
+        assertEquals("WiFi connected, in quick settings", connected, iconState.visible);
+        assertEquals("WiFi signal, in quick settings", icon, iconState.icon);
+        assertEquals("WiFI desc (ssid), in quick settings", description, descArg.getValue());
     }
 
     protected void verifyLastWifiIcon(boolean visible, int icon) {
-        ArgumentCaptor<Boolean> visibleArg = ArgumentCaptor.forClass(Boolean.class);
-        ArgumentCaptor<Integer> iconArg = ArgumentCaptor.forClass(Integer.class);
+        ArgumentCaptor<IconState> iconArg = ArgumentCaptor.forClass(IconState.class);
 
-        Mockito.verify(mSignalCluster, Mockito.atLeastOnce()).setWifiIndicators(
-                visibleArg.capture(), iconArg.capture(),
-                ArgumentCaptor.forClass(String.class).capture());
-        assertEquals("WiFi visible, in status bar", visible, (boolean) visibleArg.getValue());
-        assertEquals("WiFi signal, in status bar", icon, (int) iconArg.getValue());
+        Mockito.verify(mCallbackHandler, Mockito.atLeastOnce()).setWifiIndicators(
+                Mockito.anyBoolean(), iconArg.capture(), Mockito.any(IconState.class),
+                Mockito.anyBoolean(), Mockito.anyBoolean(), Mockito.anyString());
+        IconState iconState = iconArg.getValue();
+        assertEquals("WiFi visible, in status bar", visible, iconState.visible);
+        assertEquals("WiFi signal, in status bar", icon, iconState.icon);
     }
 }