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

Commit 19078ae0 authored by Tomita, Ryounosuke X's avatar Tomita, Ryounosuke X Committed by sqian
Browse files

Improve LTE signal bar level with flexible RSRQ and RSSNR threshold

Current AOSP LTE signal bar has following limitation:
- For Threshold type, "RSRP & RSSNR" or "RSRP only" are selectable,
  but "RSRP & RSRQ" is unavailable.
- For threshold value, RSRP is flexible by carrier config,
  but RSSNR is hard-coded.
- The signal strength reporting criteria apply to only the RSRP.

This change allows following customizations by new carrier config:
- Threshold type can select "RSRP & RSRQ" too.
- Threshold value of RSRQ and RSSNR can be flexible.
- RSRQ and RSSNR thresholds can set signal strength reporting criteria.

Test: auto - Confirmed that run
FrameworksTelephonyTests#testSignalStrength and it has no problem.
Test: auto - Confirmed that run
FrameworksTelephonyTests#SignalThresholdInfoTest and it has no problem.
Bug: 133400544

Change-Id: I37d0dc5ff41169b0309cfaabaa0f2595894b3749
Merged-In: I37d0dc5ff41169b0309cfaabaa0f2595894b3749
parent b2d8eb58
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -44448,6 +44448,8 @@ package android.telephony {
    field public static final String KEY_IMS_CONFERENCE_SIZE_LIMIT_INT = "ims_conference_size_limit_int";
    field public static final String KEY_IMS_DTMF_TONE_DELAY_INT = "ims_dtmf_tone_delay_int";
    field public static final String KEY_IS_IMS_CONFERENCE_SIZE_ENFORCED_BOOL = "is_ims_conference_size_enforced_bool";
    field public static final String KEY_LTE_RSRQ_THRESHOLDS_INT_ARRAY = "lte_rsrq_thresholds_int_array";
    field public static final String KEY_LTE_RSSNR_THRESHOLDS_INT_ARRAY = "lte_rssnr_thresholds_int_array";
    field public static final String KEY_MDN_IS_ADDITIONAL_VOICEMAIL_NUMBER_BOOL = "mdn_is_additional_voicemail_number_bool";
    field public static final String KEY_MMS_ALIAS_ENABLED_BOOL = "aliasEnabled";
    field public static final String KEY_MMS_ALIAS_MAX_CHARS_INT = "aliasMaxChars";
+80 −0
Original line number Diff line number Diff line
@@ -2317,12 +2317,40 @@ public class CarrierConfigManager {
    /**
     * Determine whether to use only RSRP for the number of LTE signal bars.
     * @hide
     *
     * @deprecated use {@link #KEY_PARAMETERS_USED_FOR_LTE_SIGNAL_BAR_INT}.
     */
    // FIXME: this key and related keys must not be exposed without a consistent philosophy for
    // all RATs.
    @Deprecated
    public static final String KEY_USE_ONLY_RSRP_FOR_LTE_SIGNAL_BAR_BOOL =
            "use_only_rsrp_for_lte_signal_bar_bool";

    /**
     * Bit-field integer to determine whether to use Reference Signal Received Power (RSRP),
     * Reference Signal Received Quality (RSRQ), or/and Reference Signal Signal to Noise Ratio
     * (RSSNR) for the number of LTE signal bars and signal criteria reporting enabling.
     *
     * <p> If a measure is not set, signal criteria reporting from modem will not be triggered and
     * not be used for calculating signal level. If multiple measures are set bit, the parameter
     * whose value is smallest is used to indicate the signal level.
     *
     *  RSRP = 1 << 0,
     *  RSRQ = 1 << 1,
     *  RSSNR = 1 << 2,
     *
     *  The value of this key must be bitwise OR of {@link CellSignalStrengthLte#USE_RSRP},
     *  {@link CellSignalStrengthLte#USE_RSRQ}, {@link CellSignalStrengthLte#USE_RSSNR}.
     *
     * For example, if both RSRP and RSRQ are used, the value of key is 3 (1 << 0 | 1 << 1).
     * If the key is invalid or not configured, a default value (RSRP | RSSNR = 1 << 0 | 1 << 2)
     * will apply.
     *
     * @hide
     */
    public static final String KEY_PARAMETERS_USED_FOR_LTE_SIGNAL_BAR_INT =
            "parameters_used_for_lte_signal_bar_int";

    /**
     * List of 4 customized 5G SS reference signal received power (SSRSRP) thresholds.
     *
@@ -2625,6 +2653,42 @@ public class CarrierConfigManager {
    public static final String KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY =
            "lte_rsrp_thresholds_int_array";

    /**
     * A list of 4 customized LTE Reference Signal Received Quality (RSRQ) thresholds.
     *
     * Reference: TS 136.133 v12.6.0 section 9.1.7 - RSRQ Measurement Report Mapping.
     *
     * 4 threshold integers must be within the boundaries [-34 dB, 3 dB], and the levels are:
     *     "NONE: [-34, threshold1)"
     *     "POOR: [threshold1, threshold2)"
     *     "MODERATE: [threshold2, threshold3)"
     *     "GOOD:  [threshold3, threshold4)"
     *     "EXCELLENT:  [threshold4, 3]"
     *
     * This key is considered invalid if the format is violated. If the key is invalid or
     * not configured, a default value set will apply.
     */
    public static final String KEY_LTE_RSRQ_THRESHOLDS_INT_ARRAY =
            "lte_rsrq_thresholds_int_array";

    /**
     * A list of 4 customized LTE Reference Signal Signal to Noise Ratio (RSSNR) thresholds.
     *
     * 4 threshold integers must be within the boundaries [-200, 300], and the levels are:
     *     "NONE: [-200, threshold1)"
     *     "POOR: [threshold1, threshold2)"
     *     "MODERATE: [threshold2, threshold3)"
     *     "GOOD:  [threshold3, threshold4)"
     *     "EXCELLENT:  [threshold4, 300]"
     * Note: the unit of the values is 10*db; it is derived by multiplying 10 on the original dB
     * value reported by modem.
     *
     * This key is considered invalid if the format is violated. If the key is invalid or
     * not configured, a default value set will apply.
     */
    public static final String KEY_LTE_RSSNR_THRESHOLDS_INT_ARRAY =
            "lte_rssnr_thresholds_int_array";

    /**
     * Decides when clients try to bind to iwlan network service, which package name will
     * the binding intent go to.
@@ -3697,6 +3761,20 @@ public class CarrierConfigManager {
                        -108, /* SIGNAL_STRENGTH_GOOD */
                        -98,  /* SIGNAL_STRENGTH_GREAT */
                });
        sDefaults.putIntArray(KEY_LTE_RSRQ_THRESHOLDS_INT_ARRAY,
                new int[] {
                        -19, /* SIGNAL_STRENGTH_POOR */
                        -17, /* SIGNAL_STRENGTH_MODERATE */
                        -14, /* SIGNAL_STRENGTH_GOOD */
                        -12  /* SIGNAL_STRENGTH_GREAT */
                });
        sDefaults.putIntArray(KEY_LTE_RSSNR_THRESHOLDS_INT_ARRAY,
                new int[] {
                        -30, /* SIGNAL_STRENGTH_POOR */
                        10,  /* SIGNAL_STRENGTH_MODERATE */
                        45,  /* SIGNAL_STRENGTH_GOOD */
                        130  /* SIGNAL_STRENGTH_GREAT */
                });
        sDefaults.putIntArray(KEY_WCDMA_RSCP_THRESHOLDS_INT_ARRAY,
                new int[] {
                        -115,  /* SIGNAL_STRENGTH_POOR */
@@ -3791,6 +3869,8 @@ public class CarrierConfigManager {
                new int[] {4 /* BUSY */});
        sDefaults.putBoolean(KEY_PREVENT_CLIR_ACTIVATION_AND_DEACTIVATION_CODE_BOOL, false);
        sDefaults.putLong(KEY_DATA_SWITCH_VALIDATION_TIMEOUT_LONG, 2000);
        sDefaults.putInt(KEY_PARAMETERS_USED_FOR_LTE_SIGNAL_BAR_INT,
                CellSignalStrengthLte.USE_RSRP | CellSignalStrengthLte.USE_RSSNR);
    }

    /**
+159 −71
Original line number Diff line number Diff line
@@ -55,6 +55,25 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
    private static final int MAX_LTE_RSRP = -44;
    private static final int MIN_LTE_RSRP = -140;

    /**
     * Indicates RSRP is considered for {@link #getLevel()} and reported from modem.
     *
     * @hide
     */
    public static final int USE_RSRP = 1 << 0;
    /**
     * Indicates RSRQ is considered for {@link #getLevel()} and reported from modem.
     *
     * @hide
     */
    public static final int USE_RSRQ = 1 << 1;
    /**
     * Indicates RSSNR is considered for {@link #getLevel()} and reported from modem.
     *
     * @hide
     */
    public static final int USE_RSSNR = 1 << 2;

    @UnsupportedAppUsage(maxTargetSdk = android.os.Build.VERSION_CODES.P)
    private int mSignalStrength; // To be removed
    private int mRssi;
@@ -70,6 +89,21 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
    private int mTimingAdvance;
    private int mLevel;

    /**
     * Bit-field integer to determine whether to use Reference Signal Received Power (RSRP),
     * Reference Signal Received Quality (RSRQ), and/or Reference Signal Signal to Noise Ratio
     * (RSSNR) for the number of LTE signal bars. If multiple measures are set, the parameter
     * whose signal level value is smallest is used to indicate the signal level.
     *
     *  RSRP = 1 << 0,
     *  RSRQ = 1 << 1,
     *  RSSNR = 1 << 2,
     *
     * For example, if both RSRP and RSRQ are used, the value of key is 3 (1 << 0 | 1 << 1).
     * If the key is invalid or not configured, a default value (RSRP = 1 << 0) will apply.
     */
    private int mParametersUseForLevel;

    /** @hide */
    @UnsupportedAppUsage
    public CellSignalStrengthLte() {
@@ -81,7 +115,7 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
     *
     * @param rssi in dBm [-113,-51], UNKNOWN
     * @param rsrp in dBm [-140,-43], UNKNOWN
     * @param rsrq in dB [-20,-3], UNKNOWN
     * @param rsrq in dB [-34, 3], UNKNOWN
     * @param rssnr in 10*dB [-200, +300], UNKNOWN
     * @param cqi [0, 15], UNKNOWN
     * @param timingAdvance [0, 1282], UNKNOWN
@@ -94,7 +128,7 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
        mRssi = inRangeOrUnavailable(rssi, -113, -51);
        mSignalStrength = mRssi;
        mRsrp = inRangeOrUnavailable(rsrp, -140, -43);
        mRsrq = inRangeOrUnavailable(rsrq, -20, -3);
        mRsrq = inRangeOrUnavailable(rsrq, -34, 3);
        mRssnr = inRangeOrUnavailable(rssnr, -200, 300);
        mCqi = inRangeOrUnavailable(cqi, 0, 15);
        mTimingAdvance = inRangeOrUnavailable(timingAdvance, 0, 1282);
@@ -125,6 +159,7 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
        mCqi = s.mCqi;
        mTimingAdvance = s.mTimingAdvance;
        mLevel = s.mLevel;
        mParametersUseForLevel = s.mParametersUseForLevel;
    }

    /** @hide */
@@ -144,6 +179,7 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
        mCqi = CellInfo.UNAVAILABLE;
        mTimingAdvance = CellInfo.UNAVAILABLE;
        mLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
        mParametersUseForLevel = USE_RSRP | USE_RSSNR;
    }

    /** {@inheritDoc} */
