Display carrier network name as celluar setting summary.

Bug: 34974598
Test: make RunSettingsRoboTests
Change-Id: I99436337919440e0dd21653f9ea63d6f3a694df0
diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
index 910e1eb..253ed76 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -253,7 +253,8 @@
                     new NfcPreferenceController(context).updateNonIndexableKeys(result);
                     new MobilePlanPreferenceController(context, null /* MobilePlanClickHandler */)
                             .updateNonIndexableKeys(result);
-                    new MobileNetworkPreferenceController(context).updateNonIndexableKeys(result);
+                    new MobileNetworkPreferenceController(context)
+                            .updateNonIndexableKeys(result);
 
                     // Remove Airplane Mode settings if it's a stationary device such as a TV.
                     new AirplaneModePreferenceController(context, null /* fragment */)
diff --git a/src/com/android/settings/network/MobileNetworkPreferenceController.java b/src/com/android/settings/network/MobileNetworkPreferenceController.java
index 7c8cd40..f55e753 100644
--- a/src/com/android/settings/network/MobileNetworkPreferenceController.java
+++ b/src/com/android/settings/network/MobileNetworkPreferenceController.java
@@ -17,25 +17,40 @@
 
 import android.content.Context;
 import android.os.UserManager;
+import android.support.annotation.VisibleForTesting;
 import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.telephony.PhoneStateListener;
+import android.telephony.ServiceState;
+import android.telephony.TelephonyManager;
 
 import com.android.settings.Utils;
 import com.android.settings.core.PreferenceController;
+import com.android.settings.core.lifecycle.Lifecycle;
+import com.android.settings.core.lifecycle.LifecycleObserver;
+import com.android.settings.core.lifecycle.events.OnPause;
+import com.android.settings.core.lifecycle.events.OnResume;
 
 import static android.os.UserHandle.myUserId;
 import static android.os.UserManager.DISALLOW_CONFIG_MOBILE_NETWORKS;
 import static com.android.settingslib.RestrictedLockUtils.hasBaseUserRestriction;
 
-public class MobileNetworkPreferenceController extends PreferenceController {
+public class MobileNetworkPreferenceController extends PreferenceController implements
+        LifecycleObserver, OnResume, OnPause {
 
     private static final String KEY_MOBILE_NETWORK_SETTINGS = "mobile_network_settings";
 
     private final UserManager mUserManager;
     private final boolean mIsSecondaryUser;
+    private final TelephonyManager mTelephonyManager;
+    private Preference mPreference;
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    PhoneStateListener mPhoneStateListener;
 
     public MobileNetworkPreferenceController(Context context) {
         super(context);
         mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
+        mTelephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
         mIsSecondaryUser = !mUserManager.isAdminUser();
     }
 
@@ -47,7 +62,39 @@
     }
 
     @Override
+    public void displayPreference(PreferenceScreen screen) {
+        super.displayPreference(screen);
+        if (isAvailable()) {
+            mPreference = screen.findPreference(getPreferenceKey());
+        }
+    }
+
+    @Override
     public String getPreferenceKey() {
         return KEY_MOBILE_NETWORK_SETTINGS;
     }
+
+    @Override
+    public void onResume() {
+        if (isAvailable()) {
+            if (mPhoneStateListener == null) {
+                mPhoneStateListener = new PhoneStateListener() {
+                    @Override
+                    public void onServiceStateChanged(ServiceState serviceState) {
+                        if (mPreference != null) {
+                            mPreference.setSummary(mTelephonyManager.getNetworkOperatorName());
+                        }
+                    }
+                };
+            }
+            mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE);
+        }
+    }
+
+    @Override
+    public void onPause() {
+        if (mPhoneStateListener != null) {
+            mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
+        }
+    }
 }
