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

Commit f1282e17 authored by Aishwarya Mallampati's avatar Aishwarya Mallampati
Browse files

Unregister broadcast receiver before registering it again.

Fix NPE in RilMessageDecoder

Bug: 332194889
Test: atest SatelliteManagerTestOnMockService
Manual Testing: Flashed build on panther and made voice calls, sms, mms

Change-Id: I0b2b78232337b7ba7da620e79c0a5fdc01fd391e
parent bac19195
Loading
Loading
Loading
Loading
+40 −19
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.os.Message;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.telephony.uicc.IccFileHandler;
import com.android.internal.telephony.uicc.IccUtils;
import com.android.internal.util.State;
@@ -40,11 +41,14 @@ public class RilMessageDecoder extends StateMachine {
    private static final int CMD_START = 1;
    private static final int CMD_PARAMS_READY = 2;

    private final Object mLock = new Object();
    // members
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    @GuardedBy("mLock")
    private CommandParamsFactory mCmdParamsFactory = null;
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    private RilMessage mCurrentRilMessage = null;
    @GuardedBy("mLock")
    private Handler mCaller = null;
    private static int mSimCount = 0;
    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
@@ -113,10 +117,14 @@ public class RilMessageDecoder extends StateMachine {

    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
    private void sendCmdForExecution(RilMessage rilMsg) {
        synchronized (mLock) {
            if (mCaller != null) {
                Message msg = mCaller.obtainMessage(CatService.MSG_ID_RIL_MSG_DECODED,
                        new RilMessage(rilMsg));
                msg.sendToTarget();
            }
        }
    }

    private RilMessageDecoder(Handler caller, IccFileHandler fh, Context context) {
        super("RilMessageDecoder");
@@ -125,9 +133,11 @@ public class RilMessageDecoder extends StateMachine {
        addState(mStateCmdParamsReady);
        setInitialState(mStateStart);

        synchronized (mLock) {
            mCaller = caller;
            mCmdParamsFactory = CommandParamsFactory.getInstance(this, fh, context);
        }
    }

    private RilMessageDecoder() {
        super("RilMessageDecoder");
@@ -166,7 +176,7 @@ public class RilMessageDecoder extends StateMachine {
    }

    private boolean decodeMessageParams(RilMessage rilMsg) {
        boolean decodingStarted;
        boolean decodingStarted = false;

        mCurrentRilMessage = rilMsg;
        switch(rilMsg.mId) {
@@ -188,6 +198,9 @@ public class RilMessageDecoder extends StateMachine {
                decodingStarted = false;
                break;
            }

            synchronized (mLock) {
                if (mCmdParamsFactory != null) {
                    try {
                        // Start asynch parsing of the command parameters.
                        mCmdParamsFactory.make(BerTlv.decode(rawData));
@@ -199,6 +212,8 @@ public class RilMessageDecoder extends StateMachine {
                        sendCmdForExecution(mCurrentRilMessage);
                        decodingStarted = false;
                    }
                }
            }
            break;
        default:
            decodingStarted = false;
@@ -211,10 +226,16 @@ public class RilMessageDecoder extends StateMachine {
        quitNow();
        mStateStart = null;
        mStateCmdParamsReady = null;

        synchronized (mLock) {
            if (mCmdParamsFactory != null) {
                mCmdParamsFactory.dispose();
                mCmdParamsFactory = null;
        mCurrentRilMessage = null;
            }
            mCaller = null;
        }

        mCurrentRilMessage = null;
        mInstance = null;
    }
}
+15 −4
Original line number Diff line number Diff line
@@ -394,6 +394,8 @@ public class SatelliteController extends Handler {
    private static final String NOTIFICATION_CHANNEL_ID = "satellite";

    private final RegistrantList mSatelliteConfigUpdateChangedRegistrants = new RegistrantList();
    private final BTWifiNFCStateReceiver mBTWifiNFCSateReceiver;
    private final UwbAdapterStateCallback mUwbAdapterStateCallback;

    /**
     * @return The singleton instance of SatelliteController.
@@ -463,6 +465,8 @@ public class SatelliteController extends Handler {
        mContentResolver = mContext.getContentResolver();
        mCarrierConfigManager = mContext.getSystemService(CarrierConfigManager.class);

        mBTWifiNFCSateReceiver = new BTWifiNFCStateReceiver();
        mUwbAdapterStateCallback = new UwbAdapterStateCallback();
        initializeSatelliteModeRadios();

        ContentObserver satelliteModeRadiosContentObserver = new ContentObserver(this) {
@@ -545,8 +549,6 @@ public class SatelliteController extends Handler {
    @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
    protected void initializeSatelliteModeRadios() {
        if (mContentResolver != null) {
            BTWifiNFCStateReceiver bTWifiNFCSateReceiver = new BTWifiNFCStateReceiver();
            UwbAdapterStateCallback uwbAdapterStateCallback = new UwbAdapterStateCallback();
            IntentFilter radioStateIntentFilter = new IntentFilter();

            synchronized (mRadioStateLock) {
@@ -600,7 +602,14 @@ public class SatelliteController extends Handler {
                        radioStateIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
                    }
                }
                mContext.registerReceiver(bTWifiNFCSateReceiver, radioStateIntentFilter);

                try {
                    // Unregister receiver before registering it.
                    mContext.unregisterReceiver(mBTWifiNFCSateReceiver);
                } catch (IllegalArgumentException e) {
                    logd("initializeSatelliteModeRadios: unregisterReceiver, e=" + e);
                }
                mContext.registerReceiver(mBTWifiNFCSateReceiver, radioStateIntentFilter);

                if (satelliteModeRadios.contains(Settings.Global.RADIO_UWB)) {
                    UwbManager uwbManager = mContext.getSystemService(UwbManager.class);
@@ -609,8 +618,10 @@ public class SatelliteController extends Handler {
                        mUwbStateEnabled = uwbManager.isUwbEnabled();
                        final long identity = Binder.clearCallingIdentity();
                        try {
                            // Unregister callback before registering it.
                            uwbManager.unregisterAdapterStateCallback(mUwbAdapterStateCallback);
                            uwbManager.registerAdapterStateCallback(mContext.getMainExecutor(),
                                    uwbAdapterStateCallback);
                                    mUwbAdapterStateCallback);
                        } finally {
                            Binder.restoreCallingIdentity(identity);
                        }