Merge "Google Contrigution item #12 - subitem #2, opt [VZW-Skylo] apply Idle Mode Scanning for Terrestrial Network" into main
diff --git a/src/java/com/android/internal/telephony/emergency/RadioOnStateListener.java b/src/java/com/android/internal/telephony/emergency/RadioOnStateListener.java
index 3a3f6c8..f44dc70 100644
--- a/src/java/com/android/internal/telephony/emergency/RadioOnStateListener.java
+++ b/src/java/com/android/internal/telephony/emergency/RadioOnStateListener.java
@@ -157,6 +157,11 @@
public void onRegistrationFailure(int causeCode) {
Rlog.d(TAG, "onRegistrationFailure: causeCode " + causeCode);
}
+
+ @Override
+ public void onTerrestrialNetworkAvailableChanged(boolean isAvailable) {
+ Rlog.d(TAG, "onTerrestrialNetworkAvailableChanged: isAvailable " + isAvailable);
+ }
};
private Callback mCallback; // The callback to notify upon completion.
diff --git a/src/java/com/android/internal/telephony/satellite/DemoSimulator.java b/src/java/com/android/internal/telephony/satellite/DemoSimulator.java
index 7b64c61..d908597 100644
--- a/src/java/com/android/internal/telephony/satellite/DemoSimulator.java
+++ b/src/java/com/android/internal/telephony/satellite/DemoSimulator.java
@@ -287,12 +287,12 @@
* and {@code false} to disable
* @param errorCallback The callback to receive the error code result of the operation.
*/
- public void enableCellularModemWhileSatelliteModeIsOn(boolean enabled,
+ public void enableTerrestrialNetworkScanWhileSatelliteModeIsOn(boolean enabled,
@NonNull IIntegerConsumer errorCallback) {
try {
errorCallback.accept(SatelliteResult.SATELLITE_RESULT_SUCCESS);
} catch (RemoteException e) {
- loge("enableCellularModemWhileSatelliteModeIsOn: RemoteException " + e);
+ loge("enableTerrestrialNetworkScanWhileSatelliteModeIsOn: RemoteException " + e);
}
}
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index 4d31e5c..353bf54 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -273,6 +273,7 @@
EVENT_WAIT_FOR_UPDATE_SATELLITE_ENABLE_ATTRIBUTES_RESPONSE_TIMED_OUT = 52;
private static final int EVENT_WAIT_FOR_REPORT_ENTITLED_TO_MERTICS_HYSTERESIS_TIMED_OUT = 53;
protected static final int EVENT_SATELLITE_REGISTRATION_FAILURE = 54;
+ private static final int EVENT_TERRESTRIAL_NETWORK_AVAILABLE_CHANGED = 55;
@NonNull private static SatelliteController sInstance;
@NonNull private final Context mContext;
@@ -355,6 +356,8 @@
new AtomicBoolean(false);
private final AtomicBoolean mRegisteredForSatelliteRegistrationFailure =
new AtomicBoolean(false);
+ private final AtomicBoolean mRegisteredForTerrestrialNetworkAvailableChanged =
+ new AtomicBoolean(false);
/**
* Map key: subId, value: callback to get error code of the provision request.
*/
@@ -389,6 +392,12 @@
*/
private final ConcurrentHashMap<IBinder, ISatelliteModemStateCallback>
mSatelliteRegistrationFailureListeners = new ConcurrentHashMap<>();
+ /**
+ * Map key: binder of the callback, value: callback to receive terrestrial network
+ * available changed
+ */
+ private final ConcurrentHashMap<IBinder, ISatelliteModemStateCallback>
+ mTerrestrialNetworkAvailableChangedListeners = new ConcurrentHashMap<>();
private final Object mIsSatelliteSupportedLock = new Object();
@GuardedBy("mIsSatelliteSupportedLock")
private Boolean mIsSatelliteSupported = null;
@@ -1850,6 +1859,15 @@
}
break;
+ case EVENT_TERRESTRIAL_NETWORK_AVAILABLE_CHANGED:
+ ar = (AsyncResult) msg.obj;
+ if (ar.result == null) {
+ loge("EVENT_TERRESTRIAL_NETWORK_AVAILABLE_CHANGED: result is null");
+ } else {
+ handleEventTerrestrialNetworkAvailableChanged((boolean) ar.result);
+ }
+ break;
+
default:
Log.w(TAG, "SatelliteControllerHandler: unexpected message code: " +
msg.what);
@@ -2496,8 +2514,9 @@
return SatelliteManager.SATELLITE_RESULT_NOT_SUPPORTED;
}
if (mFeatureFlags.carrierRoamingNbIotNtn()) {
- plogd("registerForSatelliteModemStateChanged: add RegistrationFailure Listeners");
+ plogd("registerForSatelliteModemStateChanged: add Listeners for ModemState");
mSatelliteRegistrationFailureListeners.put(callback.asBinder(), callback);
+ mTerrestrialNetworkAvailableChangedListeners.put(callback.asBinder(), callback);
}
if (mSatelliteSessionController != null) {
mSatelliteSessionController.registerForSatelliteModemStateChanged(callback);
@@ -2529,8 +2548,9 @@
+ " is not initialized yet");
}
if (mFeatureFlags.carrierRoamingNbIotNtn()) {
- plogd("unregisterForModemStateChanged: remove RegistrationFailure Listeners");
+ plogd("unregisterForModemStateChanged: remove Listeners for ModemState");
mSatelliteRegistrationFailureListeners.remove(callback.asBinder());
+ mTerrestrialNetworkAvailableChangedListeners.remove(callback.asBinder());
}
}
@@ -4062,6 +4082,7 @@
registerForNtnSignalStrengthChanged();
registerForCapabilitiesChanged();
registerForSatelliteRegistrationFailure();
+ registerForTerrestrialNetworkAvailableChanged();
requestIsSatelliteProvisioned(
new ResultReceiver(this) {
@@ -4177,6 +4198,16 @@
}
}
+ private void registerForTerrestrialNetworkAvailableChanged() {
+ if (mFeatureFlags.carrierRoamingNbIotNtn()) {
+ if (!mRegisteredForTerrestrialNetworkAvailableChanged.get()) {
+ mSatelliteModemInterface.registerForTerrestrialNetworkAvailableChanged(this,
+ EVENT_TERRESTRIAL_NETWORK_AVAILABLE_CHANGED, null);
+ mRegisteredForTerrestrialNetworkAvailableChanged.set(true);
+ }
+ }
+ }
+
private void handleEventSatelliteProvisionStateChanged(boolean provisioned) {
plogd("handleSatelliteProvisionStateChangedEvent: provisioned=" + provisioned);
@@ -6895,6 +6926,42 @@
});
}
+ private void handleEventTerrestrialNetworkAvailableChanged(boolean isAvailable) {
+ if (!mFeatureFlags.carrierRoamingNbIotNtn()) {
+ plogd("handleEventTerrestrialNetworkAvailableChanged: "
+ + "carrierRoamingNbIotNtn flag is disabled");
+ return;
+ }
+
+ plogd("handleEventTerrestrialNetworkAvailableChanged: " + isAvailable);
+
+ List<ISatelliteModemStateCallback> deadCallersList = new ArrayList<>();
+ mTerrestrialNetworkAvailableChangedListeners.values().forEach(listener -> {
+ try {
+ listener.onTerrestrialNetworkAvailableChanged(isAvailable);
+ } catch (RemoteException e) {
+ logd("handleEventTerrestrialNetworkAvailableChanged RemoteException: " + e);
+ deadCallersList.add(listener);
+ }
+ });
+ deadCallersList.forEach(listener -> {
+ mTerrestrialNetworkAvailableChangedListeners.remove(listener.asBinder());
+ });
+
+ if (isAvailable && !mIsEmergency) {
+ requestSatelliteEnabled(
+ false /* enableSatellite */, false /* enableDemoMode */,
+ false /* isEmergency */,
+ new IIntegerConsumer.Stub() {
+ @Override
+ public void accept(int result) {
+ plogd("handleEventTerrestrialNetworkAvailableChanged:"
+ + " requestSatelliteEnabled result=" + result);
+ }
+ });
+ }
+ }
+
/**
* This API can be used by only CTS to override the cached value for the device overlay config
* value :
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java b/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
index a19f802..5fa85db 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
@@ -104,6 +104,8 @@
new RegistrantList();
@NonNull private final RegistrantList mSatelliteRegistrationFailureRegistrants =
new RegistrantList();
+ @NonNull private final RegistrantList mTerrestrialNetworkAvailableChangedRegistrants =
+ new RegistrantList();
private class SatelliteListener extends ISatelliteListener.Stub {
@@ -192,6 +194,11 @@
mSatelliteRegistrationFailureRegistrants.notifyResult(causeCode);
}
+ @Override
+ public void onTerrestrialNetworkAvailableChanged(boolean isAvailable) {
+ mTerrestrialNetworkAvailableChangedRegistrants.notifyResult(isAvailable);
+ }
+
private boolean notifyResultIfExpectedListener() {
// Demo listener should notify results only during demo mode
// Vendor listener should notify result only during real mode
@@ -587,6 +594,27 @@
}
/**
+ * Registers for the terrestrial network available changed.
+ *
+ * @param h Handler for notification message.
+ * @param what User-defined message code.
+ * @param obj User object.
+ */
+ public void registerForTerrestrialNetworkAvailableChanged(
+ @NonNull Handler h, int what, @Nullable Object obj) {
+ mTerrestrialNetworkAvailableChangedRegistrants.add(h, what, obj);
+ }
+
+ /**
+ * Unregisters for the terrestrial network available changed.
+ *
+ * @param h Handler to be removed from the registrant list.
+ */
+ public void unregisterForTerrestrialNetworkAvailableChanged(@NonNull Handler h) {
+ mTerrestrialNetworkAvailableChangedRegistrants.remove(h);
+ }
+
+ /**
* Request to enable or disable the satellite service listening mode.
* Listening mode allows the satellite service to listen for incoming pages.
*
@@ -652,14 +680,14 @@
};
if (mSatelliteController.isDemoModeEnabled()) {
- mDemoSimulator.enableCellularModemWhileSatelliteModeIsOn(
+ mDemoSimulator.enableTerrestrialNetworkScanWhileSatelliteModeIsOn(
enabled, errorCallback);
} else {
- mSatelliteService.enableCellularModemWhileSatelliteModeIsOn(
+ mSatelliteService.enableTerrestrialNetworkScanWhileSatelliteModeIsOn(
enabled, errorCallback);
}
} catch (RemoteException e) {
- ploge("enableCellularModemWhileSatelliteModeIsOn: RemoteException " + e);
+ ploge("enableTerrestrialNetworkScanWhileSatelliteModeIsOn: RemoteException " + e);
if (message != null) {
sendMessageWithResult(
message, null, SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
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 5dbb1ec..c043074 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
@@ -1628,6 +1628,11 @@
public void onRegistrationFailure(int causeCode) {
logd("onRegistrationFailure: causeCode=" + causeCode);
}
+
+ @Override
+ public void onTerrestrialNetworkAvailableChanged(boolean isAvailable) {
+ logd("onTerrestrialNetworkAvailableChanged: isAvailable=" + isAvailable);
+ }
};
int errorCode = mSatelliteControllerUT.registerForSatelliteModemStateChanged(callback);
assertEquals(SATELLITE_RESULT_INVALID_TELEPHONY_STATE, errorCode);
@@ -1659,6 +1664,11 @@
public void onRegistrationFailure(int causeCode) {
logd("onRegistrationFailure: causeCode=" + causeCode);
}
+
+ @Override
+ public void onTerrestrialNetworkAvailableChanged(boolean isAvailable) {
+ logd("onTerrestrialNetworkAvailableChanged: isAvailable=" + isAvailable);
+ }
};
mSatelliteControllerUT.unregisterForModemStateChanged(callback);
verify(mMockSatelliteSessionController, never())
@@ -4243,6 +4253,11 @@
resultErrorCode[0] = causeCode;
semaphore.release();
}
+
+ @Override
+ public void onTerrestrialNetworkAvailableChanged(boolean isAvailable) {
+ logd("onTerrestrialNetworkAvailableChanged: isAvailable=" + isAvailable);
+ }
};
resetSatelliteControllerUTToSupportedAndProvisionedState();
mSatelliteControllerUT.setSatelliteSessionController(mMockSatelliteSessionController);
@@ -4296,6 +4311,51 @@
assertTrue(mSatelliteControllerUT.isFoldable(mContext, foldableDeviceStateList));
}
+ @Test
+ public void testTerrestrialNetworkAvailableChangedCallback() {
+ when(mFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
+ Semaphore semaphore = new Semaphore(0);
+ final int[] receivedScanResult = new int[1];
+ ISatelliteModemStateCallback callback = new ISatelliteModemStateCallback.Stub() {
+ @Override
+ public void onSatelliteModemStateChanged(int state) {
+ logd("onSatelliteModemStateChanged: state=" + state);
+ }
+
+ @Override
+ public void onEmergencyModeChanged(boolean isEmergency) {
+ logd("onEmergencyModeChanged: emergency=" + isEmergency);
+ }
+
+ @Override
+ public void onRegistrationFailure(int causeCode) {
+ logd("onRegistrationFailure: causeCode=" + causeCode);
+ }
+
+ @Override
+ public void onTerrestrialNetworkAvailableChanged(boolean isAvailable) {
+ logd("onTerrestrialNetworkAvailableChanged: isAvailable=" + isAvailable);
+ receivedScanResult[0] = isAvailable ? 1 : 0;
+ semaphore.release();
+ }
+ };
+ resetSatelliteControllerUTToSupportedAndProvisionedState();
+ mSatelliteControllerUT.setSatelliteSessionController(mMockSatelliteSessionController);
+
+ int RegisterErrorCode = mSatelliteControllerUT.registerForSatelliteModemStateChanged(
+ callback);
+ assertEquals(SATELLITE_RESULT_SUCCESS, RegisterErrorCode);
+ verify(mMockSatelliteSessionController).registerForSatelliteModemStateChanged(callback);
+
+ int expectedErrorCode = 1;
+ mIIntegerConsumerResults.clear();
+ sendTerrestrialNetworkAvailableChangedEvent(true, null);
+ processAllMessages();
+ assertTrue(waitForForEvents(
+ semaphore, 1, "testRegistrationFailureCallback"));
+ assertEquals(expectedErrorCode, receivedScanResult[0]);
+ }
+
private boolean mProvisionState = false;
private int mProvisionSateResultCode = -1;
private Semaphore mProvisionSateSemaphore = new Semaphore(0);
@@ -5352,6 +5412,14 @@
msg.sendToTarget();
}
+ private void sendTerrestrialNetworkAvailableChangedEvent(boolean isAvailable,
+ Throwable exception) {
+ Message msg = mSatelliteControllerUT.obtainMessage(
+ 55 /* EVENT_TERRESTRIAL_NETWORK_AVAILABLE_CHANGED */);
+ msg.obj = new AsyncResult(null, isAvailable, exception);
+ msg.sendToTarget();
+ }
+
private void setRadioPower(boolean on) {
mSimulatedCommands.setRadioPower(on, false, false, null);
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSessionControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSessionControllerTest.java
index 5ad547d..eb9103a 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSessionControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteSessionControllerTest.java
@@ -60,6 +60,7 @@
import android.os.Looper;
import android.os.Message;
import android.os.PersistableBundle;
+import android.os.RemoteException;
import android.telephony.ServiceState;
import android.telephony.satellite.ISatelliteModemStateCallback;
import android.telephony.satellite.SatelliteManager;
@@ -2106,6 +2107,11 @@
logd("onRegistrationFailure: causeCode=" + causeCode);
}
+ @Override
+ public void onTerrestrialNetworkAvailableChanged(boolean isAvailable) {
+ logd("onTerrestrialNetworkAvailableChanged: isAvailable=" + isAvailable);
+ }
+
public boolean waitUntilResultForModemStateChanged() {
try {
if (!mSemaphoreForModemStateChanged.tryAcquire(EVENT_PROCESSING_TIME_MILLIS,