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

Unverified Commit 89cca67c authored by Kevin F. Haggerty's avatar Kevin F. Haggerty
Browse files

Merge tag 'android-11.0.0_r38' into staging/lineage-18.1_merge-android-11.0.0_r38

Android 11.0.0 Release 38 (RQ3A.210605.005)

* tag 'android-11.0.0_r38':
  Public EVENT_EMERGENCY_CALLBACK_MODE_ENTER for testing purpose
  Fixed dangling DC controller
  Get data network type from NetworkRegistrationInfo instead of ServiceState
  Check for timers when checking isCampedOn5G
  CP bugfixes from ag/13300921 to QPR3
  Add tests for network controller
  Fix NR display logic for non-LTE RATs
  Exclude IWLAN from the checks
  Allow TEMP_NOT_METERED on 5G SA network
  Temporary fix to prevent TEMPORARILY_NOT_METERED leak
  Remove unecessary locking to avoid dead lock.
  Fix bug of disabling grouped CBRS during profile switch on primary SIM
  Move permission checks out of synchronized block
  Guard ICC ID card string behind new identifier access requirements
  Guard ICC ID behind new identifier access requirements
  TEMP_NOT_METERED only for 5G override
  Change EuiccConnector to only refresh eSIM profile list when rebinding
  Fixed incorrect unregister from connectivity service

