From 0ced792cd69ff4e78b3ea84e6b38c1f1fddce82e Mon Sep 17 00:00:00 2001 From: Shishir Agrawal Date: Wed, 10 Dec 2014 10:20:39 -0800 Subject: [PATCH 01/10] Fail SmsManager requests if SubId is not active. If subId is not active, expected subIds can be assigned to the messages being processed due to SmsManager calls. The change will fail any SmsManager calls if SubId is not active. Bug: 18629526 Change-Id: I8da1b1e2c477f32dcbaff417fc4e14ba2a225414 --- .../android/telephony/SubscriptionManager.java | 14 ++++++++++++++ .../java/com/android/internal/telephony/ISub.aidl | 1 + 2 files changed, 15 insertions(+) diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index aca94e9e0fc7c..88ca8a4378413 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -1133,5 +1133,19 @@ public class SubscriptionManager { logd("getSimStateForSubscriber: simState=" + simState + " subId=" + subId); return simState; } + + /** + * @return true if the sub ID is active. i.e. The sub ID corresponds to a known subscription + * and the SIM providing the subscription is present in a slot and in "LOADED" state. + * @hide + */ + public boolean isActiveSubId(int subId) { + try { + ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); + return iSub.isActiveSubId(subId); + } catch (RemoteException ex) { + } + return false; + } } diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl index acbc0aa1c556f..c12137d6fa3c4 100755 --- a/telephony/java/com/android/internal/telephony/ISub.aidl +++ b/telephony/java/com/android/internal/telephony/ISub.aidl @@ -171,4 +171,5 @@ interface ISub { */ int getSimStateForSubscriber(int subId); + boolean isActiveSubId(int subId); } From 56e02703f79ec842214bee4347459b38430c981c Mon Sep 17 00:00:00 2001 From: Cheuksan Wang Date: Fri, 3 Apr 2015 15:59:19 -0700 Subject: [PATCH 02/10] add injectSmsPdu with subId to ISms.aidl also clean up unused methods from ISms.aidl and UiccSmsController.java BUG: 20015121 Change-Id: I60237e2e8964f9db5cceab7b09112a49f92f5c47 --- .../com/android/internal/telephony/ISms.aidl | 224 +----------------- 1 file changed, 9 insertions(+), 215 deletions(-) diff --git a/telephony/java/com/android/internal/telephony/ISms.aidl b/telephony/java/com/android/internal/telephony/ISms.aidl index 70ac268ed4007..f37ae5ac53557 100644 --- a/telephony/java/com/android/internal/telephony/ISms.aidl +++ b/telephony/java/com/android/internal/telephony/ISms.aidl @@ -35,13 +35,6 @@ import com.android.internal.telephony.SmsRawData; */ interface ISms { - /** - * Retrieves all messages currently stored on ICC. - * - * @return list of SmsRawData of all sms on ICC - */ - List getAllMessagesFromIccEf(String callingPkg); - /** * Retrieves all messages currently stored on ICC. * @param subId the subId id. @@ -49,20 +42,6 @@ interface ISms { */ List getAllMessagesFromIccEfForSubscriber(in int subId, String callingPkg); - /** - * Update the specified message on the ICC. - * - * @param messageIndex record index of message to update - * @param newStatus new message status (STATUS_ON_ICC_READ, - * STATUS_ON_ICC_UNREAD, STATUS_ON_ICC_SENT, - * STATUS_ON_ICC_UNSENT, STATUS_ON_ICC_FREE) - * @param pdu the raw PDU to store - * @return success or not - * - */ - boolean updateMessageOnIccEf(String callingPkg, int messageIndex, int newStatus, - in byte[] pdu); - /** * Update the specified message on the ICC. * @@ -78,17 +57,6 @@ interface ISms { boolean updateMessageOnIccEfForSubscriber(in int subId, String callingPkg, int messageIndex, int newStatus, in byte[] pdu); - /** - * Copy a raw SMS PDU to the ICC. - * - * @param pdu the raw PDU to store - * @param status message status (STATUS_ON_ICC_READ, STATUS_ON_ICC_UNREAD, - * STATUS_ON_ICC_SENT, STATUS_ON_ICC_UNSENT) - * @return success or not - * - */ - boolean copyMessageToIccEf(String callingPkg, int status, in byte[] pdu, in byte[] smsc); - /** * Copy a raw SMS PDU to the ICC. * @@ -102,32 +70,6 @@ interface ISms { boolean copyMessageToIccEfForSubscriber(in int subId, String callingPkg, int status, in byte[] pdu, in byte[] smsc); - /** - * Send a data SMS. - * - * @param smsc the SMSC to send the message through, or NULL for the - * default SMSC - * @param data the body of the message to send - * @param sentIntent if not NULL this PendingIntent is - * broadcast when the message is sucessfully sent, or failed. - * The result code will be Activity.RESULT_OK for success, - * or one of these errors:
- * RESULT_ERROR_GENERIC_FAILURE
- * RESULT_ERROR_RADIO_OFF
- * RESULT_ERROR_NULL_PDU
- * For RESULT_ERROR_GENERIC_FAILURE the sentIntent may include - * the extra "errorCode" containing a radio technology specific value, - * generally only useful for troubleshooting.
- * The per-application based SMS control checks sentIntent. If sentIntent - * is NULL the caller will be checked against all unknown applicaitons, - * which cause smaller number of SMS to be sent in checking period. - * @param deliveryIntent if not NULL this PendingIntent is - * broadcast when the message is delivered to the recipient. The - * raw pdu of the status report is in the extended data ("pdu"). - */ - void sendData(String callingPkg, in String destAddr, in String scAddr, in int destPort, - in byte[] data, in PendingIntent sentIntent, in PendingIntent deliveryIntent); - /** * Send a data SMS. * @@ -156,32 +98,6 @@ interface ISms { in String scAddr, in int destPort, in byte[] data, in PendingIntent sentIntent, in PendingIntent deliveryIntent); - /** - * Send an SMS. - * - * @param smsc the SMSC to send the message through, or NULL for the - * default SMSC - * @param text the body of the message to send - * @param sentIntent if not NULL this PendingIntent is - * broadcast when the message is sucessfully sent, or failed. - * The result code will be Activity.RESULT_OK for success, - * or one of these errors:
- * RESULT_ERROR_GENERIC_FAILURE
- * RESULT_ERROR_RADIO_OFF
- * RESULT_ERROR_NULL_PDU
- * For RESULT_ERROR_GENERIC_FAILURE the sentIntent may include - * the extra "errorCode" containing a radio technology specific value, - * generally only useful for troubleshooting.
- * The per-application based SMS control checks sentIntent. If sentIntent - * is NULL the caller will be checked against all unknown applications, - * which cause smaller number of SMS to be sent in checking period. - * @param deliveryIntent if not NULL this PendingIntent is - * broadcast when the message is delivered to the recipient. The - * raw pdu of the status report is in the extended data ("pdu"). - */ - void sendText(String callingPkg, in String destAddr, in String scAddr, in String text, - in PendingIntent sentIntent, in PendingIntent deliveryIntent); - /** * Send an SMS. * @@ -213,6 +129,7 @@ interface ISms { /** * Inject an SMS PDU into the android platform. * + * @param subId the subId on which the SMS has to be injected. * @param pdu is the byte array of pdu to be injected into android application framework * @param format is the format of SMS pdu (android.telephony.SmsMessage.FORMAT_3GPP or * android.telephony.SmsMessage.FORMAT_3GPP2) @@ -221,33 +138,8 @@ interface ISms { * android application framework. This intent is broadcasted at * the same time an SMS received from radio is acknowledged back. */ - void injectSmsPdu(in byte[] pdu, String format, in PendingIntent receivedIntent); - - /** - * Send a multi-part text based SMS. - * - * @param destinationAddress the address to send the message to - * @param scAddress is the service center address or null to use - * the current default SMSC - * @param parts an ArrayList of strings that, in order, - * comprise the original message - * @param sentIntents if not null, an ArrayList of - * PendingIntents (one for each message part) that is - * broadcast when the corresponding message part has been sent. - * The result code will be Activity.RESULT_OK for success, - * or one of these errors: - * RESULT_ERROR_GENERIC_FAILURE - * RESULT_ERROR_RADIO_OFF - * RESULT_ERROR_NULL_PDU. - * @param deliveryIntents if not null, an ArrayList of - * PendingIntents (one for each message part) that is - * broadcast when the corresponding message part has been delivered - * to the recipient. The raw pdu of the status report is in the - * extended data ("pdu"). - */ - void sendMultipartText(String callingPkg, in String destinationAddress, in String scAddress, - in List parts, in List sentIntents, - in List deliveryIntents); + void injectSmsPduForSubscriber( + int subId, in byte[] pdu, String format, in PendingIntent receivedIntent); /** * Send a multi-part text based SMS. @@ -277,24 +169,6 @@ interface ISms { in List parts, in List sentIntents, in List deliveryIntents); - /** - * Enable reception of cell broadcast (SMS-CB) messages with the given - * message identifier and RAN type. The RAN type specify this message ID - * belong to 3GPP (GSM) or 3GPP2(CDMA). Note that if two different clients - * enable the same message identifier, they must both disable it for the - * device to stop receiving those messages. - * - * @param messageIdentifier Message identifier as specified in TS 23.041 (3GPP) or - * C.R1001-G (3GPP2) - * @param ranType as defined in class SmsManager, the value can be one of these: - * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_GSM - * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA - * @return true if successful, false otherwise - * - * @see #disableCellBroadcast(int, int) - */ - boolean enableCellBroadcast(int messageIdentifier, int ranType); - /** * Enable reception of cell broadcast (SMS-CB) messages with the given * message identifier and RAN type. The RAN type specify this message ID @@ -310,28 +184,10 @@ interface ISms { * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA * @return true if successful, false otherwise * - * @see #disableCellBroadcast(int, int) + * @see #disableCellBroadcastForSubscriber(int, int, int) */ boolean enableCellBroadcastForSubscriber(int subId, int messageIdentifier, int ranType); - /** - * Disable reception of cell broadcast (SMS-CB) messages with the given - * message identifier and RAN type. The RAN type specify this message ID - * belong to 3GPP (GSM) or 3GPP2(CDMA). Note that if two different clients - * enable the same message identifier, they must both disable it for the - * device to stop receiving those messages. - * - * @param messageIdentifier Message identifier as specified in TS 23.041 (3GPP) or - * C.R1001-G (3GPP2) - * @param ranType as defined in class SmsManager, the value can be one of these: - * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_GSM - * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA - * @return true if successful, false otherwise - * - * @see #enableCellBroadcast(int, int) - */ - boolean disableCellBroadcast(int messageIdentifier, int ranType); - /** * Disable reception of cell broadcast (SMS-CB) messages with the given * message identifier and RAN type. The RAN type specify this message ID @@ -347,30 +203,10 @@ interface ISms { * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA * @return true if successful, false otherwise * - * @see #enableCellBroadcast(int, int) + * @see #enableCellBroadcastForSubscriber(int, int, int) */ boolean disableCellBroadcastForSubscriber(int subId, int messageIdentifier, int ranType); - /* - * Enable reception of cell broadcast (SMS-CB) messages with the given - * message identifier range and RAN type. The RAN type specify this message - * ID range belong to 3GPP (GSM) or 3GPP2(CDMA). Note that if two different - * clients enable a message identifier range, they must both disable it for - * the device to stop receiving those messages. - * - * @param startMessageId first message identifier as specified in TS 23.041 (3GPP) or - * C.R1001-G (3GPP2) - * @param endMessageId last message identifier as specified in TS 23.041 (3GPP) or - * C.R1001-G (3GPP2) - * @param ranType as defined in class SmsManager, the value can be one of these: - * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_GSM - * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA - * @return true if successful, false otherwise - * - * @see #disableCellBroadcastRange(int, int, int) - */ - boolean enableCellBroadcastRange(int startMessageId, int endMessageId, int ranType); - /* * Enable reception of cell broadcast (SMS-CB) messages with the given * message identifier range and RAN type. The RAN type specify this message ID range @@ -388,31 +224,11 @@ interface ISms { * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA * @return true if successful, false otherwise * - * @see #disableCellBroadcastRange(int, int, int) + * @see #disableCellBroadcastRangeForSubscriber(int, int, int, int) */ boolean enableCellBroadcastRangeForSubscriber(int subId, int startMessageId, int endMessageId, int ranType); - /** - * Disable reception of cell broadcast (SMS-CB) messages with the given - * message identifier range and RAN type. The RAN type specify this message ID range - * belong to 3GPP (GSM) or 3GPP2(CDMA). Note that if two different clients enable - * a message identifier range, they must both disable it for the device - * to stop receiving those messages. - * - * @param startMessageId first message identifier as specified in TS 23.041 (3GPP) or - * C.R1001-G (3GPP2) - * @param endMessageId last message identifier as specified in TS 23.041 (3GPP) or - * C.R1001-G (3GPP2) - * @param ranType as defined in class SmsManager, the value can be one of these: - * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_GSM - * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA - * @return true if successful, false otherwise - * - * @see #enableCellBroadcastRange(int, int, int) - */ - boolean disableCellBroadcastRange(int startMessageId, int endMessageId, int ranType); - /** * Disable reception of cell broadcast (SMS-CB) messages with the given * message identifier range and RAN type. The RAN type specify this message ID range @@ -430,7 +246,7 @@ interface ISms { * android.telephony.SmsMessage.CELL_BROADCAST_RAN_TYPE_CDMA * @return true if successful, false otherwise * - * @see #enableCellBroadcastRange(int, int, int, int) + * @see #enableCellBroadcastRangeForSubscriber(int, int, int, int) */ boolean disableCellBroadcastRangeForSubscriber(int subId, int startMessageId, int endMessageId, int ranType); @@ -459,23 +275,13 @@ interface ISms { */ void setPremiumSmsPermissionForSubscriber(int subId, String packageName, int permission); - /** - * SMS over IMS is supported if IMS is registered and SMS is supported - * on IMS. - * - * @return true if SMS over IMS is supported, false otherwise - * - * @see #getImsSmsFormat() - */ - boolean isImsSmsSupported(); - /** * SMS over IMS is supported if IMS is registered and SMS is supported * on IMS. * @param subId for subId which isImsSmsSupported is queried * @return true if SMS over IMS is supported, false otherwise * - * @see #getImsSmsFormat() + * @see #getImsSmsFormatForSubscriber(int) */ boolean isImsSmsSupportedForSubscriber(int subId); @@ -493,18 +299,6 @@ interface ISms { */ int getPreferredSmsSubscription(); - /** - * Gets SMS format supported on IMS. SMS over IMS format is - * either 3GPP or 3GPP2. - * - * @return android.telephony.SmsMessage.FORMAT_3GPP, - * android.telephony.SmsMessage.FORMAT_3GPP2 - * or android.telephony.SmsMessage.FORMAT_UNKNOWN - * - * @see #isImsSmsSupported() - */ - String getImsSmsFormat(); - /** * Gets SMS format supported on IMS. SMS over IMS format is * either 3GPP or 3GPP2. @@ -513,7 +307,7 @@ interface ISms { * android.telephony.SmsMessage.FORMAT_3GPP2 * or android.telephony.SmsMessage.FORMAT_UNKNOWN * - * @see #isImsSmsSupported() + * @see #isImsSmsSupportedForSubscriber(int) */ String getImsSmsFormatForSubscriber(int subId); From 58687715da977cceb45e78debf7b46d48b554e93 Mon Sep 17 00:00:00 2001 From: Jan Nordqvist Date: Thu, 23 Apr 2015 15:42:55 -0700 Subject: [PATCH 03/10] Added parameter to avoid having a stream opened, and with that, file truncated on no-op. Change-Id: I5813e4fd269c639a437e17f2554efa4db735a8ba --- .../com/android/server/net/DelayedDiskWrite.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/net/DelayedDiskWrite.java b/services/core/java/com/android/server/net/DelayedDiskWrite.java index 6ed277de1efdf..8f09eb7c19ab6 100644 --- a/services/core/java/com/android/server/net/DelayedDiskWrite.java +++ b/services/core/java/com/android/server/net/DelayedDiskWrite.java @@ -38,6 +38,10 @@ public class DelayedDiskWrite { } public void write(final String filePath, final Writer w) { + write(filePath, w, true); + } + + public void write(final String filePath, final Writer w, final boolean open) { if (TextUtils.isEmpty(filePath)) { throw new IllegalArgumentException("empty file path"); } @@ -54,16 +58,18 @@ public class DelayedDiskWrite { mDiskWriteHandler.post(new Runnable() { @Override public void run() { - doWrite(filePath, w); + doWrite(filePath, w, open); } }); } - private void doWrite(String filePath, Writer w) { + private void doWrite(String filePath, Writer w, boolean open) { DataOutputStream out = null; try { - out = new DataOutputStream(new BufferedOutputStream( + if (open) { + out = new DataOutputStream(new BufferedOutputStream( new FileOutputStream(filePath))); + } w.onWriteCalled(out); } catch (IOException e) { loge("Error writing data file " + filePath); From e87e4f077c8f5dc8dc7b1b5cd68cbe8ca51f2396 Mon Sep 17 00:00:00 2001 From: Cheuksan Wang Date: Wed, 15 Apr 2015 15:41:36 -0700 Subject: [PATCH 04/10] add a parameter to carrier messaging calls to request delivery status In the carrier messaging API, I forgot to add the parameter to request delivery status. We need to add one more parameter (to indicate requesting delivery status) to these calls: onSendMultipartTextSms onSendTextSms onSendDataSms Backward compatibility is maintained in CarrierMessagingService.java. Third-party carrier apps implementing the old API will continue to work. BUG: 20224743 Change-Id: I09901558e7cb75a9ec6a5bd5ba2c8117ac471932 --- api/current.txt | 10 +- api/system-current.txt | 10 +- .../carrier/CarrierMessagingService.java | 93 ++++++++++++++++--- .../carrier/ICarrierMessagingService.aidl | 9 +- 4 files changed, 99 insertions(+), 23 deletions(-) diff --git a/api/current.txt b/api/current.txt index 698f36d627bf0..5e50d803ccafd 100644 --- a/api/current.txt +++ b/api/current.txt @@ -27059,13 +27059,17 @@ package android.service.carrier { method public android.os.IBinder onBind(android.content.Intent); method public void onDownloadMms(android.net.Uri, int, android.net.Uri, android.service.carrier.CarrierMessagingService.ResultCallback); method public void onFilterSms(android.service.carrier.MessagePdu, java.lang.String, int, int, android.service.carrier.CarrierMessagingService.ResultCallback); - method public void onSendDataSms(byte[], int, java.lang.String, int, android.service.carrier.CarrierMessagingService.ResultCallback); + method public deprecated void onSendDataSms(byte[], int, java.lang.String, int, android.service.carrier.CarrierMessagingService.ResultCallback); + method public void onSendDataSms(byte[], int, java.lang.String, int, int, android.service.carrier.CarrierMessagingService.ResultCallback); method public void onSendMms(android.net.Uri, int, android.net.Uri, android.service.carrier.CarrierMessagingService.ResultCallback); - method public void onSendMultipartTextSms(java.util.List, int, java.lang.String, android.service.carrier.CarrierMessagingService.ResultCallback); - method public void onSendTextSms(java.lang.String, int, java.lang.String, android.service.carrier.CarrierMessagingService.ResultCallback); + method public deprecated void onSendMultipartTextSms(java.util.List, int, java.lang.String, android.service.carrier.CarrierMessagingService.ResultCallback); + method public void onSendMultipartTextSms(java.util.List, int, java.lang.String, int, android.service.carrier.CarrierMessagingService.ResultCallback); + method public deprecated void onSendTextSms(java.lang.String, int, java.lang.String, android.service.carrier.CarrierMessagingService.ResultCallback); + method public void onSendTextSms(java.lang.String, int, java.lang.String, int, android.service.carrier.CarrierMessagingService.ResultCallback); field public static final int DOWNLOAD_STATUS_ERROR = 2; // 0x2 field public static final int DOWNLOAD_STATUS_OK = 0; // 0x0 field public static final int DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK = 1; // 0x1 + field public static final int SEND_FLAG_REQUEST_DELIVERY_STATUS = 1; // 0x1 field public static final int SEND_STATUS_ERROR = 2; // 0x2 field public static final int SEND_STATUS_OK = 0; // 0x0 field public static final int SEND_STATUS_RETRY_ON_CARRIER_NETWORK = 1; // 0x1 diff --git a/api/system-current.txt b/api/system-current.txt index a23199dce6073..21a1f7fc79fd6 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -28754,13 +28754,17 @@ package android.service.carrier { method public android.os.IBinder onBind(android.content.Intent); method public void onDownloadMms(android.net.Uri, int, android.net.Uri, android.service.carrier.CarrierMessagingService.ResultCallback); method public void onFilterSms(android.service.carrier.MessagePdu, java.lang.String, int, int, android.service.carrier.CarrierMessagingService.ResultCallback); - method public void onSendDataSms(byte[], int, java.lang.String, int, android.service.carrier.CarrierMessagingService.ResultCallback); + method public deprecated void onSendDataSms(byte[], int, java.lang.String, int, android.service.carrier.CarrierMessagingService.ResultCallback); + method public void onSendDataSms(byte[], int, java.lang.String, int, int, android.service.carrier.CarrierMessagingService.ResultCallback); method public void onSendMms(android.net.Uri, int, android.net.Uri, android.service.carrier.CarrierMessagingService.ResultCallback); - method public void onSendMultipartTextSms(java.util.List, int, java.lang.String, android.service.carrier.CarrierMessagingService.ResultCallback); - method public void onSendTextSms(java.lang.String, int, java.lang.String, android.service.carrier.CarrierMessagingService.ResultCallback); + method public deprecated void onSendMultipartTextSms(java.util.List, int, java.lang.String, android.service.carrier.CarrierMessagingService.ResultCallback); + method public void onSendMultipartTextSms(java.util.List, int, java.lang.String, int, android.service.carrier.CarrierMessagingService.ResultCallback); + method public deprecated void onSendTextSms(java.lang.String, int, java.lang.String, android.service.carrier.CarrierMessagingService.ResultCallback); + method public void onSendTextSms(java.lang.String, int, java.lang.String, int, android.service.carrier.CarrierMessagingService.ResultCallback); field public static final int DOWNLOAD_STATUS_ERROR = 2; // 0x2 field public static final int DOWNLOAD_STATUS_OK = 0; // 0x0 field public static final int DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK = 1; // 0x1 + field public static final int SEND_FLAG_REQUEST_DELIVERY_STATUS = 1; // 0x1 field public static final int SEND_STATUS_ERROR = 2; // 0x2 field public static final int SEND_STATUS_OK = 0; // 0x0 field public static final int SEND_STATUS_RETRY_ON_CARRIER_NETWORK = 1; // 0x1 diff --git a/core/java/android/service/carrier/CarrierMessagingService.java b/core/java/android/service/carrier/CarrierMessagingService.java index 3d6ebcacec739..ac15ae5667723 100644 --- a/core/java/android/service/carrier/CarrierMessagingService.java +++ b/core/java/android/service/carrier/CarrierMessagingService.java @@ -83,6 +83,11 @@ public abstract class CarrierMessagingService extends Service { */ public static final int DOWNLOAD_STATUS_ERROR = 2; + /** + * Flag to request SMS delivery status report. + */ + public static final int SEND_FLAG_REQUEST_DELIVERY_STATUS = 1; + private final ICarrierMessagingWrapper mWrapper = new ICarrierMessagingWrapper(); /** @@ -106,12 +111,14 @@ public abstract class CarrierMessagingService extends Service { /** * Override this method to intercept text SMSs sent from the device. + * @deprecated Override {@link #onSendTextSms} below instead. * * @param text the text to send * @param subId SMS subscription ID of the SIM * @param destAddress phone number of the recipient of the message * @param callback result callback. Call with a {@link SendSmsResult}. */ + @Deprecated public void onSendTextSms( @NonNull String text, int subId, @NonNull String destAddress, @NonNull ResultCallback callback) { @@ -122,6 +129,44 @@ public abstract class CarrierMessagingService extends Service { } } + /** + * Override this method to intercept text SMSs sent from the device. + * + * @param text the text to send + * @param subId SMS subscription ID of the SIM + * @param destAddress phone number of the recipient of the message + * @param sendSmsFlag Flag for sending SMS. Acceptable values are 0 and + * {@link #SEND_FLAG_REQUEST_DELIVERY_STATUS}. + * @param callback result callback. Call with a {@link SendSmsResult}. + */ + public void onSendTextSms( + @NonNull String text, int subId, @NonNull String destAddress, + int sendSmsFlag, @NonNull ResultCallback callback) { + // optional + onSendTextSms(text, subId, destAddress, callback); + } + + /** + * Override this method to intercept binary SMSs sent from the device. + * @deprecated Override {@link #onSendDataSms} below instead. + * + * @param data the binary content + * @param subId SMS subscription ID of the SIM + * @param destAddress phone number of the recipient of the message + * @param destPort the destination port + * @param callback result callback. Call with a {@link SendSmsResult}. + */ + @Deprecated + public void onSendDataSms(@NonNull byte[] data, int subId, + @NonNull String destAddress, int destPort, + @NonNull ResultCallback callback) { + // optional + try { + callback.onReceiveResult(new SendSmsResult(SEND_STATUS_RETRY_ON_CARRIER_NETWORK, 0)); + } catch (RemoteException ex) { + } + } + /** * Override this method to intercept binary SMSs sent from the device. * @@ -129,14 +174,34 @@ public abstract class CarrierMessagingService extends Service { * @param subId SMS subscription ID of the SIM * @param destAddress phone number of the recipient of the message * @param destPort the destination port + * @param sendSmsFlag Flag for sending SMS. Acceptable values are 0 and + * {@link #SEND_FLAG_REQUEST_DELIVERY_STATUS}. * @param callback result callback. Call with a {@link SendSmsResult}. */ public void onSendDataSms(@NonNull byte[] data, int subId, - @NonNull String destAddress, int destPort, + @NonNull String destAddress, int destPort, int sendSmsFlag, @NonNull ResultCallback callback) { // optional + onSendDataSms(data, subId, destAddress, destPort, callback); + } + + /** + * Override this method to intercept long SMSs sent from the device. + * @deprecated Override {@link #onSendMultipartTextSms} below instead. + * + * @param parts a {@link List} of the message parts + * @param subId SMS subscription ID of the SIM + * @param destAddress phone number of the recipient of the message + * @param callback result callback. Call with a {@link SendMultipartSmsResult}. + */ + @Deprecated + public void onSendMultipartTextSms(@NonNull List parts, + int subId, @NonNull String destAddress, + @NonNull ResultCallback callback) { + // optional try { - callback.onReceiveResult(new SendSmsResult(SEND_STATUS_RETRY_ON_CARRIER_NETWORK, 0)); + callback.onReceiveResult( + new SendMultipartSmsResult(SEND_STATUS_RETRY_ON_CARRIER_NETWORK, null)); } catch (RemoteException ex) { } } @@ -147,17 +212,15 @@ public abstract class CarrierMessagingService extends Service { * @param parts a {@link List} of the message parts * @param subId SMS subscription ID of the SIM * @param destAddress phone number of the recipient of the message + * @param sendSmsFlag Flag for sending SMS. Acceptable values are 0 and + * {@link #SEND_FLAG_REQUEST_DELIVERY_STATUS}. * @param callback result callback. Call with a {@link SendMultipartSmsResult}. */ public void onSendMultipartTextSms(@NonNull List parts, - int subId, @NonNull String destAddress, + int subId, @NonNull String destAddress, int sendSmsFlag, @NonNull ResultCallback callback) { // optional - try { - callback.onReceiveResult( - new SendMultipartSmsResult(SEND_STATUS_RETRY_ON_CARRIER_NETWORK, null)); - } catch (RemoteException ex) { - } + onSendMultipartTextSms(parts, subId, destAddress, callback); } /** @@ -358,8 +421,9 @@ public abstract class CarrierMessagingService extends Service { @Override public void sendTextSms(String text, int subId, String destAddress, - final ICarrierMessagingCallback callback) { - onSendTextSms(text, subId, destAddress, new ResultCallback() { + int sendSmsFlag, final ICarrierMessagingCallback callback) { + onSendTextSms(text, subId, destAddress, sendSmsFlag, + new ResultCallback() { @Override public void onReceiveResult(final SendSmsResult result) throws RemoteException { callback.onSendSmsComplete(result.getSendStatus(), result.getMessageRef()); @@ -369,8 +433,9 @@ public abstract class CarrierMessagingService extends Service { @Override public void sendDataSms(byte[] data, int subId, String destAddress, int destPort, - final ICarrierMessagingCallback callback) { - onSendDataSms(data, subId, destAddress, destPort, new ResultCallback() { + int sendSmsFlag, final ICarrierMessagingCallback callback) { + onSendDataSms(data, subId, destAddress, destPort, sendSmsFlag, + new ResultCallback() { @Override public void onReceiveResult(final SendSmsResult result) throws RemoteException { callback.onSendSmsComplete(result.getSendStatus(), result.getMessageRef()); @@ -380,8 +445,8 @@ public abstract class CarrierMessagingService extends Service { @Override public void sendMultipartTextSms(List parts, int subId, String destAddress, - final ICarrierMessagingCallback callback) { - onSendMultipartTextSms(parts, subId, destAddress, + int sendSmsFlag, final ICarrierMessagingCallback callback) { + onSendMultipartTextSms(parts, subId, destAddress, sendSmsFlag, new ResultCallback() { @Override public void onReceiveResult(final SendMultipartSmsResult result) diff --git a/core/java/android/service/carrier/ICarrierMessagingService.aidl b/core/java/android/service/carrier/ICarrierMessagingService.aidl index 40a9047da4428..2d96c3da64876 100644 --- a/core/java/android/service/carrier/ICarrierMessagingService.aidl +++ b/core/java/android/service/carrier/ICarrierMessagingService.aidl @@ -48,9 +48,10 @@ oneway interface ICarrierMessagingService { * @param text the text to send * @param subId SMS subscription ID of the SIM * @param destAddress phone number of the recipient of the message + * @param sendSmsFlag flag for sending SMS * @param callback the callback to notify upon completion */ - void sendTextSms(String text, int subId, String destAddress, + void sendTextSms(String text, int subId, String destAddress, int sendSmsFlag, in ICarrierMessagingCallback callback); /** @@ -62,10 +63,11 @@ oneway interface ICarrierMessagingService { * @param subId SMS subscription ID of the SIM * @param destAddress phone number of the recipient of the message * @param destPort port number of the recipient of the message + * @param sendSmsFlag flag for sending SMS * @param callback the callback to notify upon completion */ void sendDataSms(in byte[] data, int subId, String destAddress, int destPort, - in ICarrierMessagingCallback callback); + int sendSmsFlag, in ICarrierMessagingCallback callback); /** * Request sending a new multi-part text SMS from the device. @@ -75,10 +77,11 @@ oneway interface ICarrierMessagingService { * @param parts the parts of the multi-part text SMS to send * @param subId SMS subscription ID of the SIM * @param destAddress phone number of the recipient of the message + * @param sendSmsFlag flag for sending SMS * @param callback the callback to notify upon completion */ void sendMultipartTextSms(in List parts, int subId, String destAddress, - in ICarrierMessagingCallback callback); + int sendSmsFlag, in ICarrierMessagingCallback callback); /** * Request sending a new MMS PDU from the device. From ebc5ced56e474e48777194fd6ca349a6cedb1e6f Mon Sep 17 00:00:00 2001 From: xinhe Date: Wed, 22 Apr 2015 15:36:29 -0700 Subject: [PATCH 05/10] No Permission check for WiFi RTT Bug:19918231 Change-Id: I98aea756cc15683596096e46da48efe0737ae1d1 --- api/system-current.txt | 1 + wifi/java/android/net/wifi/RttManager.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/api/system-current.txt b/api/system-current.txt index 21a1f7fc79fd6..d94bdcb9c6fac 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -19306,6 +19306,7 @@ package android.net.wifi { field public static final int REASON_INVALID_LISTENER = -3; // 0xfffffffd field public static final int REASON_INVALID_REQUEST = -4; // 0xfffffffc field public static final int REASON_NOT_AVAILABLE = -2; // 0xfffffffe + field public static final int REASON_PERMISSION_DENIED = -5; // 0xfffffffb field public static final int REASON_UNSPECIFIED = -1; // 0xffffffff field public static final int RTT_BW_10_SUPPORT = 2; // 0x2 field public static final int RTT_BW_160_SUPPORT = 32; // 0x20 diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java index d2fb0ddd72952..dde8dba19f902 100644 --- a/wifi/java/android/net/wifi/RttManager.java +++ b/wifi/java/android/net/wifi/RttManager.java @@ -134,6 +134,8 @@ public class RttManager { public static final int REASON_NOT_AVAILABLE = -2; public static final int REASON_INVALID_LISTENER = -3; public static final int REASON_INVALID_REQUEST = -4; + /** Do not have required permission */ + public static final int REASON_PERMISSION_DENIED = -5; public static final String DESCRIPTION_KEY = "android.net.wifi.RttManager.Description"; From 9ddd2e78cb82d3c7e18aeba325bb8733cdb3fb1d Mon Sep 17 00:00:00 2001 From: Cheuksan Wang Date: Thu, 2 Apr 2015 15:45:47 -0700 Subject: [PATCH 06/10] Update the SmsMessage.createFromPdu() API call Deprecate the old createFromPdu(byte[] pdu) call because it just guesses the format of the PDU. Instead, unhide the createFromPdu(byte[] pdu, String format) call which specifies the PDU format. BUG: 20015718 Change-Id: I133fc17bf5af4f762fea3106e75beea58185fd5d --- api/current.txt | 3 ++- api/system-current.txt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/api/current.txt b/api/current.txt index 5e50d803ccafd..ae21bb95f420e 100644 --- a/api/current.txt +++ b/api/current.txt @@ -29298,7 +29298,8 @@ package android.telephony { public class SmsMessage { method public static int[] calculateLength(java.lang.CharSequence, boolean); method public static int[] calculateLength(java.lang.String, boolean); - method public static android.telephony.SmsMessage createFromPdu(byte[]); + method public static deprecated android.telephony.SmsMessage createFromPdu(byte[]); + method public static android.telephony.SmsMessage createFromPdu(byte[], java.lang.String); method public java.lang.String getDisplayMessageBody(); method public java.lang.String getDisplayOriginatingAddress(); method public java.lang.String getEmailBody(); diff --git a/api/system-current.txt b/api/system-current.txt index d94bdcb9c6fac..582e7e4096762 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -31167,7 +31167,8 @@ package android.telephony { public class SmsMessage { method public static int[] calculateLength(java.lang.CharSequence, boolean); method public static int[] calculateLength(java.lang.String, boolean); - method public static android.telephony.SmsMessage createFromPdu(byte[]); + method public static deprecated android.telephony.SmsMessage createFromPdu(byte[]); + method public static android.telephony.SmsMessage createFromPdu(byte[], java.lang.String); method public java.lang.String getDisplayMessageBody(); method public java.lang.String getDisplayOriginatingAddress(); method public java.lang.String getEmailBody(); From bde0b1e4c8672133e346d964f946d435da8f4d22 Mon Sep 17 00:00:00 2001 From: Tyler Gunn Date: Fri, 24 Apr 2015 15:09:58 -0700 Subject: [PATCH 07/10] Add videoStateToString on videoProvider Class. - Got tired of looking at numerical integer videoStates, so added a new "videoStateToString" static method, similar to how we have a Connection#capabilitiesToString method. Bug: 20257400 Change-Id: I39fcf413938c90e5993985f0976ad4fcce11505d --- api/current.txt | 1 + api/system-current.txt | 1 + .../java/android/telecom/VideoProfile.java | 36 +++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/api/current.txt b/api/current.txt index ae21bb95f420e..91a9e47b58d0f 100644 --- a/api/current.txt +++ b/api/current.txt @@ -28903,6 +28903,7 @@ package android.telecom { method public static boolean isPaused(int); method public static boolean isReceptionEnabled(int); method public static boolean isTransmissionEnabled(int); + method public static java.lang.String videoStateToString(int); field public static final int AUDIO_ONLY = 0; // 0x0 field public static final int BIDIRECTIONAL = 3; // 0x3 field public static final int PAUSED = 4; // 0x4 diff --git a/api/system-current.txt b/api/system-current.txt index 582e7e4096762..658a489e0683d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -30766,6 +30766,7 @@ package android.telecom { method public static boolean isPaused(int); method public static boolean isReceptionEnabled(int); method public static boolean isTransmissionEnabled(int); + method public static java.lang.String videoStateToString(int); field public static final int AUDIO_ONLY = 0; // 0x0 field public static final int BIDIRECTIONAL = 3; // 0x3 field public static final int PAUSED = 4; // 0x4 diff --git a/telecomm/java/android/telecom/VideoProfile.java b/telecomm/java/android/telecom/VideoProfile.java index 2fd438a29fd08..902fddb22a6c8 100644 --- a/telecomm/java/android/telecom/VideoProfile.java +++ b/telecomm/java/android/telecom/VideoProfile.java @@ -144,6 +144,17 @@ public class VideoProfile implements Parcelable { dest.writeInt(mQuality); } + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("[VideoProfile videoState = "); + sb.append(VideoState.videoStateToString(mVideoState)); + sb.append(" videoQuality = "); + sb.append(mQuality); + sb.append("]"); + return sb.toString(); + } + /** * The video state of the call, stored as a bit-field describing whether video transmission and * receipt it enabled, as well as whether the video is currently muted. @@ -241,5 +252,30 @@ public class VideoProfile implements Parcelable { private static boolean hasState(int videoState, int state) { return (videoState & state) == state; } + + /** + * Generates a string representation of a {@link VideoState}. + * + * @param videoState The video state. + * @return String representation of the {@link VideoState}. + */ + public static String videoStateToString(int videoState) { + StringBuilder sb = new StringBuilder(); + sb.append("Audio"); + + if (VideoProfile.VideoState.isTransmissionEnabled(videoState)) { + sb.append(" Tx"); + } + + if (VideoProfile.VideoState.isReceptionEnabled(videoState)) { + sb.append(" Rx"); + } + + if (VideoProfile.VideoState.isPaused(videoState)) { + sb.append(" Pause"); + } + + return sb.toString(); + } } } From d7017c42be527ac7cbf5de6bc0ba56c676543e52 Mon Sep 17 00:00:00 2001 From: Tyler Gunn Date: Mon, 27 Apr 2015 13:13:32 -0700 Subject: [PATCH 08/10] Fixing issue where conference calls enable speaker phone. - The issue was due to a mis-merge in ParcelableConference. The write of the status hints happens at the end of the writeToParcel method. Bug: 20503132 Change-Id: I40ef9b267b48876006e4cbe29e5ae09ba77bcb33 --- telecomm/java/android/telecom/ParcelableConference.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/telecomm/java/android/telecom/ParcelableConference.java b/telecomm/java/android/telecom/ParcelableConference.java index e54e79de6056a..3d0c558c2010d 100644 --- a/telecomm/java/android/telecom/ParcelableConference.java +++ b/telecomm/java/android/telecom/ParcelableConference.java @@ -121,11 +121,10 @@ public final class ParcelableConference implements Parcelable { List connectionIds = new ArrayList<>(2); source.readList(connectionIds, classLoader); long connectTimeMillis = source.readLong(); - StatusHints statusHints = source.readParcelable(classLoader); - IVideoProvider videoCallProvider = IVideoProvider.Stub.asInterface(source.readStrongBinder()); int videoState = source.readInt(); + StatusHints statusHints = source.readParcelable(classLoader); return new ParcelableConference(phoneAccount, state, capabilities, connectionIds, videoCallProvider, videoState, connectTimeMillis, statusHints); From e20b8ad4c43e671b5115cfefe5740b7d9462b685 Mon Sep 17 00:00:00 2001 From: Jan Nordqvist Date: Fri, 24 Apr 2015 13:46:42 -0700 Subject: [PATCH 09/10] Changed logging tag. Change-Id: I9a916305910c65425ffe7ea8d5a29dba0ee9a8da --- wifi/java/android/net/wifi/WifiConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index 1521623693480..feab4b8a91d0b 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -868,7 +868,7 @@ public class WifiConfiguration implements Parcelable { public boolean isValid() { String reason = strIsValid(); if (reason != null) { - Log.e("WFII", "WiFi Config not valid: " + reason); + Log.e(TAG, "WiFi Config not valid: " + reason); return false; } else { From 17455a3d39350a39eb995897929977d793358365 Mon Sep 17 00:00:00 2001 From: Anthony Lee Date: Fri, 24 Apr 2015 15:25:29 -0700 Subject: [PATCH 10/10] Add plumbing for merge failures and renable button. (3/4) The merge failure is not plumbed up through any layer that can trap the callback and act on it. The first part of this fix is to create that plumbing. Then we need to reenable the merge button. At this point in time, we leverage the fact that forcing the call to reassess its capabilities will poke the InCallUI to reenable the merge button. In the future, we should plumb the merge failure all the way to InCallUI and not only handle the button but display UI to the user. The UI is currently being displayed by CallNotifier which is the wrong place. See b/20530631 for more details. Bug: 20229905 Change-Id: I0355ada46b484c6db4bee656c77386dd61be5e1f --- telecomm/java/android/telecom/Connection.java | 12 ++++++++++++ .../java/android/telecom/ConnectionService.java | 8 ++++++++ .../telecom/ConnectionServiceAdapter.java | 15 +++++++++++++++ .../ConnectionServiceAdapterServant.java | 17 +++++++++++++++++ .../telecom/RemoteConnectionService.java | 7 +++++++ .../telecom/IConnectionServiceAdapter.aidl | 2 ++ 6 files changed, 61 insertions(+) diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 9ced4aeda2a36..97d599b9a9cd1 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -339,6 +339,7 @@ public abstract class Connection implements IConferenceable { public void onConferenceParticipantsChanged(Connection c, List participants) {} public void onConferenceStarted() {} + public void onConferenceMergeFailed(Connection c) {} } public static abstract class VideoProvider { @@ -1546,6 +1547,17 @@ public abstract class Connection implements IConferenceable { mConferenceables.clear(); } + /** + * Notifies listeners that the merge request failed. + * + * @hide + */ + protected final void notifyConferenceMergeFailed() { + for (Listener l : mListeners) { + l.onConferenceMergeFailed(this); + } + } + /** * Notifies listeners of a change to conference participant(s). * diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java index aad7fcba4797c..984382410e3b0 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -562,6 +562,14 @@ public abstract class ConnectionService extends Service { mAdapter.setIsConferenced(id, conferenceId); } } + + @Override + public void onConferenceMergeFailed(Connection connection) { + String id = mIdByConnection.get(connection); + if (id != null) { + mAdapter.onConferenceMergeFailed(id); + } + } }; /** {@inheritDoc} */ diff --git a/telecomm/java/android/telecom/ConnectionServiceAdapter.java b/telecomm/java/android/telecom/ConnectionServiceAdapter.java index d026a28f1742b..a87dbe725d632 100644 --- a/telecomm/java/android/telecom/ConnectionServiceAdapter.java +++ b/telecomm/java/android/telecom/ConnectionServiceAdapter.java @@ -202,6 +202,21 @@ final class ConnectionServiceAdapter implements DeathRecipient { } } + /** + * Indicates that the merge request on this call has failed. + * + * @param callId The unique ID of the call being conferenced. + */ + void onConferenceMergeFailed(String callId) { + for (IConnectionServiceAdapter adapter : mAdapters) { + try { + Log.d(this, "merge failed for call %s", callId); + adapter.setConferenceMergeFailed(callId); + } catch (RemoteException ignored) { + } + } + } + /** * Indicates that the call no longer exists. Can be used with either a call or a conference * call. diff --git a/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java b/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java index 429f296e34d77..db815ba7a86f7 100644 --- a/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java +++ b/telecomm/java/android/telecom/ConnectionServiceAdapterServant.java @@ -59,6 +59,7 @@ final class ConnectionServiceAdapterServant { private static final int MSG_SET_CONFERENCEABLE_CONNECTIONS = 20; private static final int MSG_ADD_EXISTING_CONNECTION = 21; private static final int MSG_ON_POST_DIAL_CHAR = 22; + private static final int MSG_SET_CONFERENCE_MERGE_FAILED = 23; private final IConnectionServiceAdapter mDelegate; @@ -220,6 +221,15 @@ final class ConnectionServiceAdapterServant { } break; } + case MSG_SET_CONFERENCE_MERGE_FAILED: { + SomeArgs args = (SomeArgs) msg.obj; + try { + mDelegate.setConferenceMergeFailed((String) args.arg1); + } finally { + args.recycle(); + } + break; + } } } }; @@ -279,6 +289,13 @@ final class ConnectionServiceAdapterServant { .sendToTarget(); } + @Override + public void setConferenceMergeFailed(String callId) { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = callId; + mHandler.obtainMessage(MSG_SET_CONFERENCE_MERGE_FAILED, args).sendToTarget(); + } + @Override public void setIsConferenced(String callId, String conferenceCallId) { SomeArgs args = SomeArgs.obtain(); diff --git a/telecomm/java/android/telecom/RemoteConnectionService.java b/telecomm/java/android/telecom/RemoteConnectionService.java index 43a92cb576e72..5319793f396db 100644 --- a/telecomm/java/android/telecom/RemoteConnectionService.java +++ b/telecomm/java/android/telecom/RemoteConnectionService.java @@ -170,6 +170,13 @@ final class RemoteConnectionService { } } + @Override + public void setConferenceMergeFailed(String callId) { + // Nothing to do here. + // The event has already been handled and there is no state to update + // in the underlying connection or conference objects + } + @Override public void addConferenceCall( final String callId, diff --git a/telecomm/java/com/android/internal/telecom/IConnectionServiceAdapter.aidl b/telecomm/java/com/android/internal/telecom/IConnectionServiceAdapter.aidl index 7e7e9cc4a904d..67e2edbddd01a 100644 --- a/telecomm/java/com/android/internal/telecom/IConnectionServiceAdapter.aidl +++ b/telecomm/java/com/android/internal/telecom/IConnectionServiceAdapter.aidl @@ -56,6 +56,8 @@ oneway interface IConnectionServiceAdapter { void setIsConferenced(String callId, String conferenceCallId); + void setConferenceMergeFailed(String callId); + void addConferenceCall(String callId, in ParcelableConference conference); void removeCall(String callId);