Consolidate contact URI info during Publish am: 1b57b5a942

Change-Id: I26b9c56f6c434d4dde21d6c8236ea8aaa13d7fb9
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 19a802f..0b6b2ea 100644
--- a/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java
+++ b/rcs/rcsservice/src/com/android/service/ims/presence/PresencePublication.java
@@ -65,6 +65,10 @@
 
     private static final int TIMEOUT_CHECK_SUBSCRIPTION_READY_MS = 5000;
 
+    private static final String SIP_SCHEME = "sip";
+    private static final String TEL_SCHEME = "tel";
+    private static final String DOMAIN_SEPARATOR = "@";
+
     boolean mMovedToIWLAN = false;
     boolean mMovedToLTE = false;
     boolean mVoPSEnabled = false;
@@ -896,10 +900,14 @@
             logger.error("TelephonyManager not available.");
             return;
         }
-        Uri contactUri = Uri.fromParts(PhoneAccount.SCHEME_TEL, teleMgr.getLine1Number(), null);
+        Uri myUri = getUriForPublication();
+        if (myUri == null) {
+            logger.error("doPublish, myUri is null");
+            return;
+        }
 
         RcsContactUceCapability.Builder presenceInfoBuilder =
-                new RcsContactUceCapability.Builder(contactUri);
+                new RcsContactUceCapability.Builder(myUri);
         if (publishRequest.getVolteCapable()) {
             presenceInfoBuilder.add(RcsContactUceCapability.CAPABILITY_IP_VOICE_CALL);
         }
@@ -912,15 +920,11 @@
             mPublishingRequest.setTimestamp(System.currentTimeMillis());
         }
 
-        String myUri = getUriForPublication();
-        if (myUri == null) {
-            logger.error("doPublish, myUri is null");
-        }
         String myNumber = getNumberFromUri(myUri);
         int taskId = TaskManager.getDefault().addPublishTask(myNumber);
         logger.print("doPublish, uri=" + myUri + ", myNumber=" + myNumber + ", taskId=" + taskId);
-
-        int ret = presencePublisher.requestPublication(presenceInfoBuilder.build(), myUri, taskId);
+        int ret = presencePublisher.requestPublication(presenceInfoBuilder.build(),
+                myUri.toString(), taskId);
         if (ret != ResultCode.SUCCESS) {
             logger.print("doPublish, task=" + taskId + " failed with code=" + ret);
             TaskManager.getDefault().removeTask(taskId);
@@ -929,18 +933,19 @@
         mHasCachedTrigger = (ret == ResultCode.ERROR_SERVICE_NOT_AVAILABLE);
     }
 
-    private String getNumberFromUri(String uriString) {
-        String number = Uri.parse(uriString).getSchemeSpecificPart();
+    private String getNumberFromUri(Uri uri) {
+        if (uri == null) return null;
+        String number = uri.getSchemeSpecificPart();
         String[] numberParts = number.split("[@;:]");
 
         if (numberParts.length == 0) {
-            logger.error("getNumberFromUri: invalid uri=" + uriString);
+            logger.error("getNumberFromUri: invalid uri=" + uri);
             return null;
         }
         return numberParts[0];
     }
 
-    private String getUriForPublication() {
+    private Uri getUriForPublication() {
         TelephonyManager teleMgr = (TelephonyManager) mContext.getSystemService(
                 Context.TELEPHONY_SERVICE);
         if (teleMgr == null) {
@@ -949,37 +954,41 @@
         }
         teleMgr = teleMgr.createForSubscriptionId(mAssociatedSubscription);
 
-        String myNumUri = null;
+        Uri myNumUri = null;
         String myDomain = teleMgr.getIsimDomain();
         logger.debug("myDomain=" + myDomain);
-        if (myDomain != null && !TextUtils.isEmpty(myDomain)) {
+        if (!TextUtils.isEmpty(myDomain)) {
             String[] impu = teleMgr.getIsimImpu();
-
-            if(impu !=null){
-                for(int i=0; i<impu.length; i++){
+            if (impu != null) {
+                for (int i = 0; i < impu.length; i++) {
                     logger.debug("impu[" + i + "]=" + impu[i]);
-                    if(impu[i] != null && impu[i].startsWith("sip:") &&
-                            impu[i].endsWith(myDomain)){
-                        myNumUri = impu[i];
+                    if (!TextUtils.isEmpty(impu[i])) {
+                        Uri impuUri = Uri.parse(impu[i]);
+                        if (SIP_SCHEME.equals(impuUri.getScheme()) &&
+                                impuUri.getSchemeSpecificPart().endsWith(myDomain)) {
+                            myNumUri = impuUri;
+                            logger.debug("impu[" + i + "] -> uri:" + myNumUri);
+                        }
                         break;
                     }
                 }
             }
         }
-        String myNumber = null;
-        if (myNumUri != null) {
-            myNumber = Uri.parse(myNumUri).getSchemeSpecificPart();
+
+        // Try to parse URI, if it works, we are good!
+        String myNumber = myNumUri == null ? null : myNumUri.getSchemeSpecificPart();
+        if (!TextUtils.isEmpty(myNumber)) {
+            return myNumUri;
         }
 
-        if (myNumber == null) {
-            myNumber = ContactNumberUtils.getDefault().format(teleMgr.getLine1Number());
-            if (myDomain != null && !TextUtils.isEmpty(myDomain)) {
-                myNumUri = "sip:" + myNumber + "@" + myDomain;
-            } else {
-                myNumUri = "tel:" + myNumber;
-            }
+        // Fall back to trying to use the line 1 number to construct URI
+        myNumber = ContactNumberUtils.getDefault().format(teleMgr.getLine1Number());
+        if (myNumber == null) return null;
+        if (!TextUtils.isEmpty(myDomain)) {
+            return Uri.fromParts(SIP_SCHEME, myNumber + DOMAIN_SEPARATOR + myDomain, null);
+        } else {
+            return Uri.fromParts(TEL_SCHEME, myNumber, null);
         }
-        return myNumUri;
     }
 
     private PendingIntent mRetryAlarmIntent = null;