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

Commit b51b7274 authored by rambowang's avatar rambowang Committed by Android Build Cherrypicker Worker
Browse files

Fix VCN crash when retrieving carrier config while phone is gone

This CL calls CarrierConfigManager.getCarrierConfigSubset instead of
getConfigForSubId to guard against crashing when phone process has gone.

The former method is designed for system components to retrieve carrier
configs with consideration of phone process may be gone (e.g. during
rebooting from previous crash).

Bug: 319791612
Test: atest TelephonySubscriptionTrackerTest
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:d7ebd7c10712a8a319ae6117949d4ece92be4de8)
Merged-In: I784610b243db2a666c1fe89b1438950a2f6a1478
Change-Id: I784610b243db2a666c1fe89b1438950a2f6a1478
parent df19a793
Loading
Loading
Loading
Loading
+7 −2
Original line number Original line Diff line number Diff line
@@ -44,6 +44,7 @@ import android.util.Slog;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting.Visibility;
import com.android.internal.annotations.VisibleForTesting.Visibility;
import com.android.internal.telephony.flags.Flags;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.vcn.util.PersistableBundleUtils.PersistableBundleWrapper;
import com.android.server.vcn.util.PersistableBundleUtils.PersistableBundleWrapper;


@@ -318,7 +319,11 @@ public class TelephonySubscriptionTracker extends BroadcastReceiver {


        if (SubscriptionManager.isValidSubscriptionId(subId)) {
        if (SubscriptionManager.isValidSubscriptionId(subId)) {
            // Get only configs as needed to save memory.
            // Get only configs as needed to save memory.
            final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId,
            final PersistableBundle carrierConfig =
                    Flags.fixCrashOnGettingConfigWhenPhoneIsGone()
                            ? CarrierConfigManager.getCarrierConfigSubset(mContext, subId,
                                    VcnManager.VCN_RELATED_CARRIER_CONFIG_KEYS)
                            : mCarrierConfigManager.getConfigForSubId(subId,
                                    VcnManager.VCN_RELATED_CARRIER_CONFIG_KEYS);
                                    VcnManager.VCN_RELATED_CARRIER_CONFIG_KEYS);
            if (mDeps.isConfigForIdentifiedCarrier(carrierConfig)) {
            if (mDeps.isConfigForIdentifiedCarrier(carrierConfig)) {
                mReadySubIdsBySlotId.put(slotId, subId);
                mReadySubIdsBySlotId.put(slotId, subId);
+1 −0
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@ android_test {
        "platform-test-annotations",
        "platform-test-annotations",
        "services.core",
        "services.core",
        "service-connectivity-tiramisu-pre-jarjar",
        "service-connectivity-tiramisu-pre-jarjar",
        "flag-junit",
    ],
    ],
    libs: [
    libs: [
        "android.test.runner",
        "android.test.runner",
+19 −0
Original line number Original line Diff line number Diff line
@@ -38,6 +38,7 @@ import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.times;
@@ -58,6 +59,7 @@ import android.os.HandlerExecutor;
import android.os.ParcelUuid;
import android.os.ParcelUuid;
import android.os.PersistableBundle;
import android.os.PersistableBundle;
import android.os.test.TestLooper;
import android.os.test.TestLooper;
import android.platform.test.flag.junit.SetFlagsRule;
import android.telephony.CarrierConfigManager;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager;
@@ -71,7 +73,10 @@ import android.util.ArraySet;
import androidx.test.filters.SmallTest;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import androidx.test.runner.AndroidJUnit4;


import com.android.internal.telephony.flags.Flags;

import org.junit.Before;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentCaptor;
@@ -128,6 +133,9 @@ public class TelephonySubscriptionTrackerTest {
        TEST_SUBID_TO_CARRIER_CONFIG_MAP = Collections.unmodifiableMap(subIdToCarrierConfigMap);
        TEST_SUBID_TO_CARRIER_CONFIG_MAP = Collections.unmodifiableMap(subIdToCarrierConfigMap);
    }
    }


    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();


    @NonNull private final Context mContext;
    @NonNull private final Context mContext;
    @NonNull private final TestLooper mTestLooper;
    @NonNull private final TestLooper mTestLooper;
    @NonNull private final Handler mHandler;
    @NonNull private final Handler mHandler;
@@ -185,6 +193,7 @@ public class TelephonySubscriptionTrackerTest {


    @Before
    @Before
    public void setUp() throws Exception {
    public void setUp() throws Exception {
        mSetFlagsRule.enableFlags(Flags.FLAG_FIX_CRASH_ON_GETTING_CONFIG_WHEN_PHONE_IS_GONE);
        doReturn(2).when(mTelephonyManager).getActiveModemCount();
        doReturn(2).when(mTelephonyManager).getActiveModemCount();


        mCallback = mock(TelephonySubscriptionTrackerCallback.class);
        mCallback = mock(TelephonySubscriptionTrackerCallback.class);
@@ -594,4 +603,14 @@ public class TelephonySubscriptionTrackerTest {
                new ArraySet<>(Arrays.asList(TEST_SUBSCRIPTION_ID_1, TEST_SUBSCRIPTION_ID_2)),
                new ArraySet<>(Arrays.asList(TEST_SUBSCRIPTION_ID_1, TEST_SUBSCRIPTION_ID_2)),
                snapshot.getAllSubIdsInGroup(TEST_PARCEL_UUID));
                snapshot.getAllSubIdsInGroup(TEST_PARCEL_UUID));
    }
    }

    @Test
    public void testCarrierConfigChangeWhenPhoneIsGoneShouldNotCrash() throws Exception {
        doThrow(new IllegalStateException("Carrier config loader is not available."))
                .when(mCarrierConfigManager)
                .getConfigForSubId(eq(TEST_SUBSCRIPTION_ID_1), any());

        sendCarrierConfigChange(true /* hasValidSubscription */);
        mTestLooper.dispatchAll();
    }
}
}