From 24e18336178f1f166c873dda880c531babf3017b Mon Sep 17 00:00:00 2001 From: Tyler Gunn Date: Fri, 10 Feb 2017 09:42:49 -0800 Subject: [PATCH] Support for showing self-managed calls in IncallService. Also added new isInManagedCall TelecomManager API, used to determine if there are ongoing managed calls only. Test: Manual, cts Bug: 34159263 Change-Id: Ib8020617607ccb433c2eee9b9d5a2c929665214b --- api/current.txt | 3 ++ api/system-current.txt | 3 ++ api/test-current.txt | 3 ++ telecomm/java/android/telecom/Call.java | 9 +++- .../java/android/telecom/TelecomManager.java | 53 ++++++++++++++++++- .../internal/telecom/ITelecomService.aidl | 5 ++ 6 files changed, 73 insertions(+), 3 deletions(-) diff --git a/api/current.txt b/api/current.txt index 72351443ea1e4..3e10bbfac819c 100644 --- a/api/current.txt +++ b/api/current.txt @@ -36671,6 +36671,7 @@ package android.telecom { field public static final int PROPERTY_HAS_CDMA_VOICE_PRIVACY = 128; // 0x80 field public static final int PROPERTY_HIGH_DEF_AUDIO = 16; // 0x10 field public static final int PROPERTY_IS_EXTERNAL_CALL = 64; // 0x40 + field public static final int PROPERTY_SELF_MANAGED = 256; // 0x100 field public static final int PROPERTY_WIFI = 8; // 0x8 } @@ -37227,6 +37228,7 @@ package android.telecom { method public boolean handleMmi(java.lang.String); method public boolean handleMmi(java.lang.String, android.telecom.PhoneAccountHandle); method public boolean isInCall(); + method public boolean isInManagedCall(); method public boolean isIncomingCallPermitted(android.telecom.PhoneAccountHandle); method public boolean isOutgoingCallPermitted(android.telecom.PhoneAccountHandle); method public boolean isVoiceMailNumber(android.telecom.PhoneAccountHandle, java.lang.String); @@ -37262,6 +37264,7 @@ package android.telecom { field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS"; field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE"; field public static final java.lang.String METADATA_INCLUDE_EXTERNAL_CALLS = "android.telecom.INCLUDE_EXTERNAL_CALLS"; + field public static final java.lang.String METADATA_INCLUDE_SELF_MANAGED_CALLS = "android.telecom.INCLUDE_SELF_MANAGED_CALLS"; field public static final java.lang.String METADATA_IN_CALL_SERVICE_RINGING = "android.telecom.IN_CALL_SERVICE_RINGING"; field public static final java.lang.String METADATA_IN_CALL_SERVICE_UI = "android.telecom.IN_CALL_SERVICE_UI"; field public static final int PRESENTATION_ALLOWED = 1; // 0x1 diff --git a/api/system-current.txt b/api/system-current.txt index e1a45685b0868..c6226b00cf0da 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -39640,6 +39640,7 @@ package android.telecom { field public static final int PROPERTY_HAS_CDMA_VOICE_PRIVACY = 128; // 0x80 field public static final int PROPERTY_HIGH_DEF_AUDIO = 16; // 0x10 field public static final int PROPERTY_IS_EXTERNAL_CALL = 64; // 0x40 + field public static final int PROPERTY_SELF_MANAGED = 256; // 0x100 field public static final int PROPERTY_WIFI = 8; // 0x8 } @@ -40388,6 +40389,7 @@ package android.telecom { method public boolean handleMmi(java.lang.String); method public boolean handleMmi(java.lang.String, android.telecom.PhoneAccountHandle); method public boolean isInCall(); + method public boolean isInManagedCall(); method public boolean isIncomingCallPermitted(android.telecom.PhoneAccountHandle); method public boolean isOutgoingCallPermitted(android.telecom.PhoneAccountHandle); method public boolean isRinging(); @@ -40430,6 +40432,7 @@ package android.telecom { field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS"; field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE"; field public static final java.lang.String METADATA_INCLUDE_EXTERNAL_CALLS = "android.telecom.INCLUDE_EXTERNAL_CALLS"; + field public static final java.lang.String METADATA_INCLUDE_SELF_MANAGED_CALLS = "android.telecom.INCLUDE_SELF_MANAGED_CALLS"; field public static final java.lang.String METADATA_IN_CALL_SERVICE_RINGING = "android.telecom.IN_CALL_SERVICE_RINGING"; field public static final java.lang.String METADATA_IN_CALL_SERVICE_UI = "android.telecom.IN_CALL_SERVICE_UI"; field public static final int PRESENTATION_ALLOWED = 1; // 0x1 diff --git a/api/test-current.txt b/api/test-current.txt index a9af7f3b2ab0c..c6508721ab903 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -36753,6 +36753,7 @@ package android.telecom { field public static final int PROPERTY_HAS_CDMA_VOICE_PRIVACY = 128; // 0x80 field public static final int PROPERTY_HIGH_DEF_AUDIO = 16; // 0x10 field public static final int PROPERTY_IS_EXTERNAL_CALL = 64; // 0x40 + field public static final int PROPERTY_SELF_MANAGED = 256; // 0x100 field public static final int PROPERTY_WIFI = 8; // 0x8 } @@ -37309,6 +37310,7 @@ package android.telecom { method public boolean handleMmi(java.lang.String); method public boolean handleMmi(java.lang.String, android.telecom.PhoneAccountHandle); method public boolean isInCall(); + method public boolean isInManagedCall(); method public boolean isIncomingCallPermitted(android.telecom.PhoneAccountHandle); method public boolean isOutgoingCallPermitted(android.telecom.PhoneAccountHandle); method public boolean isVoiceMailNumber(android.telecom.PhoneAccountHandle, java.lang.String); @@ -37344,6 +37346,7 @@ package android.telecom { field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS"; field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE"; field public static final java.lang.String METADATA_INCLUDE_EXTERNAL_CALLS = "android.telecom.INCLUDE_EXTERNAL_CALLS"; + field public static final java.lang.String METADATA_INCLUDE_SELF_MANAGED_CALLS = "android.telecom.INCLUDE_SELF_MANAGED_CALLS"; field public static final java.lang.String METADATA_IN_CALL_SERVICE_RINGING = "android.telecom.IN_CALL_SERVICE_RINGING"; field public static final java.lang.String METADATA_IN_CALL_SERVICE_UI = "android.telecom.IN_CALL_SERVICE_UI"; field public static final int PRESENTATION_ALLOWED = 1; // 0x1 diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index c69b7c2771acd..f129c33936c9a 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -312,8 +312,15 @@ public final class Call { */ public static final int PROPERTY_HAS_CDMA_VOICE_PRIVACY = 0x00000080; + /** + * Indicates that the call is from a self-managed {@link ConnectionService}. + *

+ * See also {@link Connection#PROPERTY_SELF_MANAGED} + */ + public static final int PROPERTY_SELF_MANAGED = 0x00000100; + //****************************************************************************************** - // Next PROPERTY value: 0x00000100 + // Next PROPERTY value: 0x00000200 //****************************************************************************************** private final String mTelecomCallId; diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java index 96070b88a1a62..5ce9c50788b4a 100644 --- a/telecomm/java/android/telecom/TelecomManager.java +++ b/telecomm/java/android/telecom/TelecomManager.java @@ -355,6 +355,24 @@ public class TelecomManager { public static final String METADATA_INCLUDE_EXTERNAL_CALLS = "android.telecom.INCLUDE_EXTERNAL_CALLS"; + /** + * A boolean meta-data value indicating whether an {@link InCallService} wants to be informed of + * calls which have the {@link Call.Details#PROPERTY_SELF_MANAGED} property. A self-managed + * call is one which originates from a self-managed {@link ConnectionService} which has chosen + * to implement its own call user interface. An {@link InCallService} implementation which + * would like to be informed of external calls should set this meta-data to {@code true} in the + * manifest registration of their {@link InCallService}. By default, the {@link InCallService} + * will NOT be informed about self-managed calls. + *

+ * An {@link InCallService} which receives self-managed calls is free to view and control the + * state of calls in the self-managed {@link ConnectionService}. An example use-case is + * exposing these calls to a wearable or automotive device via its companion app. + *

+ * See also {@link Connection#PROPERTY_SELF_MANAGED}. + */ + public static final String METADATA_INCLUDE_SELF_MANAGED_CALLS = + "android.telecom.INCLUDE_SELF_MANAGED_CALLS"; + /** * The dual tone multi-frequency signaling character sent to indicate the dialing system should * pause for a predefined period. @@ -1034,10 +1052,12 @@ public class TelecomManager { /** * Returns whether there is an ongoing phone call (can be in dialing, ringing, active or holding - * states). + * states) originating from either a manager or self-managed {@link ConnectionService}. *

* Requires permission: {@link android.Manifest.permission#READ_PHONE_STATE} - *

+ * + * @return {@code true} if there is an ongoing call in either a managed or self-managed + * {@link ConnectionService}, {@code false} otherwise. */ @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public boolean isInCall() { @@ -1051,6 +1071,31 @@ public class TelecomManager { return false; } + /** + * Returns whether there is an ongoing call originating from a managed + * {@link ConnectionService}. An ongoing call can be in dialing, ringing, active or holding + * states. + *

+ * If you also need to know if there are ongoing self-managed calls, use {@link #isInCall()} + * instead. + *

+ * Requires permission: {@link android.Manifest.permission#READ_PHONE_STATE} + * + * @return {@code true} if there is an ongoing call in a managed {@link ConnectionService}, + * {@code false} otherwise. + */ + @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) + public boolean isInManagedCall() { + try { + if (isServiceConnected()) { + return getTelecomService().isInManagedCall(mContext.getOpPackageName()); + } + } catch (RemoteException e) { + Log.e(TAG, "RemoteException calling isInManagedCall().", e); + } + return false; + } + /** * Returns one of the following constants that represents the current state of Telecom: * @@ -1062,6 +1107,9 @@ public class TelecomManager { * {@link android.Manifest.permission#READ_PHONE_STATE} permission. This is intentional, to * preserve the behavior of {@link TelephonyManager#getCallState()}, which also did not require * the permission. + * + * Takes into consideration both managed and self-managed calls. + * * @hide */ @SystemApi @@ -1079,6 +1127,7 @@ public class TelecomManager { /** * Returns whether there currently exists is a ringing incoming-call. * + * @return {@code true} if there is a managed or self-managed ringing call. * @hide */ @SystemApi diff --git a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl index d9465dce49d29..c044742a1b0b8 100644 --- a/telecomm/java/com/android/internal/telecom/ITelecomService.aidl +++ b/telecomm/java/com/android/internal/telecom/ITelecomService.aidl @@ -164,6 +164,11 @@ interface ITelecomService { */ boolean isInCall(String callingPackage); + /** + * @see TelecomServiceImpl#isInManagedCall + */ + boolean isInManagedCall(String callingPackage); + /** * @see TelecomServiceImpl#isRinging */