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

Commit 13a48ad2 authored by Jack Yu's avatar Jack Yu
Browse files

Fixed data icon disappeared issue

When carriers have more than one APN that supports
internet APN type, the data icon might sometimes
disappeared, for example, after sending an MMS.
This is caused by the PreciseDataConnectionState
refactoring in Android 12. Added the workaround in
TelephonyRegistry to aggregate the data connection state for
internet, since it would be very difficult to make this
right in DataConnection class.

In Android 13, a more robust and comprehensive logic will
be added in the new data network controller to fix this.

Fix: 204328662
Fix: 187967526
Test: Manual test & TelephonyRegistryTest
Change-Id: Ia5c2e1e45f8e990e5a25181249acc2b98f812cf8
parent 6d505709
Loading
Loading
Loading
Loading
+288 −0
Original line number Diff line number Diff line
@@ -91,6 +91,8 @@ public class TelephonyRegistryTest extends TelephonyTest {
    private TelephonyDisplayInfo mTelephonyDisplayInfo;
    private int mSrvccState = -1;
    private int mRadioPowerState = RADIO_POWER_UNAVAILABLE;
    private int mDataConnectionState = TelephonyManager.DATA_UNKNOWN;
    private int mNetworkType = TelephonyManager.NETWORK_TYPE_UNKNOWN;
    private List<PhysicalChannelConfig> mPhysicalChannelConfigs;
    private TelephonyRegistry.ConfigurationProvider mMockConfigurationProvider;
    private CellLocation mCellLocation;
@@ -155,6 +157,7 @@ public class TelephonyRegistryTest extends TelephonyTest {
            TelephonyCallback.ActiveDataSubscriptionIdListener,
            TelephonyCallback.RadioPowerStateListener,
            TelephonyCallback.PreciseDataConnectionStateListener,
            TelephonyCallback.DataConnectionStateListener,
            TelephonyCallback.DisplayInfoListener,
            TelephonyCallback.LinkCapacityEstimateChangedListener,
            TelephonyCallback.PhysicalChannelConfigListener,
@@ -189,6 +192,12 @@ public class TelephonyRegistryTest extends TelephonyTest {
            invocationCount.incrementAndGet();
        }
        @Override
        public void onDataConnectionStateChanged(int state, int networkType) {
            invocationCount.incrementAndGet();
            mDataConnectionState = state;
            mNetworkType = networkType;
        }
        @Override
        public void onDisplayInfoChanged(TelephonyDisplayInfo displayInfo) {
            mTelephonyDisplayInfo = displayInfo;
        }
@@ -373,6 +382,285 @@ public class TelephonyRegistryTest extends TelephonyTest {
        assertEquals(RADIO_POWER_OFF, mRadioPowerState);
    }

    /**
     * Test {@link TelephonyCallback.DataConnectionStateListener}
     */
    @Test
    public void testDataConnectionStateChanged() {
        final int subId = 1;
        int[] events = {TelephonyCallback.EVENT_DATA_CONNECTION_STATE_CHANGED};
        doReturn(mMockSubInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(anyInt());
        doReturn(0/*slotIndex*/).when(mMockSubInfo).getSimSlotIndex();

        assertEquals(TelephonyManager.DATA_UNKNOWN, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_UNKNOWN, mNetworkType);

        mTelephonyRegistry.notifyDataConnectionForSubscriber(
                /*phoneId*/ 0, subId,
                new PreciseDataConnectionState.Builder()
                        .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                        .setId(1)
                        .setState(TelephonyManager.DATA_CONNECTED)
                        .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
                        .setApnSetting(new ApnSetting.Builder()
                                .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT)
                                .setApnName("default")
                                .setEntryName("default")
                                .build())
                        .setLinkProperties(new LinkProperties())
                        .setFailCause(0)
                        .build());
        mTelephonyRegistry.listenWithEventList(subId, mContext.getOpPackageName(),
                mContext.getAttributionTag(), mTelephonyCallback.callback, events, true);

        assertEquals(TelephonyManager.DATA_CONNECTED, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mNetworkType);

        mTelephonyRegistry.notifyDataConnectionForSubscriber(
                /*phoneId*/ 0, subId,
                new PreciseDataConnectionState.Builder()
                        .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                        .setId(1)
                        .setState(TelephonyManager.DATA_DISCONNECTING)
                        .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
                        .setApnSetting(new ApnSetting.Builder()
                                .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT)
                                .setApnName("default")
                                .setEntryName("default")
                                .build())
                        .setLinkProperties(new LinkProperties())
                        .setFailCause(0)
                        .build());

        assertEquals(TelephonyManager.DATA_DISCONNECTING, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mNetworkType);

        mTelephonyRegistry.notifyDataConnectionForSubscriber(
                /*phoneId*/ 0, subId,
                new PreciseDataConnectionState.Builder()
                        .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                        .setId(1)
                        .setState(TelephonyManager.DATA_DISCONNECTED)
                        .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
                        .setApnSetting(new ApnSetting.Builder()
                                .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT)
                                .setApnName("default")
                                .setEntryName("default")
                                .build())
                        .setLinkProperties(new LinkProperties())
                        .setFailCause(0)
                        .build());

        assertEquals(TelephonyManager.DATA_DISCONNECTED, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mNetworkType);
    }

    /**
     * Test the scenario that multiple PDNs support default type APN scenario. Make sure it reports
     * aggregate data connection state.
     */
    @Test
    public void testDataConnectionStateChangedMultipleInternet() {
        final int subId = 1;
        int[] events = {TelephonyCallback.EVENT_DATA_CONNECTION_STATE_CHANGED};
        doReturn(mMockSubInfo).when(mSubscriptionManager).getActiveSubscriptionInfo(anyInt());
        doReturn(0/*slotIndex*/).when(mMockSubInfo).getSimSlotIndex();

        assertEquals(TelephonyManager.DATA_UNKNOWN, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_UNKNOWN, mNetworkType);

        mTelephonyRegistry.listenWithEventList(subId, mContext.getOpPackageName(),
                mContext.getAttributionTag(), mTelephonyCallback.callback, events, true);

        mTelephonyRegistry.notifyDataConnectionForSubscriber(
                /*phoneId*/ 0, subId,
                new PreciseDataConnectionState.Builder()
                        .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                        .setId(1)
                        .setState(TelephonyManager.DATA_CONNECTED)
                        .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
                        .setApnSetting(new ApnSetting.Builder()
                                .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT)
                                .setApnName("default")
                                .setEntryName("default")
                                .build())
                        .setLinkProperties(new LinkProperties())
                        .setFailCause(0)
                        .build());

        assertEquals(TelephonyManager.DATA_CONNECTED, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mNetworkType);

        mTelephonyRegistry.notifyDataConnectionForSubscriber(
                /*phoneId*/ 0, subId,
                new PreciseDataConnectionState.Builder()
                        .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                        .setId(1)
                        .setState(TelephonyManager.DATA_CONNECTING)
                        .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
                        .setApnSetting(new ApnSetting.Builder()
                                .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
                                .setApnName("default+mms")
                                .setEntryName("default+mms")
                                .build())
                        .setLinkProperties(new LinkProperties())
                        .setFailCause(0)
                        .build());

        assertEquals(TelephonyManager.DATA_CONNECTED, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mNetworkType);

        mTelephonyRegistry.notifyDataConnectionForSubscriber(
                /*phoneId*/ 0, subId,
                new PreciseDataConnectionState.Builder()
                        .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                        .setId(1)
                        .setState(TelephonyManager.DATA_DISCONNECTING)
                        .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
                        .setApnSetting(new ApnSetting.Builder()
                                .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
                                .setApnName("default+mms")
                                .setEntryName("default+mms")
                                .build())
                        .setLinkProperties(new LinkProperties())
                        .setFailCause(0)
                        .build());
        assertEquals(TelephonyManager.DATA_CONNECTED, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mNetworkType);

        mTelephonyRegistry.notifyDataConnectionForSubscriber(
                /*phoneId*/ 0, subId,
                new PreciseDataConnectionState.Builder()
                        .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                        .setId(1)
                        .setState(TelephonyManager.DATA_DISCONNECTED)
                        .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
                        .setApnSetting(new ApnSetting.Builder()
                                .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
                                .setApnName("default+mms")
                                .setEntryName("default+mms")
                                .build())
                        .setLinkProperties(new LinkProperties())
                        .setFailCause(0)
                        .build());
        assertEquals(TelephonyManager.DATA_CONNECTED, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mNetworkType);

        mTelephonyRegistry.notifyDataConnectionForSubscriber(
                /*phoneId*/ 0, subId,
                new PreciseDataConnectionState.Builder()
                        .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                        .setId(1)
                        .setState(TelephonyManager.DATA_CONNECTING)
                        .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
                        .setApnSetting(new ApnSetting.Builder()
                                .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
                                .setApnName("default+mms")
                                .setEntryName("default+mms")
                                .build())
                        .setLinkProperties(new LinkProperties())
                        .setFailCause(0)
                        .build());

        assertEquals(TelephonyManager.DATA_CONNECTED, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mNetworkType);

        mTelephonyRegistry.notifyDataConnectionForSubscriber(
                /*phoneId*/ 0, subId,
                new PreciseDataConnectionState.Builder()
                        .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                        .setId(1)
                        .setState(TelephonyManager.DATA_CONNECTED)
                        .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
                        .setApnSetting(new ApnSetting.Builder()
                                .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
                                .setApnName("default+mms")
                                .setEntryName("default+mms")
                                .build())
                        .setLinkProperties(new LinkProperties())
                        .setFailCause(0)
                        .build());

        assertEquals(TelephonyManager.DATA_CONNECTED, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mNetworkType);

        mTelephonyRegistry.notifyDataConnectionForSubscriber(
                /*phoneId*/ 0, subId,
                new PreciseDataConnectionState.Builder()
                        .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                        .setId(1)
                        .setState(TelephonyManager.DATA_DISCONNECTING)
                        .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
                        .setApnSetting(new ApnSetting.Builder()
                                .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT)
                                .setApnName("default")
                                .setEntryName("default")
                                .build())
                        .setLinkProperties(new LinkProperties())
                        .setFailCause(0)
                        .build());

        assertEquals(TelephonyManager.DATA_CONNECTED, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mNetworkType);

        mTelephonyRegistry.notifyDataConnectionForSubscriber(
                /*phoneId*/ 0, subId,
                new PreciseDataConnectionState.Builder()
                        .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                        .setId(1)
                        .setState(TelephonyManager.DATA_DISCONNECTING)
                        .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
                        .setApnSetting(new ApnSetting.Builder()
                                .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
                                .setApnName("default+mms")
                                .setEntryName("default+mms")
                                .build())
                        .setLinkProperties(new LinkProperties())
                        .setFailCause(0)
                        .build());

        assertEquals(TelephonyManager.DATA_DISCONNECTING, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mNetworkType);

        mTelephonyRegistry.notifyDataConnectionForSubscriber(
                /*phoneId*/ 0, subId,
                new PreciseDataConnectionState.Builder()
                        .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                        .setId(1)
                        .setState(TelephonyManager.DATA_DISCONNECTED)
                        .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
                        .setApnSetting(new ApnSetting.Builder()
                                .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT)
                                .setApnName("default")
                                .setEntryName("default")
                                .build())
                        .setLinkProperties(new LinkProperties())
                        .setFailCause(0)
                        .build());

        assertEquals(TelephonyManager.DATA_DISCONNECTING, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mNetworkType);

        mTelephonyRegistry.notifyDataConnectionForSubscriber(
                /*phoneId*/ 0, subId,
                new PreciseDataConnectionState.Builder()
                        .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
                        .setId(1)
                        .setState(TelephonyManager.DATA_DISCONNECTED)
                        .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
                        .setApnSetting(new ApnSetting.Builder()
                                .setApnTypeBitmask(ApnSetting.TYPE_DEFAULT | ApnSetting.TYPE_MMS)
                                .setApnName("default+mms")
                                .setEntryName("default+mms")
                                .build())
                        .setLinkProperties(new LinkProperties())
                        .setFailCause(0)
                        .build());

        assertEquals(TelephonyManager.DATA_DISCONNECTED, mDataConnectionState);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, mNetworkType);
    }

    /**
     * Test multi sim config change.
     */