• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 
17 package android.provider;
18 
19 import android.Manifest;
20 import android.annotation.SdkConstant;
21 import android.annotation.SdkConstant.SdkConstantType;
22 import android.content.Intent;
23 import android.database.ContentObserver;
24 import android.net.Uri;
25 import android.provider.CallLog.Calls;
26 
27 /**
28  * The contract between the voicemail provider and applications. Contains
29  * definitions for the supported URIs and columns.
30  *
31  * <P>The content providers exposes two tables through this interface:
32  * <ul>
33  *   <li> Voicemails table: This stores the actual voicemail records. The
34  *   columns and URIs for accessing this table are defined by the
35  *   {@link Voicemails} class.
36  *   </li>
37  *   <li> Status table: This provides a way for the voicemail source application
38  *   to convey its current state to the system. The columns and URIS for
39  *   accessing this table are defined by the {@link Status} class.
40  *   </li>
41  * </ul>
42  *
43  * <P> The minimum permission needed to access this content provider is
44  * {@link Manifest.permission#ADD_VOICEMAIL}
45  *
46  * <P>Voicemails are inserted by what is called as a "voicemail source"
47  * application, which is responsible for syncing voicemail data between a remote
48  * server and the local voicemail content provider. "voicemail source"
49  * application should always set the {@link #PARAM_KEY_SOURCE_PACKAGE} in the
50  * URI to identify its package.
51  *
52  * <P>In addition to the {@link ContentObserver} notifications the voicemail
53  * provider also generates broadcast intents to notify change for applications
54  * that are not active and therefore cannot listen to ContentObserver
55  * notifications. Broadcast intents with following actions are generated:
56  * <ul>
57  *   <li> {@link #ACTION_NEW_VOICEMAIL} is generated for each new voicemail
58  *   inserted.
59  *   </li>
60  *   <li> {@link Intent#ACTION_PROVIDER_CHANGED} is generated for any change
61  *    made into the database, including new voicemail.
62  *   </li>
63  * </ul>
64  */
65 public class VoicemailContract {
66     /** Not instantiable. */
VoicemailContract()67     private VoicemailContract() {
68     }
69 
70     /** The authority used by the voicemail provider. */
71     public static final String AUTHORITY = "com.android.voicemail";
72     /**
73      * Parameter key used in the URI to specify the voicemail source package name.
74      * <p> This field must be set in all requests that originate from a voicemail source.
75      */
76     public static final String PARAM_KEY_SOURCE_PACKAGE = "source_package";
77 
78     /** Broadcast intent when a new voicemail record is inserted. */
79     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
80     public static final String ACTION_NEW_VOICEMAIL = "android.intent.action.NEW_VOICEMAIL";
81 
82     /**
83      * Broadcast intent to request a voicemail source to fetch voicemail content of a specific
84      * voicemail from the remote server. The voicemail to fetch is specified by the data uri
85      * of the intent.
86      * <p>
87      * All voicemail sources are expected to handle this event. After storing the content
88      * the application should also set {@link Voicemails#HAS_CONTENT} to 1;
89      */
90     @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
91     public static final String ACTION_FETCH_VOICEMAIL = "android.intent.action.FETCH_VOICEMAIL";
92 
93     /**
94      * Extra included in {@link Intent#ACTION_PROVIDER_CHANGED} broadcast intents to indicate if the
95      * receiving package made this change.
96      */
97     public static final String EXTRA_SELF_CHANGE = "com.android.voicemail.extra.SELF_CHANGE";
98 
99     /**
100      * Name of the source package field, which must be same across all voicemail related tables.
101      * This is an internal field.
102      * @hide
103      */
104     public static final String SOURCE_PACKAGE_FIELD = "source_package";
105 
106     /** Defines fields exposed through the /voicemail path of this content provider. */
107     public static final class Voicemails implements BaseColumns, OpenableColumns {
108         /** Not instantiable. */
Voicemails()109         private Voicemails() {
110         }
111 
112         /** URI to insert/retrieve voicemails. */
113         public static final Uri CONTENT_URI =
114             Uri.parse("content://" + AUTHORITY + "/voicemail");
115 
116         /** The MIME type for a collection of voicemails. */
117         public static final String DIR_TYPE = "vnd.android.cursor.dir/voicemails";
118 
119         /** The MIME type for a single voicemail. */
120         public static final String ITEM_TYPE = "vnd.android.cursor.item/voicemail";
121 
122         /**
123          * Phone number of the voicemail sender.
124          * <P>Type: TEXT</P>
125          */
126         public static final String NUMBER = Calls.NUMBER;
127         /**
128          * The date the voicemail was sent, in milliseconds since the epoch
129          * <P>Type: INTEGER (long)</P>
130          */
131         public static final String DATE = Calls.DATE;
132         /**
133          * The duration of the voicemail in seconds.
134          * <P>Type: INTEGER (long)</P>
135          */
136         public static final String DURATION = Calls.DURATION;
137         /**
138          * Whether this item has been read or otherwise consumed by the user.
139          * <P>Type: INTEGER (boolean)</P>
140          */
141         public static final String IS_READ = Calls.IS_READ;
142         /**
143          * The mail box state of the voicemail. This field is currently not used by the system.
144          * <P> Possible values: {@link #STATE_INBOX}, {@link #STATE_DELETED},
145          * {@link #STATE_UNDELETED}.
146          * <P>Type: INTEGER</P>
147          * @hide
148          */
149         public static final String STATE = "state";
150         /**
151          * Value of {@link #STATE} when the voicemail is in inbox.
152          * @hide
153          */
154         public static int STATE_INBOX = 0;
155         /**
156          * Value of {@link #STATE} when the voicemail has been marked as deleted.
157          * @hide
158          */
159         public static int STATE_DELETED = 1;
160         /**
161          * Value of {@link #STATE} when the voicemail has marked as undeleted.
162          * @hide
163          */
164         public static int STATE_UNDELETED = 2;
165         /**
166          * Package name of the source application that inserted the voicemail.
167          * <P>Type: TEXT</P>
168          */
169         public static final String SOURCE_PACKAGE = SOURCE_PACKAGE_FIELD;
170         /**
171          * Application-specific data available to the source application that
172          * inserted the voicemail. This is typically used to store the source
173          * specific message id to identify this voicemail on the remote
174          * voicemail server.
175          * <P>Type: TEXT</P>
176          * <P> Note that this is NOT the voicemail media content data.
177          */
178         public static final String SOURCE_DATA = "source_data";
179         /**
180          * Whether the media content for this voicemail is available for
181          * consumption.
182          * <P>Type: INTEGER (boolean)</P>
183          */
184         public static final String HAS_CONTENT = "has_content";
185         /**
186          * MIME type of the media content for the voicemail.
187          * <P>Type: TEXT</P>
188          */
189         public static final String MIME_TYPE = "mime_type";
190         /**
191          * Path to the media content file. Internal only field.
192          * @hide
193          */
194         public static final String _DATA = "_data";
195 
196         /**
197          * A convenience method to build voicemail URI specific to a source package by appending
198          * {@link VoicemailContract#PARAM_KEY_SOURCE_PACKAGE} param to the base URI.
199          */
buildSourceUri(String packageName)200         public static Uri buildSourceUri(String packageName) {
201             return Voicemails.CONTENT_URI.buildUpon()
202                     .appendQueryParameter(PARAM_KEY_SOURCE_PACKAGE, packageName).build();
203         }
204     }
205 
206     /** Defines fields exposed through the /status path of this content provider. */
207     public static final class Status implements BaseColumns {
208         /** URI to insert/retrieve status of voicemail source. */
209         public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/status");
210         /** The MIME type for a collection of voicemail source statuses. */
211         public static final String DIR_TYPE = "vnd.android.cursor.dir/voicemail.source.status";
212         /** The MIME type for a single voicemail source status entry. */
213         public static final String ITEM_TYPE = "vnd.android.cursor.item/voicemail.source.status";
214 
215         /** Not instantiable. */
Status()216         private Status() {
217         }
218         /**
219          * The package name of the voicemail source. There can only be a one entry per source.
220          * <P>Type: TEXT</P>
221          */
222         public static final String SOURCE_PACKAGE = SOURCE_PACKAGE_FIELD;
223         /**
224          * The URI to call to invoke source specific voicemail settings screen. On a user request
225          * to setup voicemail an intent with action VIEW with this URI will be fired by the system.
226          * <P>Type: TEXT</P>
227          */
228         public static final String SETTINGS_URI = "settings_uri";
229         /**
230          * The URI to call when the user requests to directly access the voicemail from the remote
231          * server. In case of an IVR voicemail system this is typically set to the the voicemail
232          * number specified using a tel:/ URI.
233          * <P>Type: TEXT</P>
234          */
235         public static final String VOICEMAIL_ACCESS_URI = "voicemail_access_uri";
236         /**
237          * The configuration state of the voicemail source.
238          * <P> Possible values:
239          * {@link #CONFIGURATION_STATE_OK},
240          * {@link #CONFIGURATION_STATE_NOT_CONFIGURED},
241          * {@link #CONFIGURATION_STATE_CAN_BE_CONFIGURED}
242          * <P>Type: INTEGER</P>
243          */
244         public static final String CONFIGURATION_STATE = "configuration_state";
245         /** Value of {@link #CONFIGURATION_STATE} to indicate an all OK configuration status. */
246         public static final int CONFIGURATION_STATE_OK = 0;
247         /**
248          * Value of {@link #CONFIGURATION_STATE} to indicate the visual voicemail is not
249          * yet configured on this device.
250          */
251         public static final int CONFIGURATION_STATE_NOT_CONFIGURED = 1;
252         /**
253          * Value of {@link #CONFIGURATION_STATE} to indicate the visual voicemail is not
254          * yet configured on this device but can be configured by the user.
255          * <p> This state must be used when the source has verified that the current user can be
256          * upgraded to visual voicemail and would like to show a set up invitation message.
257          */
258         public static final int CONFIGURATION_STATE_CAN_BE_CONFIGURED = 2;
259         /**
260          * The data channel state of the voicemail source. This the channel through which the source
261          * pulls voicemail data from a remote server.
262          * <P> Possible values:
263          * {@link #DATA_CHANNEL_STATE_OK},
264          * {@link #DATA_CHANNEL_STATE_NO_CONNECTION}
265          * </P>
266          * <P>Type: INTEGER</P>
267          */
268         public static final String DATA_CHANNEL_STATE = "data_channel_state";
269         /**
270          *  Value of {@link #DATA_CHANNEL_STATE} to indicate that data channel is working fine.
271          */
272         public static final int DATA_CHANNEL_STATE_OK = 0;
273         /**
274          * Value of {@link #DATA_CHANNEL_STATE} to indicate that data channel connection is not
275          * working.
276          */
277         public static final int DATA_CHANNEL_STATE_NO_CONNECTION = 1;
278         /**
279          * The notification channel state of the voicemail source. This is the channel through which
280          * the source gets notified of new voicemails on the remote server.
281          * <P> Possible values:
282          * {@link #NOTIFICATION_CHANNEL_STATE_OK},
283          * {@link #NOTIFICATION_CHANNEL_STATE_NO_CONNECTION},
284          * {@link #NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING}
285          * </P>
286          * <P>Type: INTEGER</P>
287          */
288         public static final String NOTIFICATION_CHANNEL_STATE = "notification_channel_state";
289         /**
290          * Value of {@link #NOTIFICATION_CHANNEL_STATE} to indicate that the notification channel is
291          * working fine.
292          */
293         public static final int NOTIFICATION_CHANNEL_STATE_OK = 0;
294         /**
295          * Value of {@link #NOTIFICATION_CHANNEL_STATE} to indicate that the notification channel
296          * connection is not working.
297          */
298         public static final int NOTIFICATION_CHANNEL_STATE_NO_CONNECTION = 1;
299         /**
300          * Value of {@link #NOTIFICATION_CHANNEL_STATE} to indicate that there are messages waiting
301          * on the server but the details are not known.
302          * <p> Use this state when the notification can only tell that there are pending messages on
303          * the server but no details of the sender/time etc are known.
304          */
305         public static final int NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING = 2;
306 
307         /**
308          * A convenience method to build status URI specific to a source package by appending
309          * {@link VoicemailContract#PARAM_KEY_SOURCE_PACKAGE} param to the base URI.
310          */
buildSourceUri(String packageName)311         public static Uri buildSourceUri(String packageName) {
312             return Status.CONTENT_URI.buildUpon()
313                     .appendQueryParameter(PARAM_KEY_SOURCE_PACKAGE, packageName).build();
314         }
315     }
316 }
317