diff options
Diffstat (limited to 'src/java/com/android/internal/telephony/metrics/ServiceStateStats.java')
-rw-r--r-- | src/java/com/android/internal/telephony/metrics/ServiceStateStats.java | 67 |
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(); |