summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-01-17 22:10:11 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-01-17 22:10:11 +0000
commitecc0631ce6c120b080e0856cab9a61b8b52a3d11 (patch)
tree9885569131f5f9c381abbb8fef1164d4856dd9e5
parent04002262709626d1fd449d3111bdce53bf9e4cbb (diff)
parent0ec4ee823fa7486aa0ed84a2c00c4fad1c4a1b8c (diff)
downloadims-ecc0631ce6c120b080e0856cab9a61b8b52a3d11.tar.gz
[RCS] Add APIs to update and remove PresencePublisher and SubscribePublisher am: a3d2c5aa9e am: 0ec4ee823f
Change-Id: I6d5b17a34fe3661de1198ae3787cfc9121d24162
-rw-r--r--rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java64
-rw-r--r--rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java69
2 files changed, 108 insertions, 25 deletions
diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java
index cdf151a..b93b184 100644
--- a/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java
+++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java
@@ -192,7 +192,9 @@ public class PresencePublication extends PresenceBase {
String[] configRcsProvisionErrorOnPublishResponse) {
super(context);
logger.debug("PresencePublication constrcuct");
- this.mPresencePublisher = presencePublisher;
+ synchronized(mSyncObj) {
+ this.mPresencePublisher = presencePublisher;
+ }
mConfigVolteProvisionErrorOnPublishResponse = configVolteProvisionErrorOnPublishResponse;
mConfigRcsProvisionErrorOnPublishResponse = configRcsProvisionErrorOnPublishResponse;
@@ -209,6 +211,22 @@ public class PresencePublication extends PresenceBase {
sPresencePublication = this;
}
+ public void updatePresencePublisher(int subId, PresencePublisher presencePublisher) {
+ synchronized(mSyncObj) {
+ logger.debug("Update PresencePublisher: subId=" + subId);
+ this.mPresencePublisher = presencePublisher;
+ }
+ handleAssociatedSubscriptionChanged(subId);
+ }
+
+ public void removePresencePublisher(int subId) {
+ synchronized(mSyncObj) {
+ logger.debug("Remove PresencePublisher: subId=" + subId);
+ this.mPresencePublisher = null;
+ }
+ handleAssociatedSubscriptionChanged(subId);
+ }
+
private void requestPublishIfSubscriptionReady() {
if (!SubscriptionManager.isValidSubscriptionId(mAssociatedSubscription)) {
// pulled out the SIM, set it as the same as power on status:
@@ -463,8 +481,13 @@ public class PresencePublication extends PresenceBase {
* @return The result of the last Publish request.
*/
public @PresenceBase.PresencePublishState int getPublishState() {
- if (mPresencePublisher != null) {
- return mPresencePublisher.getPublisherState();
+ PresencePublisher presencePublisher = null;
+ synchronized(mSyncObj) {
+ presencePublisher = mPresencePublisher;
+ }
+
+ if (presencePublisher != null) {
+ return presencePublisher.getPublisherState();
}
return PUBLISH_STATE_NOT_PUBLISHED;
}
@@ -473,8 +496,13 @@ public class PresencePublication extends PresenceBase {
* @param publishState The result of the last publish request.
*/
public void setPublishState(int publishState) {
- if (mPresencePublisher != null) {
- mPresencePublisher.updatePublisherState(publishState);
+ PresencePublisher presencePublisher = null;
+ synchronized(mSyncObj) {
+ presencePublisher = mPresencePublisher;
+ }
+
+ if (presencePublisher != null) {
+ presencePublisher.updatePublisherState(publishState);
}
}
@@ -789,7 +817,12 @@ public class PresencePublication extends PresenceBase {
return;
}
- if (mPresencePublisher == null) {
+ PresencePublisher presencePublisher = null;
+ synchronized(mSyncObj) {
+ presencePublisher = mPresencePublisher;
+ }
+
+ if (presencePublisher == null) {
logger.error("mPresencePublisher == null");
return;
}
@@ -816,8 +849,8 @@ public class PresencePublication extends PresenceBase {
(mPublishingRequest == null) &&
publishRequest.hasSamePublishContent(mPublishedRequest)) &&
(getPublishState() != PUBLISH_STATE_NOT_PUBLISHED)) {
- logger.print("Don't need publish since the capability didn't change publishRequest " +
- publishRequest + " getPublishState()=" + getPublishState());
+ logger.print("Don't need publish since the capability didn't change publishRequest "
+ + publishRequest + " getPublishState()=" + getPublishState());
return;
}
@@ -852,18 +885,18 @@ public class PresencePublication extends PresenceBase {
// That will tell other phone that it has no volte/vt capability.
if(!RcsSettingUtils.isAdvancedCallingEnabledByUser(mAssociatedSubscription) &&
getPublishState() != PUBLISH_STATE_NOT_PUBLISHED) {
- // volte was not enabled.
- // or it is turnning off volte. lower layer should unpublish
- reset();
- return;
+ // volte was not enabled.
+ // or it is turnning off volte. lower layer should unpublish
+ reset();
+ return;
}
TelephonyManager teleMgr = (TelephonyManager) mContext.getSystemService(
Context.TELEPHONY_SERVICE);
teleMgr = teleMgr.createForSubscriptionId(mAssociatedSubscription);
if (teleMgr == null) {
- logger.error("TelephonyManager not available.");
- return;
+ logger.error("TelephonyManager not available.");
+ return;
}
Uri contactUri = Uri.fromParts(PhoneAccount.SCHEME_TEL, teleMgr.getLine1Number(), null);
@@ -888,7 +921,8 @@ public class PresencePublication extends PresenceBase {
String myNumber = getNumberFromUri(myUri);
int taskId = TaskManager.getDefault().addPublishTask(myNumber);
logger.print("doPublish, uri=" + myUri + ", myNumber=" + myNumber + ", taskId=" + taskId);
- int ret = mPresencePublisher.requestPublication(presenceInfoBuilder.build(), myUri, taskId);
+
+ int ret = presencePublisher.requestPublication(presenceInfoBuilder.build(), myUri, taskId);
if (ret != ResultCode.SUCCESS) {
logger.print("doPublish, task=" + taskId + " failed with code=" + ret);
TaskManager.getDefault().removeTask(taskId);
diff --git a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java
index 1d4e327..4be4e96 100644
--- a/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java
+++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java
@@ -47,6 +47,7 @@ public class PresenceSubscriber extends PresenceBase {
private Logger logger = Logger.getLogger(this.getClass().getName());
private SubscribePublisher mSubscriber;
+ private final Object mSubscriberLock = new Object();
private String mAvailabilityRetryNumber = null;
private int mAssociatedSubscription = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
@@ -61,12 +62,30 @@ public class PresenceSubscriber extends PresenceBase {
String[] configVolteProvisionErrorOnSubscribeResponse,
String[] configRcsProvisionErrorOnSubscribeResponse){
super(context);
- mSubscriber = subscriber;
+ synchronized(mSubscriberLock) {
+ this.mSubscriber = subscriber;
+ }
mConfigVolteProvisionErrorOnSubscribeResponse
= configVolteProvisionErrorOnSubscribeResponse;
mConfigRcsProvisionErrorOnSubscribeResponse = configRcsProvisionErrorOnSubscribeResponse;
}
+ public void updatePresenceSubscriber(int subId, SubscribePublisher subscriber) {
+ synchronized(mSubscriberLock) {
+ logger.print("Update PresencePublisher: subId=" + subId);
+ this.mSubscriber = subscriber;
+ }
+ handleAssociatedSubscriptionChanged(subId);
+ }
+
+ public void removePresenceSubscriber(int subId) {
+ synchronized(mSubscriberLock) {
+ logger.print("Remove PresencePublisher: subId=" + subId);
+ this.mSubscriber = null;
+ }
+ handleAssociatedSubscriptionChanged(subId);
+ }
+
public void handleAssociatedSubscriptionChanged(int newSubId) {
if (mAssociatedSubscription == newSubId) {
return;
@@ -105,7 +124,17 @@ public class PresenceSubscriber extends PresenceBase {
public int requestCapability(List<String> contactsNumber,
ContactCapabilityResponse listener) {
- int ret = mSubscriber.getStackStatusForCapabilityRequest();
+ SubscribePublisher subscriber = null;
+ synchronized(mSubscriberLock) {
+ subscriber = mSubscriber;
+ }
+
+ if (subscriber == null) {
+ logger.error("requestCapability Subscribe not registered");
+ return ResultCode.SUBSCRIBE_NOT_REGISTERED;
+ }
+
+ int ret = subscriber.getStackStatusForCapabilityRequest();
if (ret < ResultCode.SUCCESS) {
logger.error("requestCapability ret=" + ret);
return ret;
@@ -150,7 +179,7 @@ public class PresenceSubscriber extends PresenceBase {
listener, timeout);
logger.print("taskId=" + taskId);
- ret = mSubscriber.requestCapability(formatedContacts, taskId);
+ ret = subscriber.requestCapability(formatedContacts, taskId);
if(ret < ResultCode.SUCCESS) {
logger.error("requestCapability ret=" + ret + " remove taskId=" + taskId);
TaskManager.getDefault().removeTask(taskId);
@@ -203,7 +232,17 @@ public class PresenceSubscriber extends PresenceBase {
return ResultCode.ERROR_SERVICE_NOT_AVAILABLE;
}
- ret = mSubscriber.getStackStatusForCapabilityRequest();
+ SubscribePublisher subscriber = null;
+ synchronized(mSubscriberLock) {
+ subscriber = mSubscriber;
+ }
+
+ if (subscriber == null) {
+ logger.error("requestAvailability Subscribe not registered");
+ return ResultCode.SUBSCRIBE_NOT_REGISTERED;
+ }
+
+ ret = subscriber.getStackStatusForCapabilityRequest();
if (ret < ResultCode.SUCCESS) {
logger.error("requestAvailability=" + ret);
return ret;
@@ -217,7 +256,7 @@ public class PresenceSubscriber extends PresenceBase {
logger.print("addAvailabilityTask formatedContact=" + formatedContact);
- ret = mSubscriber.requestAvailability(formatedContact, taskId);
+ ret = subscriber.requestAvailability(formatedContact, taskId);
if (ret < ResultCode.SUCCESS) {
logger.error("requestAvailability ret=" + ret + " remove taskId=" + taskId);
TaskManager.getDefault().removeTask(taskId);
@@ -329,26 +368,36 @@ public class PresenceSubscriber extends PresenceBase {
}
public void onSipResponse(int requestId, int responseCode, String reasonPhrase) {
+ SubscribePublisher subscriber = null;
+ synchronized(mSubscriberLock) {
+ subscriber = mSubscriber;
+ }
+
if(isInConfigList(responseCode, reasonPhrase,
mConfigVolteProvisionErrorOnSubscribeResponse)) {
logger.print("volte provision sipCode=" + responseCode + " phrase=" + reasonPhrase);
- mSubscriber.updatePublisherState(PUBLISH_STATE_VOLTE_PROVISION_ERROR);
+ if (subscriber != null) {
+ subscriber.updatePublisherState(PUBLISH_STATE_VOLTE_PROVISION_ERROR);
+ }
notifyDm();
} else if(isInConfigList(responseCode, reasonPhrase,
mConfigRcsProvisionErrorOnSubscribeResponse)) {
logger.print("rcs proRcsPresence.vision sipCode=" + responseCode + " phrase="
+ reasonPhrase);
- mSubscriber.updatePublisherState(PUBLISH_STATE_RCS_PROVISION_ERROR);
+ if (subscriber != null) {
+ subscriber.updatePublisherState(PUBLISH_STATE_RCS_PROVISION_ERROR);
+ }
}
int errorCode = translateResponseCode(responseCode, reasonPhrase);
logger.print("handleSipResponse errorCode=" + errorCode);
if(errorCode == ResultCode.SUBSCRIBE_NOT_REGISTERED){
- logger.debug("setPublishState to unknown" +
- " for subscribe error 403 not registered");
- mSubscriber.updatePublisherState(PUBLISH_STATE_OTHER_ERROR);
+ logger.debug("setPublishState to unknown for subscribe error 403 not registered");
+ if (subscriber != null) {
+ subscriber.updatePublisherState(PUBLISH_STATE_OTHER_ERROR);
+ }
}
if(errorCode == ResultCode.SUBSCRIBE_NOT_AUTHORIZED_FOR_PRESENCE) {