| /* |
| * 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); |
| } |
| } |
| |