diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2019-11-08 15:46:53 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2019-11-08 15:46:53 +0000 |
commit | f363f3549e738af21cb4b3afa852a81e45df001e (patch) | |
tree | 58554d44117ec9e5fb9633b044bb4e3db9f6bfc6 | |
parent | c03b91a7efc9e2ef6d8d5a21d59375054211fa5a (diff) | |
parent | d2f962a6db2b47a9e7b56040ad11d7393ad43d0d (diff) |
Merge "Add new SystemApi methods for mainline"
-rw-r--r-- | api/system-current.txt | 17 | ||||
-rw-r--r-- | api/test-current.txt | 9 | ||||
-rw-r--r-- | core/java/android/provider/CallLog.java | 2 | ||||
-rw-r--r-- | telecomm/java/android/telecom/CallerInfo.java (renamed from telephony/java/android/telephony/CallerInfo.java) | 80 | ||||
-rw-r--r-- | telecomm/java/android/telecom/CallerInfoAsyncQuery.java (renamed from telephony/java/android/telephony/CallerInfoAsyncQuery.java) | 48 | ||||
-rw-r--r-- | telephony/java/android/telephony/DisconnectCause.java | 3 | ||||
-rw-r--r-- | telephony/java/android/telephony/PhoneNumberUtils.java | 29 | ||||
-rw-r--r-- | telephony/java/android/telephony/SmsManager.java | 10 | ||||
-rw-r--r-- | telephony/java/android/telephony/SubscriptionManager.java | 32 | ||||
-rw-r--r-- | telephony/java/android/telephony/TelephonyManager.java | 38 |
10 files changed, 168 insertions, 100 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index b31f180d73f3..33931122d0f3 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -7248,13 +7248,6 @@ package android.telephony { field @NonNull public static final android.os.Parcelable.Creator<android.telephony.CallQuality> CREATOR; } - public class CallerInfo { - method @Nullable public android.net.Uri getContactDisplayPhotoUri(); - method public long getContactId(); - method @Nullable public String getName(); - method @Nullable public String getPhoneNumber(); - } - public class CarrierConfigManager { method @NonNull public static android.os.PersistableBundle getDefaultConfig(); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void overrideConfig(int, @Nullable android.os.PersistableBundle); @@ -7837,6 +7830,12 @@ package android.telephony { field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PhoneNumberRange> CREATOR; } + public class PhoneNumberUtils { + method @NonNull public static String getUsernameFromUriNumber(@NonNull String); + method public static boolean isUriNumber(@Nullable String); + method public static boolean isVoiceMailNumber(@NonNull android.content.Context, int, @Nullable String); + } + public class PhoneStateListener { method public void onCallAttributesChanged(@NonNull android.telephony.CallAttributes); method @RequiresPermission("android.permission.READ_PRECISE_PHONE_STATE") public void onCallDisconnectCauseChanged(int, int); @@ -8117,6 +8116,7 @@ package android.telephony { public final class SmsManager { method public boolean disableCellBroadcastRange(int, int, int); method public boolean enableCellBroadcastRange(int, int, int); + method public void sendMultipartTextMessage(@NonNull String, @NonNull String, @NonNull java.util.List<java.lang.String>, @Nullable java.util.List<android.app.PendingIntent>, @Nullable java.util.List<android.app.PendingIntent>, @NonNull String); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void sendMultipartTextMessageWithoutPersisting(String, String, java.util.List<java.lang.String>, java.util.List<android.app.PendingIntent>, java.util.List<android.app.PendingIntent>); } @@ -8134,6 +8134,7 @@ package android.telephony { method public void requestEmbeddedSubscriptionInfoListRefresh(int); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultDataSubId(int); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultSmsSubId(int); + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultVoiceSubscriptionId(int); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setPreferredDataSubscriptionId(int, boolean, @Nullable java.util.concurrent.Executor, @Nullable java.util.function.Consumer<java.lang.Integer>); method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setSubscriptionEnabled(int, boolean); field @NonNull public static final android.net.Uri ADVANCED_CALLING_ENABLED_CONTENT_URI; @@ -8202,10 +8203,12 @@ package android.telephony { method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public int getDataActivationState(); method @Deprecated public boolean getDataEnabled(); method @Deprecated public boolean getDataEnabled(int); + method @Nullable public static android.content.ComponentName getDefaultRespondViaMessageApplication(@NonNull android.content.Context, boolean); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean getEmergencyCallbackMode(); method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimDomain(); method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getIsimIst(); method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.Map<java.lang.Integer,java.lang.Integer> getLogicalToPhysicalSlotMapping(); + method public int getMaxNumberOfSimultaneouslyActiveSims(); method public static long getMaxNumberVerificationTimeoutMillis(); method @NonNull public String getNetworkCountryIso(int); method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getPreferredNetworkTypeBitmask(); diff --git a/api/test-current.txt b/api/test-current.txt index a82ec4e153f6..293ca55cf606 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -2865,6 +2865,9 @@ package android.telephony { public class PhoneNumberUtils { method public static int getMinMatchForTest(); + method @NonNull public static String getUsernameFromUriNumber(@NonNull String); + method public static boolean isUriNumber(@Nullable String); + method public static boolean isVoiceMailNumber(@NonNull android.content.Context, int, @Nullable String); method public static void setMinMatchForTest(int); } @@ -2888,6 +2891,7 @@ package android.telephony { public final class SmsManager { method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public int checkSmsShortCodeDestination(String, String); + method public void sendMultipartTextMessage(@NonNull String, @NonNull String, @NonNull java.util.List<java.lang.String>, @Nullable java.util.List<android.app.PendingIntent>, @Nullable java.util.List<android.app.PendingIntent>, @NonNull String); field public static final int SMS_CATEGORY_FREE_SHORT_CODE = 1; // 0x1 field public static final int SMS_CATEGORY_NOT_SHORT_CODE = 0; // 0x0 field public static final int SMS_CATEGORY_POSSIBLE_PREMIUM_SHORT_CODE = 3; // 0x3 @@ -2895,9 +2899,14 @@ package android.telephony { field public static final int SMS_CATEGORY_STANDARD_SHORT_CODE = 2; // 0x2 } + public class SubscriptionManager { + method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setDefaultVoiceSubscriptionId(int); + } + public class TelephonyManager { method public int checkCarrierPrivilegesForPackage(String); method public int getCarrierIdListVersion(); + method @Nullable public static android.content.ComponentName getDefaultRespondViaMessageApplication(@NonNull android.content.Context, boolean); method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getLine1AlphaTag(); method @NonNull public String getNetworkCountryIso(int); method public android.util.Pair<java.lang.Integer,java.lang.Integer> getRadioHalVersion(); diff --git a/core/java/android/provider/CallLog.java b/core/java/android/provider/CallLog.java index 0973a6412384..3d54ba10ef0c 100644 --- a/core/java/android/provider/CallLog.java +++ b/core/java/android/provider/CallLog.java @@ -35,6 +35,7 @@ import android.provider.ContactsContract.CommonDataKinds.Callable; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.DataUsageFeedback; +import android.telecom.CallerInfo; import android.telecom.PhoneAccount; import android.telecom.PhoneAccountHandle; import android.telecom.TelecomManager; @@ -42,7 +43,6 @@ import android.telephony.PhoneNumberUtils; import android.text.TextUtils; import android.util.Log; -import android.telephony.CallerInfo; import com.android.internal.telephony.PhoneConstants; import java.util.List; diff --git a/telephony/java/android/telephony/CallerInfo.java b/telecomm/java/android/telecom/CallerInfo.java index f87ac503bbc5..a5d25e2ce4bb 100644 --- a/telephony/java/android/telephony/CallerInfo.java +++ b/telecomm/java/android/telecom/CallerInfo.java @@ -14,10 +14,9 @@ * limitations under the License. */ -package android.telephony; +package android.telecom; import android.annotation.Nullable; -import android.annotation.SystemApi; import android.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.ContentResolver; @@ -33,8 +32,10 @@ import android.provider.ContactsContract.Contacts; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.PhoneLookup; import android.provider.ContactsContract.RawContacts; +import android.telephony.PhoneNumberUtils; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; import android.text.TextUtils; -import android.util.Log; import com.android.i18n.phonenumbers.NumberParseException; import com.android.i18n.phonenumbers.PhoneNumberUtil; @@ -50,10 +51,9 @@ import java.util.Locale; * * {@hide} */ -@SystemApi public class CallerInfo { private static final String TAG = "CallerInfo"; - private static final boolean VDBG = Rlog.isLoggable(TAG, Log.VERBOSE); + private static final boolean VDBG = Log.VERBOSE; /** @hide */ public static final long USER_TYPE_CURRENT = 0; @@ -215,7 +215,7 @@ public class CallerInfo { info.contactExists = false; info.userType = USER_TYPE_CURRENT; - if (VDBG) Rlog.v(TAG, "getCallerInfo() based on cursor..."); + if (VDBG) Log.v(TAG, "getCallerInfo() based on cursor..."); if (cursor != null) { if (cursor.moveToFirst()) { @@ -263,7 +263,7 @@ public class CallerInfo { if (contactId != 0 && !Contacts.isEnterpriseContactId(contactId)) { info.contactIdOrZero = contactId; if (VDBG) { - Rlog.v(TAG, "==> got info.contactIdOrZero: " + info.contactIdOrZero); + Log.v(TAG, "==> got info.contactIdOrZero: " + info.contactIdOrZero); } } if (Contacts.isEnterpriseContactId(contactId)) { @@ -271,7 +271,7 @@ public class CallerInfo { } } else { // No valid columnIndex, so we can't look up person_id. - Rlog.w(TAG, "Couldn't find contact_id column for " + contactRef); + Log.w(TAG, "Couldn't find contact_id column for " + contactRef); // Watch out: this means that anything that depends on // person_id will be broken (like contact photo lookups in // the in-call UI, for example.) @@ -356,7 +356,7 @@ public class CallerInfo { info = getCallerInfo(context, contactRef, cr.query(contactRef, null, null, null, null)); } catch (RuntimeException re) { - Rlog.e(TAG, "Error getting caller info.", re); + Log.e(TAG, re, "Error getting caller info."); } } return info; @@ -376,7 +376,7 @@ public class CallerInfo { */ @UnsupportedAppUsage public static CallerInfo getCallerInfo(Context context, String number) { - if (VDBG) Rlog.v(TAG, "getCallerInfo() based on number..."); + if (VDBG) Log.v(TAG, "getCallerInfo() based on number..."); int subId = SubscriptionManager.getDefaultSubscriptionId(); return getCallerInfo(context, number, subId); @@ -407,8 +407,8 @@ public class CallerInfo { // shortcut and skip the query. if (PhoneNumberUtils.isLocalEmergencyNumber(context, number)) { return new CallerInfo().markAsEmergency(context); - } else if (PhoneNumberUtils.isVoiceMailNumber(subId, number)) { - return new CallerInfo().markAsVoiceMail(); + } else if (PhoneNumberUtils.isVoiceMailNumber(null, subId, number)) { + return new CallerInfo().markAsVoiceMail(context, subId); } Uri contactUri = Uri.withAppendedPath(PhoneLookup.ENTERPRISE_CONTENT_FILTER_URI, @@ -542,36 +542,20 @@ public class CallerInfo { } - /** - * Mark this CallerInfo as a voicemail call. The voicemail label - * is obtained from the telephony manager. Caller must hold the - * READ_PHONE_STATE permission otherwise the phoneNumber will be - * set to null. - * @return this instance. - */ - // TODO: As in the emergency number handling, we end up writing a - // string in the phone number field. - /* package */ CallerInfo markAsVoiceMail() { - - int subId = SubscriptionManager.getDefaultSubscriptionId(); - return markAsVoiceMail(subId); - - } - - /* package */ CallerInfo markAsVoiceMail(int subId) { + /* package */ CallerInfo markAsVoiceMail(Context context, int subId) { mIsVoiceMail = true; try { - String voiceMailLabel = TelephonyManager.getDefault().getVoiceMailAlphaTag(subId); - - phoneNumber = voiceMailLabel; + phoneNumber = context.getSystemService(TelephonyManager.class) + .createForSubscriptionId(subId) + .getVoiceMailAlphaTag(); } catch (SecurityException se) { // Should never happen: if this process does not have // permission to retrieve VM tag, it should not have // permission to retrieve VM number and would not call // this method. // Leave phoneNumber untouched. - Rlog.e(TAG, "Cannot access VoiceMail.", se); + Log.e(TAG, se, "Cannot access VoiceMail."); } // TODO: There is no voicemail picture? // FIXME: FIND ANOTHER ICON @@ -630,10 +614,10 @@ public class CallerInfo { // So instead, figure out the column to use for person_id by just // looking at the URI itself. - if (VDBG) Rlog.v(TAG, "- getColumnIndexForPersonId: contactRef URI = '" + if (VDBG) Log.v(TAG, "- getColumnIndexForPersonId: contactRef URI = '" + contactRef + "'..."); // Warning: Do not enable the following logging (due to ANR risk.) - // if (VDBG) Rlog.v(TAG, "- MIME type: " + // if (VDBG) Log.v(TAG, "- MIME type: " // + context.getContentResolver().getType(contactRef)); String url = contactRef.toString(); @@ -641,25 +625,25 @@ public class CallerInfo { if (url.startsWith("content://com.android.contacts/data/phones")) { // Direct lookup in the Phone table. // MIME type: Phone.CONTENT_ITEM_TYPE (= "vnd.android.cursor.item/phone_v2") - if (VDBG) Rlog.v(TAG, "'data/phones' URI; using RawContacts.CONTACT_ID"); + if (VDBG) Log.v(TAG, "'data/phones' URI; using RawContacts.CONTACT_ID"); columnName = RawContacts.CONTACT_ID; } else if (url.startsWith("content://com.android.contacts/data")) { // Direct lookup in the Data table. // MIME type: Data.CONTENT_TYPE (= "vnd.android.cursor.dir/data") - if (VDBG) Rlog.v(TAG, "'data' URI; using Data.CONTACT_ID"); + if (VDBG) Log.v(TAG, "'data' URI; using Data.CONTACT_ID"); // (Note Data.CONTACT_ID and RawContacts.CONTACT_ID are equivalent.) columnName = Data.CONTACT_ID; } else if (url.startsWith("content://com.android.contacts/phone_lookup")) { // Lookup in the PhoneLookup table, which provides "fuzzy matching" // for phone numbers. // MIME type: PhoneLookup.CONTENT_TYPE (= "vnd.android.cursor.dir/phone_lookup") - if (VDBG) Rlog.v(TAG, "'phone_lookup' URI; using PhoneLookup._ID"); + if (VDBG) Log.v(TAG, "'phone_lookup' URI; using PhoneLookup._ID"); columnName = PhoneLookup._ID; } else { - Rlog.w(TAG, "Unexpected prefix for contactRef '" + url + "'"); + Log.w(TAG, "Unexpected prefix for contactRef '" + url + "'"); } int columnIndex = (columnName != null) ? cursor.getColumnIndex(columnName) : -1; - if (VDBG) Rlog.v(TAG, "==> Using column '" + columnName + if (VDBG) Log.v(TAG, "==> Using column '" + columnName + "' (columnIndex = " + columnIndex + ") for person_id lookup..."); return columnIndex; } @@ -689,7 +673,7 @@ public class CallerInfo { * @hide */ public static String getGeoDescription(Context context, String number) { - if (VDBG) Rlog.v(TAG, "getGeoDescription('" + number + "')..."); + if (VDBG) Log.v(TAG, "getGeoDescription('" + number + "')..."); if (TextUtils.isEmpty(number)) { return null; @@ -702,18 +686,18 @@ public class CallerInfo { String countryIso = getCurrentCountryIso(context, locale); PhoneNumber pn = null; try { - if (VDBG) Rlog.v(TAG, "parsing '" + number + if (VDBG) Log.v(TAG, "parsing '" + number + "' for countryIso '" + countryIso + "'..."); pn = util.parse(number, countryIso); - if (VDBG) Rlog.v(TAG, "- parsed number: " + pn); + if (VDBG) Log.v(TAG, "- parsed number: " + pn); } catch (NumberParseException e) { - Rlog.w(TAG, "getGeoDescription: NumberParseException for incoming number '" - + Rlog.pii(TAG, number) + "'"); + Log.w(TAG, "getGeoDescription: NumberParseException for incoming number '" + + Log.pii(number) + "'"); } if (pn != null) { String description = geocoder.getDescriptionForNumber(pn, locale); - if (VDBG) Rlog.v(TAG, "- got description: '" + description + "'"); + if (VDBG) Log.v(TAG, "- got description: '" + description + "'"); return description; } else { return null; @@ -733,12 +717,12 @@ public class CallerInfo { if (country != null) { countryIso = country.getCountryIso(); } else { - Rlog.e(TAG, "CountryDetector.detectCountry() returned null."); + Log.e(TAG, new Exception(), "CountryDetector.detectCountry() returned null."); } } if (countryIso == null) { countryIso = locale.getCountry(); - Rlog.w(TAG, "No CountryDetector; falling back to countryIso based on locale: " + Log.w(TAG, "No CountryDetector; falling back to countryIso based on locale: " + countryIso); } return countryIso; diff --git a/telephony/java/android/telephony/CallerInfoAsyncQuery.java b/telecomm/java/android/telecom/CallerInfoAsyncQuery.java index 87a637668d44..f38b34e85d89 100644 --- a/telephony/java/android/telephony/CallerInfoAsyncQuery.java +++ b/telecomm/java/android/telecom/CallerInfoAsyncQuery.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.telephony; +package android.telecom; import android.app.ActivityManager; import android.content.AsyncQueryHandler; @@ -31,6 +31,8 @@ import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManager; import android.provider.ContactsContract.PhoneLookup; +import android.telephony.PhoneNumberUtils; +import android.telephony.SubscriptionManager; import android.text.TextUtils; import java.util.ArrayList; import java.util.List; @@ -100,12 +102,12 @@ public class CallerInfoAsyncQuery { */ static ContentResolver getCurrentProfileContentResolver(Context context) { - if (DBG) Rlog.d(LOG_TAG, "Trying to get current content resolver..."); + if (DBG) Log.d(LOG_TAG, "Trying to get current content resolver..."); final int currentUser = ActivityManager.getCurrentUser(); final int myUser = UserManager.get(context).getUserHandle(); - if (DBG) Rlog.d(LOG_TAG, "myUser=" + myUser + "currentUser=" + currentUser); + if (DBG) Log.d(LOG_TAG, "myUser=" + myUser + "currentUser=" + currentUser); if (myUser != currentUser) { final Context otherContext; @@ -114,7 +116,7 @@ public class CallerInfoAsyncQuery { /* flags =*/ 0, UserHandle.of(currentUser)); return otherContext.getContentResolver(); } catch (NameNotFoundException e) { - Rlog.e(LOG_TAG, "Can't find self package", e); + Log.e(LOG_TAG, e, "Can't find self package"); // Fall back to the primary user. } } @@ -179,13 +181,13 @@ public class CallerInfoAsyncQuery { // However, if there is any code that this Handler calls (such as in // super.handleMessage) that DOES place unexpected messages on the // queue, then we need pass these messages on. - Rlog.i(LOG_TAG, "Unexpected command (CookieWrapper is null): " + msg.what + + Log.i(LOG_TAG, "Unexpected command (CookieWrapper is null): " + msg.what + " ignored by CallerInfoWorkerHandler, passing onto parent."); super.handleMessage(msg); } else { - Rlog.d(LOG_TAG, "Processing event: " + cw.event + " token (arg1): " + msg.arg1 + + Log.d(LOG_TAG, "Processing event: " + cw.event + " token (arg1): " + msg.arg1 + " command: " + msg.what + " query URI: " + sanitizeUriToString(args.uri)); switch (cw.event) { @@ -226,7 +228,7 @@ public class CallerInfoAsyncQuery { cw.geoDescription = CallerInfo.getGeoDescription(mContext, cw.number); final long duration = SystemClock.elapsedRealtime() - startTimeMillis; if (duration > 500) { - if (DBG) Rlog.d(LOG_TAG, "[handleGeoDescription]" + + if (DBG) Log.d(LOG_TAG, "[handleGeoDescription]" + "Spends long time to retrieve Geo description: " + duration); } } @@ -263,7 +265,7 @@ public class CallerInfoAsyncQuery { */ @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { - Rlog.d(LOG_TAG, "##### onQueryComplete() ##### query complete for token: " + token); + Log.d(LOG_TAG, "##### onQueryComplete() ##### query complete for token: " + token); //get the cookie and notify the listener. CookieWrapper cw = (CookieWrapper) cookie; @@ -272,7 +274,7 @@ public class CallerInfoAsyncQuery { // from within this code. // However, if there is any code that calls this method, we should // check the parameters to make sure they're viable. - Rlog.i(LOG_TAG, "Cookie is null, ignoring onQueryComplete() request."); + Log.i(LOG_TAG, "Cookie is null, ignoring onQueryComplete() request."); if (cursor != null) { cursor.close(); } @@ -321,16 +323,16 @@ public class CallerInfoAsyncQuery { // comments at the top of CallerInfo class). mCallerInfo = new CallerInfo().markAsEmergency(mContext); } else if (cw.event == EVENT_VOICEMAIL_NUMBER) { - mCallerInfo = new CallerInfo().markAsVoiceMail(cw.subId); + mCallerInfo = new CallerInfo().markAsVoiceMail(mContext, cw.subId); } else { mCallerInfo = CallerInfo.getCallerInfo(mContext, mQueryUri, cursor); - if (DBG) Rlog.d(LOG_TAG, "==> Got mCallerInfo: " + mCallerInfo); + if (DBG) Log.d(LOG_TAG, "==> Got mCallerInfo: " + mCallerInfo); CallerInfo newCallerInfo = CallerInfo.doSecondaryLookupIfNecessary( mContext, cw.number, mCallerInfo); if (newCallerInfo != mCallerInfo) { mCallerInfo = newCallerInfo; - if (DBG) Rlog.d(LOG_TAG, "#####async contact look up with numeric username" + if (DBG) Log.d(LOG_TAG, "#####async contact look up with numeric username" + mCallerInfo); } @@ -346,7 +348,7 @@ public class CallerInfoAsyncQuery { // the geo description, so it would be unnecessary to query it. if (ENABLE_UNKNOWN_NUMBER_GEO_DESCRIPTION) { if (TextUtils.isEmpty(mCallerInfo.getName())) { - if (DBG) Rlog.d(LOG_TAG, "start querying geo description"); + if (DBG) Log.d(LOG_TAG, "start querying geo description"); cw.event = EVENT_GET_GEO_DESCRIPTION; startQuery(token, cw, null, null, null, null, null); return; @@ -354,7 +356,7 @@ public class CallerInfoAsyncQuery { } } - if (DBG) Rlog.d(LOG_TAG, "constructing CallerInfo object for token: " + token); + if (DBG) Log.d(LOG_TAG, "constructing CallerInfo object for token: " + token); //notify that we can clean up the queue after this. CookieWrapper endMarker = new CookieWrapper(); @@ -367,14 +369,14 @@ public class CallerInfoAsyncQuery { mPendingListenerCallbacks.add(new Runnable() { @Override public void run() { - if (DBG) Rlog.d(LOG_TAG, "notifying listener: " + if (DBG) Log.d(LOG_TAG, "notifying listener: " + cw.listener.getClass().toString() + " for token: " + token + mCallerInfo); cw.listener.onQueryComplete(token, cw.cookie, mCallerInfo); } }); } else { - Rlog.w(LOG_TAG, "There is no listener to notify for this query."); + Log.w(LOG_TAG, "There is no listener to notify for this query."); } if (cursor != null) { @@ -399,7 +401,7 @@ public class CallerInfoAsyncQuery { CallerInfoAsyncQuery c = new CallerInfoAsyncQuery(); c.allocate(context, contactRef); - if (DBG) Rlog.d(LOG_TAG, "starting query for URI: " + contactRef + " handler: " + c.toString()); + if (DBG) Log.d(LOG_TAG, "starting query for URI: " + contactRef + " handler: " + c.toString()); //create cookieWrapper, start query CookieWrapper cw = new CookieWrapper(); @@ -445,9 +447,9 @@ public class CallerInfoAsyncQuery { OnQueryCompleteListener listener, Object cookie, int subId) { if (DBG) { - Rlog.d(LOG_TAG, "##### CallerInfoAsyncQuery startQuery()... #####"); - Rlog.d(LOG_TAG, "- number: " + /*number*/ "xxxxxxx"); - Rlog.d(LOG_TAG, "- cookie: " + cookie); + Log.d(LOG_TAG, "##### CallerInfoAsyncQuery startQuery()... #####"); + Log.d(LOG_TAG, "- number: " + /*number*/ "xxxxxxx"); + Log.d(LOG_TAG, "- cookie: " + cookie); } // Construct the URI object and query params, and start the query. @@ -459,7 +461,7 @@ public class CallerInfoAsyncQuery { .build(); if (DBG) { - Rlog.d(LOG_TAG, "==> contactRef: " + sanitizeUriToString(contactRef)); + Log.d(LOG_TAG, "==> contactRef: " + sanitizeUriToString(contactRef)); } CallerInfoAsyncQuery c = new CallerInfoAsyncQuery(); @@ -496,8 +498,8 @@ public class CallerInfoAsyncQuery { */ public void addQueryListener(int token, OnQueryCompleteListener listener, Object cookie) { - if (DBG) Rlog.d(LOG_TAG, "adding listener to query: " + sanitizeUriToString(mHandler.mQueryUri) + - " handler: " + mHandler.toString()); + if (DBG) Log.d(LOG_TAG, "adding listener to query: " + + sanitizeUriToString(mHandler.mQueryUri) + " handler: " + mHandler.toString()); //create cookieWrapper, add query request to end of queue. CookieWrapper cw = new CookieWrapper(); diff --git a/telephony/java/android/telephony/DisconnectCause.java b/telephony/java/android/telephony/DisconnectCause.java index aa7e21a82500..85110c22aa18 100644 --- a/telephony/java/android/telephony/DisconnectCause.java +++ b/telephony/java/android/telephony/DisconnectCause.java @@ -16,6 +16,7 @@ package android.telephony; +import android.annotation.NonNull; import android.annotation.SystemApi; import android.annotation.UnsupportedAppUsage; @@ -369,7 +370,7 @@ public final class DisconnectCause { * @hide */ @UnsupportedAppUsage - public static String toString(int cause) { + public static @NonNull String toString(int cause) { switch (cause) { case NOT_DISCONNECTED: return "NOT_DISCONNECTED"; diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java index af3ba5e44158..4a1bc1f6343f 100644 --- a/telephony/java/android/telephony/PhoneNumberUtils.java +++ b/telephony/java/android/telephony/PhoneNumberUtils.java @@ -16,12 +16,12 @@ package android.telephony; -import com.android.i18n.phonenumbers.NumberParseException; -import com.android.i18n.phonenumbers.PhoneNumberUtil; -import com.android.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; -import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber; +import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_IDP_STRING; import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SystemApi; import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.content.Context; @@ -42,7 +42,10 @@ import android.text.TextUtils; import android.text.style.TtsSpan; import android.util.SparseIntArray; -import static com.android.internal.telephony.TelephonyProperties.PROPERTY_OPERATOR_IDP_STRING; +import com.android.i18n.phonenumbers.NumberParseException; +import com.android.i18n.phonenumbers.PhoneNumberUtil; +import com.android.i18n.phonenumbers.PhoneNumberUtil.PhoneNumberFormat; +import com.android.i18n.phonenumbers.Phonenumber.PhoneNumber; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -2247,8 +2250,10 @@ public class PhoneNumberUtils { * to read the VM number. * @hide */ - @UnsupportedAppUsage - public static boolean isVoiceMailNumber(Context context, int subId, String number) { + @SystemApi + @TestApi + public static boolean isVoiceMailNumber(@NonNull Context context, int subId, + @Nullable String number) { String vmNumber, mdn; try { final TelephonyManager tm; @@ -2734,8 +2739,9 @@ public class PhoneNumberUtils { * @param number * @return true if number contains @ */ - @UnsupportedAppUsage - public static boolean isUriNumber(String number) { + @SystemApi + @TestApi + public static boolean isUriNumber(@Nullable String number) { // Note we allow either "@" or "%40" to indicate a URI, in case // the passed-in string is URI-escaped. (Neither "@" nor "%40" // will ever be found in a legal PSTN number.) @@ -2752,8 +2758,9 @@ public class PhoneNumberUtils { * * @hide */ - @UnsupportedAppUsage - public static String getUsernameFromUriNumber(String number) { + @SystemApi + @TestApi + public static @NonNull String getUsernameFromUriNumber(@NonNull String number) { // The delimiter between username and domain name can be // either "@" or "%40" (the URI-escaped equivalent.) int delimiterIndex = number.indexOf('@'); diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java index bc2831b26c7b..54e87afb2da9 100644 --- a/telephony/java/android/telephony/SmsManager.java +++ b/telephony/java/android/telephony/SmsManager.java @@ -909,10 +909,12 @@ public final class SmsManager { * {@link ActivityThread#currentPackageName()} is null. * @hide */ - public void sendMultipartTextMessageExternal( - String destinationAddress, String scAddress, ArrayList<String> parts, - ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents, - String packageName) { + @SystemApi + @TestApi + public void sendMultipartTextMessage( + @NonNull String destinationAddress, @NonNull String scAddress, + @NonNull List<String> parts, @Nullable List<PendingIntent> sentIntents, + @Nullable List<PendingIntent> deliveryIntents, @NonNull String packageName) { sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents, deliveryIntents, true /* persistMessage*/, ActivityThread.currentPackageName() == null diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 3bd6578f337e..b35549ead969 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -31,6 +31,7 @@ import android.annotation.SdkConstant.SdkConstantType; import android.annotation.SuppressAutoDoc; import android.annotation.SystemApi; import android.annotation.SystemService; +import android.annotation.TestApi; import android.annotation.UnsupportedAppUsage; import android.app.BroadcastOptions; import android.app.PendingIntent; @@ -1868,13 +1869,27 @@ public class SubscriptionManager { return subId; } - /** @hide */ - public void setDefaultVoiceSubId(int subId) { - if (VDBG) logd("setDefaultVoiceSubId sub id = " + subId); + /** + * Sets the system's default voice subscription id. + * + * On a data-only device, this is a no-op. + * + * May throw a {@link RuntimeException} if the provided subscription id is equal to + * {@link SubscriptionManager#DEFAULT_SUBSCRIPTION_ID} + * + * @param subscriptionId A valid subscription ID to set as the system default, or + * {@link SubscriptionManager#INVALID_SUBSCRIPTION_ID} + * @hide + */ + @SystemApi + @TestApi + @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE) + public void setDefaultVoiceSubscriptionId(int subscriptionId) { + if (VDBG) logd("setDefaultVoiceSubId sub id = " + subscriptionId); try { ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); if (iSub != null) { - iSub.setDefaultVoiceSubId(subId); + iSub.setDefaultVoiceSubId(subscriptionId); } } catch (RemoteException ex) { // ignore it @@ -1882,6 +1897,15 @@ public class SubscriptionManager { } /** + * Same as {@link #setDefaultVoiceSubscriptionId(int)}, but preserved for backwards + * compatibility. + * @hide + */ + public void setDefaultVoiceSubId(int subId) { + setDefaultVoiceSubscriptionId(subId); + } + + /** * Return the SubscriptionInfo for default voice subscription. * * Will return null on data only devices, or on error. diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index 63cd51189de9..c26e5b54799d 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -38,6 +38,7 @@ import android.annotation.UnsupportedAppUsage; import android.annotation.WorkerThread; import android.app.ActivityThread; import android.app.PendingIntent; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; @@ -97,6 +98,7 @@ import com.android.internal.telephony.IUpdateAvailableNetworksCallback; import com.android.internal.telephony.OperatorInfo; import com.android.internal.telephony.PhoneConstants; import com.android.internal.telephony.RILConstants; +import com.android.internal.telephony.SmsApplication; import com.android.internal.telephony.TelephonyProperties; import dalvik.system.VMRuntime; @@ -429,6 +431,25 @@ public class TelephonyManager { getActiveModemCount()); } + /** + * Gets the maximum number of SIMs that can be active, based on the device's multisim + * configuration. + * @return 1 for single-SIM, DSDS, and TSTS devices. 2 for DSDA devices. + * @hide + */ + @SystemApi + public int getMaxNumberOfSimultaneouslyActiveSims() { + switch (getMultiSimConfiguration()) { + case UNKNOWN: + case DSDS: + case TSTS: + return 1; + case DSDA: + return 2; + } + return 1; + } + /** {@hide} */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) public static TelephonyManager from(Context context) { @@ -9284,6 +9305,21 @@ public class TelephonyManager { } /** + * Gets the default Respond Via Message application + * @param context context from the calling app + * @param updateIfNeeded update the default app if there is no valid default app configured. + * @return component name of the app and class to direct Respond Via Message intent to, or + * {@code null} if the functionality is not supported. + * @hide + */ + @SystemApi + @TestApi + public static @Nullable ComponentName getDefaultRespondViaMessageApplication( + @NonNull Context context, boolean updateIfNeeded) { + return SmsApplication.getDefaultRespondViaMessageApplication(context, updateIfNeeded); + } + + /** * Set the alphabetic name of current registered operator. * @param name the alphabetic name of current registered operator. * @hide @@ -9385,7 +9421,7 @@ public class TelephonyManager { * @hide */ @UnsupportedAppUsage - public int getSubIdForPhoneAccount(PhoneAccount phoneAccount) { + public int getSubIdForPhoneAccount(@Nullable PhoneAccount phoneAccount) { int retval = SubscriptionManager.INVALID_SUBSCRIPTION_ID; try { ITelephony service = getITelephony(); |