• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2015, Motorola Mobility LLC
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *     - Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     - Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *     - Neither the name of Motorola Mobility nor the
13  *       names of its contributors may be used to endorse or promote products
14  *       derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
18  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MOTOROLA MOBILITY LLC BE LIABLE
20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
26  * DAMAGE.
27  */
28 
29 package com.android.ims;
30 
31 import android.os.Bundle;
32 import android.os.Parcel;
33 import android.os.Parcelable;
34 import android.net.Uri;
35 
36 import com.android.ims.internal.Logger;
37 
38 /**
39  * RcsPresenceInfo is the class for presence information.
40  * It is used to pass information to application for inent ACTION_PRESENCE_CHANGED
41  * need to get it by the following statement:
42  * ArrayList<RcsPresenceInfo> rcsPresenceInfoList = intent.getParcelableArrayListExtra(
43  *           RcsPresence.EXTRA_PRESENCE_INFO_LIST);
44  *
45  * @see RcsPresence#ACTION_PRESENCE_CHANGED
46  *
47  * @hide
48  */
49 public class RcsPresenceInfo implements Parcelable {
50     /**
51      * Key for save contact_number.
52      * It is passed by getCapabilityByContacts or getAvailability
53      *
54      * @see #getContactNumber
55      */
56      private static final String CONTACT_NUMBER = "contact_number";
57 
58     /**
59      * Key for the flag to indicate if the number is volte enabled.
60      *
61      * @see #getVolteStatus
62      */
63     public static final String VOLTE_STATUS = "volte_status";
64 
65     /**
66      * The Volte status:
67      * If the contact got the 404 for single contact fetch.
68      * or it got "rejected", "noresource" and "giveup", then it is
69      * VOLTE_DISABLED. Or it is VOLTE_ENBLED.
70      * If we didn't get a success polling yet then it is VOLTE_UNKNOWN.
71      */
72     public static class VolteStatus{
73         /**
74          * Didn't poll yet.
75          */
76         public static final int VOLTE_UNKNOWN = -1;
77 
78         /**
79          * Volte disabled for 404 response for single contact fetch
80          * or get "rejected", "noresource" and "giveup" notification.
81          */
82         public static final int VOLTE_DISABLED = 0;
83 
84         /**
85          * Volte enabled for get proper notification.
86          */
87         public static final int VOLTE_ENABLED = 1;
88     }
89 
90     /**
91      * For extension consideration we deinfed the sercice type here.
92      * Currently we only support the VoLte call and VT call.
93      *
94      * The service type for RCS
95      */
96     public static interface ServiceType {
97         /**
98          * For VoLte call.
99          */
100         public static final int VOLTE_CALL = 1;
101 
102         /**
103          * For VT call.
104          */
105         public static final int VT_CALL = 2;
106     }
107 
108     /**
109      * Service state
110      *
111      * @see #getServiceState
112      */
113     public static class ServiceState {
114         /**
115          * ONLINE means the servie is available.
116          */
117         public static final int ONLINE = 1;
118 
119         /**
120          * OFFLINE means the service is not available.
121          */
122         public static final int OFFLINE = 0;
123 
124        /**
125         * UNKNOWN means the presence service information didn't be got yet.
126         */
127         public static final int UNKNOWN = -1;
128     }
129 
130     /**
131      * The presence information is maintained by key and value pair.
132      * ServiceInfoKey defines the key of the current supported information.
133      */
134     public static class ServiceInfoKey {
135         /**
136          * Service type. It is defined by ServiceType.
137          *
138          * @see ServiceType
139          */
140         public static final String SERVICE_TYPE = "service_type"; // VOLTE_CALL,etc
141 
142         /**
143          * Service state. It is defined by ServiceState.
144          *
145          * @see ServiceState
146          * @see #getServiceState
147          */
148         public static final String STATE = "state"; // ONLINE, etc.
149 
150         /**
151          * The service contact. For example, the phone requests presence information for number
152          * "12345678", the service responses the presence with "987654321" as the service number
153          * of video call. Then the phone should start the video call with "987654321".
154          * The "987654321" is the service number.
155          *
156          * @see #getServiceContact
157          */
158         public static final String SERVICE_CONTACT = "service_contact";
159 
160         /**
161          * The timestamp which got from network.
162          *
163          * @see #getTimeStamp
164          */
165         public static final String TIMESTAMP = "timestamp";
166     }
167 
168     /**
169      * Return the contact number.
170      * It is passed by getCapabilityByContacts or getAvailability
171      *
172      * @return the contact number which has been passed in.
173      *
174      * @see #CONTACT_NUMBER
175      */
getContactNumber()176     public String getContactNumber() {
177         return mServiceInfo.getString(CONTACT_NUMBER);
178     }
179 
180     /**
181      * @Return the VolteStatus.
182      */
getVolteStatus()183     public int getVolteStatus(){
184         return mServiceInfo.getInt(VOLTE_STATUS);
185     }
186 
187     /**
188      * Return the ServiceState of the specific serviceType.
189      *
190      * @param serviceType it is defined by ServiceType.
191      *
192      * @return the service presence state which has been described in ServiceInfoKey.
193      *
194      * @see ServiceType
195      * @see ServiceState
196      * @see ServiceInfoKey#STATE
197      */
getServiceState(int serviceType)198     public int getServiceState(int serviceType) {
199         return getServiceInfo(serviceType, ServiceInfoKey.STATE, ServiceState.UNKNOWN);
200     }
201 
202     /**
203      * Return the service contact of the specific serviceType.
204      *
205      * @param serviceType It is defined by ServiceType.
206      *
207      * @return the service contact which is described in ServiceInfoKey.
208      *
209      * @see ServiceType
210      * @see ServiceInfoKey#SERVICE_CONTACT
211      */
getServiceContact(int serviceType)212     public String getServiceContact(int serviceType) {
213         return getServiceInfo(serviceType, ServiceInfoKey.SERVICE_CONTACT, "");
214     }
215 
216     /**
217      * Return the timestamp.
218      *
219      * @param serviceType It is defined by ServiceType.
220      *
221      * @return the timestamp which has been got from server.
222      *
223      * @see ServiceType
224      * @see ServiceInfoKey#TIMESTAMP
225      */
getTimeStamp(int serviceType)226     public long getTimeStamp(int serviceType) {
227         return getServiceInfo(serviceType, ServiceInfoKey.TIMESTAMP, 0L);
228     }
229 
230     /**
231      * @hide
232      */
RcsPresenceInfo()233     public RcsPresenceInfo() {
234     }
235 
236     /**
237      * @hide
238      */
RcsPresenceInfo(Parcel source)239     public RcsPresenceInfo(Parcel source) {
240         mServiceInfo.readFromParcel(source);
241     }
242 
243     /**
244      * @hide
245      */
getBundle()246     private Bundle getBundle() {
247         return mServiceInfo;
248     }
249 
250     /**
251      * @hide
252      */
RcsPresenceInfo(String contactNumber,int volteStatus, int ipVoiceCallState, String ipVoiceCallServiceNumber, long ipVoiceCallTimestamp, int ipVideoCallState, String ipVideoCallServiceNumber, long ipVideoCallTimestamp)253     public RcsPresenceInfo(String contactNumber,int volteStatus,
254             int ipVoiceCallState, String ipVoiceCallServiceNumber, long ipVoiceCallTimestamp,
255             int ipVideoCallState, String ipVideoCallServiceNumber, long ipVideoCallTimestamp) {
256         mServiceInfo.putString(CONTACT_NUMBER, contactNumber);
257         mServiceInfo.putInt(VOLTE_STATUS, volteStatus);
258 
259         set(ServiceType.VOLTE_CALL, ipVoiceCallState, ipVoiceCallServiceNumber,
260                 ipVoiceCallTimestamp);
261 
262         set(ServiceType.VT_CALL, ipVideoCallState, ipVideoCallServiceNumber,
263                 ipVideoCallTimestamp);
264     }
265 
set(int serviceType, int state, String serviceNumber, long timestamp)266     private void set(int serviceType, int state, String serviceNumber, long timestamp) {
267         Bundle capability = new Bundle();
268 
269         capability.putInt(ServiceInfoKey.SERVICE_TYPE, serviceType);
270         capability.putInt(ServiceInfoKey.STATE, state);
271         capability.putString(ServiceInfoKey.SERVICE_CONTACT, serviceNumber);
272         capability.putLong(ServiceInfoKey.TIMESTAMP, timestamp);
273 
274         mServiceInfo.putBundle(String.valueOf(serviceType), capability);
275     }
276 
277     /**
278      * Overload
279      * @hide
280      */
281     public static final Parcelable.Creator<RcsPresenceInfo> CREATOR = new
282             Parcelable.Creator<RcsPresenceInfo>() {
283         public RcsPresenceInfo createFromParcel(Parcel in) {
284             return new RcsPresenceInfo(in);
285         }
286 
287         public RcsPresenceInfo[] newArray(int size) {
288             return new RcsPresenceInfo[size];
289         }
290     };
291 
292     /**
293      * Overload
294      * @hide
295      */
writeToParcel(Parcel dest, int flags)296     public void writeToParcel(Parcel dest, int flags) {
297         mServiceInfo.writeToParcel(dest, flags);
298     }
299 
300     /**
301      * Overload
302      * @hide
303      */
describeContents()304     public int describeContents() {
305         return 0;
306     }
307 
308     private Bundle mServiceInfo = new Bundle();
309 
getServiceInfo(int serviceType, String infoKey, String defaultValue)310     private String getServiceInfo(int serviceType, String infoKey, String defaultValue) {
311         Bundle serviceInfo = mServiceInfo.getBundle(String.valueOf(serviceType));
312 
313         if (serviceInfo != null) {
314             return serviceInfo.getString(infoKey);
315         }
316         return defaultValue;
317     }
318 
getServiceInfo(int serviceType, String infoKey, long defaultValue)319     private long getServiceInfo(int serviceType, String infoKey, long defaultValue) {
320         Bundle serviceInfo = mServiceInfo.getBundle(String.valueOf(serviceType));
321         if (serviceInfo != null) {
322             return serviceInfo.getLong(infoKey);
323         }
324 
325         return defaultValue;
326     }
327 
getServiceInfo(int serviceType, String infoType, int defaultValue)328     private int getServiceInfo(int serviceType, String infoType, int defaultValue) {
329         Bundle serviceInfo = mServiceInfo.getBundle(String.valueOf(serviceType));
330         if (serviceInfo != null) {
331             return serviceInfo.getInt(infoType);
332         }
333         return defaultValue;
334     }
335 
getServiceInfo(int serviceType, String infoKey, Uri defaultValue)336     private Uri getServiceInfo(int serviceType, String infoKey, Uri defaultValue) {
337         Bundle serviceInfo = mServiceInfo.getBundle(String.valueOf(serviceType));
338         if (serviceInfo != null) {
339             return (Uri)serviceInfo.getParcelable(infoKey);
340         }
341 
342         return defaultValue;
343     }
344 
toString()345     public String toString() {
346         return" contactNumber=" + Logger.hidePhoneNumberPii(getContactNumber()) +
347             " volteStatus=" + getVolteStatus() +
348             " ipVoiceCallSate=" + getServiceState(ServiceType.VOLTE_CALL) +
349             " ipVoiceCallServiceNumber=" +
350                 Logger.hidePhoneNumberPii(getServiceContact(ServiceType.VOLTE_CALL)) +
351             " ipVoiceCallTimestamp=" + getTimeStamp(ServiceType.VOLTE_CALL) +
352             " ipVideoCallSate=" + getServiceState(ServiceType.VT_CALL) +
353             " ipVideoCallServiceNumber=" +
354                 Logger.hidePhoneNumberPii(getServiceContact(ServiceType.VT_CALL)) +
355             " ipVideoCallTimestamp=" + getTimeStamp(ServiceType.VT_CALL);
356     }
357 }
358 
359