aboutsummaryrefslogtreecommitdiff
path: root/src/java/com/android/internal/telephony/metrics/ServiceStateStats.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com/android/internal/telephony/metrics/ServiceStateStats.java')
-rw-r--r--src/java/com/android/internal/telephony/metrics/ServiceStateStats.java67
1 files changed, 65 insertions, 2 deletions
diff --git a/src/java/com/android/internal/telephony/metrics/ServiceStateStats.java b/src/java/com/android/internal/telephony/metrics/ServiceStateStats.java
index b830cd00d2..b6563dd4db 100644
--- a/src/java/com/android/internal/telephony/metrics/ServiceStateStats.java
+++ b/src/java/com/android/internal/telephony/metrics/ServiceStateStats.java
@@ -15,6 +15,7 @@
*/
package com.android.internal.telephony.metrics;
+
import static android.telephony.TelephonyManager.DATA_CONNECTED;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_CS;
@@ -29,6 +30,7 @@ import android.telephony.AccessNetworkUtils;
import android.telephony.Annotation.NetworkType;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
+import android.telephony.ServiceState.RoamingType;
import android.telephony.TelephonyManager;
import com.android.internal.annotations.VisibleForTesting;
@@ -44,6 +46,7 @@ import com.android.internal.telephony.nano.PersistAtomsProto.CellularServiceStat
import com.android.telephony.Rlog;
import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
/** Tracks service state duration and switch metrics for each phone. */
@@ -52,6 +55,7 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
private final AtomicReference<TimestampedServiceState> mLastState =
new AtomicReference<>(new TimestampedServiceState(null, 0L));
+ private final AtomicBoolean mOverrideVoiceService = new AtomicBoolean(false);
private final Phone mPhone;
private final PersistAtomsStorage mStorage;
private final DeviceStateHelper mDeviceStateHelper;
@@ -114,8 +118,10 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
CellularServiceState newState = new CellularServiceState();
newState.voiceRat = getVoiceRat(mPhone, serviceState);
newState.dataRat = getRat(serviceState, NetworkRegistrationInfo.DOMAIN_PS);
- newState.voiceRoamingType = serviceState.getVoiceRoamingType();
- newState.dataRoamingType = serviceState.getDataRoamingType();
+ newState.voiceRoamingType =
+ getNetworkRoamingState(serviceState, NetworkRegistrationInfo.DOMAIN_CS);
+ newState.dataRoamingType =
+ getNetworkRoamingState(serviceState, NetworkRegistrationInfo.DOMAIN_PS);
newState.isEndc = isEndc(serviceState);
newState.simSlotIndex = mPhone.getPhoneId();
newState.isMultiSim = SimSlotState.isMultiSim();
@@ -123,6 +129,8 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
newState.isEmergencyOnly = isEmergencyOnly(serviceState);
newState.isInternetPdnUp = isInternetPdnUp(mPhone);
newState.foldState = mDeviceStateHelper.getFoldState();
+ newState.overrideVoiceService = mOverrideVoiceService.get();
+ newState.isDataEnabled = mPhone.getDataSettingsManager().isDataEnabled();
TimestampedServiceState prevState =
mLastState.getAndSet(new TimestampedServiceState(newState, now));
addServiceStateAndSwitch(
@@ -150,6 +158,26 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
}
}
+ /** Updates override state for voice service state when voice calling capability changes */
+ public void onVoiceServiceStateOverrideChanged(boolean override) {
+ if (override == mOverrideVoiceService.get()) {
+ return;
+ }
+ mOverrideVoiceService.set(override);
+ final long now = getTimeMillis();
+ TimestampedServiceState lastState =
+ mLastState.getAndUpdate(
+ state -> {
+ if (state.mServiceState == null) {
+ return new TimestampedServiceState(null, now);
+ }
+ CellularServiceState newServiceState = copyOf(state.mServiceState);
+ newServiceState.overrideVoiceService = mOverrideVoiceService.get();
+ return new TimestampedServiceState(newServiceState, now);
+ });
+ addServiceState(lastState, now);
+ }
+
private void addServiceState(TimestampedServiceState prevState, long now) {
addServiceStateAndSwitch(prevState, now, null);
}
@@ -271,6 +299,8 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
copy.isEmergencyOnly = state.isEmergencyOnly;
copy.isInternetPdnUp = state.isInternetPdnUp;
copy.foldState = state.foldState;
+ copy.overrideVoiceService = state.overrideVoiceService;
+ copy.isDataEnabled = state.isDataEnabled;
return copy;
}
@@ -380,6 +410,39 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
addServiceState(lastState, now);
}
+ private static @RoamingType int getNetworkRoamingState(
+ ServiceState ss, @NetworkRegistrationInfo.Domain int domain) {
+ final NetworkRegistrationInfo nri =
+ ss.getNetworkRegistrationInfo(domain, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+ if (nri == null) {
+ // No registration for domain
+ return ServiceState.ROAMING_TYPE_NOT_ROAMING;
+ }
+ @RoamingType int roamingType = nri.getRoamingType();
+ if (nri.isNetworkRoaming() && roamingType == ServiceState.ROAMING_TYPE_NOT_ROAMING) {
+ // Roaming is overridden, exact roaming type unknown.
+ return ServiceState.ROAMING_TYPE_UNKNOWN;
+ }
+ return roamingType;
+ }
+
+ /** Determines whether device is roaming, bypassing carrier overrides. */
+ public static boolean isNetworkRoaming(
+ ServiceState ss, @NetworkRegistrationInfo.Domain int domain) {
+ if (ss == null) {
+ return false;
+ }
+ final NetworkRegistrationInfo nri =
+ ss.getNetworkRegistrationInfo(domain, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+ return nri != null && nri.isNetworkRoaming();
+ }
+
+ /** Determines whether device is roaming in any domain, bypassing carrier overrides. */
+ public static boolean isNetworkRoaming(ServiceState ss) {
+ return isNetworkRoaming(ss, NetworkRegistrationInfo.DOMAIN_CS)
+ || isNetworkRoaming(ss, NetworkRegistrationInfo.DOMAIN_PS);
+ }
+
@VisibleForTesting
protected long getTimeMillis() {
return SystemClock.elapsedRealtime();