blob: 8a5b913e9f777dd415758cbd3476505fd08b0915 [file] [log] [blame]
/*
* Copyright (c) 2015, Motorola Mobility LLC
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - Neither the name of Motorola Mobility nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MOTOROLA MOBILITY LLC BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*/
package com.android.ims;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.net.Uri;
/**
* RcsPresenceInfo is the class for presence information.
* It is used to pass information to application for inent ACTION_PRESENCE_CHANGED
* need to get it by the following statement:
* ArrayList<RcsPresenceInfo> rcsPresenceInfoList = intent.getParcelableArrayListExtra(
* RcsPresence.EXTRA_PRESENCE_INFO_LIST);
*
* @see RcsPresence#ACTION_PRESENCE_CHANGED
*
* @hide
*/
public class RcsPresenceInfo implements Parcelable {
/**
* Key for save contact_number.
* It is passed by getCapabilityByContacts or getAvailability
*
* @see #getContactNumber
*/
private static final String CONTACT_NUMBER = "contact_number";
/**
* Key for the flag to indicate if the number is volte enabled.
*
* @see #getVolteStatus
*/
public static final String VOLTE_STATUS = "volte_status";
/**
* The Volte status:
* If the contact got the 404 for single contact fetch.
* or it got "rejected", "noresource" and "giveup", then it is
* VOLTE_DISABLED. Or it is VOLTE_ENBLED.
* If we didn't get a success polling yet then it is VOLTE_UNKNOWN.
*/
public static class VolteStatus{
/**
* Didn't poll yet.
*/
public static final int VOLTE_UNKNOWN = -1;
/**
* Volte disabled for 404 response for single contact fetch
* or get "rejected", "noresource" and "giveup" notification.
*/
public static final int VOLTE_DISABLED = 0;
/**
* Volte enabled for get proper notification.
*/
public static final int VOLTE_ENABLED = 1;
}
/**
* For extension consideration we deinfed the sercice type here.
* Currently we only support the VoLte call and VT call.
*
* The service type for RCS
*/
public static interface ServiceType {
/**
* For VoLte call.
*/
public static final int VOLTE_CALL = 1;
/**
* For VT call.
*/
public static final int VT_CALL = 2;
}
/**
* Service state
*
* @see #getServiceState
*/
public static class ServiceState {
/**
* ONLINE means the servie is available.
*/
public static final int ONLINE = 1;
/**
* OFFLINE means the service is not available.
*/
public static final int OFFLINE = 0;
/**
* UNKNOWN means the presence service information didn't be got yet.
*/
public static final int UNKNOWN = -1;
}
/**
* The presence information is maintained by key and value pair.
* ServiceInfoKey defines the key of the current supported information.
*/
public static class ServiceInfoKey {
/**
* Service type. It is defined by ServiceType.
*
* @see ServiceType
*/
public static final String SERVICE_TYPE = "service_type"; // VOLTE_CALL,etc
/**
* Service state. It is defined by ServiceState.
*
* @see ServiceState
* @see #getServiceState
*/
public static final String STATE = "state"; // ONLINE, etc.
/**
* The service contact. For example, the phone requests presence information for number
* "12345678", the service responses the presence with "987654321" as the service number
* of video call. Then the phone should start the video call with "987654321".
* The "987654321" is the service number.
*
* @see #getServiceContact
*/
public static final String SERVICE_CONTACT = "service_contact";
/**
* The timestamp which got from network.
*
* @see #getTimeStamp
*/
public static final String TIMESTAMP = "timestamp";
}
/**
* Return the contact number.
* It is passed by getCapabilityByContacts or getAvailability
*
* @return the contact number which has been passed in.
*
* @see #CONTACT_NUMBER
*/
public String getContactNumber() {
return mServiceInfo.getString(CONTACT_NUMBER);
}
/**
* @Return the VolteStatus.
*/
public int getVolteStatus(){
return mServiceInfo.getInt(VOLTE_STATUS);
}
/**
* Return the ServiceState of the specific serviceType.
*
* @param serviceType it is defined by ServiceType.
*
* @return the service presence state which has been described in ServiceInfoKey.
*
* @see ServiceType
* @see ServiceState
* @see ServiceInfoKey#STATE
*/
public int getServiceState(int serviceType) {
return getServiceInfo(serviceType, ServiceInfoKey.STATE, ServiceState.UNKNOWN);
}
/**
* Return the service contact of the specific serviceType.
*
* @param serviceType It is defined by ServiceType.
*
* @return the service contact which is described in ServiceInfoKey.
*
* @see ServiceType
* @see ServiceInfoKey#SERVICE_CONTACT
*/
public String getServiceContact(int serviceType) {
return getServiceInfo(serviceType, ServiceInfoKey.SERVICE_CONTACT, "");
}
/**
* Return the timestamp.
*
* @param serviceType It is defined by ServiceType.
*
* @return the timestamp which has been got from server.
*
* @see ServiceType
* @see ServiceInfoKey#TIMESTAMP
*/
public long getTimeStamp(int serviceType) {
return getServiceInfo(serviceType, ServiceInfoKey.TIMESTAMP, 0L);
}
/**
* @hide
*/
public RcsPresenceInfo() {
}
/**
* @hide
*/
public RcsPresenceInfo(Parcel source) {
mServiceInfo.readFromParcel(source);
}
/**
* @hide
*/
private Bundle getBundle() {
return mServiceInfo;
}
/**
* @hide
*/
public RcsPresenceInfo(String contactNumber,int volteStatus,
int ipVoiceCallState, String ipVoiceCallServiceNumber, long ipVoiceCallTimestamp,
int ipVideoCallState, String ipVideoCallServiceNumber, long ipVideoCallTimestamp) {
mServiceInfo.putString(CONTACT_NUMBER, contactNumber);
mServiceInfo.putInt(VOLTE_STATUS, volteStatus);
set(ServiceType.VOLTE_CALL, ipVoiceCallState, ipVoiceCallServiceNumber,
ipVoiceCallTimestamp);
set(ServiceType.VT_CALL, ipVideoCallState, ipVideoCallServiceNumber,
ipVideoCallTimestamp);
}
private void set(int serviceType, int state, String serviceNumber, long timestamp) {
Bundle capability = new Bundle();
capability.putInt(ServiceInfoKey.SERVICE_TYPE, serviceType);
capability.putInt(ServiceInfoKey.STATE, state);
capability.putString(ServiceInfoKey.SERVICE_CONTACT, serviceNumber);
capability.putLong(ServiceInfoKey.TIMESTAMP, timestamp);
mServiceInfo.putBundle(String.valueOf(serviceType), capability);
}
/**
* Overload
* @hide
*/
public static final Parcelable.Creator<RcsPresenceInfo> CREATOR = new
Parcelable.Creator<RcsPresenceInfo>() {
public RcsPresenceInfo createFromParcel(Parcel in) {
return new RcsPresenceInfo(in);
}
public RcsPresenceInfo[] newArray(int size) {
return new RcsPresenceInfo[size];
}
};
/**
* Overload
* @hide
*/
public void writeToParcel(Parcel dest, int flags) {
mServiceInfo.writeToParcel(dest, flags);
}
/**
* Overload
* @hide
*/
public int describeContents() {
return 0;
}
private Bundle mServiceInfo = new Bundle();
private String getServiceInfo(int serviceType, String infoKey, String defaultValue) {
Bundle serviceInfo = mServiceInfo.getBundle(String.valueOf(serviceType));
if (serviceInfo != null) {
return serviceInfo.getString(infoKey);
}
return defaultValue;
}
private long getServiceInfo(int serviceType, String infoKey, long defaultValue) {
Bundle serviceInfo = mServiceInfo.getBundle(String.valueOf(serviceType));
if (serviceInfo != null) {
return serviceInfo.getLong(infoKey);
}
return defaultValue;
}
private int getServiceInfo(int serviceType, String infoType, int defaultValue) {
Bundle serviceInfo = mServiceInfo.getBundle(String.valueOf(serviceType));
if (serviceInfo != null) {
return serviceInfo.getInt(infoType);
}
return defaultValue;
}
private Uri getServiceInfo(int serviceType, String infoKey, Uri defaultValue) {
Bundle serviceInfo = mServiceInfo.getBundle(String.valueOf(serviceType));
if (serviceInfo != null) {
return (Uri)serviceInfo.getParcelable(infoKey);
}
return defaultValue;
}
public String toString() {
return" contactNumber=" + getContactNumber() +
" volteStatus=" + getVolteStatus() +
" ipVoiceCallSate=" + getServiceState(ServiceType.VOLTE_CALL) +
" ipVoiceCallServiceNumber=" + getServiceContact(ServiceType.VOLTE_CALL) +
" ipVoiceCallTimestamp=" + getTimeStamp(ServiceType.VOLTE_CALL) +
" ipVideoCallSate=" + getServiceState(ServiceType.VT_CALL) +
" ipVideoCallServiceNumber=" + getServiceContact(ServiceType.VT_CALL) +
" ipVideoCallTimestamp=" + getTimeStamp(ServiceType.VT_CALL);
}
}