/*
 *
 *  Copyright (C) 2018 Eduardo Zarate Lasurtegui
 *   Copyright (C) 2018, University of the Basque Country (UPV/EHU)
 *
 *  Contact for licensing options: <licensing-mcpttclient(at)mcopenplatform(dot)com>
 *
 *  This file is part of MCOP MCPTT Client
 *
 *  This 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.
 *
 *  This 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 this program; if not, write to the Free Software Foundation, Inc.,
 *  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

package org.test.client.mcopclient;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * MCOP MCPTT SDK
 * Constants used on AIDLs
 * @author Eduardo Zarate Lasurtegui
 * @version 0.1
 */
public class ConstantsMCOP {

    public static final int NO_ERROR=0;



    /**
     *
     * Access keys to the values of event types {@link org.mcopenplatform.muoapi.ConstantsMCOP.ActionsCallBack#unLoginEvent}
     * <p>This class contains all the answers to the actions of methods {@link IMCOPsdk#unLoginMCOP()} </p>
     *
     */
    public static class UnLoginEventExtras{
        /**
         * <h2>Access key to the response to method {@link IMCOPsdk#unLoginMCOP()}}:</h2>
         * <p>Response: boolean, indicates whether the unlogin procedure was successful or not.</p>
         */
        public static final String SUCCESS="org.mcopenplatform.muoapi.ConstantsMCOP.UnLoginEventExtras"+".SUCCESS";

        /**
         * <h2>Access key to the error codes of the login and authentication methods.</h2>
         * <p>Response: Integer indicating the error code.</p>
         * <p>Values:</p>
         * <p>  205 It is not possible to unregister because the customer is not registered right now</p>
         * <p>  207 There was an error in the unregistration process</p>
         * <p>0 means no errors.</p>
         * <p></p>
         */
        public static final String ERROR_CODE="org.mcopenplatform.muoapi.ConstantsMCOP.UnLoginEventExtras"+".ERROR_CODE";
        /**
         * <h2>Access key to error string for the login and authentication methods.</h2>
         * <p>Resputa: String describing the error.</p>
         */
        public static final String ERROR_STRING="org.mcopenplatform.muoapi.ConstantsMCOP.UnLoginEventExtras"+".ERROR_STRING";
    }

    /**
     *
     * Access keys to the values of event types {@link org.mcopenplatform.muoapi.ConstantsMCOP.ActionsCallBack#loginEvent}
     * <p>This class contains all the answers to the actions of methods {@link IMCOPsdk#loginMCOP()} and {@link IMCOPsdk#authorizeUser(String)} ()}</p>
     *
     */
    public static class LoginEventExtras{
        /**
         * <h2>Access key to the response to method {@link IMCOPsdk#authorizeUser(String)}:</h2>
         * <p>Response: boolean, indicates whether the login procedure was successful or not.</p>
         */
        public static final String SUCCESS="org.mcopenplatform.muoapi.ConstantsMCOP.LoginEventExtras"+".SUCCESS";
        /**
         * <h2>Access key to the MCPTT ID of the client once authenticated.</h2>
         * <p>Response: String with URI format that unequivocally identifies the user in the MCPTT system.</p>
         */
        public static final String MCPTT_ID="org.mcopenplatform.muoapi.ConstantsMCOP.LoginEventExtras"+".MCPTT_ID";
        /**
         * <h2>Access key to the DISPLAY NAME of the client once authenticated.</h2>
         * <p>Response: String that identifies the user with a human-readable alias, more pleasant than a MCPTT identifier.</p>
         */
        public static final String DISPLAY_NAME="org.mcopenplatform.muoapi.ConstantsMCOP.LoginEventExtras"+".DISPLAY_NAME";
        /**
         * <h2>Access key to the error codes of the login and authentication methods.</h2>
         * <p>Response: Integer indicating the error code.</p>
         * <p>Values:</p>
         * <p>0 means no errors.</p>
         * <p>1XX: xMS Errors:</p>
         * <p>  101 Unknown GMS address</p>
         * <p>  102 Unknown CMS address</p>
         * <p>  103 Unknown KMS address</p>
         * <p>  104 Incorrect answer from GMS</p>
         * <p>  105 Incorrect answer from CMS</p>
         * <p>  106 Incorrect answer from KMS</p>
         * <p>  107 There was error with CMS</p>
         * <p>2XX: IMS or SIM Authentication Errors:</p>
         * <p>  201 IMS registration error</p>
         * <p>  202 IMS authentication error</p>
         * <p>  203 Synchronization error between SIM and IMS</p>
         * <p>  204 SIM access error</p>
         * <p>  205 It is not possible to register because the customer is registered right now</p>
         * <p>  206 the URL for the authentication is not valid</p>
         * <p>  207 There was an error in the registration process</p>
         * <p>  208 Error in the authentication process</p>
         * <p>3XX: IDMS Errors:</p>
         */
        public static final String ERROR_CODE="org.mcopenplatform.muoapi.ConstantsMCOP.LoginEventExtras"+".ERROR_CODE";
        /**
         * <h2>Access key to error string for the login and authentication methods.</h2>
         * <p>Resputa: String describing the error.</p>
         */
        public static final String ERROR_STRING="org.mcopenplatform.muoapi.ConstantsMCOP.LoginEventExtras"+".ERROR_STRING";
    }

    /**
     *
     * <h1>Keys to access the values of authentication events by methods:</h1>
     * <h2>     {@link IMCOPsdk#loginMCOP()}</h2>
     * <h2>     {@link IMCOPsdk#authorizeUser(String)}</h2>
     */
    public static class AuthorizationRequestExtras{
        /**
         * <h2>Access key to the uri to request the user authentication to a third party.</h2>
         * <p>This data is received once the call to the method {@link IMCOPsdk#loginMCOP()} is made.</p>
         * <p>Response: URI format string</p>
         */
        public static final String REQUEST_URI="org.mcopenplatform.muoapi.ConstantsMCOP.AuthorizationRequestActions"+".REQUEST_URI";
        /**
         * <h2>Access key to the uri answered by the third party authentication agent.</h2>
         * <h3>Indicates when the third party authentication ends, and the method {@link IMCOPsdk#authorizeUser(String)} can be called with the authentication response.</h3>
         * <p>This data is received once the call to the method {@link IMCOPsdk#loginMCOP()} is made.</p>
         * <p>Response: URI format string</p>
         */
        public static final String REDIRECT_URI="org.mcopenplatform.muoapi.ConstantsMCOP.AuthorizationRequestActions"+".REDIRECT_URI";
        /**
         * <h2>Access key to authentication error codes.</h2>
         * <p>Response: Integer indicating the error code.</p>
         * <p>Values:</p>
         * <p></p>
         * <p>0 indicates no errors</p>
         */
        public static final String ERROR_CODE="org.mcopenplatform.muoapi.ConstantsMCOP.AuthorizationRequestActions"+".ERROR_CODE";
        /**
         * <h2>Access key to error codes string.</h2>
         */
        public static final String ERROR_STRING="org.mcopenplatform.muoapi.ConstantsMCOP.AuthorizationRequestActions"+".ERROR_STRING";
    }


    /**
     *
     * <h1>Access key to the values of all the configuration events of all the MCPTT services.</h1>
     *
     */
    public static class ConfigurationUpdateEventExtras{

        /**
         * <h2>Access key to the organization that the user belongs to.</h2>
         * <p>This data will be received once logged into the system.</p>
         * <p>Response: String.</p>
         */
        public static final String ORGANIZATION="org.mcopenplatform.muoapi.ConstantsMCOP.LoginSuccessExtras"+".ORGANIZATION";

        /**
         * <h2>Access key to default emergency contact identifier that must be called in case of an emergency call with no destination specified.</h2>
         * <p>This data will be received once logged in and each time the system changes the value or the user manually changes it with the method {@link IMCOPsdk#changeSelectedContact}</p>
         * <p>Response: String with UserID format</p>
         */
        public static final String DEFAULT_EMERGERCY_CONTACT="org.mcopenplatform.muoapi.ConstantsMCOP.LoginSuccessExtras"+".DEFAULT_EMERGERCY_CONTACT";

