Loading src/java/com/android/internal/telephony/NetworkScanRequestTracker.java +12 −4 Original line number Diff line number Diff line Loading @@ -79,13 +79,16 @@ public final class NetworkScanRequestTracker { @Override public void handleMessage(Message msg) { Log.d(TAG, "Received Event :" + msg.what); AsyncResult ar; switch (msg.what) { case CMD_START_NETWORK_SCAN: mScheduler.doStartScan((NetworkScanRequestInfo) msg.obj); break; case EVENT_START_NETWORK_SCAN_DONE: mScheduler.startScanDone((AsyncResult) msg.obj); ar = (AsyncResult) msg.obj; mScheduler.startScanDone(ar); ((NetworkScanRequestInfo) ar.userObj).mPhone.setNetworkScanStarted(true); break; case EVENT_RECEIVE_NETWORK_SCAN_RESULT: Loading @@ -97,7 +100,9 @@ public final class NetworkScanRequestTracker { break; case EVENT_STOP_NETWORK_SCAN_DONE: mScheduler.stopScanDone((AsyncResult) msg.obj); ar = (AsyncResult) msg.obj; mScheduler.stopScanDone(ar); ((NetworkScanRequestInfo) ar.userObj).mPhone.setNetworkScanStarted(false); break; case CMD_INTERRUPT_NETWORK_SCAN: Loading @@ -105,17 +110,20 @@ public final class NetworkScanRequestTracker { break; case EVENT_INTERRUPT_NETWORK_SCAN_DONE: mScheduler.interruptScanDone((AsyncResult) msg.obj); ar = (AsyncResult) msg.obj; mScheduler.interruptScanDone(ar); ((NetworkScanRequestInfo) ar.userObj).mPhone.setNetworkScanStarted(false); break; case EVENT_RADIO_UNAVAILABLE: // Fallthrough case EVENT_MODEM_RESET: AsyncResult ar = (AsyncResult) msg.obj; ar = (AsyncResult) msg.obj; mScheduler.deleteScanAndMayNotify( (NetworkScanRequestInfo) ar.userObj, NetworkScan.ERROR_MODEM_ERROR, true); ((NetworkScanRequestInfo) ar.userObj).mPhone.setNetworkScanStarted(false); break; } } Loading src/java/com/android/internal/telephony/Phone.java +19 −0 Original line number Diff line number Diff line Loading @@ -391,6 +391,7 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { private int mPreferredUsageSetting = SubscriptionManager.USAGE_SETTING_UNKNOWN; private int mUsageSettingFromModem = SubscriptionManager.USAGE_SETTING_UNKNOWN; private boolean mIsUsageSettingSupported = true; private boolean mIsNetworkScanStarted = false; //IMS /** Loading Loading @@ -4157,6 +4158,24 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { return false; } /** * Sets the network scan started status. * * @param started {@code true} if the network scan has started, {@code false} otherwise. */ public void setNetworkScanStarted(boolean started) { mIsNetworkScanStarted = started; } /** * Gets the network scan started status. * * @return {@code true} if the network scan has started, {@code false} otherwise. */ public boolean getNetworkScanStarted() { return mIsNetworkScanStarted; } /** * Override the roaming indicator for the current ICCID. */ Loading src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java +40 −2 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import android.util.LocalLog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCallback; import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback; import com.android.internal.telephony.data.DataSettingsManager.DataSettingsManagerCallback; Loading Loading @@ -800,12 +801,17 @@ public class DataStallRecoveryManager extends Handler { } // Skip recovery if it can cause a call to drop if (mPhone.getState() != PhoneConstants.State.IDLE && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) { if (!isPhoneStateIdle() && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) { logl("skip data stall recovery as there is an active call"); return false; } // Skip when network scan started if (isAnyPhoneNetworkScanStarted()) { logl("skip data stall recovery as network scan started"); return false; } // Skip when poor signal strength if (mPhone.getSignalStrength().getLevel() <= CellSignalStrength.SIGNAL_STRENGTH_POOR) { logl("skip data stall recovery as in poor signal condition"); Loading @@ -824,6 +830,38 @@ public class DataStallRecoveryManager extends Handler { return true; } /** * Checks if any network scan is currently started on any of the available phones. * * @return {@code true} if any network scan is started on any phone; {@code false} otherwise. */ private boolean isAnyPhoneNetworkScanStarted() { for (Phone phone : PhoneFactory.getPhones()) { logl("NetworkScanStarted: " + phone.getNetworkScanStarted() + " on phone" + phone.getPhoneId()); if (phone.getNetworkScanStarted()) { return true; } } return false; } /** * Check whether the phone state is {@link PhoneConstants.State#IDLE} for all phones. * If any phone is not IDLE (voice call active on any phone), do not trigger recovery. * * @return {@code true} if all phones are IDLE and {@code false} if any phones are not IDLE. */ private boolean isPhoneStateIdle() { for (Phone phone : PhoneFactory.getPhones()) { logl("Phone State: " + phone.getState() + " on phone" + phone.getPhoneId()); if (phone.getState() != PhoneConstants.State.IDLE) { return false; } } return true; } /** * Set the validation status into metrics. * Loading tests/telephonytests/src/com/android/internal/telephony/data/DataStallRecoveryManagerTest.java +21 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static org.mockito.Matchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading Loading @@ -581,4 +582,24 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { // recovery action will jump to modem reset action if user doing the radio restart. assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(4); } @Test public void testDoNotDoRecoveryActionWhenActiveCall() throws Exception { sendOnInternetDataNetworkCallback(true); mDataStallRecoveryManager.setRecoveryAction( DataStallRecoveryManager.RECOVERY_ACTION_RADIO_RESTART); doReturn(mSignalStrength).when(mPhone).getSignalStrength(); // Simulate active call doReturn(PhoneConstants.State.OFFHOOK).when(mPhone).getState(); logd("Sending validation failed callback"); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); verify(mSST, never()).powerOffRadioSafely(); verify(mPhone, never()).rebootModem(any()); assertThat(mDataStallRecoveryManager.getRecoveryAction()) .isEqualTo(DataStallRecoveryManager.RECOVERY_ACTION_RADIO_RESTART); } } Loading
src/java/com/android/internal/telephony/NetworkScanRequestTracker.java +12 −4 Original line number Diff line number Diff line Loading @@ -79,13 +79,16 @@ public final class NetworkScanRequestTracker { @Override public void handleMessage(Message msg) { Log.d(TAG, "Received Event :" + msg.what); AsyncResult ar; switch (msg.what) { case CMD_START_NETWORK_SCAN: mScheduler.doStartScan((NetworkScanRequestInfo) msg.obj); break; case EVENT_START_NETWORK_SCAN_DONE: mScheduler.startScanDone((AsyncResult) msg.obj); ar = (AsyncResult) msg.obj; mScheduler.startScanDone(ar); ((NetworkScanRequestInfo) ar.userObj).mPhone.setNetworkScanStarted(true); break; case EVENT_RECEIVE_NETWORK_SCAN_RESULT: Loading @@ -97,7 +100,9 @@ public final class NetworkScanRequestTracker { break; case EVENT_STOP_NETWORK_SCAN_DONE: mScheduler.stopScanDone((AsyncResult) msg.obj); ar = (AsyncResult) msg.obj; mScheduler.stopScanDone(ar); ((NetworkScanRequestInfo) ar.userObj).mPhone.setNetworkScanStarted(false); break; case CMD_INTERRUPT_NETWORK_SCAN: Loading @@ -105,17 +110,20 @@ public final class NetworkScanRequestTracker { break; case EVENT_INTERRUPT_NETWORK_SCAN_DONE: mScheduler.interruptScanDone((AsyncResult) msg.obj); ar = (AsyncResult) msg.obj; mScheduler.interruptScanDone(ar); ((NetworkScanRequestInfo) ar.userObj).mPhone.setNetworkScanStarted(false); break; case EVENT_RADIO_UNAVAILABLE: // Fallthrough case EVENT_MODEM_RESET: AsyncResult ar = (AsyncResult) msg.obj; ar = (AsyncResult) msg.obj; mScheduler.deleteScanAndMayNotify( (NetworkScanRequestInfo) ar.userObj, NetworkScan.ERROR_MODEM_ERROR, true); ((NetworkScanRequestInfo) ar.userObj).mPhone.setNetworkScanStarted(false); break; } } Loading
src/java/com/android/internal/telephony/Phone.java +19 −0 Original line number Diff line number Diff line Loading @@ -391,6 +391,7 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { private int mPreferredUsageSetting = SubscriptionManager.USAGE_SETTING_UNKNOWN; private int mUsageSettingFromModem = SubscriptionManager.USAGE_SETTING_UNKNOWN; private boolean mIsUsageSettingSupported = true; private boolean mIsNetworkScanStarted = false; //IMS /** Loading Loading @@ -4157,6 +4158,24 @@ public abstract class Phone extends Handler implements PhoneInternalInterface { return false; } /** * Sets the network scan started status. * * @param started {@code true} if the network scan has started, {@code false} otherwise. */ public void setNetworkScanStarted(boolean started) { mIsNetworkScanStarted = started; } /** * Gets the network scan started status. * * @return {@code true} if the network scan has started, {@code false} otherwise. */ public boolean getNetworkScanStarted() { return mIsNetworkScanStarted; } /** * Override the roaming indicator for the current ICCID. */ Loading
src/java/com/android/internal/telephony/data/DataStallRecoveryManager.java +40 −2 Original line number Diff line number Diff line Loading @@ -46,6 +46,7 @@ import android.util.LocalLog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.data.DataConfigManager.DataConfigManagerCallback; import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback; import com.android.internal.telephony.data.DataSettingsManager.DataSettingsManagerCallback; Loading Loading @@ -800,12 +801,17 @@ public class DataStallRecoveryManager extends Handler { } // Skip recovery if it can cause a call to drop if (mPhone.getState() != PhoneConstants.State.IDLE && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) { if (!isPhoneStateIdle() && getRecoveryAction() > RECOVERY_ACTION_CLEANUP) { logl("skip data stall recovery as there is an active call"); return false; } // Skip when network scan started if (isAnyPhoneNetworkScanStarted()) { logl("skip data stall recovery as network scan started"); return false; } // Skip when poor signal strength if (mPhone.getSignalStrength().getLevel() <= CellSignalStrength.SIGNAL_STRENGTH_POOR) { logl("skip data stall recovery as in poor signal condition"); Loading @@ -824,6 +830,38 @@ public class DataStallRecoveryManager extends Handler { return true; } /** * Checks if any network scan is currently started on any of the available phones. * * @return {@code true} if any network scan is started on any phone; {@code false} otherwise. */ private boolean isAnyPhoneNetworkScanStarted() { for (Phone phone : PhoneFactory.getPhones()) { logl("NetworkScanStarted: " + phone.getNetworkScanStarted() + " on phone" + phone.getPhoneId()); if (phone.getNetworkScanStarted()) { return true; } } return false; } /** * Check whether the phone state is {@link PhoneConstants.State#IDLE} for all phones. * If any phone is not IDLE (voice call active on any phone), do not trigger recovery. * * @return {@code true} if all phones are IDLE and {@code false} if any phones are not IDLE. */ private boolean isPhoneStateIdle() { for (Phone phone : PhoneFactory.getPhones()) { logl("Phone State: " + phone.getState() + " on phone" + phone.getPhoneId()); if (phone.getState() != PhoneConstants.State.IDLE) { return false; } } return true; } /** * Set the validation status into metrics. * Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataStallRecoveryManagerTest.java +21 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static org.mockito.Matchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; Loading Loading @@ -581,4 +582,24 @@ public class DataStallRecoveryManagerTest extends TelephonyTest { // recovery action will jump to modem reset action if user doing the radio restart. assertThat(mDataStallRecoveryManager.getRecoveryAction()).isEqualTo(4); } @Test public void testDoNotDoRecoveryActionWhenActiveCall() throws Exception { sendOnInternetDataNetworkCallback(true); mDataStallRecoveryManager.setRecoveryAction( DataStallRecoveryManager.RECOVERY_ACTION_RADIO_RESTART); doReturn(mSignalStrength).when(mPhone).getSignalStrength(); // Simulate active call doReturn(PhoneConstants.State.OFFHOOK).when(mPhone).getState(); logd("Sending validation failed callback"); sendValidationStatusCallback(NetworkAgent.VALIDATION_STATUS_NOT_VALID); processAllFutureMessages(); verify(mSST, never()).powerOffRadioSafely(); verify(mPhone, never()).rebootModem(any()); assertThat(mDataStallRecoveryManager.getRecoveryAction()) .isEqualTo(DataStallRecoveryManager.RECOVERY_ACTION_RADIO_RESTART); } }