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

import android.annotation.SystemApi;
import android.annotation.UnsupportedAppUsage;
import android.os.Parcel;
import android.os.Parcelable;

/**
 * Parcelable object to handle IMS stream media profile.
 * It provides the media direction, quality of audio and/or video.
 *
 * @hide
 */
@SystemApi
public final class ImsStreamMediaProfile implements Parcelable {
    private static final String TAG = "ImsStreamMediaProfile";

    /**
     * Media directions
     */
    public static final int DIRECTION_INVALID = (-1);
    public static final int DIRECTION_INACTIVE = 0;
    public static final int DIRECTION_RECEIVE = 1;
    public static final int DIRECTION_SEND = 2;
    public static final int DIRECTION_SEND_RECEIVE = 3;

    /**
     * Audio information
     */
    public static final int AUDIO_QUALITY_NONE = 0;
    public static final int AUDIO_QUALITY_AMR = 1;
    public static final int AUDIO_QUALITY_AMR_WB = 2;
    public static final int AUDIO_QUALITY_QCELP13K = 3;
    public static final int AUDIO_QUALITY_EVRC = 4;
    public static final int AUDIO_QUALITY_EVRC_B = 5;
    public static final int AUDIO_QUALITY_EVRC_WB = 6;
    public static final int AUDIO_QUALITY_EVRC_NW = 7;
    public static final int AUDIO_QUALITY_GSM_EFR = 8;
    public static final int AUDIO_QUALITY_GSM_FR = 9;
    public static final int AUDIO_QUALITY_GSM_HR = 10;
    public static final int AUDIO_QUALITY_G711U = 11;
    public static final int AUDIO_QUALITY_G723 = 12;
    public static final int AUDIO_QUALITY_G711A = 13;
    public static final int AUDIO_QUALITY_G722 = 14;
    public static final int AUDIO_QUALITY_G711AB = 15;
    public static final int AUDIO_QUALITY_G729 = 16;
    public static final int AUDIO_QUALITY_EVS_NB = 17;
    public static final int AUDIO_QUALITY_EVS_WB = 18;
    public static final int AUDIO_QUALITY_EVS_SWB = 19;
    public static final int AUDIO_QUALITY_EVS_FB = 20;

   /**
     * Video information
     */
    public static final int VIDEO_QUALITY_NONE = 0;
    public static final int VIDEO_QUALITY_QCIF = (1 << 0);
    public static final int VIDEO_QUALITY_QVGA_LANDSCAPE = (1 << 1);
    public static final int VIDEO_QUALITY_QVGA_PORTRAIT = (1 << 2);
    public static final int VIDEO_QUALITY_VGA_LANDSCAPE = (1 << 3);
    public static final int VIDEO_QUALITY_VGA_PORTRAIT = (1 << 4);

    /**
     * RTT Modes
     */
    public static final int RTT_MODE_DISABLED = 0;
    public static final int RTT_MODE_FULL = 1;

    // Audio related information
    /** @hide */
    @UnsupportedAppUsage
    public int mAudioQuality;
    /** @hide */
    @UnsupportedAppUsage
    public int mAudioDirection;
    // Video related information
    /** @hide */
    public int mVideoQuality;
    /** @hide */
    @UnsupportedAppUsage
    public int mVideoDirection;
    // Rtt related information
    /** @hide */
    public int mRttMode;
    // RTT Audio Speech Indicator
    /** @hide */
    public boolean mIsReceivingRttAudio = false;

    /** @hide */
    public ImsStreamMediaProfile(Parcel in) {
        readFromParcel(in);
    }

    /**
     * Constructor.
     *
     * @param audioQuality The audio quality. Can be one of the following:
     *                     {@link #AUDIO_QUALITY_AMR},
     *                     {@link #AUDIO_QUALITY_AMR_WB},
     *                     {@link #AUDIO_QUALITY_QCELP13K},
     *                     {@link #AUDIO_QUALITY_EVRC},
     *                     {@link #AUDIO_QUALITY_EVRC_B},
     *                     {@link #AUDIO_QUALITY_EVRC_WB},
     *                     {@link #AUDIO_QUALITY_EVRC_NW},
     *                     {@link #AUDIO_QUALITY_GSM_EFR},
     *                     {@link #AUDIO_QUALITY_GSM_FR},
     *                     {@link #AUDIO_QUALITY_GSM_HR},
     *                     {@link #AUDIO_QUALITY_G711U},
     *                     {@link #AUDIO_QUALITY_G723},
     *                     {@link #AUDIO_QUALITY_G711A},
     *                     {@link #AUDIO_QUALITY_G722},
     *                     {@link #AUDIO_QUALITY_G711AB},
     *                     {@link #AUDIO_QUALITY_G729},
     *                     {@link #AUDIO_QUALITY_EVS_NB},
     *                     {@link #AUDIO_QUALITY_EVS_WB},
     *                     {@link #AUDIO_QUALITY_EVS_SWB},
     *                     {@link #AUDIO_QUALITY_EVS_FB},
     * @param audioDirection The audio direction. Can be one of the following:
     *                       {@link #DIRECTION_INVALID},
     *                       {@link #DIRECTION_INACTIVE},
     *                       {@link #DIRECTION_RECEIVE},
     *                       {@link #DIRECTION_SEND},
     *                       {@link #DIRECTION_SEND_RECEIVE},
     * @param videoQuality The video quality. Can be one of the following:
     *                     {@link #VIDEO_QUALITY_NONE},
     *                     {@link #VIDEO_QUALITY_QCIF},
     *                     {@link #VIDEO_QUALITY_QVGA_LANDSCAPE},
     *                     {@link #VIDEO_QUALITY_QVGA_PORTRAIT},
     *                     {@link #VIDEO_QUALITY_VGA_LANDSCAPE},
     *                     {@link #VIDEO_QUALITY_VGA_PORTRAIT},
     * @param videoDirection The video direction. Can be one of the following:
     *                       {@link #DIRECTION_INVALID},
     *                       {@link #DIRECTION_INACTIVE},
     *                       {@link #DIRECTION_RECEIVE},
     *                       {@link #DIRECTION_SEND},
     *                       {@link #DIRECTION_SEND_RECEIVE},
     * @param rttMode The rtt mode. Can be one of the following:
     *                {@link #RTT_MODE_DISABLED},
     *                {@link #RTT_MODE_FULL}
     */
    public ImsStreamMediaProfile(int audioQuality, int audioDirection,
            int videoQuality, int videoDirection, int rttMode) {
        mAudioQuality = audioQuality;
        mAudioDirection = audioDirection;
        mVideoQuality = videoQuality;
        mVideoDirection = videoDirection;
        mRttMode = rttMode;
    }

