/**
 * Copyright (C) 2010-2012 Regis Montoya (aka r3gis - www.r3gis.fr)
 * This file is part of CSipSimple.
 *
 *  CSipSimple is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *  If you own a pjsip commercial license you can also redistribute it
 *  and/or modify it under the terms of the GNU Lesser General Public License
 *  as an android library.
 *
 *  CSipSimple is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with CSipSimple.  If not, see <http://www.gnu.org/licenses/>.
 *  
 *  This file and this file only is also released under Apache license as an API file
 */

package com.voiceblue.phone.api;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Represents state of the media <b>device</b> layer <br/>
 * This class helps to serialize/deserialize the state of the media layer <br/>
 * The fields it contains are direclty available. <br/>
 * <b>Changing these fields has no effect on the device audio</b> : it's only a
 * structured holder for datas <br/>
 * This class is not related to SIP media state this is managed by
 * {@link SipCallSession.MediaState}
 */
public class MediaState implements Parcelable {

    /**
     * Primary key for the parcelable object
     */
    public int primaryKey = -1;

    /**
     * Whether the microphone is currently muted
     */
    public boolean isMicrophoneMute = false;

    /**
     * Whether the audio routes to the speaker
     */
    public boolean isSpeakerphoneOn = false;
    /**
     * Whether the audio routes to Bluetooth SCO
     */
    public boolean isBluetoothScoOn = false;
    /**
     * Gives phone capability to mute microphone
     */
    public boolean canMicrophoneMute = true;
    /**
     * Gives phone capability to route to speaker
     */
    public boolean canSpeakerphoneOn = true;
    /**
     * Gives phone capability to route to bluetooth SCO
     */
    public boolean canBluetoothSco = false;

    @Override
    public boolean equals(Object o) {

        if (o != null && o.getClass() == MediaState.class) {
            MediaState oState = (MediaState) o;
            if (oState.isBluetoothScoOn == isBluetoothScoOn &&
                    oState.isMicrophoneMute == isMicrophoneMute &&
                    oState.isSpeakerphoneOn == isSpeakerphoneOn &&
                    oState.canBluetoothSco == canBluetoothSco &&
                    oState.canSpeakerphoneOn == canSpeakerphoneOn &&
                    oState.canMicrophoneMute == canMicrophoneMute) {
                return true;
            } else {
                return false;
            }

        }
        return super.equals(o);
    }

    /**
     * Constructor for a media state object <br/>
     * It will contains default values for all flags This class as no
     * setter/getter for members flags <br/>
     * It's aim is to allow to serialize/deserialize easily the state of media
     * layer, <n>not to modify it</b>
     */
    public MediaState() {
        // Nothing to do in default constructor
    }

    /**
     * Construct from parcelable <br/>
     * Only used by {@link #CREATOR}
     * 
     * @param in parcelable to build from
     */
    private MediaState(Parcel in) {
        primaryKey = in.readInt();
        isMicrophoneMute = (in.readInt() == 1);
        isSpeakerphoneOn = (in.readInt() == 1);
        isBluetoothScoOn = (in.readInt() == 1);
        canMicrophoneMute = (in.readInt() == 1);
        canSpeakerphoneOn = (in.readInt() == 1);
        canBluetoothSco = (in.readInt() == 1);
    }

    /**
     * Parcelable creator. So that it can be passed as an argument of the aidl
     * interface
     */
    public static final Parcelable.Creator<MediaState> CREATOR = new Parcelable.Creator<MediaState>() {
        public MediaState createFromParcel(Parcel in) {
            return new MediaState(in);
        }

        public MediaState[] newArray(int size) {
            return new MediaState[size];
        }
    };

    /**
     * @see Parcelable#describeContents()
     */
    @Override
    public int describeContents() {
        return 0;
    }

    /**
     * @see Parcelable#writeToParcel(Parcel, int)
     */
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(primaryKey);
        dest.writeInt(isMicrophoneMute ? 1 : 0);
        dest.writeInt(isSpeakerphoneOn ? 1 : 0);
        dest.writeInt(isBluetoothScoOn ? 1 : 0);
        dest.writeInt(canMicrophoneMute ? 1 : 0);
        dest.writeInt(canSpeakerphoneOn ? 1 : 0);
        dest.writeInt(canBluetoothSco ? 1 : 0);
    }
}
