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

Commit 4b716724 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 13403772 from 97731847 to 25Q3-release

Change-Id: I3e3794b3ea2032f444341383db7a834f35799d90
parents db317635 97731847
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -202,13 +202,3 @@ flag {
    }
}
# OWNER=jackyu TARGET=25Q2
flag {
    name: "carrier_config_changed_callback_fix"
    namespace: "telephony"
    description: "Carrier config callback race condition fix"
    bug:"375526692"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
+46 −47
Original line number Diff line number Diff line
@@ -108,9 +108,9 @@ public class DatagramController {
    private AtomicLong mModemImageSwitchingDuration = new AtomicLong(0);
    private AtomicBoolean mWaitForDeviceAlignmentInDemoDatagram = new AtomicBoolean(false);
    private AtomicLong mDatagramWaitTimeForConnectedStateForLastMessage = new AtomicLong(0);
    @GuardedBy("mLock")
    @SatelliteManager.SatelliteModemState
    private int mSatelltieModemState = SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN;
    private AtomicInteger mSatelltieModemState =
            new AtomicInteger(SatelliteManager.SATELLITE_MODEM_STATE_UNKNOWN);
    @Nullable
    private PersistentLogger mPersistentLogger = null;

@@ -286,17 +286,15 @@ public class DatagramController {

    private boolean shouldSuppressDatagramTransferStateUpdate(
            @SatelliteManager.DatagramType int datagramType) {
        synchronized (mLock) {
        if (!SatelliteController.getInstance().isSatelliteAttachRequired()) {
            return false;
        }
        if (datagramType == DATAGRAM_TYPE_KEEP_ALIVE
                    && mSatelltieModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED) {
                && mSatelltieModemState.get() == SATELLITE_MODEM_STATE_NOT_CONNECTED) {
            return true;
        }
        return false;
    }
    }

    /**
     * Update receive status to {@link PointingAppController}.
@@ -355,10 +353,9 @@ public class DatagramController {
     *
     * @param state Current satellite modem state.
     */
    public void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) {
        synchronized (mLock) {
            mSatelltieModemState = state;
        }
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    protected void onSatelliteModemStateChanged(@SatelliteManager.SatelliteModemState int state) {
        mSatelltieModemState.set(state);
        mDatagramDispatcher.onSatelliteModemStateChanged(state);
        mDatagramReceiver.onSatelliteModemStateChanged(state);
    }
@@ -404,32 +401,35 @@ public class DatagramController {
     * before transferring datagrams via satellite.
     */
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public boolean needsWaitingForSatelliteConnected(
    protected boolean needsWaitingForSatelliteConnected(
            @SatelliteManager.DatagramType int datagramType) {
        synchronized (mLock) {
        if (!SatelliteController.getInstance().isSatelliteAttachRequired()) {
            return false;
        }

        int satelliteModemState = mSatelltieModemState.get();
        plogd("needsWaitingForSatelliteConnected: datagramType=" + datagramType
                + " satelliteModemState=" + satelliteModemState);

        if (datagramType == DATAGRAM_TYPE_KEEP_ALIVE
                    && mSatelltieModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED) {
                && satelliteModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED) {
            return false;
        }
        boolean allowCheckMessageInNotConnected =
                mContext.getResources().getBoolean(
                        R.bool.config_satellite_allow_check_message_in_not_connected);
        if (datagramType == DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS
                    && mSatelltieModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED
                && satelliteModemState == SATELLITE_MODEM_STATE_NOT_CONNECTED
                && allowCheckMessageInNotConnected
                && mFeatureFlags.carrierRoamingNbIotNtn()) {
            return false;
        }
            if (mSatelltieModemState != SATELLITE_MODEM_STATE_CONNECTED
                    && mSatelltieModemState != SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING) {
        if (satelliteModemState != SATELLITE_MODEM_STATE_CONNECTED
                && satelliteModemState != SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING) {
            return true;
        }
        return false;
    }
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    protected boolean isSendingInIdleState() {
@@ -497,19 +497,18 @@ public class DatagramController {

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    protected long getDatagramWaitTimeForConnectedState(boolean isLastSosMessage) {
        synchronized (mLock) {
        long timeout = isLastSosMessage
                ? mDatagramWaitTimeForConnectedStateForLastMessage.get()
                : mDatagramWaitTimeForConnectedState.get();
        int satelliteModemState = mSatelltieModemState.get();
        logd("getDatagramWaitTimeForConnectedState: isLastSosMessage=" + isLastSosMessage
                    + ", timeout=" + timeout + ", modemState=" + mSatelltieModemState);
            if (mSatelltieModemState == SATELLITE_MODEM_STATE_OFF
                    || mSatelltieModemState == SATELLITE_MODEM_STATE_IDLE) {
                + ", timeout=" + timeout + ", modemState=" + satelliteModemState);
        if (satelliteModemState == SATELLITE_MODEM_STATE_OFF
                || satelliteModemState == SATELLITE_MODEM_STATE_IDLE) {
            return (timeout + mModemImageSwitchingDuration.get());
        }
        return timeout;
    }
    }

    /**
     * This API can be used by only CTS to timeout durations used by DatagramController module.
+18 −20
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Consumer;

@@ -102,6 +103,10 @@ public class DatagramDispatcher extends Handler {
    /** {@code true} if already sent an emergency datagram during a session */
    private AtomicBoolean mIsEmergencyCommunicationEstablished = new AtomicBoolean(false);
    private AtomicBoolean mSendingInProgress = new AtomicBoolean(false);
    private AtomicLong mWaitTimeForDatagramSendingResponse = new AtomicLong(0);
    private AtomicLong mWaitTimeForDatagramSendingForLastMessageResponse = new AtomicLong(0);
    @SatelliteManager.DatagramType
    private AtomicInteger mLastSendRequestDatagramType = new AtomicInteger(DATAGRAM_TYPE_UNKNOWN);

    private DatagramDispatcherHandlerRequest mSendSatelliteDatagramRequest = null;
    private final Object mLock = new Object();
@@ -112,7 +117,6 @@ public class DatagramDispatcher extends Handler {
    @GuardedBy("mLock")
    private final LinkedHashMap<Long, SendSatelliteDatagramArgument>
            mPendingEmergencyDatagramsMap = new LinkedHashMap<>();

    /**
     * Map key: datagramId, value: SendSatelliteDatagramArgument to retry sending non-emergency
     * datagrams.
@@ -120,7 +124,6 @@ public class DatagramDispatcher extends Handler {
    @GuardedBy("mLock")
    private final LinkedHashMap<Long, SendSatelliteDatagramArgument>
            mPendingNonEmergencyDatagramsMap = new LinkedHashMap<>();

    /**
     * Map key: messageId, value: {@link PendingRequest} which contains all the information to send
     * carrier roaming nb iot ntn SMS.
@@ -128,12 +131,6 @@ public class DatagramDispatcher extends Handler {
    @GuardedBy("mLock")
    private final LinkedHashMap<Long, PendingRequest> mPendingSmsMap = new LinkedHashMap<>();

    private long mWaitTimeForDatagramSendingResponse;
    private long mWaitTimeForDatagramSendingForLastMessageResponse;
    @SatelliteManager.DatagramType
    private int mLastSendRequestDatagramType = DATAGRAM_TYPE_UNKNOWN;


    @GuardedBy("mLock")
    private int mModemState = SATELLITE_MODEM_STATE_UNKNOWN;
    @GuardedBy("mLock")
@@ -194,9 +191,9 @@ public class DatagramDispatcher extends Handler {
        mPersistentLogger = SatelliteServiceUtils.getPersistentLogger(context);

        mSendingInProgress.set(false);
        mWaitTimeForDatagramSendingResponse = getWaitForDatagramSendingResponseTimeoutMillis();
        mWaitTimeForDatagramSendingForLastMessageResponse =
                getWaitForDatagramSendingResponseForLastMessageTimeoutMillis();
        mWaitTimeForDatagramSendingResponse.set(getWaitForDatagramSendingResponseTimeoutMillis());
        mWaitTimeForDatagramSendingForLastMessageResponse.set(
                getWaitForDatagramSendingResponseForLastMessageTimeoutMillis());
    }

    private static final class DatagramDispatcherHandlerRequest {
@@ -464,7 +461,7 @@ public class DatagramDispatcher extends Handler {
        SendSatelliteDatagramArgument datagramArgs =
                new SendSatelliteDatagramArgument(subId, datagramId, datagramType, datagram,
                        needFullScreenPointingUI, callback);
        mLastSendRequestDatagramType = datagramType;
        mLastSendRequestDatagramType.set(datagramType);

        synchronized (mLock) {
            // Add datagram to pending datagram map
@@ -866,12 +863,12 @@ public class DatagramDispatcher extends Handler {
        int subId = SatelliteController.getInstance().getSelectedSatelliteSubId();
        if (getPendingMessagesCount() > 0) {
            mDatagramController.updateSendStatus(subId,
                    mLastSendRequestDatagramType,
                    mLastSendRequestDatagramType.get(),
                    SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED,
                    getPendingMessagesCount(), SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED);
        }
        mDatagramController.updateSendStatus(subId,
                mLastSendRequestDatagramType,
                mLastSendRequestDatagramType.get(),
                SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE,
                0, SatelliteManager.SATELLITE_RESULT_SUCCESS);
        abortSendingPendingDatagrams(subId,
@@ -884,7 +881,7 @@ public class DatagramDispatcher extends Handler {
        mIsDemoMode.set(false);
        mSendSatelliteDatagramRequest = null;
        mIsAligned.set(false);
        mLastSendRequestDatagramType = DATAGRAM_TYPE_UNKNOWN;
        mLastSendRequestDatagramType.set(DATAGRAM_TYPE_UNKNOWN);
        mModemState = SATELLITE_MODEM_STATE_UNKNOWN;
        mHasEnteredConnectedState = false;
        mShouldPollMtSms = false;
@@ -924,9 +921,10 @@ public class DatagramDispatcher extends Handler {
     */
    void setWaitTimeForDatagramSendingResponse(boolean reset, long timeoutMillis) {
        if (reset) {
            mWaitTimeForDatagramSendingResponse = getWaitForDatagramSendingResponseTimeoutMillis();
            mWaitTimeForDatagramSendingResponse.set(
                    getWaitForDatagramSendingResponseTimeoutMillis());
        } else {
            mWaitTimeForDatagramSendingResponse = timeoutMillis;
            mWaitTimeForDatagramSendingResponse.set(timeoutMillis);
        }
    }

@@ -937,8 +935,8 @@ public class DatagramDispatcher extends Handler {
            return;
        }
        long waitTime = SatelliteServiceUtils.isLastSosMessage(argument.datagramType)
                ? mWaitTimeForDatagramSendingForLastMessageResponse
                : mWaitTimeForDatagramSendingResponse;
                ? mWaitTimeForDatagramSendingForLastMessageResponse.get()
                : mWaitTimeForDatagramSendingResponse.get();
        logd("startWaitForDatagramSendingResponseTimer: datagramType=" + argument.datagramType
                + ", waitTime=" + waitTime);
        sendMessageDelayed(obtainMessage(
@@ -1149,7 +1147,7 @@ public class DatagramDispatcher extends Handler {
            mPendingSmsMap.put(messageId, pendingSms);
            int datagramType = pendingSms.isMtSmsPolling ?
                    DATAGRAM_TYPE_CHECK_PENDING_INCOMING_SMS : DATAGRAM_TYPE_SMS;
            mLastSendRequestDatagramType = datagramType;
            mLastSendRequestDatagramType.set(datagramType);

            if (mDatagramController.needsWaitingForSatelliteConnected(datagramType)) {
                plogd("sendSms: wait for satellite connected");
+81 −2
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import android.util.Pair;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.SomeArgs;
import com.android.internal.telephony.IIntegerConsumer;
import com.android.internal.telephony.IVoidConsumer;
import com.android.internal.telephony.Phone;
@@ -73,6 +74,9 @@ public class DatagramReceiver extends Handler {
    private static final int EVENT_POLL_PENDING_SATELLITE_DATAGRAMS_DONE = 2;
    private static final int EVENT_WAIT_FOR_DEVICE_ALIGNMENT_IN_DEMO_MODE_TIMED_OUT = 3;
    private static final int EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT = 4;
    private static final int REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS = 5;
    private static final int EVENT_SATELLITE_MODEM_STATE_CHANGED = 6;
    private static final int REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE = 7;

    /** Key used to read/write satellite datagramId in shared preferences. */
    private static final String SATELLITE_DATAGRAM_ID_KEY = "satellite_datagram_id_key";
@@ -498,6 +502,43 @@ public class DatagramReceiver extends Handler {
                handleEventDatagramWaitForConnectedStateTimedOut();
                break;

            case REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS: {
                plogd("REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS");
                SomeArgs args = (SomeArgs) msg.obj;
                int subId = (int) args.arg1;
                Consumer<Integer> callback = (Consumer<Integer>) args.arg2;
                try {
                    handleRequestPollPendingSatelliteDatagrams(subId, callback);
                } finally {
                    args.recycle();
                }
                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;
            }

            case REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE: {
                plogd("REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE");
                SomeArgs args = (SomeArgs) msg.obj;
                boolean isAligned = (boolean) args.arg1;
                try {
                    handleRequestSetDeviceAlignedWithSatellite(isAligned);
                } finally {
                    args.recycle();
                }
                break;
            }

            default:
                plogw("DatagramDispatcherHandler: unexpected message code: " + msg.what);
                break;
@@ -570,6 +611,20 @@ public class DatagramReceiver extends Handler {
     * @param callback The callback to get {@link SatelliteManager.SatelliteResult} of the request.
     */
    public void pollPendingSatelliteDatagrams(int subId, @NonNull Consumer<Integer> callback) {
        if (mFeatureFlags.satelliteImproveMultiThreadDesign()) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = subId;
            args.arg2 = callback;
            sendMessage(obtainMessage(REQUEST_POLL_PENDING_SATELLITE_DATAGRAMS, args));
            return;
        }

        handleRequestPollPendingSatelliteDatagrams(subId, callback);
    }

    private void handleRequestPollPendingSatelliteDatagrams(int subId,
            @NonNull Consumer<Integer> callback) {
        plogd("handleRequestPollPendingSatelliteDatagrams");
        if (!mDatagramController.isPollingInIdleState()) {
            // Poll request should be sent to satellite modem only when it is free.
            plogd("pollPendingSatelliteDatagrams: satellite modem is busy receiving datagrams.");
@@ -658,6 +713,19 @@ public class DatagramReceiver 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) {
            if (state == SatelliteManager.SATELLITE_MODEM_STATE_OFF
                    || state == SatelliteManager.SATELLITE_MODEM_STATE_UNAVAILABLE) {
@@ -775,7 +843,18 @@ public class DatagramReceiver extends Handler {
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
    public void setDeviceAlignedWithSatellite(boolean isAligned) {
    protected void setDeviceAlignedWithSatellite(boolean isAligned) {
        if (mFeatureFlags.satelliteImproveMultiThreadDesign()) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = isAligned;
            sendMessage(obtainMessage(REQUEST_SET_DEVICE_ALIGNED_WITH_SATELLITE, args));
            return;
        }

        handleRequestSetDeviceAlignedWithSatellite(isAligned);
    }

    private void handleRequestSetDeviceAlignedWithSatellite(boolean isAligned) {
        synchronized (mLock) {
            mIsAligned.set(isAligned);
            plogd("setDeviceAlignedWithSatellite: " + isAligned);
@@ -849,7 +928,7 @@ public class DatagramReceiver extends Handler {
    }

    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    public boolean isDatagramWaitForConnectedStateTimerStarted() {
    protected boolean isDatagramWaitForConnectedStateTimerStarted() {
        return hasMessages(EVENT_DATAGRAM_WAIT_FOR_CONNECTED_STATE_TIMED_OUT);
    }

+57 −1
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import android.util.Log;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.SomeArgs;
import com.android.internal.telephony.flags.FeatureFlags;

import java.util.ArrayList;
@@ -58,11 +59,14 @@ import java.util.function.Consumer;
/**
 * PointingApp controller to manage interactions with PointingUI app.
 */
public class PointingAppController {
public class PointingAppController extends Handler {
    private static final String TAG = "PointingAppController";
    private static final String ALLOW_MOCK_MODEM_PROPERTY = "persist.radio.allow_mock_modem";
    private static final boolean DEBUG = !"user".equals(Build.TYPE);

    private static final int REQUEST_START_POINTING_UI = 1;
    private static final int REQUEST_REMOVE_LISTENER_FOR_POINTING_UI = 2;

    @NonNull
    private static PointingAppController sInstance;
    @NonNull private final Context mContext;
@@ -125,6 +129,34 @@ public class PointingAppController {
        mPersistentLogger = SatelliteServiceUtils.getPersistentLogger(context);
    }

    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case REQUEST_START_POINTING_UI: {
                plogd("REQUEST_START_POINTING_UI");
                SomeArgs args = (SomeArgs) msg.obj;
                boolean needFullScreenPointingUI = (boolean) args.arg1;
                boolean isDemoMode = (boolean) args.arg2;
                boolean isEmergency = (boolean) args.arg3;
                try {
                    handleRequestStartPointingUI(needFullScreenPointingUI, isDemoMode, isEmergency);
                } finally {
                    args.recycle();
                }
                break;
            }

            case REQUEST_REMOVE_LISTENER_FOR_POINTING_UI: {
                handleRequestRemoveListenerForPointingUI();
                break;
            }

            default:
                ploge("PointingAppControllerHandler: unexpected message code: " + msg.what);
                break;
        }
    }

    /**
     * Set the flag mStartedSatelliteTransmissionUpdates to true or false based on the state of
     * transmission updates
@@ -390,6 +422,20 @@ public class PointingAppController {
     */
    public void startPointingUI(boolean needFullScreenPointingUI, boolean isDemoMode,
            boolean isEmergency) {
        if (mFeatureFlags.satelliteImproveMultiThreadDesign()) {
            SomeArgs args = SomeArgs.obtain();
            args.arg1 = needFullScreenPointingUI;
            args.arg2 = isDemoMode;
            args.arg3 = isEmergency;
            sendMessage(obtainMessage(REQUEST_START_POINTING_UI, args));
            return;
        }

        handleRequestStartPointingUI(needFullScreenPointingUI, isDemoMode, isEmergency);
    }

    private void handleRequestStartPointingUI(boolean needFullScreenPointingUI, boolean isDemoMode,
            boolean isEmergency) {
        String packageName = getPointingUiPackageName();
        if (TextUtils.isEmpty(packageName)) {
            plogd("startPointingUI: config_pointing_ui_package is not set. Ignore the request");
@@ -437,6 +483,16 @@ public class PointingAppController {
     * Remove the Importance Listener For Pointing UI App once the satellite is disabled
     */
    public void removeListenerForPointingUI() {
        if (mFeatureFlags.satelliteImproveMultiThreadDesign()) {
            sendMessage(obtainMessage(REQUEST_REMOVE_LISTENER_FOR_POINTING_UI));
            return;
        }

        handleRequestRemoveListenerForPointingUI();
    }

    private void handleRequestRemoveListenerForPointingUI() {
        plogd("handleRequestRemoveListenerForPointingUI");
        synchronized (mListenerForPointingUIRegisteredLock) {
            if (mListenerForPointingUIRegistered) {
                mActivityManager.removeOnUidImportanceListener(mUidImportanceListener);
Loading