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

Commit 92f43906 authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge changes from topics "ccm_bw", "ccm_unmetered", "displayinfo" am: d7c77f27

Change-Id: I8709a527174af969484a1171d7416fa55c0c3a79
parents 0443a213 d7c77f27
Loading
Loading
Loading
Loading
+25 −2
Original line number Diff line number Diff line
@@ -222,6 +222,7 @@ public class ServiceStateTracker extends Handler {
    private RegistrantList mPsRestrictDisabledRegistrants = new RegistrantList();
    private RegistrantList mImsCapabilityChangedRegistrants = new RegistrantList();
    private RegistrantList mNrStateChangedRegistrants = new RegistrantList();
    private RegistrantList mNrFrequencyChangedRegistrants = new RegistrantList();

    /* Radio power off pending flag and tag counter */
    private boolean mPendingRadioPowerOffAfterDataOff = false;
@@ -1582,8 +1583,11 @@ public class ServiceStateTracker extends Handler {
                    }
                    mPhone.notifyPhysicalChannelConfiguration(list);
                    mLastPhysicalChannelConfigList = list;
                    boolean hasChanged =
                            updateNrFrequencyRangeFromPhysicalChannelConfigs(list, mSS);
                    boolean hasChanged = false;
                    if (updateNrFrequencyRangeFromPhysicalChannelConfigs(list, mSS)) {
                        mNrFrequencyChangedRegistrants.notifyRegistrants();
                        hasChanged = true;
                    }
                    if (updateNrStateFromPhysicalChannelConfigs(list, mSS)) {
                        mNrStateChangedRegistrants.notifyRegistrants();
                        hasChanged = true;
@@ -5642,6 +5646,25 @@ public class ServiceStateTracker extends Handler {
        mNrStateChangedRegistrants.remove(h);
    }

    /**
     * Registers for 5G NR frequency changed.
     * @param h handler to notify
     * @param what what code of message when delivered
     * @param obj placed in Message.obj
     */
    public void registerForNrFrequencyChanged(Handler h, int what, Object obj) {
        Registrant r = new Registrant(h, what, obj);
        mNrFrequencyChangedRegistrants.add(r);
    }

    /**
     * Unregisters for 5G NR frequency changed.
     * @param h handler to notify
     */
    public void unregisterForNrFrequencyChanged(Handler h) {
        mNrFrequencyChangedRegistrants.remove(h);
    }

    /**
     * Get the NR data connection context ids.
     *
+59 −41
Original line number Diff line number Diff line
@@ -321,8 +321,8 @@ public class DataConnection extends StateMachine {
    static final int EVENT_REEVALUATE_DATA_CONNECTION_PROPERTIES = BASE + 26;
    static final int EVENT_NR_STATE_CHANGED = BASE + 27;
    static final int EVENT_DATA_CONNECTION_METEREDNESS_CHANGED = BASE + 28;
    private static final int CMD_TO_STRING_COUNT =
            EVENT_DATA_CONNECTION_METEREDNESS_CHANGED - BASE + 1;
    static final int EVENT_NR_FREQUENCY_CHANGED = BASE + 29;
    private static final int CMD_TO_STRING_COUNT = EVENT_NR_FREQUENCY_CHANGED - BASE + 1;

    private static String[] sCmdToString = new String[CMD_TO_STRING_COUNT];
    static {
@@ -358,10 +358,10 @@ public class DataConnection extends StateMachine {
                "EVENT_REEVALUATE_RESTRICTED_STATE";
        sCmdToString[EVENT_REEVALUATE_DATA_CONNECTION_PROPERTIES - BASE] =
                "EVENT_REEVALUATE_DATA_CONNECTION_PROPERTIES";
        sCmdToString[EVENT_NR_STATE_CHANGED - BASE] =
                "EVENT_NR_STATE_CHANGED";
        sCmdToString[EVENT_NR_STATE_CHANGED - BASE] = "EVENT_NR_STATE_CHANGED";
        sCmdToString[EVENT_DATA_CONNECTION_METEREDNESS_CHANGED - BASE] =
                "EVENT_DATA_CONNECTION_METEREDNESS_CHANGED";
        sCmdToString[EVENT_NR_FREQUENCY_CHANGED - BASE] = "EVENT_NR_FREQUENCY_CHANGED";
    }
    // Convert cmd to string or null if unknown
    static String cmdToString(int cmd) {
@@ -747,8 +747,7 @@ public class DataConnection extends StateMachine {
     * @param isUnmetered whether this DC should be set to unmetered or not
     */
    public void onMeterednessChanged(boolean isUnmetered) {
        mUnmeteredOverride = isUnmetered;
        sendMessage(obtainMessage(EVENT_DATA_CONNECTION_METEREDNESS_CHANGED));
        sendMessage(obtainMessage(EVENT_DATA_CONNECTION_METEREDNESS_CHANGED, isUnmetered));
    }

    /**
@@ -1099,6 +1098,23 @@ public class DataConnection extends StateMachine {
        mLinkProperties.setTcpBufferSizes(sizes);
    }

    private void updateLinkBandwidths(NetworkCapabilities caps, int rilRat) {
        String ratName = ServiceState.rilRadioTechnologyToString(rilRat).toLowerCase(Locale.ROOT);
        if (ratName.equals("LTE") && isNRConnected()) {
            ratName = mPhone.getServiceState().getNrFrequencyRange()
                    == ServiceState.FREQUENCY_RANGE_MMWAVE ? "NR_NSA_MMWAVE" : "NR_NSA";
        }

        if (DBG) log("updateLinkBandwidths: " + ratName);

        Pair<Integer, Integer> values = mDct.getLinkBandwidths(ratName);
        if (values == null) {
            values = new Pair<>(14, 14);
        }
        caps.setLinkDownstreamBandwidthKbps(values.first);
        caps.setLinkUpstreamBandwidthKbps(values.second);
    }

    /**
     * Indicates if this data connection was established for unmetered use only. Note that this
     * flag should be populated when data becomes active. And if it is set to true, it can be set to
@@ -1311,29 +1327,7 @@ public class DataConnection extends StateMachine {
            result.removeCapability(NetworkCapabilities.NET_CAPABILITY_DUN);
        }

        int up = 14;
        int down = 14;
        switch (mRilRat) {
            case ServiceState.RIL_RADIO_TECHNOLOGY_GPRS: up = 80; down = 80; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_EDGE: up = 59; down = 236; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_UMTS: up = 384; down = 384; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_IS95A: // fall through
            case ServiceState.RIL_RADIO_TECHNOLOGY_IS95B: up = 14; down = 14; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_0: up = 153; down = 2457; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_A: up = 1843; down = 3174; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT: up = 100; down = 100; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_HSDPA: up = 2048; down = 14336; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_HSUPA: up = 5898; down = 14336; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_HSPA: up = 5898; down = 14336; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_EVDO_B: up = 1843; down = 5017; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_LTE: up = 51200; down = 102400; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_LTE_CA: up = 51200; down = 102400; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD: up = 153; down = 2516; break;
            case ServiceState.RIL_RADIO_TECHNOLOGY_HSPAP: up = 11264; down = 43008; break;
            default:
        }
        result.setLinkUpstreamBandwidthKbps(up);
        result.setLinkDownstreamBandwidthKbps(down);
        updateLinkBandwidths(result, mRilRat);

        result.setNetworkSpecifier(new TelephonyNetworkSpecifier.Builder()
                .setSubscriptionId(mSubId).build());
@@ -1568,6 +1562,8 @@ public class DataConnection extends StateMachine {
                    DataConnection.EVENT_DATA_CONNECTION_ROAM_OFF, null, true);
            mPhone.getServiceStateTracker().registerForNrStateChanged(getHandler(),
                    DataConnection.EVENT_NR_STATE_CHANGED, null);
            mPhone.getServiceStateTracker().registerForNrFrequencyChanged(getHandler(),
                    DataConnection.EVENT_NR_FREQUENCY_CHANGED, null);

            // Add ourselves to the list of data connections
            mDcController.addDc(DataConnection.this);
@@ -1582,6 +1578,8 @@ public class DataConnection extends StateMachine {

            mPhone.getServiceStateTracker().unregisterForDataRoamingOn(getHandler());
            mPhone.getServiceStateTracker().unregisterForDataRoamingOff(getHandler());
            mPhone.getServiceStateTracker().unregisterForNrStateChanged(getHandler());
            mPhone.getServiceStateTracker().unregisterForNrFrequencyChanged(getHandler());

            // Remove ourselves from the DC lists
            mDcController.removeDc(DataConnection.this);
@@ -1663,9 +1661,16 @@ public class DataConnection extends StateMachine {
                        mNetworkAgent.sendLinkProperties(mLinkProperties, DataConnection.this);
                    }
                    break;
                case EVENT_DATA_CONNECTION_METEREDNESS_CHANGED:
                    boolean isUnmetered = (boolean) msg.obj;
                    if (isUnmetered == mUnmeteredOverride) {
                        break;
                    }
                    mUnmeteredOverride = isUnmetered;
                    // fallthrough
                case EVENT_NR_FREQUENCY_CHANGED:
                case EVENT_DATA_CONNECTION_ROAM_ON:
                case EVENT_DATA_CONNECTION_ROAM_OFF:
                case EVENT_DATA_CONNECTION_METEREDNESS_CHANGED:
                case EVENT_DATA_CONNECTION_OVERRIDE_CHANGED:
                    updateNetworkInfo();
                    if (mNetworkAgent != null) {
@@ -2288,15 +2293,23 @@ public class DataConnection extends StateMachine {
                    if (ar.exception != null) {
                        log("EVENT_BW_REFRESH_RESPONSE: error ignoring, e=" + ar.exception);
                    } else {
                        final LinkCapacityEstimate lce = (LinkCapacityEstimate) ar.result;
                        boolean useModem = DctConstants.BANDWIDTH_SOURCE_MODEM_KEY.equals(
                                mPhone.getContext().getResources().getString(com.android.internal.R
                                        .string.config_bandwidthEstimateSource));
                        NetworkCapabilities nc = getNetworkCapabilities();
                        if (mPhone.getLceStatus() == RILConstants.LCE_ACTIVE) {
                        LinkCapacityEstimate lce = (LinkCapacityEstimate) ar.result;
                        if (useModem && mPhone.getLceStatus() == RILConstants.LCE_ACTIVE) {
                            if (lce.downlinkCapacityKbps != LinkCapacityEstimate.INVALID) {
                                nc.setLinkDownstreamBandwidthKbps(lce.downlinkCapacityKbps);
                            }
                            if (lce.uplinkCapacityKbps != LinkCapacityEstimate.INVALID) {
                                nc.setLinkUpstreamBandwidthKbps(lce.uplinkCapacityKbps);
                            }
                        }
                        if (mNetworkAgent != null) {
                            mNetworkAgent.sendNetworkCapabilities(nc, DataConnection.this);
                        }
                    }
                    }
                    retVal = HANDLED;
                    break;
                }
@@ -2412,14 +2425,19 @@ public class DataConnection extends StateMachine {
                    if (ar.exception != null) {
                        loge("EVENT_LINK_CAPACITY_CHANGED e=" + ar.exception);
                    } else {
                        LinkCapacityEstimate lce = (LinkCapacityEstimate) ar.result;
                        boolean useModem = DctConstants.BANDWIDTH_SOURCE_MODEM_KEY.equals(
                                mPhone.getContext().getResources().getString(com.android.internal.R
                                        .string.config_bandwidthEstimateSource));
                        NetworkCapabilities nc = getNetworkCapabilities();
                        if (useModem) {
                            LinkCapacityEstimate lce = (LinkCapacityEstimate) ar.result;
                            if (lce.downlinkCapacityKbps != LinkCapacityEstimate.INVALID) {
                                nc.setLinkDownstreamBandwidthKbps(lce.downlinkCapacityKbps);
                            }
                            if (lce.uplinkCapacityKbps != LinkCapacityEstimate.INVALID) {
                                nc.setLinkUpstreamBandwidthKbps(lce.uplinkCapacityKbps);
                            }
                        }
                        if (mNetworkAgent != null) {
                            mNetworkAgent.sendNetworkCapabilities(nc, DataConnection.this);
                        }
+101 −28
Original line number Diff line number Diff line
@@ -398,25 +398,35 @@ public class DcTracker extends Handler {
                if (mIccRecords.get() != null && mIccRecords.get().getRecordsLoaded()) {
                    setDefaultDataRoamingEnabled();
                }
                String nr5GIconConfiguration = CarrierConfigManager.getDefaultConfig().getString(
                        CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING);
                String[] bandwidths = CarrierConfigManager.getDefaultConfig().getStringArray(
                        CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY);
                boolean useLte = false;
                mDataIconPattern = CarrierConfigManager.getDefaultConfig().getString(
                        CarrierConfigManager.KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING);
                CarrierConfigManager configManager = (CarrierConfigManager) mPhone.getContext()
                        .getSystemService(Context.CARRIER_CONFIG_SERVICE);
                if (configManager != null) {
                    PersistableBundle b = configManager.getConfigForSubId(mPhone.getSubId());
                    if (b != null) {
                        String nr5GIconConfiguration = b.getString(
                                CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING);
                        if (nr5GIconConfiguration == null) {
                            nr5GIconConfiguration =
                                    CarrierConfigManager.getDefaultConfig().getString(
                        if (b.getString(CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING)
                                != null) {
                            nr5GIconConfiguration = b.getString(
                                    CarrierConfigManager.KEY_5G_ICON_CONFIGURATION_STRING);
                        }
                        process5GIconMapping(nr5GIconConfiguration);
                        if (b.getString(CarrierConfigManager
                                .KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING) != null) {
                            mDataIconPattern = b.getString(
                                    CarrierConfigManager.KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING);
                        if (mDataIconPattern == null) {
                            mDataIconPattern = CarrierConfigManager.getDefaultConfig().getString(
                                    CarrierConfigManager.KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING);
                        }
                        if (b.getStringArray(CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY)
                                != null) {
                            bandwidths = b.getStringArray(
                                    CarrierConfigManager.KEY_BANDWIDTH_STRING_ARRAY);
                        }
                        useLte = b.getBoolean(CarrierConfigManager
                                .KEY_BANDWIDTH_NR_NSA_USE_LTE_VALUE_FOR_UPSTREAM_BOOL);
                        mHysteresisTimeSec = b.getInt(
                                CarrierConfigManager.KEY_5G_ICON_DISPLAY_GRACE_PERIOD_SEC_INT);
                        mWatchdogTimeMs = b.getLong(
@@ -429,30 +439,15 @@ public class DcTracker extends Handler {
                                CarrierConfigManager.KEY_UNMETERED_NR_NSA_SUB6_BOOL);
                    }
                }
                sendMessage(obtainMessage(DctConstants.EVENT_UPDATE_CARRIER_CONFIGS,
                        useLte ? 1 : 0, 0 /* unused */,
                        new Pair<>(bandwidths, nr5GIconConfiguration)));
            } else {
                if (DBG) log("onReceive: Unknown action=" + action);
            }
        }
    };

    private void process5GIconMapping(String config) {
        m5GIconMapping.clear();
        for (String pair : config.trim().split(",")) {
            String[] kv = (pair.trim().toLowerCase()).split(":");
            if (kv.length != 2) {
                if (DBG) log("Invalid 5G icon configuration, config = " + pair);
                continue;
            }
            int value = DisplayInfo.OVERRIDE_NETWORK_TYPE_NONE;
            if (kv[1].equals("5g")) {
                value = DisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA;
            } else if (kv[1].equals("5g_plus")) {
                value = DisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE;
            }
            m5GIconMapping.put(kv[0], value);
        }
    }

    private final Runnable mPollNetStat = new Runnable() {
        @Override
        public void run() {
@@ -704,6 +699,10 @@ public class DcTracker extends Handler {

    private ArrayList<DataProfile> mLastDataProfileList = new ArrayList<>();

    /** RAT name ===> (downstream, upstream) bandwidth values from carrier config. */
    private final ConcurrentHashMap<String, Pair<Integer, Integer>> mBandwidths =
            new ConcurrentHashMap<>();

    /**
     * Handles changes to the APN db.
     */
@@ -3901,6 +3900,11 @@ public class DcTracker extends Handler {
                mWatchdog = false;
                reevaluateUnmeteredConnections();
                break;
            case DctConstants.EVENT_UPDATE_CARRIER_CONFIGS:
                Pair<String[], String> configPair = (Pair<String[], String>) msg.obj;
                updateLinkBandwidths(configPair.first, msg.arg1 == 1);
                update5GIconMapping(configPair.second);
                break;
            default:
                Rlog.e("DcTracker", "Unhandled event=" + msg);
                break;
@@ -3970,6 +3974,75 @@ public class DcTracker extends Handler {
        }
    }

    /**
     * Update link bandwidth estimate default values from carrier config.
     * @param bandwidths String array of "RAT:upstream,downstream" for each RAT
     * @param useLte For NR NSA, whether to use LTE value for upstream or not
     */
    private void updateLinkBandwidths(String[] bandwidths, boolean useLte) {
        synchronized (mBandwidths) {
            mBandwidths.clear();
            for (String config : bandwidths) {
                int downstream = 14;
                int upstream = 14;
                String[] kv = config.split(":");
                if (kv.length == 2) {
                    String[] split = kv[1].split(",");
                    if (split.length == 2) {
                        try {
                            downstream = Integer.parseInt(split[0]);
                            upstream = Integer.parseInt(split[1]);
                        } catch (NumberFormatException ignored) {
                        }
                    }
                    mBandwidths.put(kv[0], new Pair<>(downstream, upstream));
                }
            }
            if (useLte) {
                Pair<Integer, Integer> ltePair = mBandwidths.get("LTE");
                if (ltePair != null) {
                    if (mBandwidths.containsKey("NR_NSA")) {
                        mBandwidths.put("NR_NSA",
                                new Pair<>(mBandwidths.get("NR_NSA").first, ltePair.second));
                    }
                    if (mBandwidths.containsKey("NR_NSA_MMWAVE")) {
                        mBandwidths.put("NR_NSA_MMWAVE",
                                new Pair<>(mBandwidths.get("NR_NSA_MMWAVE").first, ltePair.second));
                    }
                }
            }
        }
    }

    /**
     * Return the link upstream/downstream values from CarrierConfig for the given RAT name.
     * @param ratName RAT name from ServiceState#rilRadioTechnologyToString.
     * @return pair of downstream/upstream values (kbps), or null if the config is not defined.
     */
    public Pair<Integer, Integer> getLinkBandwidths(String ratName) {
        return mBandwidths.get(ratName);
    }

    private void update5GIconMapping(String config) {
        synchronized (m5GIconMapping) {
            m5GIconMapping.clear();
            for (String pair : config.trim().split(",")) {
                String[] kv = (pair.trim().toLowerCase()).split(":");
                if (kv.length != 2) {
                    if (DBG) log("Invalid 5G icon configuration, config = " + pair);
                    continue;
                }
                int value = DisplayInfo.OVERRIDE_NETWORK_TYPE_NONE;
                if (kv[1].equals("5g")) {
                    value = DisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA;
                } else if (kv[1].equals("5g_plus")) {
                    value = DisplayInfo.OVERRIDE_NETWORK_TYPE_NR_NSA_MMWAVE;
                }
                m5GIconMapping.put(kv[0], value);
            }
        }
    }

    /**
     * Update DcTracker.
     *