1 /* 2 * Copyright (C) 2006 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.annotation.SdkConstant; 20 import android.annotation.SdkConstant.SdkConstantType; 21 import android.content.ComponentName; 22 import android.content.ContentResolver; 23 import android.content.ContentValues; 24 import android.content.Context; 25 import android.content.Intent; 26 import android.database.Cursor; 27 import android.database.sqlite.SqliteWrapper; 28 import android.net.Uri; 29 import android.telephony.SmsMessage; 30 import android.text.TextUtils; 31 import android.telephony.Rlog; 32 import android.util.Patterns; 33 34 import com.android.internal.telephony.SmsApplication; 35 36 37 import java.util.HashSet; 38 import java.util.Set; 39 import java.util.regex.Matcher; 40 import java.util.regex.Pattern; 41 42 /** 43 * The Telephony provider contains data related to phone operation, specifically SMS and MMS 44 * messages and access to the APN list, including the MMSC to use. 45 */ 46 public final class Telephony { 47 private static final String TAG = "Telephony"; 48 49 /** 50 * Not instantiable. 51 * @hide 52 */ 53 private Telephony() { 54 } 55 56 /** 57 * Base columns for tables that contain text-based SMSs. 58 */ 59 public interface TextBasedSmsColumns { 60 61 /** Message type: all messages. */ 62 public static final int MESSAGE_TYPE_ALL = 0; 63 64 /** Message type: inbox. */ 65 public static final int MESSAGE_TYPE_INBOX = 1; 66 67 /** Message type: sent messages. */ 68 public static final int MESSAGE_TYPE_SENT = 2; 69 70 /** Message type: drafts. */ 71 public static final int MESSAGE_TYPE_DRAFT = 3; 72 73 /** Message type: outbox. */ 74 public static final int MESSAGE_TYPE_OUTBOX = 4; 75 76 /** Message type: failed outgoing message. */ 77 public static final int MESSAGE_TYPE_FAILED = 5; 78 79 /** Message type: queued to send later. */ 80 public static final int MESSAGE_TYPE_QUEUED = 6; 81 82 /** 83 * The type of message. 84 * <P>Type: INTEGER</P> 85 */ 86 public static final String TYPE = "type"; 87 88 /** 89 * The thread ID of the message. 90 * <P>Type: INTEGER</P> 91 */ 92 public static final String THREAD_ID = "thread_id"; 93 94 /** 95 * The address of the other party. 96 * <P>Type: TEXT</P> 97 */ 98 public static final String ADDRESS = "address"; 99 100 /** 101 * The date the message was received. 102 * <P>Type: INTEGER (long)</P> 103 */ 104 public static final String DATE = "date"; 105 106 /** 107 * The date the message was sent. 108 * <P>Type: INTEGER (long)</P> 109 */ 110 public static final String DATE_SENT = "date_sent"; 111 112 /** 113 * Has the message been read? 114 * <P>Type: INTEGER (boolean)</P> 115 */ 116 public static final String READ = "read"; 117 118 /** 119 * Has the message been seen by the user? The "seen" flag determines 120 * whether we need to show a notification. 121 * <P>Type: INTEGER (boolean)</P> 122 */ 123 public static final String SEEN = "seen"; 124 125 /** 126 * {@code TP-Status} value for the message, or -1 if no status has been received. 127 * <P>Type: INTEGER</P> 128 */ 129 public static final String STATUS = "status"; 130 131 /** TP-Status: no status received. */ 132 public static final int STATUS_NONE = -1; 133 /** TP-Status: complete. */ 134 public static final int STATUS_COMPLETE = 0; 135 /** TP-Status: pending. */ 136 public static final int STATUS_PENDING = 32; 137 /** TP-Status: failed. */ 138 public static final int STATUS_FAILED = 64; 139 140 /** 141 * The subject of the message, if present. 142 * <P>Type: TEXT</P> 143 */ 144 public static final String SUBJECT = "subject"; 145 146 /** 147 * The body of the message. 148 * <P>Type: TEXT</P> 149 */ 150 public static final String BODY = "body"; 151 152 /** 153 * The ID of the sender of the conversation, if present. 154 * <P>Type: INTEGER (reference to item in {@code content://contacts/people})</P> 155 */ 156 public static final String PERSON = "person"; 157 158 /** 159 * The protocol identifier code. 160 * <P>Type: INTEGER</P> 161 */ 162 public static final String PROTOCOL = "protocol"; 163 164 /** 165 * Is the {@code TP-Reply-Path} flag set? 166 * <P>Type: BOOLEAN</P> 167 */ 168 public static final String REPLY_PATH_PRESENT = "reply_path_present"; 169 170 /** 171 * The service center (SC) through which to send the message, if present. 172 * <P>Type: TEXT</P> 173 */ 174 public static final String SERVICE_CENTER = "service_center"; 175 176 /** 177 * Is the message locked? 178 * <P>Type: INTEGER (boolean)</P> 179 */ 180 public static final String LOCKED = "locked"; 181 182 /** 183 * Error code associated with sending or receiving this message. 184 * <P>Type: INTEGER</P> 185 */ 186 public static final String ERROR_CODE = "error_code"; 187 } 188 189 /** 190 * Contains all text-based SMS messages. 191 */ 192 public static final class Sms implements BaseColumns, TextBasedSmsColumns { 193 194 /** 195 * Not instantiable. 196 * @hide 197 */ 198 private Sms() { 199 } 200 201 /** 202 * Used to determine the currently configured default SMS package. 203 * @param context context of the requesting application 204 * @return package name for the default SMS package or null 205 */ 206 public static String getDefaultSmsPackage(Context context) { 207 ComponentName component = SmsApplication.getDefaultSmsApplication(context, false); 208 if (component != null) { 209 return component.getPackageName(); 210 } 211 return null; 212 } 213 214 /** 215 * Return cursor for table query. 216 * @hide 217 */ 218 public static Cursor query(ContentResolver cr, String[] projection) { 219 return cr.query(CONTENT_URI, projection, null, null, DEFAULT_SORT_ORDER); 220 } 221 222 /** 223 * Return cursor for table query. 224 * @hide 225 */ 226 public static Cursor query(ContentResolver cr, String[] projection, 227 String where, String orderBy) { 228 return cr.query(CONTENT_URI, projection, where, 229 null, orderBy == null ? DEFAULT_SORT_ORDER : orderBy); 230 } 231 232 /** 233 * The {@code content://} style URL for this table. 234 */ 235 public static final Uri CONTENT_URI = Uri.parse("content://sms"); 236 237 /** 238 * The default sort order for this table. 239 */ 240 public static final String DEFAULT_SORT_ORDER = "date DESC"; 241 242 /** 243 * Add an SMS to the given URI. 244 * 245 * @param resolver the content resolver to use 246 * @param uri the URI to add the message to 247 * @param address the address of the sender 248 * @param body the body of the message 249 * @param subject the pseudo-subject of the message 250 * @param date the timestamp for the message 251 * @param read true if the message has been read, false if not 252 * @param deliveryReport true if a delivery report was requested, false if not 253 * @return the URI for the new message 254 * @hide 255 */ 256 public static Uri addMessageToUri(ContentResolver resolver, 257 Uri uri, String address, String body, String subject, 258 Long date, boolean read, boolean deliveryReport) { 259 return addMessageToUri(resolver, uri, address, body, subject, 260 date, read, deliveryReport, -1L); 261 } 262 263 /** 264 * Add an SMS to the given URI with the specified thread ID. 265 * 266 * @param resolver the content resolver to use 267 * @param uri the URI to add the message to 268 * @param address the address of the sender 269 * @param body the body of the message 270 * @param subject the pseudo-subject of the message 271 * @param date the timestamp for the message 272 * @param read true if the message has been read, false if not 273 * @param deliveryReport true if a delivery report was requested, false if not 274 * @param threadId the thread_id of the message 275 * @return the URI for the new message 276 * @hide 277 */ 278 public static Uri addMessageToUri(ContentResolver resolver, 279 Uri uri, String address, String body, String subject, 280 Long date, boolean read, boolean deliveryReport, long threadId) { 281 ContentValues values = new ContentValues(7); 282 283 values.put(ADDRESS, address); 284 if (date != null) { 285 values.put(DATE, date); 286 } 287 values.put(READ, read ? Integer.valueOf(1) : Integer.valueOf(0)); 288 values.put(SUBJECT, subject); 289 values.put(BODY, body); 290 if (deliveryReport) { 291 values.put(STATUS, STATUS_PENDING); 292 } 293 if (threadId != -1L) { 294 values.put(THREAD_ID, threadId); 295 } 296 return resolver.insert(uri, values); 297 } 298 299 /** 300 * Move a message to the given folder. 301 * 302 * @param context the context to use 303 * @param uri the message to move 304 * @param folder the folder to move to 305 * @return true if the operation succeeded 306 * @hide 307 */ 308 public static boolean moveMessageToFolder(Context context, 309 Uri uri, int folder, int error) { 310 if (uri == null) { 311 return false; 312 } 313 314 boolean markAsUnread = false; 315 boolean markAsRead = false; 316 switch(folder) { 317 case MESSAGE_TYPE_INBOX: 318 case MESSAGE_TYPE_DRAFT: 319 break; 320 case MESSAGE_TYPE_OUTBOX: 321 case MESSAGE_TYPE_SENT: 322 markAsRead = true; 323 break; 324 case MESSAGE_TYPE_FAILED: 325 case MESSAGE_TYPE_QUEUED: 326 markAsUnread = true; 327 break; 328 default: 329 return false; 330 } 331 332 ContentValues values = new ContentValues(3); 333 334 values.put(TYPE, folder); 335 if (markAsUnread) { 336 values.put(READ, 0); 337 } else if (markAsRead) { 338 values.put(READ, 1); 339 } 340 values.put(ERROR_CODE, error); 341 342 return 1 == SqliteWrapper.update(context, context.getContentResolver(), 343 uri, values, null, null); 344 } 345 346 /** 347 * Returns true iff the folder (message type) identifies an 348 * outgoing message. 349 * @hide 350 */ 351 public static boolean isOutgoingFolder(int messageType) { 352 return (messageType == MESSAGE_TYPE_FAILED) 353 || (messageType == MESSAGE_TYPE_OUTBOX) 354 || (messageType == MESSAGE_TYPE_SENT) 355 || (messageType == MESSAGE_TYPE_QUEUED); 356 } 357 358 /** 359 * Contains all text-based SMS messages in the SMS app inbox. 360 */ 361 public static final class Inbox implements BaseColumns, TextBasedSmsColumns { 362 363 /** 364 * Not instantiable. 365 * @hide 366 */ 367 private Inbox() { 368 } 369 370 /** 371 * The {@code content://} style URL for this table. 372 */ 373 public static final Uri CONTENT_URI = Uri.parse("content://sms/inbox"); 374 375 /** 376 * The default sort order for this table. 377 */ 378 public static final String DEFAULT_SORT_ORDER = "date DESC"; 379 380 /** 381 * Add an SMS to the Draft box. 382 * 383 * @param resolver the content resolver to use 384 * @param address the address of the sender 385 * @param body the body of the message 386 * @param subject the pseudo-subject of the message 387 * @param date the timestamp for the message 388 * @param read true if the message has been read, false if not 389 * @return the URI for the new message 390 * @hide 391 */ 392 public static Uri addMessage(ContentResolver resolver, 393 String address, String body, String subject, Long date, 394 boolean read) { 395 return addMessageToUri(resolver, CONTENT_URI, address, body, 396 subject, date, read, false); 397 } 398 } 399 400 /** 401 * Contains all sent text-based SMS messages in the SMS app. 402 */ 403 public static final class Sent implements BaseColumns, TextBasedSmsColumns { 404 405 /** 406 * Not instantiable. 407 * @hide 408 */ 409 private Sent() { 410 } 411 412 /** 413 * The {@code content://} style URL for this table. 414 */ 415 public static final Uri CONTENT_URI = Uri.parse("content://sms/sent"); 416 417 /** 418 * The default sort order for this table. 419 */ 420 public static final String DEFAULT_SORT_ORDER = "date DESC"; 421 422 /** 423 * Add an SMS to the Draft box. 424 * 425 * @param resolver the content resolver to use 426 * @param address the address of the sender 427 * @param body the body of the message 428 * @param subject the pseudo-subject of the message 429 * @param date the timestamp for the message 430 * @return the URI for the new message 431 * @hide 432 */ 433 public static Uri addMessage(ContentResolver resolver, 434 String address, String body, String subject, Long date) { 435 return addMessageToUri(resolver, CONTENT_URI, address, body, 436 subject, date, true, false); 437 } 438 } 439 440 /** 441 * Contains all sent text-based SMS messages in the SMS app. 442 */ 443 public static final class Draft implements BaseColumns, TextBasedSmsColumns { 444 445 /** 446 * Not instantiable. 447 * @hide 448 */ 449 private Draft() { 450 } 451 452 /** 453 * The {@code content://} style URL for this table. 454 */ 455 public static final Uri CONTENT_URI = Uri.parse("content://sms/draft"); 456 457 /** 458 * The default sort order for this table. 459 */ 460 public static final String DEFAULT_SORT_ORDER = "date DESC"; 461 } 462 463 /** 464 * Contains all pending outgoing text-based SMS messages. 465 */ 466 public static final class Outbox implements BaseColumns, TextBasedSmsColumns { 467 468 /** 469 * Not instantiable. 470 * @hide 471 */ 472 private Outbox() { 473 } 474 475 /** 476 * The {@code content://} style URL for this table. 477 */ 478 public static final Uri CONTENT_URI = Uri.parse("content://sms/outbox"); 479 480 /** 481 * The default sort order for this table. 482 */ 483 public static final String DEFAULT_SORT_ORDER = "date DESC"; 484 485 /** 486 * Add an SMS to the outbox. 487 * 488 * @param resolver the content resolver to use 489 * @param address the address of the sender 490 * @param body the body of the message 491 * @param subject the pseudo-subject of the message 492 * @param date the timestamp for the message 493 * @param deliveryReport whether a delivery report was requested for the message 494 * @return the URI for the new message 495 * @hide 496 */ 497 public static Uri addMessage(ContentResolver resolver, 498 String address, String body, String subject, Long date, 499 boolean deliveryReport, long threadId) { 500 return addMessageToUri(resolver, CONTENT_URI, address, body, 501 subject, date, true, deliveryReport, threadId); 502 } 503 } 504 505 /** 506 * Contains all sent text-based SMS messages in the SMS app. 507 */ 508 public static final class Conversations 509 implements BaseColumns, TextBasedSmsColumns { 510 511 /** 512 * Not instantiable. 513 * @hide 514 */ 515 private Conversations() { 516 } 517 518 /** 519 * The {@code content://} style URL for this table. 520 */ 521 public static final Uri CONTENT_URI = Uri.parse("content://sms/conversations"); 522 523 /** 524 * The default sort order for this table. 525 */ 526 public static final String DEFAULT_SORT_ORDER = "date DESC"; 527 528 /** 529 * The first 45 characters of the body of the message. 530 * <P>Type: TEXT</P> 531 */ 532 public static final String SNIPPET = "snippet"; 533 534 /** 535 * The number of messages in the conversation. 536 * <P>Type: INTEGER</P> 537 */ 538 public static final String MESSAGE_COUNT = "msg_count"; 539 } 540 541 /** 542 * Contains constants for SMS related Intents that are broadcast. 543 */ 544 public static final class Intents { 545 546 /** 547 * Not instantiable. 548 * @hide 549 */ 550 private Intents() { 551 } 552 553 /** 554 * Set by BroadcastReceiver to indicate that the message was handled 555 * successfully. 556 */ 557 public static final int RESULT_SMS_HANDLED = 1; 558 559 /** 560 * Set by BroadcastReceiver to indicate a generic error while 561 * processing the message. 562 */ 563 public static final int RESULT_SMS_GENERIC_ERROR = 2; 564 565 /** 566 * Set by BroadcastReceiver to indicate insufficient memory to store 567 * the message. 568 */ 569 public static final int RESULT_SMS_OUT_OF_MEMORY = 3; 570 571 /** 572 * Set by BroadcastReceiver to indicate that the message, while 573 * possibly valid, is of a format or encoding that is not 574 * supported. 575 */ 576 public static final int RESULT_SMS_UNSUPPORTED = 4; 577 578 /** 579 * Set by BroadcastReceiver to indicate a duplicate incoming message. 580 */ 581 public static final int RESULT_SMS_DUPLICATED = 5; 582 583 /** 584 * Activity action: Ask the user to change the default 585 * SMS application. This will show a dialog that asks the 586 * user whether they want to replace the current default 587 * SMS application with the one specified in 588 * {@link #EXTRA_PACKAGE_NAME}. 589 */ 590 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 591 public static final String ACTION_CHANGE_DEFAULT = 592 "android.provider.Telephony.ACTION_CHANGE_DEFAULT"; 593 594 /** 595 * The PackageName string passed in as an 596 * extra for {@link #ACTION_CHANGE_DEFAULT} 597 * 598 * @see #ACTION_CHANGE_DEFAULT 599 */ 600 public static final String EXTRA_PACKAGE_NAME = "package"; 601 602 /** 603 * Broadcast Action: A new text-based SMS message has been received 604 * by the device. This intent will only be delivered to the default 605 * sms app. That app is responsible for writing the message and notifying 606 * the user. The intent will have the following extra values:</p> 607 * 608 * <ul> 609 * <li><em>pdus</em> - An Object[] of byte[]s containing the PDUs 610 * that make up the message.</li> 611 * </ul> 612 * 613 * <p>The extra values can be extracted using 614 * {@link #getMessagesFromIntent(Intent)}.</p> 615 * 616 * <p>If a BroadcastReceiver encounters an error while processing 617 * this intent it should set the result code appropriately.</p> 618 */ 619 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 620 public static final String SMS_DELIVER_ACTION = 621 "android.provider.Telephony.SMS_DELIVER"; 622 623 /** 624 * Broadcast Action: A new text-based SMS message has been received 625 * by the device. This intent will be delivered to all registered 626 * receivers as a notification. These apps are not expected to write the 627 * message or notify the user. The intent will have the following extra 628 * values:</p> 629 * 630 * <ul> 631 * <li><em>pdus</em> - An Object[] of byte[]s containing the PDUs 632 * that make up the message.</li> 633 * </ul> 634 * 635 * <p>The extra values can be extracted using 636 * {@link #getMessagesFromIntent(Intent)}.</p> 637 * 638 * <p>If a BroadcastReceiver encounters an error while processing 639 * this intent it should set the result code appropriately.</p> 640 */ 641 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 642 public static final String SMS_RECEIVED_ACTION = 643 "android.provider.Telephony.SMS_RECEIVED"; 644 645 /** 646 * Broadcast Action: A new data based SMS message has been received 647 * by the device. This intent will be delivered to all registered 648 * receivers as a notification. The intent will have the following extra 649 * values:</p> 650 * 651 * <ul> 652 * <li><em>pdus</em> - An Object[] of byte[]s containing the PDUs 653 * that make up the message.</li> 654 * </ul> 655 * 656 * <p>The extra values can be extracted using 657 * {@link #getMessagesFromIntent(Intent)}.</p> 658 * 659 * <p>If a BroadcastReceiver encounters an error while processing 660 * this intent it should set the result code appropriately.</p> 661 */ 662 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 663 public static final String DATA_SMS_RECEIVED_ACTION = 664 "android.intent.action.DATA_SMS_RECEIVED"; 665 666 /** 667 * Broadcast Action: A new WAP PUSH message has been received by the 668 * device. This intent will only be delivered to the default 669 * sms app. That app is responsible for writing the message and notifying 670 * the user. The intent will have the following extra values:</p> 671 * 672 * <ul> 673 * <li><em>transactionId (Integer)</em> - The WAP transaction ID</li> 674 * <li><em>pduType (Integer)</em> - The WAP PDU type</li> 675 * <li><em>header (byte[])</em> - The header of the message</li> 676 * <li><em>data (byte[])</em> - The data payload of the message</li> 677 * <li><em>contentTypeParameters (HashMap<String,String>)</em> 678 * - Any parameters associated with the content type 679 * (decoded from the WSP Content-Type header)</li> 680 * </ul> 681 * 682 * <p>If a BroadcastReceiver encounters an error while processing 683 * this intent it should set the result code appropriately.</p> 684 * 685 * <p>The contentTypeParameters extra value is map of content parameters keyed by 686 * their names.</p> 687 * 688 * <p>If any unassigned well-known parameters are encountered, the key of the map will 689 * be 'unassigned/0x...', where '...' is the hex value of the unassigned parameter. If 690 * a parameter has No-Value the value in the map will be null.</p> 691 */ 692 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 693 public static final String WAP_PUSH_DELIVER_ACTION = 694 "android.provider.Telephony.WAP_PUSH_DELIVER"; 695 696 /** 697 * Broadcast Action: A new WAP PUSH message has been received by the 698 * device. This intent will be delivered to all registered 699 * receivers as a notification. These apps are not expected to write the 700 * message or notify the user. The intent will have the following extra 701 * values:</p> 702 * 703 * <ul> 704 * <li><em>transactionId (Integer)</em> - The WAP transaction ID</li> 705 * <li><em>pduType (Integer)</em> - The WAP PDU type</li> 706 * <li><em>header (byte[])</em> - The header of the message</li> 707 * <li><em>data (byte[])</em> - The data payload of the message</li> 708 * <li><em>contentTypeParameters (HashMap<String,String>)</em> 709 * - Any parameters associated with the content type 710 * (decoded from the WSP Content-Type header)</li> 711 * </ul> 712 * 713 * <p>If a BroadcastReceiver encounters an error while processing 714 * this intent it should set the result code appropriately.</p> 715 * 716 * <p>The contentTypeParameters extra value is map of content parameters keyed by 717 * their names.</p> 718 * 719 * <p>If any unassigned well-known parameters are encountered, the key of the map will 720 * be 'unassigned/0x...', where '...' is the hex value of the unassigned parameter. If 721 * a parameter has No-Value the value in the map will be null.</p> 722 */ 723 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 724 public static final String WAP_PUSH_RECEIVED_ACTION = 725 "android.provider.Telephony.WAP_PUSH_RECEIVED"; 726 727 /** 728 * Broadcast Action: A new Cell Broadcast message has been received 729 * by the device. The intent will have the following extra 730 * values:</p> 731 * 732 * <ul> 733 * <li><em>message</em> - An SmsCbMessage object containing the broadcast message 734 * data. This is not an emergency alert, so ETWS and CMAS data will be null.</li> 735 * </ul> 736 * 737 * <p>The extra values can be extracted using 738 * {@link #getMessagesFromIntent(Intent)}.</p> 739 * 740 * <p>If a BroadcastReceiver encounters an error while processing 741 * this intent it should set the result code appropriately.</p> 742 */ 743 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 744 public static final String SMS_CB_RECEIVED_ACTION = 745 "android.provider.Telephony.SMS_CB_RECEIVED"; 746 747 /** 748 * Broadcast Action: A new Emergency Broadcast message has been received 749 * by the device. The intent will have the following extra 750 * values:</p> 751 * 752 * <ul> 753 * <li><em>message</em> - An SmsCbMessage object containing the broadcast message 754 * data, including ETWS or CMAS warning notification info if present.</li> 755 * </ul> 756 * 757 * <p>The extra values can be extracted using 758 * {@link #getMessagesFromIntent(Intent)}.</p> 759 * 760 * <p>If a BroadcastReceiver encounters an error while processing 761 * this intent it should set the result code appropriately.</p> 762 */ 763 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 764 public static final String SMS_EMERGENCY_CB_RECEIVED_ACTION = 765 "android.provider.Telephony.SMS_EMERGENCY_CB_RECEIVED"; 766 767 /** 768 * Broadcast Action: A new CDMA SMS has been received containing Service Category 769 * Program Data (updates the list of enabled broadcast channels). The intent will 770 * have the following extra values:</p> 771 * 772 * <ul> 773 * <li><em>operations</em> - An array of CdmaSmsCbProgramData objects containing 774 * the service category operations (add/delete/clear) to perform.</li> 775 * </ul> 776 * 777 * <p>The extra values can be extracted using 778 * {@link #getMessagesFromIntent(Intent)}.</p> 779 * 780 * <p>If a BroadcastReceiver encounters an error while processing 781 * this intent it should set the result code appropriately.</p> 782 */ 783 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 784 public static final String SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED_ACTION = 785 "android.provider.Telephony.SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED"; 786 787 /** 788 * Broadcast Action: The SIM storage for SMS messages is full. If 789 * space is not freed, messages targeted for the SIM (class 2) may 790 * not be saved. 791 */ 792 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 793 public static final String SIM_FULL_ACTION = 794 "android.provider.Telephony.SIM_FULL"; 795 796 /** 797 * Broadcast Action: An incoming SMS has been rejected by the 798 * telephony framework. This intent is sent in lieu of any 799 * of the RECEIVED_ACTION intents. The intent will have the 800 * following extra value:</p> 801 * 802 * <ul> 803 * <li><em>result</em> - An int result code, e.g. {@link #RESULT_SMS_OUT_OF_MEMORY} 804 * indicating the error returned to the network.</li> 805 * </ul> 806 */ 807 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 808 public static final String SMS_REJECTED_ACTION = 809 "android.provider.Telephony.SMS_REJECTED"; 810 811 /** 812 * Read the PDUs out of an {@link #SMS_RECEIVED_ACTION} or a 813 * {@link #DATA_SMS_RECEIVED_ACTION} intent. 814 * 815 * @param intent the intent to read from 816 * @return an array of SmsMessages for the PDUs 817 */ 818 public static SmsMessage[] getMessagesFromIntent(Intent intent) { 819 Object[] messages = (Object[]) intent.getSerializableExtra("pdus"); 820 String format = intent.getStringExtra("format"); 821 822 int pduCount = messages.length; 823 SmsMessage[] msgs = new SmsMessage[pduCount]; 824 825 for (int i = 0; i < pduCount; i++) { 826 byte[] pdu = (byte[]) messages[i]; 827 msgs[i] = SmsMessage.createFromPdu(pdu, format); 828 } 829 return msgs; 830 } 831 } 832 } 833 834 /** 835 * Base columns for tables that contain MMSs. 836 */ 837 public interface BaseMmsColumns extends BaseColumns { 838 839 /** Message box: all messages. */ 840 public static final int MESSAGE_BOX_ALL = 0; 841 /** Message box: inbox. */ 842 public static final int MESSAGE_BOX_INBOX = 1; 843 /** Message box: sent messages. */ 844 public static final int MESSAGE_BOX_SENT = 2; 845 /** Message box: drafts. */ 846 public static final int MESSAGE_BOX_DRAFTS = 3; 847 /** Message box: outbox. */ 848 public static final int MESSAGE_BOX_OUTBOX = 4; 849 850 /** 851 * The thread ID of the message. 852 * <P>Type: INTEGER (long)</P> 853 */ 854 public static final String THREAD_ID = "thread_id"; 855 856 /** 857 * The date the message was received. 858 * <P>Type: INTEGER (long)</P> 859 */ 860 public static final String DATE = "date"; 861 862 /** 863 * The date the message was sent. 864 * <P>Type: INTEGER (long)</P> 865 */ 866 public static final String DATE_SENT = "date_sent"; 867 868 /** 869 * The box which the message belongs to, e.g. {@link #MESSAGE_BOX_INBOX}. 870 * <P>Type: INTEGER</P> 871 */ 872 public static final String MESSAGE_BOX = "msg_box"; 873 874 /** 875 * Has the message been read? 876 * <P>Type: INTEGER (boolean)</P> 877 */ 878 public static final String READ = "read"; 879 880 /** 881 * Has the message been seen by the user? The "seen" flag determines 882 * whether we need to show a new message notification. 883 * <P>Type: INTEGER (boolean)</P> 884 */ 885 public static final String SEEN = "seen"; 886 887 /** 888 * Does the message have only a text part (can also have a subject) with 889 * no picture, slideshow, sound, etc. parts? 890 * <P>Type: INTEGER (boolean)</P> 891 */ 892 public static final String TEXT_ONLY = "text_only"; 893 894 /** 895 * The {@code Message-ID} of the message. 896 * <P>Type: TEXT</P> 897 */ 898 public static final String MESSAGE_ID = "m_id"; 899 900 /** 901 * The subject of the message, if present. 902 * <P>Type: TEXT</P> 903 */ 904 public static final String SUBJECT = "sub"; 905 906 /** 907 * The character set of the subject, if present. 908 * <P>Type: INTEGER</P> 909 */ 910 public static final String SUBJECT_CHARSET = "sub_cs"; 911 912 /** 913 * The {@code Content-Type} of the message. 914 * <P>Type: TEXT</P> 915 */ 916 public static final String CONTENT_TYPE = "ct_t"; 917 918 /** 919 * The {@code Content-Location} of the message. 920 * <P>Type: TEXT</P> 921 */ 922 public static final String CONTENT_LOCATION = "ct_l"; 923 924 /** 925 * The expiry time of the message. 926 * <P>Type: INTEGER (long)</P> 927 */ 928 public static final String EXPIRY = "exp"; 929 930 /** 931 * The class of the message. 932 * <P>Type: TEXT</P> 933 */ 934 public static final String MESSAGE_CLASS = "m_cls"; 935 936 /** 937 * The type of the message defined by MMS spec. 938 * <P>Type: INTEGER</P> 939 */ 940 public static final String MESSAGE_TYPE = "m_type"; 941 942 /** 943 * The version of the specification that this message conforms to. 944 * <P>Type: INTEGER</P> 945 */ 946 public static final String MMS_VERSION = "v"; 947 948 /** 949 * The size of the message. 950 * <P>Type: INTEGER</P> 951 */ 952 public static final String MESSAGE_SIZE = "m_size"; 953 954 /** 955 * The priority of the message. 956 * <P>Type: INTEGER</P> 957 */ 958 public static final String PRIORITY = "pri"; 959 960 /** 961 * The {@code read-report} of the message. 962 * <P>Type: INTEGER (boolean)</P> 963 */ 964 public static final String READ_REPORT = "rr"; 965 966 /** 967 * Is read report allowed? 968 * <P>Type: INTEGER (boolean)</P> 969 */ 970 public static final String REPORT_ALLOWED = "rpt_a"; 971 972 /** 973 * The {@code response-status} of the message. 974 * <P>Type: INTEGER</P> 975 */ 976 public static final String RESPONSE_STATUS = "resp_st"; 977 978 /** 979 * The {@code status} of the message. 980 * <P>Type: INTEGER</P> 981 */ 982 public static final String STATUS = "st"; 983 984 /** 985 * The {@code transaction-id} of the message. 986 * <P>Type: TEXT</P> 987 */ 988 public static final String TRANSACTION_ID = "tr_id"; 989 990 /** 991 * The {@code retrieve-status} of the message. 992 * <P>Type: INTEGER</P> 993 */ 994 public static final String RETRIEVE_STATUS = "retr_st"; 995 996 /** 997 * The {@code retrieve-text} of the message. 998 * <P>Type: TEXT</P> 999 */ 1000 public static final String RETRIEVE_TEXT = "retr_txt"; 1001 1002 /** 1003 * The character set of the retrieve-text. 1004 * <P>Type: INTEGER</P> 1005 */ 1006 public static final String RETRIEVE_TEXT_CHARSET = "retr_txt_cs"; 1007 1008 /** 1009 * The {@code read-status} of the message. 1010 * <P>Type: INTEGER</P> 1011 */ 1012 public static final String READ_STATUS = "read_status"; 1013 1014 /** 1015 * The {@code content-class} of the message. 1016 * <P>Type: INTEGER</P> 1017 */ 1018 public static final String CONTENT_CLASS = "ct_cls"; 1019 1020 /** 1021 * The {@code delivery-report} of the message. 1022 * <P>Type: INTEGER</P> 1023 */ 1024 public static final String DELIVERY_REPORT = "d_rpt"; 1025 1026 /** 1027 * The {@code delivery-time-token} of the message. 1028 * <P>Type: INTEGER</P> 1029 * @deprecated this column is no longer supported. 1030 * @hide 1031 */ 1032 @Deprecated 1033 public static final String DELIVERY_TIME_TOKEN = "d_tm_tok"; 1034 1035 /** 1036 * The {@code delivery-time} of the message. 1037 * <P>Type: INTEGER</P> 1038 */ 1039 public static final String DELIVERY_TIME = "d_tm"; 1040 1041 /** 1042 * The {@code response-text} of the message. 1043 * <P>Type: TEXT</P> 1044 */ 1045 public static final String RESPONSE_TEXT = "resp_txt"; 1046 1047 /** 1048 * The {@code sender-visibility} of the message. 1049 * <P>Type: TEXT</P> 1050 * @deprecated this column is no longer supported. 1051 * @hide 1052 */ 1053 @Deprecated 1054 public static final String SENDER_VISIBILITY = "s_vis"; 1055 1056 /** 1057 * The {@code reply-charging} of the message. 1058 * <P>Type: INTEGER</P> 1059 * @deprecated this column is no longer supported. 1060 * @hide 1061 */ 1062 @Deprecated 1063 public static final String REPLY_CHARGING = "r_chg"; 1064 1065 /** 1066 * The {@code reply-charging-deadline-token} of the message. 1067 * <P>Type: INTEGER</P> 1068 * @deprecated this column is no longer supported. 1069 * @hide 1070 */ 1071 @Deprecated 1072 public static final String REPLY_CHARGING_DEADLINE_TOKEN = "r_chg_dl_tok"; 1073 1074 /** 1075 * The {@code reply-charging-deadline} of the message. 1076 * <P>Type: INTEGER</P> 1077 * @deprecated this column is no longer supported. 1078 * @hide 1079 */ 1080 @Deprecated 1081 public static final String REPLY_CHARGING_DEADLINE = "r_chg_dl"; 1082 1083 /** 1084 * The {@code reply-charging-id} of the message. 1085 * <P>Type: TEXT</P> 1086 * @deprecated this column is no longer supported. 1087 * @hide 1088 */ 1089 @Deprecated 1090 public static final String REPLY_CHARGING_ID = "r_chg_id"; 1091 1092 /** 1093 * The {@code reply-charging-size} of the message. 1094 * <P>Type: INTEGER</P> 1095 * @deprecated this column is no longer supported. 1096 * @hide 1097 */ 1098 @Deprecated 1099 public static final String REPLY_CHARGING_SIZE = "r_chg_sz"; 1100 1101 /** 1102 * The {@code previously-sent-by} of the message. 1103 * <P>Type: TEXT</P> 1104 * @deprecated this column is no longer supported. 1105 * @hide 1106 */ 1107 @Deprecated 1108 public static final String PREVIOUSLY_SENT_BY = "p_s_by"; 1109 1110 /** 1111 * The {@code previously-sent-date} of the message. 1112 * <P>Type: INTEGER</P> 1113 * @deprecated this column is no longer supported. 1114 * @hide 1115 */ 1116 @Deprecated 1117 public static final String PREVIOUSLY_SENT_DATE = "p_s_d"; 1118 1119 /** 1120 * The {@code store} of the message. 1121 * <P>Type: TEXT</P> 1122 * @deprecated this column is no longer supported. 1123 * @hide 1124 */ 1125 @Deprecated 1126 public static final String STORE = "store"; 1127 1128 /** 1129 * The {@code mm-state} of the message. 1130 * <P>Type: INTEGER</P> 1131 * @deprecated this column is no longer supported. 1132 * @hide 1133 */ 1134 @Deprecated 1135 public static final String MM_STATE = "mm_st"; 1136 1137 /** 1138 * The {@code mm-flags-token} of the message. 1139 * <P>Type: INTEGER</P> 1140 * @deprecated this column is no longer supported. 1141 * @hide 1142 */ 1143 @Deprecated 1144 public static final String MM_FLAGS_TOKEN = "mm_flg_tok"; 1145 1146 /** 1147 * The {@code mm-flags} of the message. 1148 * <P>Type: TEXT</P> 1149 * @deprecated this column is no longer supported. 1150 * @hide 1151 */ 1152 @Deprecated 1153 public static final String MM_FLAGS = "mm_flg"; 1154 1155 /** 1156 * The {@code store-status} of the message. 1157 * <P>Type: TEXT</P> 1158 * @deprecated this column is no longer supported. 1159 * @hide 1160 */ 1161 @Deprecated 1162 public static final String STORE_STATUS = "store_st"; 1163 1164 /** 1165 * The {@code store-status-text} of the message. 1166 * <P>Type: TEXT</P> 1167 * @deprecated this column is no longer supported. 1168 * @hide 1169 */ 1170 @Deprecated 1171 public static final String STORE_STATUS_TEXT = "store_st_txt"; 1172 1173 /** 1174 * The {@code stored} of the message. 1175 * <P>Type: TEXT</P> 1176 * @deprecated this column is no longer supported. 1177 * @hide 1178 */ 1179 @Deprecated 1180 public static final String STORED = "stored"; 1181 1182 /** 1183 * The {@code totals} of the message. 1184 * <P>Type: TEXT</P> 1185 * @deprecated this column is no longer supported. 1186 * @hide 1187 */ 1188 @Deprecated 1189 public static final String TOTALS = "totals"; 1190 1191 /** 1192 * The {@code mbox-totals} of the message. 1193 * <P>Type: TEXT</P> 1194 * @deprecated this column is no longer supported. 1195 * @hide 1196 */ 1197 @Deprecated 1198 public static final String MBOX_TOTALS = "mb_t"; 1199 1200 /** 1201 * The {@code mbox-totals-token} of the message. 1202 * <P>Type: INTEGER</P> 1203 * @deprecated this column is no longer supported. 1204 * @hide 1205 */ 1206 @Deprecated 1207 public static final String MBOX_TOTALS_TOKEN = "mb_t_tok"; 1208 1209 /** 1210 * The {@code quotas} of the message. 1211 * <P>Type: TEXT</P> 1212 * @deprecated this column is no longer supported. 1213 * @hide 1214 */ 1215 @Deprecated 1216 public static final String QUOTAS = "qt"; 1217 1218 /** 1219 * The {@code mbox-quotas} of the message. 1220 * <P>Type: TEXT</P> 1221 * @deprecated this column is no longer supported. 1222 * @hide 1223 */ 1224 @Deprecated 1225 public static final String MBOX_QUOTAS = "mb_qt"; 1226 1227 /** 1228 * The {@code mbox-quotas-token} of the message. 1229 * <P>Type: INTEGER</P> 1230 * @deprecated this column is no longer supported. 1231 * @hide 1232 */ 1233 @Deprecated 1234 public static final String MBOX_QUOTAS_TOKEN = "mb_qt_tok"; 1235 1236 /** 1237 * The {@code message-count} of the message. 1238 * <P>Type: INTEGER</P> 1239 * @deprecated this column is no longer supported. 1240 * @hide 1241 */ 1242 @Deprecated 1243 public static final String MESSAGE_COUNT = "m_cnt"; 1244 1245 /** 1246 * The {@code start} of the message. 1247 * <P>Type: INTEGER</P> 1248 * @deprecated this column is no longer supported. 1249 * @hide 1250 */ 1251 @Deprecated 1252 public static final String START = "start"; 1253 1254 /** 1255 * The {@code distribution-indicator} of the message. 1256 * <P>Type: TEXT</P> 1257 * @deprecated this column is no longer supported. 1258 * @hide 1259 */ 1260 @Deprecated 1261 public static final String DISTRIBUTION_INDICATOR = "d_ind"; 1262 1263 /** 1264 * The {@code element-descriptor} of the message. 1265 * <P>Type: TEXT</P> 1266 * @deprecated this column is no longer supported. 1267 * @hide 1268 */ 1269 @Deprecated 1270 public static final String ELEMENT_DESCRIPTOR = "e_des"; 1271 1272 /** 1273 * The {@code limit} of the message. 1274 * <P>Type: INTEGER</P> 1275 * @deprecated this column is no longer supported. 1276 * @hide 1277 */ 1278 @Deprecated 1279 public static final String LIMIT = "limit"; 1280 1281 /** 1282 * The {@code recommended-retrieval-mode} of the message. 1283 * <P>Type: INTEGER</P> 1284 * @deprecated this column is no longer supported. 1285 * @hide 1286 */ 1287 @Deprecated 1288 public static final String RECOMMENDED_RETRIEVAL_MODE = "r_r_mod"; 1289 1290 /** 1291 * The {@code recommended-retrieval-mode-text} of the message. 1292 * <P>Type: TEXT</P> 1293 * @deprecated this column is no longer supported. 1294 * @hide 1295 */ 1296 @Deprecated 1297 public static final String RECOMMENDED_RETRIEVAL_MODE_TEXT = "r_r_mod_txt"; 1298 1299 /** 1300 * The {@code status-text} of the message. 1301 * <P>Type: TEXT</P> 1302 * @deprecated this column is no longer supported. 1303 * @hide 1304 */ 1305 @Deprecated 1306 public static final String STATUS_TEXT = "st_txt"; 1307 1308 /** 1309 * The {@code applic-id} of the message. 1310 * <P>Type: TEXT</P> 1311 * @deprecated this column is no longer supported. 1312 * @hide 1313 */ 1314 @Deprecated 1315 public static final String APPLIC_ID = "apl_id"; 1316 1317 /** 1318 * The {@code reply-applic-id} of the message. 1319 * <P>Type: TEXT</P> 1320 * @deprecated this column is no longer supported. 1321 * @hide 1322 */ 1323 @Deprecated 1324 public static final String REPLY_APPLIC_ID = "r_apl_id"; 1325 1326 /** 1327 * The {@code aux-applic-id} of the message. 1328 * <P>Type: TEXT</P> 1329 * @deprecated this column is no longer supported. 1330 * @hide 1331 */ 1332 @Deprecated 1333 public static final String AUX_APPLIC_ID = "aux_apl_id"; 1334 1335 /** 1336 * The {@code drm-content} of the message. 1337 * <P>Type: TEXT</P> 1338 * @deprecated this column is no longer supported. 1339 * @hide 1340 */ 1341 @Deprecated 1342 public static final String DRM_CONTENT = "drm_c"; 1343 1344 /** 1345 * The {@code adaptation-allowed} of the message. 1346 * <P>Type: TEXT</P> 1347 * @deprecated this column is no longer supported. 1348 * @hide 1349 */ 1350 @Deprecated 1351 public static final String ADAPTATION_ALLOWED = "adp_a"; 1352 1353 /** 1354 * The {@code replace-id} of the message. 1355 * <P>Type: TEXT</P> 1356 * @deprecated this column is no longer supported. 1357 * @hide 1358 */ 1359 @Deprecated 1360 public static final String REPLACE_ID = "repl_id"; 1361 1362 /** 1363 * The {@code cancel-id} of the message. 1364 * <P>Type: TEXT</P> 1365 * @deprecated this column is no longer supported. 1366 * @hide 1367 */ 1368 @Deprecated 1369 public static final String CANCEL_ID = "cl_id"; 1370 1371 /** 1372 * The {@code cancel-status} of the message. 1373 * <P>Type: INTEGER</P> 1374 * @deprecated this column is no longer supported. 1375 * @hide 1376 */ 1377 @Deprecated 1378 public static final String CANCEL_STATUS = "cl_st"; 1379 1380 /** 1381 * Is the message locked? 1382 * <P>Type: INTEGER (boolean)</P> 1383 */ 1384 public static final String LOCKED = "locked"; 1385 } 1386 1387 /** 1388 * Columns for the "canonical_addresses" table used by MMS and SMS. 1389 */ 1390 public interface CanonicalAddressesColumns extends BaseColumns { 1391 /** 1392 * An address used in MMS or SMS. Email addresses are 1393 * converted to lower case and are compared by string 1394 * equality. Other addresses are compared using 1395 * PHONE_NUMBERS_EQUAL. 1396 * <P>Type: TEXT</P> 1397 */ 1398 public static final String ADDRESS = "address"; 1399 } 1400 1401 /** 1402 * Columns for the "threads" table used by MMS and SMS. 1403 */ 1404 public interface ThreadsColumns extends BaseColumns { 1405 1406 /** 1407 * The date at which the thread was created. 1408 * <P>Type: INTEGER (long)</P> 1409 */ 1410 public static final String DATE = "date"; 1411 1412 /** 1413 * A string encoding of the recipient IDs of the recipients of 1414 * the message, in numerical order and separated by spaces. 1415 * <P>Type: TEXT</P> 1416 */ 1417 public static final String RECIPIENT_IDS = "recipient_ids"; 1418 1419 /** 1420 * The message count of the thread. 1421 * <P>Type: INTEGER</P> 1422 */ 1423 public static final String MESSAGE_COUNT = "message_count"; 1424 1425 /** 1426 * Indicates whether all messages of the thread have been read. 1427 * <P>Type: INTEGER</P> 1428 */ 1429 public static final String READ = "read"; 1430 1431 /** 1432 * The snippet of the latest message in the thread. 1433 * <P>Type: TEXT</P> 1434 */ 1435 public static final String SNIPPET = "snippet"; 1436 1437 /** 1438 * The charset of the snippet. 1439 * <P>Type: INTEGER</P> 1440 */ 1441 public static final String SNIPPET_CHARSET = "snippet_cs"; 1442 1443 /** 1444 * Type of the thread, either {@link Threads#COMMON_THREAD} or 1445 * {@link Threads#BROADCAST_THREAD}. 1446 * <P>Type: INTEGER</P> 1447 */ 1448 public static final String TYPE = "type"; 1449 1450 /** 1451 * Indicates whether there is a transmission error in the thread. 1452 * <P>Type: INTEGER</P> 1453 */ 1454 public static final String ERROR = "error"; 1455 1456 /** 1457 * Indicates whether this thread contains any attachments. 1458 * <P>Type: INTEGER</P> 1459 */ 1460 public static final String HAS_ATTACHMENT = "has_attachment"; 1461 } 1462 1463 /** 1464 * Helper functions for the "threads" table used by MMS and SMS. 1465 */ 1466 public static final class Threads implements ThreadsColumns { 1467 1468 private static final String[] ID_PROJECTION = { BaseColumns._ID }; 1469 1470 /** 1471 * Private {@code content://} style URL for this table. Used by 1472 * {@link #getOrCreateThreadId(android.content.Context, java.util.Set)}. 1473 */ 1474 private static final Uri THREAD_ID_CONTENT_URI = Uri.parse( 1475 "content://mms-sms/threadID"); 1476 1477 /** 1478 * The {@code content://} style URL for this table, by conversation. 1479 */ 1480 public static final Uri CONTENT_URI = Uri.withAppendedPath( 1481 MmsSms.CONTENT_URI, "conversations"); 1482 1483 /** 1484 * The {@code content://} style URL for this table, for obsolete threads. 1485 */ 1486 public static final Uri OBSOLETE_THREADS_URI = Uri.withAppendedPath( 1487 CONTENT_URI, "obsolete"); 1488 1489 /** Thread type: common thread. */ 1490 public static final int COMMON_THREAD = 0; 1491 1492 /** Thread type: broadcast thread. */ 1493 public static final int BROADCAST_THREAD = 1; 1494 1495 /** 1496 * Not instantiable. 1497 * @hide 1498 */ 1499 private Threads() { 1500 } 1501 1502 /** 1503 * This is a single-recipient version of {@code getOrCreateThreadId}. 1504 * It's convenient for use with SMS messages. 1505 * @param context the context object to use. 1506 * @param recipient the recipient to send to. 1507 * @hide 1508 */ 1509 public static long getOrCreateThreadId(Context context, String recipient) { 1510 Set<String> recipients = new HashSet<String>(); 1511 1512 recipients.add(recipient); 1513 return getOrCreateThreadId(context, recipients); 1514 } 1515 1516 /** 1517 * Given the recipients list and subject of an unsaved message, 1518 * return its thread ID. If the message starts a new thread, 1519 * allocate a new thread ID. Otherwise, use the appropriate 1520 * existing thread ID. 1521 * 1522 * <p>Find the thread ID of the same set of recipients (in any order, 1523 * without any additions). If one is found, return it. Otherwise, 1524 * return a unique thread ID.</p> 1525 * @hide 1526 */ 1527 public static long getOrCreateThreadId( 1528 Context context, Set<String> recipients) { 1529 Uri.Builder uriBuilder = THREAD_ID_CONTENT_URI.buildUpon(); 1530 1531 for (String recipient : recipients) { 1532 if (Mms.isEmailAddress(recipient)) { 1533 recipient = Mms.extractAddrSpec(recipient); 1534 } 1535 1536 uriBuilder.appendQueryParameter("recipient", recipient); 1537 } 1538 1539 Uri uri = uriBuilder.build(); 1540 //if (DEBUG) Rlog.v(TAG, "getOrCreateThreadId uri: " + uri); 1541 1542 Cursor cursor = SqliteWrapper.query(context, context.getContentResolver(), 1543 uri, ID_PROJECTION, null, null, null); 1544 if (cursor != null) { 1545 try { 1546 if (cursor.moveToFirst()) { 1547 return cursor.getLong(0); 1548 } else { 1549 Rlog.e(TAG, "getOrCreateThreadId returned no rows!"); 1550 } 1551 } finally { 1552 cursor.close(); 1553 } 1554 } 1555 1556 Rlog.e(TAG, "getOrCreateThreadId failed with uri " + uri.toString()); 1557 throw new IllegalArgumentException("Unable to find or allocate a thread ID."); 1558 } 1559 } 1560 1561 /** 1562 * Contains all MMS messages. 1563 */ 1564 public static final class Mms implements BaseMmsColumns { 1565 1566 /** 1567 * Not instantiable. 1568 * @hide 1569 */ 1570 private Mms() { 1571 } 1572 1573 /** 1574 * The {@code content://} URI for this table. 1575 */ 1576 public static final Uri CONTENT_URI = Uri.parse("content://mms"); 1577 1578 /** 1579 * Content URI for getting MMS report requests. 1580 */ 1581 public static final Uri REPORT_REQUEST_URI = Uri.withAppendedPath( 1582 CONTENT_URI, "report-request"); 1583 1584 /** 1585 * Content URI for getting MMS report status. 1586 */ 1587 public static final Uri REPORT_STATUS_URI = Uri.withAppendedPath( 1588 CONTENT_URI, "report-status"); 1589 1590 /** 1591 * The default sort order for this table. 1592 */ 1593 public static final String DEFAULT_SORT_ORDER = "date DESC"; 1594 1595 /** 1596 * Regex pattern for names and email addresses. 1597 * <ul> 1598 * <li><em>mailbox</em> = {@code name-addr}</li> 1599 * <li><em>name-addr</em> = {@code [display-name] angle-addr}</li> 1600 * <li><em>angle-addr</em> = {@code [CFWS] "<" addr-spec ">" [CFWS]}</li> 1601 * </ul> 1602 * @hide 1603 */ 1604 public static final Pattern NAME_ADDR_EMAIL_PATTERN = 1605 Pattern.compile("\\s*(\"[^\"]*\"|[^<>\"]+)\\s*<([^<>]+)>\\s*"); 1606 1607 /** 1608 * Helper method to query this table. 1609 * @hide 1610 */ 1611 public static Cursor query( 1612 ContentResolver cr, String[] projection) { 1613 return cr.query(CONTENT_URI, projection, null, null, DEFAULT_SORT_ORDER); 1614 } 1615 1616 /** 1617 * Helper method to query this table. 1618 * @hide 1619 */ 1620 public static Cursor query( 1621 ContentResolver cr, String[] projection, 1622 String where, String orderBy) { 1623 return cr.query(CONTENT_URI, projection, 1624 where, null, orderBy == null ? DEFAULT_SORT_ORDER : orderBy); 1625 } 1626 1627 /** 1628 * Helper method to extract email address from address string. 1629 * @hide 1630 */ 1631 public static String extractAddrSpec(String address) { 1632 Matcher match = NAME_ADDR_EMAIL_PATTERN.matcher(address); 1633 1634 if (match.matches()) { 1635 return match.group(2); 1636 } 1637 return address; 1638 } 1639 1640 /** 1641 * Is the specified address an email address? 1642 * 1643 * @param address the input address to test 1644 * @return true if address is an email address; false otherwise. 1645 * @hide 1646 */ 1647 public static boolean isEmailAddress(String address) { 1648 if (TextUtils.isEmpty(address)) { 1649 return false; 1650 } 1651 1652 String s = extractAddrSpec(address); 1653 Matcher match = Patterns.EMAIL_ADDRESS.matcher(s); 1654 return match.matches(); 1655 } 1656 1657 /** 1658 * Is the specified number a phone number? 1659 * 1660 * @param number the input number to test 1661 * @return true if number is a phone number; false otherwise. 1662 * @hide 1663 */ 1664 public static boolean isPhoneNumber(String number) { 1665 if (TextUtils.isEmpty(number)) { 1666 return false; 1667 } 1668 1669 Matcher match = Patterns.PHONE.matcher(number); 1670 return match.matches(); 1671 } 1672 1673 /** 1674 * Contains all MMS messages in the MMS app inbox. 1675 */ 1676 public static final class Inbox implements BaseMmsColumns { 1677 1678 /** 1679 * Not instantiable. 1680 * @hide 1681 */ 1682 private Inbox() { 1683 } 1684 1685 /** 1686 * The {@code content://} style URL for this table. 1687 */ 1688 public static final Uri 1689 CONTENT_URI = Uri.parse("content://mms/inbox"); 1690 1691 /** 1692 * The default sort order for this table. 1693 */ 1694 public static final String DEFAULT_SORT_ORDER = "date DESC"; 1695 } 1696 1697 /** 1698 * Contains all MMS messages in the MMS app sent folder. 1699 */ 1700 public static final class Sent implements BaseMmsColumns { 1701 1702 /** 1703 * Not instantiable. 1704 * @hide 1705 */ 1706 private Sent() { 1707 } 1708 1709 /** 1710 * The {@code content://} style URL for this table. 1711 */ 1712 public static final Uri 1713 CONTENT_URI = Uri.parse("content://mms/sent"); 1714 1715 /** 1716 * The default sort order for this table. 1717 */ 1718 public static final String DEFAULT_SORT_ORDER = "date DESC"; 1719 } 1720 1721 /** 1722 * Contains all MMS messages in the MMS app drafts folder. 1723 */ 1724 public static final class Draft implements BaseMmsColumns { 1725 1726 /** 1727 * Not instantiable. 1728 * @hide 1729 */ 1730 private Draft() { 1731 } 1732 1733 /** 1734 * The {@code content://} style URL for this table. 1735 */ 1736 public static final Uri 1737 CONTENT_URI = Uri.parse("content://mms/drafts"); 1738 1739 /** 1740 * The default sort order for this table. 1741 */ 1742 public static final String DEFAULT_SORT_ORDER = "date DESC"; 1743 } 1744 1745 /** 1746 * Contains all MMS messages in the MMS app outbox. 1747 */ 1748 public static final class Outbox implements BaseMmsColumns { 1749 1750 /** 1751 * Not instantiable. 1752 * @hide 1753 */ 1754 private Outbox() { 1755 } 1756 1757 /** 1758 * The {@code content://} style URL for this table. 1759 */ 1760 public static final Uri 1761 CONTENT_URI = Uri.parse("content://mms/outbox"); 1762 1763 /** 1764 * The default sort order for this table. 1765 */ 1766 public static final String DEFAULT_SORT_ORDER = "date DESC"; 1767 } 1768 1769 /** 1770 * Contains address information for an MMS message. 1771 */ 1772 public static final class Addr implements BaseColumns { 1773 1774 /** 1775 * Not instantiable. 1776 * @hide 1777 */ 1778 private Addr() { 1779 } 1780 1781 /** 1782 * The ID of MM which this address entry belongs to. 1783 * <P>Type: INTEGER (long)</P> 1784 */ 1785 public static final String MSG_ID = "msg_id"; 1786 1787 /** 1788 * The ID of contact entry in Phone Book. 1789 * <P>Type: INTEGER (long)</P> 1790 */ 1791 public static final String CONTACT_ID = "contact_id"; 1792 1793 /** 1794 * The address text. 1795 * <P>Type: TEXT</P> 1796 */ 1797 public static final String ADDRESS = "address"; 1798 1799 /** 1800 * Type of address: must be one of {@code PduHeaders.BCC}, 1801 * {@code PduHeaders.CC}, {@code PduHeaders.FROM}, {@code PduHeaders.TO}. 1802 * <P>Type: INTEGER</P> 1803 */ 1804 public static final String TYPE = "type"; 1805 1806 /** 1807 * Character set of this entry (MMS charset value). 1808 * <P>Type: INTEGER</P> 1809 */ 1810 public static final String CHARSET = "charset"; 1811 } 1812 1813 /** 1814 * Contains message parts. 1815 */ 1816 public static final class Part implements BaseColumns { 1817 1818 /** 1819 * Not instantiable. 1820 * @hide 1821 */ 1822 private Part() { 1823 } 1824 1825 /** 1826 * The identifier of the message which this part belongs to. 1827 * <P>Type: INTEGER</P> 1828 */ 1829 public static final String MSG_ID = "mid"; 1830 1831 /** 1832 * The order of the part. 1833 * <P>Type: INTEGER</P> 1834 */ 1835 public static final String SEQ = "seq"; 1836 1837 /** 1838 * The content type of the part. 1839 * <P>Type: TEXT</P> 1840 */ 1841 public static final String CONTENT_TYPE = "ct"; 1842 1843 /** 1844 * The name of the part. 1845 * <P>Type: TEXT</P> 1846 */ 1847 public static final String NAME = "name"; 1848 1849 /** 1850 * The charset of the part. 1851 * <P>Type: TEXT</P> 1852 */ 1853 public static final String CHARSET = "chset"; 1854 1855 /** 1856 * The file name of the part. 1857 * <P>Type: TEXT</P> 1858 */ 1859 public static final String FILENAME = "fn"; 1860 1861 /** 1862 * The content disposition of the part. 1863 * <P>Type: TEXT</P> 1864 */ 1865 public static final String CONTENT_DISPOSITION = "cd"; 1866 1867 /** 1868 * The content ID of the part. 1869 * <P>Type: INTEGER</P> 1870 */ 1871 public static final String CONTENT_ID = "cid"; 1872 1873 /** 1874 * The content location of the part. 1875 * <P>Type: INTEGER</P> 1876 */ 1877 public static final String CONTENT_LOCATION = "cl"; 1878 1879 /** 1880 * The start of content-type of the message. 1881 * <P>Type: INTEGER</P> 1882 */ 1883 public static final String CT_START = "ctt_s"; 1884 1885 /** 1886 * The type of content-type of the message. 1887 * <P>Type: TEXT</P> 1888 */ 1889 public static final String CT_TYPE = "ctt_t"; 1890 1891 /** 1892 * The location (on filesystem) of the binary data of the part. 1893 * <P>Type: INTEGER</P> 1894 */ 1895 public static final String _DATA = "_data"; 1896 1897 /** 1898 * The message text. 1899 * <P>Type: TEXT</P> 1900 */ 1901 public static final String TEXT = "text"; 1902 } 1903 1904 /** 1905 * Message send rate table. 1906 */ 1907 public static final class Rate { 1908 1909 /** 1910 * Not instantiable. 1911 * @hide 1912 */ 1913 private Rate() { 1914 } 1915 1916 /** 1917 * The {@code content://} style URL for this table. 1918 */ 1919 public static final Uri CONTENT_URI = Uri.withAppendedPath( 1920 Mms.CONTENT_URI, "rate"); 1921 1922 /** 1923 * When a message was successfully sent. 1924 * <P>Type: INTEGER (long)</P> 1925 */ 1926 public static final String SENT_TIME = "sent_time"; 1927 } 1928 1929 /** 1930 * Intents class. 1931 */ 1932 public static final class Intents { 1933 1934 /** 1935 * Not instantiable. 1936 * @hide 1937 */ 1938 private Intents() { 1939 } 1940 1941 /** 1942 * Indicates that the contents of specified URIs were changed. 1943 * The application which is showing or caching these contents 1944 * should be updated. 1945 */ 1946 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1947 public static final String CONTENT_CHANGED_ACTION 1948 = "android.intent.action.CONTENT_CHANGED"; 1949 1950 /** 1951 * An extra field which stores the URI of deleted contents. 1952 */ 1953 public static final String DELETED_CONTENTS = "deleted_contents"; 1954 } 1955 } 1956 1957 /** 1958 * Contains all MMS and SMS messages. 1959 */ 1960 public static final class MmsSms implements BaseColumns { 1961 1962 /** 1963 * Not instantiable. 1964 * @hide 1965 */ 1966 private MmsSms() { 1967 } 1968 1969 /** 1970 * The column to distinguish SMS and MMS messages in query results. 1971 */ 1972 public static final String TYPE_DISCRIMINATOR_COLUMN = 1973 "transport_type"; 1974 1975 /** 1976 * The {@code content://} style URL for this table. 1977 */ 1978 public static final Uri CONTENT_URI = Uri.parse("content://mms-sms/"); 1979 1980 /** 1981 * The {@code content://} style URL for this table, by conversation. 1982 */ 1983 public static final Uri CONTENT_CONVERSATIONS_URI = Uri.parse( 1984 "content://mms-sms/conversations"); 1985 1986 /** 1987 * The {@code content://} style URL for this table, by phone number. 1988 */ 1989 public static final Uri CONTENT_FILTER_BYPHONE_URI = Uri.parse( 1990 "content://mms-sms/messages/byphone"); 1991 1992 /** 1993 * The {@code content://} style URL for undelivered messages in this table. 1994 */ 1995 public static final Uri CONTENT_UNDELIVERED_URI = Uri.parse( 1996 "content://mms-sms/undelivered"); 1997 1998 /** 1999 * The {@code content://} style URL for draft messages in this table. 2000 */ 2001 public static final Uri CONTENT_DRAFT_URI = Uri.parse( 2002 "content://mms-sms/draft"); 2003 2004 /** 2005 * The {@code content://} style URL for locked messages in this table. 2006 */ 2007 public static final Uri CONTENT_LOCKED_URI = Uri.parse( 2008 "content://mms-sms/locked"); 2009 2010 /** 2011 * Pass in a query parameter called "pattern" which is the text to search for. 2012 * The sort order is fixed to be: {@code thread_id ASC, date DESC}. 2013 */ 2014 public static final Uri SEARCH_URI = Uri.parse( 2015 "content://mms-sms/search"); 2016 2017 // Constants for message protocol types. 2018 2019 /** SMS protocol type. */ 2020 public static final int SMS_PROTO = 0; 2021 2022 /** MMS protocol type. */ 2023 public static final int MMS_PROTO = 1; 2024 2025 // Constants for error types of pending messages. 2026 2027 /** Error type: no error. */ 2028 public static final int NO_ERROR = 0; 2029 2030 /** Error type: generic transient error. */ 2031 public static final int ERR_TYPE_GENERIC = 1; 2032 2033 /** Error type: SMS protocol transient error. */ 2034 public static final int ERR_TYPE_SMS_PROTO_TRANSIENT = 2; 2035 2036 /** Error type: MMS protocol transient error. */ 2037 public static final int ERR_TYPE_MMS_PROTO_TRANSIENT = 3; 2038 2039 /** Error type: transport failure. */ 2040 public static final int ERR_TYPE_TRANSPORT_FAILURE = 4; 2041 2042 /** Error type: permanent error (along with all higher error values). */ 2043 public static final int ERR_TYPE_GENERIC_PERMANENT = 10; 2044 2045 /** Error type: SMS protocol permanent error. */ 2046 public static final int ERR_TYPE_SMS_PROTO_PERMANENT = 11; 2047 2048 /** Error type: MMS protocol permanent error. */ 2049 public static final int ERR_TYPE_MMS_PROTO_PERMANENT = 12; 2050 2051 /** 2052 * Contains pending messages info. 2053 */ 2054 public static final class PendingMessages implements BaseColumns { 2055 2056 /** 2057 * Not instantiable. 2058 * @hide 2059 */ 2060 private PendingMessages() { 2061 } 2062 2063 public static final Uri CONTENT_URI = Uri.withAppendedPath( 2064 MmsSms.CONTENT_URI, "pending"); 2065 2066 /** 2067 * The type of transport protocol (MMS or SMS). 2068 * <P>Type: INTEGER</P> 2069 */ 2070 public static final String PROTO_TYPE = "proto_type"; 2071 2072 /** 2073 * The ID of the message to be sent or downloaded. 2074 * <P>Type: INTEGER (long)</P> 2075 */ 2076 public static final String MSG_ID = "msg_id"; 2077 2078 /** 2079 * The type of the message to be sent or downloaded. 2080 * This field is only valid for MM. For SM, its value is always set to 0. 2081 * <P>Type: INTEGER</P> 2082 */ 2083 public static final String MSG_TYPE = "msg_type"; 2084 2085 /** 2086 * The type of the error code. 2087 * <P>Type: INTEGER</P> 2088 */ 2089 public static final String ERROR_TYPE = "err_type"; 2090 2091 /** 2092 * The error code of sending/retrieving process. 2093 * <P>Type: INTEGER</P> 2094 */ 2095 public static final String ERROR_CODE = "err_code"; 2096 2097 /** 2098 * How many times we tried to send or download the message. 2099 * <P>Type: INTEGER</P> 2100 */ 2101 public static final String RETRY_INDEX = "retry_index"; 2102 2103 /** 2104 * The time to do next retry. 2105 * <P>Type: INTEGER (long)</P> 2106 */ 2107 public static final String DUE_TIME = "due_time"; 2108 2109 /** 2110 * The time we last tried to send or download the message. 2111 * <P>Type: INTEGER (long)</P> 2112 */ 2113 public static final String LAST_TRY = "last_try"; 2114 } 2115 2116 /** 2117 * Words table used by provider for full-text searches. 2118 * @hide 2119 */ 2120 public static final class WordsTable { 2121 2122 /** 2123 * Not instantiable. 2124 * @hide 2125 */ 2126 private WordsTable() {} 2127 2128 /** 2129 * Primary key. 2130 * <P>Type: INTEGER (long)</P> 2131 */ 2132 public static final String ID = "_id"; 2133 2134 /** 2135 * Source row ID. 2136 * <P>Type: INTEGER (long)</P> 2137 */ 2138 public static final String SOURCE_ROW_ID = "source_id"; 2139 2140 /** 2141 * Table ID (either 1 or 2). 2142 * <P>Type: INTEGER</P> 2143 */ 2144 public static final String TABLE_ID = "table_to_use"; 2145 2146 /** 2147 * The words to index. 2148 * <P>Type: TEXT</P> 2149 */ 2150 public static final String INDEXED_TEXT = "index_text"; 2151 } 2152 } 2153 2154 /** 2155 * Carriers class contains information about APNs, including MMSC information. 2156 */ 2157 public static final class Carriers implements BaseColumns { 2158 2159 /** 2160 * Not instantiable. 2161 * @hide 2162 */ 2163 private Carriers() {} 2164 2165 /** 2166 * The {@code content://} style URL for this table. 2167 */ 2168 public static final Uri CONTENT_URI = Uri.parse("content://telephony/carriers"); 2169 2170 /** 2171 * The default sort order for this table. 2172 */ 2173 public static final String DEFAULT_SORT_ORDER = "name ASC"; 2174 2175 /** 2176 * Entry name. 2177 * <P>Type: TEXT</P> 2178 */ 2179 public static final String NAME = "name"; 2180 2181 /** 2182 * APN name. 2183 * <P>Type: TEXT</P> 2184 */ 2185 public static final String APN = "apn"; 2186 2187 /** 2188 * Proxy address. 2189 * <P>Type: TEXT</P> 2190 */ 2191 public static final String PROXY = "proxy"; 2192 2193 /** 2194 * Proxy port. 2195 * <P>Type: TEXT</P> 2196 */ 2197 public static final String PORT = "port"; 2198 2199 /** 2200 * MMS proxy address. 2201 * <P>Type: TEXT</P> 2202 */ 2203 public static final String MMSPROXY = "mmsproxy"; 2204 2205 /** 2206 * MMS proxy port. 2207 * <P>Type: TEXT</P> 2208 */ 2209 public static final String MMSPORT = "mmsport"; 2210 2211 /** 2212 * Server address. 2213 * <P>Type: TEXT</P> 2214 */ 2215 public static final String SERVER = "server"; 2216 2217 /** 2218 * APN username. 2219 * <P>Type: TEXT</P> 2220 */ 2221 public static final String USER = "user"; 2222 2223 /** 2224 * APN password. 2225 * <P>Type: TEXT</P> 2226 */ 2227 public static final String PASSWORD = "password"; 2228 2229 /** 2230 * MMSC URL. 2231 * <P>Type: TEXT</P> 2232 */ 2233 public static final String MMSC = "mmsc"; 2234 2235 /** 2236 * Mobile Country Code (MCC). 2237 * <P>Type: TEXT</P> 2238 */ 2239 public static final String MCC = "mcc"; 2240 2241 /** 2242 * Mobile Network Code (MNC). 2243 * <P>Type: TEXT</P> 2244 */ 2245 public static final String MNC = "mnc"; 2246 2247 /** 2248 * Numeric operator ID (as String). Usually {@code MCC + MNC}. 2249 * <P>Type: TEXT</P> 2250 */ 2251 public static final String NUMERIC = "numeric"; 2252 2253 /** 2254 * Authentication type. 2255 * <P>Type: INTEGER</P> 2256 */ 2257 public static final String AUTH_TYPE = "authtype"; 2258 2259 /** 2260 * Comma-delimited list of APN types. 2261 * <P>Type: TEXT</P> 2262 */ 2263 public static final String TYPE = "type"; 2264 2265 /** 2266 * The protocol to use to connect to this APN. 2267 * 2268 * One of the {@code PDP_type} values in TS 27.007 section 10.1.1. 2269 * For example: {@code IP}, {@code IPV6}, {@code IPV4V6}, or {@code PPP}. 2270 * <P>Type: TEXT</P> 2271 */ 2272 public static final String PROTOCOL = "protocol"; 2273 2274 /** 2275 * The protocol to use to connect to this APN when roaming. 2276 * The syntax is the same as protocol. 2277 * <P>Type: TEXT</P> 2278 */ 2279 public static final String ROAMING_PROTOCOL = "roaming_protocol"; 2280 2281 /** 2282 * Is this the current APN? 2283 * <P>Type: INTEGER (boolean)</P> 2284 */ 2285 public static final String CURRENT = "current"; 2286 2287 /** 2288 * Is this APN enabled? 2289 * <P>Type: INTEGER (boolean)</P> 2290 */ 2291 public static final String CARRIER_ENABLED = "carrier_enabled"; 2292 2293 /** 2294 * Radio Access Technology info. 2295 * To check what values are allowed, refer to {@link android.telephony.ServiceState}. 2296 * This should be spread to other technologies, 2297 * but is currently only used for LTE (14) and eHRPD (13). 2298 * <P>Type: INTEGER</P> 2299 */ 2300 public static final String BEARER = "bearer"; 2301 2302 /** 2303 * MVNO type: 2304 * {@code SPN (Service Provider Name), IMSI, GID (Group Identifier Level 1)}. 2305 * <P>Type: TEXT</P> 2306 */ 2307 public static final String MVNO_TYPE = "mvno_type"; 2308 2309 /** 2310 * MVNO data. 2311 * Use the following examples. 2312 * <ul> 2313 * <li>SPN: A MOBILE, BEN NL, ...</li> 2314 * <li>IMSI: 302720x94, 2060188, ...</li> 2315 * <li>GID: 4E, 33, ...</li> 2316 * </ul> 2317 * <P>Type: TEXT</P> 2318 */ 2319 public static final String MVNO_MATCH_DATA = "mvno_match_data"; 2320 } 2321 2322 /** 2323 * Contains received SMS cell broadcast messages. 2324 * @hide 2325 */ 2326 public static final class CellBroadcasts implements BaseColumns { 2327 2328 /** 2329 * Not instantiable. 2330 * @hide 2331 */ 2332 private CellBroadcasts() {} 2333 2334 /** 2335 * The {@code content://} URI for this table. 2336 */ 2337 public static final Uri CONTENT_URI = Uri.parse("content://cellbroadcasts"); 2338 2339 /** 2340 * Message geographical scope. 2341 * <P>Type: INTEGER</P> 2342 */ 2343 public static final String GEOGRAPHICAL_SCOPE = "geo_scope"; 2344 2345 /** 2346 * Message serial number. 2347 * <P>Type: INTEGER</P> 2348 */ 2349 public static final String SERIAL_NUMBER = "serial_number"; 2350 2351 /** 2352 * PLMN of broadcast sender. {@code SERIAL_NUMBER + PLMN + LAC + CID} uniquely identifies 2353 * a broadcast for duplicate detection purposes. 2354 * <P>Type: TEXT</P> 2355 */ 2356 public static final String PLMN = "plmn"; 2357 2358 /** 2359 * Location Area (GSM) or Service Area (UMTS) of broadcast sender. Unused for CDMA. 2360 * Only included if Geographical Scope of message is not PLMN wide (01). 2361 * <P>Type: INTEGER</P> 2362 */ 2363 public static final String LAC = "lac"; 2364 2365 /** 2366 * Cell ID of message sender (GSM/UMTS). Unused for CDMA. Only included when the 2367 * Geographical Scope of message is cell wide (00 or 11). 2368 * <P>Type: INTEGER</P> 2369 */ 2370 public static final String CID = "cid"; 2371 2372 /** 2373 * Message code. <em>OBSOLETE: merged into SERIAL_NUMBER.</em> 2374 * <P>Type: INTEGER</P> 2375 */ 2376 public static final String V1_MESSAGE_CODE = "message_code"; 2377 2378 /** 2379 * Message identifier. <em>OBSOLETE: renamed to SERVICE_CATEGORY.</em> 2380 * <P>Type: INTEGER</P> 2381 */ 2382 public static final String V1_MESSAGE_IDENTIFIER = "message_id"; 2383 2384 /** 2385 * Service category (GSM/UMTS: message identifier; CDMA: service category). 2386 * <P>Type: INTEGER</P> 2387 */ 2388 public static final String SERVICE_CATEGORY = "service_category"; 2389 2390 /** 2391 * Message language code. 2392 * <P>Type: TEXT</P> 2393 */ 2394 public static final String LANGUAGE_CODE = "language"; 2395 2396 /** 2397 * Message body. 2398 * <P>Type: TEXT</P> 2399 */ 2400 public static final String MESSAGE_BODY = "body"; 2401 2402 /** 2403 * Message delivery time. 2404 * <P>Type: INTEGER (long)</P> 2405 */ 2406 public static final String DELIVERY_TIME = "date"; 2407 2408 /** 2409 * Has the message been viewed? 2410 * <P>Type: INTEGER (boolean)</P> 2411 */ 2412 public static final String MESSAGE_READ = "read"; 2413 2414 /** 2415 * Message format (3GPP or 3GPP2). 2416 * <P>Type: INTEGER</P> 2417 */ 2418 public static final String MESSAGE_FORMAT = "format"; 2419 2420 /** 2421 * Message priority (including emergency). 2422 * <P>Type: INTEGER</P> 2423 */ 2424 public static final String MESSAGE_PRIORITY = "priority"; 2425 2426 /** 2427 * ETWS warning type (ETWS alerts only). 2428 * <P>Type: INTEGER</P> 2429 */ 2430 public static final String ETWS_WARNING_TYPE = "etws_warning_type"; 2431 2432 /** 2433 * CMAS message class (CMAS alerts only). 2434 * <P>Type: INTEGER</P> 2435 */ 2436 public static final String CMAS_MESSAGE_CLASS = "cmas_message_class"; 2437 2438 /** 2439 * CMAS category (CMAS alerts only). 2440 * <P>Type: INTEGER</P> 2441 */ 2442 public static final String CMAS_CATEGORY = "cmas_category"; 2443 2444 /** 2445 * CMAS response type (CMAS alerts only). 2446 * <P>Type: INTEGER</P> 2447 */ 2448 public static final String CMAS_RESPONSE_TYPE = "cmas_response_type"; 2449 2450 /** 2451 * CMAS severity (CMAS alerts only). 2452 * <P>Type: INTEGER</P> 2453 */ 2454 public static final String CMAS_SEVERITY = "cmas_severity"; 2455 2456 /** 2457 * CMAS urgency (CMAS alerts only). 2458 * <P>Type: INTEGER</P> 2459 */ 2460 public static final String CMAS_URGENCY = "cmas_urgency"; 2461 2462 /** 2463 * CMAS certainty (CMAS alerts only). 2464 * <P>Type: INTEGER</P> 2465 */ 2466 public static final String CMAS_CERTAINTY = "cmas_certainty"; 2467 2468 /** The default sort order for this table. */ 2469 public static final String DEFAULT_SORT_ORDER = DELIVERY_TIME + " DESC"; 2470 2471 /** 2472 * Query columns for instantiating {@link android.telephony.CellBroadcastMessage} objects. 2473 */ 2474 public static final String[] QUERY_COLUMNS = { 2475 _ID, 2476 GEOGRAPHICAL_SCOPE, 2477 PLMN, 2478 LAC, 2479 CID, 2480 SERIAL_NUMBER, 2481 SERVICE_CATEGORY, 2482 LANGUAGE_CODE, 2483 MESSAGE_BODY, 2484 DELIVERY_TIME, 2485 MESSAGE_READ, 2486 MESSAGE_FORMAT, 2487 MESSAGE_PRIORITY, 2488 ETWS_WARNING_TYPE, 2489 CMAS_MESSAGE_CLASS, 2490 CMAS_CATEGORY, 2491 CMAS_RESPONSE_TYPE, 2492 CMAS_SEVERITY, 2493 CMAS_URGENCY, 2494 CMAS_CERTAINTY 2495 }; 2496 } 2497 } 2498