aboutsummaryrefslogtreecommitdiff
path: root/src/java/com/android/internal/telephony/NetworkTypeController.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com/android/internal/telephony/NetworkTypeController.java')
-rw-r--r--src/java/com/android/internal/telephony/NetworkTypeController.java101
1 files changed, 61 insertions, 40 deletions
diff --git a/src/java/com/android/internal/telephony/NetworkTypeController.java b/src/java/com/android/internal/telephony/NetworkTypeController.java
index db4fd89c4c..deb8427385 100644
--- a/src/java/com/android/internal/telephony/NetworkTypeController.java
+++ b/src/java/com/android/internal/telephony/NetworkTypeController.java
@@ -37,6 +37,9 @@ import android.telephony.TelephonyDisplayInfo;
import android.telephony.TelephonyManager;
import android.telephony.data.DataCallResponse;
import android.telephony.data.DataCallResponse.LinkStatus;
+import android.telephony.data.EpsQos;
+import android.telephony.data.NrQos;
+import android.telephony.data.QosBearerSession;
import android.text.TextUtils;
import com.android.internal.telephony.data.DataNetworkController.DataNetworkControllerCallback;
@@ -112,8 +115,10 @@ public class NetworkTypeController extends StateMachine {
private static final int EVENT_PHYSICAL_CHANNEL_CONFIGS_CHANGED = 11;
/** Event for device idle mode changed, when device goes to deep sleep and pauses all timers. */
private static final int EVENT_DEVICE_IDLE_MODE_CHANGED = 12;
+ /** Event for qos sessions changed. */
+ private static final int EVENT_QOS_SESSION_CHANGED = 13;
- private static final String[] sEvents = new String[EVENT_DEVICE_IDLE_MODE_CHANGED + 1];
+ private static final String[] sEvents = new String[EVENT_QOS_SESSION_CHANGED + 1];
static {
sEvents[EVENT_UPDATE] = "EVENT_UPDATE";
sEvents[EVENT_QUIT] = "EVENT_QUIT";
@@ -129,6 +134,7 @@ public class NetworkTypeController extends StateMachine {
sEvents[EVENT_INITIALIZE] = "EVENT_INITIALIZE";
sEvents[EVENT_PHYSICAL_CHANNEL_CONFIGS_CHANGED] = "EVENT_PHYSICAL_CHANNEL_CONFIGS_CHANGED";
sEvents[EVENT_DEVICE_IDLE_MODE_CHANGED] = "EVENT_DEVICE_IDLE_MODE_CHANGED";
+ sEvents[EVENT_QOS_SESSION_CHANGED] = "EVENT_QOS_SESSION_CHANGED";
}
@NonNull private final Phone mPhone;
@@ -158,6 +164,31 @@ public class NetworkTypeController extends StateMachine {
}
};
+ @NonNull private final DataNetworkControllerCallback mDataNetworkControllerCallback =
+ new DataNetworkControllerCallback(getHandler()::post) {
+ @Override
+ public void onQosSessionsChanged(
+ @NonNull List<QosBearerSession> qosBearerSessions) {
+ if (!mIsTimerResetEnabledOnVoiceQos) return;
+ sendMessage(obtainMessage(EVENT_QOS_SESSION_CHANGED, qosBearerSessions));
+ }
+
+ @Override
+ public void onNrAdvancedCapableByPcoChanged(boolean nrAdvancedCapable) {
+ if (mNrAdvancedCapablePcoId <= 0) return;
+ log("mIsNrAdvancedAllowedByPco=" + nrAdvancedCapable);
+ mIsNrAdvancedAllowedByPco = nrAdvancedCapable;
+ sendMessage(EVENT_UPDATE);
+ }
+
+ @Override
+ public void onPhysicalLinkStatusChanged(@LinkStatus int status) {
+ if (isUsingPhysicalChannelConfigForRrcDetection()) return;
+ sendMessage(obtainMessage(EVENT_PHYSICAL_LINK_STATUS_CHANGED,
+ new AsyncResult(null, status, null)));
+ }
+ };
+
@NonNull private Map<String, OverrideTimerRule> mOverrideTimerRules = new HashMap<>();
@NonNull private String mLteEnhancedPattern = "";
@Annotation.OverrideNetworkType private int mOverrideNetworkType;
@@ -165,7 +196,10 @@ public class NetworkTypeController extends StateMachine {
private boolean mIsPrimaryTimerActive;
private boolean mIsSecondaryTimerActive;
private boolean mIsTimerResetEnabledForLegacyStateRrcIdle;
+ /** Carrier config to reset timers when mccmnc changes */
private boolean mIsTimerResetEnabledOnPlmnChanges;
+ /** Carrier config to reset timers when QCI(LTE) or 5QI(NR) is 1(conversational voice) */
+ private boolean mIsTimerResetEnabledOnVoiceQos;
private int mLtePlusThresholdBandwidth;
private int mNrAdvancedThresholdBandwidth;
private boolean mIncludeLteForNrAdvancedThresholdBandwidth;
@@ -185,9 +219,6 @@ public class NetworkTypeController extends StateMachine {
private boolean mIsDeviceIdleMode = false;
private boolean mPrimaryCellChangedWhileIdle = false;
- @Nullable private DataNetworkControllerCallback mNrAdvancedCapableByPcoChangedCallback = null;
- @Nullable private DataNetworkControllerCallback mNrPhysicalLinkStatusChangedCallback = null;
-
// Cached copies below to prevent race conditions
@NonNull private ServiceState mServiceState;
@Nullable private List<PhysicalChannelConfig> mPhysicalChannelConfigs;
@@ -276,6 +307,8 @@ public class NetworkTypeController extends StateMachine {
TelephonyManager.CAPABILITY_PHYSICAL_CHANNEL_CONFIG_1_6_SUPPORTED);
mPhone.getDeviceStateMonitor().registerForPhysicalChannelConfigNotifChanged(getHandler(),
EVENT_PHYSICAL_CHANNEL_CONFIG_NOTIF_CHANGED, null);
+ mPhone.getDataNetworkController().registerDataNetworkControllerCallback(
+ mDataNetworkControllerCallback);
IntentFilter filter = new IntentFilter();
filter.addAction(PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED);
mPhone.getContext().registerReceiver(mIntentReceiver, filter, null, mPhone);
@@ -288,6 +321,8 @@ public class NetworkTypeController extends StateMachine {
mPhone.unregisterForPreferredNetworkTypeChanged(getHandler());
mPhone.getServiceStateTracker().unregisterForServiceStateChanged(getHandler());
mPhone.getDeviceStateMonitor().unregisterForPhysicalChannelConfigNotifChanged(getHandler());
+ mPhone.getDataNetworkController().unregisterDataNetworkControllerCallback(
+ mDataNetworkControllerCallback);
mPhone.getContext().unregisterReceiver(mIntentReceiver);
CarrierConfigManager ccm = mPhone.getContext().getSystemService(CarrierConfigManager.class);
if (mCarrierConfigChangeListener != null) {
@@ -311,6 +346,8 @@ public class NetworkTypeController extends StateMachine {
CarrierConfigManager.KEY_NR_TIMERS_RESET_IF_NON_ENDC_AND_RRC_IDLE_BOOL);
mIsTimerResetEnabledOnPlmnChanges = config.getBoolean(
CarrierConfigManager.KEY_NR_TIMERS_RESET_ON_PLMN_CHANGE_BOOL);
+ mIsTimerResetEnabledOnVoiceQos = config.getBoolean(
+ CarrierConfigManager.KEY_NR_TIMERS_RESET_ON_VOICE_QOS_BOOL);
mLtePlusThresholdBandwidth = config.getInt(
CarrierConfigManager.KEY_LTE_PLUS_THRESHOLD_BANDWIDTH_KHZ_INT);
mNrAdvancedThresholdBandwidth = config.getInt(
@@ -329,43 +366,8 @@ public class NetworkTypeController extends StateMachine {
}
mNrAdvancedCapablePcoId = config.getInt(
CarrierConfigManager.KEY_NR_ADVANCED_CAPABLE_PCO_ID_INT);
- if (mNrAdvancedCapablePcoId > 0 && mNrAdvancedCapableByPcoChangedCallback == null) {
- mNrAdvancedCapableByPcoChangedCallback =
- new DataNetworkControllerCallback(getHandler()::post) {
- @Override
- public void onNrAdvancedCapableByPcoChanged(boolean nrAdvancedCapable) {
- log("mIsNrAdvancedAllowedByPco=" + nrAdvancedCapable);
- mIsNrAdvancedAllowedByPco = nrAdvancedCapable;
- sendMessage(EVENT_UPDATE);
- }
- };
- mPhone.getDataNetworkController().registerDataNetworkControllerCallback(
- mNrAdvancedCapableByPcoChangedCallback);
- } else if (mNrAdvancedCapablePcoId == 0 && mNrAdvancedCapableByPcoChangedCallback != null) {
- mPhone.getDataNetworkController().unregisterDataNetworkControllerCallback(
- mNrAdvancedCapableByPcoChangedCallback);
- mNrAdvancedCapableByPcoChangedCallback = null;
- }
mIsUsingUserDataForRrcDetection = config.getBoolean(
CarrierConfigManager.KEY_LTE_ENDC_USING_USER_DATA_FOR_RRC_DETECTION_BOOL);
- if (!isUsingPhysicalChannelConfigForRrcDetection()) {
- if (mNrPhysicalLinkStatusChangedCallback == null) {
- mNrPhysicalLinkStatusChangedCallback =
- new DataNetworkControllerCallback(getHandler()::post) {
- @Override
- public void onPhysicalLinkStatusChanged(@LinkStatus int status) {
- sendMessage(obtainMessage(EVENT_PHYSICAL_LINK_STATUS_CHANGED,
- new AsyncResult(null, status, null)));
- }
- };
- mPhone.getDataNetworkController().registerDataNetworkControllerCallback(
- mNrPhysicalLinkStatusChangedCallback);
- }
- } else if (mNrPhysicalLinkStatusChangedCallback != null) {
- mPhone.getDataNetworkController().unregisterDataNetworkControllerCallback(
- mNrPhysicalLinkStatusChangedCallback);
- mNrPhysicalLinkStatusChangedCallback = null;
- }
mNrAdvancedBandsSecondaryTimer = config.getInt(
CarrierConfigManager.KEY_NR_ADVANCED_BANDS_SECONDARY_TIMER_SECONDS_INT);
String nrIconConfiguration = config.getString(
@@ -703,6 +705,24 @@ public class NetworkTypeController extends StateMachine {
}
transitionToCurrentState();
break;
+ case EVENT_QOS_SESSION_CHANGED:
+ List<QosBearerSession> qosBearerSessions = (List<QosBearerSession>) msg.obj;
+ boolean inVoiceCall = false;
+ for (QosBearerSession session : qosBearerSessions) {
+ // TS 23.203 23.501 - 1 means conversational voice
+ if (session.getQos() instanceof EpsQos qos) {
+ inVoiceCall = qos.getQci() == 1;
+ } else if (session.getQos() instanceof NrQos qos) {
+ inVoiceCall = qos.get5Qi() == 1;
+ }
+ if (inVoiceCall) {
+ if (DBG) log("Device in voice call, reset all timers");
+ resetAllTimers();
+ transitionToCurrentState();
+ break;
+ }
+ }
+ break;
default:
throw new RuntimeException("Received invalid event: " + msg.what);
}
@@ -772,6 +792,7 @@ public class NetworkTypeController extends StateMachine {
if (mIsTimerResetEnabledForLegacyStateRrcIdle && !isPhysicalLinkActive()) {
if (DBG) log("Reset timers since timer reset is enabled for RRC idle.");
resetAllTimers();
+ updateOverrideNetworkType();
}
}
break;
@@ -1338,7 +1359,7 @@ public class NetworkTypeController extends StateMachine {
int duration = rule.getSecondaryTimer(currentName);
if (mLastShownNrDueToAdvancedBand && mNrAdvancedBandsSecondaryTimer > 0) {
duration = mNrAdvancedBandsSecondaryTimer;
- if (DBG) log("secondary timer adjusted by nr_advanced_bands_secondary_timer_long");
+ if (DBG) log("timer adjusted by nr_advanced_bands_secondary_timer_seconds_int");
}
if (DBG) log(duration + "s secondary timer started for state: " + currentName);
mSecondaryTimerState = currentName;