diff --git a/src/com/android/settings/network/NetworkDashboardFragment.java b/src/com/android/settings/network/NetworkDashboardFragment.java
index d2b0621..9a811b8 100644
--- a/src/com/android/settings/network/NetworkDashboardFragment.java
+++ b/src/com/android/settings/network/NetworkDashboardFragment.java
@@ -81,14 +81,17 @@
                 new MobilePlanPreferenceController(context, this);
         final WifiMasterSwitchPreferenceController wifiPreferenceController =
                 new WifiMasterSwitchPreferenceController(context, mMetricsFeatureProvider);
+        final MobileNetworkPreferenceController mobileNetworkPreferenceController =
+                new MobileNetworkPreferenceController(context);
         final Lifecycle lifecycle = getLifecycle();
         lifecycle.addObserver(airplaneModePreferenceController);
         lifecycle.addObserver(mobilePlanPreferenceController);
         lifecycle.addObserver(wifiPreferenceController);
+        lifecycle.addObserver(mobileNetworkPreferenceController);
 
         final List<PreferenceController> controllers = new ArrayList<>();
         controllers.add(airplaneModePreferenceController);
-        controllers.add(new MobileNetworkPreferenceController(context));
+        controllers.add(mobileNetworkPreferenceController);
         controllers.add(new TetherPreferenceController(context));
         controllers.add(new VpnPreferenceController(context));
         controllers.add(new ProxyPreferenceController(context));
diff --git a/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
index d3d6836..1ae40aa 100644
--- a/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/network/MobileNetworkPreferenceControllerTest.java
@@ -19,8 +19,15 @@
 import android.net.ConnectivityManager;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
+
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
+import com.android.settings.core.lifecycle.Lifecycle;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -32,6 +39,10 @@
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 @RunWith(SettingsRobolectricTestRunner.class)
@@ -44,15 +55,23 @@
     private UserManager mUserManager;
     @Mock
     private ConnectivityManager mConnectivityManager;
+    @Mock
+    private TelephonyManager mTelephonyManager;
+    @Mock
+    private PreferenceScreen mScreen;
 
+    private Lifecycle mLifecycle;
     private MobileNetworkPreferenceController mController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
+        mLifecycle = new Lifecycle();
         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
         when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE))
                 .thenReturn(mConnectivityManager);
+        when(mContext.getSystemService(Context.TELEPHONY_SERVICE))
+                .thenReturn(mTelephonyManager);
     }
 
     @Test
@@ -78,4 +97,45 @@
         mController = new MobileNetworkPreferenceController(mContext);
         assertThat(mController.isAvailable()).isFalse();
     }
+
+    @Test
+    public void goThroughLifecycle_isAvailable_shouldListenToServiceChange() {
+        mController = spy(new MobileNetworkPreferenceController(mContext));
+        mLifecycle.addObserver(mController);
+        doReturn(true).when(mController).isAvailable();
+
+        mLifecycle.onResume();
+        verify(mTelephonyManager).listen(mController.mPhoneStateListener,
+                PhoneStateListener.LISTEN_SERVICE_STATE);
+
+        mLifecycle.onPause();
+        verify(mTelephonyManager).listen(mController.mPhoneStateListener,
+                PhoneStateListener.LISTEN_NONE);
+    }
+
+    @Test
+    public void serviceStateChange_shouldUpdatePrefSummary() {
+        final String testCarrierName = "test";
+        final Preference mPreference = mock(Preference.class);
+        mController = spy(new MobileNetworkPreferenceController(mContext));
+        mLifecycle.addObserver(mController);
+
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
+        doReturn(true).when(mController).isAvailable();
+
+        // Display pref and go through lifecycle to set up listener.
+        mController.displayPreference(mScreen);
+        mLifecycle.onResume();
+        verify(mController).onResume();
+        verify(mTelephonyManager).listen(mController.mPhoneStateListener,
+                PhoneStateListener.LISTEN_SERVICE_STATE);
+
+        // Trigger listener update
+        when(mTelephonyManager.getNetworkOperatorName()).thenReturn(testCarrierName);
+        mController.mPhoneStateListener.onServiceStateChanged(null);
+
+        // Carrier name should be set.
+        verify(mPreference).setSummary(testCarrierName);
+    }
+
 }