        /**
         * <h2>Access key to ParticipantType, indicating the position of the user in the organization. Not defined in the 3GPP.</h2>
         * <p>This data will be received once logged into the system or whenever the user receives a new configuration.</p>
         * <p>Response: String.</p>
         */
        public static final String PARTICIPANT_TYPE="org.mcopenplatform.muoapi.ConstantsMCOP.LoginSuccessExtras"+".PARTICIPANT_TYPE";

        /**
         * <h2>Access key to the list of user granted permissions.</h2>
         * <p>This data will be received once logged into the system or whenever the user receives a new configuration.</p>
         * <p>Response: Integer with values of all the FLAGs that identify user allowed services</p>
         * <p>Values: Sum of {@link AllowTypeEnum}</p>
         * <p>  private_call (Private calls allowed) {@link AllowTypeEnum#private_call}</p>
         * <p>  emergency_group_call (Emergency group calls allowed) {@link AllowTypeEnum#emergency_group_call}</p>
         * <p>  emergency_private_call (Private emergency calls allowed){@link AllowTypeEnum#emergency_private_call}</p>
         * <p>  imminent_peril_call (Imminent peril calls allowed){@link AllowTypeEnum#imminent_peril_call}</p>
         * <p>  activate_emergency_alert (Alert calls allowed){@link AllowTypeEnum#activate_emergency_alert}</p>
         * <p>NOTE: The absence of permissions in this list indicates that it is not allowed to make such type of calls, and any attempt will give an error in {@link CallEventExtras#ERROR_CODE}.</p>
         */

        public static final String ALLOWS_LIST="org.mcopenplatform.muoapi.ConstantsMCOP.ConfigurationUpdateEventExtras"+".ALLOWS_LIST";


        /**
         * <h2>Access key to configuration error codes.</h2>
         * <p>Response: Integer indicating the error code.</p>
         * <p>Values:</p>
         *<p>Code	Explanatory text	Description</p>
         *<p>101	It has been impossible to obtain authentication data</p>
         * <p>0 means no errors</p>
         */
        public static final String ERROR_CODE="org.mcopenplatform.muoapi.ConstantsMCOP.ConfigurationUpdateEventExtras"+".ERROR_CODE";
        /**
         * <h2>Access key to the string of error codes</h2>
         */
        public static final String ERROR_STRING="org.mcopenplatform.muoapi.ConstantsMCOP.ConfigurationUpdateEventExtras"+".ERROR_STRING";

        /**
         * <h2>Type of permissions that the user obtains when receiving the data from key {@link ConfigurationUpdateEventExtras#ALLOWS_LIST}</h2>
         */
        public enum AllowTypeEnum {
            none(0x00),
            private_call (0x01),
            emergency_group_call (0x01 << 1),
            emergency_private_call (0x01 << 2),
            imminent_peril_call (0x01 << 3),
            activate_emergency_alert (0x01 << 4);
            private int code;

            AllowTypeEnum(int code) {
                this.code = code;
            }


            public int getValue() {
                return code;
            }

            public static List<AllowTypeEnum> getListAllowType(int num){
                ArrayList<AllowTypeEnum> allowTypeEnums=new ArrayList<>();
                for (ConstantsMCOP.ConfigurationUpdateEventExtras.AllowTypeEnum allowTypeEnum : ConstantsMCOP.ConfigurationUpdateEventExtras.AllowTypeEnum.values())
                    if((num & allowTypeEnum.getValue())==allowTypeEnum.getValue())
                        allowTypeEnums.add(allowTypeEnum);

                return allowTypeEnums;
            }

            public static int getValue(List<AllowTypeEnum> allowTypeEnums){
                int value=none.getValue();
                for (ConstantsMCOP.ConfigurationUpdateEventExtras.AllowTypeEnum allowTypeEnum : allowTypeEnums)
                    if(allowTypeEnum!=null)
                        value+=allowTypeEnum.getValue();

                return value;
            }


        }

    }

    /**
     *
     * Access keys to the values of type {@link org.mcopenplatform.muoapi.ConstantsMCOP.ActionsCallBack#callEvent} events.
     *
     */
    public static class CallEventExtras{

        /**
         * <h2>Access key to event type:</h2>
         * <p>Integer type values</p>
         * <p>Possible event types:</p>
         * <p>     INCOMING    (Incoming call of any MCPTT type) {@link org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras.CallEventEventTypeEnum#INCOMING}</p>
         * <p>     RINGING     (Destination of the call is ringing) {@link org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras.CallEventEventTypeEnum#RINGING}</p>
         * <p>     INPROGRESS  (MCPTT call in progress) {@link org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras.CallEventEventTypeEnum#INPROGRESS}</p>
         * <p>     CONNECTED   (Established call) {@link org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras.CallEventEventTypeEnum#CONNECTED}</p>
         * <p>     ERROR       (Any error in MCPTT calls) {@link org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras.CallEventEventTypeEnum#ERROR}</p>
         * <p>     UPDATE       (Any Change in Call) {@link org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras.CallEventEventTypeEnum#UPDATE}</p>
         */
        public static final String EVENT_TYPE="org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras"+".EVENT_TYPE";


        /**
         *  <h2>Access key to MCPTT call session ID. This identifier is unique for each call.</h2>
         *  <p>Present in all types of events {@link org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras.CallEventEventTypeEnum}</p>
         */
        public static final String SESSION_ID="org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras"+".SESSION_ID";

        /**
         *  <h2>Access key to MCPTT call type.</h2>
         *  <p>Present in event type {@link org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras.CallEventEventTypeEnum#INCOMING} and {@link org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras.CallEventEventTypeEnum#UPDATE}</p>
         */
        public static final String CALL_TYPE="org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras"+".CALL_TYPE";


        /**
         *  Access key to the caller UserID
         *  Present in event type {@link org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras.CallEventEventTypeEnum#INCOMING}
         */
        public static final String CALLER_USERID="org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras"+".CALLER_USERID";

