Loading src/java/com/android/internal/telephony/SignalStrengthController.java +28 −23 Original line number Original line Diff line number Diff line Loading @@ -313,31 +313,38 @@ public class SignalStrengthController extends Handler { } } /** /** * send signal-strength-changed notification if changed Called both for * Send signal-strength-changed notification if changed. Called for both solicited and * solicited and unsolicited signal strength updates * unsolicited signal strength updates. * * @return true if the signal strength changed and a notification was sent. */ */ 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)) { if ((ar.exception == null) && (ar.result != null)) { mSignalStrength = (SignalStrength) ar.result; signalStrength = (SignalStrength) ar.result; } else { if (mPhone.getServiceStateTracker() != null) { loge("onSignalStrengthResult() Exception from RIL : " + ar.exception); mSignalStrength.updateLevel(mCarrierConfig, mPhone.getServiceStateTracker().mSS); 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 { } else { log("onSignalStrengthResult() Exception from RIL : " + ar.exception); loge("updateSignalStrength: serviceStateTracker is null"); mSignalStrength = new SignalStrength(); } } mSignalStrengthUpdatedTime = System.currentTimeMillis(); mSignalStrengthUpdatedTime = System.currentTimeMillis(); notifySignalStrength(); boolean ssChanged = notifySignalStrength(); return ssChanged; } } /** /** Loading Loading @@ -606,20 +613,17 @@ public class SignalStrengthController extends Handler { mSignalStrengthUpdatedTime = System.currentTimeMillis(); mSignalStrengthUpdatedTime = System.currentTimeMillis(); } } boolean notifySignalStrength() { void notifySignalStrength() { boolean notified = false; if (!mSignalStrength.equals(mLastSignalStrength)) { if (!mSignalStrength.equals(mLastSignalStrength)) { try { try { mSignalStrengthChangedRegistrants.notifyRegistrants(); mSignalStrengthChangedRegistrants.notifyRegistrants(); mPhone.notifySignalStrength(); mPhone.notifySignalStrength(); notified = true; mLastSignalStrength = mSignalStrength; mLastSignalStrength = mSignalStrength; } catch (NullPointerException ex) { } catch (NullPointerException ex) { log("updateSignalStrength() Phone already destroyed: " + ex loge("updateSignalStrength() Phone already destroyed: " + ex + "SignalStrength not notified"); + "SignalStrength not notified"); } } } } return notified; } } /** /** Loading Loading @@ -1016,6 +1020,7 @@ public class SignalStrengthController extends Handler { updateArfcnLists(); updateArfcnLists(); updateReportingCriteria(); updateReportingCriteria(); updateSignalStrength(new SignalStrength(mSignalStrength)); } } private static SignalThresholdInfo createSignalThresholdsInfo( private static SignalThresholdInfo createSignalThresholdsInfo( Loading tests/telephonytests/src/com/android/internal/telephony/SignalStrengthControllerTest.java +53 −0 Original line number Original line Diff line number Diff line Loading @@ -737,6 +737,59 @@ public class SignalStrengthControllerTest extends TelephonyTest { assertThat(msgCaptor.getValue().what).isEqualTo(ssChangedEvent); 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( private void verifyAllEmptyThresholdAreDisabledWhenSetSignalStrengthReportingCriteria( int expectedNonEmptyThreshold) { int expectedNonEmptyThreshold) { ArgumentCaptor<List<SignalThresholdInfo>> signalThresholdInfoCaptor = ArgumentCaptor<List<SignalThresholdInfo>> signalThresholdInfoCaptor = Loading Loading
src/java/com/android/internal/telephony/SignalStrengthController.java +28 −23 Original line number Original line Diff line number Diff line Loading @@ -313,31 +313,38 @@ public class SignalStrengthController extends Handler { } } /** /** * send signal-strength-changed notification if changed Called both for * Send signal-strength-changed notification if changed. Called for both solicited and * solicited and unsolicited signal strength updates * unsolicited signal strength updates. * * @return true if the signal strength changed and a notification was sent. */ */ 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)) { if ((ar.exception == null) && (ar.result != null)) { mSignalStrength = (SignalStrength) ar.result; signalStrength = (SignalStrength) ar.result; } else { if (mPhone.getServiceStateTracker() != null) { loge("onSignalStrengthResult() Exception from RIL : " + ar.exception); mSignalStrength.updateLevel(mCarrierConfig, mPhone.getServiceStateTracker().mSS); 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 { } else { log("onSignalStrengthResult() Exception from RIL : " + ar.exception); loge("updateSignalStrength: serviceStateTracker is null"); mSignalStrength = new SignalStrength(); } } mSignalStrengthUpdatedTime = System.currentTimeMillis(); mSignalStrengthUpdatedTime = System.currentTimeMillis(); notifySignalStrength(); boolean ssChanged = notifySignalStrength(); return ssChanged; } } /** /** Loading Loading @@ -606,20 +613,17 @@ public class SignalStrengthController extends Handler { mSignalStrengthUpdatedTime = System.currentTimeMillis(); mSignalStrengthUpdatedTime = System.currentTimeMillis(); } } boolean notifySignalStrength() { void notifySignalStrength() { boolean notified = false; if (!mSignalStrength.equals(mLastSignalStrength)) { if (!mSignalStrength.equals(mLastSignalStrength)) { try { try { mSignalStrengthChangedRegistrants.notifyRegistrants(); mSignalStrengthChangedRegistrants.notifyRegistrants(); mPhone.notifySignalStrength(); mPhone.notifySignalStrength(); notified = true; mLastSignalStrength = mSignalStrength; mLastSignalStrength = mSignalStrength; } catch (NullPointerException ex) { } catch (NullPointerException ex) { log("updateSignalStrength() Phone already destroyed: " + ex loge("updateSignalStrength() Phone already destroyed: " + ex + "SignalStrength not notified"); + "SignalStrength not notified"); } } } } return notified; } } /** /** Loading Loading @@ -1016,6 +1020,7 @@ public class SignalStrengthController extends Handler { updateArfcnLists(); updateArfcnLists(); updateReportingCriteria(); updateReportingCriteria(); updateSignalStrength(new SignalStrength(mSignalStrength)); } } private static SignalThresholdInfo createSignalThresholdsInfo( private static SignalThresholdInfo createSignalThresholdsInfo( Loading
tests/telephonytests/src/com/android/internal/telephony/SignalStrengthControllerTest.java +53 −0 Original line number Original line Diff line number Diff line Loading @@ -737,6 +737,59 @@ public class SignalStrengthControllerTest extends TelephonyTest { assertThat(msgCaptor.getValue().what).isEqualTo(ssChangedEvent); 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( private void verifyAllEmptyThresholdAreDisabledWhenSetSignalStrengthReportingCriteria( int expectedNonEmptyThreshold) { int expectedNonEmptyThreshold) { ArgumentCaptor<List<SignalThresholdInfo>> signalThresholdInfoCaptor = ArgumentCaptor<List<SignalThresholdInfo>> signalThresholdInfoCaptor = Loading