/*
 * Copyright (C) 2013 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.net;

import android.os.Parcel;

/**
 *  Class that represents useful attributes of mobile network links
 *  such as the upload/download throughput or error rate etc.
 *  @hide
 */
public class MobileLinkQualityInfo extends LinkQualityInfo {
    // Represents TelephonyManager.NetworkType
    private int mMobileNetworkType = UNKNOWN_INT;
    private int mRssi = UNKNOWN_INT;
    private int mGsmErrorRate = UNKNOWN_INT;
    private int mCdmaDbm = UNKNOWN_INT;
    private int mCdmaEcio = UNKNOWN_INT;
    private int mEvdoDbm = UNKNOWN_INT;
    private int mEvdoEcio = UNKNOWN_INT;
    private int mEvdoSnr = UNKNOWN_INT;
    private int mLteSignalStrength = UNKNOWN_INT;
    private int mLteRsrp = UNKNOWN_INT;
    private int mLteRsrq = UNKNOWN_INT;
    private int mLteRssnr = UNKNOWN_INT;
    private int mLteCqi = UNKNOWN_INT;

    /**
     * Implement the Parcelable interface.
     * @hide
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags, OBJECT_TYPE_MOBILE_LINK_QUALITY_INFO);

        dest.writeInt(mMobileNetworkType);
        dest.writeInt(mRssi);
        dest.writeInt(mGsmErrorRate);
        dest.writeInt(mCdmaDbm);
        dest.writeInt(mCdmaEcio);
        dest.writeInt(mEvdoDbm);
        dest.writeInt(mEvdoEcio);
        dest.writeInt(mEvdoSnr);
        dest.writeInt(mLteSignalStrength);
        dest.writeInt(mLteRsrp);
        dest.writeInt(mLteRsrq);
        dest.writeInt(mLteRssnr);
        dest.writeInt(mLteCqi);
    }

    /* Un-parceling helper */
    /**
     * @hide
     */
    public static MobileLinkQualityInfo createFromParcelBody(Parcel in) {

        MobileLinkQualityInfo li = new MobileLinkQualityInfo();

        li.initializeFromParcel(in);

        li.mMobileNetworkType = in.readInt();
        li.mRssi = in.readInt();
        li.mGsmErrorRate = in.readInt();
        li.mCdmaDbm = in.readInt();
        li.mCdmaEcio = in.readInt();
        li.mEvdoDbm = in.readInt();
        li.mEvdoEcio = in.readInt();
        li.mEvdoSnr = in.readInt();
        li.mLteSignalStrength = in.readInt();
        li.mLteRsrp = in.readInt();
        li.mLteRsrq = in.readInt();
        li.mLteRssnr = in.readInt();
        li.mLteCqi = in.readInt();

        return li;
    }

    /**
     * returns mobile network type as defined by {@link android.telephony.TelephonyManager}
     * @return network type or {@link android.net.LinkQualityInfo#UNKNOWN_INT}
     */
    public int getMobileNetworkType() {
        return mMobileNetworkType;
    }

    /**
     * @hide
     */
    public void setMobileNetworkType(int mobileNetworkType) {
        mMobileNetworkType = mobileNetworkType;
    }

    /**
     * returns signal strength for GSM networks
     * @return signal strength in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT}
     */
    public int getRssi() {
        return mRssi;
    }

    /**
     * @hide
     */
    public void setRssi(int Rssi) {
        mRssi = Rssi;
    }

    /**
     * returns error rates for GSM networks
     * @return error rate or {@link android.net.LinkQualityInfo#UNKNOWN_INT}
     */
    public int getGsmErrorRate() {
        return mGsmErrorRate;
    }

    /**
     * @hide
     */
    public void setGsmErrorRate(int gsmErrorRate) {
        mGsmErrorRate = gsmErrorRate;
    }

    /**
     * returns signal strength for CDMA networks
     * @return signal strength in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT}
     */
    public int getCdmaDbm() {
        return mCdmaDbm;
    }

    /**
     * @hide
     */
    public void setCdmaDbm(int cdmaDbm) {
        mCdmaDbm = cdmaDbm;
    }

    /**
     * returns signal to noise ratio for CDMA networks
     * @return signal to noise ratio in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT}
     */
    public int getCdmaEcio() {
        return mCdmaEcio;
    }

    /**
     * @hide
     */
    public void setCdmaEcio(int cdmaEcio) {
        mCdmaEcio = cdmaEcio;
    }

    /**
     * returns signal strength for EVDO networks
     * @return signal strength in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT}
     */
    public int getEvdoDbm() {
        return mEvdoDbm;
    }

    /**
     * @hide
     */
    public void setEvdoDbm(int evdoDbm) {
        mEvdoDbm = evdoDbm;
    }

    /**
     * returns signal to noise ratio for EVDO spectrum
     * @return signal to noise ration in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT}
     */
    public int getEvdoEcio() {
        return mEvdoEcio;
    }

    /**
     * @hide
     */
    public void setEvdoEcio(int evdoEcio) {
        mEvdoEcio = evdoEcio;
    }

    /**
     * returns end-to-end signal to noise ratio for EVDO networks
     * @return signal to noise ration in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT}
     */
    public int getEvdoSnr() {
        return mEvdoSnr;
    }

    /**
     * @hide
     */
    public void setEvdoSnr(int evdoSnr) {
        mEvdoSnr = evdoSnr;
    }

    /**
     * returns signal strength for LTE network
     * @return signal strength in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT}
     */
    public int getLteSignalStrength() {
        return mLteSignalStrength;
    }

    /**
     * @hide
     */
    public void setLteSignalStrength(int lteSignalStrength) {
        mLteSignalStrength = lteSignalStrength;
    }

    /**
     * returns RSRP (Reference Signal Received Power) for LTE network
     * @return RSRP in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT}
     */
    public int getLteRsrp() {
        return mLteRsrp;
    }

    /**
     * @hide
     */
    public void setLteRsrp(int lteRsrp) {
        mLteRsrp = lteRsrp;
    }

    /**
     * returns RSRQ (Reference Signal Received Quality) for LTE network
     * @return RSRQ ??? or {@link android.net.LinkQualityInfo#UNKNOWN_INT}
     */
    public int getLteRsrq() {
        return mLteRsrq;
    }

    /**
     * @hide
     */
    public void setLteRsrq(int lteRsrq) {
        mLteRsrq = lteRsrq;
    }

    /**
     * returns signal to noise ratio for LTE networks
     * @return signal to noise ration in db or {@link android.net.LinkQualityInfo#UNKNOWN_INT}
     */
    public int getLteRssnr() {
        return mLteRssnr;
    }

    /**
     * @hide
     */
    public void setLteRssnr(int lteRssnr) {
        mLteRssnr = lteRssnr;
    }

    /**
     * returns channel quality indicator for LTE networks
     * @return CQI or {@link android.net.LinkQualityInfo#UNKNOWN_INT}
     */
    public int getLteCqi() {
        return mLteCqi;
    }

    /**
     * @hide
     */
    public void setLteCqi(int lteCqi) {
        mLteCqi = lteCqi;
    }
}
