Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8e25387e authored by Hakjun Choi's avatar Hakjun Choi Committed by Android (Google) Code Review
Browse files

Merge "Add register/unregister callback for satellite capabilities changed event" into main

parents 6098a061 58f1bd62
Loading
Loading
Loading
Loading
+102 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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.
     */
@@ -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;
@@ -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);
@@ -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.
     *
@@ -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)}
     */
@@ -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.
     *
@@ -2583,6 +2642,7 @@ public class SatelliteController extends Handler {
            registerForPendingDatagramCount();
            registerForSatelliteModemStateChanged();
            registerForNtnSignalStrengthChanged();
            registerForSatelliteCapabilitiesChanged();

            requestIsSatelliteProvisioned(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID,
                    new ResultReceiver(this) {
@@ -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);

@@ -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);
+31 −1
Original line number Diff line number Diff line
@@ -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
@@ -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));
        }
    };

@@ -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.
+1 −1
Original line number Diff line number Diff line
@@ -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);
    }
+116 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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);
@@ -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) {