@@ -154,102 +190,153 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
    }

    // Lifted from Default carrier configs and max range of RSRP
    private static final int[] sThresholds = new int[]{-115, -105, -95, -85};
    private static final int[] sRsrpThresholds = new int[] {
            -115, /* SIGNAL_STRENGTH_POOR */
            -105, /* SIGNAL_STRENGTH_MODERATE */
            -95,  /* SIGNAL_STRENGTH_GOOD */
            -85   /* SIGNAL_STRENGTH_GREAT */
    };

    // Lifted from Default carrier configs and max range of RSRQ
    private static final int[] sRsrqThresholds = new int[] {
            -19, /* SIGNAL_STRENGTH_POOR */
            -17, /* SIGNAL_STRENGTH_MODERATE */
            -14, /* SIGNAL_STRENGTH_GOOD */
            -12  /* SIGNAL_STRENGTH_GREAT */
    };
    // Lifted from Default carrier configs and max range of RSSNR
    private static final int[] sRssnrThresholds = new int[] {
            -30, /* SIGNAL_STRENGTH_POOR */
            10,  /* SIGNAL_STRENGTH_MODERATE */
            45,  /* SIGNAL_STRENGTH_GOOD */
            130  /* SIGNAL_STRENGTH_GREAT */
    };
    private static final int sRsrpBoost = 0;

    /**
     * Checks if the given parameter type is considered to use for {@link #getLevel()}.
     *
     * Note: if multiple parameter types are considered, the smaller level for one of the
     * parameters would be returned by {@link #getLevel()}
     *
     * @param parameterType bitwise OR of {@link #USE_RSRP}, {@link #USE_RSRQ},
     *         {@link #USE_RSSNR}
     * @return {@code true} if the level is calculated based on the given parameter type;
     *      {@code false} otherwise.
     */
    private boolean isLevelForParameter(int parameterType) {
        return (parameterType & mParametersUseForLevel) == parameterType;
    }

    /** @hide */
    @Override
    public void updateLevel(PersistableBundle cc, ServiceState ss) {
        int[] thresholds;
        int[] rsrpThresholds, rsrqThresholds, rssnrThresholds;
        boolean rsrpOnly;
        if (cc == null) {
            thresholds = sThresholds;
            mParametersUseForLevel = USE_RSRP | USE_RSSNR;
            rsrpThresholds = sRsrpThresholds;
            rsrqThresholds = sRsrqThresholds;
            rssnrThresholds = sRssnrThresholds;
            rsrpOnly = false;
        } else {
            mParametersUseForLevel = cc.getInt(
                    CarrierConfigManager.KEY_PARAMETERS_USED_FOR_LTE_SIGNAL_BAR_INT);
            Rlog.i(LOG_TAG, "Using signal strength level: " + mParametersUseForLevel);
            rsrpThresholds = cc.getIntArray(
                    CarrierConfigManager.KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY);
            if (rsrpThresholds == null) rsrpThresholds = sRsrpThresholds;
            Rlog.i(LOG_TAG, "Applying LTE RSRP Thresholds: " + Arrays.toString(rsrpThresholds));
            rsrqThresholds = cc.getIntArray(
                    CarrierConfigManager.KEY_LTE_RSRQ_THRESHOLDS_INT_ARRAY);
            if (rsrqThresholds == null) rsrqThresholds = sRsrqThresholds;
            Rlog.i(LOG_TAG, "Applying LTE RSRQ Thresholds: " + Arrays.toString(rsrqThresholds));
            rssnrThresholds = cc.getIntArray(
                    CarrierConfigManager.KEY_LTE_RSSNR_THRESHOLDS_INT_ARRAY);
            if (rssnrThresholds == null) rssnrThresholds = sRssnrThresholds;
            Rlog.i(LOG_TAG, "Applying LTE RSSNR Thresholds: " + Arrays.toString(rssnrThresholds));
            rsrpOnly = cc.getBoolean(
                    CarrierConfigManager.KEY_USE_ONLY_RSRP_FOR_LTE_SIGNAL_BAR_BOOL, false);
            thresholds = cc.getIntArray(
                    CarrierConfigManager.KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY);
            if (thresholds == null) thresholds = sThresholds;
            if (DBG) log("updateLevel() carrierconfig - rsrpOnly="
                    + rsrpOnly + ", thresholds=" + Arrays.toString(thresholds));
        }


        int rsrpBoost = 0;
        if (ss != null) {
            rsrpBoost = ss.getLteEarfcnRsrpBoost();
        }

        int rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
        int rsrpIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
        int snrIconLevel = -1;

        int rsrp = mRsrp + rsrpBoost;

        if (rsrp < MIN_LTE_RSRP || rsrp > MAX_LTE_RSRP) {
            rsrpIconLevel = -1;
        } else {
            rsrpIconLevel = thresholds.length;
            while (rsrpIconLevel > 0 && rsrp < thresholds[rsrpIconLevel - 1]) rsrpIconLevel--;
        }
        int rsrp = inRangeOrUnavailable(mRsrp + rsrpBoost, MIN_LTE_RSRP, MAX_LTE_RSRP);

        if (rsrpOnly) {
            if (DBG) log("updateLevel() - rsrp = " + rsrpIconLevel);
            if (rsrpIconLevel != -1) {
                mLevel = rsrpIconLevel;
            int level = updateLevelWithMeasure(rsrp, rsrpThresholds);
            if (DBG) log("updateLevel() - rsrp = " + level);
            if (level != SignalStrength.INVALID) {
                mLevel = level;
                return;
            }
        }

        /*
         * Values are -200 dB to +300 (SNR*10dB) RS_SNR >= 13.0 dB =>4 bars 4.5
         * dB <= RS_SNR < 13.0 dB => 3 bars 1.0 dB <= RS_SNR < 4.5 dB => 2 bars
         * -3.0 dB <= RS_SNR < 1.0 dB 1 bar RS_SNR < -3.0 dB/No Service Antenna
         * Icon Only
         */
        if (mRssnr > 300) snrIconLevel = -1;
        else if (mRssnr >= 130) snrIconLevel = SIGNAL_STRENGTH_GREAT;
        else if (mRssnr >= 45) snrIconLevel = SIGNAL_STRENGTH_GOOD;
        else if (mRssnr >= 10) snrIconLevel = SIGNAL_STRENGTH_MODERATE;
        else if (mRssnr >= -30) snrIconLevel = SIGNAL_STRENGTH_POOR;
        else if (mRssnr >= -200)
            snrIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;

        if (DBG) log("updateLevel() - rsrp:" + mRsrp + " snr:" + mRssnr + " rsrpIconLevel:"
                + rsrpIconLevel + " snrIconLevel:" + snrIconLevel
                + " lteRsrpBoost:" + sRsrpBoost);

        /* Choose a measurement type to use for notification */
        if (snrIconLevel != -1 && rsrpIconLevel != -1) {
            /*
             * The number of bars displayed shall be the smaller of the bars
             * associated with LTE RSRP and the bars associated with the LTE
             * RS_SNR
             */
            mLevel = (rsrpIconLevel < snrIconLevel ? rsrpIconLevel : snrIconLevel);
            return;
        }
        int rsrpLevel = SignalStrength.INVALID;
        int rsrqLevel = SignalStrength.INVALID;
        int rssnrLevel = SignalStrength.INVALID;

        if (snrIconLevel != -1) {
            mLevel = snrIconLevel;
            return;
        if (isLevelForParameter(USE_RSRP)) {
            rsrpLevel = updateLevelWithMeasure(rsrp, rsrpThresholds);
            Rlog.i(LOG_TAG, "Updated 4G LTE RSRP Level: " + rsrpLevel);
        }
        if (isLevelForParameter(USE_RSRQ)) {
            rsrqLevel = updateLevelWithMeasure(mRsrq, rsrqThresholds);
            Rlog.i(LOG_TAG, "Updated 4G LTE RSRQ Level: " + rsrqLevel);
        }
        if (isLevelForParameter(USE_RSSNR)) {
            rssnrLevel = updateLevelWithMeasure(mRssnr, rssnrThresholds);
            Rlog.i(LOG_TAG, "Updated 4G LTE RSSNR Level: " + rssnrLevel);
        }
        // Apply the smaller value among three levels of three measures.
        mLevel = Math.min(Math.min(rsrpLevel, rsrqLevel), rssnrLevel);

        if (rsrpIconLevel != -1) {
            mLevel = rsrpIconLevel;
            return;
        if (mLevel == SignalStrength.INVALID) {
            int rssiLevel;
            if (mRssi > -51) {
                rssiLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
            } else if (mRssi >= -89) {
                rssiLevel = SIGNAL_STRENGTH_GREAT;
            } else if (mRssi >= -97) {
                rssiLevel = SIGNAL_STRENGTH_GOOD;
            } else if (mRssi >= -103) {
                rssiLevel = SIGNAL_STRENGTH_MODERATE;
            } else if (mRssi >= -113) {
                rssiLevel = SIGNAL_STRENGTH_POOR;
            } else {
                rssiLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
            }
            if (DBG) log("getLteLevel - rssi:" + mRssi + " rssiIconLevel:" + rssiLevel);
            mLevel = rssiLevel;
        }
    }

        if (mRssi > -51) rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
        else if (mRssi >= -89) rssiIconLevel = SIGNAL_STRENGTH_GREAT;
        else if (mRssi >= -97) rssiIconLevel = SIGNAL_STRENGTH_GOOD;
        else if (mRssi >= -103) rssiIconLevel = SIGNAL_STRENGTH_MODERATE;
        else if (mRssi >= -113) rssiIconLevel = SIGNAL_STRENGTH_POOR;
        else rssiIconLevel = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
        if (DBG) log("getLteLevel - rssi:" + mRssi + " rssiIconLevel:"
                + rssiIconLevel);
        mLevel = rssiIconLevel;
    /**
     * Update level with corresponding measure and thresholds.
     *
     * @param measure corresponding signal measure
     * @param thresholds corresponding signal thresholds
     * @return level of the signal strength
     */
    private int updateLevelWithMeasure(int measure, int[] thresholds) {
        int level;
        if (measure == CellInfo.UNAVAILABLE) {
            level = SignalStrength.INVALID;
        } else if (measure >= thresholds[3]) {
            level = SIGNAL_STRENGTH_GREAT;
        } else if (measure >= thresholds[2]) {
            level = SIGNAL_STRENGTH_GOOD;
        } else if (measure >= thresholds[1]) {
            level = SIGNAL_STRENGTH_MODERATE;
        } else if (measure >= thresholds[0]) {
            level = SIGNAL_STRENGTH_POOR;
        } else {
            level = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
        }
        return level;
    }

    /**
@@ -386,7 +473,8 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
                + " rssnr=" + mRssnr
                + " cqi=" + mCqi
                + " ta=" + mTimingAdvance
                + " level=" + mLevel;
                + " level=" + mLevel
                + " parametersUseForLevel=" + mParametersUseForLevel;
    }

    /** Implement the Parcelable interface */