Merge "Guard against SecurityException in QuickContact" into ub-contactsdialer-i-dev
diff --git a/src/com/android/contacts/CallUtil.java b/src/com/android/contacts/CallUtil.java
index d83b63d..ddde01c 100644
--- a/src/com/android/contacts/CallUtil.java
+++ b/src/com/android/contacts/CallUtil.java
@@ -116,13 +116,6 @@
}
/**
- * @return Uri that directly dials a user's voicemail inbox.
- */
- public static Uri getVoicemailUri() {
- return Uri.fromParts(PhoneAccount.SCHEME_VOICEMAIL, "", null);
- }
-
- /**
* Determines if video calling is available, and if so whether presence checking is available
* as well.
*
@@ -166,23 +159,12 @@
return VIDEO_CALLING_DISABLED;
} catch (SecurityException e) {
FeedbackHelper.sendFeedback(context, TAG,
- "Security exception when querying intent activities", e);
+ "Security exception when getting call capable phone accounts", e);
return VIDEO_CALLING_DISABLED;
}
}
/**
- * Determines if one of the call capable phone accounts defined supports video calling.
- *
- * @param context The context.
- * @return {@code true} if one of the call capable phone accounts supports video calling,
- * {@code false} otherwise.
- */
- public static boolean isVideoEnabled(Context context) {
- return (getVideoCallingAvailability(context) & VIDEO_CALLING_ENABLED) != 0;
- }
-
- /**
* Determines if one of the call capable phone accounts defined supports calling with a subject
* specified.
*
@@ -201,13 +183,20 @@
return false;
}
- List<PhoneAccountHandle> accountHandles = telecommMgr.getCallCapablePhoneAccounts();
- for (PhoneAccountHandle accountHandle : accountHandles) {
- PhoneAccount account = telecommMgr.getPhoneAccount(accountHandle);
- if (account != null && account.hasCapabilities(PhoneAccount.CAPABILITY_CALL_SUBJECT)) {
- return true;
+ try {
+ List<PhoneAccountHandle> accountHandles = telecommMgr.getCallCapablePhoneAccounts();
+ for (PhoneAccountHandle accountHandle : accountHandles) {
+ PhoneAccount account = telecommMgr.getPhoneAccount(accountHandle);
+ if (account != null && account.hasCapabilities(PhoneAccount.CAPABILITY_CALL_SUBJECT)) {
+ return true;
+ }
}
+ return false;
+ } catch (SecurityException e) {
+ FeedbackHelper.sendFeedback(context, TAG,
+ "Security exception when getting call capable phone accounts", e);
+ return false;
}
- return false;
+
}
}
diff --git a/src/com/android/contacts/compat/telecom/TelecomManagerCompat.java b/src/com/android/contacts/compat/telecom/TelecomManagerCompat.java
index fbbc589..881c1a4 100644
--- a/src/com/android/contacts/compat/telecom/TelecomManagerCompat.java
+++ b/src/com/android/contacts/compat/telecom/TelecomManagerCompat.java
@@ -17,25 +17,15 @@
import android.app.Activity;
import android.content.Intent;
-import android.net.Uri;
import android.support.annotation.Nullable;
-import android.telecom.PhoneAccount;
-import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
-import android.telephony.PhoneNumberUtils;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
import com.android.contacts.compat.CompatUtils;
-import java.util.ArrayList;
-import java.util.List;
-
/**
* Compatibility class for {@link android.telecom.TelecomManager}.
*/
public class TelecomManagerCompat {
- public static final String TELECOM_MANAGER_CLASS = "android.telecom.TelecomManager";
/**
* Places a new outgoing call to the provided address using the system telecom service with
* the specified intent.
@@ -55,226 +45,4 @@
}
activity.startActivityForResult(intent, 0);
}
-
- /**
- * Get the URI for running an adn query.
- *
- * @param telecomManager the {@link TelecomManager} used for method calls, if possible.
- * @param accountHandle The handle for the account to derive an adn query URI for or
- * {@code null} to return a URI which will use the default account.
- * @return The URI (with the content:// scheme) specific to the specified {@link PhoneAccount}
- * for the the content retrieve.
- */
- public static Uri getAdnUriForPhoneAccount(@Nullable TelecomManager telecomManager,
- PhoneAccountHandle accountHandle) {
- if (telecomManager != null && (CompatUtils.isMarshmallowCompatible()
- || CompatUtils.isMethodAvailable(TELECOM_MANAGER_CLASS, "getAdnUriForPhoneAccount",
- PhoneAccountHandle.class))) {
- return telecomManager.getAdnUriForPhoneAccount(accountHandle);
- }
- return Uri.parse("content://icc/adn");
- }
-
- /**
- * Returns a list of {@link PhoneAccountHandle}s which can be used to make and receive phone
- * calls. The returned list includes only those accounts which have been explicitly enabled
- * by the user.
- *
- * @param telecomManager the {@link TelecomManager} used for method calls, if possible.
- * @return A list of PhoneAccountHandle objects.
- */
- public static List<PhoneAccountHandle> getCallCapablePhoneAccounts(
- @Nullable TelecomManager telecomManager) {
- if (telecomManager != null && (CompatUtils.isMarshmallowCompatible()
- || CompatUtils.isMethodAvailable(TELECOM_MANAGER_CLASS,
- "getCallCapablePhoneAccounts"))) {
- return telecomManager.getCallCapablePhoneAccounts();
- }
- return new ArrayList<>();
- }
-
- /**
- * Used to determine the currently selected default dialer package.
- *
- * @param telecomManager the {@link TelecomManager} used for method calls, if possible.
- * @return package name for the default dialer package or null if no package has been
- * selected as the default dialer.
- */
- @Nullable
- public static String getDefaultDialerPackage(@Nullable TelecomManager telecomManager) {
- if (telecomManager != null && CompatUtils.isDefaultDialerCompatible()) {
- return telecomManager.getDefaultDialerPackage();
- }
- return null;
- }
-
- /**
- * Return the {@link PhoneAccount} which will be used to place outgoing calls to addresses with
- * the specified {@code uriScheme}. This PhoneAccount will always be a member of the
- * list which is returned from invoking {@link TelecomManager#getCallCapablePhoneAccounts()}.
- * The specific account returned depends on the following priorities:
- *
- * 1. If the user-selected default PhoneAccount supports the specified scheme, it will
- * be returned.
- * 2. If there exists only one PhoneAccount that supports the specified scheme, it
- * will be returned.
- *
- * If no PhoneAccount fits the criteria above, this method will return {@code null}.
- *
- * @param telecomManager the {@link TelecomManager} used for method calls, if possible.
- * @param uriScheme The URI scheme.
- * @return The {@link PhoneAccountHandle} corresponding to the account to be used.
- */
- @Nullable
- public static PhoneAccountHandle getDefaultOutgoingPhoneAccount(
- @Nullable TelecomManager telecomManager, @Nullable String uriScheme) {
- if (telecomManager != null && (CompatUtils.isMarshmallowCompatible()
- || CompatUtils.isMethodAvailable(TELECOM_MANAGER_CLASS,
- "getDefaultOutgoingPhoneAccount", String.class))) {
- return telecomManager.getDefaultOutgoingPhoneAccount(uriScheme);
- }
- return null;
- }
-
- /**
- * Return the line 1 phone number for given phone account.
- *
- * @param telecomManager the {@link TelecomManager} to use in the event that
- * {@link TelecomManager#getLine1Number(PhoneAccountHandle)} is available
- * @param telephonyManager the {@link TelephonyManager} to use if TelecomManager#getLine1Number
- * is unavailable
- * @param phoneAccountHandle the phoneAccountHandle upon which to check the line one number
- * @return the line one number
- */
- @Nullable
- public static String getLine1Number(@Nullable TelecomManager telecomManager,
- @Nullable TelephonyManager telephonyManager,
- @Nullable PhoneAccountHandle phoneAccountHandle) {
- if (telecomManager != null && CompatUtils.isMarshmallowCompatible()) {
- return telecomManager.getLine1Number(phoneAccountHandle);
- }
- if (telephonyManager != null) {
- return telephonyManager.getLine1Number();
- }
- return null;
- }
-
- /**
- * Return whether a given phone number is the configured voicemail number for a
- * particular phone account.
- *
- * @param telecomManager the {@link TelecomManager} to use for checking the number.
- * @param accountHandle The handle for the account to check the voicemail number against
- * @param number The number to look up.
- */
- public static boolean isVoiceMailNumber(@Nullable TelecomManager telecomManager,
- @Nullable PhoneAccountHandle accountHandle, @Nullable String number) {
- if (telecomManager != null && (CompatUtils.isMarshmallowCompatible()
- || CompatUtils.isMethodAvailable(TELECOM_MANAGER_CLASS, "isVoiceMailNumber",
- PhoneAccountHandle.class, String.class))) {
- return telecomManager.isVoiceMailNumber(accountHandle, number);
- }
- return PhoneNumberUtils.isVoiceMailNumber(number);
- }
-
- /**
- * Return the {@link PhoneAccount} for a specified {@link PhoneAccountHandle}. Object includes
- * resources which can be used in a user interface.
- *
- * @param telecomManager the {@link TelecomManager} used for method calls, if possible.
- * @param account The {@link PhoneAccountHandle}.
- * @return The {@link PhoneAccount} object or null if it doesn't exist.
- */
- @Nullable
- public static PhoneAccount getPhoneAccount(@Nullable TelecomManager telecomManager,
- @Nullable PhoneAccountHandle accountHandle) {
- if (telecomManager != null && (CompatUtils.isMethodAvailable(
- TELECOM_MANAGER_CLASS, "getPhoneAccount", PhoneAccountHandle.class))) {
- return telecomManager.getPhoneAccount(accountHandle);
- }
- return null;
- }
-
- /**
- * Return the voicemail number for a given phone account.
- *
- * @param telecomManager The {@link TelecomManager} object to use for retrieving the voicemail
- * number if accountHandle is specified.
- * @param telephonyManager The {@link TelephonyManager} object to use for retrieving the
- * voicemail number if accountHandle is null.
- * @param accountHandle The handle for the phone account.
- * @return The voicemail number for the phone account, and {@code null} if one has not been
- * configured.
- */
- @Nullable
- public static String getVoiceMailNumber(@Nullable TelecomManager telecomManager,
- @Nullable TelephonyManager telephonyManager,
- @Nullable PhoneAccountHandle accountHandle) {
- if (telecomManager != null && (CompatUtils.isMethodAvailable(
- TELECOM_MANAGER_CLASS, "getVoiceMailNumber", PhoneAccountHandle.class))) {
- return telecomManager.getVoiceMailNumber(accountHandle);
- } else if (telephonyManager != null){
- return telephonyManager.getVoiceMailNumber();
- }
- return null;
- }
-
- /**
- * Processes the specified dial string as an MMI code.
- * MMI codes are any sequence of characters entered into the dialpad that contain a "*" or "#".
- * Some of these sequences launch special behavior through handled by Telephony.
- *
- * @param telecomManager The {@link TelecomManager} object to use for handling MMI.
- * @param dialString The digits to dial.
- * @return {@code true} if the digits were processed as an MMI code, {@code false} otherwise.
- */
- public static boolean handleMmi(@Nullable TelecomManager telecomManager,
- @Nullable String dialString, @Nullable PhoneAccountHandle accountHandle) {
- if (telecomManager == null || TextUtils.isEmpty(dialString)) {
- return false;
- }
- if (CompatUtils.isMarshmallowCompatible()) {
- return telecomManager.handleMmi(dialString, accountHandle);
- }
-
- Object handleMmiResult = CompatUtils.invokeMethod(
- telecomManager,
- "handleMmi",
- new Class<?>[] {PhoneAccountHandle.class, String.class},
- new Object[] {accountHandle, dialString});
- if (handleMmiResult != null) {
- return (boolean) handleMmiResult;
- }
-
- return telecomManager.handleMmi(dialString);
- }
-
- /**
- * Silences the ringer if a ringing call exists. Noop if {@link TelecomManager#silenceRinger()}
- * is unavailable.
- *
- * @param telecomManager the TelecomManager to use to silence the ringer.
- */
- public static void silenceRinger(@Nullable TelecomManager telecomManager) {
- if (telecomManager != null && (CompatUtils.isMarshmallowCompatible() || CompatUtils
- .isMethodAvailable(TELECOM_MANAGER_CLASS, "silenceRinger"))) {
- telecomManager.silenceRinger();
- }
- }
-
- /**
- * Returns the current SIM call manager. Apps must be prepared for this method to return null,
- * indicating that there currently exists no registered SIM call manager.
- *
- * @param telecomManager the {@link TelecomManager} to use to fetch the SIM call manager.
- * @return The phone account handle of the current sim call manager.
- */
- @Nullable
- public static PhoneAccountHandle getSimCallManager(TelecomManager telecomManager) {
- if (telecomManager != null && (CompatUtils.isMarshmallowCompatible() || CompatUtils
- .isMethodAvailable(TELECOM_MANAGER_CLASS, "getSimCallManager"))) {
- return telecomManager.getSimCallManager();
- }
- return null;
- }
}