Loading src/java/com/android/internal/telephony/SignalStrengthController.java +28 −23 Original line number Diff line number Diff line Loading @@ -294,31 +294,38 @@ public class SignalStrengthController extends Handler { } /** * 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) { // This signal is used for both voice and data radio signal so parse // all fields private void onSignalStrengthResult(@NonNull AsyncResult ar) { // 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 { 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 { log("onSignalStrengthResult() Exception from RIL : " + ar.exception); mSignalStrength = new SignalStrength(); loge("updateSignalStrength: serviceStateTracker is null"); } mSignalStrengthUpdatedTime = System.currentTimeMillis(); boolean ssChanged = notifySignalStrength(); return ssChanged; notifySignalStrength(); } /** Loading Loading @@ -720,20 +727,17 @@ public class SignalStrengthController extends Handler { 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; } /** Loading Loading @@ -1132,6 +1136,7 @@ public class SignalStrengthController extends Handler { updateArfcnLists(); updateReportingCriteria(); updateSignalStrength(new SignalStrength(mSignalStrength)); } private static SignalThresholdInfo createSignalThresholdsInfo( Loading tests/telephonytests/src/com/android/internal/telephony/SignalStrengthControllerTest.java +53 −0 Original line number Diff line number Diff line Loading @@ -959,6 +959,59 @@ public class SignalStrengthControllerTest extends TelephonyTest { 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 = Loading Loading
src/java/com/android/internal/telephony/SignalStrengthController.java +28 −23 Original line number Diff line number Diff line Loading @@ -294,31 +294,38 @@ public class SignalStrengthController extends Handler { } /** * 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) { // This signal is used for both voice and data radio signal so parse // all fields private void onSignalStrengthResult(@NonNull AsyncResult ar) { // 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 { 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 { log("onSignalStrengthResult() Exception from RIL : " + ar.exception); mSignalStrength = new SignalStrength(); loge("updateSignalStrength: serviceStateTracker is null"); } mSignalStrengthUpdatedTime = System.currentTimeMillis(); boolean ssChanged = notifySignalStrength(); return ssChanged; notifySignalStrength(); } /** Loading Loading @@ -720,20 +727,17 @@ public class SignalStrengthController extends Handler { 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; } /** Loading Loading @@ -1132,6 +1136,7 @@ public class SignalStrengthController extends Handler { updateArfcnLists(); updateReportingCriteria(); updateSignalStrength(new SignalStrength(mSignalStrength)); } private static SignalThresholdInfo createSignalThresholdsInfo( Loading
tests/telephonytests/src/com/android/internal/telephony/SignalStrengthControllerTest.java +53 −0 Original line number Diff line number Diff line Loading @@ -959,6 +959,59 @@ public class SignalStrengthControllerTest extends TelephonyTest { 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 = Loading