/* * Copyright (C) 2012 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 android.telephony; import android.annotation.IntRange; import android.annotation.SystemApi; import android.os.PersistableBundle; /** * Abstract base class for cell phone signal strength related information. */ @android.ravenwood.annotation.RavenwoodKeepWholeClass public abstract class CellSignalStrength { public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = TelephonyProtoEnums.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; // 0 public static final int SIGNAL_STRENGTH_POOR = TelephonyProtoEnums.SIGNAL_STRENGTH_POOR; // 1 public static final int SIGNAL_STRENGTH_MODERATE = TelephonyProtoEnums.SIGNAL_STRENGTH_MODERATE; // 2 public static final int SIGNAL_STRENGTH_GOOD = TelephonyProtoEnums.SIGNAL_STRENGTH_GOOD; // 3 public static final int SIGNAL_STRENGTH_GREAT = TelephonyProtoEnums.SIGNAL_STRENGTH_GREAT; // 4 /** @hide */ public static final int NUM_SIGNAL_STRENGTH_BINS = 5; /** @hide */ protected static final int NUM_SIGNAL_STRENGTH_THRESHOLDS = NUM_SIGNAL_STRENGTH_BINS - 1; /** @hide */ protected CellSignalStrength() { } /** @hide */ public abstract void setDefaultValues(); /** * Retrieve an abstract level value for the overall signal quality. * * @return a single integer from 0 to 4 representing the general signal quality. * 0 represents very poor or unknown signal quality while 4 represents excellent * signal quality. */ @IntRange(from = SIGNAL_STRENGTH_NONE_OR_UNKNOWN, to = SIGNAL_STRENGTH_GREAT) public abstract int getLevel(); /** * Get the technology-specific signal strength in Arbitrary Strength Units, calculated from the * strength of the pilot signal or equivalent. */ public abstract int getAsuLevel(); /** * Get the technology-specific signal strength in dBm, which is the signal strength of the * pilot signal or equivalent. */ public abstract int getDbm(); /** * Copies the CellSignalStrength. * * @return A deep copy of this class. * @hide */ public abstract CellSignalStrength copy(); /** * Checks and returns whether there are any non-default values in this CellSignalStrength. * * Checks all the values in the subclass of CellSignalStrength and returns true if any of them * have been set to a value other than their default. * * @hide */ public abstract boolean isValid(); @Override public abstract int hashCode(); @Override public abstract boolean equals (Object o); /** * Calculate and set the carrier-influenced values such as the signal "Level". * * @hide */ public abstract void updateLevel(PersistableBundle cc, ServiceState ss); // Range for RSSI in ASU (0-31, 99) as defined in TS 27.007 8.69 /** @hide */ public static final int getRssiDbmFromAsu(int asu) { if (asu > 31 || asu < 0) return CellInfo.UNAVAILABLE; return -113 + (2 * asu); } // Range for RSSI in ASU (0-31, 99) as defined in TS 27.007 8.69 /** @hide */ protected static final int getAsuFromRssiDbm(int dbm) { if (dbm == CellInfo.UNAVAILABLE) return 99; return (dbm + 113) / 2; } // Range for RSCP in ASU (0-96, 255) as defined in TS 27.007 8.69 /** @hide */ public static final int getRscpDbmFromAsu(int asu) { if (asu > 96 || asu < 0) return CellInfo.UNAVAILABLE; return asu - 120; } // Range for RSCP in ASU (0-96, 255) as defined in TS 27.007 8.69 /** @hide */ protected static final int getAsuFromRscpDbm(int dbm) { if (dbm == CellInfo.UNAVAILABLE) return 255; return dbm + 120; } // Range for SNR in ASU (0-49, 255) as defined in TS 27.007 8.69 /** @hide */ public static final int getEcNoDbFromAsu(int asu) { if (asu > 49 || asu < 0) return CellInfo.UNAVAILABLE; return -24 + (asu / 2); } /** @hide */ protected static final int inRangeOrUnavailable(int value, int rangeMin, int rangeMax) { if (value < rangeMin || value > rangeMax) return CellInfo.UNAVAILABLE; return value; } /** @hide */ protected static final int inRangeOrUnavailable( int value, int rangeMin, int rangeMax, int special) { if ((value < rangeMin || value > rangeMax) && value != special) return CellInfo.UNAVAILABLE; return value; } /** * Returns the number of signal strength levels. * @return Number of signal strength levels, currently defined in the HAL as 5. * * @hide */ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) public static int getNumSignalStrengthLevels() { return NUM_SIGNAL_STRENGTH_BINS; } }