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

Commit 26884da9 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 13445602 from a5119916 to 25Q3-release

Change-Id: I2abd3c8d4fbbbd268d7cf1c22b6fa85aa733239b
parents 5efb6fae a5119916
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ public class DatagramDispatcher extends Handler {
    private static final int EVENT_SEND_SMS_DONE = 9;
    private static final int EVENT_MT_SMS_POLLING_THROTTLE_TIMED_OUT = 10;
    private static final int CMD_SEND_MT_SMS_POLLING_MESSAGE = 11;
    private static final int EVENT_SATELLITE_MODEM_STATE_CHANGED = 12;

    private static final Long TIMEOUT_DATAGRAM_DELAY_IN_DEMO_MODE = TimeUnit.SECONDS.toMillis(10);

@@ -114,7 +115,13 @@ public class DatagramDispatcher extends Handler {
    private AtomicInteger mConnectedStateCounter = new AtomicInteger(0);
    private AtomicLong mSmsTransmissionStartTime = new AtomicLong(0);

    /**
     * All the variables declared here should only be accessed by methods that run inside the
     * handler thread.
     */
    private DatagramDispatcherHandlerRequest mSendSatelliteDatagramRequest = null;

    /** All the variables that require lock are declared here. */
    private final Object mLock = new Object();
    /**
     * Map key: datagramId, value: SendSatelliteDatagramArgument to retry sending emergency
@@ -421,6 +428,18 @@ public class DatagramDispatcher extends Handler {
                break;
            }

            case EVENT_SATELLITE_MODEM_STATE_CHANGED: {
                plogd("EVENT_SATELLITE_MODEM_STATE_CHANGED");
                SomeArgs args = (SomeArgs) msg.obj;
                int state = (int) args.arg1;
                try {
                    handleEventSatelliteModemStateChanged(state);
                } finally {
                    args.recycle();
                }
                break;
            }

            default:
                plogw("DatagramDispatcherHandler: unexpected message code: " + msg.what);
                break;
@@ -805,6 +824,19 @@ public class DatagramDispatcher extends Handler {
     * @param state Current satellite modem state.
     */
    public void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) {
        if (mFeatureFlags.satelliteImproveMultiThreadDesign()) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = state;
            sendMessage(obtainMessage(EVENT_SATELLITE_MODEM_STATE_CHANGED, args));
            return;
        }

        handleEventSatelliteModemStateChanged(state);
    }

    private void handleEventSatelliteModemStateChanged(
            @SatelliteManager.SatelliteModemState int state) {
        plogd("handleEventSatelliteModemStateChanged: state = " + state);
        synchronized (mLock) {
            mModemState.set(state);
            if (state == SatelliteManager.SATELLITE_MODEM_STATE_OFF
+18 −18
Original line number Diff line number Diff line
@@ -97,23 +97,11 @@ public class DatagramReceiver extends Handler {
    private AtomicLong mDatagramTransferStartTime = new AtomicLong(0);
    private AtomicBoolean mIsDemoMode = new AtomicBoolean(false);
    private AtomicBoolean mIsAligned = new AtomicBoolean(false);

    /**
     * All the variables declared here should only be accessed by methods that run inside the
     * handler thread.
     */
    @Nullable
    private DatagramReceiverHandlerRequest mDemoPollPendingSatelliteDatagramsRequest = null;
    @Nullable
    private DatagramReceiverHandlerRequest mPendingPollSatelliteDatagramsRequest = null;


    /**
     * Map key: subId, value: SatelliteDatagramListenerHandler to notify registrants.
     */
    private final ConcurrentHashMap<Integer, SatelliteDatagramListenerHandler>
            mSatelliteDatagramListenerHandlers = new ConcurrentHashMap<>();

    /**
     * Map key: DatagramId, value: pendingAckCount
     * This map is used to track number of listeners that are yet to send ack for a particular
@@ -122,6 +110,15 @@ public class DatagramReceiver extends Handler {
    private final ConcurrentHashMap<Long, Integer>
            mPendingAckCountHashMap = new ConcurrentHashMap<>();

    /**
     * All the variables declared here should only be accessed by methods that run inside the
     * handler thread.
     */
    @Nullable
    private DatagramReceiverHandlerRequest mDemoPollPendingSatelliteDatagramsRequest = null;
    @Nullable
    private DatagramReceiverHandlerRequest mPendingPollSatelliteDatagramsRequest = null;

    /**
     * Create the DatagramReceiver singleton instance.
     * @param context The Context to use to create the DatagramReceiver.
@@ -130,6 +127,7 @@ public class DatagramReceiver extends Handler {
     * @param datagramController DatagramController which is used to update datagram transfer state.
     * @return The singleton instance of DatagramReceiver.
     */
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public static DatagramReceiver make(@NonNull Context context, @NonNull Looper looper,
            @NonNull FeatureFlags featureFlags,
            @NonNull DatagramController datagramController) {
@@ -148,7 +146,7 @@ public class DatagramReceiver extends Handler {
     * @param featureFlags The telephony feature flags.
     * @param datagramController DatagramController which is used to update datagram transfer state.
     */
    @VisibleForTesting
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    protected DatagramReceiver(@NonNull Context context, @NonNull Looper looper,
            @NonNull FeatureFlags featureFlags,
            @NonNull DatagramController datagramController) {
@@ -558,7 +556,8 @@ public class DatagramReceiver extends Handler {
     *
     * @return The {@link SatelliteManager.SatelliteResult} result of the operation.
     */
    @SatelliteManager.SatelliteResult public int registerForSatelliteDatagram(int subId,
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    @SatelliteManager.SatelliteResult protected int registerForSatelliteDatagram(int subId,
            @NonNull ISatelliteDatagramCallback callback) {
        if (!SatelliteController.getInstance().isSatelliteSupportedViaOem()) {
            return SatelliteManager.SATELLITE_RESULT_NOT_SUPPORTED;
@@ -588,8 +587,7 @@ public class DatagramReceiver extends Handler {
     * @param callback The callback that was passed to
     *                 {@link #registerForSatelliteDatagram(int, ISatelliteDatagramCallback)}.
     */
    public void unregisterForSatelliteDatagram(int subId,
            @NonNull ISatelliteDatagramCallback callback) {
    void unregisterForSatelliteDatagram(int subId, @NonNull ISatelliteDatagramCallback callback) {
        final int validSubId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
        SatelliteDatagramListenerHandler handler =
                mSatelliteDatagramListenerHandlers.get(validSubId);
@@ -615,7 +613,8 @@ public class DatagramReceiver extends Handler {
     * @param subId The subId of the subscription used for receiving datagrams.
     * @param callback The callback to get {@link SatelliteManager.SatelliteResult} of the request.
     */
    public void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) {
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    protected void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) {
        if (mFeatureFlags.satelliteImproveMultiThreadDesign()) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = subId;
@@ -711,7 +710,8 @@ public class DatagramReceiver extends Handler {
     *
     * @param state Current satellite modem state.
     */
    public void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) {
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    protected void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) {
        if (mFeatureFlags.satelliteImproveMultiThreadDesign()) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = state;
+27 −31
Original line number Diff line number Diff line
@@ -383,6 +383,8 @@ public class SatelliteController extends Handler {
    private AtomicBoolean mDisableNFCOnSatelliteEnabled = new AtomicBoolean(false);
    private AtomicBoolean mDisableUWBOnSatelliteEnabled = new AtomicBoolean(false);
    private AtomicBoolean mDisableWifiOnSatelliteEnabled = new AtomicBoolean(false);
    protected AtomicBoolean mIsSatelliteSupported = null;
    private AtomicBoolean mNeedsSatellitePointing = new AtomicBoolean(false);

    private final Object mSatelliteEnabledRequestLock = new Object();
    /* This variable is used to store the first enable request that framework has received in the
@@ -475,9 +477,7 @@ public class SatelliteController extends Handler {
    private final ConcurrentHashMap<IBinder, ISelectedNbIotSatelliteSubscriptionCallback>
            mSelectedNbIotSatelliteSubscriptionChangedListeners = new ConcurrentHashMap<>();

    protected final Object mIsSatelliteSupportedLock = new Object();
    @GuardedBy("mIsSatelliteSupportedLock")
    protected Boolean mIsSatelliteSupported = null;

    private boolean mIsDemoModeEnabled = false;
    private boolean mIsEmergency = false;
    private final Object mIsSatelliteEnabledLock = new Object();
@@ -500,9 +500,6 @@ public class SatelliteController extends Handler {
    private final Object mSatelliteCapabilitiesLock = new Object();
    @GuardedBy("mSatelliteCapabilitiesLock")
    private SatelliteCapabilities mSatelliteCapabilities;
    private final Object mNeedsSatellitePointingLock = new Object();
    @GuardedBy("mNeedsSatellitePointingLock")
    private boolean mNeedsSatellitePointing = false;
    private final Object mNtnSignalsStrengthLock = new Object();
    @GuardedBy("mNtnSignalsStrengthLock")
    private NtnSignalStrength mNtnSignalStrength =
@@ -1551,7 +1548,7 @@ public class SatelliteController extends Handler {
                        evaluateToSendSatelliteEnabledSuccess();
                    } else {
                        // Unregister importance listener for PointingUI when satellite is disabled
                        if (mNeedsSatellitePointing) {
                        if (mNeedsSatellitePointing.get()) {
                            mPointingAppController.removeListenerForPointingUI();
                        }

@@ -1790,9 +1787,7 @@ public class SatelliteController extends Handler {
                        error = SatelliteManager.SATELLITE_RESULT_INVALID_TELEPHONY_STATE;
                    } else {
                        SatelliteCapabilities capabilities = (SatelliteCapabilities) ar.result;
                        synchronized (mNeedsSatellitePointingLock) {
                            mNeedsSatellitePointing = capabilities.isPointingRequired();
                        }
                        mNeedsSatellitePointing.set(capabilities.isPointingRequired());

                        synchronized (mSatelliteCapabilitiesLock) {
                            mSatelliteCapabilities = capabilities;
@@ -3654,7 +3649,7 @@ public class SatelliteController extends Handler {
        /**
         * TODO for NTN-based satellites: Check if satellite is acquired.
         */
        if (mNeedsSatellitePointing) {
        if (mNeedsSatellitePointing.get()) {

            mPointingAppController.startPointingUI(needFullScreenPointingUI, mIsDemoModeEnabled,
                    mIsEmergency);
@@ -4057,9 +4052,7 @@ public class SatelliteController extends Handler {
        // Cached states need to be cleared whenever switching satellite vendor services.
        plogd("setSatelliteServicePackageName: Resetting cached states, provisioned="
                + provisioned);
        synchronized (mIsSatelliteSupportedLock) {
        mIsSatelliteSupported = null;
        }
        synchronized (mIsSatelliteEnabledLock) {
            mIsSatelliteEnabled = null;
        }
@@ -5283,9 +5276,7 @@ public class SatelliteController extends Handler {
    }

    private void updateSatelliteSupportedState(boolean supported) {
        synchronized (mIsSatelliteSupportedLock) {
            mIsSatelliteSupported = supported;
        }
        setIsSatelliteSupported(supported);
        mSatelliteSessionController = SatelliteSessionController.make(
                mContext, getLooper(), mFeatureFlags, supported);
        plogd("updateSatelliteSupportedState: create a new SatelliteSessionController because "
@@ -5650,10 +5641,7 @@ public class SatelliteController extends Handler {
                    });

        }

        synchronized (mIsSatelliteSupportedLock) {
            mIsSatelliteSupported = supported;
        }
        setIsSatelliteSupported(supported);
    }

    private void handleEventSelectedNbIotSatelliteSubscriptionChanged(int selectedSubId) {
@@ -8923,16 +8911,14 @@ public class SatelliteController extends Handler {

    /** Start PointingUI if it is required. */
    public void startPointingUI() {
        synchronized (mNeedsSatellitePointingLock) {
            plogd("startPointingUI: mNeedsSatellitePointing=" + mNeedsSatellitePointing
        plogd("startPointingUI: mNeedsSatellitePointing=" + mNeedsSatellitePointing.get()
                + ", mIsDemoModeEnabled=" + mIsDemoModeEnabled
                + ", mIsEmergency=" + mIsEmergency);
            if (mNeedsSatellitePointing) {
        if (mNeedsSatellitePointing.get()) {
            mPointingAppController.startPointingUI(false /*needFullScreenPointingUI*/,
                    mIsDemoModeEnabled, mIsEmergency);
        }
    }
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    protected void registerForSatelliteCommunicationAccessStateChanged() {
@@ -9675,11 +9661,21 @@ public class SatelliteController extends Handler {
        }
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    protected void setIsSatelliteSupported(boolean isSupported) {
        if (mIsSatelliteSupported == null) {
            mIsSatelliteSupported = new AtomicBoolean(isSupported);
        } else {
            mIsSatelliteSupported.set(isSupported);
        }
    }

    @Nullable
    private Boolean getIsSatelliteSupported() {
        synchronized (mIsSatelliteSupportedLock) {
            return mIsSatelliteSupported;
        if (mIsSatelliteSupported == null) {
            return null;
        }
        return mIsSatelliteSupported.get();
    }

    private boolean isWaitingForDisableSatelliteModemResponse() {
+7 −0
Original line number Diff line number Diff line
@@ -111,6 +111,9 @@ public class DatagramDispatcherTest extends TelephonyTest {
            TEST_WAIT_FOR_DATAGRAM_SENDING_RESPONSE_FOR_LAST_MESSAGE_TIMEOUT_MILLIS =
            (int) TimeUnit.SECONDS.toMillis(60);

    private static final int TEST_MT_SMS_POLLING_THROTTLE_MILLIS =
            (int) TimeUnit.SECONDS.toMillis(60);

    private TestDatagramDispatcher mDatagramDispatcherUT;

    @Mock private SatelliteController mMockSatelliteController;
@@ -179,6 +182,9 @@ public class DatagramDispatcherTest extends TelephonyTest {
        when(mPhone.getSmsDispatchersController()).thenReturn(mMockSmsDispatchersController);
        when(mMockSatelliteController.getSatelliteCarrierId()).thenReturn(UNKNOWN_CARRIER_ID);
        mPendingSms = createPendingRequest();

        mContextFixture.putIntResource(R.integer.config_mt_sms_polling_throttle_millis,
                TEST_MT_SMS_POLLING_THROTTLE_MILLIS);
    }

    @After
@@ -1308,6 +1314,7 @@ public class DatagramDispatcherTest extends TelephonyTest {

    private void setModemState(int state) {
        mDatagramDispatcherUT.onSatelliteModemStateChanged(state);
        processAllMessages();
    }

    private void setShouldPollMtSmsTrue() {
+23 −2
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ import org.mockito.MockitoAnnotations;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;

@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
@@ -86,7 +87,7 @@ public class DatagramReceiverTest extends TelephonyTest {
    private static final long TEST_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMEOUT_MILLIS =
            TimeUnit.SECONDS.toMillis(60);

    private DatagramReceiver mDatagramReceiverUT;
    private TestDatagramReceiver mDatagramReceiverUT;
    private DatagramReceiver.SatelliteDatagramListenerHandler mSatelliteDatagramListenerHandler;
    private TestDatagramReceiver mTestDemoModeDatagramReceiver;

@@ -130,7 +131,7 @@ public class DatagramReceiverTest extends TelephonyTest {
                mMockSessionMetricsStats);

        doReturn(true).when(mFeatureFlags).satelliteImproveMultiThreadDesign();
        mDatagramReceiverUT = DatagramReceiver.make(mContext, Looper.myLooper(), mFeatureFlags,
        mDatagramReceiverUT = new TestDatagramReceiver(mContext, Looper.myLooper(), mFeatureFlags,
                mMockDatagramController);
        mTestDemoModeDatagramReceiver = new TestDatagramReceiver(mContext, Looper.myLooper(),
                mFeatureFlags,
@@ -521,6 +522,8 @@ public class DatagramReceiverTest extends TelephonyTest {
                @NonNull FeatureFlags featureFlags,
                @NonNull DatagramController datagramController) {
            super(context, looper, featureFlags, datagramController);
            make(context, looper, featureFlags, datagramController);

        }

        @Override
@@ -546,6 +549,24 @@ public class DatagramReceiverTest extends TelephonyTest {
        protected boolean isDatagramWaitForConnectedStateTimerStarted() {
            return super.isDatagramWaitForConnectedStateTimerStarted();
        }

        @Override
        protected int registerForSatelliteDatagram(int subId,
                @NonNull ISatelliteDatagramCallback callback) {
            return super.registerForSatelliteDatagram(subId, callback);
        }

        @Override
        protected void pollPendingSatelliteDatagrams(
                int subId, @NonNull Consumer<Integer> callback) {
            super.pollPendingSatelliteDatagrams(subId, callback);
        }

        @Override
        protected void onSatelliteModemStateChanged(
                @SatelliteManager.SatelliteModemState int state) {
            super.onSatelliteModemStateChanged(state);
        }
    }

    private static class TestSatelliteDatagramCallback extends ISatelliteDatagramCallback.Stub {
Loading