        /**
         *<p> Access key to Error Codes</p>
         *<p> All error codes are integers:</p>
         *<p>Code	Explanatory text	Description</p>
         *<p>103	maximum simultaneous MCPTT group calls reached	The number of maximum simultaneous MCPTT group calls supported for the MCPTT user has been exceeded.</p>
         *<p>104	isfocus not assigned	A controlling MCPTT function has not been assigned to the MCPTT session.</p>
         *<p>105	subscription not allowed in a broadcast group call	Subscription to the conference event package rejected during a group call initiated as a broadcast group call.</p>
         *<p>106	user not authorised to join chat group	The MCPTT user is not authorised to join this chat group.</p>
         *<p>107	user not authorised to make private calls	The MCPTT user is not authorised to make private calls.</p>
         *<p>108	user not authorised to make chat group calls	The MCPTT user is not authorised to make chat group calls.</p>
         *<p>109	user not authorised to make prearranged group calls	The MCPTT user is not authorised to make group calls to a prearranged group.</p>
         *<p>110	user declined the call invitation	The MCPTT user declined to accept the call.</p>
         *<p>111	group call proceeded without all required group members	The required members of the group did not respond within the acknowledged call time, but the call still went ahead.</p>
         *<p>112	group call abandoned due to required group members not part of the group session	The group call was abandoned, as the required members of the group did not respond within the acknowledged call time.</p>
         *<p>116	user is not part of the MCPTT group	The group exists on the group management server but the requesting user is not part of this group.</p>
         *<p>117	the group identity indicated in the request is a prearranged group	The group id that is indicated in the request is for a prearranged group, but did not match the request from the MCPTT user.</p>
         *<p>118	the group identity indicated in the request is a chat group	The group id that is indicated in the request is for a chat group, but did not match the request from the MCPTT user.</p>
         *<p>119	user is not authorised to initiate the group call	The MCPTT user identified by the MCPTT ID is not authorised to initiate the group call.</p>
         *<p>120	user is not affiliated to this group	The MCPTT user is not affiliated to the group.</p>
         *<p>121	user is not authorised to join the group call	The MCPTT user identified by the MCPTT ID is not authorised to join the group call.</p>
         *<p>122	too many participants	The group call has reached its maximum number of participants.</p>
         *<p>123(INFO)	MCPTT session already exists	Inform the MCPTT user that the group call is currently ongoing.</p>
         *<p>124	maximum number of private calls reached	The maximum number of private calls allowed at the MCPTT server for the MCPTT user has been reached.</p>
         *<p>127	user not authorised to be called in private call	The called MCPTT user is not allowed to be part of a private call.</p>
         *<p>144	user not authorised to call this particular user	The calling user is not authorised to call this particular called user.</p>
         *<p>145	unable to determine called party	The participating function was unable to determine the called party from the information received in the SIP request.</p>
         *<p>147(INFO)	user is authorized to initiate a temporary group call	The non-controlling MCPTT function has authorized a request from the controlling MCPTT function to authorize a user to initiate an temporary group session.</p>
         *<p>148(INFO)	MCPTT group is regrouped	The MCPTT group hosted by a non-controlling MCPTT function is part of a temporary group session as the result of the group regroup function.</p>
         *<p>151	user not authorised to make a private call call-back request	The MCPTT user is not authorised to make a private call call-back request.</p>
         *<p>152	user not authorised to make a private call call-back cancel request	The MCPTT user is not authorised to make a private call call-back cancel request.</p>
         *<p>153	user not authorised to call any of the users requested in the first-to-answer call	All users that were invited in the first-to-answer call cannot be involved in a private call with the inviting user.</p>
         *<p>154	user not authorised to make ambient listening call	The MCPTT user is not authorised to make an ambient listening call.</p>
         *<p>156	user not authorised to originate a first-to-answer call	The MCPTT user is not authorised to make a first-to-answer call.</p>
         *
         *<p>401   Invalid call type.</p>
         *<p>402   Invalid action.</p>
         *<p>403   in MakeCall the UserID is not valid. the UserID is empty, or don´t have URI format</p>
         *<p>404   The call can not be hung because is not made</p>
         *<p>405   The call cannot be accepted because it has not received any call for that sessionID</p>
         *<p>406   The sessionID could not be created</p>
         *<p>407   The call cannot be made because this unregistered</p>
         *<p>408   User destination is not available at the moment</p>
         *<p>409   Undefined signal error</p>
         *<p>410   The destination is busy</p>
         */
        public static final String ERROR_CODE="org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras"+".ERROR_CODE";
        /**
         * Access key to Error Codes string.
         */
        public static final String ERROR_STRING="org.mcopenplatform.muoapi.ConstantsMCOP.CallEventExtras"+".ERROR_STRING";


        /**
         * Types of CallEvent events.
         */
        public enum CallEventEventTypeEnum{
            NONE (0x00),
            INCOMING(0x01),
            RINGING(0x02),
            INPROGRESS(0x03),
            CONNECTED(0x04),
            TERMINATED(0x05),
            ERROR(0x06),
            UPDATE(0x07);

            private int code;
            CallEventEventTypeEnum(int code) {
                this.code = code;
            }
            public int getValue() {
                return code;
            }


            private static Map map = new HashMap<>();


            static {
                for (CallEventEventTypeEnum pageType : CallEventEventTypeEnum.values()) {
                    map.put(pageType.code, pageType);
                }
            }

            public static CallEventEventTypeEnum fromInt(int pageType) {
                return (CallEventEventTypeEnum) map.get(pageType);
            }

        }
        /**
         * <h2>Individual call types than can be combined and used in {@link IMCOPsdk#makeCall(String, int)} or received in type {@link ConstantsMCOP.CallEventExtras.CallEventEventTypeEnum#INCOMING} events</h2>
         */
        public enum CallTypeEnum {

            None(0x00),
            Audio (0x01),
            Video (0x01 << 1),
            Data (0x01 << 2),
            WithFloorCtrl (0x01 << 3),
            WithoutFloorCtrl (0x01 << 4),
            Private (0x01 << 5),
            Broadcast (0x01 << 6),
            PrearrangedGroup (0x01 << 7),
            ChatGroup (0x01 << 8),
            FirstToAnswer (0x01 << 9), //REL 14
            PrivateCallCallback (0x01 << 10), //REL 14
            RemoteAmbientListening (0x01 << 11), //REL 14
            LocalAmbientListening (0x01 << 12), //REL 14
            Emergency (0x01 << 13),
            ImminentPeril (0x01 << 14),
            EmergencyAlert (0x01 << 15);

            private int code;

            CallTypeEnum(int code) {
                this.code = code;
            }


            public int getValue() {
                return code;
            }

            public static List<CallTypeEnum> getListCallType(int num){
                ArrayList<CallTypeEnum> callTypesEnum=new ArrayList<>();
                for (CallTypeEnum callTypeEnum : CallTypeEnum.values())
                    if((num & callTypeEnum.getValue())==callTypeEnum.getValue())
                        callTypesEnum.add(callTypeEnum);

                return callTypesEnum;
            }

            public static Map<CallTypeEnum,Integer> getMapCallType(int num){
                Map<CallTypeEnum,Integer> callTypesEnum=new HashMap<>();
                for (CallTypeEnum callTypeEnum : CallTypeEnum.values())
                    if((num & callTypeEnum.getValue())==callTypeEnum.getValue())
                        callTypesEnum.put(callTypeEnum,callTypeEnum.getValue());
                return callTypesEnum;
            }

            public static int getValue(List<CallTypeEnum> callTypeEnums){
                int value=None.getValue();
                for (CallTypeEnum callTypeEnum : callTypeEnums)
                    if(callTypeEnum!=null)
                        value+=callTypeEnum.getValue();

                return value;
            }


        }
    }



    //Pending more definitions
    public static class ConfigurationUpdateExtras{
        //GROUPS_LIST-> returns list String (URI String)
        public static final String GROUPS_LIST="org.mcopenplatform.muoapi.ConstantsMCOP.ConfigurationUpdateExtras"+".SUCCESS";
        //ERROR_CODE-> returns int!=0 if the configurationUpdate fails. 0 if Successful
        public static final String ERROR_CODE="org.mcopenplatform.muoapi.ConstantsMCOP.ConfigurationUpdateExtras"+".ERROR_CODE";
        //ERROR_STRING-> returns String (define the error) if the configurationUpdate fails.
        public static final String ERROR_STRING="org.mcopenplatform.muoapi.ConstantsMCOP.ConfigurationUpdateExtras"+".ERROR_STRING";
    }


    /**
     *
     * <h1>Access keys to the values of the floor control events in any MCPTT session.</h1>
     *
     */
    public static class FloorControlEventExtras{

        /**
         * <h2>Access key to the list of floor control events.</h2>
         * <p>This event is received every time an action is generated on any floor control of any MCPTT session.</p>
         * <p>Response: String</p>
         * <p>Values:
         * <p>     granted      (Session control granted) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#granted}</p>
         * <p>     idle         (Nobody has control of the session) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#idle}</p>
         * <p>     taken         (Other session participant has control) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#taken}</p>
         * <p>     request_sent  (Session control request sent) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#request_sent}</p>
         * <p>     release_sent   (Session control release sent) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#idle}</p>
         * <p>     denied         (Session control denied) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#denied}</p>
         * <p>     revoked         (Session control revoked) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#revoked}</p>
         * <p>     queued         (Session control request queued) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#queued}</p>
         * <p>     queued_timeout         (Queued request timed out) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#queued_timeout}</p>
         * <p>     transmission_granted         (Transmission granted) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#transmission_granted}</p>
         * <p>     reception_granted         (Reception granted) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#reception_granted}</p>
         * <p>     transmission_rejection         (Transmission rejected) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#transmission_rejection}</p>
         * <p>     reception_rejection         (Reception rejected) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#reception_rejection}</p>
         * <p>     transmission_revoke         (Transmission revoked) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#transmission_revoke}</p>
         * <p>     reception_revoke         (Reception revoked) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#reception_revoke}</p>
         * <p>     transmission_notification         (Transmission notification) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#transmission_notification}</p>
         * <p>     transmission_end_notification         (Transmission notification end) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#transmission_end_notification}</p>
         * <p>     transmission_end_response         (Transmission end response) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#transmission_end_response}</p>
         * <p>     reception_end_response         (Reception end response) {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#reception_end_response}</p>
         */
        public static final String FLOOR_CONTROL_EVENT="org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras"+".FLOOR_CONTROL_EVENT";