    /** @hide */
    @UnsupportedAppUsage
    public ImsStreamMediaProfile() {
        mAudioQuality = AUDIO_QUALITY_NONE;
        mAudioDirection = DIRECTION_SEND_RECEIVE;
        mVideoQuality = VIDEO_QUALITY_NONE;
        mVideoDirection = DIRECTION_INVALID;
        mRttMode = RTT_MODE_DISABLED;
    }

    /** @hide */
    public ImsStreamMediaProfile(int audioQuality, int audioDirection,
            int videoQuality, int videoDirection) {
        mAudioQuality = audioQuality;
        mAudioDirection = audioDirection;
        mVideoQuality = videoQuality;
        mVideoDirection = videoDirection;
    }

    /** @hide */
    public ImsStreamMediaProfile(int rttMode) {
        mRttMode = rttMode;
    }

    public void copyFrom(ImsStreamMediaProfile profile) {
        mAudioQuality = profile.mAudioQuality;
        mAudioDirection = profile.mAudioDirection;
        mVideoQuality = profile.mVideoQuality;
        mVideoDirection = profile.mVideoDirection;
        mRttMode = profile.mRttMode;
    }

    @Override
    public String toString() {
        return "{ audioQuality=" + mAudioQuality +
                ", audioDirection=" + mAudioDirection +
                ", videoQuality=" + mVideoQuality +
                ", videoDirection=" + mVideoDirection +
                ", rttMode=" + mRttMode +
                ", hasRttAudioSpeech=" + mIsReceivingRttAudio + " }";
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(mAudioQuality);
        out.writeInt(mAudioDirection);
        out.writeInt(mVideoQuality);
        out.writeInt(mVideoDirection);
        out.writeInt(mRttMode);
        out.writeBoolean(mIsReceivingRttAudio);
    }

    private void readFromParcel(Parcel in) {
        mAudioQuality = in.readInt();
        mAudioDirection = in.readInt();
        mVideoQuality = in.readInt();
        mVideoDirection = in.readInt();
        mRttMode = in.readInt();
        mIsReceivingRttAudio = in.readBoolean();
    }

    public static final @android.annotation.NonNull Creator<ImsStreamMediaProfile> CREATOR =
            new Creator<ImsStreamMediaProfile>() {
        @Override
        public ImsStreamMediaProfile createFromParcel(Parcel in) {
            return new ImsStreamMediaProfile(in);
        }

        @Override
        public ImsStreamMediaProfile[] newArray(int size) {
            return new ImsStreamMediaProfile[size];
        }
    };

    /**
     * Determines if it's RTT call
     * @return true if RTT call, false otherwise.
     */
    public boolean isRttCall() {
        return (mRttMode == RTT_MODE_FULL);
    }

    /**
     * Updates the RttCall attribute
     */
    public void setRttMode(int rttMode) {
        mRttMode = rttMode;
    }

    /**
     * Sets whether the remote party is transmitting audio over the RTT call.
     * @param audioOn true if audio is being received, false otherwise.
     */
    public void setReceivingRttAudio(boolean audioOn) {
        mIsReceivingRttAudio = audioOn;
    }

    public int getAudioQuality() {
        return mAudioQuality;
    }

    public int getAudioDirection() {
        return mAudioDirection;
    }

    public int getVideoQuality() {
        return mVideoQuality;
    }

    public int getVideoDirection() {
        return mVideoDirection;
    }

    public int getRttMode() {
        return mRttMode;
    }

    /**
     * @return true if remote party is transmitting audio, false otherwise.
     */
    public boolean isReceivingRttAudio() {
        return mIsReceivingRttAudio;
    }
}
