From c416a46214621e16453dc343850067ace866bd55 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Tue, 4 Sep 2018 14:47:23 +0200
Subject: [PATCH] show user IMs when appropriate

---
 .../contacts/activities/ContactActivity.kt    | 17 +++++++
 .../activities/EditContactActivity.kt         | 25 +++++++++-
 .../activities/ViewContactActivity.kt         | 22 +++++++++
 .../dialogs/ManageVisibleFieldsDialog.kt      |  1 +
 .../contacts/helpers/Constants.kt             |  1 +
 .../contacts/helpers/ContactsHelper.kt        | 48 ++++++++++++++++++-
 .../contacts/helpers/DBHelper.kt              |  4 +-
 .../contacts/helpers/VcfImporter.kt           |  3 +-
 .../contacts/models/Contact.kt                |  6 ++-
 .../simplemobiletools/contacts/models/IM.kt   |  3 ++
 .../main/res/layout/activity_edit_contact.xml | 40 +++++++++++++++-
 .../main/res/layout/activity_view_contact.xml | 22 ++++++++-
 .../layout/dialog_manage_visible_fields.xml   |  8 ++++
 app/src/main/res/layout/item_edit_im.xml      | 38 +++++++++++++++
 app/src/main/res/layout/item_view_im.xml      | 38 +++++++++++++++
 app/src/main/res/values/donottranslate.xml    |  1 +
 16 files changed, 267 insertions(+), 10 deletions(-)
 create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/models/IM.kt
 create mode 100644 app/src/main/res/layout/item_edit_im.xml
 create mode 100644 app/src/main/res/layout/item_view_im.xml

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt
index fc61b549..08fc75c1 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt
@@ -149,6 +149,23 @@ abstract class ContactActivity : SimpleActivity() {
         }
     }
 
