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);
+ }
+
}