Update signal strength level on carrier config changed
Bug: 222128835
Test: SMS, MMS, call with live network.
atest com.android.internal.telephony.SignalStrengthControllerTest
Change-Id: I2c4fbe1834f24a73d75c5ac507f3c08d1e089401
Merged-In: I2c4fbe1834f24a73d75c5ac507f3c08d1e089401
diff --git a/src/java/com/android/internal/telephony/SignalStrengthController.java b/src/java/com/android/internal/telephony/SignalStrengthController.java
index c6f5589..56e6279 100644
--- a/src/java/com/android/internal/telephony/SignalStrengthController.java
+++ b/src/java/com/android/internal/telephony/SignalStrengthController.java
@@ -313,31 +313,38 @@
}
/**
- * send signal-strength-changed notification if changed Called both for
- * solicited and unsolicited signal strength updates
- *
- * @return true if the signal strength changed and a notification was sent.
+ * Send signal-strength-changed notification if changed. Called for both solicited and
+ * unsolicited signal strength updates.
*/
- private boolean onSignalStrengthResult(@NonNull AsyncResult ar) {
+ private void onSignalStrengthResult(@NonNull AsyncResult ar) {
+ // This signal is used for both voice and data radio signal so parse all fields.
- // This signal is used for both voice and data radio signal so parse
- // all fields
-
+ SignalStrength signalStrength;
if ((ar.exception == null) && (ar.result != null)) {
- mSignalStrength = (SignalStrength) ar.result;
-
- if (mPhone.getServiceStateTracker() != null) {
- mSignalStrength.updateLevel(mCarrierConfig, mPhone.getServiceStateTracker().mSS);
- }
+ signalStrength = (SignalStrength) ar.result;
} else {
- log("onSignalStrengthResult() Exception from RIL : " + ar.exception);
- mSignalStrength = new SignalStrength();
+ loge("onSignalStrengthResult() Exception from RIL : " + ar.exception);
+ signalStrength = new SignalStrength();
+ }
+ updateSignalStrength(signalStrength);
+ }
+
+ /**
+ * Set {@code mSignalStrength} to the input argument {@code signalStrength}, update its level,
+ * and send signal-strength-changed notification if changed.
+ *
+ * @param signalStrength The new SignalStrength used for updating {@code mSignalStrength}.
+ */
+ private void updateSignalStrength(@NonNull SignalStrength signalStrength) {
+ mSignalStrength = signalStrength;
+ ServiceStateTracker serviceStateTracker = mPhone.getServiceStateTracker();
+ if (serviceStateTracker != null) {
+ mSignalStrength.updateLevel(mCarrierConfig, serviceStateTracker.mSS);
+ } else {
+ loge("updateSignalStrength: serviceStateTracker is null");
}
mSignalStrengthUpdatedTime = System.currentTimeMillis();
-
- boolean ssChanged = notifySignalStrength();
-
- return ssChanged;
+ notifySignalStrength();
}
/**
@@ -606,20 +613,17 @@
mSignalStrengthUpdatedTime = System.currentTimeMillis();
}
- boolean notifySignalStrength() {
- boolean notified = false;
+ void notifySignalStrength() {
if (!mSignalStrength.equals(mLastSignalStrength)) {
try {
mSignalStrengthChangedRegistrants.notifyRegistrants();
mPhone.notifySignalStrength();
- notified = true;
mLastSignalStrength = mSignalStrength;
} catch (NullPointerException ex) {
- log("updateSignalStrength() Phone already destroyed: " + ex
+ loge("updateSignalStrength() Phone already destroyed: " + ex
+ "SignalStrength not notified");
}
}
- return notified;
}
/**
@@ -1016,6 +1020,7 @@
updateArfcnLists();
updateReportingCriteria();
+ updateSignalStrength(new SignalStrength(mSignalStrength));
}
private static SignalThresholdInfo createSignalThresholdsInfo(
diff --git a/tests/telephonytests/src/com/android/internal/telephony/SignalStrengthControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/SignalStrengthControllerTest.java
index 136f3a1..0a577b2 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/SignalStrengthControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/SignalStrengthControllerTest.java
@@ -737,6 +737,59 @@
assertThat(msgCaptor.getValue().what).isEqualTo(ssChangedEvent);
}
+ @Test
+ public void testSignalStrengthLevelUpdatedDueToCarrierConfigChanged() {
+ Handler mockRegistrant = Mockito.mock(Handler.class);
+ ArgumentCaptor<Message> msgCaptor = ArgumentCaptor.forClass(Message.class);
+ int ssChangedEvent = 0;
+ mSsc.registerForSignalStrengthChanged(mockRegistrant, ssChangedEvent, null);
+
+ SignalStrength ss = new SignalStrength(
+ new CellSignalStrengthCdma(),
+ new CellSignalStrengthGsm(),
+ new CellSignalStrengthWcdma(),
+ new CellSignalStrengthTdscdma(),
+ new CellSignalStrengthLte(
+ -110, /* rssi */
+ -114, /* rsrp */
+ -5, /* rsrq */
+ 0, /* rssnr */
+ SignalStrength.INVALID, /* cqi */
+ SignalStrength.INVALID /* ta */),
+ new CellSignalStrengthNr());
+
+ mBundle.putBoolean(CarrierConfigManager.KEY_USE_ONLY_RSRP_FOR_LTE_SIGNAL_BAR_BOOL, true);
+
+ sendCarrierConfigUpdate();
+ verify(mockRegistrant).sendMessageDelayed(msgCaptor.capture(), Mockito.anyLong());
+ assertThat(msgCaptor.getValue().what).isEqualTo(ssChangedEvent);
+ assertEquals(CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN,
+ mSsc.getSignalStrength().getLevel());
+
+ Mockito.clearInvocations(mockRegistrant);
+ mSimulatedCommands.setSignalStrength(ss);
+ mSimulatedCommands.notifySignalStrength();
+ processAllMessages();
+ // Default thresholds are POOR=-115 MODERATE=-105 GOOD=-95 GREAT=-85
+ assertEquals(CellSignalStrength.SIGNAL_STRENGTH_POOR, mSsc.getSignalStrength().getLevel());
+ verify(mockRegistrant).sendMessageDelayed(msgCaptor.capture(), Mockito.anyLong());
+ assertThat(msgCaptor.getValue().what).isEqualTo(ssChangedEvent);
+
+ Mockito.clearInvocations(mockRegistrant);
+ int[] lteThresholds = {
+ -130, // SIGNAL_STRENGTH_POOR
+ -120, // SIGNAL_STRENGTH_MODERATE
+ -110, // SIGNAL_STRENGTH_GOOD
+ -100, // SIGNAL_STRENGTH_GREAT
+ };
+ mBundle.putIntArray(CarrierConfigManager.KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY, lteThresholds);
+ sendCarrierConfigUpdate();
+ assertEquals(CellSignalStrength.SIGNAL_STRENGTH_MODERATE,
+ mSsc.getSignalStrength().getLevel());
+ verify(mockRegistrant).sendMessageDelayed(msgCaptor.capture(), Mockito.anyLong());
+ assertThat(msgCaptor.getValue().what).isEqualTo(ssChangedEvent);
+ }
+
private void verifyAllEmptyThresholdAreDisabledWhenSetSignalStrengthReportingCriteria(
int expectedNonEmptyThreshold) {
ArgumentCaptor<List<SignalThresholdInfo>> signalThresholdInfoCaptor =