blob: 304c1824440905f1b0f64592111f76e8feb3f0a2 [file] [log] [blame]
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.qns;
import static com.android.qns.QnsConstants.MIN_THRESHOLD_GAP;
import static com.android.qns.QnsConstants.POLICY_BAD;
import static com.android.qns.QnsConstants.POLICY_GOOD;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.os.PersistableBundle;
import android.telephony.SignalThresholdInfo;
import android.util.Log;
import android.util.SparseArray;
import java.util.Arrays;
import java.util.HashMap;
/**
* This class supports loading QnsConfigArray of Thresholds & Policies (Good, Bad ,Worst) values
* in case of cellular & (Good,Bad) in case of Wi-Fi Thresholds defined .
*/
public class QnsCarrierAnspSupportConfig {
/**
* List of 3 customized eutran(4g) RSRP thresholds to be considered for rove-in & rove-out in
* 4G(VoLTE registered) & in idle state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSRP}
* <p>
* 3 threshold integers must be within the boundaries
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSRP_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSRP_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_RSRP_GOOD}"</LI>
* <LI>"Bad: {@link QnsConstants#KEY_DEFAULT_THRESHOLD_RSRP_BAD}"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_IDLE_EUTRAN_RSRP_INT_ARRAY = "qns.idle_eutran_rsrp_int_array";
/**
* List of 3 customized eutran(4g) RSRP thresholds to be considered for rove-in & rove-out in
* 4G (VoLTE) & in voice call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSRP}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSRP_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSRP_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_RSRP_GOOD}"</LI>
* <LI>"Bad: {@link QnsConstants#KEY_DEFAULT_THRESHOLD_RSRP_BAD}"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VOICE_EUTRAN_RSRP_INT_ARRAY = "qns.voice_eutran_rsrp_int_array";
/**
* List of 3 customized eutran(4g) RSRP thresholds to be considered for rove-in & rove-out in
* 4G (VoLTE) & in video call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSRP}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSRP_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSRP_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VIDEO_EUTRAN_RSRP_INT_ARRAY = "qns.video_eutran_rsrp_int_array";
/**
* List of 3 customized eutran(4g) RSRQ thresholds to be considered for rove-in & rove-out in
* 4G(VoLTE registered) & in idle state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSRQ}
* <p>
* 3 threshold integers must be within the boundaries
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSRQ_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSRQ_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"</LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_IDLE_EUTRAN_RSRQ_INT_ARRAY = "qns.idle_eutran_rsrq_int_array";
/**
* List of 3 customized eutran(4g) RSRQ thresholds to be considered for rove-in & rove-out in
* 4G(VoLTE) & in Voice Call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSRQ}
* <p>
* 3 threshold integers must be within the boundaries
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSRQ_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSRQ_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"</LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VOICE_EUTRAN_RSRQ_INT_ARRAY = "qns.voice_eutran_rsrq_int_array";
/**
* List of 3 customized eutran(4g) RSRQ thresholds to be considered for rove-in & rove-out in
* 4G(VoLTE) & in Video Call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSRQ}
* <p>
* 3 threshold integers must be within the boundaries
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSRQ_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSRQ_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"</LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VIDEO_EUTRAN_RSRQ_INT_ARRAY = "qns.video_eutran_rsrq_int_array";
/**
* List of 3 customized eutran(4g) RSSNR thresholds to be considered for rove-in & rove-out in
* 4G(VoLTE registered) & in idle state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSSNR}
* <p>
* 3 threshold integers must be within the boundaries
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSSNR_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSSNR_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"</LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_IDLE_EUTRAN_RSSNR_INT_ARRAY = "qns.idle_eutran_rssnr_int_array";
/**
* List of 3 customized eutran(4g) RSSNR thresholds to be considered for rove-in & rove-out in
* 4G(VoLTE registered) & in Voice Call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSSNR}
* <p>
* 3 threshold integers must be within the boundaries
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSSNR_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSSNR_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"</LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VOICE_EUTRAN_RSSNR_INT_ARRAY =
"qns.voice_eutran_rssnr_int_array";
/**
* List of 3 customized eutran(4g) RSSNR thresholds to be considered for rove-in & rove-out in
* 4G(VoLTE registered) & in Video Call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSSNR}
* <p>
* 3 threshold integers must be within the boundaries
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSSNR_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSSNR_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"</LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VIDEO_EUTRAN_RSSNR_INT_ARRAY =
"qns.video_eutran_rssnr_int_array";
/**
* List of 3 customized ngran(5g) SSRSRP thresholds to be considered for rove-in & rove-out in
* 5g(VoNR registered) & in idle state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_SSRSRP}
* <p>
* 3 threshold integers must be within the boundaries
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_SSRSRP_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_SSRSRP_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_SSRSRP_GOOD}"</LI>
* <LI>"Bad: {@link QnsConstants#KEY_DEFAULT_THRESHOLD_SSRSRP_BAD}"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_IDLE_NGRAN_SSRSRP_INT_ARRAY = "qns.idle_ngran_ssrsrp_int_array";
/**
* List of 3 customized ngran(5g) SSRSRP thresholds to be considered for rove-in & rove-out in
* 5g(VoNR) & in voice call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_SSRSRP}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_SSRSRP_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_SSRSRP_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_SSRSRP_GOOD}"</LI>
* <LI>"Bad: {@link QnsConstants#KEY_DEFAULT_THRESHOLD_SSRSRP_BAD}"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VOICE_NGRAN_SSRSRP_INT_ARRAY =
"qns.voice_ngran_ssrsrp_int_array";
/**
* List of 3 customized ngran(5g) SSRSRP thresholds to be considered for rove-in & rove-out in
* 5G (VoNR) & in video call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_SSRSRP}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_SSRSRP_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_SSRSRP_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VIDEO_NGRAN_SSRSRP_INT_ARRAY =
"qns.video_ngran_ssrsrp_int_array";
/**
* List of 3 customized ngran(5g) SSRSRQ thresholds to be considered for rove-in & rove-out in
* 5G (VoNR) & in idle state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_SSRSRQ}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_SSRSRQ_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_SSRSRQ_MAX_VALUE}
*
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_IDLE_NGRAN_SSRSRQ_INT_ARRAY = "qns.idle_ngran_ssrsrq_int_array";
/**
* List of 3 customized ngran(5g) SSRSRQ thresholds to be considered for rove-in & rove-out in
* 5G (VoNR) & in voice call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_SSRSRQ}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_SSRSRQ_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_SSRSRQ_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VOICE_NGRAN_SSRSRQ_INT_ARRAY =
"qns.voice_ngran_ssrsrq_int_array";
/**
* List of 3 customized ngran(5g) SSRSRQ thresholds to be considered for rove-in & rove-out in
* 5G (VoNR) & in video call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_SSRSRQ}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_SSRSRQ_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_SSRSRQ_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VIDEO_NGRAN_SSRSRQ_INT_ARRAY =
"qns.video_ngran_ssrsrq_int_array";
/**
* List of 3 customized ngran(5g) SSSINR thresholds to be considered for rove-in & rove-out in
* 5G (VoNR) & in idle state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_SSSINR}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_SSSINR_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_SSSINR_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_IDLE_NGRAN_SSSINR_INT_ARRAY = "qns.idle_ngran_sssinr_int_array";
/**
* List of 3 customized ngran(5g) SSSINR thresholds to be considered for rove-in & rove-out in
* 5G (VoNR) & in voice call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_SSSINR}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_SSSINR_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_SSSINR_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VOICE_NGRAN_SSSINR_INT_ARRAY =
"qns.voice_ngran_sssinr_int_array";
/**
* List of 3 customized ngran(5g) SSSINR thresholds to be considered for rove-in & rove-out in
* 5G (VoNR) & in video call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_SSSINR}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_SSSINR_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_SSSINR_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VIDEO_NGRAN_SSSINR_INT_ARRAY =
"qns.video_ngran_sssinr_int_array";
/**
* List of 3 customized utran(3g) RSCP thresholds to be considered for rove-in & rove-out in 3g
* (IMS registered) & in idle state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSCP}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSCP_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSCP_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_IDLE_UTRAN_RSCP_INT_ARRAY = "qns.idle_utran_rscp_int_array";
/**
* List of 3 customized utran(3g) RSCP thresholds to be considered for rove-in & rove-out in 3g
* (IMS registered) & in voice call(SRVCC) state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSCP}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSCP_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSCP_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VOICE_UTRAN_RSCP_INT_ARRAY = "qns.voice_utran_rscp_int_array";
/**
* List of 3 customized utran(3g) RSCP thresholds to be considered for rove-in & rove-out in 3g
* (IMS registered) & in video call(SRVCC) state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSCP}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSCP_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSCP_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VIDEO_UTRAN_RSCP_INT_ARRAY = "qns.video_utran_rscp_int_array";
/**
* List of 3 customized utran(3G) Ec/No threshold values which are considered for rove-in and
* rove-out in idle state.
* <p>
* 3 threshold integers must be within the boundaries:
* Note: When a value is set to "65535", it means an invalid threshold value.
* {@link QnsConstants#SIGNAL_ECNO_MIN_VALUE}
* {@link QnsConstants#SIGNAL_ECNO_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured, a
* default value will be applied.
*/
public static final String KEY_IDLE_UTRAN_ECNO_INT_ARRAY = "qns.idle_utran_ecno_int_array";
/**
* List of 3 customized geran(2g) RSSI thresholds to be considered for rove-in & rove-out in 2g
* (IMS registered) & in idle state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSSI}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSSI_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSSI_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_IDLE_GERAN_RSSI_INT_ARRAY = "qns.idle_geran_rssi_int_array";
/**
* List of 3 customized geran(2g) RSSI thresholds to be considered for rove-in & rove-out in 2g
* (IMS registered) & in voice call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSSI}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSSI_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSSI_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VOICE_GERAN_RSSI_INT_ARRAY = "qns.voice_geran_rssi_int_array";
/**
* List of 3 customized geran(2g) RSSI thresholds to be considered for rove-in & rove-out in 2g
* (IMS registered) & in video call state.
* <p>
* Reference: {@link SignalThresholdInfo#SIGNAL_MEASUREMENT_TYPE_RSSI}
* <p>
* 3 threshold integers must be within the boundaries:
* Note: In case of "worst" criteria is not relevant the same is set @ "65535"
* {@link SignalThresholdInfo#SIGNAL_RSSI_MIN_VALUE}
* {@link SignalThresholdInfo#SIGNAL_RSSI_MAX_VALUE}
*
* {@code 3 values defined by default(Good, Bad, Worst)}
* <UL>
* <LI>"Good:65535"/LI>
* <LI>"Bad:65535"</LI>
* <LI>"Worst:65535"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VIDEO_GERAN_RSSI_INT_ARRAY = "qns.video_geran_rssi_int_array";
/**
* List of 2 customized wifi RSSI thresholds to be considered for rove-in & rove-out in
* wifi (IMS registered) & in idle state.
* <p>
* 2 threshold integers must be within the boundaries:
* {@link WifiInfo#MIN_RSSI}
* {@link WifiInfo#MIN_RSSI}
*<p>
* {@code 2 values defined by default(Good, Bad)}
* <UL>
* <LI>"Good:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_WIFI_RSSI_GOOD}"/LI>
* <LI>"Bad:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_WIFI_RSSI_BAD}"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_IDLE_WIFI_RSSI_INT_ARRAY = "qns.idle_wifi_rssi_int_array";
/**
* List of 2 customized wifi RSSI thresholds to be considered for rove-in & rove-out in
* wifi (IMS registered) & in voice call state.
* <p>
* 2 threshold integers must be within the boundaries:
* {@link WifiInfo#MIN_RSSI}
* {@link WifiInfo#MIN_RSSI}
*<p>
* {@code 2 values defined by default(Good, Bad)}
* <UL>
* <LI>"Good:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_WIFI_RSSI_GOOD}"/LI>
* <LI>"Bad:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_WIFI_RSSI_BAD}"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VOICE_WIFI_RSSI_INT_ARRAY = "qns.voice_wifi_rssi_int_array";
/**
* List of 2 customized wifi RSSI thresholds to be considered for rove-in & rove-out in
* wifi (IMS registered) & in video call state.
* <p>
* 2 threshold integers must be within the boundaries:
* {@link WifiInfo#MIN_RSSI}
* {@link WifiInfo#MIN_RSSI}
*<p>
* {@code 2 values defined by default(Good, Bad)}
* <UL>
* <LI>"Good:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_VIDEO_WIFI_RSSI_GOOD}"/LI>
* <LI>"Bad:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_VIDEO_WIFI_RSSI_BAD}"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_VIDEO_WIFI_RSSI_INT_ARRAY = "qns.video_wifi_rssi_int_array";
/**
* List of 2 customized wifi RSSI thresholds to be considered for rove-in & rove-out in
* wifi (IMS registered) & in idle state to be considered during Overriding with Wifi
* Pref settings.
* <p>
* 2 threshold integers must be within the boundaries:
* {@link WifiInfo#MIN_RSSI}
* {@link WifiInfo#MIN_RSSI}
*<p>
* {@code 2 values defined by default(Good, Bad)}
* <UL>
* <LI>"Good:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_WIFI_RSSI_GOOD}"/LI>
* <LI>"Bad:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_WIFI_RSSI_BAD}"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_OVERRIDE_WIFI_PREF_IDLE_WIFI_RSSI_INT_ARRAY =
"qns.override_wifi_pref_idle_wifi_rssi_int_array";
/**
* List of 2 customized wifi RSSI thresholds to be considered for rove-in & rove-out in
* wifi (IMS registered) & in voice call state to be considered during Overriding with Wifi
* Pref settings.
* <p>
* 2 threshold integers must be within the boundaries:
* {@link WifiInfo#MIN_RSSI}
* {@link WifiInfo#MIN_RSSI}
*<p>
* {@code 2 values defined by default(Good, Bad)}
* <UL>
* <LI>"Good:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_WIFI_RSSI_GOOD}"/LI>
* <LI>"Bad:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_WIFI_RSSI_BAD}"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_OVERRIDE_WIFI_PREF_VOICE_WIFI_RSSI_INT_ARRAY =
"qns.override_wifi_pref_voice_wifi_rssi_int_array";
/**
* List of 2 customized wifi RSSI thresholds to be considered for rove-in & rove-out in
* wifi (IMS registered) & in video call state to be considered during Overriding with Wifi
* Pref settings.
* <p>
* 2 threshold integers must be within the boundaries:
* {@link WifiInfo#MIN_RSSI}
* {@link WifiInfo#MIN_RSSI}
*<p>
* {@code 2 values defined by default(Good, Bad)}
* <UL>
* <LI>"Good:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_VIDEO_WIFI_RSSI_GOOD}"/LI>
* <LI>"Bad:{@link QnsConstants#KEY_DEFAULT_THRESHOLD_VIDEO_WIFI_RSSI_BAD}"</LI>
* </UL>
* <p>
* This key is considered invalid if the format is violated. If the key not configured,
* a default value set will apply.
*/
public static final String KEY_OVERRIDE_WIFI_PREF_VIDEO_WIFI_RSSI_INT_ARRAY =
"qns.override_wifi_pref_video_wifi_rssi_int_array";
public static final String KEY_IDLE_WIFI_RSSI_WITHOUT_CELLULAR_INT_ARRAY =
"qns.idle_wifi_rssi_without_cellular_int_array";
public static final String KEY_VOICE_WIFI_RSSI_WITHOUT_CELLULAR_INT_ARRAY =
"qns.voice_wifi_rssi_without_cellular_int_array";
public static final String KEY_VIDEO_WIFI_RSSI_WITHOUT_CELLULAR_INT_ARRAY =
"qns.video_wifi_rssi_without_cellular_int_array";
// Internal Policy Rule/keys Updates
public static final String KEY_CONDITION_ROVE_IN_IDLE_WIFI_PREF_HOME_STRING_ARRAY =
"qns.condition_rove_in_idle_wifi_pref_home_string_array";
public static final String KEY_CONDITION_ROVE_IN_VOICE_WIFI_PREF_HOME_STRING_ARRAY =
"qns.condition_rove_in_voice_wifi_pref_home_string_array";
public static final String KEY_CONDITION_ROVE_IN_VIDEO_WIFI_PREF_HOME_STRING_ARRAY =
"qns.condition_rove_in_video_wifi_pref_home_string_array";
public static final String KEY_CONDITION_ROVE_IN_IDLE_CELL_PREF_HOME_STRING_ARRAY =
"qns.condition_rove_in_idle_cell_pref_home_string_array";
public static final String KEY_CONDITION_ROVE_IN_VOICE_CELL_PREF_HOME_STRING_ARRAY =
"qns.condition_rove_in_voice_cell_pref_home_string_array";
public static final String KEY_CONDITION_ROVE_IN_VIDEO_CELL_PREF_HOME_STRING_ARRAY =
"qns.condition_rove_in_video_cell_pref_home_string_array";
public static final String KEY_CONDITION_ROVE_OUT_IDLE_WIFI_PREF_HOME_STRING_ARRAY =
"qns.condition_rove_out_idle_wifi_pref_home_string_array";
public static final String KEY_CONDITION_ROVE_OUT_VOICE_WIFI_PREF_HOME_STRING_ARRAY =
"qns.condition_rove_out_voice_wifi_pref_home_string_array";
public static final String KEY_CONDITION_ROVE_OUT_VIDEO_WIFI_PREF_HOME_STRING_ARRAY =
"qns.condition_rove_out_video_wifi_pref_home_string_array";
public static final String KEY_CONDITION_ROVE_OUT_IDLE_CELL_PREF_HOME_STRING_ARRAY =
"qns.condition_rove_out_idle_cell_pref_home_string_array";
public static final String KEY_CONDITION_ROVE_OUT_VOICE_CELL_PREF_HOME_STRING_ARRAY =
"qns.condition_rove_out_voice_cell_pref_home_string_array";
public static final String KEY_CONDITION_ROVE_OUT_VIDEO_CELL_PREF_HOME_STRING_ARRAY =
"qns.condition_rove_out_video_cell_pref_home_string_array";
public static final String KEY_CONDITION_ROVE_IN_IDLE_WIFI_PREF_ROAM_STRING_ARRAY =
"qns.condition_rove_in_idle_wifi_pref_roam_string_array";
public static final String KEY_CONDITION_ROVE_IN_VOICE_WIFI_PREF_ROAM_STRING_ARRAY =
"qns.condition_rove_in_voice_wifi_pref_roam_string_array";
public static final String KEY_CONDITION_ROVE_IN_VIDEO_WIFI_PREF_ROAM_STRING_ARRAY =
"qns.condition_rove_in_video_wifi_pref_roam_string_array";
public static final String KEY_CONDITION_ROVE_IN_IDLE_CELL_PREF_ROAM_STRING_ARRAY =
"qns.condition_rove_in_idle_cell_pref_roam_string_array";
public static final String KEY_CONDITION_ROVE_IN_VOICE_CELL_PREF_ROAM_STRING_ARRAY =
"qns.condition_rove_in_voice_cell_pref_roam_string_array";
public static final String KEY_CONDITION_ROVE_IN_VIDEO_CELL_PREF_ROAM_STRING_ARRAY =
"qns.condition_rove_in_video_cell_pref_roam_string_array";
public static final String KEY_CONDITION_ROVE_OUT_IDLE_WIFI_PREF_ROAM_STRING_ARRAY =
"qns.condition_rove_out_idle_wifi_pref_roam_string_array";
public static final String KEY_CONDITION_ROVE_OUT_VOICE_WIFI_PREF_ROAM_STRING_ARRAY =
"qns.condition_rove_out_voice_wifi_pref_roam_string_array";
public static final String KEY_CONDITION_ROVE_OUT_VIDEO_WIFI_PREF_ROAM_STRING_ARRAY =
"qns.condition_rove_out_video_wifi_pref_roam_string_array";
public static final String KEY_CONDITION_ROVE_OUT_IDLE_CELL_PREF_ROAM_STRING_ARRAY =
"qns.condition_rove_out_idle_cell_pref_roam_string_array";
public static final String KEY_CONDITION_ROVE_OUT_VOICE_CELL_PREF_ROAM_STRING_ARRAY =
"qns.condition_rove_out_voice_cell_pref_roam_string_array";
public static final String KEY_CONDITION_ROVE_OUT_VIDEO_CELL_PREF_ROAM_STRING_ARRAY =
"qns.condition_rove_out_video_cell_pref_roam_string_array";
/** Define keys for extended policy rules.
* Different handover criteria based on whether hysteresis timer is running or not.
*/
public static final String
KEY_CONDITION_ROVE_IN_IDLE_WIFI_PREF_HOME_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_in_idle_wifi_pref_home_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_IN_IDLE_WIFI_PREF_HOME_GUARDING_WIFI_STRING_ARRAY =
"qns.condition_rove_in_idle_wifi_pref_home_guarding_wifi_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VOICE_WIFI_PREF_HOME_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_in_voice_wifi_pref_home_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VOICE_WIFI_PREF_HOME_GUARDING_WIFI_STRING_ARRAY =
"qns.condition_rove_in_voice_wifi_pref_home_guarding_wifi_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VIDEO_WIFI_PREF_HOME_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_in_video_wifi_pref_home_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VIDEO_WIFI_PREF_HOME_GUARDING_WIFI_STRING_ARRAY =
"qns.condition_rove_in_video_wifi_pref_home_guarding_wifi_string_array";
public static final String
KEY_CONDITION_ROVE_IN_IDLE_CELL_PREF_HOME_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_in_idle_cell_pref_home_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_IN_IDLE_CELL_PREF_HOME_GUARDING_WIFI_STRING_ARRAY =
"qns.condition_rove_in_idle_cell_pref_home_guarding_wifi_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VOICE_CELL_PREF_HOME_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_in_voice_cell_pref_home_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VOICE_CELL_PREF_HOME_GUARDING_WIFI_STRING_ARRAY =
"qns.condition_rove_in_voice_cell_pref_home_guarding_wifi_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VIDEO_CELL_PREF_HOME_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_in_video_cell_pref_home_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VIDEO_CELL_PREF_HOME_GUARDING_WIFI_STRING_ARRAY =
"qns.condition_rove_in_video_cell_pref_home_guarding_wifi_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_IDLE_WIFI_PREF_HOME_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_out_idle_wifi_pref_home_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_IDLE_WIFI_PREF_HOME_GUARDING_CELL_STRING_ARRAY =
"qns.condition_rove_out_idle_wifi_pref_home_guarding_cell_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VOICE_WIFI_PREF_HOME_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_out_voice_wifi_pref_home_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VOICE_WIFI_PREF_HOME_GUARDING_CELL_STRING_ARRAY =
"qns.condition_rove_out_voice_wifi_pref_home_guarding_cell_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VIDEO_WIFI_PREF_HOME_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_out_video_wifi_pref_home_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VIDEO_WIFI_PREF_HOME_GUARDING_CELL_STRING_ARRAY =
"qns.condition_rove_out_video_wifi_pref_home_guarding_cell_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_IDLE_CELL_PREF_HOME_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_out_idle_cell_pref_home_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_IDLE_CELL_PREF_HOME_GUARDING_CELL_STRING_ARRAY =
"qns.condition_rove_out_idle_cell_pref_home_guarding_cell_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VOICE_CELL_PREF_HOME_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_out_voice_cell_pref_home_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VOICE_CELL_PREF_HOME_GUARDING_CELL_STRING_ARRAY =
"qns.condition_rove_out_voice_cell_pref_home_guarding_cell_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VIDEO_CELL_PREF_HOME_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_out_video_cell_pref_home_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VIDEO_CELL_PREF_HOME_GUARDING_CELL_STRING_ARRAY =
"qns.condition_rove_out_video_cell_pref_home_guarding_cell_string_array";
public static final String
KEY_CONDITION_ROVE_IN_IDLE_WIFI_PREF_ROAM_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_in_idle_wifi_pref_roam_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_IN_IDLE_WIFI_PREF_ROAM_GUARDING_WIFI_STRING_ARRAY =
"qns.condition_rove_in_idle_wifi_pref_roam_guarding_wifi_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VOICE_WIFI_PREF_ROAM_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_in_voice_wifi_pref_roam_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VOICE_WIFI_PREF_ROAM_GUARDING_WIFI_STRING_ARRAY =
"qns.condition_rove_in_voice_wifi_pref_roam_guarding_wifi_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VIDEO_WIFI_PREF_ROAM_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_in_video_wifi_pref_roam_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VIDEO_WIFI_PREF_ROAM_GUARDING_WIFI_STRING_ARRAY =
"qns.condition_rove_in_video_wifi_pref_roam_guarding_wifi_string_array";
public static final String
KEY_CONDITION_ROVE_IN_IDLE_CELL_PREF_ROAM_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_in_idle_cell_pref_roam_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_IN_IDLE_CELL_PREF_ROAM_GUARDING_WIFI_STRING_ARRAY =
"qns.condition_rove_in_idle_cell_pref_roam_guarding_wifi_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VOICE_CELL_PREF_ROAM_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_in_voice_cell_pref_roam_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VOICE_CELL_PREF_ROAM_GUARDING_WIFI_STRING_ARRAY =
"qns.condition_rove_in_voice_cell_pref_roam_guarding_wifi_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VIDEO_CELL_PREF_ROAM_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_in_video_cell_pref_roam_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_IN_VIDEO_CELL_PREF_ROAM_GUARDING_WIFI_STRING_ARRAY =
"qns.condition_rove_in_video_cell_pref_roam_guarding_wifi_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_IDLE_WIFI_PREF_ROAM_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_out_idle_wifi_pref_roam_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_IDLE_WIFI_PREF_ROAM_GUARDING_CELL_STRING_ARRAY =
"qns.condition_rove_out_idle_wifi_pref_roam_guarding_cell_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VOICE_WIFI_PREF_ROAM_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_out_voice_wifi_pref_roam_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VOICE_WIFI_PREF_ROAM_GUARDING_CELL_STRING_ARRAY =
"qns.condition_rove_out_voice_wifi_pref_roam_guarding_cell_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VIDEO_WIFI_PREF_ROAM_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_out_video_wifi_pref_roam_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VIDEO_WIFI_PREF_ROAM_GUARDING_CELL_STRING_ARRAY =
"qns.condition_rove_out_video_wifi_pref_roam_guarding_cell_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_IDLE_CELL_PREF_ROAM_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_out_idle_cell_pref_roam_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_IDLE_CELL_PREF_ROAM_GUARDING_CELL_STRING_ARRAY =
"qns.condition_rove_out_idle_cell_pref_roam_guarding_cell_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VOICE_CELL_PREF_ROAM_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_out_voice_cell_pref_roam_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VOICE_CELL_PREF_ROAM_GUARDING_CELL_STRING_ARRAY =
"qns.condition_rove_out_voice_cell_pref_roam_guarding_cell_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VIDEO_CELL_PREF_ROAM_GUARDING_NONE_STRING_ARRAY =
"qns.condition_rove_out_video_cell_pref_roam_guarding_none_string_array";
public static final String
KEY_CONDITION_ROVE_OUT_VIDEO_CELL_PREF_ROAM_GUARDING_CELL_STRING_ARRAY =
"qns.condition_rove_out_video_cell_pref_roam_guarding_cell_string_array";
private final HashMap<String, int[]> mQnsRatThresholdMap = new HashMap<>();
private final HashMap<String, String[]> mQnsPolicyMap = new HashMap<>();
private String LOG_TAG;
static final String[] THRESHOLD_KEYS =
new String[] {
KEY_IDLE_EUTRAN_RSRP_INT_ARRAY,
KEY_VOICE_EUTRAN_RSRP_INT_ARRAY,
KEY_VIDEO_EUTRAN_RSRP_INT_ARRAY,
KEY_IDLE_EUTRAN_RSRQ_INT_ARRAY,
KEY_VOICE_EUTRAN_RSRQ_INT_ARRAY,
KEY_VIDEO_EUTRAN_RSRQ_INT_ARRAY,
KEY_IDLE_EUTRAN_RSSNR_INT_ARRAY,
KEY_VOICE_EUTRAN_RSSNR_INT_ARRAY,
KEY_VIDEO_EUTRAN_RSSNR_INT_ARRAY,
KEY_IDLE_NGRAN_SSRSRP_INT_ARRAY,
KEY_VOICE_NGRAN_SSRSRP_INT_ARRAY,
KEY_VIDEO_NGRAN_SSRSRP_INT_ARRAY,
KEY_IDLE_NGRAN_SSRSRQ_INT_ARRAY,
KEY_VOICE_NGRAN_SSRSRQ_INT_ARRAY,
KEY_VIDEO_NGRAN_SSRSRQ_INT_ARRAY,
KEY_IDLE_NGRAN_SSSINR_INT_ARRAY,
KEY_VOICE_NGRAN_SSSINR_INT_ARRAY,
KEY_VIDEO_NGRAN_SSSINR_INT_ARRAY,
KEY_IDLE_UTRAN_RSCP_INT_ARRAY,
KEY_VOICE_UTRAN_RSCP_INT_ARRAY,
KEY_VIDEO_UTRAN_RSCP_INT_ARRAY,
KEY_IDLE_UTRAN_ECNO_INT_ARRAY,
KEY_IDLE_GERAN_RSSI_INT_ARRAY,
KEY_VOICE_GERAN_RSSI_INT_ARRAY,
KEY_VIDEO_GERAN_RSSI_INT_ARRAY,
KEY_IDLE_WIFI_RSSI_INT_ARRAY,
KEY_VOICE_WIFI_RSSI_INT_ARRAY,
KEY_VIDEO_WIFI_RSSI_INT_ARRAY,
KEY_OVERRIDE_WIFI_PREF_IDLE_WIFI_RSSI_INT_ARRAY,
KEY_OVERRIDE_WIFI_PREF_VOICE_WIFI_RSSI_INT_ARRAY,
KEY_OVERRIDE_WIFI_PREF_VIDEO_WIFI_RSSI_INT_ARRAY,
KEY_IDLE_WIFI_RSSI_WITHOUT_CELLULAR_INT_ARRAY,
KEY_VOICE_WIFI_RSSI_WITHOUT_CELLULAR_INT_ARRAY,
KEY_VIDEO_WIFI_RSSI_WITHOUT_CELLULAR_INT_ARRAY
};
private final int mSlotIndex;
private final Context mContext;
private static final SparseArray<QnsCarrierAnspSupportConfig> mQnsCarrierAnspSupportConfigMgrs =
new SparseArray<>();
/**
* Constructor to Slot & Context whose Access Network selection policy related support configs
* needs to be loaded, along with Other QNS COnfigurations on which the related Carrier Config
* ID to be loaded.
*
* @param slotIndex : Constructor for initialising QnsCarrierAnspSupportConfig to current Slot
* ID
* @param context : Constructor for initialising QnsCarrierAnspSupportConfig to current context
*/
private QnsCarrierAnspSupportConfig(int slotIndex, Context context) {
LOG_TAG =
QnsConstants.QNS_TAG
+ "_"
+ QnsCarrierAnspSupportConfig.class.getSimpleName()
+ "_"
+ slotIndex;
mSlotIndex = slotIndex;
mContext = context;
}
/**
* Below API is exposed to QnsCarrierConfigManager in QNS package, to register for fetching the
* Access Network Selection policy builder supported configs such as Threshold Configs &
* Internal policies.
*
* @param context : Context at which QnsCarrierAnspSupportConfig instance to be created
* @param slotIndex : slot ID at which QnsCarrierAnspSupportConfig instance to be created
*/
public static QnsCarrierAnspSupportConfig getInstance(Context context, int slotIndex) {
QnsCarrierAnspSupportConfig qnsCarrierAnspSupportConfigMgr =
mQnsCarrierAnspSupportConfigMgrs.get(slotIndex);
if (qnsCarrierAnspSupportConfigMgr != null) {
return qnsCarrierAnspSupportConfigMgr;
}
qnsCarrierAnspSupportConfigMgr = new QnsCarrierAnspSupportConfig(slotIndex, context);
mQnsCarrierAnspSupportConfigMgrs.put(slotIndex, qnsCarrierAnspSupportConfigMgr);
return qnsCarrierAnspSupportConfigMgr;
}
/**
* This method loads the Threshold Array & Policy Array rules for building Access Network
* Selection policies
*
* @param bundleCarrier : Carrier config Manager (pb config) persistent bundle
* @param bundleAsset : asset config (xml) persistent bundle
*/
public void loadQnsAnspSupportArray(
PersistableBundle bundleCarrier, PersistableBundle bundleAsset) {
updateAnspThresholdArrayList(bundleCarrier, bundleAsset);
updateAnspPolicyArrayList(bundleCarrier, bundleAsset);
}
private void updateAnspThresholdArrayList(
PersistableBundle bundleCarrier, PersistableBundle bundleAsset) {
for (String key : THRESHOLD_KEYS) {
int[] anspThresholdArray = QnsUtils.getConfig(bundleCarrier, bundleAsset, key);
if (anspThresholdArray != null && anspThresholdArray.length > 1) {
anspThresholdArray = validateAndAdjustThresholdArray(anspThresholdArray, key);
}
mQnsRatThresholdMap.put(key, anspThresholdArray);
}
}
private int[] validateAndAdjustThresholdArray(int[] thresholds, String thresholdKey) {
if (thresholds[POLICY_GOOD] != QnsCarrierConfigManager.QnsConfigArray.INVALID
&& thresholds[POLICY_BAD] != QnsCarrierConfigManager.QnsConfigArray.INVALID
&& thresholds[POLICY_GOOD] - thresholds[POLICY_BAD] < MIN_THRESHOLD_GAP) {
if (thresholds[POLICY_GOOD] - thresholds[POLICY_BAD] < 0) {
Log.d(LOG_TAG, "invalid Thresholds for " + thresholdKey + " use default.");
return QnsUtils.getConfig(null, null, thresholdKey);
} else if (thresholds[POLICY_GOOD] - thresholds[POLICY_BAD] < MIN_THRESHOLD_GAP) {
int currentGap = thresholds[POLICY_GOOD] - thresholds[POLICY_BAD];
int[] adjust = thresholds.clone();
for (int i = currentGap; i < MIN_THRESHOLD_GAP; i++) {
if ((i - currentGap) % 2 == 0) {
adjust[POLICY_GOOD]++;
} else {
adjust[POLICY_BAD]--;
}
}
Log.d(
LOG_TAG,
"Thresholds("
+ thresholdKey
+ ") gap is too small adjust:"
+ "["
+ thresholds[POLICY_GOOD]
+ "] > ["
+ adjust[POLICY_GOOD]
+ "]"
+ "["
+ thresholds[POLICY_BAD]
+ "] > ["
+ adjust[POLICY_BAD]
+ "]");
return adjust;
}
}
return thresholds;
}
private void updateAnspPolicyArrayList(
PersistableBundle bundleCarrier, PersistableBundle bundleAsset) {
String[] policyKeys =
new String[] {
KEY_CONDITION_ROVE_IN_IDLE_WIFI_PREF_HOME_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VOICE_WIFI_PREF_HOME_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VIDEO_WIFI_PREF_HOME_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_IDLE_CELL_PREF_HOME_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VOICE_CELL_PREF_HOME_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VIDEO_CELL_PREF_HOME_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_IDLE_WIFI_PREF_HOME_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VOICE_WIFI_PREF_HOME_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VIDEO_WIFI_PREF_HOME_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_IDLE_CELL_PREF_HOME_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VOICE_CELL_PREF_HOME_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VIDEO_CELL_PREF_HOME_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_IDLE_WIFI_PREF_ROAM_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VOICE_WIFI_PREF_ROAM_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VIDEO_WIFI_PREF_ROAM_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_IDLE_CELL_PREF_ROAM_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VOICE_CELL_PREF_ROAM_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VIDEO_CELL_PREF_ROAM_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_IDLE_WIFI_PREF_ROAM_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VOICE_WIFI_PREF_ROAM_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VIDEO_WIFI_PREF_ROAM_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_IDLE_CELL_PREF_ROAM_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VOICE_CELL_PREF_ROAM_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VIDEO_CELL_PREF_ROAM_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_IDLE_WIFI_PREF_HOME_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_IDLE_WIFI_PREF_HOME_GUARDING_WIFI_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VOICE_WIFI_PREF_HOME_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VOICE_WIFI_PREF_HOME_GUARDING_WIFI_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VIDEO_WIFI_PREF_HOME_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VIDEO_WIFI_PREF_HOME_GUARDING_WIFI_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_IDLE_CELL_PREF_HOME_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_IDLE_CELL_PREF_HOME_GUARDING_WIFI_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VOICE_CELL_PREF_HOME_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VOICE_CELL_PREF_HOME_GUARDING_WIFI_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VIDEO_CELL_PREF_HOME_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VIDEO_CELL_PREF_HOME_GUARDING_WIFI_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_IDLE_WIFI_PREF_HOME_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_IDLE_WIFI_PREF_HOME_GUARDING_CELL_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VOICE_WIFI_PREF_HOME_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VOICE_WIFI_PREF_HOME_GUARDING_CELL_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VIDEO_WIFI_PREF_HOME_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VIDEO_WIFI_PREF_HOME_GUARDING_CELL_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_IDLE_CELL_PREF_HOME_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_IDLE_CELL_PREF_HOME_GUARDING_CELL_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VOICE_CELL_PREF_HOME_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VOICE_CELL_PREF_HOME_GUARDING_CELL_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VIDEO_CELL_PREF_HOME_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VIDEO_CELL_PREF_HOME_GUARDING_CELL_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_IDLE_WIFI_PREF_ROAM_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_IDLE_WIFI_PREF_ROAM_GUARDING_WIFI_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VOICE_WIFI_PREF_ROAM_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VOICE_WIFI_PREF_ROAM_GUARDING_WIFI_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VIDEO_WIFI_PREF_ROAM_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VIDEO_WIFI_PREF_ROAM_GUARDING_WIFI_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_IDLE_CELL_PREF_ROAM_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_IDLE_CELL_PREF_ROAM_GUARDING_WIFI_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VOICE_CELL_PREF_ROAM_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VOICE_CELL_PREF_ROAM_GUARDING_WIFI_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VIDEO_CELL_PREF_ROAM_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_IN_VIDEO_CELL_PREF_ROAM_GUARDING_WIFI_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_IDLE_WIFI_PREF_ROAM_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_IDLE_WIFI_PREF_ROAM_GUARDING_CELL_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VOICE_WIFI_PREF_ROAM_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VOICE_WIFI_PREF_ROAM_GUARDING_CELL_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VIDEO_WIFI_PREF_ROAM_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VIDEO_WIFI_PREF_ROAM_GUARDING_CELL_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_IDLE_CELL_PREF_ROAM_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_IDLE_CELL_PREF_ROAM_GUARDING_CELL_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VOICE_CELL_PREF_ROAM_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VOICE_CELL_PREF_ROAM_GUARDING_CELL_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VIDEO_CELL_PREF_ROAM_GUARDING_NONE_STRING_ARRAY,
KEY_CONDITION_ROVE_OUT_VIDEO_CELL_PREF_ROAM_GUARDING_CELL_STRING_ARRAY,
};
for (String key : policyKeys) {
String[] anspPolicyArray = QnsUtils.getConfig(bundleCarrier, bundleAsset, key);
mQnsPolicyMap.put(key, anspPolicyArray);
}
}
public int[] getAnspCarrierThreshold(String key) {
return mQnsRatThresholdMap.get(key);
}
public String[] getAnspCarrierPolicy(String key) {
return mQnsPolicyMap.get(key);
}
/**
* Check if Threshold config was Updated.
*
* @param configBundle : Carrier config Manager (pb config) persistent bundle
* @param assetBundle : asset config (xml) persistent bundle
* @return true/false
*/
public synchronized boolean checkQnsAnspConfigChange(
PersistableBundle configBundle, PersistableBundle assetBundle) {
return isThresholdConfigChanged(configBundle, assetBundle);
}
private boolean isThresholdConfigChanged(
PersistableBundle ConfigChangeBundle, PersistableBundle assetBundle) {
HashMap<String, int[]> qnsRatThresUpdatedMap = new HashMap<>();
for (String key : THRESHOLD_KEYS) {
int[] anspThresholdArray = QnsUtils.getConfig(ConfigChangeBundle, assetBundle, key);
qnsRatThresUpdatedMap.put(key, anspThresholdArray);
}
for (String k : mQnsRatThresholdMap.keySet()) {
if (!Arrays.equals(mQnsRatThresholdMap.get(k), qnsRatThresUpdatedMap.get(k))) {
mQnsRatThresholdMap.putAll(qnsRatThresUpdatedMap);
return true;
}
}
return false;
}
/** Below API clears the current Access Network selection Policies */
public void close() {
mQnsCarrierAnspSupportConfigMgrs.remove(mSlotIndex);
}
}