Merge "Don't override dialog icon drawable unless valid resource ID was set" into lmp-mr1-dev
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index d80ad6a..523f970 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -2565,7 +2565,7 @@
                 if (getVisibility() == VISIBLE) {
                     selector.setVisible(true, false);
                 }
-                selector.setState(getDrawableState());
+                updateSelectorState();
             }
             if (manageHotspot) {
                 selector.setHotspot(x, y);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java
index 479c982..dc6af6a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java
@@ -125,7 +125,7 @@
                 Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
                 intent.putExtra(EXTRA_START_CONNECT_SSID, ap.ssid);
                 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-                mContext.startActivity(intent);
+                mContext.startActivityAsUser(intent, new UserHandle(mCurrentUser));
                 return true;
             } else {
                 WifiConfiguration config = new WifiConfiguration();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 5eebf3c..b289155 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -134,7 +134,8 @@
     private ArrayList<SignalCluster> mSignalClusters = new ArrayList<SignalCluster>();
     private ArrayList<NetworkSignalChangedCallback> mSignalsChangedCallbacks =
             new ArrayList<NetworkSignalChangedCallback>();
-    private boolean mListening;
+    @VisibleForTesting
+    boolean mListening;
 
     // The current user ID.
     private int mCurrentUserId;
@@ -474,7 +475,7 @@
             int subId = subscriptions.get(i).getSubscriptionId();
             // If we have a copy of this controller already reuse it, otherwise make a new one.
             if (cachedControllers.containsKey(subId)) {
-                mMobileSignalControllers.put(subId, cachedControllers.get(subId));
+                mMobileSignalControllers.put(subId, cachedControllers.remove(subId));
             } else {
                 MobileSignalController controller = new MobileSignalController(mContext, mConfig,
                         mHasMobileDataFeature, mPhone, mSignalsChangedCallbacks, mSignalClusters,
@@ -502,7 +503,8 @@
         updateAirplaneMode(true /* force */);
     }
 
-    private boolean hasCorrectMobileControllers(List<SubscriptionInfo> allSubscriptions) {
+    @VisibleForTesting
+    boolean hasCorrectMobileControllers(List<SubscriptionInfo> allSubscriptions) {
         if (allSubscriptions.size() != mMobileSignalControllers.size()) {
             return false;
         }
@@ -992,8 +994,8 @@
     }
 
     // TODO: Move to its own file.
-    static class MobileSignalController extends SignalController<MobileSignalController.MobileState,
-            MobileSignalController.MobileIconGroup> {
+    public static class MobileSignalController extends SignalController<
+            MobileSignalController.MobileState, MobileSignalController.MobileIconGroup> {
         private final TelephonyManager mPhone;
         private final String mNetworkNameDefault;
         private final String mNetworkNameSeparator;
diff --git a/packages/SystemUI/tests/AndroidManifest.xml b/packages/SystemUI/tests/AndroidManifest.xml
index e52806d..c21af24 100644
--- a/packages/SystemUI/tests/AndroidManifest.xml
+++ b/packages/SystemUI/tests/AndroidManifest.xml
@@ -18,6 +18,7 @@
     package="com.android.systemui.tests">
 
     <uses-permission android:name="android.permission.INJECT_EVENTS" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
 
     <application>
         <uses-library android:name="android.test.runner" />
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 27a4052..525dd20 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
@@ -2,14 +2,21 @@
 
 import static org.mockito.Mockito.mock;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.mockito.Mockito;
+
+import android.content.Intent;
 import android.net.ConnectivityManager;
 import android.telephony.ServiceState;
 import android.telephony.SignalStrength;
+import android.telephony.SubscriptionInfo;
 import android.telephony.TelephonyManager;
 
+import com.android.internal.telephony.TelephonyIntents;
 import com.android.systemui.R;
-
-import org.mockito.Mockito;
+import com.android.systemui.statusbar.policy.NetworkControllerImpl.MobileSignalController;
 
 public class NetworkControllerSignalTest extends NetworkControllerBaseTest {
 
@@ -145,6 +152,86 @@
         //verifyLastMobileDataIndicators(true, R.drawable.stat_sys_signal_null, 0 /* No Icon */);
     }
 
+    // Some tests of actual NetworkController code, just internals not display stuff
+    // TODO: Put this somewhere else, maybe in its own file.
+    public void testHasCorrectMobileControllers() {
+        int[] testSubscriptions = new int[] { 1, 5, 3 };
+        int notTestSubscription = 0;
+        MobileSignalController mobileSignalController = Mockito.mock(MobileSignalController.class);
+
+        mNetworkController.mMobileSignalControllers.clear();
+        List<SubscriptionInfo> subscriptions = new ArrayList<>();
+        for (int i = 0; i < testSubscriptions.length; i++) {
+            // Force the test controllers into NetworkController.
+            mNetworkController.mMobileSignalControllers.put(testSubscriptions[i],
+                    mobileSignalController);
+
+            // Generate a list of subscriptions we will tell the NetworkController to use.
+            SubscriptionInfo mockSubInfo = Mockito.mock(SubscriptionInfo.class);
+            Mockito.when(mockSubInfo.getSubscriptionId()).thenReturn(testSubscriptions[i]);
+            subscriptions.add(mockSubInfo);
+        }
+        assertTrue(mNetworkController.hasCorrectMobileControllers(subscriptions));
+
+        // Add a subscription that the NetworkController doesn't know about.
+        SubscriptionInfo mockSubInfo = Mockito.mock(SubscriptionInfo.class);
+        Mockito.when(mockSubInfo.getSubscriptionId()).thenReturn(notTestSubscription);
+        subscriptions.add(mockSubInfo);
+        assertFalse(mNetworkController.hasCorrectMobileControllers(subscriptions));
+    }
+
+    public void testSetCurrentSubscriptions() {
+        // We will not add one controller to make sure it gets created.
+        int indexToSkipController = 0;
+        // We will not add one subscription to make sure it's controller gets removed.
+        int indexToSkipSubscription = 1;
+
+        int[] testSubscriptions = new int[] { 1, 5, 3 };
+        MobileSignalController[] mobileSignalControllers = new MobileSignalController[] {
+                Mockito.mock(MobileSignalController.class),
+                Mockito.mock(MobileSignalController.class),
+                Mockito.mock(MobileSignalController.class),
+        };
+        mNetworkController.mMobileSignalControllers.clear();
+        List<SubscriptionInfo> subscriptions = new ArrayList<>();
+        for (int i = 0; i < testSubscriptions.length; i++) {
+            if (i != indexToSkipController) {
+                // Force the test controllers into NetworkController.
+                mNetworkController.mMobileSignalControllers.put(testSubscriptions[i],
+                        mobileSignalControllers[i]);
+            }
+
+            if (i != indexToSkipSubscription) {
+                // Generate a list of subscriptions we will tell the NetworkController to use.
+                SubscriptionInfo mockSubInfo = Mockito.mock(SubscriptionInfo.class);
+                Mockito.when(mockSubInfo.getSubscriptionId()).thenReturn(testSubscriptions[i]);
+                Mockito.when(mockSubInfo.getSimSlotIndex()).thenReturn(testSubscriptions[i]);
+                subscriptions.add(mockSubInfo);
+            }
+        }
+
+        // We can only test whether unregister gets called if it thinks its in a listening
+        // state.
+        mNetworkController.mListening = true;
+        mNetworkController.setCurrentSubscriptions(subscriptions);
+
+        for (int i = 0; i < testSubscriptions.length; i++) {
+            if (i == indexToSkipController) {
+                // Make sure a controller was created despite us not adding one.
+                assertTrue(mNetworkController.mMobileSignalControllers.containsKey(
+                        testSubscriptions[i]));
+            } else if (i == indexToSkipSubscription) {
+                // Make sure the controller that did exist was removed
+                assertFalse(mNetworkController.mMobileSignalControllers.containsKey(
+                        testSubscriptions[i]));
+            } else {
+                // If a MobileSignalController is around it needs to not be unregistered.
+                Mockito.verify(mobileSignalControllers[i], Mockito.never())
+                        .unregisterListener();
+            }
+        }
+    }
+
     private void setCdma() {
         setIsGsm(false);
         updateDataConnectionState(TelephonyManager.DATA_CONNECTED,