Change-Id: I06751592b424efec39c5a2e29f3293c3e000a568
parents 1e607c9c 10a271ab
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -69,6 +69,14 @@ public class DisplayInfoController extends Handler {
        }
    }

    /**
     * @return True if either the primary or secondary 5G hysteresis timer is active,
     * and false if neither are.
     */
    public boolean is5GHysteresisActive() {
        return mNetworkTypeController.is5GHysteresisActive();
    }

    /**
     * Register for TelephonyDisplayInfo changed.
     * @param h Handler to notify
+28 −11
Original line number Diff line number Diff line
@@ -172,6 +172,14 @@ public class NetworkTypeController extends StateMachine {
        return mOverrideNetworkType;
    }

    /**
     * @return True if either the primary or secondary 5G hysteresis timer is active,
     * and false if neither are.
     */
    public boolean is5GHysteresisActive() {
        return mIsPrimaryTimerActive || mIsSecondaryTimerActive;
    }

    private void registerForAllEvents() {
        mPhone.registerForRadioOffOrNotAvailable(getHandler(),
                EVENT_RADIO_OFF_OR_UNAVAILABLE, null);
@@ -352,11 +360,13 @@ public class NetworkTypeController extends StateMachine {

    private @Annotation.OverrideNetworkType int getCurrentOverrideNetworkType() {
        int displayNetworkType = TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE;
        int dataNetworkType = mPhone.getServiceState().getDataNetworkType();
        int dataNetworkType = getDataNetworkType();
        boolean nrNsa = isLte(dataNetworkType)
                && mPhone.getServiceState().getNrState() != NetworkRegistrationInfo.NR_STATE_NONE;
        boolean nrSa = dataNetworkType == TelephonyManager.NETWORK_TYPE_NR;

        // NR display is not accurate when physical channel config notifications are off
        if (mIsPhysicalChannelConfigOn
                && (mPhone.getServiceState().getNrState() != NetworkRegistrationInfo.NR_STATE_NONE
                || dataNetworkType == TelephonyManager.NETWORK_TYPE_NR)) {
        if (mIsPhysicalChannelConfigOn && (nrNsa || nrSa)) {
            // Process NR display network type
            displayNetworkType = getNrDisplayType();
            if (displayNetworkType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE) {
@@ -407,7 +417,7 @@ public class NetworkTypeController extends StateMachine {

    private @Annotation.OverrideNetworkType int getLteDisplayType() {
        int value = TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NONE;
        if ((mPhone.getServiceState().getDataNetworkType() == TelephonyManager.NETWORK_TYPE_LTE_CA
        if ((getDataNetworkType() == TelephonyManager.NETWORK_TYPE_LTE_CA
                || mPhone.getServiceState().isUsingCarrierAggregation())
                && (IntStream.of(mPhone.getServiceState().getCellBandwidths()).sum()
                        > mLtePlusThresholdBandwidth)) {
@@ -544,7 +554,7 @@ public class NetworkTypeController extends StateMachine {
        public boolean processMessage(Message msg) {
            if (DBG) log("LegacyState: process " + getEventName(msg.what));
            updateTimers();
            int rat = mPhone.getServiceState().getDataNetworkType();
            int rat = getDataNetworkType();
            switch (msg.what) {
                case EVENT_DATA_RAT_CHANGED:
                    if (rat == TelephonyManager.NETWORK_TYPE_NR || isLte(rat) && isNrConnected()) {
@@ -620,7 +630,7 @@ public class NetworkTypeController extends StateMachine {
            updateTimers();
            switch (msg.what) {
                case EVENT_DATA_RAT_CHANGED:
                    int rat = mPhone.getServiceState().getDataNetworkType();
                    int rat = getDataNetworkType();
                    if (rat == TelephonyManager.NETWORK_TYPE_NR) {
                        transitionTo(mNrConnectedState);
                    } else if (!isLte(rat) || !isNrNotRestricted()) {
@@ -687,7 +697,7 @@ public class NetworkTypeController extends StateMachine {
            updateTimers();
            switch (msg.what) {
                case EVENT_DATA_RAT_CHANGED:
                    int rat = mPhone.getServiceState().getDataNetworkType();
                    int rat = getDataNetworkType();
                    if (rat == TelephonyManager.NETWORK_TYPE_NR) {
                        transitionTo(mNrConnectedState);
                    } else if (!isLte(rat) || !isNrNotRestricted()) {
@@ -755,7 +765,7 @@ public class NetworkTypeController extends StateMachine {
        public boolean processMessage(Message msg) {
            if (DBG) log("NrConnectedState: process " + getEventName(msg.what));
            updateTimers();
            int rat = mPhone.getServiceState().getDataNetworkType();
            int rat = getDataNetworkType();
            switch (msg.what) {
                case EVENT_DATA_RAT_CHANGED:
                    if (rat == TelephonyManager.NETWORK_TYPE_NR || isLte(rat) && isNrConnected()) {
@@ -845,7 +855,7 @@ public class NetworkTypeController extends StateMachine {
    }

    private void transitionToCurrentState() {
        int dataRat = mPhone.getServiceState().getDataNetworkType();
        int dataRat = getDataNetworkType();
        IState transitionState;
        if (dataRat == TelephonyManager.NETWORK_TYPE_NR || isNrConnected()) {
            transitionState = mNrConnectedState;
@@ -898,7 +908,7 @@ public class NetworkTypeController extends StateMachine {
            resetAllTimers();
        }

        int rat = mPhone.getServiceState().getDataNetworkType();
        int rat = getDataNetworkType();
        if (!isLte(rat) && rat != TelephonyManager.NETWORK_TYPE_NR) {
            // Rat is 3G or 2G, and it doesn't need NR timer.
            resetAllTimers();
@@ -1027,6 +1037,13 @@ public class NetworkTypeController extends StateMachine {
        return mPhysicalLinkState == DcController.PHYSICAL_LINK_ACTIVE;
    }

    private int getDataNetworkType() {
        NetworkRegistrationInfo nri =  mPhone.getServiceState().getNetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        return nri == null ? TelephonyManager.NETWORK_TYPE_UNKNOWN
                : nri.getAccessNetworkTechnology();
    }

    private String getEventName(int event) {
        try {
            return sEvents[event];
+2 −1
Original line number Diff line number Diff line
@@ -172,7 +172,8 @@ public abstract class Phone extends Handler implements PhoneInternalInterface {
    protected static final int EVENT_RUIM_RECORDS_LOADED            = 22;
    protected static final int EVENT_NV_READY                       = 23;
    private static final int EVENT_SET_ENHANCED_VP                  = 24;
    protected static final int EVENT_EMERGENCY_CALLBACK_MODE_ENTER  = 25;
    @VisibleForTesting
    public static final int EVENT_EMERGENCY_CALLBACK_MODE_ENTER  = 25;
    protected static final int EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE = 26;
    protected static final int EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED = 27;
    // other
+24 −19
Original line number Diff line number Diff line
@@ -299,7 +299,7 @@ public class DataConnection extends StateMachine {
    public int mCid;

    @HandoverState
    private int mHandoverState;
    private int mHandoverState = HANDOVER_STATE_IDLE;
    private final Map<ApnContext, ConnectionParams> mApnContexts = new ConcurrentHashMap<>();
    PendingIntent mReconnectIntent = null;

@@ -958,6 +958,7 @@ public class DataConnection extends StateMachine {
        mUnmeteredOverride = false;
        mDownlinkBandwidth = 14;
        mUplinkBandwidth = 14;
        mHandoverState = HANDOVER_STATE_IDLE;
    }

    /**
@@ -1395,11 +1396,15 @@ public class DataConnection extends StateMachine {
                }
            }

            // DataConnection has the immutable NOT_METERED capability only if all APNs in the
            // APN setting are unmetered according to carrier config METERED_APN_TYPES_STRINGS.
            // All other cases should use the dynamic TEMPORARILY_NOT_METERED capability instead.
            result.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED,
                    !ApnSettingUtils.isMetered(mApnSetting, mPhone));
            // Mark NOT_METERED in the following cases:
            // 1. All APNs in the APN settings are unmetered.
            // 2. The non-restricted data is intended for unmetered use only.
            if ((mUnmeteredUseOnly && !mRestrictedNetworkOverride)
                    || !ApnSettingUtils.isMetered(mApnSetting, mPhone)) {
                result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
            } else {
                result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
            }

            if (result.deduceRestrictedCapability()) {
                result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
@@ -1421,20 +1426,18 @@ public class DataConnection extends StateMachine {
        result.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING,
                !mPhone.getServiceState().getDataRoaming());

        if ((mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_CONGESTED) == 0) {
        result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED);
        }

        // Mark TEMPORARILY_NOT_METERED in the following cases:
        // 1. The non-restricted data is intended for unmetered use only.
        // 2. DcTracker set an unmetered override due to network/location (eg. 5G).
        // 3. SubscriptionManager set an unmetered override as requested by policy.
        if ((mUnmeteredUseOnly && !mRestrictedNetworkOverride) || mUnmeteredOverride
                || (mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_UNMETERED) != 0) {
            result.addCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED);
        } else {
            result.removeCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED);
        // Override values set above when requested by policy
        if ((mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_UNMETERED) != 0) {
            result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED);
        }
        if ((mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_CONGESTED) != 0) {
            result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED);
        }

        result.setCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED,
                mUnmeteredOverride);

        final boolean suspended =
                mNetworkInfo.getDetailedState() == NetworkInfo.DetailedState.SUSPENDED;
@@ -2275,7 +2278,9 @@ public class DataConnection extends StateMachine {
            // data connection is disconnected. If we don't own this agent at this point, that means
            // it has been transferred to the new data connection for IWLAN data handover case.
            if (mNetworkAgent != null) {
                mNetworkAgent.sendNetworkInfo(mNetworkInfo, DataConnection.this);
                if (mHandoverState == HANDOVER_STATE_IDLE) {
                    mNetworkAgent.unregister(DataConnection.this);
                }
                mNetworkAgent.releaseOwnership(DataConnection.this);
            }
            mNetworkAgent = null;
+86 −22
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.Annotation.ApnType;
import android.telephony.Annotation.DataFailureCause;
import android.telephony.Annotation.NetworkType;
import android.telephony.AnomalyReporter;
import android.telephony.CarrierConfigManager;
import android.telephony.CellLocation;
import android.telephony.DataFailCause;
@@ -128,6 +129,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
@@ -334,7 +336,7 @@ public class DcTracker extends Handler {
    private boolean mNrSaAllUnmetered = false;
    private boolean mNrSaMmwaveUnmetered = false;
    private boolean mNrSaSub6Unmetered = false;
    private boolean mRoamingUnmetered = false;
    private boolean mNrNsaRoamingUnmetered = false;

    /* List of SubscriptionPlans, updated when initialized and when plans are changed. */
    private List<SubscriptionPlan> mSubscriptionPlans = null;
@@ -725,6 +727,7 @@ public class DcTracker extends Handler {
        mHandlerThread.start();
        Handler dcHandler = new Handler(mHandlerThread.getLooper());
        mDcc = DcController.makeDcc(mPhone, this, mDataServiceManager, dcHandler, mLogTagSuffix);
        mDcc.start();
        mDcTesterFailBringUpAll = new DcTesterFailBringUpAll(mPhone, dcHandler);

        mDataConnectionTracker = this;
@@ -3938,7 +3941,7 @@ public class DcTracker extends Handler {
                onDataReconnect((ApnContext) msg.obj, msg.arg1);
                break;
            case DctConstants.EVENT_DATA_SERVICE_BINDING_CHANGED:
                onDataServiceBindingChanged((Boolean) ((AsyncResult) msg.obj).result);
                mDataServiceBound = (boolean) ((AsyncResult) msg.obj).result;
                break;
            case DctConstants.EVENT_DATA_ENABLED_CHANGED:
                ar = (AsyncResult) msg.obj;
@@ -4131,7 +4134,7 @@ public class DcTracker extends Handler {
    private void reevaluateUnmeteredConnections() {
        log("reevaluateUnmeteredConnections");
        int rat = mPhone.getDisplayInfoController().getTelephonyDisplayInfo().getNetworkType();
        if (isNrUnmetered() && !mPhone.getServiceState().getRoaming() || mRoamingUnmetered) {
        if (isNrUnmetered() && (!mPhone.getServiceState().getRoaming() || mNrNsaRoamingUnmetered)) {
            setDataConnectionUnmetered(true);
            if (!mWatchdog) {
                startWatchdogAlarm();
@@ -4143,9 +4146,28 @@ public class DcTracker extends Handler {
    }

    private void setDataConnectionUnmetered(boolean isUnmetered) {
        // TODO: Remove this after b/176119724 is fixed. This is just a workaround to prevent
        // NET_CAPABILITY_TEMPORARILY_NOT_METERED incorrectly set on devices that are not supposed
        // to use 5G unmetered network. Currently TEMPORARILY_NOT_METERED can only happen on few
        // devices and carriers.
        if (!isUnmetered || (isUnmetered && tempNotMeteredPossible())) {
            for (DataConnection dataConnection : mDataConnections.values()) {
                dataConnection.onMeterednessChanged(isUnmetered);
            }
        } else {
            // isUnmetered=true but TEMP_NOT_METERED is not possible
            String message = "Unexpected temp not metered detected. carrier supported="
                    + isTempNotMeteredSupportedByCarrier() + ", device 5G capable="
                    + isDevice5GCapable() + ", camped on 5G=" + isCampedOn5G()
                    + ", timer active=" + mPhone.getDisplayInfoController().is5GHysteresisActive()
                    + ", display info="
                    + mPhone.getDisplayInfoController().getTelephonyDisplayInfo()
                    + ", subscription plans=" + mSubscriptionPlans
                    + ", Service state=" + mPhone.getServiceState();
            loge(message);
            AnomalyReporter.reportAnomaly(
                    UUID.fromString("9151f0fc-01df-4afb-b744-9c4529055250"), message);
        }
    }

    private boolean isNetworkTypeUnmetered(@NetworkType int networkType) {
@@ -4248,6 +4270,64 @@ public class DcTracker extends Handler {
        return false;
    }

    // TODO: Remove this after b/176119724 is fixed. This is just a workaround to prevent
    // NET_CAPABILITY_TEMPORARILY_NOT_METERED incorrectly set on devices that are not supposed
    // to use 5G unmetered network. Currently TEMPORARILY_NOT_METERED can only happen on few devices
    // and carriers.
    private boolean isDevice5GCapable() {
        return (mPhone.getRadioAccessFamily() & TelephonyManager.NETWORK_TYPE_BITMASK_NR) != 0;
    }

    // TODO: Remove this after b/176119724 is fixed. This is just a workaround to prevent
    // NET_CAPABILITY_TEMPORARILY_NOT_METERED incorrectly set on devices that are not supposed
    // to use 5G unmetered network. Currently TEMPORARILY_NOT_METERED can only happen on few devices
    // and carriers.
    private boolean isTempNotMeteredSupportedByCarrier() {
        CarrierConfigManager configManager =
                mPhone.getContext().getSystemService(CarrierConfigManager.class);
        if (configManager != null) {
            PersistableBundle bundle = configManager.getConfigForSubId(mPhone.getSubId());
            if (bundle != null) {
                return bundle.getBoolean(
                        CarrierConfigManager.KEY_NETWORK_TEMP_NOT_METERED_SUPPORTED_BOOL);
            }
        }

        return false;
    }

    // TODO: Remove this after b/176119724 is fixed. This is just a workaround to prevent
    // NET_CAPABILITY_TEMPORARILY_NOT_METERED incorrectly set on devices that are not supposed
    // to use 5G unmetered network. Currently TEMPORARILY_NOT_METERED can only happen on few devices
    // and carriers.
    private boolean isCampedOn5G() {
        TelephonyDisplayInfo displayInfo = mPhone.getDisplayInfoController()
                .getTelephonyDisplayInfo();
        int overrideNetworkType = displayInfo.getOverrideNetworkType();
        NetworkRegistrationInfo nri =  mPhone.getServiceState().getNetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        int networkType = nri == null ? TelephonyManager.NETWORK_TYPE_UNKNOWN
                : nri.getAccessNetworkTechnology();

        boolean isNrSa = networkType == TelephonyManager.NETWORK_TYPE_NR;
        boolean isNrNsa = (networkType == TelephonyManager.NETWORK_TYPE_LTE
                || networkType == TelephonyManager.NETWORK_TYPE_LTE_CA)
                && (overrideNetworkType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA
                || overrideNetworkType == TelephonyDisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE);
        boolean is5GHysteresisActive = mPhone.getDisplayInfoController().is5GHysteresisActive();

        // True if device is on NR SA or NR NSA, or neither but 5G hysteresis is active
        return isNrSa || isNrNsa || is5GHysteresisActive;
    }

    // TODO: Remove this after b/176119724 is fixed. This is just a workaround to prevent
    // NET_CAPABILITY_TEMPORARILY_NOT_METERED incorrectly set on devices that are not supposed
    // to use 5G unmetered network. Currently TEMPORARILY_NOT_METERED can only happen on few devices
    // and carriers.
    private boolean tempNotMeteredPossible() {
        return isDevice5GCapable() && isTempNotMeteredSupportedByCarrier() && isCampedOn5G();
    }

    protected void log(String s) {
        Rlog.d(mLogTag, s);
    }
@@ -5139,22 +5219,6 @@ public class DcTracker extends Handler {
                .build();
    }

    private void onDataServiceBindingChanged(boolean bound) {
        if (bound) {
            if (mDcc == null) {
                mDcc = DcController.makeDcc(mPhone, this, mDataServiceManager,
                        new Handler(mHandlerThread.getLooper()), mLogTagSuffix);
            }
            mDcc.start();
        } else {
            mDcc.dispose();
            // dispose sets the associated Handler object (StateMachine#mSmHandler) to null, so mDcc
            // needs to be created again (simply calling start() on it after dispose will not work)
            mDcc = null;
        }
        mDataServiceBound = bound;
    }

    public static String requestTypeToString(@RequestNetworkType int type) {
        switch (type) {
            case REQUEST_TYPE_NORMAL: return "NORMAL";
@@ -5220,7 +5284,7 @@ public class DcTracker extends Handler {
                        CarrierConfigManager.KEY_UNMETERED_NR_SA_MMWAVE_BOOL);
                mNrSaSub6Unmetered = b.getBoolean(
                        CarrierConfigManager.KEY_UNMETERED_NR_SA_SUB6_BOOL);
                mRoamingUnmetered = b.getBoolean(
                mNrNsaRoamingUnmetered = b.getBoolean(
                        CarrierConfigManager.KEY_UNMETERED_NR_NSA_WHEN_ROAMING_BOOL);
            }
        }
Loading