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.IntDef; 20 import android.annotation.NonNull; 21 import android.annotation.RequiresPermission; 22 import android.annotation.SdkConstant; 23 import android.annotation.SdkConstant.SdkConstantType; 24 import android.annotation.SystemApi; 25 import android.annotation.TestApi; 26 import android.annotation.UnsupportedAppUsage; 27 import android.app.job.JobService; 28 import android.content.ComponentName; 29 import android.content.ContentResolver; 30 import android.content.ContentValues; 31 import android.content.Context; 32 import android.content.Intent; 33 import android.database.ContentObserver; 34 import android.database.Cursor; 35 import android.database.sqlite.SqliteWrapper; 36 import android.net.Uri; 37 import android.os.Build; 38 import android.os.Parcel; 39 import android.telephony.Rlog; 40 import android.telephony.ServiceState; 41 import android.telephony.SmsMessage; 42 import android.telephony.SubscriptionManager; 43 import android.telephony.TelephonyManager; 44 import android.text.TextUtils; 45 import android.util.Patterns; 46 47 import com.android.internal.telephony.PhoneConstants; 48 import com.android.internal.telephony.SmsApplication; 49 50 import java.lang.annotation.Retention; 51 import java.lang.annotation.RetentionPolicy; 52 import java.util.HashSet; 53 import java.util.Set; 54 import java.util.regex.Matcher; 55 import java.util.regex.Pattern; 56 57 /** 58 * The Telephony provider contains data related to phone operation, specifically SMS and MMS 59 * messages, access to the APN list, including the MMSC to use, and the service state. 60 * 61 * <p class="note"><strong>Note:</strong> These APIs are not available on all Android-powered 62 * devices. If your app depends on telephony features such as for managing SMS messages, include 63 * a <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>} 64 * </a> element in your manifest that declares the {@code "android.hardware.telephony"} hardware 65 * feature. Alternatively, you can check for telephony availability at runtime using either 66 * {@link android.content.pm.PackageManager#hasSystemFeature 67 * hasSystemFeature(PackageManager.FEATURE_TELEPHONY)} or {@link 68 * android.telephony.TelephonyManager#getPhoneType}.</p> 69 * 70 * <h3>Creating an SMS app</h3> 71 * 72 * <p>Only the default SMS app (selected by the user in system settings) is able to write to the 73 * SMS Provider (the tables defined within the {@code Telephony} class) and only the default SMS 74 * app receives the {@link android.provider.Telephony.Sms.Intents#SMS_DELIVER_ACTION} broadcast 75 * when the user receives an SMS or the {@link 76 * android.provider.Telephony.Sms.Intents#WAP_PUSH_DELIVER_ACTION} broadcast when the user 77 * receives an MMS.</p> 78 * 79 * <p>Any app that wants to behave as the user's default SMS app must handle the following intents: 80 * <ul> 81 * <li>In a broadcast receiver, include an intent filter for {@link Sms.Intents#SMS_DELIVER_ACTION} 82 * (<code>"android.provider.Telephony.SMS_DELIVER"</code>). The broadcast receiver must also 83 * require the {@link android.Manifest.permission#BROADCAST_SMS} permission. 84 * <p>This allows your app to directly receive incoming SMS messages.</p></li> 85 * <li>In a broadcast receiver, include an intent filter for {@link 86 * Sms.Intents#WAP_PUSH_DELIVER_ACTION}} ({@code "android.provider.Telephony.WAP_PUSH_DELIVER"}) 87 * with the MIME type <code>"application/vnd.wap.mms-message"</code>. 88 * The broadcast receiver must also require the {@link 89 * android.Manifest.permission#BROADCAST_WAP_PUSH} permission. 90 * <p>This allows your app to directly receive incoming MMS messages.</p></li> 91 * <li>In your activity that delivers new messages, include an intent filter for 92 * {@link android.content.Intent#ACTION_SENDTO} (<code>"android.intent.action.SENDTO" 93 * </code>) with schemas, <code>sms:</code>, <code>smsto:</code>, <code>mms:</code>, and 94 * <code>mmsto:</code>. 95 * <p>This allows your app to receive intents from other apps that want to deliver a 96 * message.</p></li> 97 * <li>In a service, include an intent filter for {@link 98 * android.telephony.TelephonyManager#ACTION_RESPOND_VIA_MESSAGE} 99 * (<code>"android.intent.action.RESPOND_VIA_MESSAGE"</code>) with schemas, 100 * <code>sms:</code>, <code>smsto:</code>, <code>mms:</code>, and <code>mmsto:</code>. 101 * This service must also require the {@link 102 * android.Manifest.permission#SEND_RESPOND_VIA_MESSAGE} permission. 103 * <p>This allows users to respond to incoming phone calls with an immediate text message 104 * using your app.</p></li> 105 * </ul> 106 * 107 * <p>Other apps that are not selected as the default SMS app can only <em>read</em> the SMS 108 * Provider, but may also be notified when a new SMS arrives by listening for the {@link 109 * Sms.Intents#SMS_RECEIVED_ACTION} 110 * broadcast, which is a non-abortable broadcast that may be delivered to multiple apps. This 111 * broadcast is intended for apps that—while not selected as the default SMS app—need to 112 * read special incoming messages such as to perform phone number verification.</p> 113 * 114 * <p>For more information about building SMS apps, read the blog post, <a 115 * href="http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html" 116 * >Getting Your SMS Apps Ready for KitKat</a>.</p> 117 * 118 */ 119 public final class Telephony { 120 private static final String TAG = "Telephony"; 121 122 /** 123 * Not instantiable. 124 * @hide 125 */ 126 private Telephony() { 127 } 128 129 /** 130 * Base columns for tables that contain text-based SMSs. 131 */ 132 public interface TextBasedSmsColumns { 133 134 /** Message type: all messages. */ 135 public static final int MESSAGE_TYPE_ALL = 0; 136 137 /** Message type: inbox. */ 138 public static final int MESSAGE_TYPE_INBOX = 1; 139 140 /** Message type: sent messages. */ 141 public static final int MESSAGE_TYPE_SENT = 2; 142 143 /** Message type: drafts. */ 144 public static final int MESSAGE_TYPE_DRAFT = 3; 145 146 /** Message type: outbox. */ 147 public static final int MESSAGE_TYPE_OUTBOX = 4; 148 149 /** Message type: failed outgoing message. */ 150 public static final int MESSAGE_TYPE_FAILED = 5; 151 152 /** Message type: queued to send later. */ 153 public static final int MESSAGE_TYPE_QUEUED = 6; 154 155 /** 156 * The type of message. 157 * <P>Type: INTEGER</P> 158 */ 159 public static final String TYPE = "type"; 160 161 /** 162 * The thread ID of the message. 163 * <P>Type: INTEGER</P> 164 */ 165 public static final String THREAD_ID = "thread_id"; 166 167 /** 168 * The address of the other party. 169 * <P>Type: TEXT</P> 170 */ 171 public static final String ADDRESS = "address"; 172 173 /** 174 * The date the message was received. 175 * <P>Type: INTEGER (long)</P> 176 */ 177 public static final String DATE = "date"; 178 179 /** 180 * The date the message was sent. 181 * <P>Type: INTEGER (long)</P> 182 */ 183 public static final String DATE_SENT = "date_sent"; 184 185 /** 186 * Has the message been read? 187 * <P>Type: INTEGER (boolean)</P> 188 */ 189 public static final String READ = "read"; 190 191 /** 192 * Has the message been seen by the user? The "seen" flag determines 193 * whether we need to show a notification. 194 * <P>Type: INTEGER (boolean)</P> 195 */ 196 public static final String SEEN = "seen"; 197 198 /** 199 * {@code TP-Status} value for the message, or -1 if no status has been received. 200 * <P>Type: INTEGER</P> 201 */ 202 public static final String STATUS = "status"; 203 204 /** TP-Status: no status received. */ 205 public static final int STATUS_NONE = -1; 206 /** TP-Status: complete. */ 207 public static final int STATUS_COMPLETE = 0; 208 /** TP-Status: pending. */ 209 public static final int STATUS_PENDING = 32; 210 /** TP-Status: failed. */ 211 public static final int STATUS_FAILED = 64; 212 213 /** 214 * The subject of the message, if present. 215 * <P>Type: TEXT</P> 216 */ 217 public static final String SUBJECT = "subject"; 218 219 /** 220 * The body of the message. 221 * <P>Type: TEXT</P> 222 */ 223 public static final String BODY = "body"; 224 225 /** 226 * The ID of the sender of the conversation, if present. 227 * <P>Type: INTEGER (reference to item in {@code content://contacts/people})</P> 228 */ 229 public static final String PERSON = "person"; 230 231 /** 232 * The protocol identifier code. 233 * <P>Type: INTEGER</P> 234 */ 235 public static final String PROTOCOL = "protocol"; 236 237 /** 238 * Is the {@code TP-Reply-Path} flag set? 239 * <P>Type: BOOLEAN</P> 240 */ 241 public static final String REPLY_PATH_PRESENT = "reply_path_present"; 242 243 /** 244 * The service center (SC) through which to send the message, if present. 245 * <P>Type: TEXT</P> 246 */ 247 public static final String SERVICE_CENTER = "service_center"; 248 249 /** 250 * Is the message locked? 251 * <P>Type: INTEGER (boolean)</P> 252 */ 253 public static final String LOCKED = "locked"; 254 255 /** 256 * The subscription to which the message belongs to. Its value will be 257 * < 0 if the sub id cannot be determined. 258 * <p>Type: INTEGER (long) </p> 259 */ 260 public static final String SUBSCRIPTION_ID = "sub_id"; 261 262 /** 263 * The MTU size of the mobile interface to which the APN connected 264 * @hide 265 */ 266 public static final String MTU = "mtu"; 267 268 /** 269 * Error code associated with sending or receiving this message 270 * <P>Type: INTEGER</P> 271 */ 272 public static final String ERROR_CODE = "error_code"; 273 274 /** 275 * The identity of the sender of a sent message. It is 276 * usually the package name of the app which sends the message. 277 * <p class="note"><strong>Note:</strong> 278 * This column is read-only. It is set by the provider and can not be changed by apps. 279 * <p>Type: TEXT</p> 280 */ 281 public static final String CREATOR = "creator"; 282 } 283 284 /** 285 * Columns in sms_changes table. 286 * @hide 287 */ 288 public interface TextBasedSmsChangesColumns { 289 /** 290 * The {@code content://} style URL for this table. 291 * @hide 292 */ 293 public static final Uri CONTENT_URI = Uri.parse("content://sms-changes"); 294 295 /** 296 * Primary key. 297 * <P>Type: INTEGER (long)</P> 298 * @hide 299 */ 300 public static final String ID = "_id"; 301 302 /** 303 * Triggers on sms table create a row in this table for each update/delete. 304 * This column is the "_id" of the row from sms table that was updated/deleted. 305 * <P>Type: INTEGER (long)</P> 306 * @hide 307 */ 308 public static final String ORIG_ROW_ID = "orig_rowid"; 309 310 /** 311 * Triggers on sms table create a row in this table for each update/delete. 312 * This column is the "sub_id" of the row from sms table that was updated/deleted. 313 * @hide 314 * <P>Type: INTEGER (long)</P> 315 */ 316 public static final String SUB_ID = "sub_id"; 317 318 /** 319 * The type of operation that created this row. 320 * {@link #TYPE_UPDATE} = update op 321 * {@link #TYPE_DELETE} = delete op 322 * @hide 323 * <P>Type: INTEGER (long)</P> 324 */ 325 public static final String TYPE = "type"; 326 327 /** 328 * One of the possible values for the above column "type". Indicates it is an update op. 329 * @hide 330 */ 331 public static final int TYPE_UPDATE = 0; 332 333 /** 334 * One of the possible values for the above column "type". Indicates it is a delete op. 335 * @hide 336 */ 337 public static final int TYPE_DELETE = 1; 338 339 /** 340 * This column contains a non-null value only if the operation on sms table is an update op 341 * and the column "read" is changed by the update op. 342 * <P>Type: INTEGER (boolean)</P> 343 * @hide 344 */ 345 public static final String NEW_READ_STATUS = "new_read_status"; 346 } 347 348 /** 349 * Contains all text-based SMS messages. 350 */ 351 public static final class Sms implements BaseColumns, TextBasedSmsColumns { 352 353 /** 354 * Not instantiable. 355 * @hide 356 */ 357 private Sms() { 358 } 359 360 /** 361 * Used to determine the currently configured default SMS package. 362 * @param context context of the requesting application 363 * @return package name for the default SMS package or null 364 */ 365 public static String getDefaultSmsPackage(Context context) { 366 ComponentName component = SmsApplication.getDefaultSmsApplication(context, false); 367 if (component != null) { 368 return component.getPackageName(); 369 } 370 return null; 371 } 372 373 /** 374 * Return cursor for table query. 375 * @hide 376 */ 377 public static Cursor query(ContentResolver cr, String[] projection) { 378 return cr.query(CONTENT_URI, projection, null, null, DEFAULT_SORT_ORDER); 379 } 380 381 /** 382 * Return cursor for table query. 383 * @hide 384 */ 385 @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) 386 public static Cursor query(ContentResolver cr, String[] projection, 387 String where, String orderBy) { 388 return cr.query(CONTENT_URI, projection, where, 389 null, orderBy == null ? DEFAULT_SORT_ORDER : orderBy); 390 } 391 392 /** 393 * The {@code content://} style URL for this table. 394 */ 395 public static final Uri CONTENT_URI = Uri.parse("content://sms"); 396 397 /** 398 * The default sort order for this table. 399 */ 400 public static final String DEFAULT_SORT_ORDER = "date DESC"; 401 402 /** 403 * Add an SMS to the given URI. 404 * 405 * @param resolver the content resolver to use 406 * @param uri the URI to add the message to 407 * @param address the address of the sender 408 * @param body the body of the message 409 * @param subject the pseudo-subject of the message 410 * @param date the timestamp for the message 411 * @param read true if the message has been read, false if not 412 * @param deliveryReport true if a delivery report was requested, false if not 413 * @return the URI for the new message 414 * @hide 415 */ 416 @UnsupportedAppUsage 417 public static Uri addMessageToUri(ContentResolver resolver, 418 Uri uri, String address, String body, String subject, 419 Long date, boolean read, boolean deliveryReport) { 420 return addMessageToUri(SubscriptionManager.getDefaultSmsSubscriptionId(), 421 resolver, uri, address, body, subject, date, read, deliveryReport, -1L); 422 } 423 424 /** 425 * Add an SMS to the given URI. 426 * 427 * @param resolver the content resolver to use 428 * @param uri the URI to add the message to 429 * @param address the address of the sender 430 * @param body the body of the message 431 * @param subject the psuedo-subject of the message 432 * @param date the timestamp for the message 433 * @param read true if the message has been read, false if not 434 * @param deliveryReport true if a delivery report was requested, false if not 435 * @param subId the subscription which the message belongs to 436 * @return the URI for the new message 437 * @hide 438 */ 439 @UnsupportedAppUsage 440 public static Uri addMessageToUri(int subId, ContentResolver resolver, 441 Uri uri, String address, String body, String subject, 442 Long date, boolean read, boolean deliveryReport) { 443 return addMessageToUri(subId, resolver, uri, address, body, subject, 444 date, read, deliveryReport, -1L); 445 } 446 447 /** 448 * Add an SMS to the given URI with the specified thread ID. 449 * 450 * @param resolver the content resolver to use 451 * @param uri the URI to add the message to 452 * @param address the address of the sender 453 * @param body the body of the message 454 * @param subject the pseudo-subject of the message 455 * @param date the timestamp for the message 456 * @param read true if the message has been read, false if not 457 * @param deliveryReport true if a delivery report was requested, false if not 458 * @param threadId the thread_id of the message 459 * @return the URI for the new message 460 * @hide 461 */ 462 @UnsupportedAppUsage 463 public static Uri addMessageToUri(ContentResolver resolver, 464 Uri uri, String address, String body, String subject, 465 Long date, boolean read, boolean deliveryReport, long threadId) { 466 return addMessageToUri(SubscriptionManager.getDefaultSmsSubscriptionId(), 467 resolver, uri, address, body, subject, 468 date, read, deliveryReport, threadId); 469 } 470 471 /** 472 * Add an SMS to the given URI with thread_id specified. 473 * 474 * @param resolver the content resolver to use 475 * @param uri the URI to add the message to 476 * @param address the address of the sender 477 * @param body the body of the message 478 * @param subject the psuedo-subject of the message 479 * @param date the timestamp for the message 480 * @param read true if the message has been read, false if not 481 * @param deliveryReport true if a delivery report was requested, false if not 482 * @param threadId the thread_id of the message 483 * @param subId the subscription which the message belongs to 484 * @return the URI for the new message 485 * @hide 486 */ 487 @UnsupportedAppUsage 488 public static Uri addMessageToUri(int subId, ContentResolver resolver, 489 Uri uri, String address, String body, String subject, 490 Long date, boolean read, boolean deliveryReport, long threadId) { 491 ContentValues values = new ContentValues(8); 492 Rlog.v(TAG,"Telephony addMessageToUri sub id: " + subId); 493 494 values.put(SUBSCRIPTION_ID, subId); 495 values.put(ADDRESS, address); 496 if (date != null) { 497 values.put(DATE, date); 498 } 499 values.put(READ, read ? Integer.valueOf(1) : Integer.valueOf(0)); 500 values.put(SUBJECT, subject); 501 values.put(BODY, body); 502 if (deliveryReport) { 503 values.put(STATUS, STATUS_PENDING); 504 } 505 if (threadId != -1L) { 506 values.put(THREAD_ID, threadId); 507 } 508 return resolver.insert(uri, values); 509 } 510 511 /** 512 * Move a message to the given folder. 513 * 514 * @param context the context to use 515 * @param uri the message to move 516 * @param folder the folder to move to 517 * @return true if the operation succeeded 518 * @hide 519 */ 520 @UnsupportedAppUsage 521 public static boolean moveMessageToFolder(Context context, 522 Uri uri, int folder, int error) { 523 if (uri == null) { 524 return false; 525 } 526 527 boolean markAsUnread = false; 528 boolean markAsRead = false; 529 switch(folder) { 530 case MESSAGE_TYPE_INBOX: 531 case MESSAGE_TYPE_DRAFT: 532 break; 533 case MESSAGE_TYPE_OUTBOX: 534 case MESSAGE_TYPE_SENT: 535 markAsRead = true; 536 break; 537 case MESSAGE_TYPE_FAILED: 538 case MESSAGE_TYPE_QUEUED: 539 markAsUnread = true; 540 break; 541 default: 542 return false; 543 } 544 545 ContentValues values = new ContentValues(3); 546 547 values.put(TYPE, folder); 548 if (markAsUnread) { 549 values.put(READ, 0); 550 } else if (markAsRead) { 551 values.put(READ, 1); 552 } 553 values.put(ERROR_CODE, error); 554 555 return 1 == SqliteWrapper.update(context, context.getContentResolver(), 556 uri, values, null, null); 557 } 558 559 /** 560 * Returns true iff the folder (message type) identifies an 561 * outgoing message. 562 * @hide 563 */ 564 @UnsupportedAppUsage 565 public static boolean isOutgoingFolder(int messageType) { 566 return (messageType == MESSAGE_TYPE_FAILED) 567 || (messageType == MESSAGE_TYPE_OUTBOX) 568 || (messageType == MESSAGE_TYPE_SENT) 569 || (messageType == MESSAGE_TYPE_QUEUED); 570 } 571 572 /** 573 * Contains all text-based SMS messages in the SMS app inbox. 574 */ 575 public static final class Inbox implements BaseColumns, TextBasedSmsColumns { 576 577 /** 578 * Not instantiable. 579 * @hide 580 */ 581 private Inbox() { 582 } 583 584 /** 585 * The {@code content://} style URL for this table. 586 */ 587 public static final Uri CONTENT_URI = Uri.parse("content://sms/inbox"); 588 589 /** 590 * The default sort order for this table. 591 */ 592 public static final String DEFAULT_SORT_ORDER = "date DESC"; 593 594 /** 595 * Add an SMS to the Draft box. 596 * 597 * @param resolver the content resolver to use 598 * @param address the address of the sender 599 * @param body the body of the message 600 * @param subject the pseudo-subject of the message 601 * @param date the timestamp for the message 602 * @param read true if the message has been read, false if not 603 * @return the URI for the new message 604 * @hide 605 */ 606 @UnsupportedAppUsage 607 public static Uri addMessage(ContentResolver resolver, 608 String address, String body, String subject, Long date, 609 boolean read) { 610 return addMessageToUri(SubscriptionManager.getDefaultSmsSubscriptionId(), 611 resolver, CONTENT_URI, address, body, subject, date, read, false); 612 } 613 614 /** 615 * Add an SMS to the Draft box. 616 * 617 * @param resolver the content resolver to use 618 * @param address the address of the sender 619 * @param body the body of the message 620 * @param subject the psuedo-subject of the message 621 * @param date the timestamp for the message 622 * @param read true if the message has been read, false if not 623 * @param subId the subscription which the message belongs to 624 * @return the URI for the new message 625 * @hide 626 */ 627 @UnsupportedAppUsage 628 public static Uri addMessage(int subId, ContentResolver resolver, 629 String address, String body, String subject, Long date, boolean read) { 630 return addMessageToUri(subId, resolver, CONTENT_URI, address, body, 631 subject, date, read, false); 632 } 633 } 634 635 /** 636 * Contains all sent text-based SMS messages in the SMS app. 637 */ 638 public static final class Sent implements BaseColumns, TextBasedSmsColumns { 639 640 /** 641 * Not instantiable. 642 * @hide 643 */ 644 private Sent() { 645 } 646 647 /** 648 * The {@code content://} style URL for this table. 649 */ 650 public static final Uri CONTENT_URI = Uri.parse("content://sms/sent"); 651 652 /** 653 * The default sort order for this table. 654 */ 655 public static final String DEFAULT_SORT_ORDER = "date DESC"; 656 657 /** 658 * Add an SMS to the Draft box. 659 * 660 * @param resolver the content resolver to use 661 * @param address the address of the sender 662 * @param body the body of the message 663 * @param subject the pseudo-subject of the message 664 * @param date the timestamp for the message 665 * @return the URI for the new message 666 * @hide 667 */ 668 @UnsupportedAppUsage 669 public static Uri addMessage(ContentResolver resolver, 670 String address, String body, String subject, Long date) { 671 return addMessageToUri(SubscriptionManager.getDefaultSmsSubscriptionId(), 672 resolver, CONTENT_URI, address, body, subject, date, true, false); 673 } 674 675 /** 676 * Add an SMS to the Draft box. 677 * 678 * @param resolver the content resolver to use 679 * @param address the address of the sender 680 * @param body the body of the message 681 * @param subject the psuedo-subject of the message 682 * @param date the timestamp for the message 683 * @param subId the subscription which the message belongs to 684 * @return the URI for the new message 685 * @hide 686 */ 687 @UnsupportedAppUsage 688 public static Uri addMessage(int subId, ContentResolver resolver, 689 String address, String body, String subject, Long date) { 690 return addMessageToUri(subId, resolver, CONTENT_URI, address, body, 691 subject, date, true, false); 692 } 693 } 694 695 /** 696 * Contains all sent text-based SMS messages in the SMS app. 697 */ 698 public static final class Draft implements BaseColumns, TextBasedSmsColumns { 699 700 /** 701 * Not instantiable. 702 * @hide 703 */ 704 private Draft() { 705 } 706 707 /** 708 * The {@code content://} style URL for this table. 709 */ 710 public static final Uri CONTENT_URI = Uri.parse("content://sms/draft"); 711 712 /** 713 * @hide 714 */ 715 @UnsupportedAppUsage 716 public static Uri addMessage(ContentResolver resolver, 717 String address, String body, String subject, Long date) { 718 return addMessageToUri(SubscriptionManager.getDefaultSmsSubscriptionId(), 719 resolver, CONTENT_URI, address, body, subject, date, true, false); 720 } 721 722 /** 723 * Add an SMS to the Draft box. 724 * 725 * @param resolver the content resolver to use 726 * @param address the address of the sender 727 * @param body the body of the message 728 * @param subject the psuedo-subject of the message 729 * @param date the timestamp for the message 730 * @param subId the subscription which the message belongs to 731 * @return the URI for the new message 732 * @hide 733 */ 734 @UnsupportedAppUsage 735 public static Uri addMessage(int subId, ContentResolver resolver, 736 String address, String body, String subject, Long date) { 737 return addMessageToUri(subId, resolver, CONTENT_URI, address, body, 738 subject, date, true, false); 739 } 740 741 /** 742 * The default sort order for this table. 743 */ 744 public static final String DEFAULT_SORT_ORDER = "date DESC"; 745 } 746 747 /** 748 * Contains all pending outgoing text-based SMS messages. 749 */ 750 public static final class Outbox implements BaseColumns, TextBasedSmsColumns { 751 752 /** 753 * Not instantiable. 754 * @hide 755 */ 756 private Outbox() { 757 } 758 759 /** 760 * The {@code content://} style URL for this table. 761 */ 762 public static final Uri CONTENT_URI = Uri.parse("content://sms/outbox"); 763 764 /** 765 * The default sort order for this table. 766 */ 767 public static final String DEFAULT_SORT_ORDER = "date DESC"; 768 769 /** 770 * Add an SMS to the outbox. 771 * 772 * @param resolver the content resolver to use 773 * @param address the address of the sender 774 * @param body the body of the message 775 * @param subject the pseudo-subject of the message 776 * @param date the timestamp for the message 777 * @param deliveryReport whether a delivery report was requested for the message 778 * @return the URI for the new message 779 * @hide 780 */ 781 @UnsupportedAppUsage 782 public static Uri addMessage(ContentResolver resolver, 783 String address, String body, String subject, Long date, 784 boolean deliveryReport, long threadId) { 785 return addMessageToUri(SubscriptionManager.getDefaultSmsSubscriptionId(), 786 resolver, CONTENT_URI, address, body, subject, date, 787 true, deliveryReport, threadId); 788 } 789 790 /** 791 * Add an SMS to the Out box. 792 * 793 * @param resolver the content resolver to use 794 * @param address the address of the sender 795 * @param body the body of the message 796 * @param subject the psuedo-subject of the message 797 * @param date the timestamp for the message 798 * @param deliveryReport whether a delivery report was requested for the message 799 * @param subId the subscription which the message belongs to 800 * @return the URI for the new message 801 * @hide 802 */ 803 public static Uri addMessage(int subId, ContentResolver resolver, 804 String address, String body, String subject, Long date, 805 boolean deliveryReport, long threadId) { 806 return addMessageToUri(subId, resolver, CONTENT_URI, address, body, 807 subject, date, true, deliveryReport, threadId); 808 } 809 } 810 811 /** 812 * Contains all sent text-based SMS messages in the SMS app. 813 */ 814 public static final class Conversations 815 implements BaseColumns, TextBasedSmsColumns { 816 817 /** 818 * Not instantiable. 819 * @hide 820 */ 821 private Conversations() { 822 } 823 824 /** 825 * The {@code content://} style URL for this table. 826 */ 827 public static final Uri CONTENT_URI = Uri.parse("content://sms/conversations"); 828 829 /** 830 * The default sort order for this table. 831 */ 832 public static final String DEFAULT_SORT_ORDER = "date DESC"; 833 834 /** 835 * The first 45 characters of the body of the message. 836 * <P>Type: TEXT</P> 837 */ 838 public static final String SNIPPET = "snippet"; 839 840 /** 841 * The number of messages in the conversation. 842 * <P>Type: INTEGER</P> 843 */ 844 public static final String MESSAGE_COUNT = "msg_count"; 845 } 846 847 /** 848 * Contains constants for SMS related Intents that are broadcast. 849 */ 850 public static final class Intents { 851 852 /** 853 * Not instantiable. 854 * @hide 855 */ 856 private Intents() { 857 } 858 859 /** 860 * Set by BroadcastReceiver to indicate that the message was handled 861 * successfully. 862 */ 863 public static final int RESULT_SMS_HANDLED = 1; 864 865 /** 866 * Set by BroadcastReceiver to indicate a generic error while 867 * processing the message. 868 */ 869 public static final int RESULT_SMS_GENERIC_ERROR = 2; 870 871 /** 872 * Set by BroadcastReceiver to indicate insufficient memory to store 873 * the message. 874 */ 875 public static final int RESULT_SMS_OUT_OF_MEMORY = 3; 876 877 /** 878 * Set by BroadcastReceiver to indicate that the message, while 879 * possibly valid, is of a format or encoding that is not 880 * supported. 881 */ 882 public static final int RESULT_SMS_UNSUPPORTED = 4; 883 884 /** 885 * Set by BroadcastReceiver to indicate a duplicate incoming message. 886 */ 887 public static final int RESULT_SMS_DUPLICATED = 5; 888 889 /** 890 * Activity action: Ask the user to change the default 891 * SMS application. This will show a dialog that asks the 892 * user whether they want to replace the current default 893 * SMS application with the one specified in 894 * {@link #EXTRA_PACKAGE_NAME}. 895 * <p> 896 * This is no longer supported since Q, please use 897 * {@link android.app.role.RoleManager#createRequestRoleIntent(String)} with 898 * {@link android.app.role.RoleManager#ROLE_SMS} instead. 899 */ 900 @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) 901 public static final String ACTION_CHANGE_DEFAULT = 902 "android.provider.Telephony.ACTION_CHANGE_DEFAULT"; 903 904 /** 905 * The PackageName string passed in as an 906 * extra for {@link #ACTION_CHANGE_DEFAULT} 907 * 908 * @see #ACTION_CHANGE_DEFAULT 909 * <p> 910 * This is no longer supported since Q, please use 911 * {@link android.app.role.RoleManager#createRequestRoleIntent(String)} with 912 * {@link android.app.role.RoleManager#ROLE_SMS} instead. 913 */ 914 public static final String EXTRA_PACKAGE_NAME = "package"; 915 916 /** 917 * Broadcast Action: A new text-based SMS message has been received 918 * by the device. This intent will only be delivered to the default 919 * sms app. That app is responsible for writing the message and notifying 920 * the user. The intent will have the following extra values:</p> 921 * 922 * <ul> 923 * <li><em>"pdus"</em> - An Object[] of byte[]s containing the PDUs 924 * that make up the message.</li> 925 * <li><em>"format"</em> - A String describing the format of the PDUs. It can 926 * be either "3gpp" or "3gpp2".</li> 927 * <li><em>"subscription"</em> - An optional long value of the subscription id which 928 * received the message.</li> 929 * <li><em>"slot"</em> - An optional int value of the SIM slot containing the 930 * subscription.</li> 931 * <li><em>"phone"</em> - An optional int value of the phone id associated with the 932 * subscription.</li> 933 * <li><em>"errorCode"</em> - An optional int error code associated with receiving 934 * the message.</li> 935 * </ul> 936 * 937 * <p>The extra values can be extracted using 938 * {@link #getMessagesFromIntent(Intent)}.</p> 939 * 940 * <p>If a BroadcastReceiver encounters an error while processing 941 * this intent it should set the result code appropriately.</p> 942 * 943 * <p class="note"><strong>Note:</strong> 944 * The broadcast receiver that filters for this intent must declare 945 * {@link android.Manifest.permission#BROADCAST_SMS} as a required permission in 946 * the <a href="{@docRoot}guide/topics/manifest/receiver-element.html">{@code 947 * <receiver>}</a> tag. 948 * 949 * <p>Requires {@link android.Manifest.permission#RECEIVE_SMS} to receive.</p> 950 */ 951 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 952 public static final String SMS_DELIVER_ACTION = 953 "android.provider.Telephony.SMS_DELIVER"; 954 955 /** 956 * Broadcast Action: A new text-based SMS message has been received 957 * by the device. This intent will be delivered to all registered 958 * receivers as a notification. These apps are not expected to write the 959 * message or notify the user. The intent will have the following extra 960 * values:</p> 961 * 962 * <ul> 963 * <li><em>"pdus"</em> - An Object[] of byte[]s containing the PDUs 964 * that make up the message.</li> 965 * </ul> 966 * 967 * <p>The extra values can be extracted using 968 * {@link #getMessagesFromIntent(Intent)}.</p> 969 * 970 * <p>If a BroadcastReceiver encounters an error while processing 971 * this intent it should set the result code appropriately.</p> 972 * 973 * <p>Requires {@link android.Manifest.permission#RECEIVE_SMS} to receive.</p> 974 */ 975 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 976 public static final String SMS_RECEIVED_ACTION = 977 "android.provider.Telephony.SMS_RECEIVED"; 978 979 /** 980 * Broadcast Action: A new data based SMS message has been received 981 * by the device. This intent will be delivered to all registered 982 * receivers as a notification. The intent will have the following extra 983 * values:</p> 984 * 985 * <ul> 986 * <li><em>"pdus"</em> - An Object[] of byte[]s containing the PDUs 987 * that make up the message.</li> 988 * </ul> 989 * 990 * <p>The extra values can be extracted using 991 * {@link #getMessagesFromIntent(Intent)}.</p> 992 * 993 * <p>If a BroadcastReceiver encounters an error while processing 994 * this intent it should set the result code appropriately.</p> 995 * 996 * <p>Requires {@link android.Manifest.permission#RECEIVE_SMS} to receive.</p> 997 */ 998 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 999 public static final String DATA_SMS_RECEIVED_ACTION = 1000 "android.intent.action.DATA_SMS_RECEIVED"; 1001 1002 /** 1003 * Broadcast Action: A new WAP PUSH message has been received by the 1004 * device. This intent will only be delivered to the default 1005 * sms app. That app is responsible for writing the message and notifying 1006 * the user. The intent will have the following extra values:</p> 1007 * 1008 * <ul> 1009 * <li><em>"transactionId"</em> - (Integer) The WAP transaction ID</li> 1010 * <li><em>"pduType"</em> - (Integer) The WAP PDU type</li> 1011 * <li><em>"header"</em> - (byte[]) The header of the message</li> 1012 * <li><em>"data"</em> - (byte[]) The data payload of the message</li> 1013 * <li><em>"contentTypeParameters" </em> 1014 * -(HashMap<String,String>) Any parameters associated with the content type 1015 * (decoded from the WSP Content-Type header)</li> 1016 * <li><em>"subscription"</em> - An optional long value of the subscription id which 1017 * received the message.</li> 1018 * <li><em>"slot"</em> - An optional int value of the SIM slot containing the 1019 * subscription.</li> 1020 * <li><em>"phone"</em> - An optional int value of the phone id associated with the 1021 * subscription.</li> 1022 * </ul> 1023 * 1024 * <p>If a BroadcastReceiver encounters an error while processing 1025 * this intent it should set the result code appropriately.</p> 1026 * 1027 * <p>The contentTypeParameters extra value is map of content parameters keyed by 1028 * their names.</p> 1029 * 1030 * <p>If any unassigned well-known parameters are encountered, the key of the map will 1031 * be 'unassigned/0x...', where '...' is the hex value of the unassigned parameter. If 1032 * a parameter has No-Value the value in the map will be null.</p> 1033 * 1034 * <p>Requires {@link android.Manifest.permission#RECEIVE_MMS} or 1035 * {@link android.Manifest.permission#RECEIVE_WAP_PUSH} (depending on WAP PUSH type) to 1036 * receive.</p> 1037 * 1038 * <p class="note"><strong>Note:</strong> 1039 * The broadcast receiver that filters for this intent must declare 1040 * {@link android.Manifest.permission#BROADCAST_WAP_PUSH} as a required permission in 1041 * the <a href="{@docRoot}guide/topics/manifest/receiver-element.html">{@code 1042 * <receiver>}</a> tag. 1043 */ 1044 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1045 public static final String WAP_PUSH_DELIVER_ACTION = 1046 "android.provider.Telephony.WAP_PUSH_DELIVER"; 1047 1048 /** 1049 * Broadcast Action: A new WAP PUSH message has been received by the 1050 * device. This intent will be delivered to all registered 1051 * receivers as a notification. These apps are not expected to write the 1052 * message or notify the user. The intent will have the following extra 1053 * values:</p> 1054 * 1055 * <ul> 1056 * <li><em>"transactionId"</em> - (Integer) The WAP transaction ID</li> 1057 * <li><em>"pduType"</em> - (Integer) The WAP PDU type</li> 1058 * <li><em>"header"</em> - (byte[]) The header of the message</li> 1059 * <li><em>"data"</em> - (byte[]) The data payload of the message</li> 1060 * <li><em>"contentTypeParameters"</em> 1061 * - (HashMap<String,String>) Any parameters associated with the content type 1062 * (decoded from the WSP Content-Type header)</li> 1063 * </ul> 1064 * 1065 * <p>If a BroadcastReceiver encounters an error while processing 1066 * this intent it should set the result code appropriately.</p> 1067 * 1068 * <p>The contentTypeParameters extra value is map of content parameters keyed by 1069 * their names.</p> 1070 * 1071 * <p>If any unassigned well-known parameters are encountered, the key of the map will 1072 * be 'unassigned/0x...', where '...' is the hex value of the unassigned parameter. If 1073 * a parameter has No-Value the value in the map will be null.</p> 1074 * 1075 * <p>Requires {@link android.Manifest.permission#RECEIVE_MMS} or 1076 * {@link android.Manifest.permission#RECEIVE_WAP_PUSH} (depending on WAP PUSH type) to 1077 * receive.</p> 1078 */ 1079 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1080 public static final String WAP_PUSH_RECEIVED_ACTION = 1081 "android.provider.Telephony.WAP_PUSH_RECEIVED"; 1082 1083 /** 1084 * Broadcast Action: A new Cell Broadcast message has been received 1085 * by the device. The intent will have the following extra 1086 * values:</p> 1087 * 1088 * <ul> 1089 * <li><em>"message"</em> - An SmsCbMessage object containing the broadcast message 1090 * data. This is not an emergency alert, so ETWS and CMAS data will be null.</li> 1091 * </ul> 1092 * 1093 * <p>The extra values can be extracted using 1094 * {@link #getMessagesFromIntent(Intent)}.</p> 1095 * 1096 * <p>If a BroadcastReceiver encounters an error while processing 1097 * this intent it should set the result code appropriately.</p> 1098 * 1099 * <p>Requires {@link android.Manifest.permission#RECEIVE_SMS} to receive.</p> 1100 */ 1101 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1102 public static final String SMS_CB_RECEIVED_ACTION = 1103 "android.provider.Telephony.SMS_CB_RECEIVED"; 1104 1105 /** 1106 * Action: A SMS based carrier provision intent. Used to identify default 1107 * carrier provisioning app on the device. 1108 * @hide 1109 */ 1110 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1111 @TestApi 1112 public static final String SMS_CARRIER_PROVISION_ACTION = 1113 "android.provider.Telephony.SMS_CARRIER_PROVISION"; 1114 1115 /** 1116 * Broadcast Action: A new Emergency Broadcast message has been received 1117 * by the device. The intent will have the following extra 1118 * values:</p> 1119 * 1120 * <ul> 1121 * <li><em>"message"</em> - An SmsCbMessage object containing the broadcast message 1122 * data, including ETWS or CMAS warning notification info if present.</li> 1123 * </ul> 1124 * 1125 * <p>The extra values can be extracted using 1126 * {@link #getMessagesFromIntent(Intent)}.</p> 1127 * 1128 * <p>If a BroadcastReceiver encounters an error while processing 1129 * this intent it should set the result code appropriately.</p> 1130 * 1131 * <p>Requires {@link android.Manifest.permission#RECEIVE_EMERGENCY_BROADCAST} to 1132 * receive.</p> 1133 * @removed 1134 */ 1135 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1136 public static final String SMS_EMERGENCY_CB_RECEIVED_ACTION = 1137 "android.provider.Telephony.SMS_EMERGENCY_CB_RECEIVED"; 1138 1139 /** 1140 * Broadcast Action: A new CDMA SMS has been received containing Service Category 1141 * Program Data (updates the list of enabled broadcast channels). The intent will 1142 * have the following extra values:</p> 1143 * 1144 * <ul> 1145 * <li><em>"operations"</em> - An array of CdmaSmsCbProgramData objects containing 1146 * the service category operations (add/delete/clear) to perform.</li> 1147 * </ul> 1148 * 1149 * <p>The extra values can be extracted using 1150 * {@link #getMessagesFromIntent(Intent)}.</p> 1151 * 1152 * <p>If a BroadcastReceiver encounters an error while processing 1153 * this intent it should set the result code appropriately.</p> 1154 * 1155 * <p>Requires {@link android.Manifest.permission#RECEIVE_SMS} to receive.</p> 1156 */ 1157 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1158 public static final String SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED_ACTION = 1159 "android.provider.Telephony.SMS_SERVICE_CATEGORY_PROGRAM_DATA_RECEIVED"; 1160 1161 /** 1162 * Broadcast Action: The SIM storage for SMS messages is full. If 1163 * space is not freed, messages targeted for the SIM (class 2) may 1164 * not be saved. 1165 * 1166 * <p>Requires {@link android.Manifest.permission#RECEIVE_SMS} to receive.</p> 1167 */ 1168 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1169 public static final String SIM_FULL_ACTION = 1170 "android.provider.Telephony.SIM_FULL"; 1171 1172 /** 1173 * Broadcast Action: An incoming SMS has been rejected by the 1174 * telephony framework. This intent is sent in lieu of any 1175 * of the RECEIVED_ACTION intents. The intent will have the 1176 * following extra value:</p> 1177 * 1178 * <ul> 1179 * <li><em>"result"</em> - An int result code, e.g. {@link #RESULT_SMS_OUT_OF_MEMORY} 1180 * indicating the error returned to the network.</li> 1181 * </ul> 1182 * 1183 * <p>Requires {@link android.Manifest.permission#RECEIVE_SMS} to receive.</p> 1184 */ 1185 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1186 public static final String SMS_REJECTED_ACTION = 1187 "android.provider.Telephony.SMS_REJECTED"; 1188 1189 /** 1190 * Broadcast Action: An incoming MMS has been downloaded. The intent is sent to all 1191 * users, except for secondary users where SMS has been disabled and to managed 1192 * profiles. 1193 * @hide 1194 */ 1195 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1196 public static final String MMS_DOWNLOADED_ACTION = 1197 "android.provider.Telephony.MMS_DOWNLOADED"; 1198 1199 /** 1200 * Broadcast Action: A debug code has been entered in the dialer. This intent is 1201 * broadcast by the system and OEM telephony apps may need to receive these broadcasts. 1202 * These "secret codes" are used to activate developer menus by dialing certain codes. 1203 * And they are of the form {@code *#*#<code>#*#*}. The intent will have the data 1204 * URI: {@code android_secret_code://<code>}. It is possible that a manifest 1205 * receiver would be woken up even if it is not currently running. 1206 * 1207 * <p>Requires {@code android.Manifest.permission#CONTROL_INCALL_EXPERIENCE} to 1208 * send and receive.</p> 1209 * @deprecated it is no longer supported, use {@link 1210 * TelephonyManager#ACTION_SECRET_CODE} instead 1211 */ 1212 @Deprecated 1213 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1214 public static final String SECRET_CODE_ACTION = 1215 "android.provider.Telephony.SECRET_CODE"; 1216 1217 /** 1218 * Broadcast action: When the default SMS package changes, 1219 * the previous default SMS package and the new default SMS 1220 * package are sent this broadcast to notify them of the change. 1221 * A boolean is specified in {@link #EXTRA_IS_DEFAULT_SMS_APP} to 1222 * indicate whether the package is the new default SMS package. 1223 */ 1224 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1225 public static final String ACTION_DEFAULT_SMS_PACKAGE_CHANGED = 1226 "android.provider.action.DEFAULT_SMS_PACKAGE_CHANGED"; 1227 1228 /** 1229 * The IsDefaultSmsApp boolean passed as an 1230 * extra for {@link #ACTION_DEFAULT_SMS_PACKAGE_CHANGED} to indicate whether the 1231 * SMS app is becoming the default SMS app or is no longer the default. 1232 * 1233 * @see #ACTION_DEFAULT_SMS_PACKAGE_CHANGED 1234 */ 1235 public static final String EXTRA_IS_DEFAULT_SMS_APP = 1236 "android.provider.extra.IS_DEFAULT_SMS_APP"; 1237 1238 /** 1239 * Broadcast action: When a change is made to the SmsProvider or 1240 * MmsProvider by a process other than the default SMS application, 1241 * this intent is broadcast to the default SMS application so it can 1242 * re-sync or update the change. The uri that was used to call the provider 1243 * can be retrieved from the intent with getData(). The actual affected uris 1244 * (which would depend on the selection specified) are not included. 1245 */ 1246 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1247 public static final String ACTION_EXTERNAL_PROVIDER_CHANGE = 1248 "android.provider.action.EXTERNAL_PROVIDER_CHANGE"; 1249 1250 /** 1251 * Same as {@link #ACTION_DEFAULT_SMS_PACKAGE_CHANGED} but it's implicit (e.g. sent to 1252 * all apps) and requires 1253 * {@link android.Manifest.permission#MONITOR_DEFAULT_SMS_PACKAGE} to receive. 1254 * 1255 * @hide 1256 */ 1257 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1258 public static final String ACTION_DEFAULT_SMS_PACKAGE_CHANGED_INTERNAL = 1259 "android.provider.action.DEFAULT_SMS_PACKAGE_CHANGED_INTERNAL"; 1260 1261 /** 1262 * Broadcast action: When SMS-MMS db is being created. If file-based encryption is 1263 * supported, this broadcast indicates creation of the db in credential-encrypted 1264 * storage. A boolean is specified in {@link #EXTRA_IS_INITIAL_CREATE} to indicate if 1265 * this is the initial create of the db. Requires 1266 * {@link android.Manifest.permission#READ_SMS} to receive. 1267 * 1268 * @see #EXTRA_IS_INITIAL_CREATE 1269 * 1270 * @hide 1271 */ 1272 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1273 public static final String ACTION_SMS_MMS_DB_CREATED = 1274 "android.provider.action.SMS_MMS_DB_CREATED"; 1275 1276 /** 1277 * Boolean flag passed as an extra with {@link #ACTION_SMS_MMS_DB_CREATED} to indicate 1278 * whether the DB creation is the initial creation on the device, that is it is after a 1279 * factory-data reset or a new device. Any subsequent creations of the DB (which 1280 * happens only in error scenarios) will have this flag set to false. 1281 * 1282 * @see #ACTION_SMS_MMS_DB_CREATED 1283 * 1284 * @hide 1285 */ 1286 public static final String EXTRA_IS_INITIAL_CREATE = 1287 "android.provider.extra.IS_INITIAL_CREATE"; 1288 1289 /** 1290 * Broadcast intent action indicating that the telephony provider SMS MMS database is 1291 * corrupted. A boolean is specified in {@link #EXTRA_IS_CORRUPTED} to indicate if the 1292 * database is corrupted. Requires the 1293 * {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE permission. 1294 * 1295 * @hide 1296 */ 1297 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 1298 @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) 1299 public static final String ACTION_SMS_MMS_DB_LOST = 1300 "android.provider.action.SMS_MMS_DB_LOST"; 1301 1302 /** 1303 * Boolean flag passed as an extra with {@link #ACTION_SMS_MMS_DB_LOST} to indicate 1304 * whether the DB got corrupted or not. 1305 * 1306 * @see #ACTION_SMS_MMS_DB_LOST 1307 * 1308 * @hide 1309 */ 1310 public static final String EXTRA_IS_CORRUPTED = 1311 "android.provider.extra.IS_CORRUPTED"; 1312 1313 /** 1314 * Read the PDUs out of an {@link #SMS_RECEIVED_ACTION} or a 1315 * {@link #DATA_SMS_RECEIVED_ACTION} intent. 1316 * 1317 * @param intent the intent to read from 1318 * @return an array of SmsMessages for the PDUs 1319 */ 1320 public static SmsMessage[] getMessagesFromIntent(Intent intent) { 1321 Object[] messages; 1322 try { 1323 messages = (Object[]) intent.getSerializableExtra("pdus"); 1324 } 1325 catch (ClassCastException e) { 1326 Rlog.e(TAG, "getMessagesFromIntent: " + e); 1327 return null; 1328 } 1329 1330 if (messages == null) { 1331 Rlog.e(TAG, "pdus does not exist in the intent"); 1332 return null; 1333 } 1334 1335 String format = intent.getStringExtra("format"); 1336 int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY, 1337 SubscriptionManager.getDefaultSmsSubscriptionId()); 1338 1339 Rlog.v(TAG, " getMessagesFromIntent sub_id : " + subId); 1340 1341 int pduCount = messages.length; 1342 SmsMessage[] msgs = new SmsMessage[pduCount]; 1343 1344 for (int i = 0; i < pduCount; i++) { 1345 byte[] pdu = (byte[]) messages[i]; 1346 msgs[i] = SmsMessage.createFromPdu(pdu, format); 1347 if (msgs[i] != null) msgs[i].setSubId(subId); 1348 } 1349 return msgs; 1350 } 1351 } 1352 } 1353 1354 /** 1355 * Base column for the table that contain Carrier Public key. 1356 * @hide 1357 */ 1358 public interface CarrierColumns extends BaseColumns { 1359 1360 public static final String MCC = "mcc"; 1361 public static final String MNC = "mnc"; 1362 public static final String KEY_TYPE = "key_type"; 1363 public static final String MVNO_TYPE = "mvno_type"; 1364 public static final String MVNO_MATCH_DATA = "mvno_match_data"; 1365 public static final String PUBLIC_KEY = "public_key"; 1366 public static final String KEY_IDENTIFIER = "key_identifier"; 1367 public static final String EXPIRATION_TIME = "expiration_time"; 1368 public static final String LAST_MODIFIED = "last_modified"; 1369 1370 /** 1371 * The {@code content://} style URL for this table. 1372 * @hide 1373 */ 1374 public static final Uri CONTENT_URI = Uri.parse("content://carrier_information/carrier"); 1375 } 1376 1377 /** 1378 * Base columns for tables that contain MMSs. 1379 */ 1380 public interface BaseMmsColumns extends BaseColumns { 1381 1382 /** Message box: all messages. */ 1383 public static final int MESSAGE_BOX_ALL = 0; 1384 /** Message box: inbox. */ 1385 public static final int MESSAGE_BOX_INBOX = 1; 1386 /** Message box: sent messages. */ 1387 public static final int MESSAGE_BOX_SENT = 2; 1388 /** Message box: drafts. */ 1389 public static final int MESSAGE_BOX_DRAFTS = 3; 1390 /** Message box: outbox. */ 1391 public static final int MESSAGE_BOX_OUTBOX = 4; 1392 /** Message box: failed. */ 1393 public static final int MESSAGE_BOX_FAILED = 5; 1394 1395 /** 1396 * The thread ID of the message. 1397 * <P>Type: INTEGER (long)</P> 1398 */ 1399 public static final String THREAD_ID = "thread_id"; 1400 1401 /** 1402 * The date the message was received. 1403 * <P>Type: INTEGER (long)</P> 1404 */ 1405 public static final String DATE = "date"; 1406 1407 /** 1408 * The date the message was sent. 1409 * <P>Type: INTEGER (long)</P> 1410 */ 1411 public static final String DATE_SENT = "date_sent"; 1412 1413 /** 1414 * The box which the message belongs to, e.g. {@link #MESSAGE_BOX_INBOX}. 1415 * <P>Type: INTEGER</P> 1416 */ 1417 public static final String MESSAGE_BOX = "msg_box"; 1418 1419 /** 1420 * Has the message been read? 1421 * <P>Type: INTEGER (boolean)</P> 1422 */ 1423 public static final String READ = "read"; 1424 1425 /** 1426 * Has the message been seen by the user? The "seen" flag determines 1427 * whether we need to show a new message notification. 1428 * <P>Type: INTEGER (boolean)</P> 1429 */ 1430 public static final String SEEN = "seen"; 1431 1432 /** 1433 * Does the message have only a text part (can also have a subject) with 1434 * no picture, slideshow, sound, etc. parts? 1435 * <P>Type: INTEGER (boolean)</P> 1436 */ 1437 public static final String TEXT_ONLY = "text_only"; 1438 1439 /** 1440 * The {@code Message-ID} of the message. 1441 * <P>Type: TEXT</P> 1442 */ 1443 public static final String MESSAGE_ID = "m_id"; 1444 1445 /** 1446 * The subject of the message, if present. 1447 * <P>Type: TEXT</P> 1448 */ 1449 public static final String SUBJECT = "sub"; 1450 1451 /** 1452 * The character set of the subject, if present. 1453 * <P>Type: INTEGER</P> 1454 */ 1455 public static final String SUBJECT_CHARSET = "sub_cs"; 1456 1457 /** 1458 * The {@code Content-Type} of the message. 1459 * <P>Type: TEXT</P> 1460 */ 1461 public static final String CONTENT_TYPE = "ct_t"; 1462 1463 /** 1464 * The {@code Content-Location} of the message. 1465 * <P>Type: TEXT</P> 1466 */ 1467 public static final String CONTENT_LOCATION = "ct_l"; 1468 1469 /** 1470 * The expiry time of the message. 1471 * <P>Type: INTEGER (long)</P> 1472 */ 1473 public static final String EXPIRY = "exp"; 1474 1475 /** 1476 * The class of the message. 1477 * <P>Type: TEXT</P> 1478 */ 1479 public static final String MESSAGE_CLASS = "m_cls"; 1480 1481 /** 1482 * The type of the message defined by MMS spec. 1483 * <P>Type: INTEGER</P> 1484 */ 1485 public static final String MESSAGE_TYPE = "m_type"; 1486 1487 /** 1488 * The version of the specification that this message conforms to. 1489 * <P>Type: INTEGER</P> 1490 */ 1491 public static final String MMS_VERSION = "v"; 1492 1493 /** 1494 * The size of the message. 1495 * <P>Type: INTEGER</P> 1496 */ 1497 public static final String MESSAGE_SIZE = "m_size"; 1498 1499 /** 1500 * The priority of the message. 1501 * <P>Type: INTEGER</P> 1502 */ 1503 public static final String PRIORITY = "pri"; 1504 1505 /** 1506 * The {@code read-report} of the message. 1507 * <P>Type: INTEGER (boolean)</P> 1508 */ 1509 public static final String READ_REPORT = "rr"; 1510 1511 /** 1512 * Is read report allowed? 1513 * <P>Type: INTEGER (boolean)</P> 1514 */ 1515 public static final String REPORT_ALLOWED = "rpt_a"; 1516 1517 /** 1518 * The {@code response-status} of the message. 1519 * <P>Type: INTEGER</P> 1520 */ 1521 public static final String RESPONSE_STATUS = "resp_st"; 1522 1523 /** 1524 * The {@code status} of the message. 1525 * <P>Type: INTEGER</P> 1526 */ 1527 public static final String STATUS = "st"; 1528 1529 /** 1530 * The {@code transaction-id} of the message. 1531 * <P>Type: TEXT</P> 1532 */ 1533 public static final String TRANSACTION_ID = "tr_id"; 1534 1535 /** 1536 * The {@code retrieve-status} of the message. 1537 * <P>Type: INTEGER</P> 1538 */ 1539 public static final String RETRIEVE_STATUS = "retr_st"; 1540 1541 /** 1542 * The {@code retrieve-text} of the message. 1543 * <P>Type: TEXT</P> 1544 */ 1545 public static final String RETRIEVE_TEXT = "retr_txt"; 1546 1547 /** 1548 * The character set of the retrieve-text. 1549 * <P>Type: INTEGER</P> 1550 */ 1551 public static final String RETRIEVE_TEXT_CHARSET = "retr_txt_cs"; 1552 1553 /** 1554 * The {@code read-status} of the message. 1555 * <P>Type: INTEGER</P> 1556 */ 1557 public static final String READ_STATUS = "read_status"; 1558 1559 /** 1560 * The {@code content-class} of the message. 1561 * <P>Type: INTEGER</P> 1562 */ 1563 public static final String CONTENT_CLASS = "ct_cls"; 1564 1565 /** 1566 * The {@code delivery-report} of the message. 1567 * <P>Type: INTEGER</P> 1568 */ 1569 public static final String DELIVERY_REPORT = "d_rpt"; 1570 1571 /** 1572 * The {@code delivery-time-token} of the message. 1573 * <P>Type: INTEGER</P> 1574 * @deprecated this column is no longer supported. 1575 * @hide 1576 */ 1577 @Deprecated 1578 public static final String DELIVERY_TIME_TOKEN = "d_tm_tok"; 1579 1580 /** 1581 * The {@code delivery-time} of the message. 1582 * <P>Type: INTEGER</P> 1583 */ 1584 public static final String DELIVERY_TIME = "d_tm"; 1585 1586 /** 1587 * The {@code response-text} of the message. 1588 * <P>Type: TEXT</P> 1589 */ 1590 public static final String RESPONSE_TEXT = "resp_txt"; 1591 1592 /** 1593 * The {@code sender-visibility} of the message. 1594 * <P>Type: TEXT</P> 1595 * @deprecated this column is no longer supported. 1596 * @hide 1597 */ 1598 @Deprecated 1599 public static final String SENDER_VISIBILITY = "s_vis"; 1600 1601 /** 1602 * The {@code reply-charging} of the message. 1603 * <P>Type: INTEGER</P> 1604 * @deprecated this column is no longer supported. 1605 * @hide 1606 */ 1607 @Deprecated 1608 public static final String REPLY_CHARGING = "r_chg"; 1609 1610 /** 1611 * The {@code reply-charging-deadline-token} of the message. 1612 * <P>Type: INTEGER</P> 1613 * @deprecated this column is no longer supported. 1614 * @hide 1615 */ 1616 @Deprecated 1617 public static final String REPLY_CHARGING_DEADLINE_TOKEN = "r_chg_dl_tok"; 1618 1619 /** 1620 * The {@code reply-charging-deadline} of the message. 1621 * <P>Type: INTEGER</P> 1622 * @deprecated this column is no longer supported. 1623 * @hide 1624 */ 1625 @Deprecated 1626 public static final String REPLY_CHARGING_DEADLINE = "r_chg_dl"; 1627 1628 /** 1629 * The {@code reply-charging-id} of the message. 1630 * <P>Type: TEXT</P> 1631 * @deprecated this column is no longer supported. 1632 * @hide 1633 */ 1634 @Deprecated 1635 public static final String REPLY_CHARGING_ID = "r_chg_id"; 1636 1637 /** 1638 * The {@code reply-charging-size} of the message. 1639 * <P>Type: INTEGER</P> 1640 * @deprecated this column is no longer supported. 1641 * @hide 1642 */ 1643 @Deprecated 1644 public static final String REPLY_CHARGING_SIZE = "r_chg_sz"; 1645 1646 /** 1647 * The {@code previously-sent-by} of the message. 1648 * <P>Type: TEXT</P> 1649 * @deprecated this column is no longer supported. 1650 * @hide 1651 */ 1652 @Deprecated 1653 public static final String PREVIOUSLY_SENT_BY = "p_s_by"; 1654 1655 /** 1656 * The {@code previously-sent-date} of the message. 1657 * <P>Type: INTEGER</P> 1658 * @deprecated this column is no longer supported. 1659 * @hide 1660 */ 1661 @Deprecated 1662 public static final String PREVIOUSLY_SENT_DATE = "p_s_d"; 1663 1664 /** 1665 * The {@code store} of the message. 1666 * <P>Type: TEXT</P> 1667 * @deprecated this column is no longer supported. 1668 * @hide 1669 */ 1670 @Deprecated 1671 public static final String STORE = "store"; 1672 1673 /** 1674 * The {@code mm-state} of the message. 1675 * <P>Type: INTEGER</P> 1676 * @deprecated this column is no longer supported. 1677 * @hide 1678 */ 1679 @Deprecated 1680 public static final String MM_STATE = "mm_st"; 1681 1682 /** 1683 * The {@code mm-flags-token} of the message. 1684 * <P>Type: INTEGER</P> 1685 * @deprecated this column is no longer supported. 1686 * @hide 1687 */ 1688 @Deprecated 1689 public static final String MM_FLAGS_TOKEN = "mm_flg_tok"; 1690 1691 /** 1692 * The {@code mm-flags} of the message. 1693 * <P>Type: TEXT</P> 1694 * @deprecated this column is no longer supported. 1695 * @hide 1696 */ 1697 @Deprecated 1698 public static final String MM_FLAGS = "mm_flg"; 1699 1700 /** 1701 * The {@code store-status} of the message. 1702 * <P>Type: TEXT</P> 1703 * @deprecated this column is no longer supported. 1704 * @hide 1705 */ 1706 @Deprecated 1707 public static final String STORE_STATUS = "store_st"; 1708 1709 /** 1710 * The {@code store-status-text} of the message. 1711 * <P>Type: TEXT</P> 1712 * @deprecated this column is no longer supported. 1713 * @hide 1714 */ 1715 @Deprecated 1716 public static final String STORE_STATUS_TEXT = "store_st_txt"; 1717 1718 /** 1719 * The {@code stored} of the message. 1720 * <P>Type: TEXT</P> 1721 * @deprecated this column is no longer supported. 1722 * @hide 1723 */ 1724 @Deprecated 1725 public static final String STORED = "stored"; 1726 1727 /** 1728 * The {@code totals} of the message. 1729 * <P>Type: TEXT</P> 1730 * @deprecated this column is no longer supported. 1731 * @hide 1732 */ 1733 @Deprecated 1734 public static final String TOTALS = "totals"; 1735 1736 /** 1737 * The {@code mbox-totals} of the message. 1738 * <P>Type: TEXT</P> 1739 * @deprecated this column is no longer supported. 1740 * @hide 1741 */ 1742 @Deprecated 1743 public static final String MBOX_TOTALS = "mb_t"; 1744 1745 /** 1746 * The {@code mbox-totals-token} of the message. 1747 * <P>Type: INTEGER</P> 1748 * @deprecated this column is no longer supported. 1749 * @hide 1750 */ 1751 @Deprecated 1752 public static final String MBOX_TOTALS_TOKEN = "mb_t_tok"; 1753 1754 /** 1755 * The {@code quotas} of the message. 1756 * <P>Type: TEXT</P> 1757 * @deprecated this column is no longer supported. 1758 * @hide 1759 */ 1760 @Deprecated 1761 public static final String QUOTAS = "qt"; 1762 1763 /** 1764 * The {@code mbox-quotas} of the message. 1765 * <P>Type: TEXT</P> 1766 * @deprecated this column is no longer supported. 1767 * @hide 1768 */ 1769 @Deprecated 1770 public static final String MBOX_QUOTAS = "mb_qt"; 1771 1772 /** 1773 * The {@code mbox-quotas-token} of the message. 1774 * <P>Type: INTEGER</P> 1775 * @deprecated this column is no longer supported. 1776 * @hide 1777 */ 1778 @Deprecated 1779 public static final String MBOX_QUOTAS_TOKEN = "mb_qt_tok"; 1780 1781 /** 1782 * The {@code message-count} of the message. 1783 * <P>Type: INTEGER</P> 1784 * @deprecated this column is no longer supported. 1785 * @hide 1786 */ 1787 @Deprecated 1788 public static final String MESSAGE_COUNT = "m_cnt"; 1789 1790 /** 1791 * The {@code start} of the message. 1792 * <P>Type: INTEGER</P> 1793 * @deprecated this column is no longer supported. 1794 * @hide 1795 */ 1796 @Deprecated 1797 public static final String START = "start"; 1798 1799 /** 1800 * The {@code distribution-indicator} of the message. 1801 * <P>Type: TEXT</P> 1802 * @deprecated this column is no longer supported. 1803 * @hide 1804 */ 1805 @Deprecated 1806 public static final String DISTRIBUTION_INDICATOR = "d_ind"; 1807 1808 /** 1809 * The {@code element-descriptor} of the message. 1810 * <P>Type: TEXT</P> 1811 * @deprecated this column is no longer supported. 1812 * @hide 1813 */ 1814 @Deprecated 1815 public static final String ELEMENT_DESCRIPTOR = "e_des"; 1816 1817 /** 1818 * The {@code limit} of the message. 1819 * <P>Type: INTEGER</P> 1820 * @deprecated this column is no longer supported. 1821 * @hide 1822 */ 1823 @Deprecated 1824 public static final String LIMIT = "limit"; 1825 1826 /** 1827 * The {@code recommended-retrieval-mode} of the message. 1828 * <P>Type: INTEGER</P> 1829 * @deprecated this column is no longer supported. 1830 * @hide 1831 */ 1832 @Deprecated 1833 public static final String RECOMMENDED_RETRIEVAL_MODE = "r_r_mod"; 1834 1835 /** 1836 * The {@code recommended-retrieval-mode-text} of the message. 1837 * <P>Type: TEXT</P> 1838 * @deprecated this column is no longer supported. 1839 * @hide 1840 */ 1841 @Deprecated 1842 public static final String RECOMMENDED_RETRIEVAL_MODE_TEXT = "r_r_mod_txt"; 1843 1844 /** 1845 * The {@code status-text} of the message. 1846 * <P>Type: TEXT</P> 1847 * @deprecated this column is no longer supported. 1848 * @hide 1849 */ 1850 @Deprecated 1851 public static final String STATUS_TEXT = "st_txt"; 1852 1853 /** 1854 * The {@code applic-id} of the message. 1855 * <P>Type: TEXT</P> 1856 * @deprecated this column is no longer supported. 1857 * @hide 1858 */ 1859 @Deprecated 1860 public static final String APPLIC_ID = "apl_id"; 1861 1862 /** 1863 * The {@code reply-applic-id} of the message. 1864 * <P>Type: TEXT</P> 1865 * @deprecated this column is no longer supported. 1866 * @hide 1867 */ 1868 @Deprecated 1869 public static final String REPLY_APPLIC_ID = "r_apl_id"; 1870 1871 /** 1872 * The {@code aux-applic-id} of the message. 1873 * <P>Type: TEXT</P> 1874 * @deprecated this column is no longer supported. 1875 * @hide 1876 */ 1877 @Deprecated 1878 public static final String AUX_APPLIC_ID = "aux_apl_id"; 1879 1880 /** 1881 * The {@code drm-content} of the message. 1882 * <P>Type: TEXT</P> 1883 * @deprecated this column is no longer supported. 1884 * @hide 1885 */ 1886 @Deprecated 1887 public static final String DRM_CONTENT = "drm_c"; 1888 1889 /** 1890 * The {@code adaptation-allowed} of the message. 1891 * <P>Type: TEXT</P> 1892 * @deprecated this column is no longer supported. 1893 * @hide 1894 */ 1895 @Deprecated 1896 public static final String ADAPTATION_ALLOWED = "adp_a"; 1897 1898 /** 1899 * The {@code replace-id} of the message. 1900 * <P>Type: TEXT</P> 1901 * @deprecated this column is no longer supported. 1902 * @hide 1903 */ 1904 @Deprecated 1905 public static final String REPLACE_ID = "repl_id"; 1906 1907 /** 1908 * The {@code cancel-id} of the message. 1909 * <P>Type: TEXT</P> 1910 * @deprecated this column is no longer supported. 1911 * @hide 1912 */ 1913 @Deprecated 1914 public static final String CANCEL_ID = "cl_id"; 1915 1916 /** 1917 * The {@code cancel-status} of the message. 1918 * <P>Type: INTEGER</P> 1919 * @deprecated this column is no longer supported. 1920 * @hide 1921 */ 1922 @Deprecated 1923 public static final String CANCEL_STATUS = "cl_st"; 1924 1925 /** 1926 * Is the message locked? 1927 * <P>Type: INTEGER (boolean)</P> 1928 */ 1929 public static final String LOCKED = "locked"; 1930 1931 /** 1932 * The subscription to which the message belongs to. Its value will be 1933 * < 0 if the sub id cannot be determined. 1934 * <p>Type: INTEGER (long)</p> 1935 */ 1936 public static final String SUBSCRIPTION_ID = "sub_id"; 1937 1938 /** 1939 * The identity of the sender of a sent message. It is 1940 * usually the package name of the app which sends the message. 1941 * <p class="note"><strong>Note:</strong> 1942 * This column is read-only. It is set by the provider and can not be changed by apps. 1943 * <p>Type: TEXT</p> 1944 */ 1945 public static final String CREATOR = "creator"; 1946 } 1947 1948 /** 1949 * Columns for the "canonical_addresses" table used by MMS and SMS. 1950 */ 1951 public interface CanonicalAddressesColumns extends BaseColumns { 1952 /** 1953 * An address used in MMS or SMS. Email addresses are 1954 * converted to lower case and are compared by string 1955 * equality. Other addresses are compared using 1956 * PHONE_NUMBERS_EQUAL. 1957 * <P>Type: TEXT</P> 1958 */ 1959 public static final String ADDRESS = "address"; 1960 } 1961 1962 /** 1963 * Columns for the "threads" table used by MMS and SMS. 1964 */ 1965 public interface ThreadsColumns extends BaseColumns { 1966 1967 /** 1968 * The date at which the thread was created. 1969 * <P>Type: INTEGER (long)</P> 1970 */ 1971 public static final String DATE = "date"; 1972 1973 /** 1974 * A string encoding of the recipient IDs of the recipients of 1975 * the message, in numerical order and separated by spaces. 1976 * <P>Type: TEXT</P> 1977 */ 1978 public static final String RECIPIENT_IDS = "recipient_ids"; 1979 1980 /** 1981 * The message count of the thread. 1982 * <P>Type: INTEGER</P> 1983 */ 1984 public static final String MESSAGE_COUNT = "message_count"; 1985 1986 /** 1987 * Indicates whether all messages of the thread have been read. 1988 * <P>Type: INTEGER</P> 1989 */ 1990 public static final String READ = "read"; 1991 1992 /** 1993 * The snippet of the latest message in the thread. 1994 * <P>Type: TEXT</P> 1995 */ 1996 public static final String SNIPPET = "snippet"; 1997 1998 /** 1999 * The charset of the snippet. 2000 * <P>Type: INTEGER</P> 2001 */ 2002 public static final String SNIPPET_CHARSET = "snippet_cs"; 2003 2004 /** 2005 * Type of the thread, either {@link Threads#COMMON_THREAD} or 2006 * {@link Threads#BROADCAST_THREAD}. 2007 * <P>Type: INTEGER</P> 2008 */ 2009 public static final String TYPE = "type"; 2010 2011 /** 2012 * Indicates whether there is a transmission error in the thread. 2013 * <P>Type: INTEGER</P> 2014 */ 2015 public static final String ERROR = "error"; 2016 2017 /** 2018 * Indicates whether this thread contains any attachments. 2019 * <P>Type: INTEGER</P> 2020 */ 2021 public static final String HAS_ATTACHMENT = "has_attachment"; 2022 2023 /** 2024 * If the thread is archived 2025 * <P>Type: INTEGER (boolean)</P> 2026 */ 2027 public static final String ARCHIVED = "archived"; 2028 } 2029 2030 /** 2031 * Helper functions for the "threads" table used by MMS and SMS. 2032 * 2033 * Thread IDs are determined by the participants in a conversation and can be used to match 2034 * both SMS and MMS messages. 2035 * 2036 * To avoid issues where applications might cache a thread ID, the thread ID of a deleted thread 2037 * must not be reused to point at a new thread. 2038 */ 2039 public static final class Threads implements ThreadsColumns { 2040 2041 @UnsupportedAppUsage 2042 private static final String[] ID_PROJECTION = { BaseColumns._ID }; 2043 2044 /** 2045 * Private {@code content://} style URL for this table. Used by 2046 * {@link #getOrCreateThreadId(android.content.Context, java.util.Set)}. 2047 */ 2048 @UnsupportedAppUsage 2049 private static final Uri THREAD_ID_CONTENT_URI = Uri.parse( 2050 "content://mms-sms/threadID"); 2051 2052 /** 2053 * The {@code content://} style URL for this table, by conversation. 2054 */ 2055 public static final Uri CONTENT_URI = Uri.withAppendedPath( 2056 MmsSms.CONTENT_URI, "conversations"); 2057 2058 /** 2059 * The {@code content://} style URL for this table, for obsolete threads. 2060 */ 2061 public static final Uri OBSOLETE_THREADS_URI = Uri.withAppendedPath( 2062 CONTENT_URI, "obsolete"); 2063 2064 /** Thread type: common thread. */ 2065 public static final int COMMON_THREAD = 0; 2066 2067 /** Thread type: broadcast thread. */ 2068 public static final int BROADCAST_THREAD = 1; 2069 2070 /** 2071 * Not instantiable. 2072 * @hide 2073 */ 2074 private Threads() { 2075 } 2076 2077 /** 2078 * This is a single-recipient version of {@code getOrCreateThreadId}. 2079 * It's convenient for use with SMS messages. 2080 * @param context the context object to use. 2081 * @param recipient the recipient to send to. 2082 */ 2083 public static long getOrCreateThreadId(Context context, String recipient) { 2084 Set<String> recipients = new HashSet<String>(); 2085 2086 recipients.add(recipient); 2087 return getOrCreateThreadId(context, recipients); 2088 } 2089 2090 /** 2091 * Given a set of recipients return its thread ID. 2092 * <p> 2093 * If a thread exists containing the provided participants, return its thread ID. Otherwise, 2094 * this will create a new thread containing the provided participants and return its ID. 2095 */ 2096 public static long getOrCreateThreadId( 2097 Context context, Set<String> recipients) { 2098 Uri.Builder uriBuilder = THREAD_ID_CONTENT_URI.buildUpon(); 2099 2100 for (String recipient : recipients) { 2101 if (Mms.isEmailAddress(recipient)) { 2102 recipient = Mms.extractAddrSpec(recipient); 2103 } 2104 2105 uriBuilder.appendQueryParameter("recipient", recipient); 2106 } 2107 2108 Uri uri = uriBuilder.build(); 2109 //if (DEBUG) Rlog.v(TAG, "getOrCreateThreadId uri: " + uri); 2110 2111 Cursor cursor = SqliteWrapper.query(context, context.getContentResolver(), 2112 uri, ID_PROJECTION, null, null, null); 2113 if (cursor != null) { 2114 try { 2115 if (cursor.moveToFirst()) { 2116 return cursor.getLong(0); 2117 } else { 2118 Rlog.e(TAG, "getOrCreateThreadId returned no rows!"); 2119 } 2120 } finally { 2121 cursor.close(); 2122 } 2123 } 2124 2125 Rlog.e(TAG, "getOrCreateThreadId failed with " + recipients.size() + " recipients"); 2126 throw new IllegalArgumentException("Unable to find or allocate a thread ID."); 2127 } 2128 } 2129 2130 /** 2131 * Columns for the "rcs_*" tables used by {@link android.telephony.ims.RcsMessageStore} classes. 2132 * 2133 * @hide - not meant for public use 2134 */ 2135 public interface RcsColumns { 2136 // TODO(sahinc): Turn this to true once the schema finalizes, so that people can update 2137 // their messaging databases. NOTE: move the switch/case update in MmsSmsDatabaseHelper to 2138 // the latest version of the database before turning this flag to true. 2139 boolean IS_RCS_TABLE_SCHEMA_CODE_COMPLETE = false; 2140 2141 /** 2142 * The authority for the content provider 2143 */ 2144 String AUTHORITY = "rcs"; 2145 2146 /** 2147 * The URI to start building upon to use {@link com.android.providers.telephony.RcsProvider} 2148 */ 2149 Uri CONTENT_AND_AUTHORITY = Uri.parse("content://" + AUTHORITY); 2150 2151 /** 2152 * The value to be used whenever a transaction that expects an integer to be returned 2153 * failed. 2154 */ 2155 int TRANSACTION_FAILED = Integer.MIN_VALUE; 2156 2157 /** 2158 * The value that denotes a timestamp was not set before (e.g. a message that is not 2159 * delivered yet will not have a DELIVERED_TIMESTAMP) 2160 */ 2161 long TIMESTAMP_NOT_SET = 0; 2162 2163 /** 2164 * The table that {@link android.telephony.ims.RcsThread} gets persisted to 2165 */ 2166 interface RcsThreadColumns { 2167 /** 2168 * The path that should be used for referring to 2169 * {@link android.telephony.ims.RcsThread}s in 2170 * {@link com.android.providers.telephony.RcsProvider} URIs. 2171 */ 2172 String RCS_THREAD_URI_PART = "thread"; 2173 2174 /** 2175 * The URI to query or modify {@link android.telephony.ims.RcsThread} via the content 2176 * provider. 2177 */ 2178 Uri RCS_THREAD_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY, RCS_THREAD_URI_PART); 2179 2180 /** 2181 * The unique identifier of an {@link android.telephony.ims.RcsThread} 2182 */ 2183 String RCS_THREAD_ID_COLUMN = "rcs_thread_id"; 2184 } 2185 2186 /** 2187 * The table that {@link android.telephony.ims.Rcs1To1Thread} gets persisted to 2188 */ 2189 interface Rcs1To1ThreadColumns extends RcsThreadColumns { 2190 /** 2191 * The path that should be used for referring to 2192 * {@link android.telephony.ims.Rcs1To1Thread}s in 2193 * {@link com.android.providers.telephony.RcsProvider} URIs. 2194 */ 2195 String RCS_1_TO_1_THREAD_URI_PART = "p2p_thread"; 2196 2197 /** 2198 * The URI to query or modify {@link android.telephony.ims.Rcs1To1Thread}s via the 2199 * content provider. Can also insert to this URI to create a new 1-to-1 thread. When 2200 * performing an insert, ensure that the provided content values contain the other 2201 * participant's ID under the key 2202 * {@link RcsParticipantColumns.RCS_PARTICIPANT_ID_COLUMN} 2203 */ 2204 Uri RCS_1_TO_1_THREAD_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY, 2205 RCS_1_TO_1_THREAD_URI_PART); 2206 2207 /** 2208 * The SMS/MMS thread to fallback to in case of an RCS outage 2209 */ 2210 String FALLBACK_THREAD_ID_COLUMN = "rcs_fallback_thread_id"; 2211 } 2212 2213 /** 2214 * The table that {@link android.telephony.ims.RcsGroupThread} gets persisted to 2215 */ 2216 interface RcsGroupThreadColumns extends RcsThreadColumns { 2217 /** 2218 * The path that should be used for referring to 2219 * {@link android.telephony.ims.RcsGroupThread}s in 2220 * {@link com.android.providers.telephony.RcsProvider} URIs. 2221 */ 2222 String RCS_GROUP_THREAD_URI_PART = "group_thread"; 2223 2224 /** 2225 * The URI to query or modify {@link android.telephony.ims.RcsGroupThread}s via the 2226 * content provider 2227 */ 2228 Uri RCS_GROUP_THREAD_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY, 2229 RCS_GROUP_THREAD_URI_PART); 2230 2231 /** 2232 * The owner/admin of the {@link android.telephony.ims.RcsGroupThread} 2233 */ 2234 String OWNER_PARTICIPANT_COLUMN = "owner_participant"; 2235 2236 /** 2237 * The user visible name of the group 2238 */ 2239 String GROUP_NAME_COLUMN = "group_name"; 2240 2241 /** 2242 * The user visible icon of the group 2243 */ 2244 String GROUP_ICON_COLUMN = "group_icon"; 2245 2246 /** 2247 * The RCS conference URI for this group 2248 */ 2249 String CONFERENCE_URI_COLUMN = "conference_uri"; 2250 } 2251 2252 /** 2253 * The view that enables polling from all types of RCS threads at once 2254 */ 2255 interface RcsUnifiedThreadColumns extends RcsThreadColumns, Rcs1To1ThreadColumns, 2256 RcsGroupThreadColumns { 2257 /** 2258 * The type of this {@link android.telephony.ims.RcsThread} 2259 */ 2260 String THREAD_TYPE_COLUMN = "thread_type"; 2261 2262 /** 2263 * Integer returned as a result from a database query that denotes the thread is 1 to 1 2264 */ 2265 int THREAD_TYPE_1_TO_1 = 0; 2266 2267 /** 2268 * Integer returned as a result from a database query that denotes the thread is 1 to 1 2269 */ 2270 int THREAD_TYPE_GROUP = 1; 2271 } 2272 2273 /** 2274 * The table that {@link android.telephony.ims.RcsParticipant} gets persisted to 2275 */ 2276 interface RcsParticipantColumns { 2277 /** 2278 * The path that should be used for referring to 2279 * {@link android.telephony.ims.RcsParticipant}s in 2280 * {@link com.android.providers.telephony.RcsProvider} URIs. 2281 */ 2282 String RCS_PARTICIPANT_URI_PART = "participant"; 2283 2284 /** 2285 * The URI to query or modify {@link android.telephony.ims.RcsParticipant}s via the 2286 * content provider 2287 */ 2288 Uri RCS_PARTICIPANT_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY, 2289 RCS_PARTICIPANT_URI_PART); 2290 2291 /** 2292 * The unique identifier of the entry in the database 2293 */ 2294 String RCS_PARTICIPANT_ID_COLUMN = "rcs_participant_id"; 2295 2296 /** 2297 * A foreign key on canonical_address table, also used by SMS/MMS 2298 */ 2299 String CANONICAL_ADDRESS_ID_COLUMN = "canonical_address_id"; 2300 2301 /** 2302 * The user visible RCS alias for this participant. 2303 */ 2304 String RCS_ALIAS_COLUMN = "rcs_alias"; 2305 } 2306 2307 /** 2308 * Additional constants to enable access to {@link android.telephony.ims.RcsParticipant} 2309 * related data 2310 */ 2311 interface RcsParticipantHelpers extends RcsParticipantColumns { 2312 /** 2313 * The view that unifies "rcs_participant" and "canonical_addresses" tables for easy 2314 * access to participant address. 2315 */ 2316 String RCS_PARTICIPANT_WITH_ADDRESS_VIEW = "rcs_participant_with_address_view"; 2317 2318 /** 2319 * The view that unifies "rcs_participant", "canonical_addresses" and 2320 * "rcs_thread_participant" junction table to get full information on participants that 2321 * contribute to threads. 2322 */ 2323 String RCS_PARTICIPANT_WITH_THREAD_VIEW = "rcs_participant_with_thread_view"; 2324 } 2325 2326 /** 2327 * The table that {@link android.telephony.ims.RcsMessage} gets persisted to 2328 */ 2329 interface RcsMessageColumns { 2330 /** 2331 * Denotes the type of this message (i.e. 2332 * {@link android.telephony.ims.RcsIncomingMessage} or 2333 * {@link android.telephony.ims.RcsOutgoingMessage} 2334 */ 2335 String MESSAGE_TYPE_COLUMN = "rcs_message_type"; 2336 2337 /** 2338 * The unique identifier for the message in the database - i.e. the primary key. 2339 */ 2340 String MESSAGE_ID_COLUMN = "rcs_message_row_id"; 2341 2342 /** 2343 * The globally unique RCS identifier for the message. Please see 4.4.5.2 - GSMA 2344 * RCC.53 (RCS Device API 1.6 Specification) 2345 */ 2346 String GLOBAL_ID_COLUMN = "rcs_message_global_id"; 2347 2348 /** 2349 * The subscription where this message was sent from/to. 2350 */ 2351 String SUB_ID_COLUMN = "sub_id"; 2352 2353 /** 2354 * The sending status of the message. 2355 * @see android.telephony.ims.RcsMessage.RcsMessageStatus 2356 */ 2357 String STATUS_COLUMN = "status"; 2358 2359 /** 2360 * The creation timestamp of the message. 2361 */ 2362 String ORIGINATION_TIMESTAMP_COLUMN = "origination_timestamp"; 2363 2364 /** 2365 * The text content of the message. 2366 */ 2367 String MESSAGE_TEXT_COLUMN = "rcs_text"; 2368 2369 /** 2370 * The latitude content of the message, if it contains a location. 2371 */ 2372 String LATITUDE_COLUMN = "latitude"; 2373 2374 /** 2375 * The longitude content of the message, if it contains a location. 2376 */ 2377 String LONGITUDE_COLUMN = "longitude"; 2378 } 2379 2380 /** 2381 * The table that additional information of {@link android.telephony.ims.RcsIncomingMessage} 2382 * gets persisted to. 2383 */ 2384 interface RcsIncomingMessageColumns extends RcsMessageColumns { 2385 /** 2386 The path that should be used for referring to 2387 * {@link android.telephony.ims.RcsIncomingMessage}s in 2388 * {@link com.android.providers.telephony.RcsProvider} URIs. 2389 */ 2390 String INCOMING_MESSAGE_URI_PART = "incoming_message"; 2391 2392 /** 2393 * The URI to query incoming messages through 2394 * {@link com.android.providers.telephony.RcsProvider} 2395 */ 2396 Uri INCOMING_MESSAGE_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY, 2397 INCOMING_MESSAGE_URI_PART); 2398 2399 /** 2400 * The ID of the {@link android.telephony.ims.RcsParticipant} that sent this message 2401 */ 2402 String SENDER_PARTICIPANT_ID_COLUMN = "sender_participant"; 2403 2404 /** 2405 * The timestamp of arrival for this message. 2406 */ 2407 String ARRIVAL_TIMESTAMP_COLUMN = "arrival_timestamp"; 2408 2409 /** 2410 * The time when the recipient has read this message. 2411 */ 2412 String SEEN_TIMESTAMP_COLUMN = "seen_timestamp"; 2413 } 2414 2415 /** 2416 * The table that additional information of {@link android.telephony.ims.RcsOutgoingMessage} 2417 * gets persisted to. 2418 */ 2419 interface RcsOutgoingMessageColumns extends RcsMessageColumns { 2420 /** 2421 * The path that should be used for referring to 2422 * {@link android.telephony.ims.RcsOutgoingMessage}s in 2423 * {@link com.android.providers.telephony.RcsProvider} URIs. 2424 */ 2425 String OUTGOING_MESSAGE_URI_PART = "outgoing_message"; 2426 2427 /** 2428 * The URI to query or modify {@link android.telephony.ims.RcsOutgoingMessage}s via the 2429 * content provider 2430 */ 2431 Uri OUTGOING_MESSAGE_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY, 2432 OUTGOING_MESSAGE_URI_PART); 2433 } 2434 2435 /** 2436 * The delivery information of an {@link android.telephony.ims.RcsOutgoingMessage} 2437 */ 2438 interface RcsMessageDeliveryColumns extends RcsOutgoingMessageColumns { 2439 /** 2440 * The path that should be used for referring to 2441 * {@link android.telephony.ims.RcsOutgoingMessageDelivery}s in 2442 * {@link com.android.providers.telephony.RcsProvider} URIs. 2443 */ 2444 String DELIVERY_URI_PART = "delivery"; 2445 2446 /** 2447 * The timestamp of delivery of this message. 2448 */ 2449 String DELIVERED_TIMESTAMP_COLUMN = "delivered_timestamp"; 2450 2451 /** 2452 * The time when the recipient has read this message. 2453 */ 2454 String SEEN_TIMESTAMP_COLUMN = "seen_timestamp"; 2455 } 2456 2457 /** 2458 * The views that allow querying {@link android.telephony.ims.RcsIncomingMessage} and 2459 * {@link android.telephony.ims.RcsOutgoingMessage} at the same time. 2460 */ 2461 interface RcsUnifiedMessageColumns extends RcsIncomingMessageColumns, 2462 RcsOutgoingMessageColumns { 2463 /** 2464 * The path that is used to query all {@link android.telephony.ims.RcsMessage} in 2465 * {@link com.android.providers.telephony.RcsProvider} URIs. 2466 */ 2467 String UNIFIED_MESSAGE_URI_PART = "message"; 2468 2469 /** 2470 * The URI to query all types of {@link android.telephony.ims.RcsMessage}s 2471 */ 2472 Uri UNIFIED_MESSAGE_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY, 2473 UNIFIED_MESSAGE_URI_PART); 2474 2475 /** 2476 * The name of the view that unites rcs_message and rcs_incoming_message tables. 2477 */ 2478 String UNIFIED_INCOMING_MESSAGE_VIEW = "unified_incoming_message_view"; 2479 2480 /** 2481 * The name of the view that unites rcs_message and rcs_outgoing_message tables. 2482 */ 2483 String UNIFIED_OUTGOING_MESSAGE_VIEW = "unified_outgoing_message_view"; 2484 2485 /** 2486 * The column that shows from which table the message entry came from. 2487 */ 2488 String MESSAGE_TYPE_COLUMN = "message_type"; 2489 2490 /** 2491 * Integer returned as a result from a database query that denotes that the message is 2492 * an incoming message 2493 */ 2494 int MESSAGE_TYPE_INCOMING = 1; 2495 2496 /** 2497 * Integer returned as a result from a database query that denotes that the message is 2498 * an outgoing message 2499 */ 2500 int MESSAGE_TYPE_OUTGOING = 0; 2501 } 2502 2503 /** 2504 * The table that {@link android.telephony.ims.RcsFileTransferPart} gets persisted to. 2505 */ 2506 interface RcsFileTransferColumns { 2507 /** 2508 * The path that should be used for referring to 2509 * {@link android.telephony.ims.RcsFileTransferPart}s in 2510 * {@link com.android.providers.telephony.RcsProvider} URIs. 2511 */ 2512 String FILE_TRANSFER_URI_PART = "file_transfer"; 2513 2514 /** 2515 * The URI to query or modify {@link android.telephony.ims.RcsFileTransferPart}s via the 2516 * content provider 2517 */ 2518 Uri FILE_TRANSFER_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY, 2519 FILE_TRANSFER_URI_PART); 2520 2521 /** 2522 * The globally unique file transfer ID for this RCS file transfer. 2523 */ 2524 String FILE_TRANSFER_ID_COLUMN = "rcs_file_transfer_id"; 2525 2526 /** 2527 * The RCS session ID for this file transfer. The ID is implementation dependent but 2528 * should be unique. 2529 */ 2530 String SESSION_ID_COLUMN = "session_id"; 2531 2532 /** 2533 * The URI that points to the content of this file transfer 2534 */ 2535 String CONTENT_URI_COLUMN = "content_uri"; 2536 2537 /** 2538 * The file type of this file transfer in bytes. The validity of types is not enforced 2539 * in {@link android.telephony.ims.RcsMessageStore} APIs. 2540 */ 2541 String CONTENT_TYPE_COLUMN = "content_type"; 2542 2543 /** 2544 * The size of the file transfer in bytes. 2545 */ 2546 String FILE_SIZE_COLUMN = "file_size"; 2547 2548 /** 2549 * Number of bytes that was successfully transmitted for this file transfer 2550 */ 2551 String SUCCESSFULLY_TRANSFERRED_BYTES = "transfer_offset"; 2552 2553 /** 2554 * The status of this file transfer 2555 * @see android.telephony.ims.RcsFileTransferPart.RcsFileTransferStatus 2556 */ 2557 String TRANSFER_STATUS_COLUMN = "transfer_status"; 2558 2559 /** 2560 * The on-screen width of the file transfer, if it contains multi-media 2561 */ 2562 String WIDTH_COLUMN = "width"; 2563 2564 /** 2565 * The on-screen height of the file transfer, if it contains multi-media 2566 */ 2567 String HEIGHT_COLUMN = "height"; 2568 2569 /** 2570 * The duration of the content in milliseconds if this file transfer contains 2571 * multi-media 2572 */ 2573 String DURATION_MILLIS_COLUMN = "duration"; 2574 2575 /** 2576 * The URI to the preview of the content of this file transfer 2577 */ 2578 String PREVIEW_URI_COLUMN = "preview_uri"; 2579 2580 /** 2581 * The type of the preview of the content of this file transfer. The validity of types 2582 * is not enforced in {@link android.telephony.ims.RcsMessageStore} APIs. 2583 */ 2584 String PREVIEW_TYPE_COLUMN = "preview_type"; 2585 } 2586 2587 /** 2588 * The table that holds the information for 2589 * {@link android.telephony.ims.RcsGroupThreadEvent} and its subclasses. 2590 */ 2591 interface RcsThreadEventColumns { 2592 /** 2593 * The string used in the {@link com.android.providers.telephony.RcsProvider} URI to 2594 * refer to participant joined events (example URI: 2595 * {@code content://rcs/group_thread/3/participant_joined_event}) 2596 */ 2597 String PARTICIPANT_JOINED_URI_PART = "participant_joined_event"; 2598 2599 /** 2600 * The string used in the {@link com.android.providers.telephony.RcsProvider} URI to 2601 * refer to participant left events. (example URI: 2602 * {@code content://rcs/group_thread/3/participant_left_event/4}) 2603 */ 2604 String PARTICIPANT_LEFT_URI_PART = "participant_left_event"; 2605 2606 /** 2607 * The string used in the {@link com.android.providers.telephony.RcsProvider} URI to 2608 * refer to name changed events. (example URI: 2609 * {@code content://rcs/group_thread/3/name_changed_event}) 2610 */ 2611 String NAME_CHANGED_URI_PART = "name_changed_event"; 2612 2613 /** 2614 * The string used in the {@link com.android.providers.telephony.RcsProvider} URI to 2615 * refer to icon changed events. (example URI: 2616 * {@code content://rcs/group_thread/3/icon_changed_event}) 2617 */ 2618 String ICON_CHANGED_URI_PART = "icon_changed_event"; 2619 2620 /** 2621 * The unique ID of this event in the database, i.e. the primary key 2622 */ 2623 String EVENT_ID_COLUMN = "event_id"; 2624 2625 /** 2626 * The type of this event 2627 * 2628 * @see RcsEventTypes 2629 */ 2630 String EVENT_TYPE_COLUMN = "event_type"; 2631 2632 /** 2633 * The timestamp in milliseconds of when this event happened 2634 */ 2635 String TIMESTAMP_COLUMN = "origination_timestamp"; 2636 2637 /** 2638 * The participant that generated this event 2639 */ 2640 String SOURCE_PARTICIPANT_ID_COLUMN = "source_participant"; 2641 2642 /** 2643 * The receiving participant of this event if this was an 2644 * {@link android.telephony.ims.RcsGroupThreadParticipantJoinedEvent} or 2645 * {@link android.telephony.ims.RcsGroupThreadParticipantLeftEvent} 2646 */ 2647 String DESTINATION_PARTICIPANT_ID_COLUMN = "destination_participant"; 2648 2649 /** 2650 * The URI for the new icon of the group thread if this was an 2651 * {@link android.telephony.ims.RcsGroupThreadIconChangedEvent} 2652 */ 2653 String NEW_ICON_URI_COLUMN = "new_icon_uri"; 2654 2655 /** 2656 * The URI for the new name of the group thread if this was an 2657 * {@link android.telephony.ims.RcsGroupThreadNameChangedEvent} 2658 */ 2659 String NEW_NAME_COLUMN = "new_name"; 2660 } 2661 2662 /** 2663 * The table that {@link android.telephony.ims.RcsParticipantAliasChangedEvent} gets 2664 * persisted to 2665 */ 2666 interface RcsParticipantEventColumns { 2667 /** 2668 * The path that should be used for referring to 2669 * {@link android.telephony.ims.RcsParticipantAliasChangedEvent}s in 2670 * {@link com.android.providers.telephony.RcsProvider} URIs. 2671 */ 2672 String ALIAS_CHANGE_EVENT_URI_PART = "alias_change_event"; 2673 2674 /** 2675 * The new alias of the participant 2676 */ 2677 String NEW_ALIAS_COLUMN = "new_alias"; 2678 } 2679 2680 /** 2681 * These values are used in {@link com.android.providers.telephony.RcsProvider} to determine 2682 * what kind of event is present in the storage. 2683 */ 2684 interface RcsEventTypes { 2685 /** 2686 * Integer constant that is stored in the 2687 * {@link com.android.providers.telephony.RcsProvider} database that denotes the event 2688 * is of type {@link android.telephony.ims.RcsParticipantAliasChangedEvent} 2689 */ 2690 int PARTICIPANT_ALIAS_CHANGED_EVENT_TYPE = 1; 2691 2692 /** 2693 * Integer constant that is stored in the 2694 * {@link com.android.providers.telephony.RcsProvider} database that denotes the event 2695 * is of type {@link android.telephony.ims.RcsGroupThreadParticipantJoinedEvent} 2696 */ 2697 int PARTICIPANT_JOINED_EVENT_TYPE = 2; 2698 2699 /** 2700 * Integer constant that is stored in the 2701 * {@link com.android.providers.telephony.RcsProvider} database that denotes the event 2702 * is of type {@link android.telephony.ims.RcsGroupThreadParticipantLeftEvent} 2703 */ 2704 int PARTICIPANT_LEFT_EVENT_TYPE = 4; 2705 2706 /** 2707 * Integer constant that is stored in the 2708 * {@link com.android.providers.telephony.RcsProvider} database that denotes the event 2709 * is of type {@link android.telephony.ims.RcsGroupThreadIconChangedEvent} 2710 */ 2711 int ICON_CHANGED_EVENT_TYPE = 8; 2712 2713 /** 2714 * Integer constant that is stored in the 2715 * {@link com.android.providers.telephony.RcsProvider} database that denotes the event 2716 * is of type {@link android.telephony.ims.RcsGroupThreadNameChangedEvent} 2717 */ 2718 int NAME_CHANGED_EVENT_TYPE = 16; 2719 } 2720 2721 /** 2722 * The view that allows unified querying across all events 2723 */ 2724 interface RcsUnifiedEventHelper extends RcsParticipantEventColumns, RcsThreadEventColumns { 2725 /** 2726 * The path that should be used for referring to 2727 * {@link android.telephony.ims.RcsEvent}s in 2728 * {@link com.android.providers.telephony.RcsProvider} URIs. 2729 */ 2730 String RCS_EVENT_QUERY_URI_PATH = "event"; 2731 2732 /** 2733 * The URI to query {@link android.telephony.ims.RcsEvent}s via the content provider. 2734 */ 2735 Uri RCS_EVENT_QUERY_URI = Uri.withAppendedPath(CONTENT_AND_AUTHORITY, 2736 RCS_EVENT_QUERY_URI_PATH); 2737 } 2738 2739 /** 2740 * Allows RCS specific canonical address handling. 2741 */ 2742 interface RcsCanonicalAddressHelper { 2743 /** 2744 * Returns the canonical address ID for a canonical address, if now row exists, this 2745 * will add a row and return its ID. This helper works against the same table used by 2746 * the SMS and MMS threads, but is accessible only by the phone process for use by RCS 2747 * message storage. 2748 * 2749 * @throws IllegalArgumentException if unable to retrieve or create the canonical 2750 * address entry. 2751 */ 2752 static long getOrCreateCanonicalAddressId( 2753 ContentResolver contentResolver, String canonicalAddress) { 2754 2755 Uri.Builder uriBuilder = CONTENT_AND_AUTHORITY.buildUpon(); 2756 uriBuilder.appendPath("canonical-address"); 2757 uriBuilder.appendQueryParameter("address", canonicalAddress); 2758 Uri uri = uriBuilder.build(); 2759 2760 try (Cursor cursor = contentResolver.query(uri, null, null, null)) { 2761 if (cursor != null && cursor.moveToFirst()) { 2762 return cursor.getLong(cursor.getColumnIndex(CanonicalAddressesColumns._ID)); 2763 } else { 2764 Rlog.e(TAG, "getOrCreateCanonicalAddressId returned no rows"); 2765 } 2766 } 2767 2768 Rlog.e(TAG, "getOrCreateCanonicalAddressId failed"); 2769 throw new IllegalArgumentException( 2770 "Unable to find or allocate a canonical address ID"); 2771 } 2772 } 2773 } 2774 2775 /** 2776 * Contains all MMS messages. 2777 */ 2778 public static final class Mms implements BaseMmsColumns { 2779 2780 /** 2781 * Not instantiable. 2782 * @hide 2783 */ 2784 private Mms() { 2785 } 2786 2787 /** 2788 * The {@code content://} URI for this table. 2789 */ 2790 public static final Uri CONTENT_URI = Uri.parse("content://mms"); 2791 2792 /** 2793 * Content URI for getting MMS report requests. 2794 */ 2795 public static final Uri REPORT_REQUEST_URI = Uri.withAppendedPath( 2796 CONTENT_URI, "report-request"); 2797 2798 /** 2799 * Content URI for getting MMS report status. 2800 */ 2801 public static final Uri REPORT_STATUS_URI = Uri.withAppendedPath( 2802 CONTENT_URI, "report-status"); 2803 2804 /** 2805 * The default sort order for this table. 2806 */ 2807 public static final String DEFAULT_SORT_ORDER = "date DESC"; 2808 2809 /** 2810 * Regex pattern for names and email addresses. 2811 * <ul> 2812 * <li><em>mailbox</em> = {@code name-addr}</li> 2813 * <li><em>name-addr</em> = {@code [display-name] angle-addr}</li> 2814 * <li><em>angle-addr</em> = {@code [CFWS] "<" addr-spec ">" [CFWS]}</li> 2815 * </ul> 2816 * @hide 2817 */ 2818 @UnsupportedAppUsage 2819 public static final Pattern NAME_ADDR_EMAIL_PATTERN = 2820 Pattern.compile("\\s*(\"[^\"]*\"|[^<>\"]+)\\s*<([^<>]+)>\\s*"); 2821 2822 /** 2823 * Helper method to query this table. 2824 * @hide 2825 */ 2826 public static Cursor query( 2827 ContentResolver cr, String[] projection) { 2828 return cr.query(CONTENT_URI, projection, null, null, DEFAULT_SORT_ORDER); 2829 } 2830 2831 /** 2832 * Helper method to query this table. 2833 * @hide 2834 */ 2835 public static Cursor query( 2836 ContentResolver cr, String[] projection, 2837 String where, String orderBy) { 2838 return cr.query(CONTENT_URI, projection, 2839 where, null, orderBy == null ? DEFAULT_SORT_ORDER : orderBy); 2840 } 2841 2842 /** 2843 * Helper method to extract email address from address string. 2844 * @hide 2845 */ 2846 @UnsupportedAppUsage 2847 public static String extractAddrSpec(String address) { 2848 Matcher match = NAME_ADDR_EMAIL_PATTERN.matcher(address); 2849 2850 if (match.matches()) { 2851 return match.group(2); 2852 } 2853 return address; 2854 } 2855 2856 /** 2857 * Is the specified address an email address? 2858 * 2859 * @param address the input address to test 2860 * @return true if address is an email address; false otherwise. 2861 * @hide 2862 */ 2863 @UnsupportedAppUsage 2864 public static boolean isEmailAddress(String address) { 2865 if (TextUtils.isEmpty(address)) { 2866 return false; 2867 } 2868 2869 String s = extractAddrSpec(address); 2870 Matcher match = Patterns.EMAIL_ADDRESS.matcher(s); 2871 return match.matches(); 2872 } 2873 2874 /** 2875 * Is the specified number a phone number? 2876 * 2877 * @param number the input number to test 2878 * @return true if number is a phone number; false otherwise. 2879 * @hide 2880 */ 2881 @UnsupportedAppUsage 2882 public static boolean isPhoneNumber(String number) { 2883 if (TextUtils.isEmpty(number)) { 2884 return false; 2885 } 2886 2887 Matcher match = Patterns.PHONE.matcher(number); 2888 return match.matches(); 2889 } 2890 2891 /** 2892 * Contains all MMS messages in the MMS app inbox. 2893 */ 2894 public static final class Inbox implements BaseMmsColumns { 2895 2896 /** 2897 * Not instantiable. 2898 * @hide 2899 */ 2900 private Inbox() { 2901 } 2902 2903 /** 2904 * The {@code content://} style URL for this table. 2905 */ 2906 public static final Uri 2907 CONTENT_URI = Uri.parse("content://mms/inbox"); 2908 2909 /** 2910 * The default sort order for this table. 2911 */ 2912 public static final String DEFAULT_SORT_ORDER = "date DESC"; 2913 } 2914 2915 /** 2916 * Contains all MMS messages in the MMS app sent folder. 2917 */ 2918 public static final class Sent implements BaseMmsColumns { 2919 2920 /** 2921 * Not instantiable. 2922 * @hide 2923 */ 2924 private Sent() { 2925 } 2926 2927 /** 2928 * The {@code content://} style URL for this table. 2929 */ 2930 public static final Uri 2931 CONTENT_URI = Uri.parse("content://mms/sent"); 2932 2933 /** 2934 * The default sort order for this table. 2935 */ 2936 public static final String DEFAULT_SORT_ORDER = "date DESC"; 2937 } 2938 2939 /** 2940 * Contains all MMS messages in the MMS app drafts folder. 2941 */ 2942 public static final class Draft implements BaseMmsColumns { 2943 2944 /** 2945 * Not instantiable. 2946 * @hide 2947 */ 2948 private Draft() { 2949 } 2950 2951 /** 2952 * The {@code content://} style URL for this table. 2953 */ 2954 public static final Uri 2955 CONTENT_URI = Uri.parse("content://mms/drafts"); 2956 2957 /** 2958 * The default sort order for this table. 2959 */ 2960 public static final String DEFAULT_SORT_ORDER = "date DESC"; 2961 } 2962 2963 /** 2964 * Contains all MMS messages in the MMS app outbox. 2965 */ 2966 public static final class Outbox implements BaseMmsColumns { 2967 2968 /** 2969 * Not instantiable. 2970 * @hide 2971 */ 2972 private Outbox() { 2973 } 2974 2975 /** 2976 * The {@code content://} style URL for this table. 2977 */ 2978 public static final Uri 2979 CONTENT_URI = Uri.parse("content://mms/outbox"); 2980 2981 /** 2982 * The default sort order for this table. 2983 */ 2984 public static final String DEFAULT_SORT_ORDER = "date DESC"; 2985 } 2986 2987 /** 2988 * Contains address information for an MMS message. 2989 */ 2990 public static final class Addr implements BaseColumns { 2991 2992 /** 2993 * Not instantiable. 2994 * @hide 2995 */ 2996 private Addr() { 2997 } 2998 2999 /** 3000 * The ID of MM which this address entry belongs to. 3001 * <P>Type: INTEGER (long)</P> 3002 */ 3003 public static final String MSG_ID = "msg_id"; 3004 3005 /** 3006 * The ID of contact entry in Phone Book. 3007 * <P>Type: INTEGER (long)</P> 3008 */ 3009 public static final String CONTACT_ID = "contact_id"; 3010 3011 /** 3012 * The address text. 3013 * <P>Type: TEXT</P> 3014 */ 3015 public static final String ADDRESS = "address"; 3016 3017 /** 3018 * Type of address: must be one of {@code PduHeaders.BCC}, 3019 * {@code PduHeaders.CC}, {@code PduHeaders.FROM}, {@code PduHeaders.TO}. 3020 * <P>Type: INTEGER</P> 3021 */ 3022 public static final String TYPE = "type"; 3023 3024 /** 3025 * Character set of this entry (MMS charset value). 3026 * <P>Type: INTEGER</P> 3027 */ 3028 public static final String CHARSET = "charset"; 3029 } 3030 3031 /** 3032 * Contains message parts. 3033 * 3034 * To avoid issues where applications might cache a part ID, the ID of a deleted part must 3035 * not be reused to point at a new part. 3036 */ 3037 public static final class Part implements BaseColumns { 3038 3039 /** 3040 * Not instantiable. 3041 * @hide 3042 */ 3043 private Part() { 3044 } 3045 3046 /** 3047 * The {@code content://} style URL for this table. Can be appended with a part ID to 3048 * address individual parts. 3049 */ 3050 @NonNull 3051 public static final Uri CONTENT_URI = Uri.withAppendedPath(Mms.CONTENT_URI, "part"); 3052 3053 /** 3054 * The identifier of the message which this part belongs to. 3055 * <P>Type: INTEGER</P> 3056 */ 3057 public static final String MSG_ID = "mid"; 3058 3059 /** 3060 * The order of the part. 3061 * <P>Type: INTEGER</P> 3062 */ 3063 public static final String SEQ = "seq"; 3064 3065 /** 3066 * The content type of the part. 3067 * <P>Type: TEXT</P> 3068 */ 3069 public static final String CONTENT_TYPE = "ct"; 3070 3071 /** 3072 * The name of the part. 3073 * <P>Type: TEXT</P> 3074 */ 3075 public static final String NAME = "name"; 3076 3077 /** 3078 * The charset of the part. 3079 * <P>Type: TEXT</P> 3080 */ 3081 public static final String CHARSET = "chset"; 3082 3083 /** 3084 * The file name of the part. 3085 * <P>Type: TEXT</P> 3086 */ 3087 public static final String FILENAME = "fn"; 3088 3089 /** 3090 * The content disposition of the part. 3091 * <P>Type: TEXT</P> 3092 */ 3093 public static final String CONTENT_DISPOSITION = "cd"; 3094 3095 /** 3096 * The content ID of the part. 3097 * <P>Type: INTEGER</P> 3098 */ 3099 public static final String CONTENT_ID = "cid"; 3100 3101 /** 3102 * The content location of the part. 3103 * <P>Type: INTEGER</P> 3104 */ 3105 public static final String CONTENT_LOCATION = "cl"; 3106 3107 /** 3108 * The start of content-type of the message. 3109 * <P>Type: INTEGER</P> 3110 */ 3111 public static final String CT_START = "ctt_s"; 3112 3113 /** 3114 * The type of content-type of the message. 3115 * <P>Type: TEXT</P> 3116 */ 3117 public static final String CT_TYPE = "ctt_t"; 3118 3119 /** 3120 * The location (on filesystem) of the binary data of the part. 3121 * <P>Type: INTEGER</P> 3122 */ 3123 public static final String _DATA = "_data"; 3124 3125 /** 3126 * The message text. 3127 * <P>Type: TEXT</P> 3128 */ 3129 public static final String TEXT = "text"; 3130 } 3131 3132 /** 3133 * Message send rate table. 3134 */ 3135 public static final class Rate { 3136 3137 /** 3138 * Not instantiable. 3139 * @hide 3140 */ 3141 private Rate() { 3142 } 3143 3144 /** 3145 * The {@code content://} style URL for this table. 3146 */ 3147 public static final Uri CONTENT_URI = Uri.withAppendedPath( 3148 Mms.CONTENT_URI, "rate"); 3149 3150 /** 3151 * When a message was successfully sent. 3152 * <P>Type: INTEGER (long)</P> 3153 */ 3154 public static final String SENT_TIME = "sent_time"; 3155 } 3156 3157 /** 3158 * Intents class. 3159 */ 3160 public static final class Intents { 3161 3162 /** 3163 * Not instantiable. 3164 * @hide 3165 */ 3166 private Intents() { 3167 } 3168 3169 /** 3170 * Indicates that the contents of specified URIs were changed. 3171 * The application which is showing or caching these contents 3172 * should be updated. 3173 */ 3174 @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION) 3175 public static final String CONTENT_CHANGED_ACTION 3176 = "android.intent.action.CONTENT_CHANGED"; 3177 3178 /** 3179 * An extra field which stores the URI of deleted contents. 3180 */ 3181 public static final String DELETED_CONTENTS = "deleted_contents"; 3182 } 3183 } 3184 3185 /** 3186 * Contains all MMS and SMS messages. 3187 */ 3188 public static final class MmsSms implements BaseColumns { 3189 3190 /** 3191 * Not instantiable. 3192 * @hide 3193 */ 3194 private MmsSms() { 3195 } 3196 3197 /** 3198 * The column to distinguish SMS and MMS messages in query results. 3199 */ 3200 public static final String TYPE_DISCRIMINATOR_COLUMN = 3201 "transport_type"; 3202 3203 /** 3204 * The {@code content://} style URL for this table. 3205 */ 3206 public static final Uri CONTENT_URI = Uri.parse("content://mms-sms/"); 3207 3208 /** 3209 * The {@code content://} style URL for this table, by conversation. 3210 */ 3211 public static final Uri CONTENT_CONVERSATIONS_URI = Uri.parse( 3212 "content://mms-sms/conversations"); 3213 3214 /** 3215 * The {@code content://} style URL for this table, by phone number. 3216 */ 3217 public static final Uri CONTENT_FILTER_BYPHONE_URI = Uri.parse( 3218 "content://mms-sms/messages/byphone"); 3219 3220 /** 3221 * The {@code content://} style URL for undelivered messages in this table. 3222 */ 3223 public static final Uri CONTENT_UNDELIVERED_URI = Uri.parse( 3224 "content://mms-sms/undelivered"); 3225 3226 /** 3227 * The {@code content://} style URL for draft messages in this table. 3228 */ 3229 public static final Uri CONTENT_DRAFT_URI = Uri.parse( 3230 "content://mms-sms/draft"); 3231 3232 /** 3233 * The {@code content://} style URL for locked messages in this table. 3234 */ 3235 public static final Uri CONTENT_LOCKED_URI = Uri.parse( 3236 "content://mms-sms/locked"); 3237 3238 /** 3239 * Pass in a query parameter called "pattern" which is the text to search for. 3240 * The sort order is fixed to be: {@code thread_id ASC, date DESC}. 3241 */ 3242 public static final Uri SEARCH_URI = Uri.parse( 3243 "content://mms-sms/search"); 3244 3245 // Constants for message protocol types. 3246 3247 /** SMS protocol type. */ 3248 public static final int SMS_PROTO = 0; 3249 3250 /** MMS protocol type. */ 3251 public static final int MMS_PROTO = 1; 3252 3253 // Constants for error types of pending messages. 3254 3255 /** Error type: no error. */ 3256 public static final int NO_ERROR = 0; 3257 3258 /** Error type: generic transient error. */ 3259 public static final int ERR_TYPE_GENERIC = 1; 3260 3261 /** Error type: SMS protocol transient error. */ 3262 public static final int ERR_TYPE_SMS_PROTO_TRANSIENT = 2; 3263 3264 /** Error type: MMS protocol transient error. */ 3265 public static final int ERR_TYPE_MMS_PROTO_TRANSIENT = 3; 3266 3267 /** Error type: transport failure. */ 3268 public static final int ERR_TYPE_TRANSPORT_FAILURE = 4; 3269 3270 /** Error type: permanent error (along with all higher error values). */ 3271 public static final int ERR_TYPE_GENERIC_PERMANENT = 10; 3272 3273 /** Error type: SMS protocol permanent error. */ 3274 public static final int ERR_TYPE_SMS_PROTO_PERMANENT = 11; 3275 3276 /** Error type: MMS protocol permanent error. */ 3277 public static final int ERR_TYPE_MMS_PROTO_PERMANENT = 12; 3278 3279 /** 3280 * Contains pending messages info. 3281 */ 3282 public static final class PendingMessages implements BaseColumns { 3283 3284 /** 3285 * Not instantiable. 3286 * @hide 3287 */ 3288 private PendingMessages() { 3289 } 3290 3291 public static final Uri CONTENT_URI = Uri.withAppendedPath( 3292 MmsSms.CONTENT_URI, "pending"); 3293 3294 /** 3295 * The type of transport protocol (MMS or SMS). 3296 * <P>Type: INTEGER</P> 3297 */ 3298 public static final String PROTO_TYPE = "proto_type"; 3299 3300 /** 3301 * The ID of the message to be sent or downloaded. 3302 * <P>Type: INTEGER (long)</P> 3303 */ 3304 public static final String MSG_ID = "msg_id"; 3305 3306 /** 3307 * The type of the message to be sent or downloaded. 3308 * This field is only valid for MM. For SM, its value is always set to 0. 3309 * <P>Type: INTEGER</P> 3310 */ 3311 public static final String MSG_TYPE = "msg_type"; 3312 3313 /** 3314 * The type of the error code. 3315 * <P>Type: INTEGER</P> 3316 */ 3317 public static final String ERROR_TYPE = "err_type"; 3318 3319 /** 3320 * The error code of sending/retrieving process. 3321 * <P>Type: INTEGER</P> 3322 */ 3323 public static final String ERROR_CODE = "err_code"; 3324 3325 /** 3326 * How many times we tried to send or download the message. 3327 * <P>Type: INTEGER</P> 3328 */ 3329 public static final String RETRY_INDEX = "retry_index"; 3330 3331 /** 3332 * The time to do next retry. 3333 * <P>Type: INTEGER (long)</P> 3334 */ 3335 public static final String DUE_TIME = "due_time"; 3336 3337 /** 3338 * The time we last tried to send or download the message. 3339 * <P>Type: INTEGER (long)</P> 3340 */ 3341 public static final String LAST_TRY = "last_try"; 3342 3343 /** 3344 * The subscription to which the message belongs to. Its value will be 3345 * < 0 if the sub id cannot be determined. 3346 * <p>Type: INTEGER (long) </p> 3347 */ 3348 public static final String SUBSCRIPTION_ID = "pending_sub_id"; 3349 } 3350 3351 /** 3352 * Words table used by provider for full-text searches. 3353 * @hide 3354 */ 3355 public static final class WordsTable { 3356 3357 /** 3358 * Not instantiable. 3359 * @hide 3360 */ 3361 private WordsTable() {} 3362 3363 /** 3364 * Primary key. 3365 * <P>Type: INTEGER (long)</P> 3366 */ 3367 public static final String ID = "_id"; 3368 3369 /** 3370 * Source row ID. 3371 * <P>Type: INTEGER (long)</P> 3372 */ 3373 public static final String SOURCE_ROW_ID = "source_id"; 3374 3375 /** 3376 * Table ID (either 1 or 2). 3377 * <P>Type: INTEGER</P> 3378 */ 3379 public static final String TABLE_ID = "table_to_use"; 3380 3381 /** 3382 * The words to index. 3383 * <P>Type: TEXT</P> 3384 */ 3385 public static final String INDEXED_TEXT = "index_text"; 3386 } 3387 } 3388 3389 /** 3390 * Carriers class contains information about APNs, including MMSC information. 3391 */ 3392 public static final class Carriers implements BaseColumns { 3393 3394 /** 3395 * Not instantiable. 3396 * @hide 3397 */ 3398 private Carriers() {} 3399 3400 /** 3401 * The {@code content://} style URL for this table. 3402 * For MSIM, this will return APNs for the default subscription 3403 * {@link SubscriptionManager#getDefaultSubscriptionId()}. To specify subId for MSIM, 3404 * use {@link Uri#withAppendedPath(Uri, String)} to append with subscription id. 3405 */ 3406 @NonNull 3407 public static final Uri CONTENT_URI = Uri.parse("content://telephony/carriers"); 3408 3409 /** 3410 * The {@code content://} style URL for this table. Used for APN query based on current 3411 * subscription. Instead of specifying carrier matching information in the selection, 3412 * this API will return all matching APNs from current subscription carrier and queries 3413 * will be applied on top of that. If there is no match for MVNO (Mobile Virtual Network 3414 * Operator) APNs, return APNs from its MNO (based on mccmnc) instead. For MSIM, this will 3415 * return APNs for the default subscription 3416 * {@link SubscriptionManager#getDefaultSubscriptionId()}. To specify subId for MSIM, 3417 * use {@link Uri#withAppendedPath(Uri, String)} to append with subscription id. 3418 */ 3419 @NonNull 3420 public static final Uri SIM_APN_URI = Uri.parse( 3421 "content://telephony/carriers/sim_apn_list"); 3422 3423 /** 3424 * The {@code content://} style URL to be called from DevicePolicyManagerService, 3425 * can manage DPC-owned APNs. 3426 * @hide 3427 */ 3428 public static final Uri DPC_URI = Uri.parse("content://telephony/carriers/dpc"); 3429 3430 /** 3431 * The {@code content://} style URL to be called from Telephony to query APNs. 3432 * When DPC-owned APNs are enforced, only DPC-owned APNs are returned, otherwise only 3433 * non-DPC-owned APNs are returned. For MSIM, this will return APNs for the default 3434 * subscription {@link SubscriptionManager#getDefaultSubscriptionId()}. To specify subId 3435 * for MSIM, use {@link Uri#withAppendedPath(Uri, String)} to append with subscription id. 3436 * @hide 3437 */ 3438 public static final Uri FILTERED_URI = Uri.parse("content://telephony/carriers/filtered"); 3439 3440 /** 3441 * The {@code content://} style URL to be called from DevicePolicyManagerService 3442 * or Telephony to manage whether DPC-owned APNs are enforced. 3443 * @hide 3444 */ 3445 public static final Uri ENFORCE_MANAGED_URI = Uri.parse( 3446 "content://telephony/carriers/enforce_managed"); 3447 3448 /** 3449 * The column name for ENFORCE_MANAGED_URI, indicates whether DPC-owned APNs are enforced. 3450 * @hide 3451 */ 3452 public static final String ENFORCE_KEY = "enforced"; 3453 3454 /** 3455 * The default sort order for this table. 3456 */ 3457 public static final String DEFAULT_SORT_ORDER = "name ASC"; 3458 3459 /** 3460 * Entry name. 3461 * <P>Type: TEXT</P> 3462 */ 3463 public static final String NAME = "name"; 3464 3465 /** 3466 * APN name. 3467 * <P>Type: TEXT</P> 3468 */ 3469 public static final String APN = "apn"; 3470 3471 /** 3472 * Proxy address. 3473 * <P>Type: TEXT</P> 3474 */ 3475 public static final String PROXY = "proxy"; 3476 3477 /** 3478 * Proxy port. 3479 * <P>Type: TEXT</P> 3480 */ 3481 public static final String PORT = "port"; 3482 3483 /** 3484 * MMS proxy address. 3485 * <P>Type: TEXT</P> 3486 */ 3487 public static final String MMSPROXY = "mmsproxy"; 3488 3489 /** 3490 * MMS proxy port. 3491 * <P>Type: TEXT</P> 3492 */ 3493 public static final String MMSPORT = "mmsport"; 3494 3495 /** 3496 * Server address. 3497 * <P>Type: TEXT</P> 3498 */ 3499 public static final String SERVER = "server"; 3500 3501 /** 3502 * APN username. 3503 * <P>Type: TEXT</P> 3504 */ 3505 public static final String USER = "user"; 3506 3507 /** 3508 * APN password. 3509 * <P>Type: TEXT</P> 3510 */ 3511 public static final String PASSWORD = "password"; 3512 3513 /** 3514 * MMSC URL. 3515 * <P>Type: TEXT</P> 3516 */ 3517 public static final String MMSC = "mmsc"; 3518 3519 /** 3520 * Mobile Country Code (MCC). 3521 * <P>Type: TEXT</P> 3522 * @deprecated Use {@link #SIM_APN_URI} to query APN instead, this API will return 3523 * matching APNs based on current subscription carrier, thus no need to specify MCC and 3524 * other carrier matching information. In the future, Android will not support MCC for 3525 * APN query. 3526 */ 3527 public static final String MCC = "mcc"; 3528 3529 /** 3530 * Mobile Network Code (MNC). 3531 * <P>Type: TEXT</P> 3532 * @deprecated Use {@link #SIM_APN_URI} to query APN instead, this API will return 3533 * matching APNs based on current subscription carrier, thus no need to specify MNC and 3534 * other carrier matching information. In the future, Android will not support MNC for 3535 * APN query. 3536 */ 3537 public static final String MNC = "mnc"; 3538 3539 /** 3540 * Numeric operator ID (as String). Usually {@code MCC + MNC}. 3541 * <P>Type: TEXT</P> 3542 * @deprecated Use {@link #SIM_APN_URI} to query APN instead, this API will return 3543 * matching APNs based on current subscription carrier, thus no need to specify Numeric 3544 * and other carrier matching information. In the future, Android will not support Numeric 3545 * for APN query. 3546 */ 3547 public static final String NUMERIC = "numeric"; 3548 3549 /** 3550 * Authentication type. 3551 * <P>Type: INTEGER</P> 3552 */ 3553 public static final String AUTH_TYPE = "authtype"; 3554 3555 /** 3556 * Comma-delimited list of APN types. 3557 * <P>Type: TEXT</P> 3558 */ 3559 public static final String TYPE = "type"; 3560 3561 /** 3562 * The protocol to use to connect to this APN. 3563 * 3564 * One of the {@code PDP_type} values in TS 27.007 section 10.1.1. 3565 * For example: {@code IP}, {@code IPV6}, {@code IPV4V6}, or {@code PPP}. 3566 * <P>Type: TEXT</P> 3567 */ 3568 public static final String PROTOCOL = "protocol"; 3569 3570 /** 3571 * The protocol to use to connect to this APN when roaming. 3572 * The syntax is the same as protocol. 3573 * <P>Type: TEXT</P> 3574 */ 3575 public static final String ROAMING_PROTOCOL = "roaming_protocol"; 3576 3577 /** 3578 * Is this the current APN? 3579 * <P>Type: INTEGER (boolean)</P> 3580 */ 3581 public static final String CURRENT = "current"; 3582 3583 /** 3584 * Is this APN enabled? 3585 * <P>Type: INTEGER (boolean)</P> 3586 */ 3587 public static final String CARRIER_ENABLED = "carrier_enabled"; 3588 3589 /** 3590 * Radio Access Technology info. 3591 * To check what values are allowed, refer to {@link android.telephony.ServiceState}. 3592 * This should be spread to other technologies, 3593 * but is currently only used for LTE (14) and eHRPD (13). 3594 * <P>Type: INTEGER</P> 3595 * @deprecated this column is no longer supported, use {@link #NETWORK_TYPE_BITMASK} instead 3596 */ 3597 @Deprecated 3598 public static final String BEARER = "bearer"; 3599 3600 /** 3601 * Radio Access Technology bitmask. 3602 * To check what values can be contained, refer to {@link android.telephony.ServiceState}. 3603 * 0 indicates all techs otherwise first bit refers to RAT/bearer 1, second bit refers to 3604 * RAT/bearer 2 and so on. 3605 * Bitmask for a radio tech R is (1 << (R - 1)) 3606 * <P>Type: INTEGER</P> 3607 * @hide 3608 * @deprecated this column is no longer supported, use {@link #NETWORK_TYPE_BITMASK} instead 3609 */ 3610 @Deprecated 3611 public static final String BEARER_BITMASK = "bearer_bitmask"; 3612 3613 /** 3614 * Radio technology (network type) bitmask. 3615 * To check what values can be contained, refer to the NETWORK_TYPE_ constants in 3616 * {@link android.telephony.TelephonyManager}. 3617 * Bitmask for a radio tech R is (1 << (R - 1)) 3618 * <P>Type: INTEGER</P> 3619 */ 3620 public static final String NETWORK_TYPE_BITMASK = "network_type_bitmask"; 3621 3622 /** 3623 * MVNO type: 3624 * {@code SPN (Service Provider Name), IMSI, GID (Group Identifier Level 1)}. 3625 * <P>Type: TEXT</P> 3626 * @deprecated Use {@link #SIM_APN_URI} to query APN instead, this API will return 3627 * matching APNs based on current subscription carrier, thus no need to specify MVNO_TYPE 3628 * and other carrier matching information. In the future, Android will not support MVNO_TYPE 3629 * for APN query. 3630 */ 3631 public static final String MVNO_TYPE = "mvno_type"; 3632 3633 /** 3634 * MVNO data. 3635 * Use the following examples. 3636 * <ul> 3637 * <li>SPN: A MOBILE, BEN NL, ...</li> 3638 * <li>IMSI: 302720x94, 2060188, ...</li> 3639 * <li>GID: 4E, 33, ...</li> 3640 * </ul> 3641 * <P>Type: TEXT</P> 3642 * @deprecated Use {@link #SIM_APN_URI} to query APN instead, this API will return 3643 * matching APNs based on current subscription carrier, thus no need to specify 3644 * MVNO_MATCH_DATA and other carrier matching information. In the future, Android will not 3645 * support MVNO_MATCH_DATA for APN query. 3646 */ 3647 public static final String MVNO_MATCH_DATA = "mvno_match_data"; 3648 3649 /** 3650 * The subscription to which the APN belongs to 3651 * <p>Type: INTEGER (long) </p> 3652 */ 3653 public static final String SUBSCRIPTION_ID = "sub_id"; 3654 3655 /** 3656 * The profile_id to which the APN saved in modem. 3657 * <p>Type: INTEGER</p> 3658 *@hide 3659 */ 3660 public static final String PROFILE_ID = "profile_id"; 3661 3662 /** 3663 * If set to {@code true}, then the APN setting will persist to the modem. 3664 * <p>Type: INTEGER (boolean)</p> 3665 *@hide 3666 */ 3667 @SystemApi 3668 public static final String MODEM_PERSIST = "modem_cognitive"; 3669 3670 /** 3671 * The max number of connections of this APN. 3672 * <p>Type: INTEGER</p> 3673 *@hide 3674 */ 3675 @SystemApi 3676 public static final String MAX_CONNECTIONS = "max_conns"; 3677 3678 /** 3679 * The wait time for retrying the APN, in milliseconds. 3680 * <p>Type: INTEGER</p> 3681 *@hide 3682 */ 3683 @SystemApi 3684 public static final String WAIT_TIME_RETRY = "wait_time"; 3685 3686 /** 3687 * The max number of seconds this APN will support its maximum number of connections 3688 * as defined in {@link #MAX_CONNECTIONS}. 3689 * <p>Type: INTEGER</p> 3690 *@hide 3691 */ 3692 @SystemApi 3693 public static final String TIME_LIMIT_FOR_MAX_CONNECTIONS = "max_conns_time"; 3694 3695 /** 3696 * The MTU (maximum transmit unit) size of the mobile interface to which the APN is 3697 * connected, in bytes. 3698 * <p>Type: INTEGER </p> 3699 * @hide 3700 */ 3701 @SystemApi 3702 public static final String MTU = "mtu"; 3703 3704 /** 3705 * APN edit status. APN could be added/edited/deleted by a user or carrier. 3706 * see all possible returned APN edit status. 3707 * <ul> 3708 * <li>{@link #UNEDITED}</li> 3709 * <li>{@link #USER_EDITED}</li> 3710 * <li>{@link #USER_DELETED}</li> 3711 * <li>{@link #CARRIER_EDITED}</li> 3712 * <li>{@link #CARRIER_DELETED}</li> 3713 * </ul> 3714 * <p>Type: INTEGER </p> 3715 * @hide 3716 */ 3717 @SystemApi 3718 public static final String EDITED_STATUS = "edited"; 3719 3720 /** 3721 * {@code true} if this APN visible to the user, {@code false} otherwise. 3722 * <p>Type: INTEGER (boolean)</p> 3723 * @hide 3724 */ 3725 @SystemApi 3726 public static final String USER_VISIBLE = "user_visible"; 3727 3728 /** 3729 * {@code true} if the user allowed to edit this APN, {@code false} otherwise. 3730 * <p>Type: INTEGER (boolean)</p> 3731 * @hide 3732 */ 3733 @SystemApi 3734 public static final String USER_EDITABLE = "user_editable"; 3735 3736 /** 3737 * {@link #EDITED_STATUS APN edit status} indicates that this APN has not been edited or 3738 * fails to edit. 3739 * <p>Type: INTEGER </p> 3740 * @hide 3741 */ 3742 @SystemApi 3743 public static final @EditStatus int UNEDITED = 0; 3744 3745 /** 3746 * {@link #EDITED_STATUS APN edit status} indicates that this APN has been edited by users. 3747 * <p>Type: INTEGER </p> 3748 * @hide 3749 */ 3750 @SystemApi 3751 public static final @EditStatus int USER_EDITED = 1; 3752 3753 /** 3754 * {@link #EDITED_STATUS APN edit status} indicates that this APN has been deleted by users. 3755 * <p>Type: INTEGER </p> 3756 * @hide 3757 */ 3758 @SystemApi 3759 public static final @EditStatus int USER_DELETED = 2; 3760 3761 /** 3762 * {@link #EDITED_STATUS APN edit status} is an intermediate value used to indicate that an 3763 * entry deleted by the user is still present in the new APN database and therefore must 3764 * remain tagged as user deleted rather than completely removed from the database. 3765 * @hide 3766 */ 3767 public static final int USER_DELETED_BUT_PRESENT_IN_XML = 3; 3768 3769 /** 3770 * {@link #EDITED_STATUS APN edit status} indicates that this APN has been edited by 3771 * carriers. 3772 * <p>Type: INTEGER </p> 3773 * @hide 3774 */ 3775 @SystemApi 3776 public static final @EditStatus int CARRIER_EDITED = 4; 3777 3778 /** 3779 * {@link #EDITED_STATUS APN edit status} indicates that this APN has been deleted by 3780 * carriers. CARRIER_DELETED values are currently not used as there is no use case. 3781 * If they are used, delete() will have to change accordingly. Currently it is hardcoded to 3782 * USER_DELETED. 3783 * <p>Type: INTEGER </p> 3784 * @hide 3785 */ 3786 public static final @EditStatus int CARRIER_DELETED = 5; 3787 3788 /** 3789 * {@link #EDITED_STATUS APN edit status} is an intermediate value used to indicate that an 3790 * entry deleted by the carrier is still present in the new APN database and therefore must 3791 * remain tagged as user deleted rather than completely removed from the database. 3792 * @hide 3793 */ 3794 public static final int CARRIER_DELETED_BUT_PRESENT_IN_XML = 6; 3795 3796 /** 3797 * The owner of the APN. 3798 * <p>Type: INTEGER</p> 3799 * @hide 3800 */ 3801 public static final String OWNED_BY = "owned_by"; 3802 3803 /** 3804 * Possible value for the OWNED_BY field. 3805 * APN is owned by DPC. 3806 * @hide 3807 */ 3808 public static final int OWNED_BY_DPC = 0; 3809 3810 /** 3811 * Possible value for the OWNED_BY field. 3812 * APN is owned by other sources. 3813 * @hide 3814 */ 3815 public static final int OWNED_BY_OTHERS = 1; 3816 3817 /** 3818 * The APN set id. When the user manually selects an APN or the framework sets an APN as 3819 * preferred, all APNs with the same set id as the selected APN should be prioritized over 3820 * APNs in other sets. 3821 * <p>Type: INTEGER</p> 3822 * @hide 3823 */ 3824 @SystemApi 3825 public static final String APN_SET_ID = "apn_set_id"; 3826 3827 /** 3828 * Possible value for the {@link #APN_SET_ID} field. By default APNs will not belong to a 3829 * set. If the user manually selects an APN without apn set id, there is no need to 3830 * prioritize any specific APN set ids. 3831 * <p>Type: INTEGER</p> 3832 * @hide 3833 */ 3834 @SystemApi 3835 public static final int NO_APN_SET_ID = 0; 3836 3837 /** 3838 * A unique carrier id associated with this APN 3839 * {@see TelephonyManager#getSimCarrierId()} 3840 * <p>Type: STRING</p> 3841 */ 3842 public static final String CARRIER_ID = "carrier_id"; 3843 3844 /** 3845 * The skip 464xlat flag. Flag works as follows. 3846 * {@link #SKIP_464XLAT_DEFAULT}: the APN will skip only APN is IMS and no internet. 3847 * {@link #SKIP_464XLAT_DISABLE}: the APN will NOT skip 464xlat 3848 * {@link #SKIP_464XLAT_ENABLE}: the APN will skip 464xlat 3849 * <p>Type: INTEGER</p> 3850 * 3851 * @hide 3852 */ 3853 public static final String SKIP_464XLAT = "skip_464xlat"; 3854 3855 /** 3856 * Possible value for the {@link #SKIP_464XLAT} field. 3857 * <p>Type: INTEGER</p> 3858 * 3859 * @hide 3860 */ 3861 public static final int SKIP_464XLAT_DEFAULT = -1; 3862 3863 /** 3864 * Possible value for the {@link #SKIP_464XLAT} field. 3865 * <p>Type: INTEGER</p> 3866 * 3867 * @hide 3868 */ 3869 public static final int SKIP_464XLAT_DISABLE = 0; 3870 3871 /** 3872 * Possible value for the {@link #SKIP_464XLAT} field. 3873 * <p>Type: INTEGER</p> 3874 * 3875 * @hide 3876 */ 3877 public static final int SKIP_464XLAT_ENABLE = 1; 3878 3879 3880 /** @hide */ 3881 @IntDef({ 3882 UNEDITED, 3883 USER_EDITED, 3884 USER_DELETED, 3885 CARRIER_DELETED, 3886 CARRIER_EDITED, 3887 }) 3888 @Retention(RetentionPolicy.SOURCE) 3889 public @interface EditStatus {} 3890 3891 /** @hide */ 3892 @IntDef({ 3893 SKIP_464XLAT_DEFAULT, 3894 SKIP_464XLAT_DISABLE, 3895 SKIP_464XLAT_ENABLE, 3896 }) 3897 @Retention(RetentionPolicy.SOURCE) 3898 public @interface Skip464XlatStatus {} 3899 3900 } 3901 3902 /** 3903 * Contains received SMS cell broadcast messages. 3904 * @hide 3905 */ 3906 public static final class CellBroadcasts implements BaseColumns { 3907 3908 /** 3909 * Not instantiable. 3910 * @hide 3911 */ 3912 private CellBroadcasts() {} 3913 3914 /** 3915 * The {@code content://} URI for this table. 3916 */ 3917 public static final Uri CONTENT_URI = Uri.parse("content://cellbroadcasts"); 3918 3919 /** 3920 * Message geographical scope. 3921 * <P>Type: INTEGER</P> 3922 */ 3923 public static final String GEOGRAPHICAL_SCOPE = "geo_scope"; 3924 3925 /** 3926 * Message serial number. 3927 * <P>Type: INTEGER</P> 3928 */ 3929 public static final String SERIAL_NUMBER = "serial_number"; 3930 3931 /** 3932 * PLMN of broadcast sender. {@code SERIAL_NUMBER + PLMN + LAC + CID} uniquely identifies 3933 * a broadcast for duplicate detection purposes. 3934 * <P>Type: TEXT</P> 3935 */ 3936 public static final String PLMN = "plmn"; 3937 3938 /** 3939 * Location Area (GSM) or Service Area (UMTS) of broadcast sender. Unused for CDMA. 3940 * Only included if Geographical Scope of message is not PLMN wide (01). 3941 * <P>Type: INTEGER</P> 3942 */ 3943 public static final String LAC = "lac"; 3944 3945 /** 3946 * Cell ID of message sender (GSM/UMTS). Unused for CDMA. Only included when the 3947 * Geographical Scope of message is cell wide (00 or 11). 3948 * <P>Type: INTEGER</P> 3949 */ 3950 public static final String CID = "cid"; 3951 3952 /** 3953 * Message code. <em>OBSOLETE: merged into SERIAL_NUMBER.</em> 3954 * <P>Type: INTEGER</P> 3955 */ 3956 public static final String V1_MESSAGE_CODE = "message_code"; 3957 3958 /** 3959 * Message identifier. <em>OBSOLETE: renamed to SERVICE_CATEGORY.</em> 3960 * <P>Type: INTEGER</P> 3961 */ 3962 public static final String V1_MESSAGE_IDENTIFIER = "message_id"; 3963 3964 /** 3965 * Service category (GSM/UMTS: message identifier; CDMA: service category). 3966 * <P>Type: INTEGER</P> 3967 */ 3968 public static final String SERVICE_CATEGORY = "service_category"; 3969 3970 /** 3971 * Message language code. 3972 * <P>Type: TEXT</P> 3973 */ 3974 public static final String LANGUAGE_CODE = "language"; 3975 3976 /** 3977 * Message body. 3978 * <P>Type: TEXT</P> 3979 */ 3980 public static final String MESSAGE_BODY = "body"; 3981 3982 /** 3983 * Message delivery time. 3984 * <P>Type: INTEGER (long)</P> 3985 */ 3986 public static final String DELIVERY_TIME = "date"; 3987 3988 /** 3989 * Has the message been viewed? 3990 * <P>Type: INTEGER (boolean)</P> 3991 */ 3992 public static final String MESSAGE_READ = "read"; 3993 3994 /** 3995 * Message format (3GPP or 3GPP2). 3996 * <P>Type: INTEGER</P> 3997 */ 3998 public static final String MESSAGE_FORMAT = "format"; 3999 4000 /** 4001 * Message priority (including emergency). 4002 * <P>Type: INTEGER</P> 4003 */ 4004 public static final String MESSAGE_PRIORITY = "priority"; 4005 4006 /** 4007 * ETWS warning type (ETWS alerts only). 4008 * <P>Type: INTEGER</P> 4009 */ 4010 public static final String ETWS_WARNING_TYPE = "etws_warning_type"; 4011 4012 /** 4013 * CMAS message class (CMAS alerts only). 4014 * <P>Type: INTEGER</P> 4015 */ 4016 public static final String CMAS_MESSAGE_CLASS = "cmas_message_class"; 4017 4018 /** 4019 * CMAS category (CMAS alerts only). 4020 * <P>Type: INTEGER</P> 4021 */ 4022 public static final String CMAS_CATEGORY = "cmas_category"; 4023 4024 /** 4025 * CMAS response type (CMAS alerts only). 4026 * <P>Type: INTEGER</P> 4027 */ 4028 public static final String CMAS_RESPONSE_TYPE = "cmas_response_type"; 4029 4030 /** 4031 * CMAS severity (CMAS alerts only). 4032 * <P>Type: INTEGER</P> 4033 */ 4034 public static final String CMAS_SEVERITY = "cmas_severity"; 4035 4036 /** 4037 * CMAS urgency (CMAS alerts only). 4038 * <P>Type: INTEGER</P> 4039 */ 4040 public static final String CMAS_URGENCY = "cmas_urgency"; 4041 4042 /** 4043 * CMAS certainty (CMAS alerts only). 4044 * <P>Type: INTEGER</P> 4045 */ 4046 public static final String CMAS_CERTAINTY = "cmas_certainty"; 4047 4048 /** The default sort order for this table. */ 4049 public static final String DEFAULT_SORT_ORDER = DELIVERY_TIME + " DESC"; 4050 4051 /** 4052 * Query columns for instantiating {@link android.telephony.CellBroadcastMessage} objects. 4053 */ 4054 public static final String[] QUERY_COLUMNS = { 4055 _ID, 4056 GEOGRAPHICAL_SCOPE, 4057 PLMN, 4058 LAC, 4059 CID, 4060 SERIAL_NUMBER, 4061 SERVICE_CATEGORY, 4062 LANGUAGE_CODE, 4063 MESSAGE_BODY, 4064 DELIVERY_TIME, 4065 MESSAGE_READ, 4066 MESSAGE_FORMAT, 4067 MESSAGE_PRIORITY, 4068 ETWS_WARNING_TYPE, 4069 CMAS_MESSAGE_CLASS, 4070 CMAS_CATEGORY, 4071 CMAS_RESPONSE_TYPE, 4072 CMAS_SEVERITY, 4073 CMAS_URGENCY, 4074 CMAS_CERTAINTY 4075 }; 4076 } 4077 4078 /** 4079 * Constants for interfacing with the ServiceStateProvider and the different fields of the 4080 * {@link ServiceState} class accessible through the provider. 4081 */ 4082 public static final class ServiceStateTable { 4083 4084 /** 4085 * Not instantiable. 4086 * @hide 4087 */ 4088 private ServiceStateTable() {} 4089 4090 /** 4091 * The authority string for the ServiceStateProvider 4092 */ 4093 public static final String AUTHORITY = "service-state"; 4094 4095 /** 4096 * The {@code content://} style URL for the ServiceStateProvider 4097 */ 4098 public static final Uri CONTENT_URI = Uri.parse("content://service-state/"); 4099 4100 /** 4101 * Generates a content {@link Uri} used to receive updates on a specific field in the 4102 * ServiceState provider. 4103 * <p> 4104 * Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the 4105 * {@link ServiceState} while your app is running. You can also use a {@link JobService} to 4106 * ensure your app is notified of changes to the {@link Uri} even when it is not running. 4107 * Note, however, that using a {@link JobService} does not guarantee timely delivery of 4108 * updates to the {@link Uri}. 4109 * 4110 * @param subscriptionId the subscriptionId to receive updates on 4111 * @param field the ServiceState field to receive updates on 4112 * @return the Uri used to observe {@link ServiceState} changes 4113 */ 4114 public static Uri getUriForSubscriptionIdAndField(int subscriptionId, String field) { 4115 return CONTENT_URI.buildUpon().appendEncodedPath(String.valueOf(subscriptionId)) 4116 .appendEncodedPath(field).build(); 4117 } 4118 4119 /** 4120 * Generates a content {@link Uri} used to receive updates on every field in the 4121 * ServiceState provider. 4122 * <p> 4123 * Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the 4124 * {@link ServiceState} while your app is running. You can also use a {@link JobService} to 4125 * ensure your app is notified of changes to the {@link Uri} even when it is not running. 4126 * Note, however, that using a {@link JobService} does not guarantee timely delivery of 4127 * updates to the {@link Uri}. 4128 * 4129 * @param subscriptionId the subscriptionId to receive updates on 4130 * @return the Uri used to observe {@link ServiceState} changes 4131 */ 4132 public static Uri getUriForSubscriptionId(int subscriptionId) { 4133 return CONTENT_URI.buildUpon().appendEncodedPath(String.valueOf(subscriptionId)).build(); 4134 } 4135 4136 /** 4137 * Used to insert a ServiceState into the ServiceStateProvider as a ContentValues instance. 4138 * 4139 * @param state the ServiceState to convert into ContentValues 4140 * @return the convertedContentValues instance 4141 * @hide 4142 */ 4143 public static ContentValues getContentValuesForServiceState(ServiceState state) { 4144 ContentValues values = new ContentValues(); 4145 final Parcel p = Parcel.obtain(); 4146 state.writeToParcel(p, 0); 4147 // Turn the parcel to byte array. Safe to do this because the content values were never 4148 // written into a persistent storage. ServiceStateProvider keeps values in the memory. 4149 values.put(SERVICE_STATE, p.marshall()); 4150 return values; 4151 } 4152 4153 /** 4154 * The current service state. 4155 * 4156 * This is the entire {@link ServiceState} object in byte array. 4157 * 4158 * @hide 4159 */ 4160 public static final String SERVICE_STATE = "service_state"; 4161 4162 /** 4163 * An integer value indicating the current voice service state. 4164 * <p> 4165 * Valid values: {@link ServiceState#STATE_IN_SERVICE}, 4166 * {@link ServiceState#STATE_OUT_OF_SERVICE}, {@link ServiceState#STATE_EMERGENCY_ONLY}, 4167 * {@link ServiceState#STATE_POWER_OFF}. 4168 * <p> 4169 * This is the same as {@link ServiceState#getState()}. 4170 */ 4171 public static final String VOICE_REG_STATE = "voice_reg_state"; 4172 4173 /** 4174 * An integer value indicating the current data service state. 4175 * <p> 4176 * Valid values: {@link ServiceState#STATE_IN_SERVICE}, 4177 * {@link ServiceState#STATE_OUT_OF_SERVICE}, {@link ServiceState#STATE_EMERGENCY_ONLY}, 4178 * {@link ServiceState#STATE_POWER_OFF}. 4179 * <p> 4180 * This is the same as {@link ServiceState#getDataRegState()}. 4181 * @hide 4182 */ 4183 public static final String DATA_REG_STATE = "data_reg_state"; 4184 4185 /** 4186 * An integer value indicating the current voice roaming type. 4187 * <p> 4188 * This is the same as {@link ServiceState#getVoiceRoamingType()}. 4189 * @hide 4190 */ 4191 public static final String VOICE_ROAMING_TYPE = "voice_roaming_type"; 4192 4193 /** 4194 * An integer value indicating the current data roaming type. 4195 * <p> 4196 * This is the same as {@link ServiceState#getDataRoamingType()}. 4197 * @hide 4198 */ 4199 public static final String DATA_ROAMING_TYPE = "data_roaming_type"; 4200 4201 /** 4202 * The current registered voice network operator name in long alphanumeric format. 4203 * <p> 4204 * This is the same as {@link ServiceState#getVoiceOperatorAlphaLong()}. 4205 * @hide 4206 */ 4207 public static final String VOICE_OPERATOR_ALPHA_LONG = "voice_operator_alpha_long"; 4208 4209 /** 4210 * The current registered operator name in short alphanumeric format. 4211 * <p> 4212 * In GSM/UMTS, short format can be up to 8 characters long. The current registered voice 4213 * network operator name in long alphanumeric format. 4214 * <p> 4215 * This is the same as {@link ServiceState#getVoiceOperatorAlphaShort()}. 4216 * @hide 4217 */ 4218 public static final String VOICE_OPERATOR_ALPHA_SHORT = "voice_operator_alpha_short"; 4219 4220 4221 /** 4222 * The current registered operator numeric id. 4223 * <p> 4224 * In GSM/UMTS, numeric format is 3 digit country code plus 2 or 3 digit 4225 * network code. 4226 * <p> 4227 * This is the same as {@link ServiceState#getOperatorNumeric()}. 4228 */ 4229 public static final String VOICE_OPERATOR_NUMERIC = "voice_operator_numeric"; 4230 4231 /** 4232 * The current registered data network operator name in long alphanumeric format. 4233 * <p> 4234 * This is the same as {@link ServiceState#getDataOperatorAlphaLong()}. 4235 * @hide 4236 */ 4237 public static final String DATA_OPERATOR_ALPHA_LONG = "data_operator_alpha_long"; 4238 4239 /** 4240 * The current registered data network operator name in short alphanumeric format. 4241 * <p> 4242 * This is the same as {@link ServiceState#getDataOperatorAlphaShort()}. 4243 * @hide 4244 */ 4245 public static final String DATA_OPERATOR_ALPHA_SHORT = "data_operator_alpha_short"; 4246 4247 /** 4248 * The current registered data network operator numeric id. 4249 * <p> 4250 * This is the same as {@link ServiceState#getDataOperatorNumeric()}. 4251 * @hide 4252 */ 4253 public static final String DATA_OPERATOR_NUMERIC = "data_operator_numeric"; 4254 4255 /** 4256 * The current network selection mode. 4257 * <p> 4258 * This is the same as {@link ServiceState#getIsManualSelection()}. 4259 */ 4260 public static final String IS_MANUAL_NETWORK_SELECTION = "is_manual_network_selection"; 4261 4262 /** 4263 * This is the same as {@link ServiceState#getRilVoiceRadioTechnology()}. 4264 * @hide 4265 */ 4266 public static final String RIL_VOICE_RADIO_TECHNOLOGY = "ril_voice_radio_technology"; 4267 4268 /** 4269 * This is the same as {@link ServiceState#getRilDataRadioTechnology()}. 4270 * @hide 4271 */ 4272 public static final String RIL_DATA_RADIO_TECHNOLOGY = "ril_data_radio_technology"; 4273 4274 /** 4275 * This is the same as {@link ServiceState#getCssIndicator()}. 4276 * @hide 4277 */ 4278 public static final String CSS_INDICATOR = "css_indicator"; 4279 4280 /** 4281 * This is the same as {@link ServiceState#getCdmaNetworkId()}. 4282 * @hide 4283 */ 4284 public static final String NETWORK_ID = "network_id"; 4285 4286 /** 4287 * This is the same as {@link ServiceState#getCdmaSystemId()}. 4288 * @hide 4289 */ 4290 public static final String SYSTEM_ID = "system_id"; 4291 4292 /** 4293 * This is the same as {@link ServiceState#getCdmaRoamingIndicator()}. 4294 * @hide 4295 */ 4296 public static final String CDMA_ROAMING_INDICATOR = "cdma_roaming_indicator"; 4297 4298 /** 4299 * This is the same as {@link ServiceState#getCdmaDefaultRoamingIndicator()}. 4300 * @hide 4301 */ 4302 public static final String CDMA_DEFAULT_ROAMING_INDICATOR = 4303 "cdma_default_roaming_indicator"; 4304 4305 /** 4306 * This is the same as {@link ServiceState#getCdmaEriIconIndex()}. 4307 * @hide 4308 */ 4309 public static final String CDMA_ERI_ICON_INDEX = "cdma_eri_icon_index"; 4310 4311 /** 4312 * This is the same as {@link ServiceState#getCdmaEriIconMode()}. 4313 * @hide 4314 */ 4315 public static final String CDMA_ERI_ICON_MODE = "cdma_eri_icon_mode"; 4316 4317 /** 4318 * This is the same as {@link ServiceState#isEmergencyOnly()}. 4319 * @hide 4320 */ 4321 public static final String IS_EMERGENCY_ONLY = "is_emergency_only"; 4322 4323 /** 4324 * This is the same as {@link ServiceState#getDataRoamingFromRegistration()}. 4325 * @hide 4326 */ 4327 public static final String IS_DATA_ROAMING_FROM_REGISTRATION = 4328 "is_data_roaming_from_registration"; 4329 4330 /** 4331 * This is the same as {@link ServiceState#isUsingCarrierAggregation()}. 4332 * @hide 4333 */ 4334 public static final String IS_USING_CARRIER_AGGREGATION = "is_using_carrier_aggregation"; 4335 4336 /** 4337 * The current registered raw data network operator name in long alphanumeric format. 4338 * <p> 4339 * This is the same as {@link ServiceState#getOperatorAlphaLongRaw()}. 4340 * @hide 4341 */ 4342 public static final String OPERATOR_ALPHA_LONG_RAW = "operator_alpha_long_raw"; 4343 4344 /** 4345 * The current registered raw data network operator name in short alphanumeric format. 4346 * <p> 4347 * This is the same as {@link ServiceState#getOperatorAlphaShortRaw()}. 4348 * @hide 4349 */ 4350 public static final String OPERATOR_ALPHA_SHORT_RAW = "operator_alpha_short_raw"; 4351 } 4352 4353 /** 4354 * Contains carrier identification information for the current subscriptions. 4355 */ 4356 public static final class CarrierId implements BaseColumns { 4357 /** 4358 * Not instantiable. 4359 * @hide 4360 */ 4361 private CarrierId() {} 4362 4363 /** 4364 * The {@code content://} style URI for this provider. 4365 */ 4366 public static final Uri CONTENT_URI = Uri.parse("content://carrier_id"); 4367 4368 /** 4369 * The authority string for the CarrierId Provider 4370 * @hide 4371 */ 4372 public static final String AUTHORITY = "carrier_id"; 4373 4374 4375 /** 4376 * Generates a content {@link Uri} used to receive updates on carrier identity change 4377 * on the given subscriptionId 4378 * <p> 4379 * Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the 4380 * carrier identity {@link TelephonyManager#getSimCarrierId()} 4381 * while your app is running. You can also use a {@link JobService} to ensure your app 4382 * is notified of changes to the {@link Uri} even when it is not running. 4383 * Note, however, that using a {@link JobService} does not guarantee timely delivery of 4384 * updates to the {@link Uri}. 4385 * 4386 * @param subscriptionId the subscriptionId to receive updates on 4387 * @return the Uri used to observe carrier identity changes 4388 */ 4389 public static Uri getUriForSubscriptionId(int subscriptionId) { 4390 return CONTENT_URI.buildUpon().appendEncodedPath( 4391 String.valueOf(subscriptionId)).build(); 4392 } 4393 4394 /** 4395 * Generates a content {@link Uri} used to receive updates on specific carrier identity 4396 * change on the given subscriptionId returned by 4397 * {@link TelephonyManager#getSimSpecificCarrierId()}. 4398 * @see TelephonyManager#ACTION_SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED 4399 * <p> 4400 * Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the 4401 * specific carrier identity {@link TelephonyManager#getSimSpecificCarrierId()} 4402 * while your app is running. You can also use a {@link JobService} to ensure your app 4403 * is notified of changes to the {@link Uri} even when it is not running. 4404 * Note, however, that using a {@link JobService} does not guarantee timely delivery of 4405 * updates to the {@link Uri}. 4406 * 4407 * @param subscriptionId the subscriptionId to receive updates on 4408 * @return the Uri used to observe specific carrier identity changes 4409 */ 4410 @NonNull 4411 public static Uri getSpecificCarrierIdUriForSubscriptionId(int subscriptionId) { 4412 return Uri.withAppendedPath(Uri.withAppendedPath(CONTENT_URI, "specific"), 4413 String.valueOf(subscriptionId)); 4414 } 4415 4416 /** 4417 * A user facing carrier name. 4418 * @see TelephonyManager#getSimCarrierIdName() 4419 * <P>Type: TEXT </P> 4420 */ 4421 public static final String CARRIER_NAME = "carrier_name"; 4422 4423 /** 4424 * A unique carrier id 4425 * @see TelephonyManager#getSimCarrierId() 4426 * <P>Type: INTEGER </P> 4427 */ 4428 public static final String CARRIER_ID = "carrier_id"; 4429 4430 /** 4431 * A fine-grained carrier id. 4432 * The specific carrier ID would be used for configuration purposes, but apps wishing to 4433 * know about the carrier itself should use the regular carrier ID returned by 4434 * {@link TelephonyManager#getSimCarrierId()}. 4435 * 4436 * @see TelephonyManager#getSimSpecificCarrierId() 4437 * This is not a database column, only used to notify content observers for 4438 * {@link #getSpecificCarrierIdUriForSubscriptionId(int)} 4439 */ 4440 public static final String SPECIFIC_CARRIER_ID = "specific_carrier_id"; 4441 4442 /** 4443 * A user facing carrier name for specific carrier id {@link #SPECIFIC_CARRIER_ID}. 4444 * @see TelephonyManager#getSimSpecificCarrierIdName() 4445 * This is not a database column, only used to notify content observers for 4446 * {@link #getSpecificCarrierIdUriForSubscriptionId(int)} 4447 */ 4448 public static final String SPECIFIC_CARRIER_ID_NAME = "specific_carrier_id_name"; 4449 4450 /** 4451 * A unique parent carrier id. The parent-child 4452 * relationship can be used to further differentiate a single carrier by different networks, 4453 * by prepaid v.s. postpaid. It's an optional field. 4454 * A carrier id with a valid parent_carrier_id is considered fine-grained specific carrier 4455 * ID, will not be returned as {@link #CARRIER_ID} but {@link #SPECIFIC_CARRIER_ID}. 4456 * <P>Type: INTEGER </P> 4457 * @hide 4458 */ 4459 public static final String PARENT_CARRIER_ID = "parent_carrier_id"; 4460 4461 /** 4462 * Contains mappings between matching rules with carrier id for all carriers. 4463 * @hide 4464 */ 4465 public static final class All implements BaseColumns { 4466 /** 4467 * Numeric operator ID (as String). {@code MCC + MNC} 4468 * <P>Type: TEXT </P> 4469 */ 4470 public static final String MCCMNC = "mccmnc"; 4471 4472 /** 4473 * Group id level 1 (as String). 4474 * <P>Type: TEXT </P> 4475 */ 4476 public static final String GID1 = "gid1"; 4477 4478 /** 4479 * Group id level 2 (as String). 4480 * <P>Type: TEXT </P> 4481 */ 4482 public static final String GID2 = "gid2"; 4483 4484 /** 4485 * Public Land Mobile Network name. 4486 * <P>Type: TEXT </P> 4487 */ 4488 public static final String PLMN = "plmn"; 4489 4490 /** 4491 * Prefix xpattern of IMSI (International Mobile Subscriber Identity). 4492 * <P>Type: TEXT </P> 4493 */ 4494 public static final String IMSI_PREFIX_XPATTERN = "imsi_prefix_xpattern"; 4495 4496 /** 4497 * Service Provider Name. 4498 * <P>Type: TEXT </P> 4499 */ 4500 public static final String SPN = "spn"; 4501 4502 /** 4503 * Prefer APN name. 4504 * <P>Type: TEXT </P> 4505 */ 4506 public static final String APN = "apn"; 4507 4508 /** 4509 * Prefix of Integrated Circuit Card Identifier. 4510 * <P>Type: TEXT </P> 4511 */ 4512 public static final String ICCID_PREFIX = "iccid_prefix"; 4513 4514 /** 4515 * Certificate for carrier privilege access rules. 4516 * <P>Type: TEXT in hex string </P> 4517 */ 4518 public static final String PRIVILEGE_ACCESS_RULE = "privilege_access_rule"; 4519 4520 /** 4521 * The {@code content://} URI for this table. 4522 */ 4523 public static final Uri CONTENT_URI = Uri.parse("content://carrier_id/all"); 4524 } 4525 } 4526 } 4527