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

Commit 781905d9 authored by Pavel Zhamaitsiak's avatar Pavel Zhamaitsiak Committed by android-build-merger
Browse files

Fix race condition which caused extra ImsPhone object to be created.

automerge: 6cc5ac49

* commit '6cc5ac49':
  Fix race condition which caused extra ImsPhone object to be created.
parents 288268d5 6cc5ac49
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1904,6 +1904,11 @@ public interface Phone {
     */
    public Phone getImsPhone();

    /**
     * Start listening for IMS service UP/DOWN events.
     */
    public void startMonitoringImsService();

    /**
     * Release the local instance of the ImsPhone and disconnect from
     * the phone.
+56 −41
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ import java.util.concurrent.atomic.AtomicReference;
public abstract class PhoneBase extends Handler implements Phone {
    private static final String LOG_TAG = "PhoneBase";

    private boolean mImsIntentReceiverRegistered = false;
    private BroadcastReceiver mImsIntentReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
@@ -101,6 +102,7 @@ public abstract class PhoneBase extends Handler implements Phone {
                }
            }

            synchronized (PhoneProxy.lockForRadioTechnologyChange) {
                if (intent.getAction().equals(ImsManager.ACTION_IMS_SERVICE_UP)) {
                    mImsServiceReady = true;
                    updateImsPhone();
@@ -109,6 +111,7 @@ public abstract class PhoneBase extends Handler implements Phone {
                    updateImsPhone();
                }
            }
        }
    };

    // Key used to read and write the saved network selection numeric value
@@ -223,7 +226,6 @@ public abstract class PhoneBase extends Handler implements Phone {

    protected int mPhoneId;

    private final Object mImsLock = new Object();
    private boolean mImsServiceReady = false;
    protected ImsPhone mImsPhone = null;

@@ -434,6 +436,19 @@ public abstract class PhoneBase extends Handler implements Phone {
        mUiccController = UiccController.getInstance();
        mUiccController.registerForIccChanged(this, EVENT_ICC_CHANGED, null);

        mCi.registerForSrvccStateChanged(this, EVENT_SRVCC_STATE_CHANGED, null);
        mCi.setOnUnsolOemHookRaw(this, EVENT_UNSOL_OEM_HOOK_RAW, null);
    }

    @Override
    public void startMonitoringImsService() {
        synchronized(PhoneProxy.lockForRadioTechnologyChange) {
            IntentFilter filter = new IntentFilter();
            filter.addAction(ImsManager.ACTION_IMS_SERVICE_UP);
            filter.addAction(ImsManager.ACTION_IMS_SERVICE_DOWN);
            mContext.registerReceiver(mImsIntentReceiver, filter);
            mImsIntentReceiverRegistered = true;

            // Monitor IMS service - but first poll to see if already up (could miss
            // intent)
            ImsManager imsManager = ImsManager.getInstance(mContext, getPhoneId());
@@ -441,19 +456,16 @@ public abstract class PhoneBase extends Handler implements Phone {
                mImsServiceReady = true;
                updateImsPhone();
            }
        IntentFilter filter = new IntentFilter();
        filter.addAction(ImsManager.ACTION_IMS_SERVICE_UP);
        filter.addAction(ImsManager.ACTION_IMS_SERVICE_DOWN);
        mContext.registerReceiver(mImsIntentReceiver, filter);

        mCi.registerForSrvccStateChanged(this, EVENT_SRVCC_STATE_CHANGED, null);
        mCi.setOnUnsolOemHookRaw(this, EVENT_UNSOL_OEM_HOOK_RAW, null);
        }
    }

    @Override
    public void dispose() {
        synchronized(PhoneProxy.lockForRadioTechnologyChange) {
            if (mImsIntentReceiverRegistered) {
                mContext.unregisterReceiver(mImsIntentReceiver);
                mImsIntentReceiverRegistered = false;
            }
            mCi.unSetOnCallRing(this);
            // Must cleanup all connectionS and needs to use sendMessage!
            mDcTracker.cleanUpAllConnections(null);
@@ -1969,10 +1981,15 @@ public abstract class PhoneBase extends Handler implements Phone {

    @Override
    public ImsPhone relinquishOwnershipOfImsPhone() {
        synchronized (mImsLock) {
        synchronized (PhoneProxy.lockForRadioTechnologyChange) {
            if (mImsPhone == null)
                return null;

            if (mImsIntentReceiverRegistered) {
                mContext.unregisterReceiver(mImsIntentReceiver);
                mImsIntentReceiverRegistered = false;
            }

            ImsPhone imsPhone = mImsPhone;
            mImsPhone = null;

@@ -1985,7 +2002,7 @@ public abstract class PhoneBase extends Handler implements Phone {

    @Override
    public void acquireOwnershipOfImsPhone(ImsPhone imsPhone) {
        synchronized (mImsLock) {
        synchronized (PhoneProxy.lockForRadioTechnologyChange) {
            if (imsPhone == null)
                return;

@@ -2010,7 +2027,6 @@ public abstract class PhoneBase extends Handler implements Phone {
    }

    protected void updateImsPhone() {
        synchronized (mImsLock) {
        Rlog.d(LOG_TAG, "updateImsPhone"
                + " mImsServiceReady=" + mImsServiceReady);

@@ -2031,7 +2047,6 @@ public abstract class PhoneBase extends Handler implements Phone {
            mImsPhone = null;
        }
    }
    }

    /**
     * Dials a number.
+2 −0
Original line number Diff line number Diff line
@@ -151,9 +151,11 @@ public class PhoneFactory {
                    if (phoneType == PhoneConstants.PHONE_TYPE_GSM) {
                        phone = new GSMPhone(context,
                                sCommandsInterfaces[i], sPhoneNotifier, i);
                        phone.startMonitoringImsService();
                    } else if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) {
                        phone = new CDMALTEPhone(context,
                                sCommandsInterfaces[i], sPhoneNotifier, i);
                        phone.startMonitoringImsService();
                    }
                    Rlog.i(LOG_TAG, "Creating Phone with type = " + phoneType + " sub = " + i);

+4 −2
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@ import com.android.internal.telephony.gsm.GSMPhone;
import com.android.internal.telephony.imsphone.ImsPhone;
import com.android.internal.telephony.test.SimulatedRadioControl;
import com.android.internal.telephony.cdma.CDMALTEPhone;
import com.android.internal.telephony.RadioCapability;
import com.android.internal.telephony.uicc.IccCardProxy;
import com.android.internal.telephony.uicc.IccFileHandler;
import com.android.internal.telephony.uicc.IsimRecords;
@@ -50,7 +49,6 @@ import com.android.internal.telephony.uicc.UsimServiceTable;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.List;
import java.util.Set;

import com.android.internal.telephony.dataconnection.DctController;

@@ -301,6 +299,7 @@ public class PhoneProxy extends Handler implements Phone {
            if (imsPhone != null) {
                mActivePhone.acquireOwnershipOfImsPhone(imsPhone);
            }
            mActivePhone.startMonitoringImsService();
            mActivePhone.registerForSimRecordsLoaded(this, EVENT_SIM_RECORDS_LOADED, null);
        }

@@ -1459,6 +1458,9 @@ public class PhoneProxy extends Handler implements Phone {
    @Override
    public ImsPhone relinquishOwnershipOfImsPhone() { return null; }

    @Override
    public void startMonitoringImsService() {}

    @Override
    public void acquireOwnershipOfImsPhone(ImsPhone imsPhone) { }