        /**
         * <h2>Access key to DISPLAY NAME of the client linked to one of the events in {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum}</h2>
         * <p>It is usually used with the event {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#taken} to know who is talking at each moment.</p>
         * <p>Response: String that identifies the user with a human-readable alias, more pleasant than a MCPTT identifier.</p>
         */
        public static final String DISPLAY_NAME="org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras"+".DISPLAY_NAME";

        /**
         * <h2>Access key to DURATION TOKEN of Number of seconds that a client can speak {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum}</h2>
         * <p>It is usually used with the event {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#granted} to know who is talking at each moment.</p>
         * <p>Response: Number of seconds that a client can speak.</p>
         */
        public static final String DURATION_TOKEN="org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras"+".DURATION_TOKEN";

        /**
         * <h2>Access key to User ID that univocally distinguishes the MCPTT user causing the event {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum}</h2>
         * <p>Usually used with events:</p>
         * <p>      {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#taken} to know who is talking at each moment.</p>
         * <p>      {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#reception_granted}</p>
         * <p>      {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#transmission_end_response}</p>
         * <p>      {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#reception_end_response}</p>
         * <p>Response: String with URI format that identifies the MCPTT user.</p>
         */
        public static final String USER_ID="org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras"+".USER_ID";


        /**
         * <h2>Access key to ALLOW REQUEST that indicates whether a call can be made to {@link org.mcopenplatform.muoapi.IMCOPsdk#floorControlOperation(String, int, String)} to request the token despite being in a {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#taken} state</h2>
         * <p>This data will be obtained every time a {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#taken} event is received.</p>
         * <p>Response: boolean</p>
         */
        public static final String ALLOW_REQUEST="org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras"+".ALLOW_REQUEST";

        /**
         *  Access key to MCPTT calls Session ID. This identifier is unique for each call.
         *  It occurs in all types of {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum} events.
         */
        public static final String SESSION_ID="org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras"+".SESSION_ID";


        /**
         * <h2>Access key to the numbering of a specific MCPTT session control denial or revocation event.</h2>
         * <p>Response: Integer indicating the code of the cause.</p>
         * <p>Values:</p>
         * <p>  Event  {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#denied}:</p>
         * <p> 101     Cause #1 - Another MCPTT client has permission The <Reject cause> value set to '1' indicates that another MCPTT user has permission to send a media.</p>
         * <p> 102     Cause #2 - Internal floor control server error The <Reject cause> value set to '2' indicates that the floor control server cannot grant the floor request due to an internal error.</p>
         * <p> 103     Cause #3 - Only one participant The <Reject cause> value set to '3' indicates that the floor control server cannot grant the floor request, because the requesting party is the only participant in the MCPTT session.</p>
         * <p> 104     Cause #4 - Retry-after timer has not expired The <Reject cause> value set to '4' indicates that the floor control server cannot grant the floor request, because timer T9 (Retry-after) has not expired after permission to send media has been revoked.</p>
         * <p> 105     Cause #5 - Receive only The <Reject cause> value set to '5' indicates that the floor control server cannot grant the floor request, because the requesting party only has receive privilege.</p>
         * <p> 106     Cause #6 - No resources available The <Reject cause> value set to '6' indicates that the floor control server cannot grant the floor request due to congestion.</p>
         * <p> 107     Cause #7 – Queue full The <Reject cause> value set to 7 indicates that the floor control server cannot queue the floor request, because the queue is full.</p>
         * <p> 108     Cause #255 - Other reason The <Reject cause> value set to '255' indicates that the floor control server does not grant the floor request due to the floor control server local policy.</p>
         * <p>  Event  {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#revoked}:</p>
         * <p> 201     Cause #1 – Only one MCPTT client The <Reject Cause> value set to '1' indicates that the MCPTT client is the only MCPTT client in the MCPTT session or the only participant connected to a floor control server. No additional information included.</p>
         * <p> 202     Cause #2 – Media burst too long The <Reject Cause> value set to '2' indicates that the MCPTT User has talked too long (e.g., the stop-talking timer has expired). No additional information included.</p>
         * <p> 203     Cause #3 - No permission to send a Media Burst The <Reject Cause> value set to '3' indicates that the MCPTT client does not have permission to send media. No additional information is included.</p>
         * <p> 204     Cause #4 - Media Burst pre-empted The <Reject Cause> value set to '4' indicates that the MCPTT client 's permission to send a media is being pre-empted. No additional information is included.</p>
         * <p> 205     Cause #6 - No resources available The <Reject Cause> value set to '6' indicates that the floor control server can no longer grant MCPTT client to send media due to congestion. No additional information is included.</p>
         * <p> 206     Cause #255 – Other reason The <Reject Cause> value set to '255' indicates that the floor control server can no longer grant MCPTT client to send media due to the floor control server local policy. No additional information is included.</p>
         * <p>  Event  {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#transmission_rejection}:</p>
         * <p> 301     Cause #1 - Transmission limit reached The <Reject cause> value set to '1' indicates that the number of transmitters have reached maximum.</p>
         * <p> 302     Cause #2 - Internal transmission control server error The <Reject cause> value set to '2' indicates that the transmission control server cannot grant the transmission request due to an internal error.</p>
         * <p> 303     Cause #3 - Only one participant The <Reject cause> value set to '3' indicates that the transmission control server cannot grant the transmission request, because the requesting party is the only participant in the MCVideo session.</p>
         * <p> 304     Cause #4 - Retry-after timer has not expired The <Reject cause> value set to '4' indicates that the transmission control server cannot grant the transmission request, because timer T9 (Retry-after) has not expired after permission to send media has been revoked.</p>
         * <p> 305     Cause #5 - Receive only The <Reject cause> value set to '5' indicates that the transmission control server cannot grant the transmission request, because the requesting party only has receive privilege.</p>
         * <p> 306     Cause #6 - No resources available The <Reject cause> value set to '6' indicates that the transmission control server cannot grant the transmission request due to congestion.</p>
         * <p> 307     Cause #255 - Other reason The <Reject cause> value set to '255' indicates that the transmission control server does not grant the transmission request due to the transmission control server local policy.</p>
         * <p>  Event  {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#transmission_revoke}:</p>
         * <p> 401     Cause #1 – Only one MCVideo client The <Reject Cause> value set to '1' indicates that the MCVideo client is the only MCVideo client in the MCVideo session or the only participant connected to a transmission control server. No additional information included.</p>
         * <p> 402     Cause #2 – Media burst too long The <Reject Cause> value set to '2' indicates that the MCVideo User has transmitted too long (e.g., the stop-transmission timer has expired). No additional information included.</p>
         * <p> 403     Cause #3 - No permission to send a Media Burst The <Reject Cause> value set to '3' indicates that the MCVideo client does not have permission to send media. No additional information is included.</p>
         * <p> 404     Cause #4 - Media Burst pre-empted The <Reject Cause> value set to '4' indicates that the MCVideo client's permission to send a media is being pre-empted. No additional information is included.</p>
         * <p> 405     Cause #6 - No resources available The <Reject Cause> value set to '6' indicates that the transmission control server can no longer grant MCVideo client to send media due to congestion. No additional information is included.</p>
         * <p> 406     Cause #255 – Other reason The <Reject Cause> value set to '255' indicates that the transmission control server can no longer grant MCVideo client to send media due to the transmission control server local policy. No additional information is included.</p>
         * <p>  Event  {@link org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FloorControlEventTypeEnum#reception_rejection}:</p>
         * <p> 501     Cause #2 - Internal transmission control server error The <Reject cause> value set to '2' indicates that the transmission control server cannot grant the receive media request due to an internal error.</p>
         * <p> 502     Cause #4 - Retry-after timer has not expired The <Reject cause> value set to '4' indicates that the transmission control server cannot grant the receive media request, because timer T9 (Retry-after) has not expired after permission to send media has been revoked.</p>
         * <p> 503     Cause #5 - Send only The <Reject cause> value set to '5' indicates that the transmission control server cannot grant the receive media request, because the requesting party only has send privilege.</p>
         * <p> 504     Cause #6 - No resources available The <Reject cause> value set to '6' indicates that the transmission control server cannot grant the receive media request due to congestion.</p>
         * <p> 505     Cause #255 - Other reason The <Reject cause> value set to '255' indicates that the transmission control server does not grant the receive media request due to the transmission control server local policy.</p>
         */
        public static final String CAUSE_CODE="org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras"+".CAUSE_CODE";
        /**
         * <h2>Access key to the string of the cause codes.</h2>
         */
        public static final String CAUSE_STRING="org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras"+".CAUSE_STRING";
        /**
         *<p> Access key to Error Codes</p>
         *<p> All error codes are integers:</p>
         *<p>Code	Explanatory text	Description</p>
         *<p>103	maximum simultaneous MCPTT group calls reached	The number of maximum simultaneous MCPTT group calls supported for the MCPTT user has been exceeded.</p>
         *<p>104	isfocus not assigned	A controlling MCPTT function has not been assigned to the MCPTT session.</p>


         /**
         * <h2>Access key to the floor control error codes.</h2>
         * <p>Response: Integer indicating the error code.</p>
         * <p>Values:</p>
         * <p>0 means no error.</p>
         * <p>Code	Description</p>
         * <p>101	The session cannot be accepted because it has not received any session for that sessionID</p>
         * <p>102	Floor control invalid operation</p>
         */
        public static final String ERROR_CODE="org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras"+".ERROR_CODE";
        /**
         * <h2>Access key to the Error codes string.</h2>
         */
        public static final String ERROR_STRING="org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras"+".ERROR_STRING";


