Integrating video chat into QuickContact

Bug: 3295622
Change-Id: I1288e735bf821b3e1acd20ca4fcfa4de08b62a1a
diff --git a/src/com/android/contacts/TypePrecedence.java b/src/com/android/contacts/TypePrecedence.java
index 62520a0..2adf3b5 100644
--- a/src/com/android/contacts/TypePrecedence.java
+++ b/src/com/android/contacts/TypePrecedence.java
@@ -99,7 +99,7 @@
     private static int[] getTypePrecedenceList(String mimetype) {
         if (mimetype.equals(Phone.CONTENT_ITEM_TYPE)) {
             return TYPE_PRECEDENCE_PHONES;
-        } else if (mimetype.equals(Constants.MIME_SMS_ADDRESS)) {
+        } else if (mimetype.equals(Constants.MIME_TYPE_SMS_ADDRESS)) {
             return TYPE_PRECEDENCE_PHONES;
         } else if (mimetype.equals(Email.CONTENT_ITEM_TYPE)) {
             return TYPE_PRECEDENCE_EMAIL;
@@ -107,6 +107,8 @@
             return TYPE_PRECEDENCE_POSTAL;
         } else if (mimetype.equals(Im.CONTENT_ITEM_TYPE)) {
             return TYPE_PRECEDENCE_IM;
+        } else if (mimetype.equals(Constants.MIME_TYPE_VIDEO_CHAT)) {
+            return TYPE_PRECEDENCE_IM;
         } else if (mimetype.equals(Organization.CONTENT_ITEM_TYPE)) {
             return TYPE_PRECEDENCE_ORG;
         } else {
diff --git a/src/com/android/contacts/quickcontact/DataAction.java b/src/com/android/contacts/quickcontact/DataAction.java
index 0788e7b..a00f49f 100644
--- a/src/com/android/contacts/quickcontact/DataAction.java
+++ b/src/com/android/contacts/quickcontact/DataAction.java
@@ -53,7 +53,7 @@
         mMimeType = mimeType;
 
         // Inflate strings from cursor
-        mAlternate = Constants.MIME_SMS_ADDRESS.equals(mimeType);
+        mAlternate = Constants.MIME_TYPE_SMS_ADDRESS.equals(mimeType);
         if (mAlternate && mKind.actionAltHeader != null) {
             mHeader = mKind.actionAltHeader.inflateUsing(context, cursor);
         } else if (mKind.actionHeader != null) {
@@ -94,7 +94,7 @@
                     // for the SIP-related intent-filters in its manifest.
                 }
             }
-        } else if (Constants.MIME_SMS_ADDRESS.equals(mimeType)) {
+        } else if (Constants.MIME_TYPE_SMS_ADDRESS.equals(mimeType)) {
             if (PhoneCapabilityTester.isSmsIntentRegistered(mContext)) {
                 final String number = getAsString(cursor, Phone.NUMBER);
                 if (!TextUtils.isEmpty(number)) {
@@ -116,7 +116,8 @@
                 mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(webAddress.toString()));
             }
 
-        } else if (Im.CONTENT_ITEM_TYPE.equals(mimeType)) {
+        } else if (Im.CONTENT_ITEM_TYPE.equals(mimeType)
+                || Constants.MIME_TYPE_VIDEO_CHAT.equals(mimeType)) {
             final boolean isEmail = Email.CONTENT_ITEM_TYPE.equals(
                     getAsString(cursor, Data.MIMETYPE));
             if (isEmail || isProtocolValid(cursor)) {
@@ -138,7 +139,12 @@
                     host = ContactsUtils.lookupProviderNameFromId(protocol);
                 }
 
-                if (!TextUtils.isEmpty(host) && !TextUtils.isEmpty(data)) {
+                if (Constants.MIME_TYPE_VIDEO_CHAT.equals(mimeType)) {
+                    if (!TextUtils.isEmpty(data)) {
+                        mIntent = new Intent(
+                                Intent.ACTION_SENDTO, Uri.parse("xmpp:" + data + "?call"));
+                    }
+                } else if (!TextUtils.isEmpty(host) && !TextUtils.isEmpty(data)) {
                     final String authority = host.toLowerCase();
                     final Uri imUri = new Uri.Builder().scheme(Constants.SCHEME_IMTO).authority(
                             authority).appendPath(data).build();
diff --git a/src/com/android/contacts/quickcontact/QuickContactWindow.java b/src/com/android/contacts/quickcontact/QuickContactWindow.java
index 5cfe8f1..a91058c 100644
--- a/src/com/android/contacts/quickcontact/QuickContactWindow.java
+++ b/src/com/android/contacts/quickcontact/QuickContactWindow.java
@@ -192,7 +192,7 @@
             Phone.CONTENT_ITEM_TYPE,
             SipAddress.CONTENT_ITEM_TYPE,
             Contacts.CONTENT_ITEM_TYPE,
-            Constants.MIME_SMS_ADDRESS,
+            Constants.MIME_TYPE_SMS_ADDRESS,
             Email.CONTENT_ITEM_TYPE,
     };
 
@@ -209,7 +209,9 @@
      * as defaults
      */
     private static final ArrayList<String> VIRTUAL_MIMETYPES = Lists.newArrayList(new String[] {
-            Im.CONTENT_ITEM_TYPE, Constants.MIME_SMS_ADDRESS
+            Im.CONTENT_ITEM_TYPE,
+            Constants.MIME_TYPE_SMS_ADDRESS,
+            Constants.MIME_TYPE_VIDEO_CHAT,
     });
     private static final int TOKEN_DATA = 1;
 
@@ -697,11 +699,13 @@
 
             // If phone number, also insert as text message action
             if (Phone.CONTENT_ITEM_TYPE.equals(mimeType) && kind != null) {
-                final DataAction action = new DataAction(mContext, Constants.MIME_SMS_ADDRESS,
+                final DataAction action = new DataAction(mContext, Constants.MIME_TYPE_SMS_ADDRESS,
                         kind, dataId, cursor);
                 considerAdd(action, cache);
             }
 
+            boolean isIm = Im.CONTENT_ITEM_TYPE.equals(mimeType);
+
             // Handle Email rows with presence data as Im entry
             final boolean hasPresence = !cursor.isNull(DataQuery.PRESENCE);
             if (hasPresence && Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
@@ -711,6 +715,20 @@
                     final DataAction action = new DataAction(mContext, Im.CONTENT_ITEM_TYPE, imKind,
                             dataId, cursor);
                     considerAdd(action, cache);
+                    isIm = true;
+                }
+            }
+
+            if (hasPresence && isIm) {
+                int chatCapability = cursor.getInt(DataQuery.CHAT_CAPABILITY);
+                if ((chatCapability & Im.CAPABILITY_HAS_CAMERA) != 0) {
+                    final DataKind imKind = accountTypes.getKindOrFallback(accountType,
+                            Im.CONTENT_ITEM_TYPE, mContext);
+                    if (imKind != null) {
+                        final DataAction chatAction = new DataAction(mContext,
+                                Constants.MIME_TYPE_VIDEO_CHAT, imKind, dataId, cursor);
+                        considerAdd(chatAction, cache);
+                    }
                 }
             }
         }
@@ -1379,6 +1397,7 @@
                 Data.STATUS_LABEL,
                 Data.STATUS_TIMESTAMP,
                 Data.PRESENCE,
+                Data.CHAT_CAPABILITY,
 
                 Data.RES_PACKAGE,
                 Data.MIMETYPE,
@@ -1405,10 +1424,11 @@
         final int STATUS_LABEL = 9;
         final int STATUS_TIMESTAMP = 10;
         final int PRESENCE = 11;
+        final int CHAT_CAPABILITY = 12;
 
-        final int RES_PACKAGE = 12;
-        final int MIMETYPE = 13;
-        final int IS_PRIMARY = 14;
-        final int IS_SUPER_PRIMARY = 15;
+        final int RES_PACKAGE = 13;
+        final int MIMETYPE = 14;
+        final int IS_PRIMARY = 15;
+        final int IS_SUPER_PRIMARY = 16;
     }
 }
diff --git a/src/com/android/contacts/util/Constants.java b/src/com/android/contacts/util/Constants.java
index 1d1e4e2..2457600 100644
--- a/src/com/android/contacts/util/Constants.java
+++ b/src/com/android/contacts/util/Constants.java
@@ -23,7 +23,9 @@
      * Specific MIME-type for {@link Phone#CONTENT_ITEM_TYPE} entries that
      * distinguishes actions that should initiate a text message.
      */
-    public static final String MIME_SMS_ADDRESS = "vnd.android.cursor.item/sms-address";
+    public static final String MIME_TYPE_SMS_ADDRESS = "vnd.android.cursor.item/sms-address";
+
+    public static final String MIME_TYPE_VIDEO_CHAT = "vnd.android.cursor.item/video-chat-address";
 
     public static final String SCHEME_TEL = "tel";
     public static final String SCHEME_SMSTO = "smsto";