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

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

Snap for 13310998 from ceb9a695 to 25Q3-release

Change-Id: Ic3a25be6f96cf7d173e1cb10ed55b23ba6242474
parents 6f2fda9b ceb9a695
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -140,6 +140,8 @@ public class ImsResolver implements ImsServiceController.ImsServiceControllerCal
    // Delay between dynamic ImsService queries.
    private static final int DELAY_DYNAMIC_QUERY_MS = 5000;

    // Compile-time debug flag for controlling worker thread behavior
    private static final boolean USE_WORKER_THREAD = false;
    private static HandlerThread sHandlerThread;

    private static ImsResolver sInstance;
@@ -151,7 +153,7 @@ public class ImsResolver implements ImsServiceController.ImsServiceControllerCal
            String defaultRcsPackageName, int numSlots, ImsFeatureBinderRepository repo,
            FeatureFlags featureFlags) {
        if (sInstance == null) {
            if (featureFlags.threadShred()) {
            if (featureFlags.threadShred() && USE_WORKER_THREAD) {
                sInstance = new ImsResolver(context, defaultMmTelPackageName, defaultRcsPackageName,
                        numSlots, repo, WorkerThread.get().getLooper(), featureFlags);
            } else {
+5 −1
Original line number Diff line number Diff line
@@ -266,7 +266,11 @@ public class ImsServiceController {
    // Enable ImsServiceControllerTest and SipDelegateManagerTest cases if this is re-enabled.
    private static final boolean ENFORCE_SINGLE_SERVICE_FOR_SIP_TRANSPORT = false;
    private final ComponentName mComponentName;

    // Compile-time debug flag for controlling worker thread behavior
    private static final boolean USE_WORKER_THREAD = false;
    private final HandlerThread mHandlerThread;

    private final Handler mHandler;
    private final LegacyPermissionManager mPermissionManager;
    private final FeatureFlags mFeatureFlags;
@@ -365,7 +369,7 @@ public class ImsServiceController {
        mComponentName = componentName;
        mCallbacks = callbacks;
        Looper looper;
        if (featureFlags.threadShred()) {
        if (featureFlags.threadShred() && USE_WORKER_THREAD) {
            mHandlerThread = null;
            mHandler = new Handler(WorkerThread.get().getLooper());
            looper = WorkerThread.get().getLooper();
+7 −1
Original line number Diff line number Diff line
@@ -159,6 +159,12 @@ public class SubscriptionManagerService extends ISub.Stub {
    private static final int CHECK_BOOTSTRAP_TIMER_IN_MS = 20 * 60 * 1000; // 20 minutes
    private static CountDownTimer bootstrapProvisioningTimer;

    /** Whether enabling verbose debugging message or not. */
    private static final boolean VDBG = false;

    // Compile-time debug flag for controlling worker thread behavior
    private static final boolean USE_WORKER_THREAD = false;

    /**
     * The columns in {@link SimInfo} table that can be directly accessed through
     * {@link #getSubscriptionProperty(int, String, String, String)} or
@@ -572,7 +578,7 @@ public class SubscriptionManagerService extends ISub.Stub {

        Looper dbLooper = null;

        if (mFeatureFlags.threadShred()) {
        if (mFeatureFlags.threadShred() && SubscriptionManagerService.USE_WORKER_THREAD) {
            dbLooper = WorkerThread.get().getLooper();
        } else {
            // Create a separate thread for subscription database manager.
+33 −31
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.platform.test.flag.junit.SetFlagsRule;
@@ -41,9 +42,10 @@ import android.telephony.IccOpenLogicalChannelResponse;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;

import androidx.test.InstrumentationRegistry;

import com.android.internal.telephony.CommandException;
import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.euicc.EuiccSession;
import com.android.internal.telephony.flags.Flags;
import com.android.internal.telephony.uicc.IccIoResult;
@@ -59,7 +61,7 @@ import org.mockito.Mockito;

@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class ApduSenderTest extends TelephonyTest {
public class ApduSenderTest {
    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();

    private static class ResponseCaptor extends ApduSenderResultCallback {
@@ -105,14 +107,13 @@ public class ApduSenderTest extends TelephonyTest {
    private ResponseCaptor mResponseCaptor;
    private byte[] mSelectResponse;
    private ApduSender mSender;
    private Context mContext;

    @Before
    public void setUp() throws Exception {
        super.setUp(getClass().getSimpleName());
    public void setUp() {
        mSetFlagsRule.enableFlags(Flags.FLAG_OPTIMIZATION_APDU_SENDER);
        mContextFixture.putBooleanResource(
                com.android.internal.R.bool.euicc_optimize_apdu_sender, true);

        mContext = InstrumentationRegistry.getContext();
        mMockCi = mock(CommandsInterface.class);
        mLooper = TestableLooper.get(this);
        mHandler = new Handler(mLooper.getLooper());
@@ -124,7 +125,7 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @After
    public void tearDown() throws Exception {
    public void tearDown() throws InterruptedException {
        // Send an APDU to verify that the channel lock is not stuck (b/382549728).
        // Sameas testSend(), but not verifying mMockCi interactions.
        checkChannelLock();
@@ -141,17 +142,17 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @Test
    public void testWrongAid_throwsIllegalArgumentException() throws Exception {
    public void testWrongAid_throwsIllegalArgumentException() {
        String wrongAid = "-1";

        assertThrows(IllegalArgumentException.class, () -> {
            new ApduSender(mContext, 0 /* phoneId= */,
            new ApduSender(InstrumentationRegistry.getContext(), 0 /* phoneId= */,
                            mMockCi, wrongAid, false /* supportExtendedApdu */);
        });
    }

    @Test
    public void testSendEmptyCommands() throws Exception {
    public void testSendEmptyCommands() throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "A1A1A19000");
        LogicalChannelMocker.mockCloseLogicalChannel(mMockCi, channel, /* error= */ null);

@@ -167,7 +168,7 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @Test
    public void testOpenChannelErrorStatus() throws Exception {
    public void testOpenChannelErrorStatus() throws InterruptedException {
        LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi,
                new CommandException(CommandException.Error.NO_SUCH_ELEMENT));

@@ -182,7 +183,7 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @Test
    public void testSend() throws Exception {
    public void testSend() throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        LogicalChannelMocker.mockSendToLogicalChannel(mMockCi, channel, "A1A1A19000");
        LogicalChannelMocker.mockCloseLogicalChannel(mMockCi, channel, /* error= */ null);
@@ -200,7 +201,7 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @Test
    public void testSendMultiApdus() throws Exception {
    public void testSendMultiApdus() throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        LogicalChannelMocker.mockSendToLogicalChannel(mMockCi, channel, "A19000", "A29000",
                "A39000", "A49000");
@@ -229,7 +230,7 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @Test
    public void testSendMultiApdusStopEarly() throws Exception {
    public void testSendMultiApdusStopEarly() throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        LogicalChannelMocker.mockSendToLogicalChannel(mMockCi, channel, "A19000", "A29000",
                "A39000", "A49000");
@@ -254,7 +255,7 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @Test
    public void testSendLongResponse() throws Exception {
    public void testSendLongResponse() throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        LogicalChannelMocker.mockSendToLogicalChannel(mMockCi, channel, "A1A1A16104",
                "B2B2B2B26102", "C3C39000");
@@ -274,7 +275,7 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @Test
    public void testSendStoreDataLongDataLongResponse() throws Exception {
    public void testSendStoreDataLongDataLongResponse() throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        LogicalChannelMocker.mockSendToLogicalChannel(mMockCi, channel, "A19000", "9000", "9000",
                "B22B6103", "B2222B9000", "C39000");
@@ -306,7 +307,7 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @Test
    public void testSendStoreDataLongDataMod0() throws Exception {
    public void testSendStoreDataLongDataMod0() throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        LogicalChannelMocker.mockSendToLogicalChannel(mMockCi, channel, "9000", "B2222B9000");
        LogicalChannelMocker.mockCloseLogicalChannel(mMockCi, channel, /* error= */ null);
@@ -328,7 +329,7 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @Test
    public void testSendStoreDataLen0() throws Exception {
    public void testSendStoreDataLen0() throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        LogicalChannelMocker.mockSendToLogicalChannel(mMockCi, channel, "B2222B9000");
        LogicalChannelMocker.mockCloseLogicalChannel(mMockCi, channel, /* error= */ null);
@@ -344,7 +345,7 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @Test
    public void testSendErrorResponseInMiddle() throws Exception {
    public void testSendErrorResponseInMiddle() throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        LogicalChannelMocker.mockSendToLogicalChannel(mMockCi, channel, "A19000", "9000",
                "B22B6103", "6985");
@@ -373,7 +374,7 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @Test
    public void testChannelAlreadyOpened() throws Exception {
    public void testChannelAlreadyOpened() throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        LogicalChannelMocker.mockCloseLogicalChannel(mMockCi, channel, /* error= */ null);

@@ -392,8 +393,7 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @Test
    public void testSend_OpenChannelFailedNoSuchElement_useChannelInSharedPreference()
            throws Exception {
    public void testSend_OpenChannelFailedNoSuchElement_useChannelInSharedPreference() {
        // Open a channel but not close, by making CI.iccTransmitApduLogicalChannel throw.
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        doThrow(new RuntimeException()).when(mMockCi).iccTransmitApduLogicalChannel(
@@ -402,7 +402,7 @@ public class ApduSenderTest extends TelephonyTest {
        mSender.send((selectResponse, requestBuilder) -> requestBuilder.addApdu(
                10, 1, 2, 3, 0, "a"), mResponseCaptor, mHandler);
        mLooper.processAllMessages();
        mSender = new ApduSender(mContext, PHONE_ID,
        mSender = new ApduSender(InstrumentationRegistry.getContext(), PHONE_ID,
                            mMockCi, ApduSender.ISD_R_AID, false /* supportExtendedApdu */);
        reset(mMockCi);
        // Stub open channel failure NO_SUCH_ELEMENT
@@ -426,7 +426,8 @@ public class ApduSenderTest extends TelephonyTest {
    }

    @Test
    public void testSend_euiccSession_shouldNotCloseChannel() throws Exception {
    public void testSend_euiccSession_shouldNotCloseChannel()
            throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        LogicalChannelMocker.mockSendToLogicalChannel(mMockCi, channel, "A1A1A19000");
        LogicalChannelMocker.mockCloseLogicalChannel(mMockCi, channel, /* error= */ null);
@@ -441,12 +442,13 @@ public class ApduSenderTest extends TelephonyTest {
        inOrder.verify(mMockCi).iccOpenLogicalChannel(eq(ApduSender.ISD_R_AID), anyInt(), any());
        inOrder.verify(mMockCi).iccTransmitApduLogicalChannel(eq(channel), eq(channel | 10),
                eq(1), eq(2), eq(3), eq(0), eq("a"), anyBoolean(), any());
        // No iccCloseLogicalChannel
        inOrder.verify(mMockCi).iccCloseLogicalChannel(eq(channel), eq(true /*isEs10*/), any());
        inOrder.verifyNoMoreInteractions();
    }

    @Test
    public void testSendTwice_euiccSession_shouldOpenChannelOnceNotCloseChannel() throws Exception {
    public void testSendTwice_euiccSession_shouldOpenChannelOnceNotCloseChannel()
            throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        LogicalChannelMocker.mockSendToLogicalChannel(
                    mMockCi, channel, "A1A1A19000", "A1A1A19000");
@@ -467,12 +469,12 @@ public class ApduSenderTest extends TelephonyTest {
        // iccTransmitApduLogicalChannel twice
        inOrder.verify(mMockCi, times(2)).iccTransmitApduLogicalChannel(eq(channel),
                 eq(channel | 10), eq(1), eq(2), eq(3), eq(0), eq("a"), anyBoolean(), any());
        // No iccCloseLogicalChannel
        inOrder.verify(mMockCi).iccCloseLogicalChannel(eq(channel), eq(true /*isEs10*/), any());
        inOrder.verifyNoMoreInteractions();
    }

    @Test
    public void testSendTwice_thenEndSession() throws Exception {
    public void testSendTwice_thenEndSession() throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        LogicalChannelMocker.mockSendToLogicalChannel(mMockCi, channel,
                "A1A1A19000", "A1A1A19000");
@@ -500,12 +502,12 @@ public class ApduSenderTest extends TelephonyTest {
    }

    private int getChannelIdFromSharedPreferences() {
        return PreferenceManager.getDefaultSharedPreferences(mContext)
        return PreferenceManager.getDefaultSharedPreferences(InstrumentationRegistry.getContext())
                .getInt(SHARED_PREFS_KEY_CHANNEL_ID, -1);
    }

    private void clearSharedPreferences() {
        PreferenceManager.getDefaultSharedPreferences(mContext)
        PreferenceManager.getDefaultSharedPreferences(InstrumentationRegistry.getContext())
                .edit()
                .remove(SHARED_PREFS_KEY_CHANNEL_ID)
                .remove(SHARED_PREFS_KEY_CHANNEL_RESPONSE)
@@ -516,7 +518,7 @@ public class ApduSenderTest extends TelephonyTest {
     * Send an APDU to verify that the channel lock is not stuck (b/382549728).
     * Same as testSend(), but not verifying mMockCi interactions.
     */
    private void checkChannelLock() throws Exception {
    private void checkChannelLock() throws InterruptedException {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi, "9000");
        LogicalChannelMocker.mockSendToLogicalChannel(mMockCi, channel, "A1A1A19000");
        LogicalChannelMocker.mockCloseLogicalChannel(mMockCi, channel, /* error= */ null);