Properly support service state override
In addition to override the general service state,
also override the inner NetworkRegistrationInfo.
Bug: 244064524
Test: Manual
Change-Id: I7f3e04e4be8bb10d50df2bbfaccd13980b633114
diff --git a/src/java/com/android/internal/telephony/Phone.java b/src/java/com/android/internal/telephony/Phone.java
index 0563364..835a87c 100644
--- a/src/java/com/android/internal/telephony/Phone.java
+++ b/src/java/com/android/internal/telephony/Phone.java
@@ -325,7 +325,7 @@
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
protected AtomicReference<UiccCardApplication> mUiccApplication =
new AtomicReference<UiccCardApplication>();
- TelephonyTester mTelephonyTester;
+ private TelephonyTester mTelephonyTester;
private String mName;
private final String mActionDetached;
private final String mActionAttached;
@@ -4875,6 +4875,13 @@
public void setTerminalBasedCallWaitingSupported(boolean supported) {
}
+ /**
+ * @return Telephony tester instance.
+ */
+ public @Nullable TelephonyTester getTelephonyTester() {
+ return mTelephonyTester;
+ }
+
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("Phone: subId=" + getSubId());
pw.println(" mPhoneId=" + mPhoneId);
diff --git a/src/java/com/android/internal/telephony/ServiceStateTracker.java b/src/java/com/android/internal/telephony/ServiceStateTracker.java
index 08800ae..77ae9fe 100755
--- a/src/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -3400,8 +3400,8 @@
updateNrFrequencyRangeFromPhysicalChannelConfigs(mLastPhysicalChannelConfigList, mNewSS);
updateNrStateFromPhysicalChannelConfigs(mLastPhysicalChannelConfigList, mNewSS);
- if (TelephonyUtils.IS_DEBUGGABLE && mPhone.mTelephonyTester != null) {
- mPhone.mTelephonyTester.overrideServiceState(mNewSS);
+ if (TelephonyUtils.IS_DEBUGGABLE && mPhone.getTelephonyTester() != null) {
+ mPhone.getTelephonyTester().overrideServiceState(mNewSS);
}
NetworkRegistrationInfo networkRegState = mNewSS.getNetworkRegistrationInfo(
diff --git a/src/java/com/android/internal/telephony/TelephonyTester.java b/src/java/com/android/internal/telephony/TelephonyTester.java
index c81a4c3..b9e04c8 100644
--- a/src/java/com/android/internal/telephony/TelephonyTester.java
+++ b/src/java/com/android/internal/telephony/TelephonyTester.java
@@ -16,6 +16,7 @@
package com.android.internal.telephony;
+import android.annotation.NonNull;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -200,11 +201,7 @@
sendTestSuppServiceNotification(intent);
} else if (action.equals(ACTION_TEST_SERVICE_STATE)) {
log("handle test service state changed intent");
- // Trigger the service state update. The replacement will be done in
- // overrideServiceState().
- mServiceStateTestIntent = intent;
- mPhone.getServiceStateTracker().sendEmptyMessage(
- ServiceStateTracker.EVENT_NETWORK_STATE_CHANGED);
+ setServiceStateTestIntent(intent);
} else if (action.equals(ACTION_TEST_IMS_E_CALL)) {
log("handle test IMS ecall intent");
testImsECall();
@@ -388,6 +385,19 @@
}
}
+ /**
+ * Set the service state test intent.
+ *
+ * @param intent The service state test intent.
+ */
+ public void setServiceStateTestIntent(@NonNull Intent intent) {
+ mServiceStateTestIntent = intent;
+ // Trigger the service state update. The replacement will be done in
+ // overrideServiceState().
+ mPhone.getServiceStateTracker().sendEmptyMessage(
+ ServiceStateTracker.EVENT_NETWORK_STATE_CHANGED);
+ }
+
void overrideServiceState(ServiceState ss) {
if (mServiceStateTestIntent == null || ss == null) return;
if (mPhone.getPhoneId() != mServiceStateTestIntent.getIntExtra(
@@ -401,13 +411,36 @@
}
if (mServiceStateTestIntent.hasExtra(EXTRA_VOICE_REG_STATE)) {
+ int state = mServiceStateTestIntent.getIntExtra(EXTRA_DATA_REG_STATE,
+ ServiceState.STATE_OUT_OF_SERVICE);
ss.setVoiceRegState(mServiceStateTestIntent.getIntExtra(EXTRA_VOICE_REG_STATE,
ServiceState.STATE_OUT_OF_SERVICE));
+ NetworkRegistrationInfo nri = ss.getNetworkRegistrationInfo(
+ NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+ NetworkRegistrationInfo.Builder builder = new NetworkRegistrationInfo.Builder(nri);
+ if (state == ServiceState.STATE_IN_SERVICE) {
+ builder.setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+ } else {
+ builder.setRegistrationState(
+ NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING);
+ }
+ ss.addNetworkRegistrationInfo(builder.build());
log("Override voice service state with " + ss.getState());
}
if (mServiceStateTestIntent.hasExtra(EXTRA_DATA_REG_STATE)) {
- ss.setDataRegState(mServiceStateTestIntent.getIntExtra(EXTRA_DATA_REG_STATE,
- ServiceState.STATE_OUT_OF_SERVICE));
+ int state = mServiceStateTestIntent.getIntExtra(EXTRA_DATA_REG_STATE,
+ ServiceState.STATE_OUT_OF_SERVICE);
+ ss.setDataRegState(state);
+ NetworkRegistrationInfo nri = ss.getNetworkRegistrationInfo(
+ NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+ NetworkRegistrationInfo.Builder builder = new NetworkRegistrationInfo.Builder(nri);
+ if (state == ServiceState.STATE_IN_SERVICE) {
+ builder.setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+ } else {
+ builder.setRegistrationState(
+ NetworkRegistrationInfo.REGISTRATION_STATE_NOT_REGISTERED_OR_SEARCHING);
+ }
+ ss.addNetworkRegistrationInfo(builder.build());
log("Override data service state with " + ss.getDataRegistrationState());
}
if (mServiceStateTestIntent.hasExtra(EXTRA_OPERATOR)) {