+    fun getIMTypeText(type: Int, label: String): String {
+        return if (type == ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM) {
+            label
+        } else {
+            getString(when (type) {
+                ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM -> R.string.aim
+                ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN -> R.string.windows_live
+                ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO -> R.string.yahoo
+                ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE -> R.string.skype
+                ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ -> R.string.qq
+                ContactsContract.CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK -> R.string.hangouts
+                ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ -> R.string.icq
+                else -> R.string.jabber
+            })
+        }
+    }
+
     fun getEventTextId(type: Int) = when (type) {
         ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY -> R.string.birthday
         ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY -> R.string.anniversary
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
index 86866c4b..eae9de09 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -35,7 +35,6 @@ import kotlinx.android.synthetic.main.item_edit_website.view.*
 import kotlinx.android.synthetic.main.item_event.view.*
 import org.joda.time.DateTime
 import org.joda.time.format.DateTimeFormat
-import java.util.*
 
 class EditContactActivity : ContactActivity() {
     private val INTENT_TAKE_PHOTO = 1
@@ -183,6 +182,7 @@ class EditContactActivity : ContactActivity() {
         contact_numbers_image.applyColorFilter(textColor)
         contact_emails_image.applyColorFilter(textColor)
         contact_addresses_image.applyColorFilter(textColor)
+        contact_ims_image.applyColorFilter(textColor)
         contact_events_image.applyColorFilter(textColor)
         contact_notes_image.applyColorFilter(textColor)
         contact_organization_image.applyColorFilter(textColor)
@@ -197,6 +197,8 @@ class EditContactActivity : ContactActivity() {
         contact_emails_add_new.background.applyColorFilter(textColor)
         contact_addresses_add_new.applyColorFilter(adjustedPrimaryColor)
         contact_addresses_add_new.background.applyColorFilter(textColor)
+        contact_ims_add_new.applyColorFilter(adjustedPrimaryColor)
+        contact_ims_add_new.background.applyColorFilter(textColor)
         contact_events_add_new.applyColorFilter(adjustedPrimaryColor)
         contact_events_add_new.background.applyColorFilter(textColor)
         contact_websites_add_new.applyColorFilter(adjustedPrimaryColor)
@@ -212,6 +214,7 @@ class EditContactActivity : ContactActivity() {
         contact_numbers_add_new.setOnClickListener { addNewPhoneNumberField() }
         contact_emails_add_new.setOnClickListener { addNewEmailField() }
         contact_addresses_add_new.setOnClickListener { addNewAddressField() }
+        contact_ims_add_new.setOnClickListener { addNewIMField() }
         contact_events_add_new.setOnClickListener { addNewEventField() }
         contact_websites_add_new.setOnClickListener { addNewWebsiteField() }
         contact_groups_add_new.setOnClickListener { showSelectGroupsDialog() }
@@ -300,6 +303,11 @@ class EditContactActivity : ContactActivity() {
         contact_addresses_holder.beVisibleIf(areAddressesVisible)
         contact_addresses_add_new.beVisibleIf(areAddressesVisible)
 
+        val areIMsVisible = showFields and SHOW_IMS_FIELD != 0
+        contact_ims_image.beVisibleIf(areIMsVisible)
+        contact_ims_holder.beVisibleIf(areIMsVisible)
+        contact_ims_add_new.beVisibleIf(areIMsVisible)
+
         val isOrganizationVisible = showFields and SHOW_ORGANIZATION_FIELD != 0
         contact_organization_company.beVisibleIf(isOrganizationVisible)
         contact_organization_job_position.beVisibleIf(isOrganizationVisible)
@@ -333,6 +341,7 @@ class EditContactActivity : ContactActivity() {
         setupPhoneNumbers()
         setupEmails()
         setupAddresses()
+        setupIMs()
         setupNotes()
         setupOrganization()
         setupWebsites()
@@ -397,6 +406,10 @@ class EditContactActivity : ContactActivity() {
         }
     }
 
+    private fun setupIMs() {
+
+    }
+
     private fun setupNotes() {
         contact_notes.setText(contact!!.notes)
     }
@@ -507,7 +520,7 @@ class EditContactActivity : ContactActivity() {
         originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE
         val organization = Organization("", "")
         contact = Contact(0, "", "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), originalContactSource, 0, 0, "",
-                null, "", ArrayList(), organization, ArrayList(), ArrayList())
+                null, "", ArrayList(), organization, ArrayList(), ArrayList(), ArrayList())
         contact_source.text = getPublicContactSource(contact!!.source)
     }
 
@@ -815,6 +828,10 @@ class EditContactActivity : ContactActivity() {
         return addresses
     }
 
+    private fun getFilledIMs() {
+
+    }
+
     private fun getFilledEvents(): ArrayList<Event> {
         val unknown = getString(R.string.unknown)
         val events = ArrayList<Event>()
@@ -915,6 +932,10 @@ class EditContactActivity : ContactActivity() {
         }
     }
 
+    private fun addNewIMField() {
+
+    }
+
     private fun addNewEventField() {
         val eventHolder = layoutInflater.inflate(R.layout.item_event, contact_events_holder, false) as ViewGroup
         updateTextColors(eventHolder)
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
index 0da6abe9..886d86c5 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
@@ -19,6 +19,7 @@ import kotlinx.android.synthetic.main.item_event.view.*
 import kotlinx.android.synthetic.main.item_view_address.view.*
 import kotlinx.android.synthetic.main.item_view_email.view.*
 import kotlinx.android.synthetic.main.item_view_group.view.*
+import kotlinx.android.synthetic.main.item_view_im.view.*
 import kotlinx.android.synthetic.main.item_view_phone_number.view.*
 import kotlinx.android.synthetic.main.item_website.view.*
 
@@ -153,6 +154,7 @@ class ViewContactActivity : ContactActivity() {
         setupPhoneNumbers()
         setupEmails()
         setupAddresses()
+        setupIMs()
         setupEvents()
         setupNotes()
         setupOrganization()
@@ -291,6 +293,26 @@ class ViewContactActivity : ContactActivity() {
         }
     }
 
+    private fun setupIMs() {
+        contact_ims_holder.removeAllViews()
+        val IMs = contact!!.IMs
+        if (IMs.isNotEmpty() && showFields and SHOW_IMS_FIELD != 0) {
+            IMs.forEach {
+                layoutInflater.inflate(R.layout.item_view_im, contact_ims_holder, false).apply {
+                    val IM = it
+                    contact_ims_holder.addView(this)
+                    contact_im.text = IM.value
+                    contact_im_type.text = getIMTypeText(IM.type, IM.label)
+                }
+            }
+            contact_ims_image.beVisible()
+            contact_ims_holder.beVisible()
+        } else {
+            contact_ims_image.beGone()
+            contact_ims_holder.beGone()
+        }
+    }
+
     private fun setupEvents() {
         contact_events_holder.removeAllViews()
         val events = contact!!.events
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt
index 9560f4b2..9b9afcf6 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt
@@ -23,6 +23,7 @@ class ManageVisibleFieldsDialog(val activity: BaseSimpleActivity) {
             put(SHOW_PHONE_NUMBERS_FIELD, R.id.manage_visible_fields_phone_numbers)
             put(SHOW_EMAILS_FIELD, R.id.manage_visible_fields_emails)
             put(SHOW_ADDRESSES_FIELD, R.id.manage_visible_fields_addresses)
+            put(SHOW_IMS_FIELD, R.id.manage_visible_fields_ims)
             put(SHOW_EVENTS_FIELD, R.id.manage_visible_fields_events)
             put(SHOW_NOTES_FIELD, R.id.manage_visible_fields_notes)
             put(SHOW_ORGANIZATION_FIELD, R.id.manage_visible_fields_organization)
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt
index c6ec72be..cd120548 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt
@@ -85,6 +85,7 @@ const val SHOW_GROUPS_FIELD = 2048
 const val SHOW_CONTACT_SOURCE_FIELD = 4096
 const val SHOW_WEBSITES_FIELD = 8192
 const val SHOW_NICKNAME_FIELD = 16384
+const val SHOW_IMS_FIELD = 32768
 
 const val DEFAULT_EMAIL_TYPE = CommonDataKinds.Email.TYPE_HOME
 const val DEFAULT_PHONE_NUMBER_TYPE = CommonDataKinds.Phone.TYPE_MOBILE
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
index fb29adc9..11cad798 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
@@ -141,8 +141,9 @@ class ContactsHelper(val activity: Activity) {
                     val organization = Organization("", "")
                     val websites = ArrayList<String>()
                     val cleanNumbers = ArrayList<PhoneNumber>()
+                    val ims = ArrayList<IM>()
                     val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, numbers, emails, addresses,
-                            events, accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, cleanNumbers)
+                            events, accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, cleanNumbers, ims)
 
                     contacts.put(id, contact)
                 } while (cursor.moveToNext())
@@ -192,6 +193,8 @@ class ContactsHelper(val activity: Activity) {
             contacts[key]?.addresses = addresses.valueAt(i)
         }
 
+        val IMs = getIMs()
+
         val events = getEvents()
         size = events.size()
         for (i in 0 until size) {
@@ -369,6 +372,45 @@ class ContactsHelper(val activity: Activity) {
         return addresses
     }
 
+    private fun getIMs(contactId: Int? = null): SparseArray<ArrayList<IM>> {
+        val IMs = SparseArray<ArrayList<IM>>()
+        val uri = ContactsContract.Data.CONTENT_URI
+        val projection = arrayOf(
+                ContactsContract.Data.RAW_CONTACT_ID,
+                CommonDataKinds.Im.DATA,
+                CommonDataKinds.Im.PROTOCOL,
+                CommonDataKinds.Im.CUSTOM_PROTOCOL
+        )
+
+        val selection = getSourcesSelection(true, contactId != null)
+        val selectionArgs = getSourcesSelectionArgs(CommonDataKinds.Im.CONTENT_ITEM_TYPE, contactId)
+
+        var cursor: Cursor? = null
+        try {
+            cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null)
+            if (cursor?.moveToFirst() == true) {
+                do {
+                    val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
+                    val IM = cursor.getStringValue(CommonDataKinds.Im.DATA) ?: continue
+                    val type = cursor.getIntValue(CommonDataKinds.Im.PROTOCOL)
+                    val label = cursor.getStringValue(CommonDataKinds.Im.CUSTOM_PROTOCOL) ?: ""
+
+                    if (IMs[id] == null) {
+                        IMs.put(id, ArrayList())
+                    }
+
+                    IMs[id]!!.add(IM(IM, type, label))
+                } while (cursor.moveToNext())
+            }
+        } catch (e: Exception) {
+            activity.showErrorToast(e)
+        } finally {
+            cursor?.close()
+        }
+
+        return IMs
+    }
+
     private fun getEvents(contactId: Int? = null): SparseArray<ArrayList<Event>> {
         val events = SparseArray<ArrayList<Event>>()
         val uri = ContactsContract.Data.CONTENT_URI
@@ -738,8 +780,10 @@ class ContactsHelper(val activity: Activity) {
                 val thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: ""
                 val organization = getOrganizations(id)[id] ?: Organization("", "")
                 val websites = getWebsites(id)[id] ?: ArrayList()
+                val cleanNumbers = ArrayList<PhoneNumber>()
+                val ims = getIMs(id)[id] ?: ArrayList()
                 return Contact(id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, number, emails, addresses, events,
-                        accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ArrayList())
+                        accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, cleanNumbers, ims)
             }
         } finally {
             cursor?.close()
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
index 3463d12f..41845d05 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
@@ -342,8 +342,10 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
                     phoneNumbers.mapTo(cleanPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") }
                 }
 
+                val IMs = ArrayList<IM>()
+
                 val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, "", phoneNumbers, emails, addresses,
-                        events, SMT_PRIVATE, starred, id, "", photo, notes, groups, organization, websites, cleanPhoneNumbers)
+                        events, SMT_PRIVATE, starred, id, "", photo, notes, groups, organization, websites, cleanPhoneNumbers, IMs)
                 contacts.add(contact)
             }
         }
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt
index bb7a59ff..81f46041 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt
@@ -111,9 +111,10 @@ class VcfImporter(val activity: SimpleActivity) {
                 val photo = null
                 val thumbnailUri = savePhoto(photoData)
                 val cleanPhoneNumbers = ArrayList<PhoneNumber>()
+                val IMs = ArrayList<IM>()
 
                 val contact = Contact(0, prefix, firstName, middleName, surname, suffix, nickname, photoUri, phoneNumbers, emails, addresses, events,
-                        targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, cleanPhoneNumbers)
+                        targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, cleanPhoneNumbers, IMs)
 
                 if (ContactsHelper(activity).insertContact(contact)) {
                     contactsImported++
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
index 1d7d0a76..de579144 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
@@ -9,7 +9,8 @@ import com.simplemobiletools.commons.helpers.SORT_DESCENDING
 data class Contact(val id: Int, var prefix: String, var firstName: String, var middleName: String, var surname: String, var suffix: String, var nickname: String,
                    var photoUri: String, var phoneNumbers: ArrayList<PhoneNumber>, var emails: ArrayList<Email>, var addresses: ArrayList<Address>,
                    var events: ArrayList<Event>, var source: String, var starred: Int, val contactId: Int, val thumbnailUri: String, var photo: Bitmap?, var notes: String,
-                   var groups: ArrayList<Group>, var organization: Organization, var websites: ArrayList<String>, var cleanPhoneNumbers: ArrayList<PhoneNumber>) :
+                   var groups: ArrayList<Group>, var organization: Organization, var websites: ArrayList<String>, var cleanPhoneNumbers: ArrayList<PhoneNumber>,
+                   var IMs: ArrayList<IM>) :
         Comparable<Contact> {
     companion object {
         var sorting = 0
@@ -98,7 +99,8 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
 
         return copy(id = 0, prefix = "", firstName = getFullName().toLowerCase(), middleName = "", surname = "", suffix = "", nickname = "", photoUri = "",
                 phoneNumbers = ArrayList(), events = ArrayList(), addresses = ArrayList(), emails = newEmails, source = "", starred = 0,
-                contactId = 0, thumbnailUri = "", notes = "", groups = ArrayList(), websites = ArrayList(), organization = Organization("", "")).toString()
+                contactId = 0, thumbnailUri = "", notes = "", groups = ArrayList(), websites = ArrayList(), organization = Organization("", ""),
+                IMs = ArrayList()).toString()
     }
 
     fun getHashToCompare() = getStringToCompare().hashCode()
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/IM.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/IM.kt
new file mode 100644
index 00000000..f646e9f4
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/IM.kt
@@ -0,0 +1,3 @@
+package com.simplemobiletools.contacts.models
+
+data class IM(var value: String, var type: Int, var label: String)
diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml
index 15c77a7c..fa6e8eb7 100644
--- a/app/src/main/res/layout/activity_edit_contact.xml
+++ b/app/src/main/res/layout/activity_edit_contact.xml
@@ -299,6 +299,44 @@
             android:paddingTop="@dimen/medium_margin"
             android:src="@drawable/ic_plus"/>
 
+        <ImageView
+            android:id="@+id/contact_ims_image"
+            android:layout_width="@dimen/contact_icons_size"
+            android:layout_height="@dimen/contact_icons_size"
+            android:layout_alignTop="@+id/contact_ims_holder"
+            android:paddingBottom="@dimen/small_margin"
+            android:paddingEnd="@dimen/small_margin"
+            android:paddingRight="@dimen/small_margin"
+            android:paddingTop="@dimen/medium_margin"
+            android:src="@drawable/ic_im"/>
+
+        <LinearLayout
+            android:id="@+id/contact_ims_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/contact_addresses_add_new"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:layout_toRightOf="@+id/contact_name_image"
+            android:orientation="vertical">
+
+            <include layout="@layout/item_edit_im"/>
+
+        </LinearLayout>
+
+        <ImageView
+            android:id="@+id/contact_ims_add_new"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/contact_ims_holder"
+            android:layout_centerHorizontal="true"
+            android:layout_marginTop="@dimen/small_margin"
+            android:background="@drawable/button_background"
+            android:paddingBottom="@dimen/medium_margin"
+            android:paddingLeft="@dimen/activity_margin"
+            android:paddingRight="@dimen/activity_margin"
+            android:paddingTop="@dimen/medium_margin"
+            android:src="@drawable/ic_plus"/>
+
         <ImageView
             android:id="@+id/contact_events_image"
             android:layout_width="@dimen/contact_icons_size"
@@ -314,7 +352,7 @@
             android:id="@+id/contact_events_holder"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_below="@+id/contact_addresses_add_new"
+            android:layout_below="@+id/contact_ims_add_new"
             android:layout_marginTop="@dimen/medium_margin"
             android:layout_toRightOf="@+id/contact_name_image"
             android:orientation="vertical">
diff --git a/app/src/main/res/layout/activity_view_contact.xml b/app/src/main/res/layout/activity_view_contact.xml
index e471ae49..74ce627d 100644
--- a/app/src/main/res/layout/activity_view_contact.xml
+++ b/app/src/main/res/layout/activity_view_contact.xml
@@ -241,6 +241,26 @@
             android:orientation="vertical"
             android:paddingLeft="@dimen/small_margin"/>
 
+        <ImageView
+            android:id="@+id/contact_ims_image"
+            android:layout_width="@dimen/contact_icons_size"
+            android:layout_height="@dimen/contact_icons_size"
+            android:layout_alignTop="@+id/contact_ims_holder"
+            android:paddingBottom="@dimen/small_margin"
+            android:paddingEnd="@dimen/small_margin"
+            android:paddingRight="@dimen/small_margin"
+            android:paddingTop="@dimen/medium_margin"
+            android:src="@drawable/ic_im"/>
+
+        <LinearLayout
+            android:id="@+id/contact_ims_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/contact_addresses_holder"
+            android:layout_toRightOf="@+id/contact_name_image"
+            android:orientation="vertical"
+            android:paddingLeft="@dimen/small_margin"/>
+
         <ImageView
             android:id="@+id/contact_events_image"
             android:layout_width="@dimen/contact_icons_size"
@@ -256,7 +276,7 @@
             android:id="@+id/contact_events_holder"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_below="@+id/contact_addresses_holder"
+            android:layout_below="@+id/contact_ims_holder"
             android:layout_toRightOf="@+id/contact_name_image"
             android:orientation="vertical"/>
 
diff --git a/app/src/main/res/layout/dialog_manage_visible_fields.xml b/app/src/main/res/layout/dialog_manage_visible_fields.xml
index 599fdb88..477e1210 100644
--- a/app/src/main/res/layout/dialog_manage_visible_fields.xml
+++ b/app/src/main/res/layout/dialog_manage_visible_fields.xml
@@ -86,6 +86,14 @@
             android:paddingTop="@dimen/activity_margin"
             android:text="@string/addresses"/>
 
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_ims"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/instant_messaging"/>
+
         <com.simplemobiletools.commons.views.MyAppCompatCheckbox
             android:id="@+id/manage_visible_fields_events"
             android:layout_width="match_parent"
diff --git a/app/src/main/res/layout/item_edit_im.xml b/app/src/main/res/layout/item_edit_im.xml
new file mode 100644
index 00000000..ea82a20e
--- /dev/null
+++ b/app/src/main/res/layout/item_edit_im.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/contact_im_holder"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <com.simplemobiletools.commons.views.MyEditText
+        android:id="@+id/contact_im"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_toLeftOf="@+id/contact_im_type"
+        android:layout_toStartOf="@+id/contact_im_type"
+        android:hint="@string/im"
+        android:lines="1"
+        android:maxLines="1"
+        android:singleLine="true"
+        android:textCursorDrawable="@null"
+        android:textSize="@dimen/bigger_text_size"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/contact_im_type"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignBottom="@+id/contact_im"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentRight="true"
+        android:layout_alignTop="@+id/contact_im"
+        android:layout_centerVertical="true"
+        android:background="?attr/selectableItemBackground"
+        android:gravity="center"
+        android:paddingLeft="@dimen/medium_margin"
+        android:paddingRight="@dimen/medium_margin"
+        android:text="@string/skype"
+        android:textSize="@dimen/bigger_text_size"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/layout/item_view_im.xml b/app/src/main/res/layout/item_view_im.xml
new file mode 100644
index 00000000..fb689418
--- /dev/null
+++ b/app/src/main/res/layout/item_view_im.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/contact_im_holder"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="?attr/selectableItemBackground"
+    android:paddingBottom="@dimen/normal_margin"
+    android:paddingTop="@dimen/normal_margin">
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/contact_im"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_centerVertical="true"
+        android:layout_toLeftOf="@+id/contact_im_type"
+        android:layout_toStartOf="@+id/contact_im_type"
+        android:lines="1"
+        android:maxLines="1"
+        android:singleLine="true"
+        android:textSize="@dimen/bigger_text_size"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/contact_im_type"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignBottom="@+id/contact_im"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentRight="true"
+        android:layout_alignTop="@+id/contact_im"
+        android:layout_centerVertical="true"
+        android:gravity="center"
+        android:paddingLeft="@dimen/medium_margin"
+        android:paddingRight="@dimen/medium_margin"
+        android:text="@string/aim"
+        android:textSize="@dimen/bigger_text_size"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml
index 1314df06..1c7e350b 100644
--- a/app/src/main/res/values/donottranslate.xml
+++ b/app/src/main/res/values/donottranslate.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
 
+    <string name="im">IM</string>
     <string name="aim">AIM</string>
     <string name="windows_live">Windows Live</string>
     <string name="yahoo">Yahoo</string>