diff options
author | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-01-17 22:10:11 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-01-17 22:10:11 +0000 |
commit | ecc0631ce6c120b080e0856cab9a61b8b52a3d11 (patch) | |
tree | 9885569131f5f9c381abbb8fef1164d4856dd9e5 | |
parent | 04002262709626d1fd449d3111bdce53bf9e4cbb (diff) | |
parent | 0ec4ee823fa7486aa0ed84a2c00c4fad1c4a1b8c (diff) | |
download | ims-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.java | 64 | ||||
-rw-r--r-- | rcs/rcsservice/src/com/android/service/ims/presence/PresenceSubscriber.java | 69 |
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) { |