        /**
         * <h2>Operation types performed in method {@link IMCOPsdk#floorControlOperation(String, int, String)} for MCPTT session control management.</h2>
         */
        public enum FloorControlOperationTypeEnum{
            none(0x00),
            MCPTT_Request(0x01),
            MCPTT_Release(0x02),
            TRANSMISION_Request(0x03),
            TRANSMISION_End_Request(0x04),
            RECEPTION_Request(0x05),
            RECEPTION_End_Request(0x06);
            private int code;
            FloorControlOperationTypeEnum(int code) {
                this.code = code;
            }
            public int getValue() {
                return code;
            }

            private static Map map = new HashMap<>();


            static {
                for (FloorControlOperationTypeEnum pageType : FloorControlOperationTypeEnum.values()) {
                    map.put(pageType.code, pageType);
                }
            }

            public static FloorControlOperationTypeEnum fromInt(int pageType) {
                return (FloorControlOperationTypeEnum) map.get(pageType);
            }
        }

        /**
         * <h2>Types of event referred to the floor control of an MCPTT session and received on key {@link ConstantsMCOP.FloorControlEventExtras#FLOOR_CONTROL_EVENT} events.</h2>
         */
        public enum FloorControlEventTypeEnum{
            none (""),
            granted("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".granted"),
            idle("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".idle"),
            taken("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".taken"),
            request_sent("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".request_sent"),
            release_sent("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".release_sent"),
            denied("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".denied"),
            revoked("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".revoked"),
            queued("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".queued"),
            queued_timeout("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".queued_timeout"),
            transmission_granted("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".transmission_granted"),
            reception_granted("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".reception_granted"),
            transmission_rejection("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".transmission_rejection"),
            reception_rejection("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".reception_rejection"),
            transmission_revoke("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".transmission_revoke"),
            reception_revoke("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".reception_revoke"),
            transmission_notification("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".transmission_notification"),
            transmission_end_notification("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".transmission_end_notification"),
            transmission_end_response("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".transmission_end_response"),
            reception_end_response("org.mcopenplatform.muoapi.ConstantsMCOP.FloorControlEventExtras.FLOOR_CONTROL_EVENT"+".reception_end_response");

            private final String text;

            /**
             * @param text
             */
            FloorControlEventTypeEnum(final String text) {
                this.text = text;
            }

            /* (non-Javadoc)
             * @see java.lang.Enum#toString()
             */
            @Override
            public String toString() {
                return text;
            }

            public static FloorControlEventTypeEnum fromString(String text) {
                for (FloorControlEventTypeEnum value : FloorControlEventTypeEnum.values()) {
                    if (value.text.equalsIgnoreCase(text)) {
                        return value;
                    }
                }
                return null;
            }

        }


    }

    /**
     *
     * <h1>Access key to event {@link ActionsCallBack#groupInfoEvent} values.</h1>
     * <h2>For each group the user belongs to, an event with the different data that defines the group will be sent.</h2>
     *
     */
    public static class GroupInfoEventExtras{



        /**
         * <h2>Access key to the Group ID that allows to univocally distinguish the MCPTT group causing the event.</h2>
         * <p>Response: String with URI format that identifies the MCPTT group.</p>
         */
        public static final String GROUP_ID="org.mcopenplatform.muoapi.ConstantsMCOP.GroupInfoEventExtras"+".GROUP_ID";


        /**
         * <h2>Access key to the Display Name that allows to distinguish the MCPTT group causing the event.</h2>
         * <p>Response: String that identifies the MCPTT group in a human-readable format.</p>
         */
        public static final String DISPLAY_NAME="org.mcopenplatform.muoapi.ConstantsMCOP.GroupInfoEventExtras"+".DISPLAY_NAME";

        /**
         * <h2>Access key to the permissions of the MCPTT group.</h2>
         * <p>Response: Integer containing the different FLAGs of the user's permissions on the group.</p>
         * <p>Values:</p>
         * <p>0 means no permission.</p>
         * <p>      invite_members                          ("exist" represents the pre-arranged group in on-network MCPTT procedures; "not exist" represents the chat group in on-network MCPTT procedures. This value is used when the element is not present.)   {@link AllowTypeEnum#invite_members}</p>
         * <p>      recvonly                                (Receiving calls allowed, but not making them)   {@link AllowTypeEnum#recvonly}</p>
         * <p>      emergency_call                          (Emergency group calls allowed)   {@link AllowTypeEnum#emergency_call}</p>
         * <p>      imminent_peril_call                     (Imminent peril group calls allowed)   {@link AllowTypeEnum#imminent_peril_call}</p>
         * <p>      emergency_alert_call                    (Emergency alert group calls allowed)   {@link AllowTypeEnum#emergency_alert_call}</p>
         * <p>      video_invite_members                    ("exist" represents the pre-arranged group in on-network MCVideo procedures; "not exist" represents the chat group in on-network MCVideo procedures. This value is used when the element is not present)   {@link AllowTypeEnum#video_invite_members}</p>
         * <p>      non_real_time_video_mode                ("exist" indicates that non real-time video mode is allowed for the MCVideo group. "not exist" indicates that non real-time video mode is not allowed for the MCVideo group. This value is used when the element is not present)   {@link AllowTypeEnum#non_real_time_video_mode}</p>
         * <p>      non_urgent_real_time_video_mode         ("exist" indicates that non urgent real-time video mode is allowed for the MCVideo group. "not exist" indicates that non urgent real-time video mode is not allowed for the MCVideo group. This value is used when the element is not present)   {@link AllowTypeEnum#non_urgent_real_time_video_mode}</p>
         * <p>      urgent_real_time_video_mode             ("exist" indicates that urgent real-time video mode is allowed for the MCVideo group. "not exist" indicates that urgent real-time video mode is not allowed for the MCVideo group. This value is used when the element is not present;)   {@link AllowTypeEnum#urgent_real_time_video_mode}</p>
         * <p>      short_data_service                      (Short data allowed)   {@link AllowTypeEnum#short_data_service}</p>
         * <p>      file_distribution                       (Distributed file sharing allowed)   {@link AllowTypeEnum#file_distribution}</p>
         * <p>      conversation_management                 ("exist" indicates that conversation management is enabled for the MCData group. This value is used when the element is not present; "not exist" indicates that conversation management is disabled for the MCData group.)   {@link AllowTypeEnum#conversation_management}</p>
         * <p>      tx_control                              ("exist" indicates that transmission control is enabled for the MCData group. This value is used when the element is not present; "not exist" indicates that transmission control is disabled for the MCData group.)   {@link AllowTypeEnum#tx_control}</p>
         * <p>      rx_control                              ("exist" indicates that reception control is enabled for the MCData group. This value is used when the element is not present; "not exist" indicates that reception control is disabled for the MCData group.)   {@link AllowTypeEnum#rx_control}</p>
         * <p>      enhanced_status                         ("exist" indicates that enhanced status is enabled for the MCData group. This value is used when the element is not present; "not exist" indicates that enhanced status is disabled for the MCData group.)   {@link AllowTypeEnum#enhanced_status}</p>
         */
        public static final String ALLOWS_GROUP="org.mcopenplatform.muoapi.ConstantsMCOP.GroupInfoEventExtras"+".ALLOWS_GROUP";


        /**
         * <h2>Access key to maximum allowed size for SDS data transmission.</h2>
         * <p>Indicates the maximum size of data (in bytes) that the originating MCData client is allowed to send to the MCData server for on-network SDS communications.</p>
         * <p>Response: Integer (in bytes)</p>
         */
        public static final String MAX_DATA_SIZE_FOR_SDS="org.mcopenplatform.muoapi.ConstantsMCOP.GroupInfoEventExtras"+".MAX_DATA_SIZE_FOR_SDS";

        /**
         * <h2>Access key to maximum allowed file size for FD data transmission.</h2>
         * <p>Indicates the maximum size of data (in bytes) that the originating MCData client is allowed to send to the MCData server for on-network FD communications.</p>
         * <p>Response: Integer (in bytes)</p>
         */
        public static final String MAX_DATA_SIZE_FOR_FD="org.mcopenplatform.muoapi.ConstantsMCOP.GroupInfoEventExtras"+".MAX_DATA_SIZE_FOR_FD";


        /**
         * <h2>Access key to maximum allowed file size for FD data transmission using HTTP.</h2>
         * <p>Indicates the maximum size of data (in bytes) which the MCData server always requests the terminating MCData client to automatically download for on-network FD communications using HTTP.</p>
         * <p>Response: Integer (in bytes)</p>
         */
        public static final String MAX_DATA_SIZE_AUTO_RECV="org.mcopenplatform.muoapi.ConstantsMCOP.GroupInfoEventExtras"+".MAX_DATA_SIZE_AUTO_RECV";

        /**
         * <h2>Access key to real-time video mode.</h2>
         * <p>Response: String</p>
         * <p>Values {@link ActionRealTimeVideoType}:</p>
         * <p>      urgent_real_time                                ()   {@link ActionRealTimeVideoType#urgent_real_time}</p>
         * <p>      non_urgent_real_time                            ()   {@link ActionRealTimeVideoType#non_urgent_real_time}</p>
         * <p>      non_real_time                                   ()   {@link ActionRealTimeVideoType#non_real_time}</p>
         *
         */
        public static final String ACTIVE_REAL_TIME_VIDEO_MODE="org.mcopenplatform.muoapi.ConstantsMCOP.GroupInfoEventExtras"+".ACTIVE_REAL_TIME_VIDEO_MODE";


        /**
         * <h2>Types of real-time video modes.</h2>
         */
        public enum ActionRealTimeVideoType{
            none (""),
            urgent_real_time("urgent-real-time"),
            non_urgent_real_time("non-urgent-real-time"),
            non_real_time("non-real-time");


            private final String text;

            /**
             * @param text
             */
            ActionRealTimeVideoType(final String text) {
                this.text = text;
            }

            /* (non-Javadoc)
             * @see java.lang.Enum#toString()
             */
            @Override
            public String toString() {
                return text;
            }
        }

        /**
         * <h2>Access key to the group participants list.</h2>
         * <p>Response: Array with 3 Strings:.</p>
         * <p>      Component 0: UserID unequivocally identifies the user.</p>
         * <p>      Component 1: ParticipantType indicates the user position in the organization. Not defined by 3GPP.</p>
         * <p>      Component 2: DisplayName identifies the user.</p>
         */
        public static final String PARTICIPANTS_LIST="org.mcopenplatform.muoapi.ConstantsMCOP.GroupInfoEventExtras"+".PARTICIPANTS_LIST";

        /**
         * <h2>Access key to group info error codes.</h2>
         * <p>Response: Integer indicating error codes.</p>
         * <p>Values:</p>
         * <p>0 means no errors.</p>
         * <p> 101   Received data groups not valid</p>
         */
        public static final String ERROR_CODE="org.mcopenplatform.muoapi.ConstantsMCOP.GroupInfoEventExtras"+".ERROR_CODE";
        /**
         * <h2>Access key to the Error codes string.</h2>
         */
        public static final String ERROR_STRING="org.mcopenplatform.muoapi.ConstantsMCOP.GroupInfoEventExtras"+".ERROR_STRING";


        /**
         * <h2>Type of permission in a group.</h2>
         *
         */
        public enum AllowTypeEnum{
            none(0x00),
            //MCPTT
            invite_members(0x01),
            recvonly(0x01 << 1),
            emergency_call(0x01 << 2),
            imminent_peril_call(0x01 << 3),
            emergency_alert_call(0x01 << 4),
            //MCVIDEO
            video_invite_members(0x01 << 5),
            non_real_time_video_mode(0x01 << 6),
            non_urgent_real_time_video_mode(0x01 << 7),
            urgent_real_time_video_mode(0x01 << 8),
            //MCDATA
            short_data_service(0x01 << 11),
            file_distribution(0x01 << 12),
            conversation_management(0x01 << 13),
            tx_control(0x01 << 14),
            rx_control(0x01 << 15),
            enhanced_status(0x01 << 16);

            private int code;

            AllowTypeEnum(int code) {
                this.code = code;
            }


            public int getValue() {
                return code;
            }

            public static List<AllowTypeEnum> getListAllowType(int num){
                ArrayList<AllowTypeEnum> allowTypeEnums=new ArrayList<>();
                for (AllowTypeEnum allowTypeEnum : AllowTypeEnum.values())
                    if((num & allowTypeEnum.getValue())==allowTypeEnum.getValue())
                        allowTypeEnums.add(allowTypeEnum);

                return allowTypeEnums;
            }

            public static int getValue(List<AllowTypeEnum> callTypeEnums){
                int value=none.getValue();
                for (AllowTypeEnum callTypeEnum : callTypeEnums)
                    if(callTypeEnum!=null)
                        value+=callTypeEnum.getValue();

                return value;
            }
        }




    }

    /**
     *
     * <h1>Access key to values of {@link ActionsCallBack#groupAffiliationEvent} event.</h1>
     *
     */
    public static class GroupAffiliationEventExtras{

        /**
         * <h2>Access key to MAP<String, Integer> of groups and the current group state.</h2>
         * <p>This data is given in state {@link org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras.GroupAffiliationEventTypeEnum#GROUP_AFFILIATION_UPDATE}</p>
         * <p>Response: MAP<String,Integer> being Group ID the key, and the type of affiliation status the value.</p>
         * <p>      notaffiliated                                (Not affiliated, and therefore no action that requires being affiliated can be taken.)   {@link GroupAffiliationEventExtras.GroupAffiliationStateEnum#notaffiliated}</p>
         * <p>      affiliating                                  (Affiliation procedure initiated.)   {@link GroupAffiliationEventExtras.GroupAffiliationStateEnum#affiliating}</p>
         * <p>      affiliated                                   (Affiliated. All MCPTT procedures that require affiliation can be performed.)   {@link GroupAffiliationEventExtras.GroupAffiliationStateEnum#affiliated}</p>
         * <p>      deaffiliating                                (Deaffiliation procedure started.)   {@link GroupAffiliationEventExtras.GroupAffiliationStateEnum#deaffiliating}</p>
         */
        public static final String GROUPS_LIST="org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras"+".GROUPS_LIST";

        /**
         * <h2>Access key to event type:</h2>
         * <p>Value: Integer.</p>
         * <p>Possible event types:</p>
         * <p>     GROUP_AFFILIATION_UPDATE    (Event to update the status of the groups and user's affiliation to them.) {@link org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras.GroupAffiliationEventTypeEnum#GROUP_AFFILIATION_UPDATE}</p>
         * <p>     GROUP_AFFILIATION_ERROR     (Error event in some affiliation procedure.) {@link org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras.GroupAffiliationEventTypeEnum#GROUP_AFFILIATION_ERROR}</p>
         * <p>     REMOTE_AFFILIATION          (Remote affiliation request by another privileged user. It is mandatory to present the user the option to join or not. In case the user wants to be affiliated, the operation {@link IMCOPsdk#groupAffiliationOperation(String, String, int)} must be executed to affiliate the user to the group.) {@link org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras.GroupAffiliationEventTypeEnum#REMOTE_AFFILIATION}</p>
         */
        public static final String EVENT_TYPE="org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras"+".EVENT_TYPE";

        /**
         * <h2>Access key to the Group ID that univocally distinguishes the MCPTT group causing the event.</h2>
         * <p>Response: String with URI format that identifies the MCPTT group.</p>
         * <p>Event {@link org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras.GroupAffiliationEventTypeEnum#REMOTE_AFFILIATION} is used to request the group.</p>
         */
        public static final String REMOTE_GROUP_ID="org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras"+".REMOTE_GROUP_ID";


        /**
         * <h2>Access key to Group ID to know the group where the error occurred.</h2>
         * <p>Response: String with URI format that identifies the MCPTT group.</p>
         * <p>Event {@link org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras.GroupAffiliationEventTypeEnum#GROUP_AFFILIATION_ERROR} is used.</p>
         */
        public static final String GROUP_ID="org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras"+".GROUP_ID";

        /**
         * <h2>Access key to the User ID that univocally distinguishes the privileged MCPTT user making the explicit affiliation.</h2>
         * <p>Response: String with URI format that identifies the MCPTT user.</p>
         * <p>Event {@link org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras.GroupAffiliationEventTypeEnum#REMOTE_AFFILIATION} is used to know the remote user requesting the explicit affiliation.</p>
         *
         */
        public static final String REMOTE_USER_ID="org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras"+".REMOTE_USER_ID";

        /**
         * <h2>Access key to the type of action that is remotely requested to be performed.</h2>
         * <p>Response: {@link GroupAffiliationStateEnum}.</p>
         * <p>Event {@link org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras.GroupAffiliationEventTypeEnum#REMOTE_AFFILIATION} is used to know the remote user requesting the explicit affiliation.</p>
         * <p>      affiliating                                  (It must be asked whether the user accepts the affiliation or not.)   {@link GroupAffiliationEventExtras.GroupAffiliationStateEnum#affiliating}</p>
         * <p>      deaffiliating                                (It must be asked whether the user accepts the de-affiliation or not.)   {@link GroupAffiliationEventExtras.GroupAffiliationStateEnum#deaffiliating}</p>
         */
        public static final String REMOTE_ACTION_TYPE="org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras"+".REMOTE_ACTION_TYPE";


        /**
         * <h2>Access key to the affiliation error codes.</h2>
         * <p>Response: Integer indicating the error code.</p>
         * <p>Values:</p>
         * <p>0 means no errors.</p>
         * <p>  101 Non-existent group</p>
         * <p>  102 Action not allowed</p>
         * <p>  103 The user is not a member of the group</p>
         * <p>  104 The group is not currently affiliate</p>
         * <p>  105 The group already is affiliated</p>
         * <p>  106 The group already is not affiliated</p>
         * <p>  107 The group does not belong to the list of existing groups</p>
         * <p>  108 We don't have information of affiliation</p>
         * <p>  109 The group already is affiliating or deaffiliating</p>
         * @See IMCOPsdk#groupAffiliationOperation
         */
        public static final String ERROR_CODE="org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras"+".ERROR_CODE";
        /**
         * <h2>Access key to the error string of the affiliation methods.</h2>
         * <p>Response: String describing the error.</p>
         */
        public static final String ERROR_STRING="org.mcopenplatform.muoapi.ConstantsMCOP.GroupAffiliationEventExtras"+".ERROR_STRING";

        /**
         * <h2>Status types of the referenced group.</h2>
         */
        public enum GroupAffiliationStateEnum{
            none(0x00),
            notaffiliated(0x01),
            affiliating(0x02),
            affiliated(0x03),
            deaffiliating(0x04);
            private int code;
            GroupAffiliationStateEnum(int code) {
                this.code = code;
            }
            public int getValue() {
                return code;
            }

            private static Map map = new HashMap<>();


            static {
                for (GroupAffiliationStateEnum pageType : GroupAffiliationStateEnum.values()) {
                    map.put(pageType.code, pageType);
                }
            }

            public static GroupAffiliationStateEnum fromInt(int pageType) {
                return (GroupAffiliationStateEnum) map.get(pageType);
            }

        }

        /**
         * <h2>Event types of GroupAffiliationEventExtras</h2>
         */
        public enum GroupAffiliationEventTypeEnum{
            NONE (0x00),
            GROUP_AFFILIATION_UPDATE(0x01),
            GROUP_AFFILIATION_ERROR(0x02),
            REMOTE_AFFILIATION(0x03);


            private int code;
            GroupAffiliationEventTypeEnum(int code) {
                this.code = code;
            }
            public int getValue() {
                return code;
            }

            private static Map map = new HashMap<>();


            static {
                for (GroupAffiliationEventTypeEnum pageType : GroupAffiliationEventTypeEnum.values()) {
                    map.put(pageType.code, pageType);
                }
            }

            public static GroupAffiliationEventTypeEnum fromInt(int pageType) {
                return (GroupAffiliationEventTypeEnum) map.get(pageType);
            }
        }

        /**
         *
         * <h1>Event used to indicate the affiliation action that must be used in method {@link IMCOPsdk#groupAffiliationOperation(String, String, int)}.</h1>
         * <p>Values:</p>
         * <p>Error Code 0 is not correct, and it will answer with an error.</p>
         * <p>     Affiliate            (Affiliation action over a groupID) {@link AffiliationOperationTypeEnum#Affiliate}</p>
         * <p>     Deaffiliate          (De-affiliation action over a groupID) {@link AffiliationOperationTypeEnum#Deaffiliate}</p>
         */
        public enum AffiliationOperationTypeEnum{
            none(0x00),
            Affiliate (0x01),
            Deaffiliate (0x02);
            private int code;
            AffiliationOperationTypeEnum(int code) {
                this.code = code;
            }
            public int getValue() {
                return code;
            }
            private static Map map = new HashMap<>();


            static {
                for (AffiliationOperationTypeEnum pageType : AffiliationOperationTypeEnum.values()) {
                    map.put(pageType.code, pageType);
                }
            }

            public static AffiliationOperationTypeEnum fromInt(int pageType) {
                return (AffiliationOperationTypeEnum) map.get(pageType);
            }
        }

    }

    /**
     *
     * <h1>Access key to the values of event {@link ActionsCallBack#selectedContactChangeEvent}.</h1>
     *
     */
    public static class SelectedContactChangeEventExtras{

        /**
         * <h2>Access key to Group ID to define the default call group.</h2>
         * <p>Response: String with URI format that identifies the MCPTT group.</p>
         * @See IMCOPsdk#makeCall
         */
        public static final String GROUP_ID="org.mcopenplatform.muoapi.ConstantsMCOP.SelectedContactChangeEventExtras"+".GROUP_ID";

        /**
         * <h2>Access key to the error codes of default group selection.</h2>
         * <p>Response: Integer indicating the error code.</p>
         * <p>Values:</p>
         * <p>0 means no errors.</p>
         * <p>  101 Non-existent group</p>
         * <p>  102 Action not allowed</p>
         * <p>  103 The user is not a member of that group</p>
         * @See IMCOPsdk#changeSelectedContact
         */
        public static final String ERROR_CODE="org.mcopenplatform.muoapi.ConstantsMCOP.SelectedContactChangeEventExtras"+".ERROR_CODE";
        /**
         * <h2>Access key to the error strings.</h2>
         * <p>Response: String describing the error.</p>
         */
        public static final String ERROR_STRING="org.mcopenplatform.muoapi.ConstantsMCOP.SelectedContactChangeEventExtras"+".ERROR_STRING";

    }


    /**
     *
     * <h1>Access key to the values of event {@link ActionsCallBack#eMBMSNotificationEvent}.</h1>
     *
     */
    public static class EMBMSNotificationEventExtras{

        /**
         * <h2>Access key to the Temporary Mobile Group Identity (TMGI) identifying the eMBMS bearer.</h2>
         * <p>Response: String</p>
         * <p>Used in events:</p>
         * <p>      {@link EMBMSNotificationEventEventTypeEnum#UndereMBMSCoverage}</p>
         * <p>      {@link EMBMSNotificationEventEventTypeEnum#eMBMSBearerInUse}</p>
         * <p>      {@link EMBMSNotificationEventEventTypeEnum#eMBMSBearerNotInUse}</p>
         * <p>      {@link EMBMSNotificationEventEventTypeEnum#NoeMBMSCoverage}</p>
         */
        public static final String TMGI="org.mcopenplatform.muoapi.ConstantsMCOP.EMBMSNotificationEventExtras"+".TMGI";


        /**
         *  <h2>Access key to the MCPTT session ID. This identifier is unique for each call.</h2>
         *  <p>Response: String</p>
         * <p>Used in events:</p>
         * <p>      {@link EMBMSNotificationEventEventTypeEnum#UndereMBMSCoverage}</p>
         * <p>      {@link EMBMSNotificationEventEventTypeEnum#eMBMSBearerInUse}</p>
         * <p>      {@link EMBMSNotificationEventEventTypeEnum#eMBMSBearerNotInUse}</p>
         * <p>      {@link EMBMSNotificationEventEventTypeEnum#NoeMBMSCoverage}</p>
         */
        public static final String SESSION_ID="org.mcopenplatform.muoapi.ConstantsMCOP.EMBMSNotificationEventExtras"+".SESSION_ID";

        /**
         *  <h2>Access key to the list of eMBMS service areas.</h2>
         *  <p>Response: String containing all the eMBMS service area identifiers consecutively.</p>
         * <p>Used in events:</p>
         * <p>      {@link EMBMSNotificationEventEventTypeEnum#UndereMBMSCoverage}</p>
         * <p>      {@link EMBMSNotificationEventEventTypeEnum#eMBMSBearerInUse}</p>
         * <p>      {@link EMBMSNotificationEventEventTypeEnum#eMBMSBearerNotInUse}</p>
         * <p>      {@link EMBMSNotificationEventEventTypeEnum#NoeMBMSCoverage}</p>
         */
        public static final String AREA_LIST="org.mcopenplatform.muoapi.ConstantsMCOP.EMBMSNotificationEventExtras"+".AREA_LIST";


        /**
         * Access key to event type:
         * Value: Integer.
         * <p>Possible event types:</p>
         * <p>     eMBMSAvailable           (eMBMS available) {@link org.mcopenplatform.muoapi.ConstantsMCOP.EMBMSNotificationEventExtras.EMBMSNotificationEventEventTypeEnum#eMBMSAvailable}</p>
         * <p>     UndereMBMSCoverage       (Under eMBMS coverage for a specific TMGI) {@link org.mcopenplatform.muoapi.ConstantsMCOP.EMBMSNotificationEventExtras.EMBMSNotificationEventEventTypeEnum#UndereMBMSCoverage}</p>
         * <p>     eMBMSBearerInUse         (Particular eMBMS bearer in use) {@link org.mcopenplatform.muoapi.ConstantsMCOP.EMBMSNotificationEventExtras.EMBMSNotificationEventEventTypeEnum#eMBMSBearerInUse}</p>
         * <p>     eMBMSBearerNotInUse      (Particular eMBMS bearer not in use) {@link org.mcopenplatform.muoapi.ConstantsMCOP.EMBMSNotificationEventExtras.EMBMSNotificationEventEventTypeEnum#eMBMSBearerNotInUse}</p>
         * <p>     NoeMBMSCoverage          (Not under eMBMS coverage for a specific TMGI) org.mcopenplatform.muoapi.ConstantsMCOP.EMBMSNotificationEventExtras.EMBMSNotificationEventEventTypeEnum#NoeMBMSCoverage}</p>
         * <p>     eMBMSNotAvailable        (eMBMS not available) {@link org.mcopenplatform.muoapi.ConstantsMCOP.EMBMSNotificationEventExtras.EMBMSNotificationEventEventTypeEnum#eMBMSNotAvailable}</p>
         */
        public static final String EVENT_TYPE="org.mcopenplatform.muoapi.ConstantsMCOP.EMBMSNotificationEventExtras"+".EVENT_TYPE";


        /**
         * <h2>Access key to eMBMS error codes.</h2>
         * <p>Response: Integer indicating the error code.</p>
         * <p>Values:</p>
         * <p>0 means no errors.</p>
         */
        public static final String ERROR_CODE="org.mcopenplatform.muoapi.ConstantsMCOP.EMBMSNotificationEventExtras"+".ERROR_CODE";
        /**
         * <h2>Access key to error string.</h2>
         * <p>Response: String describing the error.</p>
         */
        public static final String ERROR_STRING="org.mcopenplatform.muoapi.ConstantsMCOP.EMBMSNotificationEventExtras"+".ERROR_STRING";

        /**
         * CallEvent event types.
         */
        public enum EMBMSNotificationEventEventTypeEnum{
            none (0x00),
            eMBMSAvailable(0x01),
            UndereMBMSCoverage(0x02),
            eMBMSBearerInUse(0x03),
            eMBMSBearerNotInUse(0x04),
            NoeMBMSCoverage(0x05),
            eMBMSNotAvailable(0x06);
            private int code;
            EMBMSNotificationEventEventTypeEnum(int code) {
                this.code = code;
            }
            public int getValue() {
                return code;
            }
        }
    }


    /**
     * <h2>Different MCOP SDK event types for MCPTT services.</h2>
     */
    public enum ActionsCallBack{
        none(""),
        authorizationRequestEvent("org.mcopenplatform.muoapi.ConstantsMCOP.ActionsCallBack.authorizationRequestEvent"),
        unLoginEvent("org.mcopenplatform.muoapi.ConstantsMCOP.ActionsCallBack.unLoginEvent"),
        loginEvent("org.mcopenplatform.muoapi.ConstantsMCOP.ActionsCallBack.loginEvent"),
        configurationUpdateEvent("org.mcopenplatform.muoapi.ConstantsMCOP.ActionsCallBack.configurationUpdateEvent"),
        callEvent("org.mcopenplatform.muoapi.ConstantsMCOP.ActionsCallBack.callEvent"),
        floorControlEvent("org.mcopenplatform.muoapi.ConstantsMCOP.ActionsCallBack.floorControlEvent"),
        groupInfoEvent("org.mcopenplatform.muoapi.ConstantsMCOP.ActionsCallBack.groupInfoEvent"),
        groupAffiliationEvent("org.mcopenplatform.muoapi.ConstantsMCOP.ActionsCallBack.groupAffiliationEvent"),
        selectedContactChangeEvent("org.mcopenplatform.muoapi.ConstantsMCOP.ActionsCallBack.selectedContactChangeEvent"),
        eMBMSNotificationEvent("org.mcopenplatform.muoapi.ConstantsMCOP.ActionsCallBack.eMBMSNotificationEvent");
        private final String text;

        /**
         * @param text
         */
        ActionsCallBack(final String text) {
            this.text = text;
        }

        /* (non-Javadoc)
         * @see java.lang.Enum#toString()
         */
        @Override
        public String toString() {
            return text;
        }


        /**
         * @return the Enum representation for the given string.
         */
        public static ActionsCallBack fromString(String s) {
            for(ActionsCallBack actionsCallBack: ActionsCallBack.values()){
                if(actionsCallBack.toString().compareTo(s)==0)return actionsCallBack;
            }
            return null;
        }

    }

    /**
     * <h1>Event types for method {@link IMCOPsdk#updateEmergencyState(String, int)}.</h1>
     */
    public enum EmergencyTypeEnum{
        NONE (0x00),
        EMERGENCY(0x01),
        NO_EMERGENCY(0x02);

        private int code;
        EmergencyTypeEnum(int code) {
            this.code = code;
        }
        public int getValue() {
            return code;
        }
    }


}