Merge "CarrierActionAgent: avoid log spam on EVENT_APN_SETTINGS_CHANGED" into main
diff --git a/flags/uicc.aconfig b/flags/uicc.aconfig
index cf10c92..f41fad3 100644
--- a/flags/uicc.aconfig
+++ b/flags/uicc.aconfig
@@ -69,3 +69,11 @@
purpose: PURPOSE_BUGFIX
}
}
+
+# OWNER=mewan TARGET=24Q4
+flag {
+ name: "optimization_apdu_sender"
+ namespace: "telephony"
+ description: "This flag controls optimization of apdu sender class."
+ bug:"335257880"
+}
diff --git a/proto/src/persist_atoms.proto b/proto/src/persist_atoms.proto
index 48e7b0d..2010ce1 100644
--- a/proto/src/persist_atoms.proto
+++ b/proto/src/persist_atoms.proto
@@ -320,6 +320,7 @@
optional bool is_ntn = 41;
optional bool supports_business_call_composer = 42;
optional int32 call_composer_status = 43;
+ optional int32 precise_call_state_on_setup = 44;
// Internal use only
optional int64 setup_begin_millis = 10001;
diff --git a/src/java/com/android/internal/telephony/ServiceStateTracker.java b/src/java/com/android/internal/telephony/ServiceStateTracker.java
index e2f5980..e7500a2 100644
--- a/src/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/src/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -1164,6 +1164,9 @@
mDesiredPowerState = power;
setPowerStateToDesired(forEmergencyCall, isSelectedPhoneForEmergencyCall, forceApply);
+ if (mDesiredPowerState) {
+ SatelliteController.getInstance().onSetCellularRadioPowerStateRequested(true);
+ }
}
/**
@@ -1325,6 +1328,12 @@
// Hence, issuing shut down regardless of radio power response
mCi.requestShutdown(null);
}
+
+ ar = (AsyncResult) msg.obj;
+ if (ar.exception != null) {
+ loge("EVENT_RADIO_POWER_OFF_DONE: exception=" + ar.exception);
+ SatelliteController.getInstance().onPowerOffCellularRadioFailed();
+ }
break;
// GSM
@@ -4979,7 +4988,7 @@
*/
public void powerOffRadioSafely() {
synchronized (this) {
- SatelliteController.getInstance().onCellularRadioPowerOffRequested();
+ SatelliteController.getInstance().onSetCellularRadioPowerStateRequested(false);
if (DomainSelectionResolver.getInstance().isDomainSelectionSupported()) {
EmergencyStateTracker.getInstance().onCellularRadioPowerOffRequested();
}
diff --git a/src/java/com/android/internal/telephony/data/DataSettingsManager.java b/src/java/com/android/internal/telephony/data/DataSettingsManager.java
index fb112d9..0b9ac27 100644
--- a/src/java/com/android/internal/telephony/data/DataSettingsManager.java
+++ b/src/java/com/android/internal/telephony/data/DataSettingsManager.java
@@ -326,7 +326,7 @@
@Override
public void onUserDataEnabledChanged(boolean enabled,
@NonNull String callingPackage) {
- log("phone" + phone.getPhoneId() + " onUserDataEnabledChanged "
+ log("phone " + phone.getPhoneId() + " onUserDataEnabledChanged "
+ enabled + " by " + callingPackage
+ ", reevaluating mobile data policies");
DataSettingsManager.this.updateDataEnabledAndNotify(
@@ -335,6 +335,16 @@
});
}
}
+ SubscriptionManagerService.getInstance().registerCallback(
+ new SubscriptionManagerService.SubscriptionManagerServiceCallback(this::post) {
+ @Override
+ public void onDefaultDataSubscriptionChanged(int subId) {
+ log((subId == mSubId ? "Became" : "Not")
+ + " default data sub, reevaluating mobile data policies");
+ DataSettingsManager.this.updateDataEnabledAndNotify(
+ TelephonyManager.DATA_ENABLED_REASON_OVERRIDE);
+ }
+ });
updateDataEnabledAndNotify(TelephonyManager.DATA_ENABLED_REASON_UNKNOWN);
}
diff --git a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
index a83cd06..2367ef5 100644
--- a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
+++ b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
@@ -1147,7 +1147,8 @@
session.vonrEnabled,
session.isNtn,
session.supportsBusinessCallComposer,
- session.callComposerStatus);
+ session.callComposerStatus,
+ session.preciseCallStateOnSetup);
}
diff --git a/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java b/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java
index 911424e..b6a26c6 100644
--- a/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java
+++ b/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java
@@ -26,6 +26,16 @@
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_LESS_THAN_THIRTY_MINUTES;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_MORE_THAN_ONE_HOUR;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_DIALING;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_DISCONNECTED;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_DISCONNECTING;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_HOLDING;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_IDLE;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_INCOMING;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_WAITING;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_UNKNOWN;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__DIRECTION__CALL_DIRECTION_MO;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__DIRECTION__CALL_DIRECTION_MT;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_FULLBAND;
@@ -540,6 +550,7 @@
// Compute time it took to fail setup (except for MT calls that have never been picked up)
if (proto.setupFailed && proto.setupBeginMillis != 0L && proto.setupDurationMillis == 0) {
+ proto.preciseCallStateOnSetup = convertCallStateEnumToInt(Call.State.DISCONNECTED);
proto.setupDurationMillis = (int) (getTimeMillis() - proto.setupBeginMillis);
}
@@ -632,6 +643,7 @@
private void checkCallSetup(Connection conn, VoiceCallSession proto) {
if (proto.setupBeginMillis != 0L && isSetupFinished(conn.getCall())) {
+ proto.preciseCallStateOnSetup = convertCallStateEnumToInt(conn.getState());
proto.setupDurationMillis = (int) (getTimeMillis() - proto.setupBeginMillis);
proto.setupBeginMillis = 0L;
}
@@ -1092,4 +1104,29 @@
proto.handoverInProgress = false;
}
}
+
+ private int convertCallStateEnumToInt(Call.State state) {
+ switch (state) {
+ case IDLE:
+ return VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_IDLE;
+ case ACTIVE:
+ return VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
+ case HOLDING:
+ return VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_HOLDING;
+ case DIALING:
+ return VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_DIALING;
+ case ALERTING:
+ return VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
+ case INCOMING:
+ return VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_INCOMING;
+ case WAITING:
+ return VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_WAITING;
+ case DISCONNECTED:
+ return VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_DISCONNECTED;
+ case DISCONNECTING:
+ return VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_DISCONNECTING;
+ default:
+ return VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_UNKNOWN;
+ }
+ }
}
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index ab91f31..5fb6fa7 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -30,6 +30,7 @@
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_CONNECTION_HYSTERESIS_SEC_INT;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ENTITLEMENT_SUPPORTED_BOOL;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_ESOS_SUPPORTED_BOOL;
+import static android.telephony.CarrierConfigManager.KEY_SATELLITE_NIDD_APN_NAME_STRING;
import static android.telephony.CarrierConfigManager.KEY_SATELLITE_SCREEN_OFF_INACTIVITY_TIMEOUT_SEC_INT;
import static android.telephony.SubscriptionManager.SATELLITE_ATTACH_ENABLED_FOR_CARRIER;
import static android.telephony.SubscriptionManager.SATELLITE_ENTITLEMENT_STATUS;
@@ -240,6 +241,7 @@
private static final int EVENT_NOTIFY_NTN_ELIGIBILITY_HYSTERESIS_TIMED_OUT = 46;
private static final int EVENT_WIFI_CONNECTIVITY_STATE_CHANGED = 47;
private static final int EVENT_SATELLITE_ACCESS_RESTRICTION_CHECKING_RESULT = 48;
+ protected static final int EVENT_WAIT_FOR_CELLULAR_MODEM_OFF_TIMED_OUT = 49;
@NonNull private static SatelliteController sInstance;
@NonNull private final Context mContext;
@@ -343,9 +345,13 @@
private final Object mIsSatelliteEnabledLock = new Object();
@GuardedBy("mIsSatelliteEnabledLock")
private Boolean mIsSatelliteEnabled = null;
- private final Object mIsRadioOnLock = new Object();
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+ protected final Object mIsRadioOnLock = new Object();
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+ protected boolean mIsRadioOn;
@GuardedBy("mIsRadioOnLock")
- private boolean mIsRadioOn = false;
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+ protected boolean mRadioOffRequested = false;
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
protected final Object mSatelliteViaOemProvisionLock = new Object();
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
@@ -1324,6 +1330,14 @@
mIsRadioOn = true;
} else if (mCi.getRadioState() == TelephonyManager.RADIO_POWER_OFF) {
resetCarrierRoamingSatelliteModeParams();
+ synchronized (mIsRadioOnLock) {
+ if (mRadioOffRequested) {
+ logd("EVENT_RADIO_STATE_CHANGED: set mIsRadioOn to false");
+ stopWaitForCellularModemOffTimer();
+ mIsRadioOn = false;
+ mRadioOffRequested = false;
+ }
+ }
}
}
@@ -1634,6 +1648,13 @@
break;
}
+ case EVENT_WAIT_FOR_CELLULAR_MODEM_OFF_TIMED_OUT: {
+ plogw("Timed out to wait for cellular modem OFF state");
+ synchronized (mIsRadioOnLock) {
+ mRadioOffRequested = false;
+ }
+ }
+
default:
Log.w(TAG, "SatelliteControllerHandler: unexpected message code: " +
msg.what);
@@ -1715,6 +1736,12 @@
SatelliteManager.SATELLITE_RESULT_INVALID_MODEM_STATE, result);
return;
}
+ if (mRadioOffRequested) {
+ ploge("Radio is being powering off, can not enable satellite");
+ sendErrorAndReportSessionMetrics(
+ SatelliteManager.SATELLITE_RESULT_INVALID_MODEM_STATE, result);
+ return;
+ }
}
if (mTelecomManager.isInEmergencyCall()) {
@@ -2899,27 +2926,50 @@
/**
* This function is used by {@link com.android.internal.telephony.ServiceStateTracker} to notify
- * {@link SatelliteController} that it has received a request to power off the cellular radio
- * modem. {@link SatelliteController} will then power off the satellite modem.
+ * {@link SatelliteController} that it has received a request to power on or off the cellular
+ * radio modem.
+ *
+ * @param powerOn {@code true} means cellular radio is about to be powered on, {@code false}
+ * means cellular modem is about to be powered off.
*/
- public void onCellularRadioPowerOffRequested() {
- logd("onCellularRadioPowerOffRequested()");
+ public void onSetCellularRadioPowerStateRequested(boolean powerOn) {
+ logd("onSetCellularRadioPowerStateRequested: powerOn=" + powerOn);
if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
- plogd("onCellularRadioPowerOffRequested: oemEnabledSatelliteFlag is disabled");
+ plogd("onSetCellularRadioPowerStateRequested: oemEnabledSatelliteFlag is disabled");
return;
}
synchronized (mIsRadioOnLock) {
- mIsRadioOn = false;
+ mRadioOffRequested = !powerOn;
}
- requestSatelliteEnabled(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
- false /* enableSatellite */, false /* enableDemoMode */, false /* isEmergency */,
- new IIntegerConsumer.Stub() {
- @Override
- public void accept(int result) {
- plogd("onRadioPowerOffRequested: requestSatelliteEnabled result=" + result);
- }
- });
+ if (powerOn) {
+ stopWaitForCellularModemOffTimer();
+ } else {
+ requestSatelliteEnabled(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
+ false /* enableSatellite */, false /* enableDemoMode */,
+ false /* isEmergency */,
+ new IIntegerConsumer.Stub() {
+ @Override
+ public void accept(int result) {
+ plogd("onSetCellularRadioPowerStateRequested: requestSatelliteEnabled"
+ + " result=" + result);
+ }
+ });
+ startWaitForCellularModemOffTimer();
+ }
+ }
+
+ /**
+ * This function is used by {@link com.android.internal.telephony.ServiceStateTracker} to notify
+ * {@link SatelliteController} that the request to power off the cellular radio modem has
+ * failed.
+ */
+ public void onPowerOffCellularRadioFailed() {
+ logd("onPowerOffCellularRadioFailed");
+ synchronized (mIsRadioOnLock) {
+ mRadioOffRequested = false;
+ stopWaitForCellularModemOffTimer();
+ }
}
/**
@@ -4214,6 +4264,7 @@
KEY_EMERGENCY_MESSAGING_SUPPORTED_BOOL,
KEY_EMERGENCY_CALL_TO_SATELLITE_T911_HANDOVER_TIMEOUT_MILLIS_INT,
KEY_SATELLITE_ESOS_SUPPORTED_BOOL,
+ KEY_SATELLITE_NIDD_APN_NAME_STRING,
KEY_CARRIER_ROAMING_NTN_CONNECT_TYPE_INT,
KEY_CARRIER_SUPPORTED_SATELLITE_NOTIFICATION_HYSTERESIS_SEC_INT,
KEY_CARRIER_ROAMING_NTN_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_INT,
@@ -4954,6 +5005,32 @@
R.integer.config_wait_for_satellite_enabling_response_timeout_millis);
}
+ private long getWaitForCellularModemOffTimeoutMillis() {
+ return mContext.getResources().getInteger(
+ R.integer.config_satellite_wait_for_cellular_modem_off_timeout_millis);
+ }
+
+ private void startWaitForCellularModemOffTimer() {
+ synchronized (mIsRadioOnLock) {
+ if (hasMessages(EVENT_WAIT_FOR_CELLULAR_MODEM_OFF_TIMED_OUT)) {
+ plogd("startWaitForCellularModemOffTimer: the timer was already started");
+ return;
+ }
+ long timeoutMillis = getWaitForCellularModemOffTimeoutMillis();
+ plogd("Start timer to wait for cellular modem OFF state, timeoutMillis="
+ + timeoutMillis);
+ sendMessageDelayed(obtainMessage(EVENT_WAIT_FOR_CELLULAR_MODEM_OFF_TIMED_OUT),
+ timeoutMillis);
+ }
+ }
+
+ private void stopWaitForCellularModemOffTimer() {
+ synchronized (mSatelliteEnabledRequestLock) {
+ plogd("Stop timer to wait for cellular modem OFF state");
+ removeMessages(EVENT_WAIT_FOR_CELLULAR_MODEM_OFF_TIMED_OUT);
+ }
+ }
+
private void startWaitForSatelliteEnablingResponseTimer(
@NonNull RequestSatelliteEnabledArgument argument) {
synchronized (mSatelliteEnabledRequestLock) {
@@ -5619,14 +5696,16 @@
for (SubscriptionInfo info : infoList) {
String subscriberId = getSubscriberId(info);
int carrierId = info.getCarrierId();
+ String apn = getConfigForSubId(info.getSubscriptionId())
+ .getString(KEY_SATELLITE_NIDD_APN_NAME_STRING);
logd("requestProvisionSubscriberIds: subscriberId:" + subscriberId
- + " , carrierId=" + carrierId);
+ + " , carrierId=" + carrierId + " , apn=" + apn);
if (subscriberId.isEmpty()) {
logd("requestProvisionSubscriberIds: getSubscriberId failed skip this "
+ "subscriberId.");
continue;
}
- list.add(new SatelliteSubscriberInfo(subscriberId, carrierId, ""));
+ list.add(new SatelliteSubscriberInfo(subscriberId, carrierId, apn));
mSubscriberIdPerSub.put(subscriberId, info.getSubscriptionId());
}
}
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java b/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java
index 9988ea0..f24d484 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteSOSMessageRecommender.java
@@ -17,7 +17,6 @@
package com.android.internal.telephony.satellite;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
-import static android.telephony.CarrierConfigManager.KEY_CARRIER_ROAMING_NTN_EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_INT;
import static android.telephony.ServiceState.STATE_EMERGENCY_ONLY;
import static android.telephony.ServiceState.STATE_IN_SERVICE;
import static android.telephony.ServiceState.STATE_OUT_OF_SERVICE;
@@ -43,7 +42,6 @@
import android.os.Looper;
import android.os.Message;
import android.os.OutcomeReceiver;
-import android.os.PersistableBundle;
import android.os.SystemProperties;
import android.provider.DeviceConfig;
import android.telecom.Connection;
@@ -58,6 +56,7 @@
import android.telephony.ims.RegistrationManager;
import android.telephony.satellite.ISatelliteProvisionStateCallback;
import android.telephony.satellite.SatelliteManager;
+import android.telephony.satellite.SatelliteSubscriberProvisionStatus;
import android.text.TextUtils;
import android.util.Pair;
import android.util.SparseArray;
@@ -73,6 +72,7 @@
import com.android.internal.telephony.flags.Flags;
import com.android.internal.telephony.metrics.SatelliteStats;
+import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -160,6 +160,13 @@
plogd("onSatelliteProvisionStateChanged: provisioned=" + provisioned);
sendMessage(obtainMessage(EVENT_SATELLITE_PROVISIONED_STATE_CHANGED, provisioned));
}
+
+ @Override
+ public void onSatelliteSubscriptionProvisionStateChanged(
+ List<SatelliteSubscriberProvisionStatus> satelliteSubscriberProvisionStatus) {
+ plogd("onSatelliteSubscriptionProvisionStateChanged: "
+ + satelliteSubscriberProvisionStatus);
+ }
};
}
diff --git a/src/java/com/android/internal/telephony/uicc/SIMRecords.java b/src/java/com/android/internal/telephony/uicc/SIMRecords.java
index a97b00b..34b412f 100644
--- a/src/java/com/android/internal/telephony/uicc/SIMRecords.java
+++ b/src/java/com/android/internal/telephony/uicc/SIMRecords.java
@@ -48,6 +48,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Objects;
/**
* {@hide}
@@ -1278,15 +1279,22 @@
case EVENT_GET_FPLMN_SIZE_DONE:
ar = (AsyncResult) msg.obj;
+ int key = msg.arg2;
+
+ Message response;
+ Pair<Message, Object> transaction = null;
+ if (ar.exception != null && ar.userObj != null) {
+ response = (Message) ar.userObj;
+ } else {
+ transaction = retrievePendingTransaction(key);
+ response = Objects.requireNonNull(transaction.first);
+ }
+
if (ar.exception != null) {
- Message response = (Message) ar.userObj;
AsyncResult.forMessage(response).exception = ar.exception;
response.sendToTarget();
break;
}
- int key = msg.arg2;
- Pair<Message, Object> transaction = retrievePendingTransaction(key);
- Message response = transaction.first;
List<String> fplmns = (List<String>) transaction.second;
int dataLength = (int) ar.result;
if (dataLength < 0 || dataLength % FPLMN_BYTE_SIZE != 0) {
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
index b9fac4a..1465176 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
@@ -26,6 +26,7 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.nullable;
@@ -594,7 +595,7 @@
sst.setRadioPowerForReason(false, false, false, false, reason);
assertTrue(sst.getRadioPowerOffReasons().contains(reason));
assertTrue(sst.getRadioPowerOffReasons().size() == 1);
- verify(mSatelliteController).onCellularRadioPowerOffRequested();
+ verify(mSatelliteController).onSetCellularRadioPowerStateRequested(eq(false));
clearInvocations(mSatelliteController);
waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
assertTrue(mSimulatedCommands.getRadioState() == TelephonyManager.RADIO_POWER_OFF);
@@ -602,7 +603,7 @@
TelephonyManager.RADIO_POWER_REASON_USER);
assertTrue(sst.getRadioPowerOffReasons().contains(reason));
assertTrue(sst.getRadioPowerOffReasons().size() == 1);
- verify(mSatelliteController, never()).onCellularRadioPowerOffRequested();
+ verify(mSatelliteController, never()).onSetCellularRadioPowerStateRequested(anyBoolean());
waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
assertTrue(mSimulatedCommands.getRadioState() == TelephonyManager.RADIO_POWER_OFF);
@@ -610,7 +611,7 @@
// had been turned off for.
sst.setRadioPowerForReason(true, false, false, false, reason);
assertTrue(sst.getRadioPowerOffReasons().isEmpty());
- verify(mSatelliteController, never()).onCellularRadioPowerOffRequested();
+ verify(mSatelliteController).onSetCellularRadioPowerStateRequested(eq(true));
waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
assertTrue(mSimulatedCommands.getRadioState() == TelephonyManager.RADIO_POWER_ON);
@@ -1928,6 +1929,8 @@
sst.setRadioPower(false);
waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
assertTrue(mSimulatedCommands.getRadioState() == TelephonyManager.RADIO_POWER_ON);
+ verify(mSatelliteController).onSetCellularRadioPowerStateRequested(eq(false));
+ verify(mSatelliteController).onPowerOffCellularRadioFailed();
sst.requestShutdown();
waitForLastHandlerAction(mSSTTestHandler.getThreadHandler());
assertFalse(mSimulatedCommands.getRadioState()
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataSettingsManagerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataSettingsManagerTest.java
index 3f18a3a..620cf39 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataSettingsManagerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataSettingsManagerTest.java
@@ -42,6 +42,7 @@
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.data.DataSettingsManager.DataSettingsManagerCallback;
import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
+import com.android.internal.telephony.subscription.SubscriptionManagerService;
import org.junit.After;
import org.junit.Before;
@@ -184,6 +185,49 @@
}
@Test
+ public void testUpdateDataEnabledAndNotifyOverrideDdsChange() throws Exception {
+ // Mock 2nd phone the DDS phone.
+ int phone2Id = 1;
+ int phone2SubId = 2;
+ doReturn(phone2SubId).when(mSubscriptionManagerService).getDefaultDataSubId();
+ Phone phone2 = Mockito.mock(Phone.class);
+ doReturn(phone2Id).when(phone2).getPhoneId();
+ doReturn(phone2SubId).when(phone2).getSubId();
+ doReturn(phone2Id).when(mSubscriptionManagerService).getPhoneId(phone2SubId);
+ DataSettingsManager dataSettingsManager2 = Mockito.mock(DataSettingsManager.class);
+ doReturn(dataSettingsManager2).when(phone2).getDataSettingsManager();
+ doReturn(true).when(phone2).isUserDataEnabled();
+
+ mPhones = new Phone[] {mPhone, phone2};
+ replaceInstance(PhoneFactory.class, "sPhones", null, mPhones);
+ ArgumentCaptor<SubscriptionManagerService.SubscriptionManagerServiceCallback>
+ callbackArgumentCaptor = ArgumentCaptor
+ .forClass(SubscriptionManagerService.SubscriptionManagerServiceCallback.class);
+
+ mDataSettingsManagerUT.sendEmptyMessage(11 /* EVENT_INITIALIZE */);
+ mDataSettingsManagerUT.setDataEnabled(TelephonyManager.DATA_ENABLED_REASON_USER, false, "");
+ processAllMessages();
+
+ // Verify listening to DDS change callback
+ verify(mSubscriptionManagerService, times(2))
+ .registerCallback(callbackArgumentCaptor.capture());
+ SubscriptionManagerService.SubscriptionManagerServiceCallback callback =
+ callbackArgumentCaptor.getValue();
+
+ // Mock the phone as nonDDS auto switch override enabled.
+ clearInvocations(mPhones);
+ mDataSettingsManagerUT.setMobileDataPolicy(
+ TelephonyManager.MOBILE_DATA_POLICY_AUTO_DATA_SWITCH, true);
+ processAllMessages();
+ verify(mPhone).notifyDataEnabled(true, TelephonyManager.DATA_ENABLED_REASON_OVERRIDE);
+
+ // The phone became DDS, data should be disabled
+ doReturn(mPhone.getSubId()).when(mSubscriptionManagerService).getDefaultDataSubId();
+ callback.onDefaultDataSubscriptionChanged(mPhone.getSubId());
+ verify(mPhone).notifyDataEnabled(false, TelephonyManager.DATA_ENABLED_REASON_OVERRIDE);
+ }
+
+ @Test
public void testNotifyDataEnabledFromNewValidSubId() throws Exception {
final CountDownLatch latch = new CountDownLatch(1);
mDataSettingsManagerUT.registerCallback(
diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java
index 04d140c..4347869 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java
@@ -30,6 +30,10 @@
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_SUPER_WIDEBAND;
import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_UNKNOWN;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_DISCONNECTED;
+import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_UNKNOWN;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
@@ -268,6 +272,8 @@
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_SUPER_WIDEBAND;
expectedCall.ratAtConnected = TelephonyManager.NETWORK_TYPE_UNKNOWN;
expectedCall.callDuration = VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 12000L, 1L);
@@ -319,6 +325,8 @@
expectedCall.setupDurationMillis = 200;
expectedCall.ratAtConnected = TelephonyManager.NETWORK_TYPE_UNKNOWN;
expectedCall.callDuration = VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_DISCONNECTED;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 2200L, 1L);
@@ -363,6 +371,8 @@
expectedCall.setupDurationMillis = 200;
expectedCall.ratAtConnected = TelephonyManager.NETWORK_TYPE_UNKNOWN;
expectedCall.callDuration = VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_DISCONNECTED;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 2200L, 1L);
@@ -411,6 +421,8 @@
expectedCall.disconnectExtraMessage = "normal call clearing";
expectedCall.callDuration =
VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_LESS_THAN_ONE_MINUTE;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 100000L, 1L);
@@ -569,6 +581,8 @@
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.callDuration =
VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_LESS_THAN_FIVE_MINUTES;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 12000L, 1L);
@@ -628,6 +642,8 @@
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.isMultiSim = false; // DSDS with one active SIM profile should not count
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_UNKNOWN;
mVoiceCallSessionStats0.setTimeMillis(2000L);
doReturn(Call.State.INCOMING).when(mImsCall0).getState();
@@ -860,6 +876,8 @@
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.callDuration =
VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_LESS_THAN_TEN_MINUTES;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
mVoiceCallSessionStats0.setTimeMillis(2000L);
doReturn(Call.State.INCOMING).when(mImsCall0).getState();
@@ -918,6 +936,8 @@
expectedCall.callDuration =
VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_LESS_THAN_THIRTY_MINUTES;
expectedCall.lastKnownRat = TelephonyManager.NETWORK_TYPE_UMTS;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsageLte =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 4000L, 1L);
@@ -996,6 +1016,8 @@
expectedCall.callDuration =
VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_LESS_THAN_THIRTY_MINUTES;
expectedCall.lastKnownRat = TelephonyManager.NETWORK_TYPE_UMTS;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsageLte =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 4000L, 1L);
@@ -1130,7 +1152,8 @@
expectedCall.rttEnabled = true;
expectedCall.callDuration =
VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_MORE_THAN_ONE_HOUR;
-
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
mVoiceCallSessionStats0.setTimeMillis(2000L);
doReturn(Call.State.INCOMING).when(mImsCall0).getState();
doReturn(Call.State.INCOMING).when(mImsConnection0).getState();
@@ -1187,6 +1210,8 @@
expectedCall0.ratAtEnd = TelephonyManager.NETWORK_TYPE_HSPA;
expectedCall0.bandAtEnd = 0;
expectedCall0.lastKnownRat = TelephonyManager.NETWORK_TYPE_HSPA;
+ expectedCall0.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
// call 1 starts later, MT
doReturn(true).when(mImsConnection1).isIncoming();
doReturn(60000L).when(mImsConnection1).getCreateTime();
@@ -1210,6 +1235,8 @@
expectedCall1.ratAtEnd = TelephonyManager.NETWORK_TYPE_UMTS;
expectedCall1.bandAtEnd = 0;
expectedCall1.lastKnownRat = TelephonyManager.NETWORK_TYPE_UMTS;
+ expectedCall1.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsageLte =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 80000L, 2L);
@@ -1319,6 +1346,8 @@
expectedCall0.ratAtEnd = TelephonyManager.NETWORK_TYPE_UMTS;
expectedCall0.bandAtEnd = 0;
expectedCall0.lastKnownRat = TelephonyManager.NETWORK_TYPE_UMTS;
+ expectedCall0.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
// call 1 starts later, MT
doReturn(true).when(mImsConnection1).isIncoming();
doReturn(60000L).when(mImsConnection1).getCreateTime();
@@ -1342,6 +1371,8 @@
expectedCall1.ratAtEnd = TelephonyManager.NETWORK_TYPE_HSPA;
expectedCall1.bandAtEnd = 0;
expectedCall1.lastKnownRat = TelephonyManager.NETWORK_TYPE_HSPA;
+ expectedCall1.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsageLte =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 80000L, 2L);
@@ -1449,6 +1480,8 @@
expectedCall0.ratSwitchCount = 0L;
expectedCall0.ratSwitchCountAfterConnected = 0L;
expectedCall0.ratAtEnd = TelephonyManager.NETWORK_TYPE_LTE;
+ expectedCall0.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
// call 1 starts later, MT
doReturn(true).when(mImsConnection1).isIncoming();
doReturn(60000L).when(mImsConnection1).getCreateTime();
@@ -1472,6 +1505,8 @@
expectedCall1.ratAtEnd = TelephonyManager.NETWORK_TYPE_HSPA;
expectedCall1.bandAtEnd = 0;
expectedCall1.lastKnownRat = TelephonyManager.NETWORK_TYPE_HSPA;
+ expectedCall1.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsageLte =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 80000L, 2L);
@@ -1571,6 +1606,8 @@
expectedCall.disconnectExtraMessage = "normal call clearing";
expectedCall.callDuration =
VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_LESS_THAN_ONE_MINUTE;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_IWLAN, 2000L, 100000L, 1L);
@@ -1631,6 +1668,8 @@
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.lastKnownRat = TelephonyManager.NETWORK_TYPE_UMTS;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
VoiceCallRatUsage expectedRatUsageLte =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 3000L, 1L);
@@ -1695,6 +1734,8 @@
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_UNKNOWN;
expectedCall.lastKnownRat = TelephonyManager.NETWORK_TYPE_UMTS;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_DISCONNECTED;
VoiceCallRatUsage expectedRatUsageLte =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 3000L, 1L);
@@ -1753,6 +1794,8 @@
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.lastKnownRat = TelephonyManager.NETWORK_TYPE_UMTS;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
VoiceCallRatUsage expectedRatUsageLte =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 3000L, 1L);
@@ -1818,6 +1861,8 @@
(1L << AudioCodec.AUDIO_CODEC_AMR) | (1L << AudioCodec.AUDIO_CODEC_AMR_WB);
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_UNKNOWN;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_UMTS, 2500L, 15000L, 1L);
@@ -1871,6 +1916,8 @@
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.bandAtEnd = 0;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_UMTS, 2500L, 100000L, 1L);
@@ -1934,6 +1981,8 @@
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.lastKnownRat = TelephonyManager.NETWORK_TYPE_UMTS;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsageLte =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 10000L, 1L);
@@ -2009,6 +2058,8 @@
expectedCall.codecBitmask = 1L << AudioCodec.AUDIO_CODEC_AMR;
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 12000L, 1L);
@@ -2087,6 +2138,8 @@
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.lastKnownRat = TelephonyManager.NETWORK_TYPE_UMTS;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsageLte =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 7000L, 1L);
@@ -2185,6 +2238,8 @@
expectedCall0.srvccCompleted = true;
expectedCall0.bearerAtEnd = VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_CS;
expectedCall0.lastKnownRat = TelephonyManager.NETWORK_TYPE_UMTS;
+ expectedCall0.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
// call 1 starts later, MT
doReturn(true).when(mImsConnection1).isIncoming();
doReturn(60000L).when(mImsConnection1).getCreateTime();
@@ -2213,6 +2268,8 @@
expectedCall1.srvccCompleted = true;
expectedCall1.bearerAtEnd = VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_CS;
expectedCall1.lastKnownRat = TelephonyManager.NETWORK_TYPE_UMTS;
+ expectedCall1.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsageLte =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 80000L, 2L);
@@ -2312,6 +2369,8 @@
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.lastKnownRat = TelephonyManager.NETWORK_TYPE_UMTS;
expectedCall.handoverInProgress = false;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
VoiceCallRatUsage expectedRatUsageLte =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 3000L, 1L);
@@ -2386,6 +2445,8 @@
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.handoverInProgress = true;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 12000L, 1L);
@@ -2440,6 +2501,8 @@
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.handoverInProgress = true;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 12000L, 1L);
@@ -2498,6 +2561,8 @@
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.handoverInProgress = false;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 12000L, 1L);
@@ -2562,6 +2627,8 @@
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.isEmergency = true;
expectedCall.handoverInProgress = true;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ACTIVE;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 12000L, 1L);
@@ -2627,6 +2694,8 @@
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
expectedCall.bandAtEnd = 0;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_UNKNOWN;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_IWLAN, 2000L, 8000L, 1L);
@@ -2677,6 +2746,8 @@
expectedCall.codecBitmask = 1L << AudioCodec.AUDIO_CODEC_AMR;
expectedCall.mainCodecQuality =
VOICE_CALL_SESSION__MAIN_CODEC_QUALITY__CODEC_QUALITY_NARROWBAND;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_UNKNOWN;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_IWLAN, 2000L, 8000L, 1L);
@@ -2730,6 +2801,8 @@
expectedCall.ratAtConnected = TelephonyManager.NETWORK_TYPE_UNKNOWN;
expectedCall.callDuration = VOICE_CALL_SESSION__CALL_DURATION__CALL_DURATION_UNKNOWN;
expectedCall.vonrEnabled = true;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 12000L, 1L);
@@ -2826,6 +2899,8 @@
expectedCall.supportsBusinessCallComposer = true;
// 0 is defined as UNKNOWN, adding 1 to original value.
expectedCall.callComposerStatus = 3;
+ expectedCall.preciseCallStateOnSetup =
+ VOICE_CALL_SESSION__CALL_STATE_ON_SETUP__CALL_STATE_ALERTING;
VoiceCallRatUsage expectedRatUsage =
makeRatUsageProto(
CARRIER_ID_SLOT_0, TelephonyManager.NETWORK_TYPE_LTE, 2000L, 12000L, 1L);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
index 9493dc7..a3a189b 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
@@ -125,6 +125,7 @@
import android.telephony.satellite.SatelliteDatagram;
import android.telephony.satellite.SatelliteManager;
import android.telephony.satellite.SatelliteManager.SatelliteException;
+import android.telephony.satellite.SatelliteSubscriberProvisionStatus;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.util.Pair;
@@ -183,6 +184,8 @@
private static final int[] ACTIVE_SUB_IDS = {SUB_ID};
private static final int TEST_WAIT_FOR_SATELLITE_ENABLING_RESPONSE_TIMEOUT_MILLIS =
(int) TimeUnit.SECONDS.toMillis(60);
+ private static final int TEST_WAIT_FOR_CELLULAR_MODEM_OFF_TIMEOUT_MILLIS =
+ (int) TimeUnit.SECONDS.toMillis(60);
private static final String SATELLITE_PLMN = "00103";
private List<Pair<Executor, CarrierConfigManager.CarrierConfigChangeListener>>
@@ -517,6 +520,9 @@
mContextFixture.putIntResource(
R.integer.config_wait_for_satellite_enabling_response_timeout_millis,
TEST_WAIT_FOR_SATELLITE_ENABLING_RESPONSE_TIMEOUT_MILLIS);
+ mContextFixture.putIntResource(
+ R.integer.config_satellite_wait_for_cellular_modem_off_timeout_millis,
+ TEST_WAIT_FOR_CELLULAR_MODEM_OFF_TIMEOUT_MILLIS);
doReturn(ACTIVE_SUB_IDS).when(mMockSubscriptionManagerService).getActiveSubIdList(true);
mCarrierConfigBundle = mContextFixture.getCarrierConfigBundle();
@@ -727,6 +733,87 @@
processAllMessages();
verify(mMockSatelliteModemInterface, times(5))
.requestIsSatelliteSupported(any(Message.class));
+ assertTrue(mSatelliteControllerUT.isRadioOn());
+ assertFalse(mSatelliteControllerUT.isRadioOffRequested());
+ assertFalse(mSatelliteControllerUT.isWaitForCellularModemOffTimerStarted());
+
+ // Radio is off during TN -> NTN image switch, SatelliteController should not set radio
+ // state to OFF
+ setRadioPower(false);
+ processAllMessages();
+ assertTrue(mSatelliteControllerUT.isRadioOn());
+ assertFalse(mSatelliteControllerUT.isRadioOffRequested());
+ assertFalse(mSatelliteControllerUT.isWaitForCellularModemOffTimerStarted());
+
+ // Turn on radio
+ setRadioPower(true);
+ processAllMessages();
+ assertTrue(mSatelliteControllerUT.isRadioOn());
+ assertFalse(mSatelliteControllerUT.isRadioOffRequested());
+ assertFalse(mSatelliteControllerUT.isWaitForCellularModemOffTimerStarted());
+
+ // APM is triggered
+ mSatelliteControllerUT.onSetCellularRadioPowerStateRequested(false);
+ processAllMessages();
+ assertTrue(mSatelliteControllerUT.isRadioOn());
+ assertTrue(mSatelliteControllerUT.isRadioOffRequested());
+ assertTrue(mSatelliteControllerUT.isWaitForCellularModemOffTimerStarted());
+
+ // SatelliteController should set the radio state to OFF
+ setRadioPower(false);
+ processAllMessages();
+ assertFalse(mSatelliteControllerUT.isRadioOn());
+ assertFalse(mSatelliteControllerUT.isRadioOffRequested());
+ assertFalse(mSatelliteControllerUT.isWaitForCellularModemOffTimerStarted());
+
+ // Turn on radio
+ setRadioPower(true);
+ processAllMessages();
+ assertTrue(mSatelliteControllerUT.isRadioOn());
+ assertFalse(mSatelliteControllerUT.isRadioOffRequested());
+ assertFalse(mSatelliteControllerUT.isWaitForCellularModemOffTimerStarted());
+
+ // APM is triggered
+ mSatelliteControllerUT.onSetCellularRadioPowerStateRequested(false);
+ processAllMessages();
+ assertTrue(mSatelliteControllerUT.isRadioOn());
+ assertTrue(mSatelliteControllerUT.isRadioOffRequested());
+ assertTrue(mSatelliteControllerUT.isWaitForCellularModemOffTimerStarted());
+
+ // Modem fails to power off radio. APM is disabled
+ mSatelliteControllerUT.onSetCellularRadioPowerStateRequested(true);
+ processAllMessages();
+ assertTrue(mSatelliteControllerUT.isRadioOn());
+ assertFalse(mSatelliteControllerUT.isRadioOffRequested());
+ assertFalse(mSatelliteControllerUT.isWaitForCellularModemOffTimerStarted());
+
+ // APM is triggered
+ mSatelliteControllerUT.onSetCellularRadioPowerStateRequested(false);
+ processAllMessages();
+ assertTrue(mSatelliteControllerUT.isRadioOn());
+ assertTrue(mSatelliteControllerUT.isRadioOffRequested());
+ assertTrue(mSatelliteControllerUT.isWaitForCellularModemOffTimerStarted());
+
+ // The timer WaitForCellularModemOff time out
+ moveTimeForward(TEST_WAIT_FOR_CELLULAR_MODEM_OFF_TIMEOUT_MILLIS);
+ processAllMessages();
+ assertTrue(mSatelliteControllerUT.isRadioOn());
+ assertFalse(mSatelliteControllerUT.isRadioOffRequested());
+ assertFalse(mSatelliteControllerUT.isWaitForCellularModemOffTimerStarted());
+
+ // APM is triggered
+ mSatelliteControllerUT.onSetCellularRadioPowerStateRequested(false);
+ processAllMessages();
+ assertTrue(mSatelliteControllerUT.isRadioOn());
+ assertTrue(mSatelliteControllerUT.isRadioOffRequested());
+ assertTrue(mSatelliteControllerUT.isWaitForCellularModemOffTimerStarted());
+
+ // Modem failed to power off the radio
+ mSatelliteControllerUT.onPowerOffCellularRadioFailed();
+ processAllMessages();
+ assertTrue(mSatelliteControllerUT.isRadioOn());
+ assertFalse(mSatelliteControllerUT.isRadioOffRequested());
+ assertFalse(mSatelliteControllerUT.isWaitForCellularModemOffTimerStarted());
}
@Test
@@ -847,7 +934,7 @@
mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled = false;
setUpResponseForRequestSatelliteEnabled(false, false, false, SATELLITE_RESULT_SUCCESS);
setRadioPower(false);
- mSatelliteControllerUT.onCellularRadioPowerOffRequested();
+ mSatelliteControllerUT.onSetCellularRadioPowerStateRequested(false);
processAllMessages();
sendSatelliteModemStateChangedEvent(SATELLITE_MODEM_STATE_OFF, null);
processAllMessages();
@@ -1061,12 +1148,49 @@
resetSatelliteControllerUTToOnAndProvisionedState();
when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(false);
- mSatelliteControllerUT.onCellularRadioPowerOffRequested();
+ mSatelliteControllerUT.onSetCellularRadioPowerStateRequested(false);
processAllMessages();
// Satellite should not be powered off since the feature flag oemEnabledSatelliteFlag is
// disabled
when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
verifySatelliteEnabled(true, SATELLITE_RESULT_SUCCESS);
+
+ // Successfully disable satellite.
+ when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestSatelliteEnabled(false, false, false, SATELLITE_RESULT_SUCCESS);
+ mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, false, false, false,
+ mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0));
+ verifySatelliteEnabled(false, SATELLITE_RESULT_SUCCESS);
+
+ // Fail to enable satellite when radio is being powered off.
+ mIIntegerConsumerResults.clear();
+ setUpResponseForRequestSatelliteEnabled(true, false, false, SATELLITE_RESULT_SUCCESS);
+ mSatelliteControllerUT.onSetCellularRadioPowerStateRequested(false);
+ mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, false,
+ mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ // Radio is being powered off, can not enable satellite
+ assertEquals(SATELLITE_RESULT_INVALID_MODEM_STATE, (long) mIIntegerConsumerResults.get(0));
+
+ // Modem failed to power off
+ mSatelliteControllerUT.onPowerOffCellularRadioFailed();
+
+ // Successfully enable satellite when radio is on.
+ mIIntegerConsumerResults.clear();
+ mSatelliteControllerUT.setSettingsKeyForSatelliteModeCalled = false;
+ mSatelliteControllerUT.setSettingsKeyToAllowDeviceRotationCalled = false;
+ setUpResponseForRequestSatelliteEnabled(true, false, false, SATELLITE_RESULT_SUCCESS);
+ mSatelliteControllerUT.requestSatelliteEnabled(SUB_ID, true, false, false,
+ mIIntegerConsumer);
+ processAllMessages();
+ assertTrue(waitForIIntegerConsumerResult(1));
+ assertEquals(SATELLITE_RESULT_SUCCESS, (long) mIIntegerConsumerResults.get(0));
+ verifySatelliteEnabled(true, SATELLITE_RESULT_SUCCESS);
}
@Test
@@ -1447,6 +1571,12 @@
+ "semaphore, ex=" + ex);
}
}
+
+ @Override
+ public void onSatelliteSubscriptionProvisionStateChanged(
+ List<SatelliteSubscriberProvisionStatus> status) {
+ logd("onSatelliteSubscriptionProvisionStateChanged: " + status);
+ }
};
int errorCode = mSatelliteControllerUT.registerForSatelliteProvisionStateChanged(
SUB_ID, callback);
@@ -4712,5 +4842,21 @@
mIsSatelliteViaOemProvisioned = isProvisioned;
}
}
+
+ public boolean isRadioOn() {
+ synchronized (mIsRadioOnLock) {
+ return mIsRadioOn;
+ }
+ }
+
+ public boolean isRadioOffRequested() {
+ synchronized (mIsRadioOnLock) {
+ return mRadioOffRequested;
+ }
+ }
+
+ public boolean isWaitForCellularModemOffTimerStarted() {
+ return hasMessages(EVENT_WAIT_FOR_CELLULAR_MODEM_OFF_TIMED_OUT);
+ }
}
}