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

Commit 7ae924d0 authored by tomhsu's avatar tomhsu Committed by Android Build Coastguard Worker
Browse files

Fix crash from exceeding the number of permissible registered listeners

 - Do not register the new callback to TelephonyRegistry.

Flag: EXEMPT bugfix
fix: 363183211
Test: Manual test
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:a7927cc559c1c41b8d62036edc3ce534f9e2dd3d)
Merged-In: I20e6d4e35157d6e156a18e177ce071aa7d080e5d
Change-Id: I20e6d4e35157d6e156a18e177ce071aa7d080e5d
parent 396c428f
Loading
Loading
Loading
Loading
+21 −10
Original line number Diff line number Diff line
@@ -311,10 +311,7 @@ public class InternetDialogController implements AccessPointController.AccessPoi
        mConfig = MobileMappings.Config.readConfig(mContext);
        mTelephonyManager = mTelephonyManager.createForSubscriptionId(mDefaultDataSubId);
        mSubIdTelephonyManagerMap.put(mDefaultDataSubId, mTelephonyManager);
        InternetTelephonyCallback telephonyCallback =
                new InternetTelephonyCallback(mDefaultDataSubId);
        mSubIdTelephonyCallbackMap.put(mDefaultDataSubId, telephonyCallback);
        mTelephonyManager.registerTelephonyCallback(mExecutor, telephonyCallback);
        registerInternetTelephonyCallback(mTelephonyManager, mDefaultDataSubId);
        // Listen the connectivity changes
        mConnectivityManager.registerDefaultNetworkCallback(mConnectivityManagerNetworkCallback);
        mCanConfigWifi = canConfigWifi;
@@ -346,6 +343,23 @@ public class InternetDialogController implements AccessPointController.AccessPoi
        mCallback = null;
    }

    /**
     * This is to generate and register the new callback to Telephony for uncached subscription id,
     * then cache it. Telephony also cached this callback into
     * {@link com.android.server.TelephonyRegistry}, so if subscription id and callback were cached
     * already, it shall do nothing to avoid registering redundant callback to Telephony.
     */
    private void registerInternetTelephonyCallback(
            TelephonyManager telephonyManager, int subId) {
        if (mSubIdTelephonyCallbackMap.containsKey(subId)) {
            // Avoid to generate and register unnecessary callback to Telephony.
            return;
        }
        InternetTelephonyCallback telephonyCallback = new InternetTelephonyCallback(subId);
        mSubIdTelephonyCallbackMap.put(subId, telephonyCallback);
        telephonyManager.registerTelephonyCallback(mExecutor, telephonyCallback);
    }

    boolean isAirplaneModeEnabled() {
        return mGlobalSettings.getInt(Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
    }
@@ -673,9 +687,7 @@ public class InternetDialogController implements AccessPointController.AccessPoi
            int subId = subInfo.getSubscriptionId();
            if (mSubIdTelephonyManagerMap.get(subId) == null) {
                TelephonyManager secondaryTm = mTelephonyManager.createForSubscriptionId(subId);
                InternetTelephonyCallback telephonyCallback = new InternetTelephonyCallback(subId);
                secondaryTm.registerTelephonyCallback(mExecutor, telephonyCallback);
                mSubIdTelephonyCallbackMap.put(subId, telephonyCallback);
                registerInternetTelephonyCallback(secondaryTm, subId);
                mSubIdTelephonyManagerMap.put(subId, secondaryTm);
            }
            return subId;
@@ -1351,6 +1363,7 @@ public class InternetDialogController implements AccessPointController.AccessPoi
        if (DEBUG) {
            Log.d(TAG, "DDS: defaultDataSubId:" + defaultDataSubId);
        }

        if (SubscriptionManager.isUsableSubscriptionId(defaultDataSubId)) {
            // clean up old defaultDataSubId
            TelephonyCallback oldCallback = mSubIdTelephonyCallbackMap.get(mDefaultDataSubId);
@@ -1366,9 +1379,7 @@ public class InternetDialogController implements AccessPointController.AccessPoi
            // create for new defaultDataSubId
            mTelephonyManager = mTelephonyManager.createForSubscriptionId(defaultDataSubId);
            mSubIdTelephonyManagerMap.put(defaultDataSubId, mTelephonyManager);
            InternetTelephonyCallback newCallback = new InternetTelephonyCallback(defaultDataSubId);
            mSubIdTelephonyCallbackMap.put(defaultDataSubId, newCallback);
            mTelephonyManager.registerTelephonyCallback(mHandler::post, newCallback);
            registerInternetTelephonyCallback(mTelephonyManager, defaultDataSubId);
            mCallback.onSubscriptionsChanged(defaultDataSubId);
        }
        mDefaultDataSubId = defaultDataSubId;
+29 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

@@ -886,6 +887,34 @@ public class InternetDialogDelegateControllerTest extends SysuiTestCase {
        assertThat(subId).isEqualTo(SubscriptionManager.INVALID_SUBSCRIPTION_ID);
    }

    @Test
    public void getActiveAutoSwitchNonDdsSubId_registerCallbackForExistedSubId_notRegister() {
        mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true);

        // Adds non DDS subId
        SubscriptionInfo info = mock(SubscriptionInfo.class);
        doReturn(SUB_ID2).when(info).getSubscriptionId();
        doReturn(false).when(info).isOpportunistic();
        when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info);

        mInternetDialogController.getActiveAutoSwitchNonDdsSubId();

        // 1st time is onStart(), 2nd time is getActiveAutoSwitchNonDdsSubId()
        verify(mTelephonyManager, times(2)).registerTelephonyCallback(any(), any());
        assertThat(mInternetDialogController.mSubIdTelephonyCallbackMap.size() == 2);

        // Adds non DDS subId again
        doReturn(SUB_ID2).when(info).getSubscriptionId();
        doReturn(false).when(info).isOpportunistic();
        when(mSubscriptionManager.getActiveSubscriptionInfo(anyInt())).thenReturn(info);

        mInternetDialogController.getActiveAutoSwitchNonDdsSubId();

        // Does not add due to cached subInfo in mSubIdTelephonyCallbackMap.
        verify(mTelephonyManager, times(2)).registerTelephonyCallback(any(), any());
        assertThat(mInternetDialogController.mSubIdTelephonyCallbackMap.size() == 2);
    }

    @Test
    public void getMobileNetworkSummary() {
        mFlags.set(Flags.QS_SECONDARY_DATA_SUB_INFO, true);