Loading src/java/com/android/internal/telephony/satellite/SatelliteController.java +102 −2 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.satellite.INtnSignalStrengthCallback; import android.telephony.satellite.ISatelliteCapabilitiesCallback; import android.telephony.satellite.ISatelliteDatagramCallback; import android.telephony.satellite.ISatelliteProvisionStateCallback; import android.telephony.satellite.ISatelliteStateCallback; Loading Loading @@ -159,6 +160,7 @@ public class SatelliteController extends Handler { private static final int CMD_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING = 35; private static final int EVENT_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING_DONE = 36; private static final int EVENT_SERVICE_STATE_CHANGED = 37; private static final int EVENT_SATELLITE_CAPABILITIES_CHANGED = 38; @NonNull private static SatelliteController sInstance; @NonNull private final Context mContext; Loading Loading @@ -210,6 +212,8 @@ public class SatelliteController extends Handler { private final AtomicBoolean mRegisteredForSatelliteModemStateChangedWithSatelliteService = new AtomicBoolean(false); private final AtomicBoolean mRegisteredForNtnSignalStrengthChanged = new AtomicBoolean(false); private final AtomicBoolean mRegisteredForSatelliteCapabilitiesChanged = new AtomicBoolean(false); /** * Map key: subId, value: callback to get error code of the provision request. */ Loading @@ -227,6 +231,12 @@ public class SatelliteController extends Handler { */ private final ConcurrentHashMap<IBinder, INtnSignalStrengthCallback> mNtnSignalStrengthChangedListeners = new ConcurrentHashMap<>(); /** * Map key: binder of the callback, value: callback to receive satellite capabilities changed * events. */ private final ConcurrentHashMap<IBinder, ISatelliteCapabilitiesCallback> mSatelliteCapabilitiesChangedListeners = new ConcurrentHashMap<>(); private final Object mIsSatelliteSupportedLock = new Object(); @GuardedBy("mIsSatelliteSupportedLock") private Boolean mIsSatelliteSupported = null; Loading Loading @@ -1207,6 +1217,16 @@ public class SatelliteController extends Handler { break; } case EVENT_SATELLITE_CAPABILITIES_CHANGED: { ar = (AsyncResult) msg.obj; if (ar.result == null) { loge("EVENT_SATELLITE_CAPABILITIES_CHANGED: result is null"); } else { handleEventSatelliteCapabilitiesChanged((SatelliteCapabilities) ar.result); } break; } default: Log.w(TAG, "SatelliteControllerHandler: unexpected message code: " + msg.what); Loading Loading @@ -1972,7 +1992,7 @@ public class SatelliteController extends Handler { /** * Registers for NTN signal strength changed from satellite modem. * * @param subId The subId of the subscription to request for. * @param subId The id of the subscription to request for. * @param callback The callback to handle the non-terrestrial network signal strength changed * event. * Loading @@ -1993,7 +2013,8 @@ public class SatelliteController extends Handler { * Unregisters for NTN signal strength changed from satellite modem. * If callback was not registered before, the request will be ignored. * * @param subId The subId of the subscription to unregister for provision state changed. * @param subId The id of the subscription to unregister for listening NTN signal strength * changed event. * @param callback The callback that was passed to * {@link #registerForNtnSignalStrengthChanged(int, INtnSignalStrengthCallback)} */ Loading @@ -2007,6 +2028,44 @@ public class SatelliteController extends Handler { } } /** * Registers for satellite capabilities change event from the satellite service. * * @param subId The id of the subscription to request for. * @param callback The callback to handle the satellite capabilities changed event. * * @return The {@link SatelliteManager.SatelliteResult} result of the operation. */ @SatelliteManager.SatelliteResult public int registerForSatelliteCapabilitiesChanged( int subId, @NonNull ISatelliteCapabilitiesCallback callback) { if (DBG) logd("registerForSatelliteCapabilitiesChanged()"); int error = evaluateOemSatelliteRequestAllowed(true); if (error != SATELLITE_RESULT_SUCCESS) return error; mSatelliteCapabilitiesChangedListeners.put(callback.asBinder(), callback); return SATELLITE_RESULT_SUCCESS; } /** * Unregisters for satellite capabilities change event from the satellite service. * If callback was not registered before, the request will be ignored. * * @param subId The id of the subscription to unregister for listening satellite capabilities * changed event. * @param callback The callback that was passed to * {@link #registerForSatelliteCapabilitiesChanged(int, ISatelliteCapabilitiesCallback)} */ public void unregisterForSatelliteCapabilitiesChanged( int subId, @NonNull ISatelliteCapabilitiesCallback callback) { if (DBG) logd("unregisterForSatelliteCapabilitiesChanged()"); int error = evaluateOemSatelliteRequestAllowed(true); if (error == SATELLITE_RESULT_SUCCESS) { mSatelliteCapabilitiesChangedListeners.remove(callback.asBinder()); } } /** * This API can be used by only CTS to update satellite vendor service package name. * Loading Loading @@ -2583,6 +2642,7 @@ public class SatelliteController extends Handler { registerForPendingDatagramCount(); registerForSatelliteModemStateChanged(); registerForNtnSignalStrengthChanged(); registerForSatelliteCapabilitiesChanged(); requestIsSatelliteProvisioned(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, new ResultReceiver(this) { Loading Loading @@ -2666,6 +2726,21 @@ public class SatelliteController extends Handler { } } private void registerForSatelliteCapabilitiesChanged() { if (!mFeatureFlags.oemEnabledSatelliteFlag()) { logd("registerForSatelliteCapabilitiesChanged: oemEnabledSatelliteFlag is disabled"); return; } if (mSatelliteModemInterface.isSatelliteServiceSupported()) { if (!mRegisteredForSatelliteCapabilitiesChanged.get()) { mSatelliteModemInterface.registerForSatelliteCapabilitiesChanged( this, EVENT_SATELLITE_CAPABILITIES_CHANGED, null); mRegisteredForSatelliteCapabilitiesChanged.set(true); } } } private void handleEventSatelliteProvisionStateChanged(boolean provisioned) { logd("handleSatelliteProvisionStateChangedEvent: provisioned=" + provisioned); Loading Loading @@ -2748,6 +2823,31 @@ public class SatelliteController extends Handler { }); } private void handleEventSatelliteCapabilitiesChanged(SatelliteCapabilities capabilities) { logd("handleEventSatelliteCapabilitiesChanged()"); if (!mFeatureFlags.oemEnabledSatelliteFlag()) { logd("handleEventSatelliteCapabilitiesChanged: oemEnabledSatelliteFlag is disabled"); return; } synchronized (mSatelliteCapabilitiesLock) { mSatelliteCapabilities = capabilities; } List<ISatelliteCapabilitiesCallback> deadCallersList = new ArrayList<>(); mSatelliteCapabilitiesChangedListeners.values().forEach(listener -> { try { listener.onSatelliteCapabilitiesChanged(capabilities); } catch (RemoteException e) { logd("handleEventSatelliteCapabilitiesChanged RemoteException: " + e); deadCallersList.add(listener); } }); deadCallersList.forEach(listener -> { mSatelliteCapabilitiesChangedListeners.remove(listener.asBinder()); }); } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) protected void setSettingsKeyForSatelliteMode(int val) { logd("setSettingsKeyForSatelliteMode val: " + val); Loading src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java +31 −1 Original line number Diff line number Diff line Loading @@ -91,6 +91,8 @@ public class SatelliteModemInterface { new RegistrantList(); @NonNull private final RegistrantList mNtnSignalStrengthChangedRegistrants = new RegistrantList(); @NonNull private final RegistrantList mSatelliteCapabilitiesChangedRegistrants = new RegistrantList(); @NonNull private final ISatelliteListener mListener = new ISatelliteListener.Stub() { @Override Loading Loading @@ -145,7 +147,14 @@ public class SatelliteModemInterface { public void onNtnSignalStrengthChanged( android.telephony.satellite.stub.NtnSignalStrength ntnSignalStrength) { mNtnSignalStrengthChangedRegistrants.notifyResult( SatelliteServiceUtils.fromModemInterface(ntnSignalStrength)); SatelliteServiceUtils.fromNtnSignalStrength(ntnSignalStrength)); } @Override public void onSatelliteCapabilitiesChanged( android.telephony.satellite.stub.SatelliteCapabilities satelliteCapabilities) { mSatelliteCapabilitiesChangedRegistrants.notifyResult( SatelliteServiceUtils.fromSatelliteCapabilities(satelliteCapabilities)); } }; Loading Loading @@ -472,6 +481,27 @@ public class SatelliteModemInterface { mNtnSignalStrengthChangedRegistrants.remove(h); } /** * Registers for satellite capabilities changed. * * @param h Handler for notification message. * @param what User-defined message code. * @param obj User object. */ public void registerForSatelliteCapabilitiesChanged( @NonNull Handler h, int what, @Nullable Object obj) { mSatelliteCapabilitiesChangedRegistrants.add(h, what, obj); } /** * Unregisters for satellite capabilities changed. * * @param h Handler to be removed from the registrant list. */ public void unregisterForSatelliteCapabilitiesChanged(@NonNull Handler h) { mSatelliteCapabilitiesChangedRegistrants.remove(h); } /** * Request to enable or disable the satellite service listening mode. * Listening mode allows the satellite service to listen for incoming pages. Loading src/java/com/android/internal/telephony/satellite/SatelliteServiceUtils.java +1 −1 Original line number Diff line number Diff line Loading @@ -217,7 +217,7 @@ public class SatelliteServiceUtils { * @param ntnSignalStrength The non-terrestrial signal strength from the satellite service. * @return The converted non-terrestrial signal strength for the framework. */ @Nullable public static NtnSignalStrength fromModemInterface( @Nullable public static NtnSignalStrength fromNtnSignalStrength( android.telephony.satellite.stub.NtnSignalStrength ntnSignalStrength) { return new NtnSignalStrength(ntnSignalStrength.signalStrengthLevel); } Loading tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java +116 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,7 @@ import android.telephony.CarrierConfigManager; import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.satellite.INtnSignalStrengthCallback; import android.telephony.satellite.ISatelliteCapabilitiesCallback; import android.telephony.satellite.ISatelliteDatagramCallback; import android.telephony.satellite.ISatelliteProvisionStateCallback; import android.telephony.satellite.ISatelliteStateCallback; Loading Loading @@ -2396,6 +2397,114 @@ public class SatelliteControllerTest extends TelephonyTest { assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime()); } @Test public void testRegisterForSatelliteCapabilitiesChangedWithFeatureFlagEnabled() { when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true); Semaphore semaphore = new Semaphore(0); final SatelliteCapabilities[] satelliteCapabilities = new SatelliteCapabilities[1]; ISatelliteCapabilitiesCallback callback = new ISatelliteCapabilitiesCallback.Stub() { @Override public void onSatelliteCapabilitiesChanged(SatelliteCapabilities capabilities) { logd("onSatelliteCapabilitiesChanged: " + capabilities); try { satelliteCapabilities[0] = capabilities; semaphore.release(); } catch (Exception ex) { loge("onSatelliteCapabilitiesChanged: Got exception in releasing " + "semaphore, ex=" + ex); } } }; int errorCode = mSatelliteControllerUT.registerForSatelliteCapabilitiesChanged(SUB_ID, callback); assertEquals(SATELLITE_RESULT_INVALID_TELEPHONY_STATE, errorCode); setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RESULT_SUCCESS); verifySatelliteSupported(false, SATELLITE_RESULT_SUCCESS); errorCode = mSatelliteControllerUT.registerForSatelliteCapabilitiesChanged(SUB_ID, callback); assertEquals(SATELLITE_RESULT_NOT_SUPPORTED, errorCode); resetSatelliteControllerUT(); setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_RESULT_SUCCESS); setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS); verifySatelliteSupported(true, SATELLITE_RESULT_SUCCESS); errorCode = mSatelliteControllerUT.registerForSatelliteCapabilitiesChanged(SUB_ID, callback); assertEquals(SATELLITE_RESULT_SUCCESS, errorCode); SatelliteCapabilities expectedCapabilities = mSatelliteCapabilities; sendSatelliteCapabilitiesChangedEvent(expectedCapabilities, null); processAllMessages(); assertTrue(waitForForEvents( semaphore, 1, "testRegisterForSatelliteCapabilitiesChanged")); assertTrue(expectedCapabilities.equals(satelliteCapabilities[0])); expectedCapabilities = mEmptySatelliteCapabilities; sendSatelliteCapabilitiesChangedEvent(expectedCapabilities, null); processAllMessages(); assertTrue(waitForForEvents( semaphore, 1, "testRegisterForSatelliteCapabilitiesChanged")); assertTrue(expectedCapabilities.equals(satelliteCapabilities[0])); mSatelliteControllerUT.unregisterForSatelliteCapabilitiesChanged(SUB_ID, callback); expectedCapabilities = mSatelliteCapabilities; sendSatelliteCapabilitiesChangedEvent(expectedCapabilities, null); processAllMessages(); assertTrue(waitForForEvents( semaphore, 0, "testRegisterForSatelliteCapabilitiesChanged")); } @Test public void testRegisterForSatelliteCapabilitiesChangedWithFeatureFlagDisabled() { when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(false); Semaphore semaphore = new Semaphore(0); final SatelliteCapabilities[] satelliteCapabilities = new SatelliteCapabilities[1]; ISatelliteCapabilitiesCallback callback = new ISatelliteCapabilitiesCallback.Stub() { @Override public void onSatelliteCapabilitiesChanged(SatelliteCapabilities capabilities) { logd("onSatelliteCapabilitiesChanged: " + capabilities); try { satelliteCapabilities[0] = capabilities; semaphore.release(); } catch (Exception ex) { loge("onSatelliteCapabilitiesChanged: Got exception in releasing " + "semaphore, ex=" + ex); } } }; int errorCode = mSatelliteControllerUT.registerForSatelliteCapabilitiesChanged(SUB_ID, callback); assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, errorCode); setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RESULT_SUCCESS); verifySatelliteSupported(false, SATELLITE_RESULT_NOT_SUPPORTED); errorCode = mSatelliteControllerUT.registerForSatelliteCapabilitiesChanged(SUB_ID, callback); assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, errorCode); resetSatelliteControllerUT(); setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS); verifySatelliteSupported(false, SATELLITE_RESULT_NOT_SUPPORTED); errorCode = mSatelliteControllerUT.registerForSatelliteCapabilitiesChanged(SUB_ID, callback); assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, errorCode); SatelliteCapabilities expectedCapabilities = mSatelliteCapabilities; sendSatelliteCapabilitiesChangedEvent(expectedCapabilities, null); processAllMessages(); assertTrue(waitForForEvents( semaphore, 0, "testRegisterForSatelliteCapabilitiesChanged")); } private void resetSatelliteControllerUTEnabledState() { logd("resetSatelliteControllerUTEnabledState"); setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RESULT_RADIO_NOT_AVAILABLE); Loading Loading @@ -2936,7 +3045,14 @@ public class SatelliteControllerTest extends TelephonyTest { private void sendServiceStateChangedEvent() { mSatelliteControllerUT.obtainMessage(37 /* EVENT_SERVICE_STATE_CHANGED */).sendToTarget(); } private void sendSatelliteCapabilitiesChangedEvent(SatelliteCapabilities capabilities, Throwable exception) { Message msg = mSatelliteControllerUT.obtainMessage( 38 /* EVENT_SATELLITE_CAPABILITIES_CHANGED */); msg.obj = new AsyncResult(null, capabilities, exception); msg.sendToTarget(); } private void setRadioPower(boolean on) { Loading Loading
src/java/com/android/internal/telephony/satellite/SatelliteController.java +102 −2 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.satellite.INtnSignalStrengthCallback; import android.telephony.satellite.ISatelliteCapabilitiesCallback; import android.telephony.satellite.ISatelliteDatagramCallback; import android.telephony.satellite.ISatelliteProvisionStateCallback; import android.telephony.satellite.ISatelliteStateCallback; Loading Loading @@ -159,6 +160,7 @@ public class SatelliteController extends Handler { private static final int CMD_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING = 35; private static final int EVENT_UPDATE_NTN_SIGNAL_STRENGTH_REPORTING_DONE = 36; private static final int EVENT_SERVICE_STATE_CHANGED = 37; private static final int EVENT_SATELLITE_CAPABILITIES_CHANGED = 38; @NonNull private static SatelliteController sInstance; @NonNull private final Context mContext; Loading Loading @@ -210,6 +212,8 @@ public class SatelliteController extends Handler { private final AtomicBoolean mRegisteredForSatelliteModemStateChangedWithSatelliteService = new AtomicBoolean(false); private final AtomicBoolean mRegisteredForNtnSignalStrengthChanged = new AtomicBoolean(false); private final AtomicBoolean mRegisteredForSatelliteCapabilitiesChanged = new AtomicBoolean(false); /** * Map key: subId, value: callback to get error code of the provision request. */ Loading @@ -227,6 +231,12 @@ public class SatelliteController extends Handler { */ private final ConcurrentHashMap<IBinder, INtnSignalStrengthCallback> mNtnSignalStrengthChangedListeners = new ConcurrentHashMap<>(); /** * Map key: binder of the callback, value: callback to receive satellite capabilities changed * events. */ private final ConcurrentHashMap<IBinder, ISatelliteCapabilitiesCallback> mSatelliteCapabilitiesChangedListeners = new ConcurrentHashMap<>(); private final Object mIsSatelliteSupportedLock = new Object(); @GuardedBy("mIsSatelliteSupportedLock") private Boolean mIsSatelliteSupported = null; Loading Loading @@ -1207,6 +1217,16 @@ public class SatelliteController extends Handler { break; } case EVENT_SATELLITE_CAPABILITIES_CHANGED: { ar = (AsyncResult) msg.obj; if (ar.result == null) { loge("EVENT_SATELLITE_CAPABILITIES_CHANGED: result is null"); } else { handleEventSatelliteCapabilitiesChanged((SatelliteCapabilities) ar.result); } break; } default: Log.w(TAG, "SatelliteControllerHandler: unexpected message code: " + msg.what); Loading Loading @@ -1972,7 +1992,7 @@ public class SatelliteController extends Handler { /** * Registers for NTN signal strength changed from satellite modem. * * @param subId The subId of the subscription to request for. * @param subId The id of the subscription to request for. * @param callback The callback to handle the non-terrestrial network signal strength changed * event. * Loading @@ -1993,7 +2013,8 @@ public class SatelliteController extends Handler { * Unregisters for NTN signal strength changed from satellite modem. * If callback was not registered before, the request will be ignored. * * @param subId The subId of the subscription to unregister for provision state changed. * @param subId The id of the subscription to unregister for listening NTN signal strength * changed event. * @param callback The callback that was passed to * {@link #registerForNtnSignalStrengthChanged(int, INtnSignalStrengthCallback)} */ Loading @@ -2007,6 +2028,44 @@ public class SatelliteController extends Handler { } } /** * Registers for satellite capabilities change event from the satellite service. * * @param subId The id of the subscription to request for. * @param callback The callback to handle the satellite capabilities changed event. * * @return The {@link SatelliteManager.SatelliteResult} result of the operation. */ @SatelliteManager.SatelliteResult public int registerForSatelliteCapabilitiesChanged( int subId, @NonNull ISatelliteCapabilitiesCallback callback) { if (DBG) logd("registerForSatelliteCapabilitiesChanged()"); int error = evaluateOemSatelliteRequestAllowed(true); if (error != SATELLITE_RESULT_SUCCESS) return error; mSatelliteCapabilitiesChangedListeners.put(callback.asBinder(), callback); return SATELLITE_RESULT_SUCCESS; } /** * Unregisters for satellite capabilities change event from the satellite service. * If callback was not registered before, the request will be ignored. * * @param subId The id of the subscription to unregister for listening satellite capabilities * changed event. * @param callback The callback that was passed to * {@link #registerForSatelliteCapabilitiesChanged(int, ISatelliteCapabilitiesCallback)} */ public void unregisterForSatelliteCapabilitiesChanged( int subId, @NonNull ISatelliteCapabilitiesCallback callback) { if (DBG) logd("unregisterForSatelliteCapabilitiesChanged()"); int error = evaluateOemSatelliteRequestAllowed(true); if (error == SATELLITE_RESULT_SUCCESS) { mSatelliteCapabilitiesChangedListeners.remove(callback.asBinder()); } } /** * This API can be used by only CTS to update satellite vendor service package name. * Loading Loading @@ -2583,6 +2642,7 @@ public class SatelliteController extends Handler { registerForPendingDatagramCount(); registerForSatelliteModemStateChanged(); registerForNtnSignalStrengthChanged(); registerForSatelliteCapabilitiesChanged(); requestIsSatelliteProvisioned(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID, new ResultReceiver(this) { Loading Loading @@ -2666,6 +2726,21 @@ public class SatelliteController extends Handler { } } private void registerForSatelliteCapabilitiesChanged() { if (!mFeatureFlags.oemEnabledSatelliteFlag()) { logd("registerForSatelliteCapabilitiesChanged: oemEnabledSatelliteFlag is disabled"); return; } if (mSatelliteModemInterface.isSatelliteServiceSupported()) { if (!mRegisteredForSatelliteCapabilitiesChanged.get()) { mSatelliteModemInterface.registerForSatelliteCapabilitiesChanged( this, EVENT_SATELLITE_CAPABILITIES_CHANGED, null); mRegisteredForSatelliteCapabilitiesChanged.set(true); } } } private void handleEventSatelliteProvisionStateChanged(boolean provisioned) { logd("handleSatelliteProvisionStateChangedEvent: provisioned=" + provisioned); Loading Loading @@ -2748,6 +2823,31 @@ public class SatelliteController extends Handler { }); } private void handleEventSatelliteCapabilitiesChanged(SatelliteCapabilities capabilities) { logd("handleEventSatelliteCapabilitiesChanged()"); if (!mFeatureFlags.oemEnabledSatelliteFlag()) { logd("handleEventSatelliteCapabilitiesChanged: oemEnabledSatelliteFlag is disabled"); return; } synchronized (mSatelliteCapabilitiesLock) { mSatelliteCapabilities = capabilities; } List<ISatelliteCapabilitiesCallback> deadCallersList = new ArrayList<>(); mSatelliteCapabilitiesChangedListeners.values().forEach(listener -> { try { listener.onSatelliteCapabilitiesChanged(capabilities); } catch (RemoteException e) { logd("handleEventSatelliteCapabilitiesChanged RemoteException: " + e); deadCallersList.add(listener); } }); deadCallersList.forEach(listener -> { mSatelliteCapabilitiesChangedListeners.remove(listener.asBinder()); }); } @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE) protected void setSettingsKeyForSatelliteMode(int val) { logd("setSettingsKeyForSatelliteMode val: " + val); Loading
src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java +31 −1 Original line number Diff line number Diff line Loading @@ -91,6 +91,8 @@ public class SatelliteModemInterface { new RegistrantList(); @NonNull private final RegistrantList mNtnSignalStrengthChangedRegistrants = new RegistrantList(); @NonNull private final RegistrantList mSatelliteCapabilitiesChangedRegistrants = new RegistrantList(); @NonNull private final ISatelliteListener mListener = new ISatelliteListener.Stub() { @Override Loading Loading @@ -145,7 +147,14 @@ public class SatelliteModemInterface { public void onNtnSignalStrengthChanged( android.telephony.satellite.stub.NtnSignalStrength ntnSignalStrength) { mNtnSignalStrengthChangedRegistrants.notifyResult( SatelliteServiceUtils.fromModemInterface(ntnSignalStrength)); SatelliteServiceUtils.fromNtnSignalStrength(ntnSignalStrength)); } @Override public void onSatelliteCapabilitiesChanged( android.telephony.satellite.stub.SatelliteCapabilities satelliteCapabilities) { mSatelliteCapabilitiesChangedRegistrants.notifyResult( SatelliteServiceUtils.fromSatelliteCapabilities(satelliteCapabilities)); } }; Loading Loading @@ -472,6 +481,27 @@ public class SatelliteModemInterface { mNtnSignalStrengthChangedRegistrants.remove(h); } /** * Registers for satellite capabilities changed. * * @param h Handler for notification message. * @param what User-defined message code. * @param obj User object. */ public void registerForSatelliteCapabilitiesChanged( @NonNull Handler h, int what, @Nullable Object obj) { mSatelliteCapabilitiesChangedRegistrants.add(h, what, obj); } /** * Unregisters for satellite capabilities changed. * * @param h Handler to be removed from the registrant list. */ public void unregisterForSatelliteCapabilitiesChanged(@NonNull Handler h) { mSatelliteCapabilitiesChangedRegistrants.remove(h); } /** * Request to enable or disable the satellite service listening mode. * Listening mode allows the satellite service to listen for incoming pages. Loading
src/java/com/android/internal/telephony/satellite/SatelliteServiceUtils.java +1 −1 Original line number Diff line number Diff line Loading @@ -217,7 +217,7 @@ public class SatelliteServiceUtils { * @param ntnSignalStrength The non-terrestrial signal strength from the satellite service. * @return The converted non-terrestrial signal strength for the framework. */ @Nullable public static NtnSignalStrength fromModemInterface( @Nullable public static NtnSignalStrength fromNtnSignalStrength( android.telephony.satellite.stub.NtnSignalStrength ntnSignalStrength) { return new NtnSignalStrength(ntnSignalStrength.signalStrengthLevel); } Loading
tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java +116 −0 Original line number Diff line number Diff line Loading @@ -96,6 +96,7 @@ import android.telephony.CarrierConfigManager; import android.telephony.Rlog; import android.telephony.ServiceState; import android.telephony.satellite.INtnSignalStrengthCallback; import android.telephony.satellite.ISatelliteCapabilitiesCallback; import android.telephony.satellite.ISatelliteDatagramCallback; import android.telephony.satellite.ISatelliteProvisionStateCallback; import android.telephony.satellite.ISatelliteStateCallback; Loading Loading @@ -2396,6 +2397,114 @@ public class SatelliteControllerTest extends TelephonyTest { assertFalse(mSatelliteControllerUT.isSatelliteConnectedViaCarrierWithinHysteresisTime()); } @Test public void testRegisterForSatelliteCapabilitiesChangedWithFeatureFlagEnabled() { when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true); Semaphore semaphore = new Semaphore(0); final SatelliteCapabilities[] satelliteCapabilities = new SatelliteCapabilities[1]; ISatelliteCapabilitiesCallback callback = new ISatelliteCapabilitiesCallback.Stub() { @Override public void onSatelliteCapabilitiesChanged(SatelliteCapabilities capabilities) { logd("onSatelliteCapabilitiesChanged: " + capabilities); try { satelliteCapabilities[0] = capabilities; semaphore.release(); } catch (Exception ex) { loge("onSatelliteCapabilitiesChanged: Got exception in releasing " + "semaphore, ex=" + ex); } } }; int errorCode = mSatelliteControllerUT.registerForSatelliteCapabilitiesChanged(SUB_ID, callback); assertEquals(SATELLITE_RESULT_INVALID_TELEPHONY_STATE, errorCode); setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RESULT_SUCCESS); verifySatelliteSupported(false, SATELLITE_RESULT_SUCCESS); errorCode = mSatelliteControllerUT.registerForSatelliteCapabilitiesChanged(SUB_ID, callback); assertEquals(SATELLITE_RESULT_NOT_SUPPORTED, errorCode); resetSatelliteControllerUT(); setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_RESULT_SUCCESS); setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS); verifySatelliteSupported(true, SATELLITE_RESULT_SUCCESS); errorCode = mSatelliteControllerUT.registerForSatelliteCapabilitiesChanged(SUB_ID, callback); assertEquals(SATELLITE_RESULT_SUCCESS, errorCode); SatelliteCapabilities expectedCapabilities = mSatelliteCapabilities; sendSatelliteCapabilitiesChangedEvent(expectedCapabilities, null); processAllMessages(); assertTrue(waitForForEvents( semaphore, 1, "testRegisterForSatelliteCapabilitiesChanged")); assertTrue(expectedCapabilities.equals(satelliteCapabilities[0])); expectedCapabilities = mEmptySatelliteCapabilities; sendSatelliteCapabilitiesChangedEvent(expectedCapabilities, null); processAllMessages(); assertTrue(waitForForEvents( semaphore, 1, "testRegisterForSatelliteCapabilitiesChanged")); assertTrue(expectedCapabilities.equals(satelliteCapabilities[0])); mSatelliteControllerUT.unregisterForSatelliteCapabilitiesChanged(SUB_ID, callback); expectedCapabilities = mSatelliteCapabilities; sendSatelliteCapabilitiesChangedEvent(expectedCapabilities, null); processAllMessages(); assertTrue(waitForForEvents( semaphore, 0, "testRegisterForSatelliteCapabilitiesChanged")); } @Test public void testRegisterForSatelliteCapabilitiesChangedWithFeatureFlagDisabled() { when(mFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(false); Semaphore semaphore = new Semaphore(0); final SatelliteCapabilities[] satelliteCapabilities = new SatelliteCapabilities[1]; ISatelliteCapabilitiesCallback callback = new ISatelliteCapabilitiesCallback.Stub() { @Override public void onSatelliteCapabilitiesChanged(SatelliteCapabilities capabilities) { logd("onSatelliteCapabilitiesChanged: " + capabilities); try { satelliteCapabilities[0] = capabilities; semaphore.release(); } catch (Exception ex) { loge("onSatelliteCapabilitiesChanged: Got exception in releasing " + "semaphore, ex=" + ex); } } }; int errorCode = mSatelliteControllerUT.registerForSatelliteCapabilitiesChanged(SUB_ID, callback); assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, errorCode); setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RESULT_SUCCESS); verifySatelliteSupported(false, SATELLITE_RESULT_NOT_SUPPORTED); errorCode = mSatelliteControllerUT.registerForSatelliteCapabilitiesChanged(SUB_ID, callback); assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, errorCode); resetSatelliteControllerUT(); setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS); verifySatelliteSupported(false, SATELLITE_RESULT_NOT_SUPPORTED); errorCode = mSatelliteControllerUT.registerForSatelliteCapabilitiesChanged(SUB_ID, callback); assertEquals(SATELLITE_RESULT_REQUEST_NOT_SUPPORTED, errorCode); SatelliteCapabilities expectedCapabilities = mSatelliteCapabilities; sendSatelliteCapabilitiesChangedEvent(expectedCapabilities, null); processAllMessages(); assertTrue(waitForForEvents( semaphore, 0, "testRegisterForSatelliteCapabilitiesChanged")); } private void resetSatelliteControllerUTEnabledState() { logd("resetSatelliteControllerUTEnabledState"); setUpResponseForRequestIsSatelliteSupported(false, SATELLITE_RESULT_RADIO_NOT_AVAILABLE); Loading Loading @@ -2936,7 +3045,14 @@ public class SatelliteControllerTest extends TelephonyTest { private void sendServiceStateChangedEvent() { mSatelliteControllerUT.obtainMessage(37 /* EVENT_SERVICE_STATE_CHANGED */).sendToTarget(); } private void sendSatelliteCapabilitiesChangedEvent(SatelliteCapabilities capabilities, Throwable exception) { Message msg = mSatelliteControllerUT.obtainMessage( 38 /* EVENT_SATELLITE_CAPABILITIES_CHANGED */); msg.obj = new AsyncResult(null, capabilities, exception); msg.sendToTarget(); } private void setRadioPower(boolean on) { Loading