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

Commit 28eb337c authored by Amit Mahajan's avatar Amit Mahajan
Browse files

Fix GsmCdmaPhone.getIccCard() to never return null.

Test: Basic telephony sanity
Bug: 72565340
Change-Id: I1e5a5d0c5cbfca9658cb196463dfe0809ca0e89c
parent 4ce44fde
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -382,10 +382,6 @@ public class IccCardProxy extends Handler implements IccCard {
    }

    private void registerUiccCardEvents() {
        if (mUiccSlot != null) {
            // todo: reregistration is not needed unless slot mapping changes
            mUiccSlot.registerForAbsent(this, EVENT_ICC_ABSENT, null);
        }
        if (mUiccApplication != null) {
            mUiccApplication.registerForReady(this, EVENT_APP_READY, null);
        }
@@ -399,7 +395,6 @@ public class IccCardProxy extends Handler implements IccCard {
    }

    private void unregisterUiccCardEvents() {
        if (mUiccSlot != null) mUiccSlot.unregisterForAbsent(this);
        if (mUiccCard != null) mUiccCard.unregisterForCarrierPrivilegeRulesLoaded(this);
        if (mUiccApplication != null) {
            mUiccApplication.unregisterForReady(this);
+3 −39
Original line number Diff line number Diff line
@@ -26,8 +26,6 @@ import android.content.res.Resources;
import android.os.Handler;
import android.os.Message;
import android.os.PowerManager;
import android.os.Registrant;
import android.os.RegistrantList;
import android.telephony.Rlog;
import android.util.LocalLog;
import android.view.WindowManager;
@@ -62,9 +60,6 @@ public class UiccSlot extends Handler {
    private String mIccId;
    private Integer mPhoneId = null;

    // todo: remove if this is not needed
    private RegistrantList mAbsentRegistrants = new RegistrantList();

    private static final int EVENT_CARD_REMOVED = 13;
    private static final int EVENT_CARD_ADDED = 14;

@@ -98,7 +93,6 @@ public class UiccSlot extends Handler {
                // No notifications while radio is off or we just powering up
                if (radioState == RadioState.RADIO_ON && mLastRadioState == RadioState.RADIO_ON) {
                    if (DBG) log("update: notify card removed");
                    mAbsentRegistrants.notifyRegistrants();
                    sendMessage(obtainMessage(EVENT_CARD_REMOVED, null));
                }

@@ -147,11 +141,10 @@ public class UiccSlot extends Handler {
            if (iss.slotState == IccSlotStatus.SlotState.SLOTSTATE_INACTIVE) {
                if (mActive) {
                    mActive = false;
                    // treat as radio state unavailable
                    onRadioStateUnavailable();
                    // set mPhoneId to null only after sim state changed broadcast is sent as it
                    // needs the phoneId. The broadcast is sent from onRadioStateUnavailable()
                    mLastRadioState = RadioState.RADIO_UNAVAILABLE;
                    mPhoneId = null;
                    if (mUiccCard != null) mUiccCard.dispose();
                    mUiccCard = null;
                }
                parseAtr(iss.atr);
                mCardState = iss.cardState;
@@ -321,30 +314,6 @@ public class UiccSlot extends Handler {
        mLastRadioState = RadioState.RADIO_UNAVAILABLE;
    }

    /**
     * Notifies handler of any transition into State.ABSENT
     */
    public void registerForAbsent(Handler h, int what, Object obj) {
        synchronized (mLock) {
            Registrant r = new Registrant(h, what, obj);

            mAbsentRegistrants.add(r);

            if (mCardState == CardState.CARDSTATE_ABSENT) {
                r.notifyRegistrant();
            }
        }
    }

    /**
     * Unregister a handler for card absent notification
     */
    public void unregisterForAbsent(Handler h) {
        synchronized (mLock) {
            mAbsentRegistrants.remove(h);
        }
    }

    private void log(String msg) {
        Rlog.d(TAG, msg);
    }
@@ -365,11 +334,6 @@ public class UiccSlot extends Handler {
        pw.println(" mCi=" + mCi);
        pw.println(" mActive=" + mActive);
        pw.println(" mLastRadioState=" + mLastRadioState);
        pw.println(" mAbsentRegistrants: size=" + mAbsentRegistrants.size());
        for (int i = 0; i < mAbsentRegistrants.size(); i++) {
            pw.println("  mAbsentRegistrants[" + i + "]="
                    + ((Registrant) mAbsentRegistrants.get(i)).getHandler());
        }
        pw.println(" mCardState=" + mCardState);
        if (mUiccCard != null) {
            pw.println(" mUiccCard=" + mUiccCard);
+0 −34
Original line number Diff line number Diff line
@@ -15,14 +15,10 @@
 */
package com.android.internal.telephony.uicc;

import static com.android.internal.telephony.TelephonyTestUtils.waitForMs;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.verify;

import android.os.Handler;
import android.os.HandlerThread;
@@ -34,7 +30,6 @@ import com.android.internal.telephony.TelephonyTest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;

public class UiccSlotTest extends TelephonyTest {
@@ -98,35 +93,6 @@ public class UiccSlotTest extends TelephonyTest {
        super.tearDown();
    }


    @Test @SmallTest
    public void testCardAbsentListener() {
        mUiccSlot.registerForAbsent(mMockedHandler, UICCCARD_ABSENT, null);
        /* assume hotswap capable, avoid bootup on card removal */
        mContextFixture.putBooleanResource(com.android.internal.R.bool.config_hotswapCapable, true);
        mSimulatedCommands.setRadioPower(true, null);

        /* Mock Card State transition from card_present to card_absent */
        logd("UICC Card Present update");
        mIccCardStatus.mCardState = IccCardStatus.CardState.CARDSTATE_PRESENT;
        // mUiccSlot.update() needs to be called from the handler thread because it creates UiccCard
        Message mCardUpdate = mTestHandler.obtainMessage(UICCCARD_UPDATE_CARD_STATE_EVENT);
        setReady(false);
        mCardUpdate.sendToTarget();
        waitUntilReady();

        logd("UICC Card absent update");
        mIccCardStatus.mCardState = IccCardStatus.CardState.CARDSTATE_ABSENT;
        mUiccSlot.update(mSimulatedCommands, mIccCardStatus, 0 /* phoneId */);
        waitForMs(50);

        ArgumentCaptor<Message> mCaptorMessage = ArgumentCaptor.forClass(Message.class);
        ArgumentCaptor<Long> mCaptorLong = ArgumentCaptor.forClass(Long.class);
        verify(mMockedHandler, atLeast(1)).sendMessageDelayed(mCaptorMessage.capture(),
                mCaptorLong.capture());
        assertEquals(UICCCARD_ABSENT, mCaptorMessage.getValue().what);
    }

    @Test
    @SmallTest
    public void testUpdateSlotStatus() {