diff options
| author | 2018-08-21 18:04:29 +0800 | |
|---|---|---|
| committer | 2018-08-24 10:56:02 +0800 | |
| commit | 8cfb4d59a95ed4fd8ea8c25b34ee2eebf325842f (patch) | |
| tree | 23ad087c71bfba27e667c2be37f5a7183248670c | |
| parent | ea1e4131cc84031c3631ccf01ec4500754366642 (diff) | |
Refactor SystemUI and add function in settingslib for service state
To make behavior consistent in the long run and refactor the code
into settingslib and call it from both Settings and SystemUI.
Bug: 110973964
Test: run testcase as below:
1. frameworks/base/packages/SettingsLib: -> ALL PASS
make RunSettingsLibRoboTests -j40
2. frameworks/base/packages/SystemUI: -> ALL PASS
atest frameworks/base/packages/SystemUI/tests/src/com/android/systemui
/statusbar/policy/NetworkControllerSignalTest.java
Change-Id: Ie8899dd5398a503b861557c222bbd93bd2049d10
3 files changed, 124 insertions, 25 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/Utils.java b/packages/SettingsLib/src/com/android/settingslib/Utils.java index c789c5d848c4..6abe76a1e753 100644 --- a/packages/SettingsLib/src/com/android/settingslib/Utils.java +++ b/packages/SettingsLib/src/com/android/settingslib/Utils.java @@ -23,6 +23,7 @@ import android.os.UserHandle; import android.os.UserManager; import android.print.PrintManager; import android.provider.Settings; +import android.telephony.ServiceState; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.UserIcons; @@ -391,4 +392,52 @@ public class Utils { || audioMode == AudioManager.MODE_IN_CALL || audioMode == AudioManager.MODE_IN_COMMUNICATION; } + + /** + * Return the service state is in-service or not. + * To make behavior consistent with SystemUI and Settings/AboutPhone/SIM status UI + * + * @param serviceState Service state. {@link ServiceState} + */ + public static boolean isInService(ServiceState serviceState) { + if (serviceState == null) { + return false; + } + int state = getCombinedServiceState(serviceState); + if (state == ServiceState.STATE_POWER_OFF + || state == ServiceState.STATE_OUT_OF_SERVICE + || state == ServiceState.STATE_EMERGENCY_ONLY) { + return false; + } else { + return true; + } + } + + /** + * Return the combined service state. + * To make behavior consistent with SystemUI and Settings/AboutPhone/SIM status UI + * + * @param serviceState Service state. {@link ServiceState} + */ + public static int getCombinedServiceState(ServiceState serviceState) { + if (serviceState == null) { + return ServiceState.STATE_OUT_OF_SERVICE; + } + + // Consider the device to be in service if either voice or data + // service is available. Some SIM cards are marketed as data-only + // and do not support voice service, and on these SIM cards, we + // want to show signal bars for data service as well as the "no + // service" or "emergency calls only" text that indicates that voice + // is not available. + int state = serviceState.getState(); + int dataState = serviceState.getDataRegState(); + if (state == ServiceState.STATE_OUT_OF_SERVICE + || state == ServiceState.STATE_EMERGENCY_ONLY) { + if (dataState == ServiceState.STATE_IN_SERVICE) { + return ServiceState.STATE_IN_SERVICE; + } + } + return state; + } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java index 09a2bd299c0b..babe82e00ae6 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/UtilsTest.java @@ -39,6 +39,7 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.provider.Settings; import android.provider.Settings.Secure; +import android.telephony.ServiceState; import android.text.TextUtils; import org.junit.Before; @@ -74,6 +75,8 @@ public class UtilsTest { private Context mContext; @Mock private LocationManager mLocationManager; + @Mock + private ServiceState mServiceState; @Before public void setUp() { @@ -226,4 +229,71 @@ public class UtilsTest { assertThat(Utils.isAudioModeOngoingCall(mContext)).isFalse(); } + + @Test + public void isInService_servicestateNull_returnFalse() { + assertThat(Utils.isInService(null)).isFalse(); + } + + @Test + public void isInService_voiceInService_returnTrue() { + when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE); + assertThat(Utils.isInService(mServiceState)).isTrue(); + } + + @Test + public void isInService_voiceOutOfServiceDataInService_returnTrue() { + when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); + when(mServiceState.getDataRegState()).thenReturn(ServiceState.STATE_IN_SERVICE); + assertThat(Utils.isInService(mServiceState)).isTrue(); + } + + @Test + public void isInService_voiceOutOfServiceDataOutOfService_returnFalse() { + when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); + when(mServiceState.getDataRegState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); + assertThat(Utils.isInService(mServiceState)).isFalse(); + } + + @Test + public void isInService_ServiceStatePowerOff_returnFalse() { + when(mServiceState.getState()).thenReturn(ServiceState.STATE_POWER_OFF); + assertThat(Utils.isInService(mServiceState)).isFalse(); + } + + @Test + public void getCombinedServiceState_servicestateNull_returnOutOfService() { + assertThat(Utils.getCombinedServiceState(null)).isEqualTo( + ServiceState.STATE_OUT_OF_SERVICE); + } + + @Test + public void getCombinedServiceState_ServiceStatePowerOff_returnPowerOff() { + when(mServiceState.getState()).thenReturn(ServiceState.STATE_POWER_OFF); + assertThat(Utils.getCombinedServiceState(mServiceState)).isEqualTo( + ServiceState.STATE_POWER_OFF); + } + + @Test + public void getCombinedServiceState_voiceInService_returnInService() { + when(mServiceState.getState()).thenReturn(ServiceState.STATE_IN_SERVICE); + assertThat(Utils.getCombinedServiceState(mServiceState)).isEqualTo( + ServiceState.STATE_IN_SERVICE); + } + + @Test + public void getCombinedServiceState_voiceOutOfServiceDataInService_returnInService() { + when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); + when(mServiceState.getDataRegState()).thenReturn(ServiceState.STATE_IN_SERVICE); + assertThat(Utils.getCombinedServiceState(mServiceState)).isEqualTo( + ServiceState.STATE_IN_SERVICE); + } + + @Test + public void getCombinedServiceState_voiceOutOfServiceDataOutOfService_returnOutOfService() { + when(mServiceState.getState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); + when(mServiceState.getDataRegState()).thenReturn(ServiceState.STATE_OUT_OF_SERVICE); + assertThat(Utils.getCombinedServiceState(mServiceState)).isEqualTo( + ServiceState.STATE_OUT_OF_SERVICE); + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java index a0466754eb96..8ca14152f080 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java @@ -36,6 +36,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.cdma.EriInfo; import com.android.settingslib.graph.SignalDrawable; +import com.android.settingslib.Utils; import com.android.systemui.R; import com.android.systemui.statusbar.policy.NetworkController.IconState; import com.android.systemui.statusbar.policy.NetworkController.SignalCallback; @@ -319,28 +320,6 @@ public class MobileSignalController extends SignalController< return new MobileState(); } - private boolean hasService() { - if (mServiceState != null) { - // Consider the device to be in service if either voice or data - // service is available. Some SIM cards are marketed as data-only - // and do not support voice service, and on these SIM cards, we - // want to show signal bars for data service as well as the "no - // service" or "emergency calls only" text that indicates that voice - // is not available. - switch (mServiceState.getVoiceRegState()) { - case ServiceState.STATE_POWER_OFF: - return false; - case ServiceState.STATE_OUT_OF_SERVICE: - case ServiceState.STATE_EMERGENCY_ONLY: - return mServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE; - default: - return true; - } - } else { - return false; - } - } - private boolean isCdma() { return (mSignalStrength != null) && !mSignalStrength.isGsm(); } @@ -446,10 +425,11 @@ public class MobileSignalController extends SignalController< */ private final void updateTelephony() { if (DEBUG) { - Log.d(mTag, "updateTelephonySignalStrength: hasService=" + hasService() - + " ss=" + mSignalStrength); + Log.d(mTag, "updateTelephonySignalStrength: hasService=" + + Utils.isInService(mServiceState) + " ss=" + mSignalStrength); } - mCurrentState.connected = hasService() && mSignalStrength != null; + mCurrentState.connected = Utils.isInService(mServiceState) + && mSignalStrength != null; if (mCurrentState.connected) { if (!mSignalStrength.isGsm() && mConfig.alwaysShowCdmaRssi) { mCurrentState.level = mSignalStrength.getCdmaLevel(); |