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

Commit e13ed6a3 authored by Arun Voddu's avatar Arun Voddu Committed by Android (Google) Code Review
Browse files

Merge "Google Contrigution item #12 - subitem #2, opt [VZW-Skylo] apply Idle...

Merge "Google Contrigution item #12 - subitem #2, opt [VZW-Skylo] apply Idle Mode Scanning for Terrestrial Network" into main
parents 9659d320 4668f522
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -157,6 +157,11 @@ public class RadioOnStateListener {
        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.
+2 −2
Original line number Diff line number Diff line
@@ -287,12 +287,12 @@ public class DemoSimulator extends StateMachine {
     *                             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);
        }
    }

+69 −2
Original line number Diff line number Diff line
@@ -273,6 +273,7 @@ public class SatelliteController extends Handler {
            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 @@ public class SatelliteController extends Handler {
            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 @@ public class SatelliteController extends Handler {
     */
    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 @@ public class SatelliteController extends Handler {
                }
                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 @@ public class SatelliteController extends Handler {
            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 @@ public class SatelliteController extends Handler {
                    + " 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 @@ public class SatelliteController extends Handler {
            registerForNtnSignalStrengthChanged();
            registerForCapabilitiesChanged();
            registerForSatelliteRegistrationFailure();
            registerForTerrestrialNetworkAvailableChanged();

            requestIsSatelliteProvisioned(
                    new ResultReceiver(this) {
@@ -4177,6 +4198,16 @@ public class SatelliteController extends Handler {
        }
    }

    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 @@ public class SatelliteController extends Handler {
        });
    }

    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 :
+31 −3
Original line number Diff line number Diff line
@@ -104,6 +104,8 @@ public class SatelliteModemInterface {
            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 @@ public class SatelliteModemInterface {
            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
@@ -586,6 +593,27 @@ public class SatelliteModemInterface {
        mSatelliteRegistrationFailureRegistrants.remove(h);
    }

    /**
     * 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 @@ public class SatelliteModemInterface {
                };

                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);
+68 −0
Original line number Diff line number Diff line
@@ -1628,6 +1628,11 @@ public class SatelliteControllerTest extends TelephonyTest {
            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 class SatelliteControllerTest extends TelephonyTest {
            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 @@ public class SatelliteControllerTest extends TelephonyTest {
                resultErrorCode[0] = causeCode;
                semaphore.release();
            }

            @Override
            public void onTerrestrialNetworkAvailableChanged(boolean isAvailable) {
                logd("onTerrestrialNetworkAvailableChanged: isAvailable=" + isAvailable);
            }
        };
        resetSatelliteControllerUTToSupportedAndProvisionedState();
        mSatelliteControllerUT.setSatelliteSessionController(mMockSatelliteSessionController);
@@ -4296,6 +4311,51 @@ public class SatelliteControllerTest extends TelephonyTest {
        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 @@ public class SatelliteControllerTest extends TelephonyTest {
        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);
    }
Loading