From e5fa767e484831ab836c5837cf87fffa54c45264 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Kompiuteri=C5=B3=20meistras=20+37060040020?=
 <mobtechpd@gmail.com>
Date: Fri, 23 Mar 2018 22:56:24 +0200
Subject: [PATCH 01/61] Updated Lithuanian translation

fully translated
---
 app/src/main/res/values-lt/strings.xml | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index b6e898db..a52a94af 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -18,13 +18,13 @@
     <!-- Groups -->
     <string name="no_groups">Nėra grupių</string>
     <string name="create_new_group">Sukurti naują grupę</string>
-    <string name="remove_from_group">Remove from group</string>
-    <string name="no_group_participants">This group is empty</string>
-    <string name="add_contacts">Add contacts</string>
-    <string name="no_group_created">There are no contact groups on the device</string>
-    <string name="create_group">Create group</string>
-    <string name="add_to_group">Add to group</string>
-    <string name="create_group_under_account">Create group under account</string>
+    <string name="remove_from_group">Pašalinti iš grupės</string>
+    <string name="no_group_participants">Ši grupė tuščia</string>
+    <string name="add_contacts">Įtraukti kontaktus</string>
+    <string name="no_group_created">Šiame įrenginyje nėra kontaktų grupių</string>
+    <string name="create_group">Sukurti grupę</string>
+    <string name="add_to_group">Įtraukti į grupę</string>
+    <string name="create_group_under_account">Sukurti grupę paskyroje</string>
 
     <!-- Photo -->
     <string name="take_photo">Nufotografuoti</string>

From cb7ed564cfbd23351b8bb2228214b8e8edd91e13 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9rgio=20Marques?= <smarquespt@gmail.com>
Date: Mon, 26 Mar 2018 22:43:28 +0000
Subject: [PATCH 02/61] Update strings.xml

---
 app/src/main/res/values-pt/strings.xml | 34 +++++++++++++-------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 8c1521ee..91311f22 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -1,7 +1,7 @@
 <resources>
     <string name="app_name">Simple Contacts</string>
     <string name="app_launcher_name">Contactos</string>
-    <string name="address">Enederço</string>
+    <string name="address">Endereço</string>
     <string name="inserting">A inserir…</string>
     <string name="updating">A atualizar…</string>
     <string name="phone_storage">Armazenamento do telefone</string>
@@ -16,15 +16,15 @@
     <string name="surname">Apelido</string>
 
     <!-- Groups -->
-    <string name="no_groups">No groups</string>
-    <string name="create_new_group">Create a new group</string>
-    <string name="remove_from_group">Remove from group</string>
-    <string name="no_group_participants">This group is empty</string>
-    <string name="add_contacts">Add contacts</string>
-    <string name="no_group_created">There are no contact groups on the device</string>
-    <string name="create_group">Create group</string>
-    <string name="add_to_group">Add to group</string>
-    <string name="create_group_under_account">Create group under account</string>
+    <string name="no_groups">Não há grupos</string>
+    <string name="create_new_group">Criar um novo grupo</string>
+    <string name="remove_from_group">Remover do grupo</string>
+    <string name="no_group_participants">Este grupo está vazio</string>
+    <string name="add_contacts">Adicionar contactos</string>
+    <string name="no_group_created">Não existem grupos de contactos neste dispositivo/string>
+    <string name="create_group">Criar um grupo</string>
+    <string name="add_to_group">Adicionar ao grupo</string>
+    <string name="create_group_under_account">Criar grupo para a conta</string>
 
     <!-- Photo -->
     <string name="take_photo">Tirar foto</string>
@@ -38,8 +38,8 @@
     <string name="on_contact_click">Ao clicar no contacto</string>
     <string name="call_contact">Ligar</string>
     <string name="view_contact">Ver detalhes</string>
-    <string name="show_favorites_tab">Show favorites tab</string>
-    <string name="show_groups_tab">Show groups tab</string>
+    <string name="show_favorites_tab">Mostrar favoritos</string>
+    <string name="show_groups_tab">Mostrar grupos</string>
 
     <!-- Emails -->
     <string name="email">E-mail</string>
@@ -81,15 +81,15 @@
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
-    <string name="app_short_description">A contacts app for managing your contacts without ads.</string>
+    <string name="app_short_description">Uma aplicação para gerir os seus contactos.</string>
     <string name="app_long_description">
-        A simple app for creating or managing your contacts from any source. The contacts can be stored on your device only, but also synchronized via Google, or other accounts. You can display your favorite contacts on a separate list.
+        Uma aplicação básica para criar e gerir contactos. Pode utilizar a aplicação guardar os contactos localmente, na sua conta Google ou em outro tipo de contas. Pode mostrar os contactos favoritos numa lista distinta.
 
-        You can use it for managing user emails and events too. It has the ability to sort/filter by multiple parameters, optionally display surname as the first name.
+        Também pode utilizar a plicação para gerir endereços de e-mail e eventos. Tem a capacidade de ordenar/filtrar por diversos parâmetros e também a possibilidade de diversas formas de exibição dos contactos.
 
-        Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors.
+        Não contém anúncios ou permissões desnecessárias. É totalmente open source e permite personalização de cores.
 
-        This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com
+        Esta aplicação é apenas parte de um conjunto mais vasto de aplicações. Saiba mais em http://www.simplemobiletools.com
     </string>
 
     <!--

From 37c5f52ba8408209a3608ac55c63ac76ae6045a0 Mon Sep 17 00:00:00 2001
From: Unknown <dino.dugandzija@gmail.com>
Date: Wed, 28 Mar 2018 00:14:36 +0200
Subject: [PATCH 03/61] Croatian translation

App fully translated to Croatian.
---
 app/src/main/res/values-hr/strings.xml | 99 ++++++++++++++++++++++++++
 1 file changed, 99 insertions(+)
 create mode 100644 app/src/main/res/values-hr/strings.xml

diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
new file mode 100644
index 00000000..4dd2f0a5
--- /dev/null
+++ b/app/src/main/res/values-hr/strings.xml
@@ -0,0 +1,99 @@
+<resources>
+    <string name="app_name">Jednostavni kontakti</string>
+    <string name="app_launcher_name">Kontakti</string>
+    <string name="address">Adresa</string>
+    <string name="inserting">Dodavanje...</string>
+    <string name="updating">Ažuriranje...</string>
+    <string name="phone_storage">Pohrana na telefonu</string>
+    <string name="phone_storage_hidden">Pohrana na telefonu (nije vidljiva drugim aplikacijama))</string>
+
+    <string name="new_contact">Novi kontakt</string>
+    <string name="edit_contact">Uredi kontakt</string>
+    <string name="select_contact">Odaberi kontakt</string>
+    <string name="select_contacts">Odaberi kontakte</string>
+    <string name="first_name">Ime</string>
+    <string name="middle_name">Srednje ime</string>
+    <string name="surname">Prezime</string>
+
+    <!-- Groups -->
+    <string name="no_groups">Nema grupa</string>
+    <string name="create_new_group">Stvori novu grupu</string>
+    <string name="remove_from_group">Ukloni iz grupe</string>
+    <string name="no_group_participants">Ova grupa je prazna</string>
+    <string name="add_contacts">Dodaj kontakte</string>
+    <string name="no_group_created">Na uređaju nema grupa kontakata</string>
+    <string name="create_group">Stvori grupu</string>
+    <string name="add_to_group">Dodaj u grupu</string>
+    <string name="create_group_under_account">Stvorite grupu pod računom</string>
+
+    <!-- Photo -->
+    <string name="take_photo">Uslikaj</string>
+    <string name="choose_photo">Odaberi fotografiju</string>
+    <string name="remove_photo">Ukloni fotografiju</string>
+
+    <!-- Settings -->
+    <string name="start_name_with_surname">Započnite imena s prezimenima</string>
+    <string name="show_phone_numbers">Prikaži telefonske brojeve na glavnom zaslonu</string>
+    <string name="show_contact_thumbnails">Prikaži sličice kontakata</string>
+    <string name="on_contact_click">Prilikom dodira kontakta</string>
+    <string name="call_contact">Nazovi kontakt</string>
+    <string name="view_contact">Prikaži pojedinosti o kontaktu</string>
+    <string name="show_favorites_tab">Prikaži karticu favorita</string>
+    <string name="show_groups_tab">Prikaži karticu grupa</string>
+
+    <!-- Emails -->
+    <string name="email">E-pošta</string>
+    <string name="home">Kućni</string>
+    <string name="work">Posao</string>
+    <string name="other">Ostalo</string>
+
+    <!-- Phone numbers -->
+    <string name="number">Broj</string>
+    <string name="mobile">Mobilni</string>
+    <string name="main_number">Glavni</string>
+    <string name="work_fax">Poslovni fax</string>
+    <string name="home_fax">Kućni fax</string>
+    <string name="pager">Pager</string>
+    <string name="no_phone_number_found">Nije pronađen nijedan telefonski broj</string>
+
+    <!-- Events -->
+    <string name="birthday">Rođendan</string>
+    <string name="anniversary">Obljetnica</string>
+
+    <!-- Favorites -->
+    <string name="no_favorites">Čini se da još niste dodali nijedan kontakt u favorite.</string>
+    <string name="add_favorites">Dodaj favorite</string>
+    <string name="add_to_favorites">Dodaj u favorite</string>
+    <string name="remove_from_favorites">Ukloni iz favorita</string>
+
+    <!-- Search -->
+    <string name="search_contacts">Pretraži kontakte</string>
+    <string name="search_favorites">Pretraži favorite</string>
+
+    <!-- Export / Import -->
+    <string name="import_contacts">Uvezi kontakte</string>
+    <string name="export_contacts">Izvezi kontakte</string>
+    <string name="import_contacts_from_vcf">Uvoz kontakata iz .vcf datoteke</string>
+    <string name="export_contacts_to_vcf">Izvoz kontakata u .vcf datoteku</string>
+    <string name="target_contact_source">Ciljani izvor kontakta</string>
+    <string name="include_contact_sources">Uključi izvore kontakta</string>
+    <string name="filename_without_vcf">Naziv datoteke (bez .vcf)</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Aplikacija za upravljanje kontaktima bez oglasa.</string>
+    <string name="app_long_description">
+        Jednostavna aplikacija za izradu ili upravljanje kontaktima iz bilo kojeg izvora. Kontakti mogu biti pohranjeni samo na Vašem uređaju, ali i sinkronizirani putem Googlea ili drugih računa. Možete prikazati svoje omiljene kontakte na zasebnom popisu.
+
+        Možete ju koristiti za upravljanje e-poštom i događajima. Ima mogućnost sortirati/filtrirati višestrukim parametrima, po želji može prikazati prezime prvo, zatim ime.
+
+        Ne sadrži oglase ili nepotrebne dozvole. Aplikacije je otvorenog koda, pruža prilagodljive boje.
+
+        Ova je aplikacija samo dio većeg broja aplikacija. Možete pronaći ostatak na http://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>

From 6223d362bb235c49767da6bc0feb3d6ff7956868 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Wed, 28 Mar 2018 18:37:14 +0200
Subject: [PATCH 04/61] fix a closing strings tag

---
 app/src/main/res/values-pt/strings.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 91311f22..1b5faf67 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -21,7 +21,7 @@
     <string name="remove_from_group">Remover do grupo</string>
     <string name="no_group_participants">Este grupo está vazio</string>
     <string name="add_contacts">Adicionar contactos</string>
-    <string name="no_group_created">Não existem grupos de contactos neste dispositivo/string>
+    <string name="no_group_created">Não existem grupos de contactos neste dispositivo</string>
     <string name="create_group">Criar um grupo</string>
     <string name="add_to_group">Adicionar ao grupo</string>
     <string name="create_group_under_account">Criar grupo para a conta</string>

From 66c651bb3c7c8797e0daaf02dc76cfe3644d223e Mon Sep 17 00:00:00 2001
From: fricyo <30796677+fricyo@users.noreply.github.com>
Date: Fri, 30 Mar 2018 15:34:40 +0800
Subject: [PATCH 05/61] Update Translation

---
 app/src/main/res/values-zh-rTW/strings.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 9cc524f0..992ff2ef 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -24,7 +24,7 @@
     <string name="no_group_created">裝置內沒有聯絡人群組</string>
     <string name="create_group">建立群組</string>
     <string name="add_to_group">添加到群組</string>
-    <string name="create_group_under_account">Create group under account</string>
+    <string name="create_group_under_account">在帳號下建立群組</string>
 
     <!-- Photo -->
     <string name="take_photo">拍照</string>

From 5bfc2317e0cce5a6958a5a1b94c334fedb3c065b Mon Sep 17 00:00:00 2001
From: en2sv <en2sv@users.noreply.github.com>
Date: Mon, 2 Apr 2018 20:08:22 +0200
Subject: [PATCH 06/61] Update Swedish translation

---
 app/src/main/res/values-sv/strings.xml | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index de16ba0c..ce898e54 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -16,15 +16,15 @@
     <string name="surname">Efternamn</string>
 
     <!-- Groups -->
-    <string name="no_groups">No groups</string>
-    <string name="create_new_group">Create a new group</string>
-    <string name="remove_from_group">Remove from group</string>
-    <string name="no_group_participants">This group is empty</string>
-    <string name="add_contacts">Add contacts</string>
-    <string name="no_group_created">There are no contact groups on the device</string>
-    <string name="create_group">Create group</string>
-    <string name="add_to_group">Add to group</string>
-    <string name="create_group_under_account">Create group under account</string>
+    <string name="no_groups">Inga grupper</string>
+    <string name="create_new_group">Skapa en ny grupp</string>
+    <string name="remove_from_group">Ta bort från grupp</string>
+    <string name="no_group_participants">Denna grupp är tom</string>
+    <string name="add_contacts">Lägg till kontakter</string>
+    <string name="no_group_created">Det finns inga kontaktgrupper på enheten</string>
+    <string name="create_group">Skapa grupp</string>
+    <string name="add_to_group">Lägg till i grupp</string>
+    <string name="create_group_under_account">Skapa gruppen i kontot</string>
 
     <!-- Photo -->
     <string name="take_photo">Ta foto</string>
@@ -38,8 +38,8 @@
     <string name="on_contact_click">Vid kontakttryckning</string>
     <string name="call_contact">Ring kontakt</string>
     <string name="view_contact">Visa kontaktuppgifter</string>
-    <string name="show_favorites_tab">Show favorites tab</string>
-    <string name="show_groups_tab">Show groups tab</string>
+    <string name="show_favorites_tab">Visa fliken Favoriter</string>
+    <string name="show_groups_tab">Visa fliken Grupper</string>
 
     <!-- Emails -->
     <string name="email">E-post</string>

From b8f470773e8bee72e2814a2db8ac2f9ebb939da0 Mon Sep 17 00:00:00 2001
From: kniddl <10777535+kniddl@users.noreply.github.com>
Date: Wed, 4 Apr 2018 22:28:19 +0200
Subject: [PATCH 07/61] Updated German Groups section

---
 app/src/main/res/values-de/strings.xml | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 28f5755a..21548505 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -16,15 +16,15 @@
     <string name="surname">Familienname</string>
 
     <!-- Groups -->
-    <string name="no_groups">No groups</string>
-    <string name="create_new_group">Create a new group</string>
-    <string name="remove_from_group">Remove from group</string>
-    <string name="no_group_participants">This group is empty</string>
-    <string name="add_contacts">Add contacts</string>
-    <string name="no_group_created">There are no contact groups on the device</string>
-    <string name="create_group">Create group</string>
-    <string name="add_to_group">Add to group</string>
-    <string name="create_group_under_account">Create group under account</string>
+    <string name="no_groups">Keine Gruppen</string>
+    <string name="create_new_group">Eine neue Gruppe erstellen</string>
+    <string name="remove_from_group">Von Gruppe entfernen</string>
+    <string name="no_group_participants">Diese Gruppe ist leer</string>
+    <string name="add_contacts">Kontakte hinzufügen</string>
+    <string name="no_group_created">Es sind keine Kontaktgruppen auf diesem Gerät vorhanden</string>
+    <string name="create_group">Erstelle Gruppe</string>
+    <string name="add_to_group">Zu Gruppe hinzufügen</string>
+    <string name="create_group_under_account">Gruppe in diesem Konto erstellen</string>
 
     <!-- Photo -->
     <string name="take_photo">Foto machen</string>

From 9527def54048a6425527d19ea4f68bcf499fa371 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 6 Apr 2018 17:54:43 +0200
Subject: [PATCH 08/61] update commons to 3.18.9

---
 app/build.gradle                                         | 3 +--
 .../contacts/activities/GroupContactsActivity.kt         | 1 -
 .../contacts/activities/MainActivity.kt                  | 9 +--------
 .../contacts/activities/SettingsActivity.kt              | 3 +--
 .../contacts/adapters/ContactsAdapter.kt                 | 1 +
 .../simplemobiletools/contacts/adapters/GroupsAdapter.kt | 7 +++++--
 .../contacts/fragments/MyViewPagerFragment.kt            | 2 --
 build.gradle                                             | 4 ++--
 8 files changed, 11 insertions(+), 19 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index abf62b29..600cd58d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -45,10 +45,9 @@ ext {
 }
 
 dependencies {
-    implementation 'com.simplemobiletools:commons:3.16.12'
+    implementation 'com.simplemobiletools:commons:3.18.9'
     implementation 'joda-time:joda-time:2.9.9'
     implementation 'com.facebook.stetho:stetho:1.5.0'
-    implementation 'com.google.code.gson:gson:2.8.2'
 
     debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakCanaryVersion"
     releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:$leakCanaryVersion"
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt
index 03136965..077880de 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt
@@ -90,7 +90,6 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh
                     ON_CLICK_EDIT_CONTACT -> editContact(it as Contact)
                 }
             }.apply {
-                setupDragListener(true)
                 addVerticalDividers(true)
                 group_contacts_list.adapter = this
             }
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
index 3997c5b0..f05fcdf5 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
@@ -40,7 +40,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
     private var isSearchOpen = false
     private var searchMenuItem: MenuItem? = null
 
-    private var storedUseEnglish = false
     private var storedTextColor = 0
     private var storedBackgroundColor = 0
     private var storedPrimaryColor = 0
@@ -79,13 +78,8 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
 
     override fun onResume() {
         super.onResume()
-        if (storedUseEnglish != config.useEnglish) {
-            restartActivity()
-            return
-        }
-
         if (storedShowPhoneNumbers != config.showPhoneNumbers) {
-            restartActivity()
+            System.exit(0)
             return
         }
 
@@ -179,7 +173,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
 
     private fun storeStateVariables() {
         config.apply {
-            storedUseEnglish = useEnglish
             storedTextColor = textColor
             storedBackgroundColor = backgroundColor
             storedPrimaryColor = primaryColor
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SettingsActivity.kt
index bfc35114..eb41f275 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SettingsActivity.kt
@@ -4,7 +4,6 @@ import android.os.Bundle
 import com.simplemobiletools.commons.dialogs.RadioGroupDialog
 import com.simplemobiletools.commons.extensions.beVisibleIf
 import com.simplemobiletools.commons.extensions.updateTextColors
-import com.simplemobiletools.commons.extensions.useEnglishToggled
 import com.simplemobiletools.commons.models.RadioItem
 import com.simplemobiletools.contacts.R
 import com.simplemobiletools.contacts.extensions.config
@@ -46,7 +45,7 @@ class SettingsActivity : SimpleActivity() {
         settings_use_english_holder.setOnClickListener {
             settings_use_english.toggle()
             config.useEnglish = settings_use_english.isChecked
-            useEnglishToggled()
+            System.exit(0)
         }
     }
 
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt
index 7cc74c73..8273860d 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt
@@ -47,6 +47,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
     private var bigPadding = activity.resources.getDimension(R.dimen.normal_margin).toInt()
 
     init {
+        setupDragListener(true)
         initDrawables()
         showContactThumbnails = config.showContactThumbnails
         showPhoneNumbers = config.showPhoneNumbers
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt
index 41cd4464..9869eca8 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/GroupsAdapter.kt
@@ -24,11 +24,14 @@ import java.util.*
 class GroupsAdapter(activity: SimpleActivity, var groups: ArrayList<Group>, val refreshListener: RefreshContactsListener?, recyclerView: MyRecyclerView,
                     fastScroller: FastScroller, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) {
 
-    private var config = activity.config
     private var smallPadding = activity.resources.getDimension(R.dimen.small_margin).toInt()
     private var bigPadding = activity.resources.getDimension(R.dimen.normal_margin).toInt()
 
-    var showContactThumbnails = config.showContactThumbnails
+    var showContactThumbnails = activity.config.showContactThumbnails
+
+    init {
+        setupDragListener(true)
+    }
 
     override fun getActionMenuId() = R.menu.cab_groups
 
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
index 1adc2d25..7d6fccb4 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
@@ -149,7 +149,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
                     activity!!.startActivity(this)
                 }
             }.apply {
-                setupDragListener(true)
                 addVerticalDividers(true)
                 fragment_list.adapter = this
             }
@@ -190,7 +189,6 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
                     ON_CLICK_EDIT_CONTACT -> context!!.editContact(it as Contact)
                 }
             }.apply {
-                setupDragListener(true)
                 addVerticalDividers(true)
                 fragment_list.adapter = this
             }
diff --git a/build.gradle b/build.gradle
index 73d77ca8..3437621a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,7 +1,7 @@
 // Top-level build file where you can add configuration options common to all sub-projects/modules.
 
 buildscript {
-    ext.kotlin_version = '1.2.30'
+    ext.kotlin_version = '1.2.31'
 
     repositories {
         google()
@@ -9,7 +9,7 @@ buildscript {
     }
 
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.0.1'
+        classpath 'com.android.tools.build:gradle:3.1.0'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
 
         // NOTE: Do not place your application dependencies here; they belong

From fd01e27122e62884b07c458b80e8585e87d0a31d Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 6 Apr 2018 18:02:17 +0200
Subject: [PATCH 09/61] update commons to 3.18.10

---
 app/build.gradle | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/build.gradle b/app/build.gradle
index 600cd58d..5b81b45b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -45,7 +45,7 @@ ext {
 }
 
 dependencies {
-    implementation 'com.simplemobiletools:commons:3.18.9'
+    implementation 'com.simplemobiletools:commons:3.18.10'
     implementation 'joda-time:joda-time:2.9.9'
     implementation 'com.facebook.stetho:stetho:1.5.0'
 

From 4cbe122672a702091d4f391c9a5aef3aae437fd2 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 6 Apr 2018 18:18:27 +0200
Subject: [PATCH 10/61] delete contacts on a background thread

---
 .../contacts/helpers/ContactsHelper.kt        | 36 ++++++++++---------
 1 file changed, 19 insertions(+), 17 deletions(-)

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 06c00a22..b2e02e13 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
@@ -1044,25 +1044,27 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
     }
 
     fun deleteContacts(contacts: ArrayList<Contact>) {
-        val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id.toString() }.toTypedArray()
-        activity.dbHelper.deleteContacts(localContacts)
+        Thread {
+            val localContacts = contacts.filter { it.source == SMT_PRIVATE }.map { it.id.toString() }.toTypedArray()
+            activity.dbHelper.deleteContacts(localContacts)
 
-        try {
-            val contactIDs = HashSet<String>()
-            val operations = ArrayList<ContentProviderOperation>()
-            val selection = "${ContactsContract.Data.CONTACT_ID} = ?"
-            contacts.filter { it.source != SMT_PRIVATE }.forEach {
-                ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).apply {
-                    val selectionArgs = arrayOf(it.contactId.toString())
-                    withSelection(selection, selectionArgs)
-                    operations.add(this.build())
+            try {
+                val contactIDs = HashSet<String>()
+                val operations = ArrayList<ContentProviderOperation>()
+                val selection = "${ContactsContract.Data.CONTACT_ID} = ?"
+                contacts.filter { it.source != SMT_PRIVATE }.forEach {
+                    ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).apply {
+                        val selectionArgs = arrayOf(it.contactId.toString())
+                        withSelection(selection, selectionArgs)
+                        operations.add(this.build())
+                    }
+                    contactIDs.add(it.id.toString())
                 }
-                contactIDs.add(it.id.toString())
-            }
 
-            activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
-        } catch (e: Exception) {
-            activity.showErrorToast(e)
-        }
+                activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
+            } catch (e: Exception) {
+                activity.showErrorToast(e)
+            }
+        }.start()
     }
 }

From 764de9c8583e06d940a024cfb204e0c7f867f0cf Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 6 Apr 2018 18:29:48 +0200
Subject: [PATCH 11/61] make sure we handle phone number at some intents
 properly on older devices too

---
 .../contacts/activities/EditContactActivity.kt                  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 b88e05db..71c74a5a 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -139,7 +139,7 @@ class EditContactActivity : ContactActivity() {
         }
 
         if (contact!!.id == 0 && intent.extras?.containsKey(KEY_PHONE) == true && (intent.action == Intent.ACTION_INSERT_OR_EDIT || intent.action == Intent.ACTION_INSERT)) {
-            val phoneNumber = intent.getStringExtra(KEY_PHONE)
+            val phoneNumber = intent.extras.get(KEY_PHONE).toString()
             contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE))
             setupPhoneNumbers()
         }

From e05f48b425e5069a4a1b6b6e19ecd1287e22a969 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 6 Apr 2018 18:51:21 +0200
Subject: [PATCH 12/61] fix #110, allow launching the app without granting
 Contacts permission

---
 .../contacts/activities/MainActivity.kt       |  13 +-
 .../contacts/extensions/Context.kt            |   5 +
 .../contacts/helpers/ContactsHelper.kt        | 173 ++++++++++--------
 3 files changed, 104 insertions(+), 87 deletions(-)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
index f05fcdf5..c79686bf 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
@@ -59,17 +59,12 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
         handlePermission(PERMISSION_READ_CONTACTS) {
             if (it) {
                 handlePermission(PERMISSION_WRITE_CONTACTS) {
-                    if (it) {
-                        storeLocalAccountData()
-                        initFragments()
-                    } else {
-                        toast(R.string.no_contacts_permission)
-                        finish()
-                    }
+                    storeLocalAccountData()
+                    initFragments()
                 }
             } else {
-                toast(R.string.no_contacts_permission)
-                finish()
+                storeLocalAccountData()
+                initFragments()
             }
         }
         storeStateVariables()
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt
index 8731909a..5c1befcc 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt
@@ -9,7 +9,10 @@ import android.os.Build
 import android.provider.ContactsContract
 import android.support.v4.content.FileProvider
 import com.simplemobiletools.commons.extensions.getIntValue
+import com.simplemobiletools.commons.extensions.hasPermission
 import com.simplemobiletools.commons.extensions.toast
+import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
+import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
 import com.simplemobiletools.commons.helpers.isLollipopPlus
 import com.simplemobiletools.contacts.BuildConfig
 import com.simplemobiletools.contacts.R
@@ -155,3 +158,5 @@ fun Context.getPhotoThumbnailSize(): Int {
     }
     return 0
 }
+
+fun Context.hasContactPermissions() = hasPermission(PERMISSION_READ_CONTACTS) && hasPermission(PERMISSION_WRITE_CONTACTS)
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 b2e02e13..3d3b73d3 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
@@ -20,87 +20,14 @@ import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME
 import com.simplemobiletools.commons.helpers.SORT_BY_SURNAME
 import com.simplemobiletools.commons.helpers.SORT_DESCENDING
 import com.simplemobiletools.contacts.R
-import com.simplemobiletools.contacts.extensions.config
-import com.simplemobiletools.contacts.extensions.dbHelper
-import com.simplemobiletools.contacts.extensions.getByteArray
-import com.simplemobiletools.contacts.extensions.getPhotoThumbnailSize
+import com.simplemobiletools.contacts.extensions.*
 import com.simplemobiletools.contacts.models.*
 
 class ContactsHelper(val activity: BaseSimpleActivity) {
     fun getContacts(callback: (ArrayList<Contact>) -> Unit) {
         val contacts = SparseArray<Contact>()
         Thread {
-            val uri = ContactsContract.Data.CONTENT_URI
-            val projection = getContactProjection()
-            val selection = "${ContactsContract.Data.MIMETYPE} = ?"
-            val selectionArgs = arrayOf(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
-            val sortOrder = getSortString()
-
-            var cursor: Cursor? = null
-            try {
-                cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
-                if (cursor?.moveToFirst() == true) {
-                    do {
-                        val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
-                        val firstName = cursor.getStringValue(CommonDataKinds.StructuredName.GIVEN_NAME) ?: ""
-                        val middleName = cursor.getStringValue(CommonDataKinds.StructuredName.MIDDLE_NAME) ?: ""
-                        val surname = cursor.getStringValue(CommonDataKinds.StructuredName.FAMILY_NAME) ?: ""
-                        val photoUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_URI) ?: ""
-                        val number = ArrayList<PhoneNumber>()       // proper value is obtained below
-                        val emails = ArrayList<Email>()
-                        val addresses = ArrayList<Address>()
-                        val events = ArrayList<Event>()
-                        val accountName = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_NAME) ?: ""
-                        val starred = cursor.getIntValue(CommonDataKinds.StructuredName.STARRED)
-                        val contactId = cursor.getIntValue(ContactsContract.Data.CONTACT_ID)
-                        val thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: ""
-                        val notes = ""
-                        val groups = ArrayList<Group>()
-                        val contact = Contact(id, firstName, middleName, surname, photoUri, number, emails, addresses, events, accountName,
-                                starred, contactId, thumbnailUri, null, notes, groups)
-                        contacts.put(id, contact)
-                    } while (cursor.moveToNext())
-                }
-            } catch (e: Exception) {
-                activity.showErrorToast(e)
-            } finally {
-                cursor?.close()
-            }
-
-            val phoneNumbers = getPhoneNumbers()
-            var size = phoneNumbers.size()
-            for (i in 0 until size) {
-                val key = phoneNumbers.keyAt(i)
-                contacts[key]?.phoneNumbers = phoneNumbers.valueAt(i)
-            }
-
-            val emails = getEmails()
-            size = emails.size()
-            for (i in 0 until size) {
-                val key = emails.keyAt(i)
-                contacts[key]?.emails = emails.valueAt(i)
-            }
-
-            val addresses = getAddresses()
-            size = addresses.size()
-            for (i in 0 until size) {
-                val key = addresses.keyAt(i)
-                contacts[key]?.addresses = addresses.valueAt(i)
-            }
-
-            val events = getEvents()
-            size = events.size()
-            for (i in 0 until size) {
-                val key = events.keyAt(i)
-                contacts[key]?.events = events.valueAt(i)
-            }
-
-            val notes = getNotes()
-            size = notes.size()
-            for (i in 0 until size) {
-                val key = notes.keyAt(i)
-                contacts[key]?.notes = notes.valueAt(i)
-            }
+            getDeviceContacts(contacts)
 
             activity.dbHelper.getContacts(activity).forEach {
                 contacts.put(it.id, it)
@@ -113,7 +40,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
 
             // groups are obtained with contactID, not rawID, so assign them to proper contacts like this
             val groups = getContactGroups(getStoredGroups())
-            size = groups.size()
+            val size = groups.size()
             for (i in 0 until size) {
                 val key = groups.keyAt(i)
                 resultContacts.firstOrNull { it.contactId == key }?.groups = groups.valueAt(i)
@@ -125,6 +52,84 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
         }.start()
     }
 
+    private fun getDeviceContacts(contacts: SparseArray<Contact>) {
+        if (!activity.hasContactPermissions()) {
+            return
+        }
+
+        val uri = ContactsContract.Data.CONTENT_URI
+        val projection = getContactProjection()
+        val selection = "${ContactsContract.Data.MIMETYPE} = ?"
+        val selectionArgs = arrayOf(CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
+        val sortOrder = getSortString()
+
+        var cursor: Cursor? = null
+        try {
+            cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, sortOrder)
+            if (cursor?.moveToFirst() == true) {
+                do {
+                    val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
+                    val firstName = cursor.getStringValue(CommonDataKinds.StructuredName.GIVEN_NAME) ?: ""
+                    val middleName = cursor.getStringValue(CommonDataKinds.StructuredName.MIDDLE_NAME) ?: ""
+                    val surname = cursor.getStringValue(CommonDataKinds.StructuredName.FAMILY_NAME) ?: ""
+                    val photoUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_URI) ?: ""
+                    val number = ArrayList<PhoneNumber>()       // proper value is obtained below
+                    val emails = ArrayList<Email>()
+                    val addresses = ArrayList<Address>()
+                    val events = ArrayList<Event>()
+                    val accountName = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_NAME) ?: ""
+                    val starred = cursor.getIntValue(CommonDataKinds.StructuredName.STARRED)
+                    val contactId = cursor.getIntValue(ContactsContract.Data.CONTACT_ID)
+                    val thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: ""
+                    val notes = ""
+                    val groups = ArrayList<Group>()
+                    val contact = Contact(id, firstName, middleName, surname, photoUri, number, emails, addresses, events, accountName,
+                            starred, contactId, thumbnailUri, null, notes, groups)
+                    contacts.put(id, contact)
+                } while (cursor.moveToNext())
+            }
+        } catch (e: Exception) {
+            activity.showErrorToast(e)
+        } finally {
+            cursor?.close()
+        }
+
+        val phoneNumbers = getPhoneNumbers()
+        var size = phoneNumbers.size()
+        for (i in 0 until size) {
+            val key = phoneNumbers.keyAt(i)
+            contacts[key]?.phoneNumbers = phoneNumbers.valueAt(i)
+        }
+
+        val emails = getEmails()
+        size = emails.size()
+        for (i in 0 until size) {
+            val key = emails.keyAt(i)
+            contacts[key]?.emails = emails.valueAt(i)
+        }
+
+        val addresses = getAddresses()
+        size = addresses.size()
+        for (i in 0 until size) {
+            val key = addresses.keyAt(i)
+            contacts[key]?.addresses = addresses.valueAt(i)
+        }
+
+        val events = getEvents()
+        size = events.size()
+        for (i in 0 until size) {
+            val key = events.keyAt(i)
+            contacts[key]?.events = events.valueAt(i)
+        }
+
+        val notes = getNotes()
+        size = notes.size()
+        for (i in 0 until size) {
+            val key = notes.keyAt(i)
+            contacts[key]?.notes = notes.valueAt(i)
+        }
+    }
+
     private fun getPhoneNumbers(contactId: Int? = null): SparseArray<ArrayList<PhoneNumber>> {
         val phoneNumbers = SparseArray<ArrayList<PhoneNumber>>()
         val uri = CommonDataKinds.Phone.CONTENT_URI
@@ -317,6 +322,10 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
 
     private fun getContactGroups(storedGroups: ArrayList<Group>, contactId: Int? = null): SparseArray<ArrayList<Group>> {
         val groups = SparseArray<ArrayList<Group>>()
+        if (!activity.hasContactPermissions()) {
+            return groups
+        }
+
         val uri = ContactsContract.Data.CONTENT_URI
         val projection = arrayOf(
                 ContactsContract.Data.CONTACT_ID,
@@ -357,7 +366,17 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
     }
 
     fun getStoredGroups(): ArrayList<Group> {
+        val groups = getDeviceStoredGroups()
+        groups.addAll(activity.dbHelper.getGroups())
+        return groups
+    }
+
+    fun getDeviceStoredGroups(): ArrayList<Group> {
         val groups = ArrayList<Group>()
+        if (!activity.hasContactPermissions()) {
+            return groups
+        }
+
         val uri = ContactsContract.Groups.CONTENT_URI
         val projection = arrayOf(
                 ContactsContract.Groups._ID,
@@ -389,8 +408,6 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
         } finally {
             cursor?.close()
         }
-
-        groups.addAll(activity.dbHelper.getGroups())
         return groups
     }
 

From bd83bd5643d33c3faae7aea7ea3f90f6441144be Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 6 Apr 2018 20:58:22 +0200
Subject: [PATCH 13/61] more improvements related to using the app without the
 Contacts permission

---
 .../activities/EditContactActivity.kt         | 22 +------
 .../contacts/activities/MainActivity.kt       | 14 ++---
 .../activities/ViewContactActivity.kt         | 14 +----
 .../contacts/helpers/ContactsHelper.kt        | 59 +++++++++++--------
 4 files changed, 44 insertions(+), 65 deletions(-)

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 71c74a5a..9e7fe652 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -16,8 +16,6 @@ import android.widget.ImageView
 import android.widget.TextView
 import com.simplemobiletools.commons.dialogs.RadioGroupDialog
 import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
-import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
 import com.simplemobiletools.commons.models.RadioItem
 import com.simplemobiletools.contacts.R
 import com.simplemobiletools.contacts.dialogs.SelectGroupsDialog
@@ -58,22 +56,7 @@ class EditContactActivity : ContactActivity() {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_edit_contact)
         supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_cross)
-
-        handlePermission(PERMISSION_READ_CONTACTS) {
-            if (it) {
-                handlePermission(PERMISSION_WRITE_CONTACTS) {
-                    if (it) {
-                        initContact()
-                    } else {
-                        toast(R.string.no_contacts_permission)
-                        finish()
-                    }
-                }
-            } else {
-                toast(R.string.no_contacts_permission)
-                finish()
-            }
-        }
+        initContact()
     }
 
     override fun onCreateOptionsMenu(menu: Menu): Boolean {
@@ -378,7 +361,8 @@ class EditContactActivity : ContactActivity() {
     private fun setupNewContact() {
         window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
         supportActionBar?.title = resources.getString(R.string.new_contact)
-        contact = Contact(0, "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), config.lastUsedContactSource, 0, 0, "", null, "", ArrayList())
+        val contactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE
+        contact = Contact(0, "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), contactSource, 0, 0, "", null, "", ArrayList())
         contact_source.text = getPublicContactSource(contact!!.source)
         contact_source.setOnClickListener {
             showContactSourcePicker(contact!!.source) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
index c79686bf..f9467b4e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
@@ -36,9 +36,9 @@ import kotlinx.android.synthetic.main.fragment_groups.*
 import java.io.FileOutputStream
 
 class MainActivity : SimpleActivity(), RefreshContactsListener {
-    private var isFirstResume = true
     private var isSearchOpen = false
     private var searchMenuItem: MenuItem? = null
+    private var werePermissionsHandled = false
 
     private var storedTextColor = 0
     private var storedBackgroundColor = 0
@@ -57,6 +57,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
         dbHelper
 
         handlePermission(PERMISSION_READ_CONTACTS) {
+            werePermissionsHandled = true
             if (it) {
                 handlePermission(PERMISSION_WRITE_CONTACTS) {
                     storeLocalAccountData()
@@ -115,7 +116,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
             favorites_fragment?.startNameWithSurnameChanged(configStartNameWithSurname)
         }
 
-        if (!isFirstResume) {
+        if (werePermissionsHandled) {
             if (viewpager.adapter == null) {
                 initFragments()
             }
@@ -125,10 +126,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
             }
             refreshContacts(ALL_TABS_MASK)
         }
-
-        if (hasPermission(PERMISSION_WRITE_CONTACTS)) {
-            isFirstResume = false
-        }
     }
 
     override fun onPause() {
@@ -388,7 +385,10 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
     }
 
     private fun launchAbout() {
-        val faqItems = arrayListOf(FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons))
+        val faqItems = arrayListOf(
+                FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons)
+        )
+
         startAboutActivity(R.string.app_name, LICENSE_MULTISELECT or LICENSE_JODA or LICENSE_GLIDE or LICENSE_GSON or LICENSE_STETHO,
                 BuildConfig.VERSION_NAME, faqItems)
     }
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 d9c17a46..4d43567f 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
@@ -9,7 +9,6 @@ import android.view.MenuItem
 import android.view.WindowManager
 import android.widget.RelativeLayout
 import com.simplemobiletools.commons.extensions.*
-import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
 import com.simplemobiletools.contacts.R
 import com.simplemobiletools.contacts.extensions.*
 import com.simplemobiletools.contacts.helpers.CONTACT_ID
@@ -30,7 +29,7 @@ class ViewContactActivity : ContactActivity() {
 
     override fun onResume() {
         super.onResume()
-        tryInitContact()
+        initContact()
     }
 
     override fun onCreateOptionsMenu(menu: Menu): Boolean {
@@ -48,17 +47,6 @@ class ViewContactActivity : ContactActivity() {
         return true
     }
 
-    private fun tryInitContact() {
-        handlePermission(PERMISSION_READ_CONTACTS) {
-            if (it) {
-                initContact()
-            } else {
-                toast(R.string.no_contacts_permission)
-                finish()
-            }
-        }
-    }
-
     private fun initContact() {
         var wasLookupKeyUsed = false
         var contactId = intent.getIntExtra(CONTACT_ID, 0)
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 3d3b73d3..0f427818 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
@@ -25,8 +25,8 @@ import com.simplemobiletools.contacts.models.*
 
 class ContactsHelper(val activity: BaseSimpleActivity) {
     fun getContacts(callback: (ArrayList<Contact>) -> Unit) {
-        val contacts = SparseArray<Contact>()
         Thread {
+            val contacts = SparseArray<Contact>()
             getDeviceContacts(contacts)
 
             activity.dbHelper.getContacts(activity).forEach {
@@ -519,37 +519,44 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
     }
 
     fun getContactSources(callback: (ArrayList<ContactSource>) -> Unit) {
-        val sources = LinkedHashSet<ContactSource>()
         Thread {
-            val uri = ContactsContract.RawContacts.CONTENT_URI
-            val projection = arrayOf(ContactsContract.RawContacts.ACCOUNT_NAME, ContactsContract.RawContacts.ACCOUNT_TYPE)
-
-            var cursor: Cursor? = null
-            try {
-                cursor = activity.contentResolver.query(uri, projection, null, null, null)
-                if (cursor?.moveToFirst() == true) {
-                    do {
-                        val name = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_NAME) ?: continue
-                        val type = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_TYPE) ?: continue
-                        val contactSource = ContactSource(name, type)
-                        sources.add(contactSource)
-                    } while (cursor.moveToNext())
-                }
-            } catch (e: Exception) {
-                activity.showErrorToast(e)
-            } finally {
-                cursor?.close()
-            }
-
-            if (sources.isEmpty() && activity.config.localAccountName.isEmpty() && activity.config.localAccountType.isEmpty()) {
-                sources.add(ContactSource("", ""))
-            }
-
+            val sources = LinkedHashSet<ContactSource>()
+            getDeviceContactSources(sources)
             sources.add(ContactSource(activity.getString(R.string.phone_storage_hidden), SMT_PRIVATE))
             callback(ArrayList(sources))
         }.start()
     }
 
+    private fun getDeviceContactSources(sources: LinkedHashSet<ContactSource>) {
+        if (!activity.hasContactPermissions()) {
+            return
+        }
+
+        val uri = ContactsContract.RawContacts.CONTENT_URI
+        val projection = arrayOf(ContactsContract.RawContacts.ACCOUNT_NAME, ContactsContract.RawContacts.ACCOUNT_TYPE)
+
+        var cursor: Cursor? = null
+        try {
+            cursor = activity.contentResolver.query(uri, projection, null, null, null)
+            if (cursor?.moveToFirst() == true) {
+                do {
+                    val name = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_NAME) ?: continue
+                    val type = cursor.getStringValue(ContactsContract.RawContacts.ACCOUNT_TYPE) ?: continue
+                    val contactSource = ContactSource(name, type)
+                    sources.add(contactSource)
+                } while (cursor.moveToNext())
+            }
+        } catch (e: Exception) {
+            activity.showErrorToast(e)
+        } finally {
+            cursor?.close()
+        }
+
+        if (sources.isEmpty() && activity.config.localAccountName.isEmpty() && activity.config.localAccountType.isEmpty()) {
+            sources.add(ContactSource("", ""))
+        }
+    }
+
     private fun getContactSourceType(accountName: String): String {
         if (accountName.isEmpty()) {
             return ""

From 6695bf4f77c9552260e75a976d4cf64b5d6141d9 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 6 Apr 2018 21:28:09 +0200
Subject: [PATCH 14/61] require Contacts permission at third party intents

---
 .../activities/EditContactActivity.kt         | 28 +++++++++++++++++--
 .../activities/ViewContactActivity.kt         | 19 +++++++++++--
 2 files changed, 42 insertions(+), 5 deletions(-)

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 9e7fe652..87aefa8e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -16,6 +16,8 @@ import android.widget.ImageView
 import android.widget.TextView
 import com.simplemobiletools.commons.dialogs.RadioGroupDialog
 import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
+import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
 import com.simplemobiletools.commons.models.RadioItem
 import com.simplemobiletools.contacts.R
 import com.simplemobiletools.contacts.dialogs.SelectGroupsDialog
@@ -51,12 +53,34 @@ class EditContactActivity : ContactActivity() {
     private var wasActivityInitialized = false
     private var lastPhotoIntentUri: Uri? = null
     private var isSaving = false
+    private var isThirdPartyIntent = false
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_edit_contact)
         supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_cross)
-        initContact()
+
+        val action = intent.action
+        isThirdPartyIntent = action == Intent.ACTION_EDIT || action == Intent.ACTION_INSERT_OR_EDIT || action == Intent.ACTION_INSERT
+        if (isThirdPartyIntent) {
+            handlePermission(PERMISSION_READ_CONTACTS) {
+                if (it) {
+                    handlePermission(PERMISSION_WRITE_CONTACTS) {
+                        if (it) {
+                            initContact()
+                        } else {
+                            toast(R.string.no_contacts_permission)
+                            finish()
+                        }
+                    }
+                } else {
+                    toast(R.string.no_contacts_permission)
+                    finish()
+                }
+            }
+        } else {
+            initContact()
+        }
     }
 
     override fun onCreateOptionsMenu(menu: Menu): Boolean {
@@ -121,7 +145,7 @@ class EditContactActivity : ContactActivity() {
             setupEditContact()
         }
 
-        if (contact!!.id == 0 && intent.extras?.containsKey(KEY_PHONE) == true && (intent.action == Intent.ACTION_INSERT_OR_EDIT || intent.action == Intent.ACTION_INSERT)) {
+        if (contact!!.id == 0 && intent.extras?.containsKey(KEY_PHONE) == true && (action == Intent.ACTION_INSERT_OR_EDIT || action == Intent.ACTION_INSERT)) {
             val phoneNumber = intent.extras.get(KEY_PHONE).toString()
             contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE))
             setupPhoneNumbers()
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 4d43567f..1b24de23 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
@@ -9,6 +9,7 @@ import android.view.MenuItem
 import android.view.WindowManager
 import android.widget.RelativeLayout
 import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
 import com.simplemobiletools.contacts.R
 import com.simplemobiletools.contacts.extensions.*
 import com.simplemobiletools.contacts.helpers.CONTACT_ID
@@ -22,6 +23,7 @@ import kotlinx.android.synthetic.main.item_view_group.view.*
 import kotlinx.android.synthetic.main.item_view_phone_number.view.*
 
 class ViewContactActivity : ContactActivity() {
+    private var isViewIntent = false
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_view_contact)
@@ -29,7 +31,19 @@ class ViewContactActivity : ContactActivity() {
 
     override fun onResume() {
         super.onResume()
-        initContact()
+        isViewIntent = intent.action == ContactsContract.QuickContact.ACTION_QUICK_CONTACT || intent.action == Intent.ACTION_VIEW
+        if (isViewIntent) {
+            handlePermission(PERMISSION_READ_CONTACTS) {
+                if (it) {
+                    initContact()
+                } else {
+                    toast(R.string.no_contacts_permission)
+                    finish()
+                }
+            }
+        } else {
+            initContact()
+        }
     }
 
     override fun onCreateOptionsMenu(menu: Menu): Boolean {
@@ -50,8 +64,7 @@ class ViewContactActivity : ContactActivity() {
     private fun initContact() {
         var wasLookupKeyUsed = false
         var contactId = intent.getIntExtra(CONTACT_ID, 0)
-        val action = intent.action
-        if (contactId == 0 && (action == ContactsContract.QuickContact.ACTION_QUICK_CONTACT || action == Intent.ACTION_VIEW)) {
+        if (contactId == 0 && isViewIntent) {
             val data = intent.data
             if (data != null) {
                 val rawId = if (data.path.contains("lookup")) {

From d3c87e241ca477e4e11c7d4538cd2794fa33bffb Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 6 Apr 2018 21:33:28 +0200
Subject: [PATCH 15/61] fix #111, just dial the phone number if Phone
 permission is not granted

---
 .../contacts/extensions/Activity.kt               | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt
index 5815f5a1..01edbf4d 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt
@@ -20,14 +20,13 @@ import java.io.File
 
 fun SimpleActivity.startCallIntent(recipient: String) {
     handlePermission(PERMISSION_CALL_PHONE) {
-        if (it) {
-            Intent(Intent.ACTION_CALL).apply {
-                data = Uri.fromParts("tel", recipient, null)
-                if (resolveActivity(packageManager) != null) {
-                    startActivity(this)
-                } else {
-                    toast(R.string.no_app_found)
-                }
+        val action = if (it) Intent.ACTION_CALL else Intent.ACTION_DIAL
+        Intent(action).apply {
+            data = Uri.fromParts("tel", recipient, null)
+            if (resolveActivity(packageManager) != null) {
+                startActivity(this)
+            } else {
+                toast(R.string.no_app_found)
             }
         }
     }

From 25c9abb92d5b04a10190635b45e70ac04a475676 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 6 Apr 2018 22:32:58 +0200
Subject: [PATCH 16/61] adding a couple checks of contacts permissions

---
 .../contacts/activities/GroupContactsActivity.kt          | 2 +-
 .../com/simplemobiletools/contacts/extensions/Activity.kt | 2 +-
 .../simplemobiletools/contacts/helpers/ContactsHelper.kt  | 8 ++++++--
 3 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt
index 077880de..99c787b4 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt
@@ -109,7 +109,7 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh
     }
 
     override fun removeFromGroup(contacts: ArrayList<Contact>) {
-        ContactsHelper(this).removeContactsFromGroup(contacts, group.id)
+        removeContactsFromGroup(contacts, group.id)
         if (groupContacts.size == 0) {
             refreshContacts()
         }
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt
index 01edbf4d..71af206e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt
@@ -126,7 +126,7 @@ fun BaseSimpleActivity.addContactsToGroup(contacts: ArrayList<Contact>, groupId:
 fun BaseSimpleActivity.removeContactsFromGroup(contacts: ArrayList<Contact>, groupId: Long) {
     val publicContacts = contacts.filter { it.source != SMT_PRIVATE }
     val privateContacts = contacts.filter { it.source == SMT_PRIVATE }
-    if (publicContacts.isNotEmpty()) {
+    if (publicContacts.isNotEmpty() && hasContactPermissions()) {
         ContactsHelper(this).removeContactsFromGroup(contacts, groupId)
     }
 
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 0f427818..cb0ad9e6 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
@@ -1024,12 +1024,16 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
 
     fun addFavorites(contacts: ArrayList<Contact>) {
         toggleLocalFavorites(contacts, true)
-        toggleFavorites(contacts, true)
+        if (activity.hasContactPermissions()) {
+            toggleFavorites(contacts, true)
+        }
     }
 
     fun removeFavorites(contacts: ArrayList<Contact>) {
         toggleLocalFavorites(contacts, false)
-        toggleFavorites(contacts, false)
+        if (activity.hasContactPermissions()) {
+            toggleFavorites(contacts, false)
+        }
     }
 
     private fun toggleFavorites(contacts: ArrayList<Contact>, addToFavorites: Boolean) {

From dbd3bec6904f60019efd47eddc8998819ae4d3bc Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 6 Apr 2018 23:10:20 +0200
Subject: [PATCH 17/61] fetch the user Organization field

---
 .../activities/EditContactActivity.kt         |  2 +-
 .../contacts/helpers/ContactsHelper.kt        | 48 ++++++++++++++++++-
 .../contacts/helpers/DBHelper.kt              |  5 +-
 .../contacts/helpers/VcfImporter.kt           |  4 +-
 .../contacts/models/Contact.kt                |  2 +-
 5 files changed, 55 insertions(+), 6 deletions(-)

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 87aefa8e..421a808c 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -386,7 +386,7 @@ class EditContactActivity : ContactActivity() {
         window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
         supportActionBar?.title = resources.getString(R.string.new_contact)
         val contactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE
-        contact = Contact(0, "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), contactSource, 0, 0, "", null, "", ArrayList())
+        contact = Contact(0, "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), contactSource, 0, 0, "", null, "", ArrayList(), "")
         contact_source.text = getPublicContactSource(contact!!.source)
         contact_source.setOnClickListener {
             showContactSourcePicker(contact!!.source) {
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 cb0ad9e6..a7d6ad06 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
@@ -83,8 +83,9 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                     val thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: ""
                     val notes = ""
                     val groups = ArrayList<Group>()
+                    val organization = ""
                     val contact = Contact(id, firstName, middleName, surname, photoUri, number, emails, addresses, events, accountName,
-                            starred, contactId, thumbnailUri, null, notes, groups)
+                            starred, contactId, thumbnailUri, null, notes, groups, organization)
                     contacts.put(id, contact)
                 } while (cursor.moveToNext())
             }
@@ -128,6 +129,13 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
             val key = notes.keyAt(i)
             contacts[key]?.notes = notes.valueAt(i)
         }
+
+        val organizations = getOrganizations()
+        size = organizations.size()
+        for (i in 0 until size) {
+            val key = organizations.keyAt(i)
+            contacts[key]?.organization = organizations.valueAt(i)
+        }
     }
 
     private fun getPhoneNumbers(contactId: Int? = null): SparseArray<ArrayList<PhoneNumber>> {
@@ -320,6 +328,41 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
         return notes
     }
 
+    private fun getOrganizations(contactId: Int? = null): SparseArray<String> {
+        val organizations = SparseArray<String>()
+        val uri = ContactsContract.Data.CONTENT_URI
+        val projection = arrayOf(
+                ContactsContract.Data.RAW_CONTACT_ID,
+                CommonDataKinds.Organization.COMPANY
+        )
+
+        var selection = "${ContactsContract.Data.MIMETYPE} = ?"
+        var selectionArgs = arrayOf(CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
+
+        if (contactId != null) {
+            selection += " AND ${ContactsContract.Data.RAW_CONTACT_ID} = ?"
+            selectionArgs = arrayOf(CommonDataKinds.Organization.CONTENT_ITEM_TYPE, contactId.toString())
+        }
+
+        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 organization = cursor.getStringValue(CommonDataKinds.Organization.COMPANY) ?: continue
+                    organizations.put(id, organization)
+                } while (cursor.moveToNext())
+            }
+        } catch (e: Exception) {
+            activity.showErrorToast(e)
+        } finally {
+            cursor?.close()
+        }
+
+        return organizations
+    }
+
     private fun getContactGroups(storedGroups: ArrayList<Group>, contactId: Int? = null): SparseArray<ArrayList<Group>> {
         val groups = SparseArray<ArrayList<Group>>()
         if (!activity.hasContactPermissions()) {
@@ -508,8 +551,9 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                 val contactId = cursor.getIntValue(ContactsContract.Data.CONTACT_ID)
                 val groups = getContactGroups(storedGroups, contactId)[contactId] ?: ArrayList()
                 val thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: ""
+                val organization = getOrganizations(id)[id] ?: ""
                 return Contact(id, firstName, middleName, surname, photoUri, number, emails, addresses, events, accountName, starred, contactId,
-                        thumbnailUri, null, notes, groups)
+                        thumbnailUri, null, notes, groups, organization)
             }
         } 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 0067b33e..d3ca9181 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
@@ -267,7 +267,10 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
                 val groupIds = Gson().fromJson<ArrayList<Long>>(groupIdsJson, groupIdsToken) ?: ArrayList(1)
                 val groups = storedGroups.filter { groupIds.contains(it.id) } as ArrayList<Group>
 
-                val contact = Contact(id, firstName, middleName, surname, "", phoneNumbers, emails, addresses, events, SMT_PRIVATE, starred, id, "", photo, notes, groups)
+                val organization = ""
+
+                val contact = Contact(id, firstName, middleName, surname, "", phoneNumbers, emails, addresses, events, SMT_PRIVATE, starred,
+                        id, "", photo, notes, groups, organization)
                 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 602e5160..1341ead5 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt
@@ -24,6 +24,7 @@ class VcfImporter(val activity: SimpleActivity) {
     private var curSurname = ""
     private var curPhotoUri = ""
     private var curNotes = ""
+    private var curOrganization = ""
     private var curPhoneNumbers = ArrayList<PhoneNumber>()
     private var curEmails = ArrayList<Email>()
     private var curEvents = ArrayList<Event>()
@@ -236,7 +237,7 @@ class VcfImporter(val activity: SimpleActivity) {
 
     private fun saveContact(source: String) {
         val contact = Contact(0, curFirstName, curMiddleName, curSurname, curPhotoUri, curPhoneNumbers, curEmails, curAddresses, curEvents,
-                source, 0, 0, "", null, curNotes, curGroups)
+                source, 0, 0, "", null, curNotes, curGroups, curOrganization)
         if (ContactsHelper(activity).insertContact(contact)) {
             contactsImported++
         }
@@ -248,6 +249,7 @@ class VcfImporter(val activity: SimpleActivity) {
         curSurname = ""
         curPhotoUri = ""
         curNotes = ""
+        curOrganization = ""
         curPhoneNumbers = ArrayList()
         curEmails = ArrayList()
         curEvents = ArrayList()
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 488f4a14..cbb34453 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
@@ -8,7 +8,7 @@ import com.simplemobiletools.commons.helpers.SORT_DESCENDING
 data class Contact(val id: Int, var firstName: String, var middleName: String, var surname: 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>) : Comparable<Contact> {
+                   var groups: ArrayList<Group>, var organization: String) : Comparable<Contact> {
     companion object {
         var sorting = 0
     }

From f3e86cf582cce413eb0f860765dc22e9a7fa0b2c Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 6 Apr 2018 23:20:14 +0200
Subject: [PATCH 18/61] display contact organization on the View Details screen

---
 .../activities/ViewContactActivity.kt         |   9 ++++++
 .../main/res/drawable-hdpi/ic_business.png    | Bin 0 -> 152 bytes
 .../main/res/drawable-xhdpi/ic_business.png   | Bin 0 -> 112 bytes
 .../main/res/drawable-xxhdpi/ic_business.png  | Bin 0 -> 119 bytes
 .../main/res/drawable-xxxhdpi/ic_business.png | Bin 0 -> 114 bytes
 .../main/res/layout/activity_view_contact.xml |  26 +++++++++++++++++-
 6 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 app/src/main/res/drawable-hdpi/ic_business.png
 create mode 100644 app/src/main/res/drawable-xhdpi/ic_business.png
 create mode 100644 app/src/main/res/drawable-xxhdpi/ic_business.png
 create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_business.png

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 1b24de23..1d28a026 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
@@ -123,6 +123,7 @@ class ViewContactActivity : ContactActivity() {
         contact_event_image.applyColorFilter(textColor)
         contact_source_image.applyColorFilter(textColor)
         contact_notes_image.applyColorFilter(textColor)
+        contact_organization_image.applyColorFilter(textColor)
         contact_groups_image.applyColorFilter(textColor)
 
         contact_send_sms.setOnClickListener { trySendSMS() }
@@ -164,6 +165,7 @@ class ViewContactActivity : ContactActivity() {
         setupAddresses()
         setupEvents()
         setupNotes()
+        setupOrganization()
         setupGroups()
     }
 
@@ -251,6 +253,13 @@ class ViewContactActivity : ContactActivity() {
         contact_notes.beVisibleIf(notes.isNotEmpty())
     }
 
+    private fun setupOrganization() {
+        val organization = contact!!.organization
+        contact_organization.text = organization
+        contact_organization_image.beVisibleIf(organization.isNotEmpty())
+        contact_organization.beVisibleIf(organization.isNotEmpty())
+    }
+
     private fun setupGroups() {
         contact_groups_holder.removeAllViews()
         val groups = contact!!.groups
diff --git a/app/src/main/res/drawable-hdpi/ic_business.png b/app/src/main/res/drawable-hdpi/ic_business.png
new file mode 100644
index 0000000000000000000000000000000000000000..d10ebb766f4ba84a4f218de01c4c1fefb6368058
GIT binary patch
literal 152
zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8K8yr+v}h{y4_Q#NujC~&y^E%|?^
zO{yutCOD=>m+#{Xn~sbEr5st8luH`70_RDJ-7IeR=w>U?lAqFbA!8OtY}wuuePwy~
zigRwR`<~XlX_0UC<*3^11Li`DJ&t^IZl27VztqatJ>vZ?pj8Z>u6{1-oD!M<!1Okc

literal 0
HcmV?d00001

diff --git a/app/src/main/res/drawable-xhdpi/ic_business.png b/app/src/main/res/drawable-xhdpi/ic_business.png
new file mode 100644
index 0000000000000000000000000000000000000000..e5630455a9759548446c804e92739f71bc0b4a68
GIT binary patch
literal 112
zcmeAS@N?(olHy`uVBq!ia0vp^1|ZA`BpB)|k7xlYrjj7PU<QV=$!9HqJWWp*$B+uf
zWCgho|Nr;Te)Rmf?_c&N{s_$up%{^XgY0WWe7`&_Rlmr<aA$HV>r`%KU64_pu6{1-
HoD!M<2qPdk

literal 0
HcmV?d00001

diff --git a/app/src/main/res/drawable-xxhdpi/ic_business.png b/app/src/main/res/drawable-xxhdpi/ic_business.png
new file mode 100644
index 0000000000000000000000000000000000000000..7dfc8dc527c94768b086c12846022573de69fdac
GIT binary patch
literal 119
zcmeAS@N?(olHy`uVBq!ia0vp^9w5vJBp7O^^}Pa8OeH~n!3+##lh0ZJc?O;?jv*C{
z$qQr?{{8>|pS>tj{>{vjX@A=rn3rr$SoUG^Q6}k+?L5~eY?;2OV3{NX!}eH~e_j*+
Q?FX6Y>FVdQ&MBb@0OOu0%K!iX

literal 0
HcmV?d00001

diff --git a/app/src/main/res/drawable-xxxhdpi/ic_business.png b/app/src/main/res/drawable-xxxhdpi/ic_business.png
new file mode 100644
index 0000000000000000000000000000000000000000..c9aea72ceb49bc4581d8223d240c223cbbddb6a1
GIT binary patch
literal 114
zcmeAS@N?(olHy`uVBq!ia0vp^2_Vb}Bp6OT_L>T$m`Z~Df*BafCZDwc^0Yl&978G?
zlO?V^u;;kY%-mA)@BpK)C5LzBSw=>M`P1eE{-1DiVRV)B83u-pQ}+cJ@)S#e4D)pL
Kb6Mw<&;$ThS0Lm7

literal 0
HcmV?d00001

diff --git a/app/src/main/res/layout/activity_view_contact.xml b/app/src/main/res/layout/activity_view_contact.xml
index 4b081639..f7e2fb2f 100644
--- a/app/src/main/res/layout/activity_view_contact.xml
+++ b/app/src/main/res/layout/activity_view_contact.xml
@@ -239,6 +239,30 @@
             android:paddingTop="@dimen/normal_margin"
             android:textSize="@dimen/bigger_text_size"/>
 
+        <ImageView
+            android:id="@+id/contact_organization_image"
+            android:layout_width="@dimen/contact_icons_size"
+            android:layout_height="@dimen/contact_icons_size"
+            android:layout_alignTop="@+id/contact_organization"
+            android:paddingBottom="@dimen/small_margin"
+            android:paddingEnd="@dimen/small_margin"
+            android:paddingRight="@dimen/small_margin"
+            android:paddingTop="@dimen/medium_margin"
+            android:src="@drawable/ic_business"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/contact_organization"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/contact_notes"
+            android:layout_centerVertical="true"
+            android:layout_toRightOf="@+id/contact_organization_image"
+            android:lineSpacingExtra="@dimen/medium_margin"
+            android:paddingBottom="@dimen/normal_margin"
+            android:paddingLeft="@dimen/small_margin"
+            android:paddingTop="@dimen/normal_margin"
+            android:textSize="@dimen/bigger_text_size"/>
+
         <ImageView
             android:id="@+id/contact_groups_image"
             android:layout_width="@dimen/contact_icons_size"
@@ -254,7 +278,7 @@
             android:id="@+id/contact_groups_holder"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_below="@+id/contact_notes"
+            android:layout_below="@+id/contact_organization"
             android:layout_toRightOf="@+id/contact_name_image"
             android:orientation="vertical"
             android:paddingLeft="@dimen/small_margin"/>

From 4b6a27db06383837e3f397ec810cf58e48f78574 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 6 Apr 2018 23:51:59 +0200
Subject: [PATCH 19/61] add some strings related to managing visible fields

---
 .../contacts/activities/MainActivity.kt        |  1 +
 app/src/main/res/values-de/strings.xml         | 18 ++++++++++++++++++
 app/src/main/res/values-el/strings.xml         | 18 ++++++++++++++++++
 app/src/main/res/values-fr/strings.xml         | 18 ++++++++++++++++++
 app/src/main/res/values-hr/strings.xml         | 18 ++++++++++++++++++
 app/src/main/res/values-ko-rKR/strings.xml     | 18 ++++++++++++++++++
 app/src/main/res/values-lt/strings.xml         | 18 ++++++++++++++++++
 app/src/main/res/values-pt/strings.xml         | 18 ++++++++++++++++++
 app/src/main/res/values-ru/strings.xml         | 18 ++++++++++++++++++
 app/src/main/res/values-sk/strings.xml         | 18 ++++++++++++++++++
 app/src/main/res/values-sv/strings.xml         | 18 ++++++++++++++++++
 app/src/main/res/values-zh-rTW/strings.xml     | 18 ++++++++++++++++++
 app/src/main/res/values/strings.xml            | 18 ++++++++++++++++++
 13 files changed, 217 insertions(+)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
index f9467b4e..765163b2 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
@@ -386,6 +386,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
 
     private fun launchAbout() {
         val faqItems = arrayListOf(
+                FAQItem(R.string.faq_1_title, R.string.faq_1_text),
                 FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons)
         )
 
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 21548505..0ab17154 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -40,6 +40,7 @@
     <string name="view_contact">Kontaktdetails ansehen</string>
     <string name="show_favorites_tab">Show favorites tab</string>
     <string name="show_groups_tab">Show groups tab</string>
+    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
 
     <!-- Emails -->
     <string name="email">Email</string>
@@ -79,6 +80,23 @@
     <string name="include_contact_sources">Kontaktquellen einschließen</string>
     <string name="filename_without_vcf">Dateiname (ohne .vcf)</string>
 
+    <!-- Visible fields -->
+    <string name="select_fields_to_show">Select fields to show</string>
+    <string name="prefix">Prefix</string>
+    <string name="suffix">Suffix</string>
+    <string name="phone_numbers">Phone numbers</string>
+    <string name="emails">Emails</string>
+    <string name="addresses">Addresses</string>
+    <string name="events">Events (birthdays, anniversaries)</string>
+    <string name="notes">Notes</string>
+    <string name="organization">Organization</string>
+    <string name="groups">Groups</string>
+    <string name="contact_source">Contact source</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
     <string name="app_short_description">Eine App zum Verwalten von Kontakten, ganz ohne Werbung.</string>
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index d4ff97bb..898a8612 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -40,6 +40,7 @@
     <string name="view_contact">Εμφάνιση λεπτομερειών επαφής</string>
     <string name="show_favorites_tab">Εμφάνιση καρτέλας αγαπημένων</string>
     <string name="show_groups_tab">Εμφάνιση καρτέλας ομάδων</string>
+    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
 
     <!-- Emails -->
     <string name="email">Email</string>
@@ -79,6 +80,23 @@
     <string name="include_contact_sources">Συμπερίληψη πηγών επαφών</string>
     <string name="filename_without_vcf">Όνομα αρχείου (χωρίς .vcf)</string>
 
+    <!-- Visible fields -->
+    <string name="select_fields_to_show">Select fields to show</string>
+    <string name="prefix">Prefix</string>
+    <string name="suffix">Suffix</string>
+    <string name="phone_numbers">Phone numbers</string>
+    <string name="emails">Emails</string>
+    <string name="addresses">Addresses</string>
+    <string name="events">Events (birthdays, anniversaries)</string>
+    <string name="notes">Notes</string>
+    <string name="organization">Organization</string>
+    <string name="groups">Groups</string>
+    <string name="contact_source">Contact source</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
     <string name="app_short_description">Μια εφαρμογή επαφών για να διαχειρίζεσαι τις επαφές σου χωρίς διαφημίσεις.</string>
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 65a677e0..462aee6e 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -40,6 +40,7 @@
     <string name="view_contact">Voir les détails du contact</string>
     <string name="show_favorites_tab">Show favorites tab</string>
     <string name="show_groups_tab">Show groups tab</string>
+    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
 
     <!-- Emails -->
     <string name="email">E-mail</string>
@@ -79,6 +80,23 @@
     <string name="include_contact_sources">Inclure les sources du contact</string>
     <string name="filename_without_vcf">Nom du fichier (sans .vcf)</string>
 
+    <!-- Visible fields -->
+    <string name="select_fields_to_show">Select fields to show</string>
+    <string name="prefix">Prefix</string>
+    <string name="suffix">Suffix</string>
+    <string name="phone_numbers">Phone numbers</string>
+    <string name="emails">Emails</string>
+    <string name="addresses">Addresses</string>
+    <string name="events">Events (birthdays, anniversaries)</string>
+    <string name="notes">Notes</string>
+    <string name="organization">Organization</string>
+    <string name="groups">Groups</string>
+    <string name="contact_source">Contact source</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
     <string name="app_short_description">Une appli de contacts pour gérer vos contacts sans pubs.</string>
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 4dd2f0a5..9fd869be 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -40,6 +40,7 @@
     <string name="view_contact">Prikaži pojedinosti o kontaktu</string>
     <string name="show_favorites_tab">Prikaži karticu favorita</string>
     <string name="show_groups_tab">Prikaži karticu grupa</string>
+    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
 
     <!-- Emails -->
     <string name="email">E-pošta</string>
@@ -79,6 +80,23 @@
     <string name="include_contact_sources">Uključi izvore kontakta</string>
     <string name="filename_without_vcf">Naziv datoteke (bez .vcf)</string>
 
+    <!-- Visible fields -->
+    <string name="select_fields_to_show">Select fields to show</string>
+    <string name="prefix">Prefix</string>
+    <string name="suffix">Suffix</string>
+    <string name="phone_numbers">Phone numbers</string>
+    <string name="emails">Emails</string>
+    <string name="addresses">Addresses</string>
+    <string name="events">Events (birthdays, anniversaries)</string>
+    <string name="notes">Notes</string>
+    <string name="organization">Organization</string>
+    <string name="groups">Groups</string>
+    <string name="contact_source">Contact source</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
     <string name="app_short_description">Aplikacija za upravljanje kontaktima bez oglasa.</string>
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index dfb8692a..5984f2e1 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -40,6 +40,7 @@
     <string name="view_contact">View contact details</string>
     <string name="show_favorites_tab">Show favorites tab</string>
     <string name="show_groups_tab">Show groups tab</string>
+    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
 
     <!-- Emails -->
     <string name="email">이메일</string>
@@ -79,6 +80,23 @@
     <string name="include_contact_sources">가져오기 대상</string>
     <string name="filename_without_vcf">파일이름 (.vcf 확장자 생략)</string>
 
+    <!-- Visible fields -->
+    <string name="select_fields_to_show">Select fields to show</string>
+    <string name="prefix">Prefix</string>
+    <string name="suffix">Suffix</string>
+    <string name="phone_numbers">Phone numbers</string>
+    <string name="emails">Emails</string>
+    <string name="addresses">Addresses</string>
+    <string name="events">Events (birthdays, anniversaries)</string>
+    <string name="notes">Notes</string>
+    <string name="organization">Organization</string>
+    <string name="groups">Groups</string>
+    <string name="contact_source">Contact source</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
     <string name="app_short_description">광고가 없는 연락처 관리 애플리케이션입니다.</string>
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index a52a94af..8bb6b2ed 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -40,6 +40,7 @@
     <string name="view_contact">Žiūrėti kontakto detales</string>
     <string name="show_favorites_tab">Rodyti mėgiamiausiųjų skirtuką</string>
     <string name="show_groups_tab">Rodyti grupių skirtuką</string>
+    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
 
     <!-- Emails -->
     <string name="email">Elektroninis paštas</string>
@@ -79,6 +80,23 @@
     <string name="include_contact_sources">Įtraukti kontaktų šaltinius</string>
     <string name="filename_without_vcf">Bylos vardas (be .vcf)</string>
 
+    <!-- Visible fields -->
+    <string name="select_fields_to_show">Select fields to show</string>
+    <string name="prefix">Prefix</string>
+    <string name="suffix">Suffix</string>
+    <string name="phone_numbers">Phone numbers</string>
+    <string name="emails">Emails</string>
+    <string name="addresses">Addresses</string>
+    <string name="events">Events (birthdays, anniversaries)</string>
+    <string name="notes">Notes</string>
+    <string name="organization">Organization</string>
+    <string name="groups">Groups</string>
+    <string name="contact_source">Contact source</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
     <string name="app_short_description">Kontaktų programėlė įrenginio kontaktų tvarkymui, be reklamų.</string>
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 1b5faf67..2c7019e4 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -40,6 +40,7 @@
     <string name="view_contact">Ver detalhes</string>
     <string name="show_favorites_tab">Mostrar favoritos</string>
     <string name="show_groups_tab">Mostrar grupos</string>
+    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
 
     <!-- Emails -->
     <string name="email">E-mail</string>
@@ -79,6 +80,23 @@
     <string name="include_contact_sources">Incluir fontes dos contactos</string>
     <string name="filename_without_vcf">Nome do ficheiro (sem .vcf)</string>
 
+    <!-- Visible fields -->
+    <string name="select_fields_to_show">Select fields to show</string>
+    <string name="prefix">Prefix</string>
+    <string name="suffix">Suffix</string>
+    <string name="phone_numbers">Phone numbers</string>
+    <string name="emails">Emails</string>
+    <string name="addresses">Addresses</string>
+    <string name="events">Events (birthdays, anniversaries)</string>
+    <string name="notes">Notes</string>
+    <string name="organization">Organization</string>
+    <string name="groups">Groups</string>
+    <string name="contact_source">Contact source</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
     <string name="app_short_description">Uma aplicação para gerir os seus contactos.</string>
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index dbb9e2c4..96125d08 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -40,6 +40,7 @@
     <string name="view_contact">Просмотреть подробности о контакте</string>
     <string name="show_favorites_tab">Показывать вкладку избранного</string>
     <string name="show_groups_tab">Показывать вкладку групп</string>
+    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
 
     <!-- Emails -->
     <string name="email">Эл. почта</string>
@@ -79,6 +80,23 @@
     <string name="include_contact_sources">Включить источники контактов</string>
     <string name="filename_without_vcf">Имя файла (без .vcf)</string>
 
+    <!-- Visible fields -->
+    <string name="select_fields_to_show">Select fields to show</string>
+    <string name="prefix">Prefix</string>
+    <string name="suffix">Suffix</string>
+    <string name="phone_numbers">Phone numbers</string>
+    <string name="emails">Emails</string>
+    <string name="addresses">Addresses</string>
+    <string name="events">Events (birthdays, anniversaries)</string>
+    <string name="notes">Notes</string>
+    <string name="organization">Organization</string>
+    <string name="groups">Groups</string>
+    <string name="contact_source">Contact source</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
     <string name="app_short_description">Приложение для управления контактами без рекламы.</string>
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 6e19d57b..2a77d392 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -40,6 +40,7 @@
     <string name="view_contact">Zobraziť údaje kontaktu</string>
     <string name="show_favorites_tab">Zobraziť okno s obľúbenými</string>
     <string name="show_groups_tab">Zobraziť okno so skupinami</string>
+    <string name="manage_shown_contact_fields">Spravovať zobrazené polia kontaktov</string>
 
     <!-- Emails -->
     <string name="email">Email</string>
@@ -79,6 +80,23 @@
     <string name="include_contact_sources">Zahrnúť zdroje kontaktov</string>
     <string name="filename_without_vcf">Názov súboru (bez .vcf)</string>
 
+    <!-- Visible fields -->
+    <string name="select_fields_to_show">Zvoľte polia na zobrazenie</string>
+    <string name="prefix">Titul pred menom</string>
+    <string name="suffix">Titul za priezviskom</string>
+    <string name="phone_numbers">Telefónne čísla</string>
+    <string name="emails">Emaily</string>
+    <string name="addresses">Adresy</string>
+    <string name="events">Udalosti (narodeniny, výročia)</string>
+    <string name="notes">Poznámky</string>
+    <string name="organization">Firma</string>
+    <string name="groups">Skupiny</string>
+    <string name="contact_source">Zdroje kontaktov</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">Nechcem mať zobrazené všetky tie polia pri kontaktoch, viem ich nejako skryť?</string>
+    <string name="faq_1_text">Áno, stačí ísť do Nastavenia -> Spravovať zobrazené polia kontaktov. Tam si viete zvoliť, ktoré polia majú byť viditeľné. Niektoré sú v predvolenom stave vypnuté, čiže tam môžete objaviť aj nové.</string>
+
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
     <string name="app_short_description">Aplikácia pre správu vašich kontaktov bez reklám.</string>
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index ce898e54..8dc1c334 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -40,6 +40,7 @@
     <string name="view_contact">Visa kontaktuppgifter</string>
     <string name="show_favorites_tab">Visa fliken Favoriter</string>
     <string name="show_groups_tab">Visa fliken Grupper</string>
+    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
 
     <!-- Emails -->
     <string name="email">E-post</string>
@@ -79,6 +80,23 @@
     <string name="include_contact_sources">Inkludera kontaktkällor</string>
     <string name="filename_without_vcf">Filnamn (utan .vcf)</string>
 
+    <!-- Visible fields -->
+    <string name="select_fields_to_show">Select fields to show</string>
+    <string name="prefix">Prefix</string>
+    <string name="suffix">Suffix</string>
+    <string name="phone_numbers">Phone numbers</string>
+    <string name="emails">Emails</string>
+    <string name="addresses">Addresses</string>
+    <string name="events">Events (birthdays, anniversaries)</string>
+    <string name="notes">Notes</string>
+    <string name="organization">Organization</string>
+    <string name="groups">Groups</string>
+    <string name="contact_source">Contact source</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
     <string name="app_short_description">En app för att hantera dina kontakter utan reklam.</string>
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 992ff2ef..9cfe9d2f 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -40,6 +40,7 @@
     <string name="view_contact">顯示聯絡人資料</string>
     <string name="show_favorites_tab">顯示我的最愛頁面</string>
     <string name="show_groups_tab">顯示群組頁面</string>
+    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
 
     <!-- Emails -->
     <string name="email">信箱</string>
@@ -79,6 +80,23 @@
     <string name="include_contact_sources">包含聯絡人來源</string>
     <string name="filename_without_vcf">檔案名稱 (不含.vcf)</string>
 
+    <!-- Visible fields -->
+    <string name="select_fields_to_show">Select fields to show</string>
+    <string name="prefix">Prefix</string>
+    <string name="suffix">Suffix</string>
+    <string name="phone_numbers">Phone numbers</string>
+    <string name="emails">Emails</string>
+    <string name="addresses">Addresses</string>
+    <string name="events">Events (birthdays, anniversaries)</string>
+    <string name="notes">Notes</string>
+    <string name="organization">Organization</string>
+    <string name="groups">Groups</string>
+    <string name="contact_source">Contact source</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
     <string name="app_short_description">一個用來管理聯絡人,且沒有廣告的通訊錄應用程式。</string>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ec6cf97d..67f884c5 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -40,6 +40,7 @@
     <string name="view_contact">View contact details</string>
     <string name="show_favorites_tab">Show favorites tab</string>
     <string name="show_groups_tab">Show groups tab</string>
+    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
 
     <!-- Emails -->
     <string name="email">Email</string>
@@ -79,6 +80,23 @@
     <string name="include_contact_sources">Include contact sources</string>
     <string name="filename_without_vcf">Filename (without .vcf)</string>
 
+    <!-- Visible fields -->
+    <string name="select_fields_to_show">Select fields to show</string>
+    <string name="prefix">Prefix</string>
+    <string name="suffix">Suffix</string>
+    <string name="phone_numbers">Phone numbers</string>
+    <string name="emails">Emails</string>
+    <string name="addresses">Addresses</string>
+    <string name="events">Events (birthdays, anniversaries)</string>
+    <string name="notes">Notes</string>
+    <string name="organization">Organization</string>
+    <string name="groups">Groups</string>
+    <string name="contact_source">Contact source</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
     <string name="app_short_description">A contacts app for managing your contacts without ads.</string>

From cb2e491f650d2c99d059a9241be41cdcc3095c11 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sat, 7 Apr 2018 16:04:06 +0200
Subject: [PATCH 20/61] split organizations into company and job title

---
 .../activities/EditContactActivity.kt         |  7 ++-
 .../activities/ViewContactActivity.kt         |  8 ++--
 .../contacts/helpers/ContactsHelper.kt        | 38 +++++++++++++---
 .../contacts/helpers/DBHelper.kt              |  2 +-
 .../contacts/helpers/VcfImporter.kt           |  4 +-
 .../contacts/models/Contact.kt                |  2 +-
 .../contacts/models/Organization.kt           |  5 +++
 .../main/res/layout/activity_edit_contact.xml | 43 ++++++++++++++++++-
 .../main/res/layout/activity_view_contact.xml | 19 ++++++--
 app/src/main/res/values-de/strings.xml        |  2 +
 app/src/main/res/values-el/strings.xml        |  2 +
 app/src/main/res/values-fr/strings.xml        |  2 +
 app/src/main/res/values-hr/strings.xml        |  2 +
 app/src/main/res/values-ko-rKR/strings.xml    |  2 +
 app/src/main/res/values-lt/strings.xml        |  2 +
 app/src/main/res/values-pt/strings.xml        |  2 +
 app/src/main/res/values-ru/strings.xml        |  2 +
 app/src/main/res/values-sk/strings.xml        |  2 +
 app/src/main/res/values-sv/strings.xml        |  2 +
 app/src/main/res/values-zh-rTW/strings.xml    |  2 +
 app/src/main/res/values/strings.xml           |  2 +
 21 files changed, 134 insertions(+), 18 deletions(-)
 create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/models/Organization.kt

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 421a808c..3512e988 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -386,7 +386,8 @@ class EditContactActivity : ContactActivity() {
         window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
         supportActionBar?.title = resources.getString(R.string.new_contact)
         val contactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE
-        contact = Contact(0, "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), contactSource, 0, 0, "", null, "", ArrayList(), "")
+        val organization = Organization("", "")
+        contact = Contact(0, "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), contactSource, 0, 0, "", null, "", ArrayList(), organization)
         contact_source.text = getPublicContactSource(contact!!.source)
         contact_source.setOnClickListener {
             showContactSourcePicker(contact!!.source) {
@@ -603,6 +604,10 @@ class EditContactActivity : ContactActivity() {
             starred = if (isContactStarred()) 1 else 0
             notes = contact_notes.value
 
+            val company = contact_organization_company.value
+            val jobPosition = contact_organization_job_position.value
+            organization = Organization(company, jobPosition)
+
             Thread {
                 config.lastUsedContactSource = source
                 if (id == 0) {
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 1d28a026..4b5f8308 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
@@ -255,9 +255,11 @@ class ViewContactActivity : ContactActivity() {
 
     private fun setupOrganization() {
         val organization = contact!!.organization
-        contact_organization.text = organization
-        contact_organization_image.beVisibleIf(organization.isNotEmpty())
-        contact_organization.beVisibleIf(organization.isNotEmpty())
+        contact_organization_company.text = organization.company
+        contact_organization_job_position.text = organization.jobPosition
+        contact_organization_image.beGoneIf(organization.isEmpty())
+        contact_organization_company.beGoneIf(organization.company.isEmpty())
+        contact_organization_job_position.beGoneIf(organization.jobPosition.isEmpty())
     }
 
     private fun setupGroups() {
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 a7d6ad06..39cd30a7 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
@@ -83,7 +83,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                     val thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: ""
                     val notes = ""
                     val groups = ArrayList<Group>()
-                    val organization = ""
+                    val organization = Organization("", "")
                     val contact = Contact(id, firstName, middleName, surname, photoUri, number, emails, addresses, events, accountName,
                             starred, contactId, thumbnailUri, null, notes, groups, organization)
                     contacts.put(id, contact)
@@ -328,12 +328,13 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
         return notes
     }
 
-    private fun getOrganizations(contactId: Int? = null): SparseArray<String> {
-        val organizations = SparseArray<String>()
+    private fun getOrganizations(contactId: Int? = null): SparseArray<Organization> {
+        val organizations = SparseArray<Organization>()
         val uri = ContactsContract.Data.CONTENT_URI
         val projection = arrayOf(
                 ContactsContract.Data.RAW_CONTACT_ID,
-                CommonDataKinds.Organization.COMPANY
+                CommonDataKinds.Organization.COMPANY,
+                CommonDataKinds.Organization.TITLE
         )
 
         var selection = "${ContactsContract.Data.MIMETYPE} = ?"
@@ -350,7 +351,9 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
             if (cursor?.moveToFirst() == true) {
                 do {
                     val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
-                    val organization = cursor.getStringValue(CommonDataKinds.Organization.COMPANY) ?: continue
+                    val company = cursor.getStringValue(CommonDataKinds.Organization.COMPANY) ?: continue
+                    val title = cursor.getStringValue(CommonDataKinds.Organization.TITLE) ?: continue
+                    val organization = Organization(company, title)
                     organizations.put(id, organization)
                 } while (cursor.moveToNext())
             }
@@ -551,7 +554,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                 val contactId = cursor.getIntValue(ContactsContract.Data.CONTACT_ID)
                 val groups = getContactGroups(storedGroups, contactId)[contactId] ?: ArrayList()
                 val thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: ""
-                val organization = getOrganizations(id)[id] ?: ""
+                val organization = getOrganizations(id)[id] ?: Organization("", "")
                 return Contact(id, firstName, middleName, surname, photoUri, number, emails, addresses, events, accountName, starred, contactId,
                         thumbnailUri, null, notes, groups, organization)
             }
@@ -772,6 +775,18 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                 operations.add(build())
             }
 
+            // organization
+            ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI).apply {
+                val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ?"
+                val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
+                withSelection(selection, selectionArgs)
+                withValue(CommonDataKinds.Organization.COMPANY, contact.organization.company)
+                withValue(CommonDataKinds.Organization.TYPE, CommonDataKinds.Organization.TYPE_WORK)
+                withValue(CommonDataKinds.Organization.TITLE, contact.organization.jobPosition)
+                withValue(CommonDataKinds.Organization.TYPE, CommonDataKinds.Organization.TYPE_WORK)
+                operations.add(build())
+            }
+
             // delete groups
             val relevantGroupIDs = getStoredGroups().map { it.id }
             if (relevantGroupIDs.isNotEmpty()) {
@@ -955,6 +970,17 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                 operations.add(build())
             }
 
+            // organization
+            ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply {
+                withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
+                withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
+                withValue(CommonDataKinds.Organization.COMPANY, contact.organization.company)
+                withValue(CommonDataKinds.Organization.TYPE, CommonDataKinds.Organization.TYPE_WORK)
+                withValue(CommonDataKinds.Organization.TITLE, contact.organization.jobPosition)
+                withValue(CommonDataKinds.Organization.TYPE, CommonDataKinds.Organization.TYPE_WORK)
+                operations.add(build())
+            }
+
             // groups
             contact.groups.forEach {
                 ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply {
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 d3ca9181..341e4297 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
@@ -267,7 +267,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
                 val groupIds = Gson().fromJson<ArrayList<Long>>(groupIdsJson, groupIdsToken) ?: ArrayList(1)
                 val groups = storedGroups.filter { groupIds.contains(it.id) } as ArrayList<Group>
 
-                val organization = ""
+                val organization = Organization("", "")
 
                 val contact = Contact(id, firstName, middleName, surname, "", phoneNumbers, emails, addresses, events, SMT_PRIVATE, starred,
                         id, "", photo, notes, groups, organization)
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 1341ead5..48cfe6c4 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt
@@ -24,12 +24,12 @@ class VcfImporter(val activity: SimpleActivity) {
     private var curSurname = ""
     private var curPhotoUri = ""
     private var curNotes = ""
-    private var curOrganization = ""
     private var curPhoneNumbers = ArrayList<PhoneNumber>()
     private var curEmails = ArrayList<Email>()
     private var curEvents = ArrayList<Event>()
     private var curAddresses = ArrayList<Address>()
     private var curGroups = ArrayList<Group>()
+    private var curOrganization = Organization("", "")
 
     private var isGettingPhoto = false
     private var currentPhotoString = StringBuilder()
@@ -249,12 +249,12 @@ class VcfImporter(val activity: SimpleActivity) {
         curSurname = ""
         curPhotoUri = ""
         curNotes = ""
-        curOrganization = ""
         curPhoneNumbers = ArrayList()
         curEmails = ArrayList()
         curEvents = ArrayList()
         curAddresses = ArrayList()
         curGroups = ArrayList()
+        curOrganization = Organization("", "")
 
         isGettingPhoto = false
         currentPhotoString = StringBuilder()
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 cbb34453..b086c253 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
@@ -8,7 +8,7 @@ import com.simplemobiletools.commons.helpers.SORT_DESCENDING
 data class Contact(val id: Int, var firstName: String, var middleName: String, var surname: 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: String) : Comparable<Contact> {
+                   var groups: ArrayList<Group>, var organization: Organization) : Comparable<Contact> {
     companion object {
         var sorting = 0
     }
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Organization.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Organization.kt
new file mode 100644
index 00000000..fbb7b69c
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Organization.kt
@@ -0,0 +1,5 @@
+package com.simplemobiletools.contacts.models
+
+data class Organization(var company: String, var jobPosition: String) {
+    fun isEmpty() = company.isEmpty() && jobPosition.isEmpty()
+}
diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml
index f7a2fa11..d6b7e5ad 100644
--- a/app/src/main/res/layout/activity_edit_contact.xml
+++ b/app/src/main/res/layout/activity_edit_contact.xml
@@ -313,6 +313,47 @@
             android:textCursorDrawable="@null"
             android:textSize="@dimen/bigger_text_size"/>
 
+        <ImageView
+            android:id="@+id/contact_organization_image"
+            android:layout_width="@dimen/contact_icons_size"
+            android:layout_height="@dimen/contact_icons_size"
+            android:layout_alignTop="@+id/contact_organization_company"
+            android:paddingBottom="@dimen/small_margin"
+            android:paddingEnd="@dimen/small_margin"
+            android:paddingRight="@dimen/small_margin"
+            android:paddingTop="@dimen/medium_margin"
+            android:src="@drawable/ic_business"/>
+
+        <com.simplemobiletools.commons.views.MyEditText
+            android:id="@+id/contact_organization_company"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/contact_notes"
+            android:layout_centerVertical="true"
+            android:layout_marginTop="@dimen/normal_margin"
+            android:layout_toRightOf="@+id/contact_organization_image"
+            android:hint="@string/company"
+            android:inputType="textCapWords"
+            android:maxLines="1"
+            android:singleLine="true"
+            android:textCursorDrawable="@null"
+            android:textSize="@dimen/bigger_text_size"/>
+
+        <com.simplemobiletools.commons.views.MyEditText
+            android:id="@+id/contact_organization_job_position"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/contact_organization_company"
+            android:layout_centerVertical="true"
+            android:layout_marginTop="@dimen/normal_margin"
+            android:layout_toRightOf="@+id/contact_organization_image"
+            android:hint="@string/job_position"
+            android:inputType="textCapWords"
+            android:maxLines="1"
+            android:singleLine="true"
+            android:textCursorDrawable="@null"
+            android:textSize="@dimen/bigger_text_size"/>
+
         <ImageView
             android:id="@+id/contact_groups_image"
             android:layout_width="@dimen/contact_icons_size"
@@ -328,7 +369,7 @@
             android:id="@+id/contact_groups_holder"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_below="@+id/contact_notes"
+            android:layout_below="@+id/contact_organization_job_position"
             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 f7e2fb2f..1939f806 100644
--- a/app/src/main/res/layout/activity_view_contact.xml
+++ b/app/src/main/res/layout/activity_view_contact.xml
@@ -243,7 +243,7 @@
             android:id="@+id/contact_organization_image"
             android:layout_width="@dimen/contact_icons_size"
             android:layout_height="@dimen/contact_icons_size"
-            android:layout_alignTop="@+id/contact_organization"
+            android:layout_alignTop="@+id/contact_organization_company"
             android:paddingBottom="@dimen/small_margin"
             android:paddingEnd="@dimen/small_margin"
             android:paddingRight="@dimen/small_margin"
@@ -251,7 +251,7 @@
             android:src="@drawable/ic_business"/>
 
         <com.simplemobiletools.commons.views.MyTextView
-            android:id="@+id/contact_organization"
+            android:id="@+id/contact_organization_company"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_notes"
@@ -263,6 +263,19 @@
             android:paddingTop="@dimen/normal_margin"
             android:textSize="@dimen/bigger_text_size"/>
 
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/contact_organization_job_position"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/contact_organization_company"
+            android:layout_centerVertical="true"
+            android:layout_toRightOf="@+id/contact_organization_image"
+            android:lineSpacingExtra="@dimen/medium_margin"
+            android:paddingBottom="@dimen/normal_margin"
+            android:paddingLeft="@dimen/small_margin"
+            android:paddingTop="@dimen/normal_margin"
+            android:textSize="@dimen/bigger_text_size"/>
+
         <ImageView
             android:id="@+id/contact_groups_image"
             android:layout_width="@dimen/contact_icons_size"
@@ -278,7 +291,7 @@
             android:id="@+id/contact_groups_holder"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_below="@+id/contact_organization"
+            android:layout_below="@+id/contact_organization_job_position"
             android:layout_toRightOf="@+id/contact_name_image"
             android:orientation="vertical"
             android:paddingLeft="@dimen/small_margin"/>
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 0ab17154..8f0b1bfa 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -6,6 +6,8 @@
     <string name="updating">Aktualisiere…</string>
     <string name="phone_storage">Gerätespeicher</string>
     <string name="phone_storage_hidden">Gerätespeicher (nicht sichtbar für andere Apps)</string>
+    <string name="company">Company</string>
+    <string name="job_position">Job position</string>
 
     <string name="new_contact">Neuer Kontakt</string>
     <string name="edit_contact">Kontakt bearbeiten</string>
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 898a8612..d2d57248 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -6,6 +6,8 @@
     <string name="updating">Ενημέρωση...</string>
     <string name="phone_storage">Μνήμη τηλεφώνου</string>
     <string name="phone_storage_hidden">Μνήμη τηλεφώνου (δεν είναι ορατή από άλλες εφαρμογές)</string>
+    <string name="company">Company</string>
+    <string name="job_position">Job position</string>
 
     <string name="new_contact">Νέα επαφή</string>
     <string name="edit_contact">Επεξεργασία επαφής</string>
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 462aee6e..731e5e87 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -6,6 +6,8 @@
     <string name="updating">Mise à jour…</string>
     <string name="phone_storage">Stockage du téléphone</string>
     <string name="phone_storage_hidden">Stockage du téléphone (non visible par d\'autres applis)</string>
+    <string name="company">Company</string>
+    <string name="job_position">Job position</string>
 
     <string name="new_contact">Nouveau contact</string>
     <string name="edit_contact">Modifier contact</string>
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 9fd869be..5fe4526d 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -6,6 +6,8 @@
     <string name="updating">Ažuriranje...</string>
     <string name="phone_storage">Pohrana na telefonu</string>
     <string name="phone_storage_hidden">Pohrana na telefonu (nije vidljiva drugim aplikacijama))</string>
+    <string name="company">Company</string>
+    <string name="job_position">Job position</string>
 
     <string name="new_contact">Novi kontakt</string>
     <string name="edit_contact">Uredi kontakt</string>
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index 5984f2e1..26639518 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -6,6 +6,8 @@
     <string name="updating">수정중…</string>
     <string name="phone_storage">Phone storage</string>
     <string name="phone_storage_hidden">Phone storage (not visible by other apps)</string>
+    <string name="company">Company</string>
+    <string name="job_position">Job position</string>
 
     <string name="new_contact">새로운 연락처</string>
     <string name="edit_contact">연락처 수정</string>
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 8bb6b2ed..c5b5dfe7 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -6,6 +6,8 @@
     <string name="updating">Atnaujinama…</string>
     <string name="phone_storage">Telefono atmintis</string>
     <string name="phone_storage_hidden">Telefono atmintis (nematoma kitų programėlių)</string>
+    <string name="company">Company</string>
+    <string name="job_position">Job position</string>
 
     <string name="new_contact">Naujas kontaktas</string>
     <string name="edit_contact">Redaguoti kontaktą</string>
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 2c7019e4..07be66f6 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -6,6 +6,8 @@
     <string name="updating">A atualizar…</string>
     <string name="phone_storage">Armazenamento do telefone</string>
     <string name="phone_storage_hidden">Armazenamento do telefone (não visível por outras alicações)</string>
+    <string name="company">Company</string>
+    <string name="job_position">Job position</string>
 
     <string name="new_contact">Novo contacto</string>
     <string name="edit_contact">Editar contacto</string>
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 96125d08..05666af3 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -6,6 +6,8 @@
     <string name="updating">Обновление…</string>
     <string name="phone_storage">Память устройства</string>
     <string name="phone_storage_hidden">Память устройства (не видна другим приложениям)</string>
+    <string name="company">Company</string>
+    <string name="job_position">Job position</string>
 
     <string name="new_contact">Новый контакт</string>
     <string name="edit_contact">Редактировать контакт</string>
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 2a77d392..27af669f 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -6,6 +6,8 @@
     <string name="updating">Upravuje sa…</string>
     <string name="phone_storage">Úložisko mobilu</string>
     <string name="phone_storage_hidden">Úložisko mobilu (neviditeľné pre ostatné apky)</string>
+    <string name="company">Firma</string>
+    <string name="job_position">Pracovná pozícia</string>
 
     <string name="new_contact">Nový kontakt</string>
     <string name="edit_contact">Upraviť kontakt</string>
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 8dc1c334..c80da7b9 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -6,6 +6,8 @@
     <string name="updating">Uppdaterar…</string>
     <string name="phone_storage">Telefonens lagringsutrymme</string>
     <string name="phone_storage_hidden">Telefonens lagringsutrymme (inte synligt för andra appar)</string>
+    <string name="company">Company</string>
+    <string name="job_position">Job position</string>
 
     <string name="new_contact">Ny kontakt</string>
     <string name="edit_contact">Redigera kontakt</string>
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 9cfe9d2f..b67195db 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -6,6 +6,8 @@
     <string name="updating">更新中…</string>
     <string name="phone_storage">手機空間</string>
     <string name="phone_storage_hidden">手機空間 (其他程式不可見)</string>
+    <string name="company">Company</string>
+    <string name="job_position">Job position</string>
 
     <string name="new_contact">新聯絡人</string>
     <string name="edit_contact">編輯聯絡人</string>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 67f884c5..16699bf1 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -6,6 +6,8 @@
     <string name="updating">Updating…</string>
     <string name="phone_storage">Phone storage</string>
     <string name="phone_storage_hidden">Phone storage (not visible by other apps)</string>
+    <string name="company">Company</string>
+    <string name="job_position">Job position</string>
 
     <string name="new_contact">New contact</string>
     <string name="edit_contact">Edit contact</string>

From 30a32491594702e741675195c60f9ba9d3fce5c0 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sat, 7 Apr 2018 16:17:25 +0200
Subject: [PATCH 21/61] setup organization data at Edit

---
 .../contacts/activities/EditContactActivity.kt             | 7 +++++++
 1 file changed, 7 insertions(+)

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 3512e988..e3e5a38c 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -176,6 +176,7 @@ class EditContactActivity : ContactActivity() {
         contact_notes_image.applyColorFilter(textColor)
         contact_source_image.applyColorFilter(textColor)
         contact_groups_image.applyColorFilter(textColor)
+        contact_organization_image.applyColorFilter(textColor)
 
         val adjustedPrimaryColor = getAdjustedPrimaryColor()
         contact_number_add_new.applyColorFilter(adjustedPrimaryColor)
@@ -250,6 +251,7 @@ class EditContactActivity : ContactActivity() {
         setupEmails()
         setupAddresses()
         setupNotes()
+        setupOrganization()
         setupEvents()
         setupGroups()
     }
@@ -303,6 +305,11 @@ class EditContactActivity : ContactActivity() {
         contact_notes.setText(contact!!.notes)
     }
 
+    private fun setupOrganization() {
+        contact_organization_company.setText(contact!!.organization.company)
+        contact_organization_job_position.setText(contact!!.organization.jobPosition)
+    }
+
     private fun setupEvents() {
         contact!!.events.forEachIndexed { index, event ->
             var eventHolder = contact_events_holder.getChildAt(index)

From 4ec6142547fc527b6af91d678dc337c805887ae6 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sat, 7 Apr 2018 17:07:22 +0200
Subject: [PATCH 22/61] display contact prefix and suffix

---
 .../activities/EditContactActivity.kt         |  2 +-
 .../activities/ViewContactActivity.kt         |  8 +++-
 .../contacts/helpers/ContactsHelper.kt        | 14 +++++--
 .../contacts/helpers/DBHelper.kt              |  6 ++-
 .../contacts/helpers/VcfImporter.kt           |  6 ++-
 .../contacts/models/Contact.kt                |  6 ++-
 .../main/res/layout/activity_view_contact.xml | 40 ++++++++++++++++---
 7 files changed, 66 insertions(+), 16 deletions(-)

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 e3e5a38c..cdd0895f 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -394,7 +394,7 @@ class EditContactActivity : ContactActivity() {
         supportActionBar?.title = resources.getString(R.string.new_contact)
         val contactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE
         val organization = Organization("", "")
-        contact = Contact(0, "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), contactSource, 0, 0, "", null, "", ArrayList(), organization)
+        contact = Contact(0, "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), contactSource, 0, 0, "", null, "", ArrayList(), organization)
         contact_source.text = getPublicContactSource(contact!!.source)
         contact_source.setOnClickListener {
             showContactSourcePicker(contact!!.source) {
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 4b5f8308..41edf52d 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
@@ -137,6 +137,9 @@ class ViewContactActivity : ContactActivity() {
     private fun setupViewContact() {
         window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
         contact!!.apply {
+            contact_prefix.text = prefix
+            contact_prefix.beVisibleIf(prefix.isNotEmpty())
+
             contact_first_name.text = firstName
             contact_first_name.beVisibleIf(firstName.isNotEmpty())
 
@@ -146,7 +149,10 @@ class ViewContactActivity : ContactActivity() {
             contact_surname.text = surname
             contact_surname.beVisibleIf(surname.isNotEmpty())
 
-            if (firstName.isEmpty() && middleName.isEmpty() && surname.isEmpty()) {
+            contact_suffix.text = suffix
+            contact_suffix.beVisibleIf(suffix.isNotEmpty())
+
+            if (prefix.isEmpty() && firstName.isEmpty() && middleName.isEmpty() && surname.isEmpty() && suffix.isEmpty()) {
                 contact_name_image.beInvisible()
                 (contact_photo.layoutParams as RelativeLayout.LayoutParams).bottomMargin = resources.getDimension(R.dimen.medium_margin).toInt()
             }
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 39cd30a7..8054745b 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
@@ -69,9 +69,11 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
             if (cursor?.moveToFirst() == true) {
                 do {
                     val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
+                    val prefix = cursor.getStringValue(CommonDataKinds.StructuredName.PREFIX) ?: ""
                     val firstName = cursor.getStringValue(CommonDataKinds.StructuredName.GIVEN_NAME) ?: ""
                     val middleName = cursor.getStringValue(CommonDataKinds.StructuredName.MIDDLE_NAME) ?: ""
                     val surname = cursor.getStringValue(CommonDataKinds.StructuredName.FAMILY_NAME) ?: ""
+                    val suffix = cursor.getStringValue(CommonDataKinds.StructuredName.SUFFIX) ?: ""
                     val photoUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_URI) ?: ""
                     val number = ArrayList<PhoneNumber>()       // proper value is obtained below
                     val emails = ArrayList<Email>()
@@ -84,8 +86,8 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                     val notes = ""
                     val groups = ArrayList<Group>()
                     val organization = Organization("", "")
-                    val contact = Contact(id, firstName, middleName, surname, photoUri, number, emails, addresses, events, accountName,
-                            starred, contactId, thumbnailUri, null, notes, groups, organization)
+                    val contact = Contact(id, prefix, firstName, middleName, surname, suffix, photoUri, number, emails, addresses, events,
+                            accountName, starred, contactId, thumbnailUri, null, notes, groups, organization)
                     contacts.put(id, contact)
                 } while (cursor.moveToNext())
             }
@@ -540,9 +542,11 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
             cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null)
             if (cursor?.moveToFirst() == true) {
                 val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
+                val prefix = cursor.getStringValue(CommonDataKinds.StructuredName.PREFIX) ?: ""
                 val firstName = cursor.getStringValue(CommonDataKinds.StructuredName.GIVEN_NAME) ?: ""
                 val middleName = cursor.getStringValue(CommonDataKinds.StructuredName.MIDDLE_NAME) ?: ""
                 val surname = cursor.getStringValue(CommonDataKinds.StructuredName.FAMILY_NAME) ?: ""
+                val suffix = cursor.getStringValue(CommonDataKinds.StructuredName.SUFFIX) ?: ""
                 val photoUri = cursor.getStringValue(CommonDataKinds.Phone.PHOTO_URI) ?: ""
                 val number = getPhoneNumbers(id)[id] ?: ArrayList()
                 val emails = getEmails(id)[id] ?: ArrayList()
@@ -555,8 +559,8 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                 val groups = getContactGroups(storedGroups, contactId)[contactId] ?: ArrayList()
                 val thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: ""
                 val organization = getOrganizations(id)[id] ?: Organization("", "")
-                return Contact(id, firstName, middleName, surname, photoUri, number, emails, addresses, events, accountName, starred, contactId,
-                        thumbnailUri, null, notes, groups, organization)
+                return Contact(id, prefix, firstName, middleName, surname, suffix, photoUri, number, emails, addresses, events, accountName,
+                        starred, contactId, thumbnailUri, null, notes, groups, organization)
             }
         } finally {
             cursor?.close()
@@ -629,9 +633,11 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
     private fun getContactProjection() = arrayOf(
             ContactsContract.Data.CONTACT_ID,
             ContactsContract.Data.RAW_CONTACT_ID,
+            CommonDataKinds.StructuredName.PREFIX,
             CommonDataKinds.StructuredName.GIVEN_NAME,
             CommonDataKinds.StructuredName.MIDDLE_NAME,
             CommonDataKinds.StructuredName.FAMILY_NAME,
+            CommonDataKinds.StructuredName.SUFFIX,
             CommonDataKinds.StructuredName.PHOTO_URI,
             CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI,
             CommonDataKinds.StructuredName.STARRED,
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 341e4297..cca49b5e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
@@ -232,9 +232,11 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
         cursor.use {
             while (cursor.moveToNext()) {
                 val id = cursor.getIntValue(COL_ID)
+                val prefix = ""
                 val firstName = cursor.getStringValue(COL_FIRST_NAME)
                 val middleName = cursor.getStringValue(COL_MIDDLE_NAME)
                 val surname = cursor.getStringValue(COL_SURNAME)
+                val suffix = ""
 
                 val phoneNumbersJson = cursor.getStringValue(COL_PHONE_NUMBERS)
                 val phoneNumbersToken = object : TypeToken<List<PhoneNumber>>() {}.type
@@ -269,8 +271,8 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
 
                 val organization = Organization("", "")
 
-                val contact = Contact(id, firstName, middleName, surname, "", phoneNumbers, emails, addresses, events, SMT_PRIVATE, starred,
-                        id, "", photo, notes, groups, organization)
+                val contact = Contact(id, prefix, firstName, middleName, surname, suffix, "", phoneNumbers, emails, addresses, events,
+                        SMT_PRIVATE, starred, id, "", photo, notes, groups, organization)
                 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 48cfe6c4..da2f57a3 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt
@@ -19,9 +19,11 @@ class VcfImporter(val activity: SimpleActivity) {
         IMPORT_FAIL, IMPORT_OK, IMPORT_PARTIAL
     }
 
+    private var curPrefix = ""
     private var curFirstName = ""
     private var curMiddleName = ""
     private var curSurname = ""
+    private var curSuffix = ""
     private var curPhotoUri = ""
     private var curNotes = ""
     private var curPhoneNumbers = ArrayList<PhoneNumber>()
@@ -236,7 +238,7 @@ class VcfImporter(val activity: SimpleActivity) {
     }
 
     private fun saveContact(source: String) {
-        val contact = Contact(0, curFirstName, curMiddleName, curSurname, curPhotoUri, curPhoneNumbers, curEmails, curAddresses, curEvents,
+        val contact = Contact(0, curPrefix, curFirstName, curMiddleName, curSurname, curSuffix, curPhotoUri, curPhoneNumbers, curEmails, curAddresses, curEvents,
                 source, 0, 0, "", null, curNotes, curGroups, curOrganization)
         if (ContactsHelper(activity).insertContact(contact)) {
             contactsImported++
@@ -244,9 +246,11 @@ class VcfImporter(val activity: SimpleActivity) {
     }
 
     private fun resetValues() {
+        curPrefix = ""
         curFirstName = ""
         curMiddleName = ""
         curSurname = ""
+        curSuffix = ""
         curPhotoUri = ""
         curNotes = ""
         curPhoneNumbers = ArrayList()
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 b086c253..58fd2f10 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
@@ -5,7 +5,7 @@ import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME
 import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME
 import com.simplemobiletools.commons.helpers.SORT_DESCENDING
 
-data class Contact(val id: Int, var firstName: String, var middleName: String, var surname: String, var photoUri: String,
+data class Contact(val id: Int, var prefix: String, var firstName: String, var middleName: String, var surname: String, var suffix: 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) : Comparable<Contact> {
@@ -38,8 +38,10 @@ data class Contact(val id: Int, var firstName: String, var middleName: String, v
         if (middleName.isNotEmpty()) {
             firstPart += " $middleName"
         }
+
         val lastPart = if (startWithSurname) firstName else surname
-        return "$firstPart $lastPart".trim()
+        val suffixComma = if (suffix.isEmpty()) "" else ", $suffix"
+        return "$prefix $firstPart $lastPart$suffixComma".trim()
     }
 
     private fun compareStrings(first: String, second: String): Int {
diff --git a/app/src/main/res/layout/activity_view_contact.xml b/app/src/main/res/layout/activity_view_contact.xml
index 1939f806..384c7cd2 100644
--- a/app/src/main/res/layout/activity_view_contact.xml
+++ b/app/src/main/res/layout/activity_view_contact.xml
@@ -18,7 +18,8 @@
         <ImageView
             android:id="@+id/contact_photo"
             android:layout_width="@dimen/contact_photo_size"
-            android:layout_height="@dimen/contact_photo_size"/>
+            android:layout_height="@dimen/contact_photo_size"
+            android:layout_marginBottom="@dimen/normal_margin"/>
 
         <ImageView
             android:id="@+id/contact_toggle_favorite"
@@ -83,7 +84,7 @@
             android:id="@+id/contact_name_image"
             android:layout_width="@dimen/contact_icons_size"
             android:layout_height="@dimen/contact_icons_size"
-            android:layout_alignTop="@+id/contact_first_name"
+            android:layout_below="@+id/contact_photo"
             android:paddingBottom="@dimen/small_margin"
             android:paddingEnd="@dimen/small_margin"
             android:paddingRight="@dimen/small_margin"
@@ -91,12 +92,26 @@
             android:src="@drawable/ic_person"/>
 
         <com.simplemobiletools.commons.views.MyTextView
-            android:id="@+id/contact_first_name"
+            android:id="@+id/contact_prefix"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_photo"
             android:layout_centerVertical="true"
-            android:layout_marginTop="@dimen/normal_margin"
+            android:layout_toRightOf="@+id/contact_name_image"
+            android:lines="1"
+            android:maxLines="1"
+            android:paddingBottom="@dimen/normal_margin"
+            android:paddingLeft="@dimen/small_margin"
+            android:paddingTop="@dimen/normal_margin"
+            android:singleLine="true"
+            android:textSize="@dimen/bigger_text_size"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/contact_first_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/contact_prefix"
+            android:layout_centerVertical="true"
             android:layout_toRightOf="@+id/contact_name_image"
             android:lines="1"
             android:maxLines="1"
@@ -136,6 +151,21 @@
             android:singleLine="true"
             android:textSize="@dimen/bigger_text_size"/>
 
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/contact_suffix"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/contact_surname"
+            android:layout_centerVertical="true"
+            android:layout_toRightOf="@+id/contact_name_image"
+            android:lines="1"
+            android:maxLines="1"
+            android:paddingBottom="@dimen/normal_margin"
+            android:paddingLeft="@dimen/small_margin"
+            android:paddingTop="@dimen/normal_margin"
+            android:singleLine="true"
+            android:textSize="@dimen/bigger_text_size"/>
+
         <ImageView
             android:id="@+id/contact_number_image"
             android:layout_width="@dimen/contact_icons_size"
@@ -151,7 +181,7 @@
             android:id="@+id/contact_numbers_holder"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_below="@+id/contact_surname"
+            android:layout_below="@+id/contact_suffix"
             android:layout_toRightOf="@+id/contact_number_image"
             android:orientation="vertical"
             android:paddingLeft="@dimen/small_margin"/>

From ee261765dd22349dc3adb355ff6ec90ff82d90bf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9rgio=20Marques?= <smarquespt@gmail.com>
Date: Sat, 7 Apr 2018 16:35:36 +0100
Subject: [PATCH 23/61] Update strings.xml

---
 app/src/main/res/values-pt/strings.xml | 30 +++++++++++++-------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 07be66f6..c42e2aa5 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -6,8 +6,8 @@
     <string name="updating">A atualizar…</string>
     <string name="phone_storage">Armazenamento do telefone</string>
     <string name="phone_storage_hidden">Armazenamento do telefone (não visível por outras alicações)</string>
-    <string name="company">Company</string>
-    <string name="job_position">Job position</string>
+    <string name="company">Organização</string>
+    <string name="job_position">Cargo</string>
 
     <string name="new_contact">Novo contacto</string>
     <string name="edit_contact">Editar contacto</string>
@@ -42,7 +42,7 @@
     <string name="view_contact">Ver detalhes</string>
     <string name="show_favorites_tab">Mostrar favoritos</string>
     <string name="show_groups_tab">Mostrar grupos</string>
-    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
+    <string name="manage_shown_contact_fields">Gerir campos a exibir</string>
 
     <!-- Emails -->
     <string name="email">E-mail</string>
@@ -83,17 +83,17 @@
     <string name="filename_without_vcf">Nome do ficheiro (sem .vcf)</string>
 
     <!-- Visible fields -->
-    <string name="select_fields_to_show">Select fields to show</string>
-    <string name="prefix">Prefix</string>
-    <string name="suffix">Suffix</string>
-    <string name="phone_numbers">Phone numbers</string>
-    <string name="emails">Emails</string>
-    <string name="addresses">Addresses</string>
-    <string name="events">Events (birthdays, anniversaries)</string>
-    <string name="notes">Notes</string>
-    <string name="organization">Organization</string>
-    <string name="groups">Groups</string>
-    <string name="contact_source">Contact source</string>
+    <string name="select_fields_to_show">Selecione os campos a mostrar</string>
+    <string name="prefix">Prefixo</string>
+    <string name="suffix">Sufixo</string>
+    <string name="phone_numbers">Número de telefone</string>
+    <string name="emails">E-mail</string>
+    <string name="addresses">Endereço</string>
+    <string name="events">Eventos (data de nascimento, aniversário)</string>
+    <string name="notes">Notas</string>
+    <string name="organization">Organização</string>
+    <string name="groups">Grupos</string>
+    <string name="contact_source">Fonte do contacto</string>
 
     <!-- FAQ -->
     <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
@@ -105,7 +105,7 @@
     <string name="app_long_description">
         Uma aplicação básica para criar e gerir contactos. Pode utilizar a aplicação guardar os contactos localmente, na sua conta Google ou em outro tipo de contas. Pode mostrar os contactos favoritos numa lista distinta.
 
-        Também pode utilizar a plicação para gerir endereços de e-mail e eventos. Tem a capacidade de ordenar/filtrar por diversos parâmetros e também a possibilidade de diversas formas de exibição dos contactos.
+        Também pode utilizar a aplicação para gerir endereços de e-mail e eventos. Tem a capacidade de ordenar/filtrar por diversos parâmetros e também a possibilidade de diversas formas de exibição dos contactos.
 
         Não contém anúncios ou permissões desnecessárias. É totalmente open source e permite personalização de cores.
 

From 3cfbe5f776d589e25631758777676917d7422e9a Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sat, 7 Apr 2018 17:45:38 +0200
Subject: [PATCH 24/61] allow modifying contact prefix and suffix

---
 .../activities/EditContactActivity.kt         |  4 ++
 .../contacts/helpers/ContactsHelper.kt        |  4 ++
 .../main/res/layout/activity_edit_contact.xml | 41 +++++++++++++++++--
 3 files changed, 45 insertions(+), 4 deletions(-)

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 cdd0895f..e0a9d5d5 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -242,9 +242,11 @@ class EditContactActivity : ContactActivity() {
     private fun setupEditContact() {
         window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
         supportActionBar?.title = resources.getString(R.string.edit_contact)
+        contact_prefix.setText(contact!!.prefix)
         contact_first_name.setText(contact!!.firstName)
         contact_middle_name.setText(contact!!.middleName)
         contact_surname.setText(contact!!.surname)
+        contact_suffix.setText(contact!!.suffix)
         contact_source.text = getPublicContactSource(contact!!.source)
 
         setupPhoneNumbers()
@@ -599,9 +601,11 @@ class EditContactActivity : ContactActivity() {
         contact!!.apply {
             val oldPhotoUri = photoUri
 
+            prefix = contact_prefix.value
             firstName = contact_first_name.value
             middleName = contact_middle_name.value
             surname = contact_surname.value
+            suffix = contact_suffix.value
             photoUri = currentContactPhotoPath
             phoneNumbers = getFilledPhoneNumbers()
             emails = getFilledEmails()
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 8054745b..6c393f7e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
@@ -690,9 +690,11 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                 val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ?"
                 val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                 withSelection(selection, selectionArgs)
+                withValue(CommonDataKinds.StructuredName.PREFIX, contact.prefix)
                 withValue(CommonDataKinds.StructuredName.GIVEN_NAME, contact.firstName)
                 withValue(CommonDataKinds.StructuredName.MIDDLE_NAME, contact.middleName)
                 withValue(CommonDataKinds.StructuredName.FAMILY_NAME, contact.surname)
+                withValue(CommonDataKinds.StructuredName.SUFFIX, contact.suffix)
                 operations.add(build())
             }
 
@@ -918,9 +920,11 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
             ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply {
                 withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                 withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
+                withValue(CommonDataKinds.StructuredName.PREFIX, contact.prefix)
                 withValue(CommonDataKinds.StructuredName.GIVEN_NAME, contact.firstName)
                 withValue(CommonDataKinds.StructuredName.MIDDLE_NAME, contact.middleName)
                 withValue(CommonDataKinds.StructuredName.FAMILY_NAME, contact.surname)
+                withValue(CommonDataKinds.StructuredName.SUFFIX, contact.suffix)
                 operations.add(build())
             }
 
diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml
index d6b7e5ad..7b70f9be 100644
--- a/app/src/main/res/layout/activity_edit_contact.xml
+++ b/app/src/main/res/layout/activity_edit_contact.xml
@@ -18,7 +18,8 @@
         <ImageView
             android:id="@+id/contact_photo"
             android:layout_width="@dimen/contact_photo_size"
-            android:layout_height="@dimen/contact_photo_size"/>
+            android:layout_height="@dimen/contact_photo_size"
+            android:layout_marginBottom="@dimen/normal_margin"/>
 
         <ImageView
             android:id="@+id/contact_toggle_favorite"
@@ -82,7 +83,7 @@
             android:id="@+id/contact_name_image"
             android:layout_width="@dimen/contact_icons_size"
             android:layout_height="@dimen/contact_icons_size"
-            android:layout_alignTop="@+id/contact_first_name"
+            android:layout_below="@+id/contact_photo"
             android:paddingBottom="@dimen/small_margin"
             android:paddingEnd="@dimen/small_margin"
             android:paddingRight="@dimen/small_margin"
@@ -90,13 +91,29 @@
             android:src="@drawable/ic_person"/>
 
         <com.simplemobiletools.commons.views.MyEditText
-            android:id="@+id/contact_first_name"
+            android:id="@+id/contact_prefix"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_photo"
             android:layout_centerVertical="true"
             android:layout_marginTop="@dimen/normal_margin"
             android:layout_toRightOf="@+id/contact_name_image"
+            android:hint="@string/prefix"
+            android:inputType="textCapWords"
+            android:lines="1"
+            android:maxLines="1"
+            android:singleLine="true"
+            android:textCursorDrawable="@null"
+            android:textSize="@dimen/bigger_text_size"/>
+
+        <com.simplemobiletools.commons.views.MyEditText
+            android:id="@+id/contact_first_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/contact_prefix"
+            android:layout_centerVertical="true"
+            android:layout_marginTop="@dimen/normal_margin"
+            android:layout_toRightOf="@+id/contact_name_image"
             android:hint="@string/first_name"
             android:inputType="textCapWords"
             android:lines="1"
@@ -137,6 +154,22 @@
             android:textCursorDrawable="@null"
             android:textSize="@dimen/bigger_text_size"/>
 
+        <com.simplemobiletools.commons.views.MyEditText
+            android:id="@+id/contact_suffix"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/contact_surname"
+            android:layout_centerVertical="true"
+            android:layout_marginTop="@dimen/normal_margin"
+            android:layout_toRightOf="@+id/contact_name_image"
+            android:hint="@string/suffix"
+            android:inputType="textCapWords"
+            android:lines="1"
+            android:maxLines="1"
+            android:singleLine="true"
+            android:textCursorDrawable="@null"
+            android:textSize="@dimen/bigger_text_size"/>
+
         <ImageView
             android:id="@+id/contact_number_image"
             android:layout_width="@dimen/contact_icons_size"
@@ -152,7 +185,7 @@
             android:id="@+id/contact_numbers_holder"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_below="@+id/contact_surname"
+            android:layout_below="@+id/contact_suffix"
             android:layout_marginTop="@dimen/medium_margin"
             android:layout_toRightOf="@+id/contact_number_image"
             android:orientation="vertical">

From d5c9d32f86c5dc74afc1519f8a6ae90504b2a29a Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 10:51:58 +0200
Subject: [PATCH 25/61] handle null address

---
 .../com/simplemobiletools/contacts/helpers/ContactsHelper.kt    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 6c393f7e..410cf2d5 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
@@ -233,7 +233,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
             if (cursor?.moveToFirst() == true) {
                 do {
                     val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID)
-                    val address = cursor.getStringValue(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS)
+                    val address = cursor.getStringValue(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS) ?: ""
                     val type = cursor.getIntValue(CommonDataKinds.StructuredPostal.TYPE)
 
                     if (addresses[id] == null) {

From bde0ad34eaccd0b3441dbc6102769de6f2f662ab Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 11:36:51 +0200
Subject: [PATCH 26/61] make sure Search checks contact organization too

---
 .../contacts/fragments/MyViewPagerFragment.kt                 | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
index 7d6fccb4..51803ece 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
@@ -237,7 +237,9 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
                         it.phoneNumbers.any { it.value.contains(text, true) } ||
                         it.emails.any { it.value.contains(text, true) } ||
                         it.addresses.any { it.value.contains(text, true) } ||
-                        it.notes.contains(text, true)
+                        it.notes.contains(text, true) ||
+                        it.organization.company.contains(text, true) ||
+                        it.organization.jobPosition.contains(text, true)
             } as ArrayList
 
             Contact.sorting = config.sorting

From fea917e41c0a30861f89eecffed4389073d237dc Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 11:38:15 +0200
Subject: [PATCH 27/61] add prefix/suffix/organization to contacts stored
 locally

---
 .../contacts/helpers/DBHelper.kt              | 36 +++++++++++++------
 1 file changed, 26 insertions(+), 10 deletions(-)

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 cca49b5e..897311dc 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
@@ -23,9 +23,11 @@ import com.simplemobiletools.contacts.models.*
 class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) {
     private val CONTACTS_TABLE_NAME = "contacts"
     private val COL_ID = "id"
+    private val COL_PREFIX = "prefix"
     private val COL_FIRST_NAME = "first_name"
     private val COL_MIDDLE_NAME = "middle_name"
     private val COL_SURNAME = "surname"
+    private val COL_SUFFIX = "suffix"
     private val COL_PHOTO = "photo"
     private val COL_PHONE_NUMBERS = "phone_numbers"
     private val COL_EMAILS = "emails"
@@ -33,6 +35,8 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
     private val COL_STARRED = "starred"
     private val COL_ADDRESSES = "addresses"
     private val COL_NOTES = "notes"
+    private val COL_COMPANY = "company"
+    private val COL_JOB_POSITION = "job_position"
     private val COL_GROUPS = "groups"
 
     private val GROUPS_TABLE_NAME = "groups"
@@ -43,7 +47,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
     private val mDb = writableDatabase
 
     companion object {
-        private const val DB_VERSION = 3
+        private const val DB_VERSION = 4
         const val DB_NAME = "contacts.db"
         var dbInstance: DBHelper? = null
 
@@ -58,7 +62,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
     override fun onCreate(db: SQLiteDatabase) {
         db.execSQL("CREATE TABLE $CONTACTS_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_FIRST_NAME TEXT, $COL_MIDDLE_NAME TEXT, " +
                 "$COL_SURNAME TEXT, $COL_PHOTO BLOB, $COL_PHONE_NUMBERS TEXT, $COL_EMAILS TEXT, $COL_EVENTS TEXT, $COL_STARRED INTEGER, " +
-                "$COL_ADDRESSES TEXT, $COL_NOTES TEXT, $COL_GROUPS TEXT)")
+                "$COL_ADDRESSES TEXT, $COL_NOTES TEXT, $COL_GROUPS TEXT, $COL_PREFIX TEXT, $COL_SUFFIX TEXT, $COL_COMPANY TEXT, $COL_JOB_POSITION TEXT)")
 
         // start autoincrement ID from FIRST_CONTACT_ID to avoid conflicts
         db.execSQL("REPLACE INTO sqlite_sequence (name, seq) VALUES ('$CONTACTS_TABLE_NAME', $FIRST_CONTACT_ID)")
@@ -76,6 +80,13 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
             createGroupsTable(db)
             db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_GROUPS TEXT DEFAULT ''")
         }
+
+        if (oldVersion < 4) {
+            db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_PREFIX TEXT DEFAULT ''")
+            db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_SUFFIX TEXT DEFAULT ''")
+            db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_COMPANY TEXT DEFAULT ''")
+            db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_JOB_POSITION TEXT DEFAULT ''")
+        }
     }
 
     private fun createGroupsTable(db: SQLiteDatabase) {
@@ -108,9 +119,11 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
 
     private fun fillContactValues(contact: Contact): ContentValues {
         return ContentValues().apply {
+            put(COL_PREFIX, contact.prefix)
             put(COL_FIRST_NAME, contact.firstName)
             put(COL_MIDDLE_NAME, contact.middleName)
             put(COL_SURNAME, contact.surname)
+            put(COL_SUFFIX, contact.suffix)
             put(COL_PHONE_NUMBERS, Gson().toJson(contact.phoneNumbers))
             put(COL_EMAILS, Gson().toJson(contact.emails))
             put(COL_ADDRESSES, Gson().toJson(contact.addresses))
@@ -118,6 +131,8 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
             put(COL_STARRED, contact.starred)
             put(COL_NOTES, contact.notes)
             put(COL_GROUPS, Gson().toJson(contact.groups.map { it.id }))
+            put(COL_COMPANY, contact.organization.company)
+            put(COL_JOB_POSITION, contact.organization.jobPosition)
 
             if (contact.photoUri.isNotEmpty()) {
                 put(COL_PHOTO, getPhotoByteArray(contact.photoUri))
@@ -166,7 +181,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
 
     fun deleteGroup(id: Long) = deleteGroups(arrayOf(id.toString()))
 
-    fun deleteGroups(ids: Array<String>) {
+    private fun deleteGroups(ids: Array<String>) {
         val args = TextUtils.join(", ", ids)
         val selection = "$GROUPS_TABLE_NAME.$COL_ID IN ($args)"
         mDb.delete(GROUPS_TABLE_NAME, selection, null)
@@ -209,7 +224,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
         }
     }
 
-    fun updateContactGroups(contact: Contact, groupIds: ArrayList<Long>) {
+    private fun updateContactGroups(contact: Contact, groupIds: ArrayList<Long>) {
         val contactValues = fillContactGroupValues(groupIds)
         val selection = "$COL_ID = ?"
         val selectionArgs = arrayOf(contact.id.toString())
@@ -222,21 +237,20 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
         }
     }
 
-
     fun getContacts(activity: BaseSimpleActivity, selection: String? = null, selectionArgs: Array<String>? = null): ArrayList<Contact> {
         val storedGroups = ContactsHelper(activity).getStoredGroups()
         val contacts = ArrayList<Contact>()
-        val projection = arrayOf(COL_ID, COL_FIRST_NAME, COL_MIDDLE_NAME, COL_SURNAME, COL_PHONE_NUMBERS, COL_EMAILS, COL_EVENTS, COL_STARRED,
-                COL_PHOTO, COL_ADDRESSES, COL_NOTES, COL_GROUPS)
+        val projection = arrayOf(COL_ID, COL_PREFIX, COL_FIRST_NAME, COL_MIDDLE_NAME, COL_SURNAME, COL_SUFFIX, COL_PHONE_NUMBERS, COL_EMAILS,
+                COL_EVENTS, COL_STARRED, COL_PHOTO, COL_ADDRESSES, COL_NOTES, COL_GROUPS, COL_COMPANY, COL_JOB_POSITION)
         val cursor = mDb.query(CONTACTS_TABLE_NAME, projection, selection, selectionArgs, null, null, null)
         cursor.use {
             while (cursor.moveToNext()) {
                 val id = cursor.getIntValue(COL_ID)
-                val prefix = ""
+                val prefix = cursor.getStringValue(COL_PREFIX)
                 val firstName = cursor.getStringValue(COL_FIRST_NAME)
                 val middleName = cursor.getStringValue(COL_MIDDLE_NAME)
                 val surname = cursor.getStringValue(COL_SURNAME)
-                val suffix = ""
+                val suffix = cursor.getStringValue(COL_SUFFIX)
 
                 val phoneNumbersJson = cursor.getStringValue(COL_PHONE_NUMBERS)
                 val phoneNumbersToken = object : TypeToken<List<PhoneNumber>>() {}.type
@@ -269,7 +283,9 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
                 val groupIds = Gson().fromJson<ArrayList<Long>>(groupIdsJson, groupIdsToken) ?: ArrayList(1)
                 val groups = storedGroups.filter { groupIds.contains(it.id) } as ArrayList<Group>
 
-                val organization = Organization("", "")
+                val company = cursor.getStringValue(COL_COMPANY)
+                val jobPosition = cursor.getStringValue(COL_JOB_POSITION)
+                val organization = Organization(company, jobPosition)
 
                 val contact = Contact(id, prefix, firstName, middleName, surname, suffix, "", phoneNumbers, emails, addresses, events,
                         SMT_PRIVATE, starred, id, "", photo, notes, groups, organization)

From d6f8bd43bf4f5bd1ed25ec33457b1c9427b6de75 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 12:05:34 +0200
Subject: [PATCH 28/61] handle prefix/suffix/organization exporting/importing

---
 .../contacts/helpers/Constants.kt             |  2 ++
 .../contacts/helpers/VcfExporter.kt           | 15 +++++++++++--
 .../contacts/helpers/VcfImporter.kt           | 21 ++++++++++++++++---
 3 files changed, 33 insertions(+), 5 deletions(-)

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 6a7555f6..38f51d63 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt
@@ -43,6 +43,8 @@ const val PHOTO = "PHOTO"
 const val EMAIL = "EMAIL"
 const val ADR = "ADR"
 const val NOTE = "NOTE:"
+const val ORG = "ORG:"
+const val TITLE = "TITLE:"
 const val ENCODING = "ENCODING"
 const val BASE64 = "BASE64"
 const val JPEG = "JPEG"
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt
index ec7e443e..80e503eb 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt
@@ -66,6 +66,11 @@ class VcfExporter {
                             out.writeLn("$NOTE${contact.notes.replace("\n", "\\n")}")
                         }
 
+                        if (!contact.organization.isEmpty()) {
+                            out.writeLn("$ORG${contact.organization.company.replace("\n", "\\n")}")
+                            out.writeLn("$TITLE${contact.organization.jobPosition.replace("\n", "\\n")}")
+                        }
+
                         if (contact.thumbnailUri.isNotEmpty()) {
                             val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, Uri.parse(contact.thumbnailUri))
                             addBitmap(bitmap, out)
@@ -116,17 +121,23 @@ class VcfExporter {
         var firstName = contact.firstName
         var surName = contact.surname
         var middleName = contact.middleName
+        var prefix = contact.prefix
+        var suffix = contact.suffix
 
         if (QuotedPrintable.urlEncode(firstName) != firstName
                 || QuotedPrintable.urlEncode(surName) != surName
-                || QuotedPrintable.urlEncode(middleName) != middleName) {
+                || QuotedPrintable.urlEncode(middleName) != middleName
+                || QuotedPrintable.urlEncode(prefix) != prefix
+                || QuotedPrintable.urlEncode(suffix) != suffix) {
             firstName = QuotedPrintable.encode(firstName)
             surName = QuotedPrintable.encode(surName)
             middleName = QuotedPrintable.encode(middleName)
+            prefix = QuotedPrintable.encode(prefix)
+            suffix = QuotedPrintable.encode(suffix)
             result += ";CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE"
         }
 
-        return "$result:$surName;$firstName;$middleName;;"
+        return "$result:$surName;$firstName;$middleName;$prefix;$suffix"
     }
 
     private fun getPhoneNumberLabel(type: Int) = when (type) {
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 da2f57a3..ed998f9c 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt
@@ -31,7 +31,8 @@ class VcfImporter(val activity: SimpleActivity) {
     private var curEvents = ArrayList<Event>()
     private var curAddresses = ArrayList<Address>()
     private var curGroups = ArrayList<Group>()
-    private var curOrganization = Organization("", "")
+    private var curCompany = ""
+    private var curJobPosition = ""
 
     private var isGettingPhoto = false
     private var currentPhotoString = StringBuilder()
@@ -87,6 +88,8 @@ class VcfImporter(val activity: SimpleActivity) {
                         line.toUpperCase().startsWith(BDAY) -> addBirthday(line.substring(BDAY.length))
                         line.toUpperCase().startsWith(ANNIVERSARY) -> addAnniversary(line.substring(ANNIVERSARY.length))
                         line.toUpperCase().startsWith(PHOTO) -> addPhoto(line.substring(PHOTO.length))
+                        line.toUpperCase().startsWith(ORG) -> addCompany(line.substring(ORG.length))
+                        line.toUpperCase().startsWith(TITLE) -> addJobPosition(line.substring(TITLE.length))
                         line.toUpperCase() == END_VCARD -> saveContact(targetContactSource)
                         isGettingPhoto -> currentPhotoString.append(line.trim())
                     }
@@ -121,6 +124,8 @@ class VcfImporter(val activity: SimpleActivity) {
         curFirstName = if (currentNameIsANSI) QuotedPrintable.decode(nameParts[1]) else nameParts[1]
         if (nameParts.size > 2) {
             curMiddleName = if (currentNameIsANSI) QuotedPrintable.decode(nameParts[2]) else nameParts[2]
+            curPrefix = if (currentNameIsANSI) QuotedPrintable.decode(nameParts[3]) else nameParts[3]
+            curSuffix = if (currentNameIsANSI) QuotedPrintable.decode(nameParts[4]) else nameParts[4]
         }
     }
 
@@ -237,9 +242,18 @@ class VcfImporter(val activity: SimpleActivity) {
         isGettingNotes = true
     }
 
+    private fun addCompany(company: String) {
+        curCompany = company
+    }
+
+    private fun addJobPosition(jobPosition: String) {
+        curJobPosition = jobPosition
+    }
+
     private fun saveContact(source: String) {
+        val organization = Organization(curCompany, curJobPosition)
         val contact = Contact(0, curPrefix, curFirstName, curMiddleName, curSurname, curSuffix, curPhotoUri, curPhoneNumbers, curEmails, curAddresses, curEvents,
-                source, 0, 0, "", null, curNotes, curGroups, curOrganization)
+                source, 0, 0, "", null, curNotes, curGroups, organization)
         if (ContactsHelper(activity).insertContact(contact)) {
             contactsImported++
         }
@@ -258,7 +272,8 @@ class VcfImporter(val activity: SimpleActivity) {
         curEvents = ArrayList()
         curAddresses = ArrayList()
         curGroups = ArrayList()
-        curOrganization = Organization("", "")
+        curCompany = ""
+        curJobPosition = ""
 
         isGettingPhoto = false
         currentPhotoString = StringBuilder()

From 9089edf04c116f73198840f12d62883c87804897 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 12:12:30 +0200
Subject: [PATCH 29/61] avoid seeing duplicate import dialog at third party
 file opening

---
 .../com/simplemobiletools/contacts/activities/MainActivity.kt    | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
index 765163b2..a031c3f2 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
@@ -293,6 +293,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
 
         if (intent?.action == Intent.ACTION_VIEW && intent.data != null) {
             tryImportContactsFromFile(intent.data)
+            intent.data = null
         }
     }
 

From f25e953cd434a8d90843d990140acad3bbe65186 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 12:24:06 +0200
Subject: [PATCH 30/61] avoid fetching contacts multiple times at once

---
 .../contacts/activities/MainActivity.kt              | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
index a031c3f2..90144c75 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
@@ -39,6 +39,8 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
     private var isSearchOpen = false
     private var searchMenuItem: MenuItem? = null
     private var werePermissionsHandled = false
+    private var isFirstResume = true
+    private var isGettingContacts = false
 
     private var storedTextColor = 0
     private var storedBackgroundColor = 0
@@ -116,16 +118,18 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
             favorites_fragment?.startNameWithSurnameChanged(configStartNameWithSurname)
         }
 
-        if (werePermissionsHandled) {
+        if (werePermissionsHandled && !isFirstResume) {
             if (viewpager.adapter == null) {
                 initFragments()
+            } else {
+                refreshContacts(ALL_TABS_MASK)
             }
 
             getAllFragments().forEach {
                 it?.onActivityResume()
             }
-            refreshContacts(ALL_TABS_MASK)
         }
+        isFirstResume = false
     }
 
     override fun onPause() {
@@ -396,11 +400,13 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
     }
 
     override fun refreshContacts(refreshTabsMask: Int) {
-        if (isActivityDestroyed()) {
+        if (isActivityDestroyed() || isGettingContacts) {
             return
         }
 
+        isGettingContacts = true
         ContactsHelper(this).getContacts {
+            isGettingContacts = false
             if (isActivityDestroyed()) {
                 return@getContacts
             }

From 2d2a42d9bc3754d2cd5ed0124fdbc86f2ece288c Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 12:30:27 +0200
Subject: [PATCH 31/61] avoid creating gson tokens at every local contact

---
 .../simplemobiletools/contacts/helpers/DBHelper.kt   | 12 +++++++-----
 1 file changed, 7 insertions(+), 5 deletions(-)

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 897311dc..a13b7aeb 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
@@ -242,6 +242,13 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
         val contacts = ArrayList<Contact>()
         val projection = arrayOf(COL_ID, COL_PREFIX, COL_FIRST_NAME, COL_MIDDLE_NAME, COL_SURNAME, COL_SUFFIX, COL_PHONE_NUMBERS, COL_EMAILS,
                 COL_EVENTS, COL_STARRED, COL_PHOTO, COL_ADDRESSES, COL_NOTES, COL_GROUPS, COL_COMPANY, COL_JOB_POSITION)
+
+        val phoneNumbersToken = object : TypeToken<List<PhoneNumber>>() {}.type
+        val emailsToken = object : TypeToken<List<Email>>() {}.type
+        val addressesToken = object : TypeToken<List<Address>>() {}.type
+        val eventsToken = object : TypeToken<List<Event>>() {}.type
+        val groupIdsToken = object : TypeToken<List<Long>>() {}.type
+
         val cursor = mDb.query(CONTACTS_TABLE_NAME, projection, selection, selectionArgs, null, null, null)
         cursor.use {
             while (cursor.moveToNext()) {
@@ -253,19 +260,15 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
                 val suffix = cursor.getStringValue(COL_SUFFIX)
 
                 val phoneNumbersJson = cursor.getStringValue(COL_PHONE_NUMBERS)
-                val phoneNumbersToken = object : TypeToken<List<PhoneNumber>>() {}.type
                 val phoneNumbers = Gson().fromJson<ArrayList<PhoneNumber>>(phoneNumbersJson, phoneNumbersToken) ?: ArrayList(1)
 
                 val emailsJson = cursor.getStringValue(COL_EMAILS)
-                val emailsToken = object : TypeToken<List<Email>>() {}.type
                 val emails = Gson().fromJson<ArrayList<Email>>(emailsJson, emailsToken) ?: ArrayList(1)
 
                 val addressesJson = cursor.getStringValue(COL_ADDRESSES)
-                val addressesToken = object : TypeToken<List<Address>>() {}.type
                 val addresses = Gson().fromJson<ArrayList<Address>>(addressesJson, addressesToken) ?: ArrayList(1)
 
                 val eventsJson = cursor.getStringValue(COL_EVENTS)
-                val eventsToken = object : TypeToken<List<Event>>() {}.type
                 val events = Gson().fromJson<ArrayList<Event>>(eventsJson, eventsToken) ?: ArrayList(1)
 
                 val photoByteArray = cursor.getBlobValue(COL_PHOTO) ?: null
@@ -279,7 +282,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
                 val starred = cursor.getIntValue(COL_STARRED)
 
                 val groupIdsJson = cursor.getStringValue(COL_GROUPS)
-                val groupIdsToken = object : TypeToken<List<Long>>() {}.type
                 val groupIds = Gson().fromJson<ArrayList<Long>>(groupIdsJson, groupIdsToken) ?: ArrayList(1)
                 val groups = storedGroups.filter { groupIds.contains(it.id) } as ArrayList<Group>
 

From 37bfe592263107cf89e9d61005921d0a395d97a8 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 12:53:43 +0200
Subject: [PATCH 32/61] reuse the same gson instance in whole DBHelper

---
 .../contacts/helpers/DBHelper.kt              | 28 +++++++++++--------
 1 file changed, 17 insertions(+), 11 deletions(-)

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 a13b7aeb..f16e2952 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
@@ -50,6 +50,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
         private const val DB_VERSION = 4
         const val DB_NAME = "contacts.db"
         var dbInstance: DBHelper? = null
+        var gson = Gson()
 
         fun newInstance(context: Context): DBHelper {
             if (dbInstance == null)
@@ -124,13 +125,13 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
             put(COL_MIDDLE_NAME, contact.middleName)
             put(COL_SURNAME, contact.surname)
             put(COL_SUFFIX, contact.suffix)
-            put(COL_PHONE_NUMBERS, Gson().toJson(contact.phoneNumbers))
-            put(COL_EMAILS, Gson().toJson(contact.emails))
-            put(COL_ADDRESSES, Gson().toJson(contact.addresses))
-            put(COL_EVENTS, Gson().toJson(contact.events))
+            put(COL_PHONE_NUMBERS, gson.toJson(contact.phoneNumbers))
+            put(COL_EMAILS, gson.toJson(contact.emails))
+            put(COL_ADDRESSES, gson.toJson(contact.addresses))
+            put(COL_EVENTS, gson.toJson(contact.events))
             put(COL_STARRED, contact.starred)
             put(COL_NOTES, contact.notes)
-            put(COL_GROUPS, Gson().toJson(contact.groups.map { it.id }))
+            put(COL_GROUPS, gson.toJson(contact.groups.map { it.id }))
             put(COL_COMPANY, contact.organization.company)
             put(COL_JOB_POSITION, contact.organization.jobPosition)
 
@@ -233,7 +234,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
 
     private fun fillContactGroupValues(groupIds: ArrayList<Long>): ContentValues {
         return ContentValues().apply {
-            put(COL_GROUPS, Gson().toJson(groupIds))
+            put(COL_GROUPS, gson.toJson(groupIds))
         }
     }
 
@@ -260,16 +261,20 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
                 val suffix = cursor.getStringValue(COL_SUFFIX)
 
                 val phoneNumbersJson = cursor.getStringValue(COL_PHONE_NUMBERS)
-                val phoneNumbers = Gson().fromJson<ArrayList<PhoneNumber>>(phoneNumbersJson, phoneNumbersToken) ?: ArrayList(1)
+                val phoneNumbers = if (phoneNumbersJson == "[]") ArrayList() else gson.fromJson<ArrayList<PhoneNumber>>(phoneNumbersJson, phoneNumbersToken)
+                        ?: ArrayList(1)
 
                 val emailsJson = cursor.getStringValue(COL_EMAILS)
-                val emails = Gson().fromJson<ArrayList<Email>>(emailsJson, emailsToken) ?: ArrayList(1)
+                val emails = if (emailsJson == "[]") ArrayList() else gson.fromJson<ArrayList<Email>>(emailsJson, emailsToken)
+                        ?: ArrayList(1)
 
                 val addressesJson = cursor.getStringValue(COL_ADDRESSES)
-                val addresses = Gson().fromJson<ArrayList<Address>>(addressesJson, addressesToken) ?: ArrayList(1)
+                val addresses = if (addressesJson == "[]") ArrayList() else gson.fromJson<ArrayList<Address>>(addressesJson, addressesToken)
+                        ?: ArrayList(1)
 
                 val eventsJson = cursor.getStringValue(COL_EVENTS)
-                val events = Gson().fromJson<ArrayList<Event>>(eventsJson, eventsToken) ?: ArrayList(1)
+                val events = if (eventsJson == "[]") ArrayList() else gson.fromJson<ArrayList<Event>>(eventsJson, eventsToken)
+                        ?: ArrayList(1)
 
                 val photoByteArray = cursor.getBlobValue(COL_PHOTO) ?: null
                 val photo = if (photoByteArray?.isNotEmpty() == true) {
@@ -282,7 +287,8 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
                 val starred = cursor.getIntValue(COL_STARRED)
 
                 val groupIdsJson = cursor.getStringValue(COL_GROUPS)
-                val groupIds = Gson().fromJson<ArrayList<Long>>(groupIdsJson, groupIdsToken) ?: ArrayList(1)
+                val groupIds = if (groupIdsJson == "[]") ArrayList() else gson.fromJson<ArrayList<Long>>(groupIdsJson, groupIdsToken)
+                        ?: ArrayList(1)
                 val groups = storedGroups.filter { groupIds.contains(it.id) } as ArrayList<Group>
 
                 val company = cursor.getStringValue(COL_COMPANY)

From 4fde91ae47b8ddf1efe109d5561f50bcf09f7acf Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 13:03:56 +0200
Subject: [PATCH 33/61] limit batch group at adding/removing contacts from
 groups

---
 .../contacts/activities/GroupContactsActivity.kt   | 10 ++++++----
 .../contacts/helpers/ContactsHelper.kt             | 14 ++++++++++++--
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt
index 99c787b4..b32a0e1e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt
@@ -109,9 +109,11 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh
     }
 
     override fun removeFromGroup(contacts: ArrayList<Contact>) {
-        removeContactsFromGroup(contacts, group.id)
-        if (groupContacts.size == 0) {
-            refreshContacts()
-        }
+        Thread {
+            removeContactsFromGroup(contacts, group.id)
+            if (groupContacts.size == 0) {
+                refreshContacts()
+            }
+        }.start()
     }
 }
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 410cf2d5..c7130a79 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
@@ -24,6 +24,7 @@ import com.simplemobiletools.contacts.extensions.*
 import com.simplemobiletools.contacts.models.*
 
 class ContactsHelper(val activity: BaseSimpleActivity) {
+    private val BATCH_SIZE = 100
     fun getContacts(callback: (ArrayList<Contact>) -> Unit) {
         Thread {
             val contacts = SparseArray<Contact>()
@@ -886,6 +887,11 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                 withValue(CommonDataKinds.GroupMembership.GROUP_ROW_ID, groupId)
                 operations.add(build())
             }
+
+            if (operations.size % BATCH_SIZE == 0) {
+                activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
+                operations.clear()
+            }
         }
         activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
     }
@@ -899,6 +905,11 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                 withSelection(selection, selectionArgs)
                 operations.add(build())
             }
+
+            if (operations.size % BATCH_SIZE == 0) {
+                activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
+                operations.clear()
+            }
         }
         activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
     }
@@ -1117,7 +1128,6 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
     }
 
     private fun toggleFavorites(contacts: ArrayList<Contact>, addToFavorites: Boolean) {
-        val applyBatchSize = 100
         try {
             val operations = ArrayList<ContentProviderOperation>()
             contacts.filter { it.source != SMT_PRIVATE }.map { it.contactId.toString() }.forEach {
@@ -1127,7 +1137,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                     operations.add(build())
                 }
 
-                if (operations.size % applyBatchSize == 0) {
+                if (operations.size % BATCH_SIZE == 0) {
                     activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
                     operations.clear()
                 }

From 2c7f65119183f9b6521995ead60656e0a1989750 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 13:59:19 +0200
Subject: [PATCH 34/61] fix sorting in case of same first name

---
 .../contacts/adapters/ContactsAdapter.kt      |  2 +-
 .../adapters/SelectContactsAdapter.kt         |  7 +--
 .../contacts/fragments/MyViewPagerFragment.kt |  5 +-
 .../contacts/models/Contact.kt                | 57 ++++++++++++-------
 4 files changed, 43 insertions(+), 28 deletions(-)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt
index 8273860d..dd783836 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt
@@ -236,7 +236,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
 
     private fun setupView(view: View, contact: Contact) {
         view.apply {
-            contact_name.text = contact.getFullName(startNameWithSurname)
+            contact_name.text = contact.getFullName()
             contact_name.setTextColor(textColor)
             contact_name.setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0)
 
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/SelectContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/SelectContactsAdapter.kt
index 4e118f24..59471c1b 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/SelectContactsAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/SelectContactsAdapter.kt
@@ -30,7 +30,6 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
     private val config = activity.config
     private val textColor = config.textColor
     private val contactDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.ic_person, textColor)
-    private val startNameWithSurname = config.startNameWithSurname
     private val showContactThumbnails = config.showContactThumbnails
     private val itemLayout = if (config.showPhoneNumbers) R.layout.item_add_favorite_with_number else R.layout.item_add_favorite_without_number
 
@@ -80,7 +79,7 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
 
     override fun onBindViewHolder(holder: ViewHolder, position: Int) {
         val eventType = contacts[position]
-        itemViews.put(position, holder.bindView(eventType, startNameWithSurname, contactDrawable, config, showContactThumbnails, smallPadding, bigPadding))
+        itemViews.put(position, holder.bindView(eventType, contactDrawable, config, showContactThumbnails, smallPadding, bigPadding))
         toggleItemSelection(selectedPositions.contains(position), position)
     }
 
@@ -88,14 +87,14 @@ class SelectContactsAdapter(val activity: SimpleActivity, val contacts: List<Con
 
     class ViewHolder(view: View, private val adapterListener: MyAdapterListener, val activity: SimpleActivity, private val showCheckbox: Boolean,
                      private val itemClick: ((Contact) -> Unit)?) : RecyclerView.ViewHolder(view) {
-        fun bindView(contact: Contact, startNameWithSurname: Boolean, contactDrawable: Drawable, config: Config, showContactThumbnails: Boolean,
+        fun bindView(contact: Contact, contactDrawable: Drawable, config: Config, showContactThumbnails: Boolean,
                      smallPadding: Int, bigPadding: Int): View {
             itemView.apply {
                 contact_checkbox.beVisibleIf(showCheckbox)
                 contact_checkbox.setColors(config.textColor, context.getAdjustedPrimaryColor(), config.backgroundColor)
                 val textColor = config.textColor
 
-                contact_name.text = contact.getFullName(startNameWithSurname)
+                contact_name.text = contact.getFullName()
                 contact_name.setTextColor(textColor)
                 contact_name.setPadding(if (showContactThumbnails) smallPadding else bigPadding, smallPadding, smallPadding, 0)
 
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
index 51803ece..ff5b07aa 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
@@ -233,7 +233,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
     fun onSearchQueryChanged(text: String) {
         (fragment_list.adapter as? ContactsAdapter)?.apply {
             val filtered = contactsIgnoringSearch.filter {
-                it.getFullName(startNameWithSurname).contains(text, true) ||
+                it.getFullName().contains(text, true) ||
                         it.phoneNumbers.any { it.value.contains(text, true) } ||
                         it.emails.any { it.value.contains(text, true) } ||
                         it.addresses.any { it.value.contains(text, true) } ||
@@ -243,8 +243,9 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
             } as ArrayList
 
             Contact.sorting = config.sorting
+            Contact.startWithSurname = config.startNameWithSurname
             filtered.sort()
-            filtered.sortBy { !it.getFullName(startNameWithSurname).startsWith(text, true) }
+            filtered.sortBy { !it.getFullName().startsWith(text, true) }
 
             if (filtered.isEmpty() && this@MyViewPagerFragment is FavoritesFragment) {
                 fragment_placeholder.text = activity.getString(R.string.no_items_found)
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 58fd2f10..47f8800c 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
@@ -11,13 +11,44 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
                    var groups: ArrayList<Group>, var organization: Organization) : Comparable<Contact> {
     companion object {
         var sorting = 0
+        var startWithSurname = false
     }
 
     override fun compareTo(other: Contact): Int {
-        var result = when {
-            sorting and SORT_BY_FIRST_NAME != 0 -> compareStrings(firstName, other.firstName)
-            sorting and SORT_BY_MIDDLE_NAME != 0 -> compareStrings(middleName, other.middleName)
-            else -> compareStrings(surname, other.surname)
+        val firstString: String
+        val secondString: String
+
+        when {
+            sorting and SORT_BY_FIRST_NAME != 0 -> {
+                firstString = firstName
+                secondString = other.firstName
+            }
+            sorting and SORT_BY_MIDDLE_NAME != 0 -> {
+                firstString = middleName
+                secondString = other.middleName
+            }
+            else -> {
+                firstString = surname
+                secondString = other.surname
+            }
+        }
+
+        var result = if (firstString.firstOrNull()?.isLetter() == true && secondString.firstOrNull()?.isLetter() == false) {
+            -1
+        } else if (firstString.firstOrNull()?.isLetter() == false && secondString.firstOrNull()?.isLetter() == true) {
+            1
+        } else {
+            if (firstString.isEmpty() && secondString.isNotEmpty()) {
+                1
+            } else if (firstString.isNotEmpty() && secondString.isEmpty()) {
+                -1
+            } else {
+                if (firstString.toLowerCase() == secondString.toLowerCase()) {
+                    getFullName().compareTo(other.getFullName())
+                } else {
+                    firstString.toLowerCase().compareTo(secondString.toLowerCase())
+                }
+            }
         }
 
         if (sorting and SORT_DESCENDING != 0) {
@@ -33,7 +64,7 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
         else -> surname
     }
 
-    fun getFullName(startWithSurname: Boolean): String {
+    fun getFullName(): String {
         var firstPart = if (startWithSurname) surname else firstName
         if (middleName.isNotEmpty()) {
             firstPart += " $middleName"
@@ -43,20 +74,4 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
         val suffixComma = if (suffix.isEmpty()) "" else ", $suffix"
         return "$prefix $firstPart $lastPart$suffixComma".trim()
     }
-
-    private fun compareStrings(first: String, second: String): Int {
-        return if (first.firstOrNull()?.isLetter() == true && second.firstOrNull()?.isLetter() == false) {
-            -1
-        } else if (first.firstOrNull()?.isLetter() == false && second.firstOrNull()?.isLetter() == true) {
-            1
-        } else {
-            if (first.isEmpty() && second.isNotEmpty()) {
-                1
-            } else if (first.isNotEmpty() && second.isEmpty()) {
-                -1
-            } else {
-                first.toLowerCase().compareTo(second.toLowerCase())
-            }
-        }
-    }
 }

From c86bdd379f78c9e0998f2f69cba02f5db338ddef Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 14:23:57 +0200
Subject: [PATCH 35/61] add some initial things related to filtering what
 fields should be visible

---
 .../contacts/activities/SettingsActivity.kt   |  7 ++++++
 .../contacts/helpers/Config.kt                |  5 +++++
 .../contacts/helpers/Constants.kt             | 16 ++++++++++++++
 app/src/main/res/layout/activity_settings.xml | 22 +++++++++++++++++++
 4 files changed, 50 insertions(+)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SettingsActivity.kt
index eb41f275..da1f8720 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SettingsActivity.kt
@@ -23,6 +23,7 @@ class SettingsActivity : SimpleActivity() {
         super.onResume()
 
         setupCustomizeColors()
+        setupManageShownContactFields()
         setupUseEnglish()
         setupAvoidWhatsNew()
         setupShowInfoBubble()
@@ -39,6 +40,12 @@ class SettingsActivity : SimpleActivity() {
         }
     }
 
+    private fun setupManageShownContactFields() {
+        settings_manage_contact_fields_holder.setOnClickListener {
+
+        }
+    }
+
     private fun setupUseEnglish() {
         settings_use_english_holder.beVisibleIf(config.wasUseEnglishToggled || Locale.getDefault().language != "en")
         settings_use_english.isChecked = config.useEnglish
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Config.kt
index 81c3bf65..ec516108 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Config.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Config.kt
@@ -41,4 +41,9 @@ class Config(context: Context) : BaseConfig(context) {
     var onContactClick: Int
         get() = prefs.getInt(ON_CONTACT_CLICK, ON_CLICK_VIEW_CONTACT)
         set(onContactClick) = prefs.edit().putInt(ON_CONTACT_CLICK, onContactClick).apply()
+
+    var showContactFields: Int
+        get() = prefs.getInt(SHOW_CONTACT_FIELDS, SHOW_FIRST_NAME_FIELD or SHOW_SURNAME_FIELD or SHOW_PHONE_NUMBERS_FIELD or SHOW_EMAILS_FIELD or
+                SHOW_ADDRESSES_FIELD or SHOW_EVENTS_FIELD or SHOW_NOTES_FIELD or SHOW_GROUPS_FIELD or SHOW_CONTACT_SOURCE_FIELD)
+        set(showContactFields) = prefs.edit().putInt(SHOW_CONTACT_FIELDS, showContactFields).apply()
 }
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 38f51d63..11084ef4 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt
@@ -9,6 +9,7 @@ const val LAST_USED_CONTACT_SOURCE = "last_used_contact_source"
 const val LOCAL_ACCOUNT_NAME = "local_account_name"
 const val LOCAL_ACCOUNT_TYPE = "local_account_type"
 const val ON_CONTACT_CLICK = "on_contact_click"
+const val SHOW_CONTACT_FIELDS = "show_contact_fields"
 
 const val CONTACT_ID = "contact_id"
 const val SMT_PRIVATE = "smt_private"   // used at the contact source of local contacts hidden from other apps
@@ -66,3 +67,18 @@ const val VOICE = "VOICE"
 const val ON_CLICK_CALL_CONTACT = 1
 const val ON_CLICK_VIEW_CONTACT = 2
 const val ON_CLICK_EDIT_CONTACT = 3
+
+// visible fields filtering
+const val SHOW_PREFIX_FIELD = 1
+const val SHOW_FIRST_NAME_FIELD = 2
+const val SHOW_MIDDLE_NAME_FIELD = 4
+const val SHOW_SURNAME_FIELD = 8
+const val SHOW_SUFFIX_FIELD = 16
+const val SHOW_PHONE_NUMBERS_FIELD = 32
+const val SHOW_EMAILS_FIELD = 64
+const val SHOW_ADDRESSES_FIELD = 128
+const val SHOW_EVENTS_FIELD = 256
+const val SHOW_NOTES_FIELD = 512
+const val SHOW_ORGANIZATION_FIELD = 1024
+const val SHOW_GROUPS_FIELD = 2048
+const val SHOW_CONTACT_SOURCE_FIELD = 4096
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
index 35f4ccf3..d1fedd67 100644
--- a/app/src/main/res/layout/activity_settings.xml
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -33,6 +33,28 @@
 
         </RelativeLayout>
 
+        <RelativeLayout
+            android:id="@+id/settings_manage_contact_fields_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_manage_contact_fields"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/manage_shown_contact_fields"/>
+
+        </RelativeLayout>
+
         <RelativeLayout
             android:id="@+id/settings_use_english_holder"
             android:layout_width="match_parent"

From acd3f9f9d995307b2a93af1ce0e4b39e4836af79 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 15:06:21 +0200
Subject: [PATCH 36/61] creating the dialog for managing visible contact fields

---
 .../contacts/activities/SettingsActivity.kt   |   3 +-
 .../dialogs/ManageVisibleFieldsDialog.kt      |  55 ++++++++
 .../layout/dialog_manage_visible_fields.xml   | 122 ++++++++++++++++++
 3 files changed, 179 insertions(+), 1 deletion(-)
 create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt
 create mode 100644 app/src/main/res/layout/dialog_manage_visible_fields.xml

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SettingsActivity.kt
index da1f8720..9b76f9eb 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SettingsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SettingsActivity.kt
@@ -6,6 +6,7 @@ import com.simplemobiletools.commons.extensions.beVisibleIf
 import com.simplemobiletools.commons.extensions.updateTextColors
 import com.simplemobiletools.commons.models.RadioItem
 import com.simplemobiletools.contacts.R
+import com.simplemobiletools.contacts.dialogs.ManageVisibleFieldsDialog
 import com.simplemobiletools.contacts.extensions.config
 import com.simplemobiletools.contacts.helpers.ON_CLICK_CALL_CONTACT
 import com.simplemobiletools.contacts.helpers.ON_CLICK_EDIT_CONTACT
@@ -42,7 +43,7 @@ class SettingsActivity : SimpleActivity() {
 
     private fun setupManageShownContactFields() {
         settings_manage_contact_fields_holder.setOnClickListener {
-
+            ManageVisibleFieldsDialog(this)
         }
     }
 
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt
new file mode 100644
index 00000000..ff406346
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt
@@ -0,0 +1,55 @@
+package com.simplemobiletools.contacts.dialogs
+
+import android.support.v7.app.AlertDialog
+import com.simplemobiletools.commons.activities.BaseSimpleActivity
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.commons.views.MyAppCompatCheckbox
+import com.simplemobiletools.contacts.R
+import com.simplemobiletools.contacts.extensions.config
+import com.simplemobiletools.contacts.helpers.*
+
+class ManageVisibleFieldsDialog(val activity: BaseSimpleActivity) {
+    private var view = activity.layoutInflater.inflate(R.layout.dialog_manage_visible_fields, null)
+    private val fields = LinkedHashMap<Int, Int>()
+
+    init {
+        fields.apply {
+            put(SHOW_PREFIX_FIELD, R.id.manage_visible_fields_prefix)
+            put(SHOW_FIRST_NAME_FIELD, R.id.manage_visible_fields_first_name)
+            put(SHOW_MIDDLE_NAME_FIELD, R.id.manage_visible_fields_middle_name)
+            put(SHOW_SURNAME_FIELD, R.id.manage_visible_fields_surname)
+            put(SHOW_SUFFIX_FIELD, R.id.manage_visible_fields_suffix)
+            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_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)
+            put(SHOW_GROUPS_FIELD, R.id.manage_visible_fields_groups)
+            put(SHOW_CONTACT_SOURCE_FIELD, R.id.manage_visible_fields_contact_source)
+        }
+
+        val showContactFields = activity.config.showContactFields
+        for ((key, value) in fields) {
+            view.findViewById<MyAppCompatCheckbox>(value).isChecked = showContactFields and key != 0
+        }
+
+        AlertDialog.Builder(activity)
+                .setPositiveButton(R.string.ok, { dialog, which -> dialogConfirmed() })
+                .setNegativeButton(R.string.cancel, null)
+                .create().apply {
+                    activity.setupDialogStuff(view, this)
+                }
+    }
+
+    private fun dialogConfirmed() {
+        var result = 0
+        for ((key, value) in fields) {
+            if (view.findViewById<MyAppCompatCheckbox>(value).isChecked) {
+                result += key
+            }
+        }
+
+        activity.config.showContactFields = result
+    }
+}
diff --git a/app/src/main/res/layout/dialog_manage_visible_fields.xml b/app/src/main/res/layout/dialog_manage_visible_fields.xml
new file mode 100644
index 00000000..718f2f5e
--- /dev/null
+++ b/app/src/main/res/layout/dialog_manage_visible_fields.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/manage_visible_fields_scroll_view"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <LinearLayout
+        android:id="@+id/manage_visible_fields_holder"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:paddingTop="@dimen/activity_margin">
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_prefix"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/prefix"/>
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_first_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/first_name"/>
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_middle_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/middle_name"/>
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_surname"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/surname"/>
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_suffix"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/suffix"/>
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_phone_numbers"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/phone_numbers"/>
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_emails"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/emails"/>
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_addresses"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/addresses"/>
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_events"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/events"/>
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_notes"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/notes"/>
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_organization"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/organization"/>
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_groups"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/groups"/>
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_contact_source"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/contact_source"/>
+
+    </LinearLayout>
+</ScrollView>

From cfcaa67ba9873223335189d3874419acad8402f0 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 15:32:12 +0200
Subject: [PATCH 37/61] remove the top margin of first_name at edit_contact
 activity

---
 app/src/main/res/layout/activity_edit_contact.xml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml
index 7b70f9be..f8bf663a 100644
--- a/app/src/main/res/layout/activity_edit_contact.xml
+++ b/app/src/main/res/layout/activity_edit_contact.xml
@@ -96,7 +96,6 @@
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_photo"
             android:layout_centerVertical="true"
-            android:layout_marginTop="@dimen/normal_margin"
             android:layout_toRightOf="@+id/contact_name_image"
             android:hint="@string/prefix"
             android:inputType="textCapWords"

From d94dbde48edf2524d39fe8e377b40fe66152da17 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 16:07:46 +0200
Subject: [PATCH 38/61] make sure View Contact Details shows only the proper
 fields

---
 .../contacts/activities/ContactActivity.kt    |   5 +-
 .../activities/EditContactActivity.kt         |   1 +
 .../activities/ViewContactActivity.kt         | 177 +++++++++++-------
 3 files changed, 112 insertions(+), 71 deletions(-)

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 0ef88394..da49b099 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt
@@ -33,8 +33,9 @@ import java.text.SimpleDateFormat
 import java.util.*
 
 abstract class ContactActivity : SimpleActivity() {
-    var contact: Contact? = null
-    var currentContactPhotoPath = ""
+    protected var contact: Contact? = null
+    protected var currentContactPhotoPath = ""
+    protected var showFields = 0
 
     fun showPhotoPlaceholder(photoView: ImageView) {
         val placeholder = resources.getColoredBitmap(R.drawable.ic_person, config.primaryColor.getContrastColor())
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 e0a9d5d5..ffd03a4d 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -59,6 +59,7 @@ class EditContactActivity : ContactActivity() {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_edit_contact)
         supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_cross)
+        showFields = config.showContactFields
 
         val action = intent.action
         isThirdPartyIntent = action == Intent.ACTION_EDIT || action == Intent.ACTION_INSERT_OR_EDIT || action == Intent.ACTION_INSERT
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 41edf52d..9877d1c7 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
@@ -12,9 +12,7 @@ import com.simplemobiletools.commons.extensions.*
 import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
 import com.simplemobiletools.contacts.R
 import com.simplemobiletools.contacts.extensions.*
-import com.simplemobiletools.contacts.helpers.CONTACT_ID
-import com.simplemobiletools.contacts.helpers.ContactsHelper
-import com.simplemobiletools.contacts.helpers.IS_PRIVATE
+import com.simplemobiletools.contacts.helpers.*
 import kotlinx.android.synthetic.main.activity_view_contact.*
 import kotlinx.android.synthetic.main.item_event.view.*
 import kotlinx.android.synthetic.main.item_view_address.view.*
@@ -24,9 +22,11 @@ import kotlinx.android.synthetic.main.item_view_phone_number.view.*
 
 class ViewContactActivity : ContactActivity() {
     private var isViewIntent = false
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_view_contact)
+        showFields = config.showContactFields
     }
 
     override fun onResume() {
@@ -138,25 +138,33 @@ class ViewContactActivity : ContactActivity() {
         window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
         contact!!.apply {
             contact_prefix.text = prefix
-            contact_prefix.beVisibleIf(prefix.isNotEmpty())
+            contact_prefix.beVisibleIf(prefix.isNotEmpty() && showFields and SHOW_PREFIX_FIELD != 0)
 
             contact_first_name.text = firstName
-            contact_first_name.beVisibleIf(firstName.isNotEmpty())
+            contact_first_name.beVisibleIf(firstName.isNotEmpty() && showFields and SHOW_FIRST_NAME_FIELD != 0)
 
             contact_middle_name.text = middleName
-            contact_middle_name.beVisibleIf(middleName.isNotEmpty())
+            contact_middle_name.beVisibleIf(middleName.isNotEmpty() && showFields and SHOW_MIDDLE_NAME_FIELD != 0)
 
             contact_surname.text = surname
-            contact_surname.beVisibleIf(surname.isNotEmpty())
+            contact_surname.beVisibleIf(surname.isNotEmpty() && showFields and SHOW_SURNAME_FIELD != 0)
 
             contact_suffix.text = suffix
-            contact_suffix.beVisibleIf(suffix.isNotEmpty())
+            contact_suffix.beVisibleIf(suffix.isNotEmpty() && showFields and SHOW_SUFFIX_FIELD != 0)
 
-            if (prefix.isEmpty() && firstName.isEmpty() && middleName.isEmpty() && surname.isEmpty() && suffix.isEmpty()) {
+            if (contact_prefix.isGone() && contact_first_name.isGone() && contact_middle_name.isGone() && contact_surname.isGone() && contact_suffix.isGone()) {
                 contact_name_image.beInvisible()
                 (contact_photo.layoutParams as RelativeLayout.LayoutParams).bottomMargin = resources.getDimension(R.dimen.medium_margin).toInt()
             }
-            contact_source.text = getPublicContactSource(source)
+
+            if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) {
+                contact_source.text = getPublicContactSource(source)
+                contact_source_image.beVisible()
+                contact_source.beVisible()
+            } else {
+                contact_source_image.beGone()
+                contact_source.beGone()
+            }
         }
 
         contact_toggle_favorite.apply {
@@ -178,109 +186,140 @@ class ViewContactActivity : ContactActivity() {
     private fun setupPhoneNumbers() {
         contact_numbers_holder.removeAllViews()
         val phoneNumbers = contact!!.phoneNumbers
-        phoneNumbers.forEach {
-            layoutInflater.inflate(R.layout.item_view_phone_number, contact_numbers_holder, false).apply {
-                val phoneNumber = it
-                contact_numbers_holder.addView(this)
-                contact_number.text = phoneNumber.value
-                contact_number_type.setText(getPhoneNumberTextId(phoneNumber.type))
+        if (phoneNumbers.isNotEmpty() && showFields and SHOW_PHONE_NUMBERS_FIELD != 0) {
+            phoneNumbers.forEach {
+                layoutInflater.inflate(R.layout.item_view_phone_number, contact_numbers_holder, false).apply {
+                    val phoneNumber = it
+                    contact_numbers_holder.addView(this)
+                    contact_number.text = phoneNumber.value
+                    contact_number_type.setText(getPhoneNumberTextId(phoneNumber.type))
 
-                setOnClickListener {
-                    startCallIntent(phoneNumber.value)
+                    setOnClickListener {
+                        startCallIntent(phoneNumber.value)
+                    }
                 }
             }
+            contact_number_image.beVisible()
+            contact_numbers_holder.beVisible()
+        } else {
+            contact_number_image.beGone()
+            contact_numbers_holder.beGone()
         }
-
-        contact_number_image.beVisibleIf(phoneNumbers.isNotEmpty())
-        contact_numbers_holder.beVisibleIf(phoneNumbers.isNotEmpty())
     }
 
     private fun setupEmails() {
         contact_emails_holder.removeAllViews()
         val emails = contact!!.emails
-        emails.forEach {
-            layoutInflater.inflate(R.layout.item_view_email, contact_emails_holder, false).apply {
-                val email = it
-                contact_emails_holder.addView(this)
-                contact_email.text = email.value
-                contact_email_type.setText(getEmailTextId(email.type))
+        if (emails.isNotEmpty() && showFields and SHOW_EMAILS_FIELD != 0) {
+            emails.forEach {
+                layoutInflater.inflate(R.layout.item_view_email, contact_emails_holder, false).apply {
+                    val email = it
+                    contact_emails_holder.addView(this)
+                    contact_email.text = email.value
+                    contact_email_type.setText(getEmailTextId(email.type))
 
-                setOnClickListener {
-                    sendEmailIntent(email.value)
+                    setOnClickListener {
+                        sendEmailIntent(email.value)
+                    }
                 }
             }
+            contact_email_image.beVisible()
+            contact_emails_holder.beVisible()
+        } else {
+            contact_email_image.beGone()
+            contact_emails_holder.beGone()
         }
-
-        contact_email_image.beVisibleIf(emails.isNotEmpty())
-        contact_emails_holder.beVisibleIf(emails.isNotEmpty())
     }
 
     private fun setupAddresses() {
         contact_addresses_holder.removeAllViews()
         val addresses = contact!!.addresses
-        addresses.forEach {
-            layoutInflater.inflate(R.layout.item_view_address, contact_addresses_holder, false).apply {
-                val address = it
-                contact_addresses_holder.addView(this)
-                contact_address.text = address.value
-                contact_address_type.setText(getAddressTextId(address.type))
+        if (addresses.isNotEmpty() && showFields and SHOW_ADDRESSES_FIELD != 0) {
+            addresses.forEach {
+                layoutInflater.inflate(R.layout.item_view_address, contact_addresses_holder, false).apply {
+                    val address = it
+                    contact_addresses_holder.addView(this)
+                    contact_address.text = address.value
+                    contact_address_type.setText(getAddressTextId(address.type))
 
-                setOnClickListener {
-                    sendAddressIntent(address.value)
+                    setOnClickListener {
+                        sendAddressIntent(address.value)
+                    }
                 }
             }
+            contact_address_image.beVisible()
+            contact_addresses_holder.beVisible()
+        } else {
+            contact_address_image.beGone()
+            contact_addresses_holder.beGone()
         }
-
-        contact_address_image.beVisibleIf(addresses.isNotEmpty())
-        contact_addresses_holder.beVisibleIf(addresses.isNotEmpty())
     }
 
     private fun setupEvents() {
         contact_events_holder.removeAllViews()
         val events = contact!!.events
-        events.forEach {
-            layoutInflater.inflate(R.layout.item_event, contact_events_holder, false).apply {
-                contact_events_holder.addView(this)
-                contact_event.alpha = 1f
-                getDateTime(it.value, contact_event)
-                contact_event_type.setText(getEventTextId(it.type))
-                contact_event_remove.beGone()
+        if (events.isNotEmpty() && showFields and SHOW_EVENTS_FIELD != 0) {
+            events.forEach {
+                layoutInflater.inflate(R.layout.item_event, contact_events_holder, false).apply {
+                    contact_events_holder.addView(this)
+                    contact_event.alpha = 1f
+                    getDateTime(it.value, contact_event)
+                    contact_event_type.setText(getEventTextId(it.type))
+                    contact_event_remove.beGone()
+                }
             }
+            contact_event_image.beVisible()
+            contact_events_holder.beVisible()
+        } else {
+            contact_event_image.beGone()
+            contact_events_holder.beGone()
         }
-
-        contact_event_image.beVisibleIf(events.isNotEmpty())
-        contact_events_holder.beVisibleIf(events.isNotEmpty())
     }
 
     private fun setupNotes() {
         val notes = contact!!.notes
-        contact_notes.text = notes
-        contact_notes_image.beVisibleIf(notes.isNotEmpty())
-        contact_notes.beVisibleIf(notes.isNotEmpty())
+        if (notes.isNotEmpty() && showFields and SHOW_NOTES_FIELD != 0) {
+            contact_notes.text = notes
+            contact_notes_image.beVisible()
+            contact_notes.beVisible()
+        } else {
+            contact_notes_image.beGone()
+            contact_notes.beGone()
+        }
     }
 
     private fun setupOrganization() {
         val organization = contact!!.organization
-        contact_organization_company.text = organization.company
-        contact_organization_job_position.text = organization.jobPosition
-        contact_organization_image.beGoneIf(organization.isEmpty())
-        contact_organization_company.beGoneIf(organization.company.isEmpty())
-        contact_organization_job_position.beGoneIf(organization.jobPosition.isEmpty())
+        if (!organization.isEmpty() && showFields and SHOW_ORGANIZATION_FIELD != 0) {
+            contact_organization_company.text = organization.company
+            contact_organization_job_position.text = organization.jobPosition
+            contact_organization_image.beGoneIf(organization.isEmpty())
+            contact_organization_company.beGoneIf(organization.company.isEmpty())
+            contact_organization_job_position.beGoneIf(organization.jobPosition.isEmpty())
+        } else {
+            contact_organization_image.beGone()
+            contact_organization_company.beGone()
+            contact_organization_job_position.beGone()
+        }
     }
 
     private fun setupGroups() {
         contact_groups_holder.removeAllViews()
         val groups = contact!!.groups
-        groups.forEach {
-            layoutInflater.inflate(R.layout.item_view_group, contact_groups_holder, false).apply {
-                val group = it
-                contact_groups_holder.addView(this)
-                contact_group.text = group.title
+        if (groups.isNotEmpty() && showFields and SHOW_GROUPS_FIELD != 0) {
+            groups.forEach {
+                layoutInflater.inflate(R.layout.item_view_group, contact_groups_holder, false).apply {
+                    val group = it
+                    contact_groups_holder.addView(this)
+                    contact_group.text = group.title
+                }
             }
+            contact_groups_image.beVisible()
+            contact_groups_holder.beVisible()
+        } else {
+            contact_groups_image.beGone()
+            contact_groups_holder.beGone()
         }
-
-        contact_groups_image.beVisibleIf(groups.isNotEmpty())
-        contact_groups_holder.beVisibleIf(groups.isNotEmpty())
     }
 
     private fun getStarDrawable(on: Boolean) = resources.getDrawable(if (on) R.drawable.ic_star_on_big else R.drawable.ic_star_off_big)

From 510da6b140afad83f5b59ea8730c83411ee8088f Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 17:44:23 +0200
Subject: [PATCH 39/61] make sure only the proper fields are shown at Edit
 Contact screen

---
 .../activities/EditContactActivity.kt         | 268 +++++++++++-------
 .../activities/ViewContactActivity.kt         |  22 +-
 .../main/res/layout/activity_edit_contact.xml |  40 +--
 .../main/res/layout/activity_view_contact.xml |  10 +-
 4 files changed, 203 insertions(+), 137 deletions(-)

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 ffd03a4d..b709f418 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -170,24 +170,24 @@ class EditContactActivity : ContactActivity() {
         contact_start_call.applyColorFilter(textColor)
         contact_send_email.applyColorFilter(textColor)
         contact_name_image.applyColorFilter(textColor)
-        contact_number_image.applyColorFilter(textColor)
-        contact_email_image.applyColorFilter(textColor)
-        contact_address_image.applyColorFilter(textColor)
-        contact_event_image.applyColorFilter(textColor)
+        contact_numbers_image.applyColorFilter(textColor)
+        contact_emails_image.applyColorFilter(textColor)
+        contact_addresses_image.applyColorFilter(textColor)
+        contact_events_image.applyColorFilter(textColor)
         contact_notes_image.applyColorFilter(textColor)
         contact_source_image.applyColorFilter(textColor)
         contact_groups_image.applyColorFilter(textColor)
         contact_organization_image.applyColorFilter(textColor)
 
         val adjustedPrimaryColor = getAdjustedPrimaryColor()
-        contact_number_add_new.applyColorFilter(adjustedPrimaryColor)
-        contact_number_add_new.background.applyColorFilter(textColor)
-        contact_email_add_new.applyColorFilter(adjustedPrimaryColor)
-        contact_email_add_new.background.applyColorFilter(textColor)
-        contact_address_add_new.applyColorFilter(adjustedPrimaryColor)
-        contact_address_add_new.background.applyColorFilter(textColor)
-        contact_event_add_new.applyColorFilter(adjustedPrimaryColor)
-        contact_event_add_new.background.applyColorFilter(textColor)
+        contact_numbers_add_new.applyColorFilter(adjustedPrimaryColor)
+        contact_numbers_add_new.background.applyColorFilter(textColor)
+        contact_emails_add_new.applyColorFilter(adjustedPrimaryColor)
+        contact_emails_add_new.background.applyColorFilter(textColor)
+        contact_addresses_add_new.applyColorFilter(adjustedPrimaryColor)
+        contact_addresses_add_new.background.applyColorFilter(textColor)
+        contact_events_add_new.applyColorFilter(adjustedPrimaryColor)
+        contact_events_add_new.background.applyColorFilter(textColor)
         contact_groups_add_new.applyColorFilter(adjustedPrimaryColor)
         contact_groups_add_new.background.applyColorFilter(textColor)
 
@@ -196,12 +196,14 @@ class EditContactActivity : ContactActivity() {
         contact_send_sms.setOnClickListener { trySendSMS() }
         contact_start_call.setOnClickListener { tryStartCall(contact!!) }
         contact_send_email.setOnClickListener { trySendEmail() }
-        contact_number_add_new.setOnClickListener { addNewPhoneNumberField() }
-        contact_email_add_new.setOnClickListener { addNewEmailField() }
-        contact_address_add_new.setOnClickListener { addNewAddressField() }
-        contact_event_add_new.setOnClickListener { addNewEventField() }
+        contact_numbers_add_new.setOnClickListener { addNewPhoneNumberField() }
+        contact_emails_add_new.setOnClickListener { addNewEmailField() }
+        contact_addresses_add_new.setOnClickListener { addNewAddressField() }
+        contact_events_add_new.setOnClickListener { addNewEventField() }
         contact_groups_add_new.setOnClickListener { showSelectGroupsDialog() }
 
+        setupFieldVisibility()
+
         contact_toggle_favorite.apply {
             setImageDrawable(getStarDrawable(contact!!.starred == 1))
             tag = contact!!.starred
@@ -240,6 +242,55 @@ class EditContactActivity : ContactActivity() {
         }
     }
 
+    private fun setupFieldVisibility() {
+        if (showFields and (SHOW_PREFIX_FIELD or SHOW_FIRST_NAME_FIELD or SHOW_MIDDLE_NAME_FIELD or SHOW_SURNAME_FIELD or SHOW_SUFFIX_FIELD) == 0) {
+            contact_name_image.beInvisible()
+        }
+
+        contact_prefix.beVisibleIf(showFields and SHOW_PREFIX_FIELD != 0)
+        contact_first_name.beVisibleIf(showFields and SHOW_FIRST_NAME_FIELD != 0)
+        contact_middle_name.beVisibleIf(showFields and SHOW_MIDDLE_NAME_FIELD != 0)
+        contact_surname.beVisibleIf(showFields and SHOW_SURNAME_FIELD != 0)
+        contact_suffix.beVisibleIf(showFields and SHOW_SUFFIX_FIELD != 0)
+
+        contact_source.beVisibleIf(showFields and SHOW_CONTACT_SOURCE_FIELD != 0)
+        contact_source_image.beVisibleIf(showFields and SHOW_CONTACT_SOURCE_FIELD != 0)
+
+        val arePhoneNumbersVisible = showFields and SHOW_PHONE_NUMBERS_FIELD != 0
+        contact_numbers_image.beVisibleIf(arePhoneNumbersVisible)
+        contact_numbers_holder.beVisibleIf(arePhoneNumbersVisible)
+        contact_numbers_add_new.beVisibleIf(arePhoneNumbersVisible)
+
+        val areEmailsVisible = showFields and SHOW_EMAILS_FIELD != 0
+        contact_emails_image.beVisibleIf(areEmailsVisible)
+        contact_emails_holder.beVisibleIf(areEmailsVisible)
+        contact_emails_add_new.beVisibleIf(areEmailsVisible)
+
+        val areAddressesVisible = showFields and SHOW_ADDRESSES_FIELD != 0
+        contact_addresses_image.beVisibleIf(areAddressesVisible)
+        contact_addresses_holder.beVisibleIf(areAddressesVisible)
+        contact_addresses_add_new.beVisibleIf(areAddressesVisible)
+
+        val isOrganizationVisible = showFields and SHOW_ORGANIZATION_FIELD != 0
+        contact_organization_company.beVisibleIf(isOrganizationVisible)
+        contact_organization_job_position.beVisibleIf(isOrganizationVisible)
+        contact_organization_image.beVisibleIf(isOrganizationVisible)
+
+        val areEventsVisible = showFields and SHOW_EVENTS_FIELD != 0
+        contact_events_image.beVisibleIf(areEventsVisible)
+        contact_events_holder.beVisibleIf(areEventsVisible)
+        contact_events_add_new.beVisibleIf(areEventsVisible)
+
+        val areGroupsVisible = showFields and SHOW_GROUPS_FIELD != 0
+        contact_groups_image.beVisibleIf(areGroupsVisible)
+        contact_groups_holder.beVisibleIf(areGroupsVisible)
+        contact_groups_add_new.beVisibleIf(areGroupsVisible)
+
+        val areNotesVisible = showFields and SHOW_NOTES_FIELD != 0
+        contact_notes.beVisibleIf(areNotesVisible)
+        contact_notes_image.beVisibleIf(areNotesVisible)
+    }
+
     private fun setupEditContact() {
         window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
         supportActionBar?.title = resources.getString(R.string.edit_contact)
@@ -248,6 +299,7 @@ class EditContactActivity : ContactActivity() {
         contact_middle_name.setText(contact!!.middleName)
         contact_surname.setText(contact!!.surname)
         contact_suffix.setText(contact!!.suffix)
+
         contact_source.text = getPublicContactSource(contact!!.source)
 
         setupPhoneNumbers()
@@ -260,82 +312,94 @@ class EditContactActivity : ContactActivity() {
     }
 
     private fun setupPhoneNumbers() {
-        contact!!.phoneNumbers.forEachIndexed { index, number ->
-            var numberHolder = contact_numbers_holder.getChildAt(index)
-            if (numberHolder == null) {
-                numberHolder = layoutInflater.inflate(R.layout.item_edit_phone_number, contact_numbers_holder, false)
-                contact_numbers_holder.addView(numberHolder)
-            }
+        if (showFields and SHOW_PHONE_NUMBERS_FIELD != 0) {
+            contact!!.phoneNumbers.forEachIndexed { index, number ->
+                var numberHolder = contact_numbers_holder.getChildAt(index)
+                if (numberHolder == null) {
+                    numberHolder = layoutInflater.inflate(R.layout.item_edit_phone_number, contact_numbers_holder, false)
+                    contact_numbers_holder.addView(numberHolder)
+                }
 
-            numberHolder!!.apply {
-                contact_number.setText(number.value)
-                setupPhoneNumberTypePicker(contact_number_type, number.type)
+                numberHolder!!.apply {
+                    contact_number.setText(number.value)
+                    setupPhoneNumberTypePicker(contact_number_type, number.type)
+                }
             }
         }
     }
 
     private fun setupEmails() {
-        contact!!.emails.forEachIndexed { index, email ->
-            var emailHolder = contact_emails_holder.getChildAt(index)
-            if (emailHolder == null) {
-                emailHolder = layoutInflater.inflate(R.layout.item_edit_email, contact_emails_holder, false)
-                contact_emails_holder.addView(emailHolder)
-            }
+        if (showFields and SHOW_EMAILS_FIELD != 0) {
+            contact!!.emails.forEachIndexed { index, email ->
+                var emailHolder = contact_emails_holder.getChildAt(index)
+                if (emailHolder == null) {
+                    emailHolder = layoutInflater.inflate(R.layout.item_edit_email, contact_emails_holder, false)
+                    contact_emails_holder.addView(emailHolder)
+                }
 
-            emailHolder!!.apply {
-                contact_email.setText(email.value)
-                setupEmailTypePicker(contact_email_type, email.type)
+                emailHolder!!.apply {
+                    contact_email.setText(email.value)
+                    setupEmailTypePicker(contact_email_type, email.type)
+                }
             }
         }
     }
 
     private fun setupAddresses() {
-        contact!!.addresses.forEachIndexed { index, address ->
-            var addressHolder = contact_addresses_holder.getChildAt(index)
-            if (addressHolder == null) {
-                addressHolder = layoutInflater.inflate(R.layout.item_edit_address, contact_addresses_holder, false)
-                contact_addresses_holder.addView(addressHolder)
-            }
+        if (showFields and SHOW_ADDRESSES_FIELD != 0) {
+            contact!!.addresses.forEachIndexed { index, address ->
+                var addressHolder = contact_addresses_holder.getChildAt(index)
+                if (addressHolder == null) {
+                    addressHolder = layoutInflater.inflate(R.layout.item_edit_address, contact_addresses_holder, false)
+                    contact_addresses_holder.addView(addressHolder)
+                }
 
-            addressHolder!!.apply {
-                contact_address.setText(address.value)
-                setupAddressTypePicker(contact_address_type, address.type)
+                addressHolder!!.apply {
+                    contact_address.setText(address.value)
+                    setupAddressTypePicker(contact_address_type, address.type)
+                }
             }
         }
     }
 
     private fun setupNotes() {
-        contact_notes.setText(contact!!.notes)
+        if (showFields and SHOW_NOTES_FIELD != 0) {
+            contact_notes.setText(contact!!.notes)
+        }
     }
 
     private fun setupOrganization() {
-        contact_organization_company.setText(contact!!.organization.company)
-        contact_organization_job_position.setText(contact!!.organization.jobPosition)
+        if (showFields and SHOW_ORGANIZATION_FIELD != 0) {
+            contact_organization_company.setText(contact!!.organization.company)
+            contact_organization_job_position.setText(contact!!.organization.jobPosition)
+        }
     }
 
     private fun setupEvents() {
-        contact!!.events.forEachIndexed { index, event ->
-            var eventHolder = contact_events_holder.getChildAt(index)
-            if (eventHolder == null) {
-                eventHolder = layoutInflater.inflate(R.layout.item_event, contact_events_holder, false)
-                contact_events_holder.addView(eventHolder)
-            }
-
-            (eventHolder as ViewGroup).apply {
-                val contactEvent = contact_event.apply {
-                    getDateTime(event.value, this)
-                    tag = event.value
-                    alpha = 1f
+        if (showFields and SHOW_EVENTS_FIELD != 0) {
+            contact!!.events.forEachIndexed { index, event ->
+                var eventHolder = contact_events_holder.getChildAt(index)
+                if (eventHolder == null) {
+                    eventHolder = layoutInflater.inflate(R.layout.item_event, contact_events_holder, false)
+                    contact_events_holder.addView(eventHolder)
                 }
 
-                setupEventTypePicker(this, event.type)
+                (eventHolder as ViewGroup).apply {
+                    val contactEvent = contact_event.apply {
+                        getDateTime(event.value, this)
+                        tag = event.value
+                        alpha = 1f
+                    }
 
-                contact_event_remove.apply {
-                    beVisible()
-                    applyColorFilter(getAdjustedPrimaryColor())
-                    background.applyColorFilter(config.textColor)
-                    setOnClickListener {
-                        resetContactEvent(contactEvent, this)
+                    setupEventTypePicker(this, event.type)
+
+                    contact_event_remove.apply {
+                        beVisible()
+                        applyColorFilter(getAdjustedPrimaryColor())
+                        background.applyColorFilter(config.textColor)
+                        setOnClickListener {
+                            resetContactEvent(contactEvent, this)
+                        }
                     }
                 }
             }
@@ -343,57 +407,59 @@ class EditContactActivity : ContactActivity() {
     }
 
     private fun setupGroups() {
-        contact_groups_holder.removeAllViews()
-        val groups = contact!!.groups
-        groups.forEachIndexed { index, group ->
-            var groupHolder = contact_groups_holder.getChildAt(index)
-            if (groupHolder == null) {
-                groupHolder = layoutInflater.inflate(R.layout.item_edit_group, contact_groups_holder, false)
-                contact_groups_holder.addView(groupHolder)
-            }
-
-            (groupHolder as ViewGroup).apply {
-                contact_group.apply {
-                    text = group.title
-                    setTextColor(config.textColor)
-                    tag = group.id
-                    alpha = 1f
+        if (showFields and SHOW_GROUPS_FIELD != 0) {
+            contact_groups_holder.removeAllViews()
+            val groups = contact!!.groups
+            groups.forEachIndexed { index, group ->
+                var groupHolder = contact_groups_holder.getChildAt(index)
+                if (groupHolder == null) {
+                    groupHolder = layoutInflater.inflate(R.layout.item_edit_group, contact_groups_holder, false)
+                    contact_groups_holder.addView(groupHolder)
                 }
 
-                setOnClickListener {
-                    showSelectGroupsDialog()
-                }
+                (groupHolder as ViewGroup).apply {
+                    contact_group.apply {
+                        text = group.title
+                        setTextColor(config.textColor)
+                        tag = group.id
+                        alpha = 1f
+                    }
 
-                contact_group_remove.apply {
-                    beVisible()
-                    applyColorFilter(getAdjustedPrimaryColor())
-                    background.applyColorFilter(config.textColor)
                     setOnClickListener {
-                        removeGroup(group.id)
+                        showSelectGroupsDialog()
+                    }
+
+                    contact_group_remove.apply {
+                        beVisible()
+                        applyColorFilter(getAdjustedPrimaryColor())
+                        background.applyColorFilter(config.textColor)
+                        setOnClickListener {
+                            removeGroup(group.id)
+                        }
                     }
                 }
             }
-        }
 
-        if (groups.isEmpty()) {
-            layoutInflater.inflate(R.layout.item_edit_group, contact_groups_holder, false).apply {
-                contact_group.apply {
-                    alpha = 0.5f
-                    text = getString(R.string.no_groups)
-                    setTextColor(config.textColor)
-                }
+            if (groups.isEmpty()) {
+                layoutInflater.inflate(R.layout.item_edit_group, contact_groups_holder, false).apply {
+                    contact_group.apply {
+                        alpha = 0.5f
+                        text = getString(R.string.no_groups)
+                        setTextColor(config.textColor)
+                    }
 
-                contact_groups_holder.addView(this)
-                contact_group_remove.beGone()
-                setOnClickListener {
-                    showSelectGroupsDialog()
+                    contact_groups_holder.addView(this)
+                    contact_group_remove.beGone()
+                    setOnClickListener {
+                        showSelectGroupsDialog()
+                    }
                 }
             }
         }
     }
 
     private fun setupNewContact() {
-        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
+        //window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
         supportActionBar?.title = resources.getString(R.string.new_contact)
         val contactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE
         val organization = Organization("", "")
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 9877d1c7..c337c600 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
@@ -118,9 +118,9 @@ class ViewContactActivity : ContactActivity() {
         contact_start_call.applyColorFilter(textColor)
         contact_send_email.applyColorFilter(textColor)
         contact_name_image.applyColorFilter(textColor)
-        contact_number_image.applyColorFilter(textColor)
-        contact_email_image.applyColorFilter(textColor)
-        contact_event_image.applyColorFilter(textColor)
+        contact_numbers_image.applyColorFilter(textColor)
+        contact_emails_image.applyColorFilter(textColor)
+        contact_events_image.applyColorFilter(textColor)
         contact_source_image.applyColorFilter(textColor)
         contact_notes_image.applyColorFilter(textColor)
         contact_organization_image.applyColorFilter(textColor)
@@ -199,10 +199,10 @@ class ViewContactActivity : ContactActivity() {
                     }
                 }
             }
-            contact_number_image.beVisible()
+            contact_numbers_image.beVisible()
             contact_numbers_holder.beVisible()
         } else {
-            contact_number_image.beGone()
+            contact_numbers_image.beGone()
             contact_numbers_holder.beGone()
         }
     }
@@ -223,10 +223,10 @@ class ViewContactActivity : ContactActivity() {
                     }
                 }
             }
-            contact_email_image.beVisible()
+            contact_emails_image.beVisible()
             contact_emails_holder.beVisible()
         } else {
-            contact_email_image.beGone()
+            contact_emails_image.beGone()
             contact_emails_holder.beGone()
         }
     }
@@ -247,10 +247,10 @@ class ViewContactActivity : ContactActivity() {
                     }
                 }
             }
-            contact_address_image.beVisible()
+            contact_addresses_image.beVisible()
             contact_addresses_holder.beVisible()
         } else {
-            contact_address_image.beGone()
+            contact_addresses_image.beGone()
             contact_addresses_holder.beGone()
         }
     }
@@ -268,10 +268,10 @@ class ViewContactActivity : ContactActivity() {
                     contact_event_remove.beGone()
                 }
             }
-            contact_event_image.beVisible()
+            contact_events_image.beVisible()
             contact_events_holder.beVisible()
         } else {
-            contact_event_image.beGone()
+            contact_events_image.beGone()
             contact_events_holder.beGone()
         }
     }
diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml
index f8bf663a..68f6ac87 100644
--- a/app/src/main/res/layout/activity_edit_contact.xml
+++ b/app/src/main/res/layout/activity_edit_contact.xml
@@ -96,6 +96,7 @@
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_photo"
             android:layout_centerVertical="true"
+            android:layout_marginBottom="@dimen/normal_margin"
             android:layout_toRightOf="@+id/contact_name_image"
             android:hint="@string/prefix"
             android:inputType="textCapWords"
@@ -111,7 +112,7 @@
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_prefix"
             android:layout_centerVertical="true"
-            android:layout_marginTop="@dimen/normal_margin"
+            android:layout_marginBottom="@dimen/normal_margin"
             android:layout_toRightOf="@+id/contact_name_image"
             android:hint="@string/first_name"
             android:inputType="textCapWords"
@@ -127,7 +128,7 @@
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_first_name"
             android:layout_centerVertical="true"
-            android:layout_marginTop="@dimen/normal_margin"
+            android:layout_marginBottom="@dimen/normal_margin"
             android:layout_toRightOf="@+id/contact_name_image"
             android:hint="@string/middle_name"
             android:inputType="textCapWords"
@@ -143,7 +144,7 @@
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_middle_name"
             android:layout_centerVertical="true"
-            android:layout_marginTop="@dimen/normal_margin"
+            android:layout_marginBottom="@dimen/normal_margin"
             android:layout_toRightOf="@+id/contact_name_image"
             android:hint="@string/surname"
             android:inputType="textCapWords"
@@ -159,7 +160,7 @@
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_surname"
             android:layout_centerVertical="true"
-            android:layout_marginTop="@dimen/normal_margin"
+            android:layout_marginBottom="@dimen/medium_margin"
             android:layout_toRightOf="@+id/contact_name_image"
             android:hint="@string/suffix"
             android:inputType="textCapWords"
@@ -170,7 +171,7 @@
             android:textSize="@dimen/bigger_text_size"/>
 
         <ImageView
-            android:id="@+id/contact_number_image"
+            android:id="@+id/contact_numbers_image"
             android:layout_width="@dimen/contact_icons_size"
             android:layout_height="@dimen/contact_icons_size"
             android:layout_alignTop="@+id/contact_numbers_holder"
@@ -185,8 +186,8 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_suffix"
-            android:layout_marginTop="@dimen/medium_margin"
-            android:layout_toRightOf="@+id/contact_number_image"
+            android:layout_marginBottom="@dimen/small_margin"
+            android:layout_toRightOf="@+id/contact_numbers_image"
             android:orientation="vertical">
 
             <include layout="@layout/item_edit_phone_number"/>
@@ -194,21 +195,21 @@
         </LinearLayout>
 
         <ImageView
-            android:id="@+id/contact_number_add_new"
+            android:id="@+id/contact_numbers_add_new"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_numbers_holder"
             android:layout_centerHorizontal="true"
-            android:layout_marginTop="@dimen/small_margin"
             android:background="@drawable/button_background"
             android:paddingBottom="@dimen/medium_margin"
+            android:layout_marginBottom="@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_email_image"
+            android:id="@+id/contact_emails_image"
             android:layout_width="@dimen/contact_icons_size"
             android:layout_height="@dimen/contact_icons_size"
             android:layout_alignTop="@+id/contact_emails_holder"
@@ -222,8 +223,7 @@
             android:id="@+id/contact_emails_holder"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_below="@+id/contact_number_add_new"
-            android:layout_marginTop="@dimen/medium_margin"
+            android:layout_below="@+id/contact_numbers_add_new"
             android:layout_toRightOf="@+id/contact_name_image"
             android:orientation="vertical">
 
@@ -232,7 +232,7 @@
         </LinearLayout>
 
         <ImageView
-            android:id="@+id/contact_email_add_new"
+            android:id="@+id/contact_emails_add_new"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_emails_holder"
@@ -246,7 +246,7 @@
             android:src="@drawable/ic_plus"/>
 
         <ImageView
-            android:id="@+id/contact_address_image"
+            android:id="@+id/contact_addresses_image"
             android:layout_width="@dimen/contact_icons_size"
             android:layout_height="@dimen/contact_icons_size"
             android:layout_alignTop="@+id/contact_addresses_holder"
@@ -260,7 +260,7 @@
             android:id="@+id/contact_addresses_holder"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_below="@+id/contact_email_add_new"
+            android:layout_below="@+id/contact_emails_add_new"
             android:layout_marginTop="@dimen/medium_margin"
             android:layout_toRightOf="@+id/contact_name_image"
             android:orientation="vertical">
@@ -270,7 +270,7 @@
         </LinearLayout>
 
         <ImageView
-            android:id="@+id/contact_address_add_new"
+            android:id="@+id/contact_addresses_add_new"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_addresses_holder"
@@ -284,7 +284,7 @@
             android:src="@drawable/ic_plus"/>
 
         <ImageView
-            android:id="@+id/contact_event_image"
+            android:id="@+id/contact_events_image"
             android:layout_width="@dimen/contact_icons_size"
             android:layout_height="@dimen/contact_icons_size"
             android:layout_alignTop="@+id/contact_events_holder"
@@ -298,7 +298,7 @@
             android:id="@+id/contact_events_holder"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_below="@+id/contact_address_add_new"
+            android:layout_below="@+id/contact_addresses_add_new"
             android:layout_marginTop="@dimen/medium_margin"
             android:layout_toRightOf="@+id/contact_name_image"
             android:orientation="vertical">
@@ -308,7 +308,7 @@
         </LinearLayout>
 
         <ImageView
-            android:id="@+id/contact_event_add_new"
+            android:id="@+id/contact_events_add_new"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_events_holder"
@@ -336,7 +336,7 @@
             android:id="@+id/contact_notes"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_below="@+id/contact_event_add_new"
+            android:layout_below="@+id/contact_events_add_new"
             android:layout_centerVertical="true"
             android:layout_marginTop="@dimen/normal_margin"
             android:layout_toRightOf="@+id/contact_notes_image"
diff --git a/app/src/main/res/layout/activity_view_contact.xml b/app/src/main/res/layout/activity_view_contact.xml
index 384c7cd2..523627b0 100644
--- a/app/src/main/res/layout/activity_view_contact.xml
+++ b/app/src/main/res/layout/activity_view_contact.xml
@@ -167,7 +167,7 @@
             android:textSize="@dimen/bigger_text_size"/>
 
         <ImageView
-            android:id="@+id/contact_number_image"
+            android:id="@+id/contact_numbers_image"
             android:layout_width="@dimen/contact_icons_size"
             android:layout_height="@dimen/contact_icons_size"
             android:layout_alignTop="@+id/contact_numbers_holder"
@@ -182,12 +182,12 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_below="@+id/contact_suffix"
-            android:layout_toRightOf="@+id/contact_number_image"
+            android:layout_toRightOf="@+id/contact_numbers_image"
             android:orientation="vertical"
             android:paddingLeft="@dimen/small_margin"/>
 
         <ImageView
-            android:id="@+id/contact_email_image"
+            android:id="@+id/contact_emails_image"
             android:layout_width="@dimen/contact_icons_size"
             android:layout_height="@dimen/contact_icons_size"
             android:layout_alignTop="@+id/contact_emails_holder"
@@ -207,7 +207,7 @@
             android:paddingLeft="@dimen/small_margin"/>
 
         <ImageView
-            android:id="@+id/contact_address_image"
+            android:id="@+id/contact_addresses_image"
             android:layout_width="@dimen/contact_icons_size"
             android:layout_height="@dimen/contact_icons_size"
             android:layout_alignTop="@+id/contact_addresses_holder"
@@ -227,7 +227,7 @@
             android:paddingLeft="@dimen/small_margin"/>
 
         <ImageView
-            android:id="@+id/contact_event_image"
+            android:id="@+id/contact_events_image"
             android:layout_width="@dimen/contact_icons_size"
             android:layout_height="@dimen/contact_icons_size"
             android:layout_alignTop="@+id/contact_events_holder"

From c03c7fff39955d0e0e58163b14ca7728f7becea1 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 18:23:36 +0200
Subject: [PATCH 40/61] do not refetch contacts before sharing

---
 .../simplemobiletools/contacts/adapters/ContactsAdapter.kt  | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt
index dd783836..347a6f88 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt
@@ -221,10 +221,8 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList<Cont
             contactsIDs.add(contactItems[it].id)
         }
 
-        ContactsHelper(activity).getContacts {
-            val filtered = it.filter { contactsIDs.contains(it.id) } as ArrayList<Contact>
-            activity.shareContacts(filtered)
-        }
+        val filtered = contactItems.filter { contactsIDs.contains(it.id) } as ArrayList<Contact>
+        activity.shareContacts(filtered)
     }
 
     override fun onViewRecycled(holder: ViewHolder) {

From 8c5881f4d3b237b43b4386c2c084593c43b0d44e Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 18:34:32 +0200
Subject: [PATCH 41/61] updating FAQ texts a bit

---
 app/src/main/res/values-de/strings.xml     | 4 ++--
 app/src/main/res/values-el/strings.xml     | 4 ++--
 app/src/main/res/values-fr/strings.xml     | 4 ++--
 app/src/main/res/values-hr/strings.xml     | 4 ++--
 app/src/main/res/values-ko-rKR/strings.xml | 4 ++--
 app/src/main/res/values-lt/strings.xml     | 4 ++--
 app/src/main/res/values-pt/strings.xml     | 4 ++--
 app/src/main/res/values-ru/strings.xml     | 4 ++--
 app/src/main/res/values-sk/strings.xml     | 2 +-
 app/src/main/res/values-sv/strings.xml     | 4 ++--
 app/src/main/res/values-zh-rTW/strings.xml | 4 ++--
 app/src/main/res/values/strings.xml        | 4 ++--
 12 files changed, 23 insertions(+), 23 deletions(-)

diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 8f0b1bfa..e7a2ecc5 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -96,8 +96,8 @@
     <string name="contact_source">Contact source</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
-    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index d2d57248..eb3dc26e 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -96,8 +96,8 @@
     <string name="contact_source">Contact source</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
-    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 731e5e87..a46bf281 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -96,8 +96,8 @@
     <string name="contact_source">Contact source</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
-    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 5fe4526d..ca3cb0ed 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -96,8 +96,8 @@
     <string name="contact_source">Contact source</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
-    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index 26639518..575da9c7 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -96,8 +96,8 @@
     <string name="contact_source">Contact source</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
-    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index c5b5dfe7..57bb2cea 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -96,8 +96,8 @@
     <string name="contact_source">Contact source</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
-    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index c42e2aa5..2fa28fe7 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -96,8 +96,8 @@
     <string name="contact_source">Fonte do contacto</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
-    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 05666af3..87e44452 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -96,8 +96,8 @@
     <string name="contact_source">Contact source</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
-    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 27af669f..36cd7cea 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -96,7 +96,7 @@
     <string name="contact_source">Zdroje kontaktov</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">Nechcem mať zobrazené všetky tie polia pri kontaktoch, viem ich nejako skryť?</string>
+    <string name="faq_1_title">Chcem upraviť viditeľné polia kontaktov. Dá sa to?</string>
     <string name="faq_1_text">Áno, stačí ísť do Nastavenia -> Spravovať zobrazené polia kontaktov. Tam si viete zvoliť, ktoré polia majú byť viditeľné. Niektoré sú v predvolenom stave vypnuté, čiže tam môžete objaviť aj nové.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index c80da7b9..fec3135b 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -96,8 +96,8 @@
     <string name="contact_source">Contact source</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
-    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index b67195db..07e3391f 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -96,8 +96,8 @@
     <string name="contact_source">Contact source</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
-    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 16699bf1..25cb9f29 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -96,8 +96,8 @@
     <string name="contact_source">Contact source</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">I don\'t need all those fields displayed at every contact. Can I somehow hide them?</string>
-    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Select fields to show. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>
+    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->

From 049c3a5361bc7998e1a700c8c440e9bdf6c35dde Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 18:37:58 +0200
Subject: [PATCH 42/61] updating release notes

---
 .../com/simplemobiletools/contacts/activities/MainActivity.kt | 1 +
 app/src/main/res/values/donottranslate.xml                    | 4 ++++
 2 files changed, 5 insertions(+)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
index 90144c75..664acf60 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt
@@ -439,6 +439,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener {
         arrayListOf<Release>().apply {
             add(Release(10, R.string.release_10))
             add(Release(11, R.string.release_11))
+            add(Release(16, R.string.release_16))
             checkWhatsNew(this, BuildConfig.VERSION_CODE)
         }
     }
diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml
index fda11285..613319f9 100644
--- a/app/src/main/res/values/donottranslate.xml
+++ b/app/src/main/res/values/donottranslate.xml
@@ -2,6 +2,10 @@
 <resources>
 
     <!-- Release notes -->
+    <string name="release_16">
+        Added name prefix/suffix and contact organizations\n
+        Added a settings item \"Manage shown contact fields\" for customizing visible contact details, with some fields disabled by default
+    </string>
     <string name="release_11">Added Address and Notes fields</string>
     <string name="release_10">Allow storing contacts in a local database, hidden from other apps</string>
 

From c0698b4753ff0c0e73dcea9d7701b26319396f01 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 19:04:09 +0200
Subject: [PATCH 43/61] update version to 3.5.0

---
 app/build.gradle | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 5b81b45b..f5ec6511 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,8 +10,8 @@ android {
         applicationId "com.simplemobiletools.contacts"
         minSdkVersion 16
         targetSdkVersion 27
-        versionCode 15
-        versionName "3.4.0"
+        versionCode 16
+        versionName "3.5.0"
         setProperty("archivesBaseName", "contacts")
     }
 

From 9eb6b3c821c6d90f96fa9ba46ae39eec7fa5379a Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Sun, 8 Apr 2018 19:04:15 +0200
Subject: [PATCH 44/61] updating changelog

---
 CHANGELOG.md | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5cc45df2..45eeb532 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,15 @@
 Changelog
 ==========
 
+Version 3.5.0 *(2018-04-08)*
+----------------------------
+
+ * Added name prefix/suffix and contact organizations (hidden by default)
+ * Added a settings item "Manage shown contact fields" for customizing visible contact details, with some fields disabled by default
+ * Allow using the app without granting Contacts permission, rely on local secret storage only
+ * Dial the selected contact if Call permission is not granted
+ * Many performance improvements and smaller bugfixes
+
 Version 3.4.0 *(2018-03-21)*
 ----------------------------
 

From 82ca892e250f4906fd1d6fab19de70b2a8e7ebf3 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Tue, 10 Apr 2018 21:24:50 +0200
Subject: [PATCH 45/61] catch exceptions thrown at getting default thumbnail
 size

---
 .../kotlin/com/simplemobiletools/contacts/extensions/Context.kt  | 1 +
 1 file changed, 1 insertion(+)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt
index 5c1befcc..2507d169 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt
@@ -153,6 +153,7 @@ fun Context.getPhotoThumbnailSize(): Int {
         if (cursor?.moveToFirst() == true) {
             return cursor.getIntValue(ContactsContract.DisplayPhoto.THUMBNAIL_MAX_DIM)
         }
+    } catch (ignored: Exception) {
     } finally {
         cursor?.close()
     }

From 24bb8a331be3d9fb8717d10b602ce47bc68d73ad Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Tue, 10 Apr 2018 21:51:46 +0200
Subject: [PATCH 46/61] update commons to 3.18.17

---
 app/build.gradle | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/build.gradle b/app/build.gradle
index f5ec6511..2791c17d 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -45,7 +45,7 @@ ext {
 }
 
 dependencies {
-    implementation 'com.simplemobiletools:commons:3.18.10'
+    implementation 'com.simplemobiletools:commons:3.18.17'
     implementation 'joda-time:joda-time:2.9.9'
     implementation 'com.facebook.stetho:stetho:1.5.0'
 

From e999c3a275b46f927eb3e7b57cb3609063e73465 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Tue, 10 Apr 2018 22:07:41 +0200
Subject: [PATCH 47/61] try parsing contact name from Insert intent, related to
 #125

---
 .../contacts/activities/EditContactActivity.kt                | 4 ++++
 1 file changed, 4 insertions(+)

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 b709f418..2a666f60 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -49,6 +49,7 @@ class EditContactActivity : ContactActivity() {
     private val REMOVE_PHOTO = 3
 
     private val KEY_PHONE = "phone"
+    private val KEY_NAME = "name"
 
     private var wasActivityInitialized = false
     private var lastPhotoIntentUri: Uri? = null
@@ -150,6 +151,9 @@ class EditContactActivity : ContactActivity() {
             val phoneNumber = intent.extras.get(KEY_PHONE).toString()
             contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE))
             setupPhoneNumbers()
+
+            val contactFullName = intent.extras.get(KEY_NAME).toString()
+            contact_first_name.setText(contactFullName)
         }
 
         setupTypePickers()

From 8c0ca77ed29f825f3126d034ff788d7547cba093 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Tue, 10 Apr 2018 22:11:00 +0200
Subject: [PATCH 48/61] fix #124, properly use "Start name with surname"

---
 .../contacts/activities/GroupContactsActivity.kt                 | 1 +
 .../contacts/activities/SelectContactActivity.kt                 | 1 +
 .../simplemobiletools/contacts/dialogs/SelectContactsDialog.kt   | 1 +
 .../simplemobiletools/contacts/fragments/MyViewPagerFragment.kt  | 1 +
 4 files changed, 4 insertions(+)

diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt
index b32a0e1e..2ee2ab73 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt
@@ -67,6 +67,7 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh
             group_contacts_list.beVisibleIf(groupContacts.isNotEmpty())
 
             Contact.sorting = config.sorting
+            Contact.startWithSurname = config.startNameWithSurname
             groupContacts.sort()
 
             updateContacts(groupContacts)
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SelectContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SelectContactActivity.kt
index 601f6e85..675e2ad1 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SelectContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/SelectContactActivity.kt
@@ -103,6 +103,7 @@ class SelectContactActivity : SimpleActivity() {
             }
 
             Contact.sorting = config.sorting
+            Contact.startWithSurname = config.startNameWithSurname
             contacts.sort()
 
             runOnUiThread {
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt
index 7f5e259d..358a7dcd 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectContactsDialog.kt
@@ -29,6 +29,7 @@ class SelectContactsDialog(val activity: SimpleActivity, initialContacts: ArrayL
         }
 
         Contact.sorting = activity.config.sorting
+        Contact.startWithSurname = activity.config.startNameWithSurname
         allContacts.sort()
 
         activity.runOnUiThread {
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
index ff5b07aa..7c3bd4cc 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
@@ -92,6 +92,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
         }
 
         Contact.sorting = config.sorting
+        Contact.startWithSurname = config.startNameWithSurname
         contacts.sort()
         allContacts = contacts
 

From 4f97fce695b799563aa64116fe89dfac1a7d97b2 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Tue, 10 Apr 2018 22:55:13 +0200
Subject: [PATCH 49/61] fix #123, show the business as contact name if only
 that is filled

---
 .../com/simplemobiletools/contacts/models/Contact.kt     | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

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 47f8800c..6ea68447 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
@@ -72,6 +72,13 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m
 
         val lastPart = if (startWithSurname) firstName else surname
         val suffixComma = if (suffix.isEmpty()) "" else ", $suffix"
-        return "$prefix $firstPart $lastPart$suffixComma".trim()
+        val fullName = "$prefix $firstPart $lastPart$suffixComma".trim()
+        return if (fullName.isEmpty()) {
+            var fullOrganization = if (organization.jobPosition.isEmpty()) "" else "${organization.jobPosition}, "
+            fullOrganization += organization.company
+            fullOrganization.trim().trimEnd(',')
+        } else {
+            fullName
+        }
     }
 }

From 6dd82c07edda20ca08693fb6b2ee03dc183530ed Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Tue, 10 Apr 2018 22:59:15 +0200
Subject: [PATCH 50/61] update version to 3.5.1

---
 app/build.gradle | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 2791c17d..f4c70416 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -10,8 +10,8 @@ android {
         applicationId "com.simplemobiletools.contacts"
         minSdkVersion 16
         targetSdkVersion 27
-        versionCode 16
-        versionName "3.5.0"
+        versionCode 17
+        versionName "3.5.1"
         setProperty("archivesBaseName", "contacts")
     }
 

From 2200234ee47b2e4e5844b829df4b2af1bf0e9095 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Tue, 10 Apr 2018 22:59:21 +0200
Subject: [PATCH 51/61] updating changelog

---
 CHANGELOG.md | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 45eeb532..f21ecede 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,12 @@
 Changelog
 ==========
 
+Version 3.5.1 *(2018-04-10)*
+----------------------------
+
+ * Show the organization name as the contact name in case only that is filled
+ * Fix "Start name with surname"
+
 Version 3.5.0 *(2018-04-08)*
 ----------------------------
 

From d53c1ed8727d0b46b135e04f1ff0abee77841aaf Mon Sep 17 00:00:00 2001
From: fricyo <30796677+fricyo@users.noreply.github.com>
Date: Wed, 11 Apr 2018 16:38:44 +0800
Subject: [PATCH 52/61] Update Translation

---
 app/src/main/res/values-zh-rTW/strings.xml | 34 +++++++++++-----------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 07e3391f..f936661b 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -6,8 +6,8 @@
     <string name="updating">更新中…</string>
     <string name="phone_storage">手機空間</string>
     <string name="phone_storage_hidden">手機空間 (其他程式不可見)</string>
-    <string name="company">Company</string>
-    <string name="job_position">Job position</string>
+    <string name="company">公司</string>
+    <string name="job_position">職位</string>
 
     <string name="new_contact">新聯絡人</string>
     <string name="edit_contact">編輯聯絡人</string>
@@ -42,10 +42,10 @@
     <string name="view_contact">顯示聯絡人資料</string>
     <string name="show_favorites_tab">顯示我的最愛頁面</string>
     <string name="show_groups_tab">顯示群組頁面</string>
-    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
+    <string name="manage_shown_contact_fields">管理顯示的聯絡人欄位</string>
 
     <!-- Emails -->
-    <string name="email">信箱</string>
+    <string name="email">電子信箱</string>
     <string name="home">住家</string>
     <string name="work">工作</string>
     <string name="other">其它</string>
@@ -83,21 +83,21 @@
     <string name="filename_without_vcf">檔案名稱 (不含.vcf)</string>
 
     <!-- Visible fields -->
-    <string name="select_fields_to_show">Select fields to show</string>
-    <string name="prefix">Prefix</string>
-    <string name="suffix">Suffix</string>
-    <string name="phone_numbers">Phone numbers</string>
-    <string name="emails">Emails</string>
-    <string name="addresses">Addresses</string>
-    <string name="events">Events (birthdays, anniversaries)</string>
-    <string name="notes">Notes</string>
-    <string name="organization">Organization</string>
-    <string name="groups">Groups</string>
-    <string name="contact_source">Contact source</string>
+    <string name="select_fields_to_show">選擇要顯示的欄位</string>
+    <string name="prefix">前缀</string>
+    <string name="suffix">後綴</string>
+    <string name="phone_numbers">電話號碼</string>
+    <string name="emails">電子信箱</string>
+    <string name="addresses">地址</string>
+    <string name="events">活動 (生日、紀念日)</string>
+    <string name="notes">筆記</string>
+    <string name="organization">組織</string>
+    <string name="groups">群組</string>
+    <string name="contact_source">聯絡人來源</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>
-    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_title">我想要更改在通訊錄會看到哪些欄位。我能這麼做嗎?</string>
+    <string name="faq_1_text">可以,你要做的是到[設定] -> [管理顯示的聯絡人欄位]。在那裡,你可以選擇應該看到什麼欄位。其中有些甚至預設是關閉的,所以你可能會在那裡發現一些新的。</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->

From bf12e74fe9835b46b4402142a32d2e974cfd4a7d Mon Sep 17 00:00:00 2001
From: xin <xinxinxinxinxin@users.noreply.github.com>
Date: Wed, 11 Apr 2018 10:26:03 +0000
Subject: [PATCH 53/61] Update french translation

---
 app/src/main/res/values-fr/strings.xml | 58 +++++++++++++-------------
 1 file changed, 29 insertions(+), 29 deletions(-)

diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index a46bf281..da8bee51 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -6,27 +6,27 @@
     <string name="updating">Mise à jour…</string>
     <string name="phone_storage">Stockage du téléphone</string>
     <string name="phone_storage_hidden">Stockage du téléphone (non visible par d\'autres applis)</string>
-    <string name="company">Company</string>
-    <string name="job_position">Job position</string>
+    <string name="company">Société</string>
+    <string name="job_position">Poste</string>
 
     <string name="new_contact">Nouveau contact</string>
     <string name="edit_contact">Modifier contact</string>
     <string name="select_contact">Sélectionner un contact</string>
     <string name="select_contacts">Sélectionner des contacts</string>
     <string name="first_name">Prénom</string>
-    <string name="middle_name">Nom</string>
-    <string name="surname">Surnom</string>
+    <string name="middle_name">Deuxième prénom</string>
+    <string name="surname">Nom</string>
 
     <!-- Groups -->
-    <string name="no_groups">No groups</string>
-    <string name="create_new_group">Create a new group</string>
-    <string name="remove_from_group">Remove from group</string>
-    <string name="no_group_participants">This group is empty</string>
-    <string name="add_contacts">Add contacts</string>
-    <string name="no_group_created">There are no contact groups on the device</string>
-    <string name="create_group">Create group</string>
-    <string name="add_to_group">Add to group</string>
-    <string name="create_group_under_account">Create group under account</string>
+    <string name="no_groups">Pas de groupe</string>
+    <string name="create_new_group">Créer un nouveau groupe</string>
+    <string name="remove_from_group">Enlever du groupe</string>
+    <string name="no_group_participants">Ce groupe est vide</string>
+    <string name="add_contacts">Ajout contacts</string>
+    <string name="no_group_created">Il n\'y a pas de groupes de contacts sur l\'appareil</string>
+    <string name="create_group">Créer un groupe</string>
+    <string name="add_to_group">Ajouter à un groupe</string>
+    <string name="create_group_under_account">Créer un groupe pris en compte</string>
 
     <!-- Photo -->
     <string name="take_photo">Prendre une photo</string>
@@ -34,15 +34,15 @@
     <string name="remove_photo">Supprimer la photo</string>
 
     <!-- Settings -->
-    <string name="start_name_with_surname">Commencer le nom par le surnom</string>
+    <string name="start_name_with_surname">Commencer le nom par le nom de famille</string>
     <string name="show_phone_numbers">Afficher les numéros de téléphone sur l\'écran principal</string>
     <string name="show_contact_thumbnails">Afficher les vignettes des contacts</string>
     <string name="on_contact_click">Sur appui du contact</string>
     <string name="call_contact">Appeler le contact</string>
     <string name="view_contact">Voir les détails du contact</string>
-    <string name="show_favorites_tab">Show favorites tab</string>
-    <string name="show_groups_tab">Show groups tab</string>
-    <string name="manage_shown_contact_fields">Manage shown contact fields</string>
+    <string name="show_favorites_tab">Afficher l\'onglet favoris</string>
+    <string name="show_groups_tab">Afficher l\'onglet groupes</string>
+    <string name="manage_shown_contact_fields">Configurer l\'affichage des champs de contact</string>
 
     <!-- Emails -->
     <string name="email">E-mail</string>
@@ -83,21 +83,21 @@
     <string name="filename_without_vcf">Nom du fichier (sans .vcf)</string>
 
     <!-- Visible fields -->
-    <string name="select_fields_to_show">Select fields to show</string>
-    <string name="prefix">Prefix</string>
-    <string name="suffix">Suffix</string>
-    <string name="phone_numbers">Phone numbers</string>
-    <string name="emails">Emails</string>
-    <string name="addresses">Addresses</string>
-    <string name="events">Events (birthdays, anniversaries)</string>
+    <string name="select_fields_to_show">Sélectionner les champs à afficher</string>
+    <string name="prefix">Préfixe</string>
+    <string name="suffix">Suffixe</string>
+    <string name="phone_numbers">Numéros de téléphone</string>
+    <string name="emails">E-mails</string>
+    <string name="addresses">Adresses</string>
+    <string name="events">Évènements (naissances, anniversaires)</string>
     <string name="notes">Notes</string>
-    <string name="organization">Organization</string>
-    <string name="groups">Groups</string>
-    <string name="contact_source">Contact source</string>
+    <string name="organization">Organisation</string>
+    <string name="groups">Groupe</string>
+    <string name="contact_source">Source du contact</string>
 
     <!-- FAQ -->
-    <string name="faq_1_title">I want to change what fields are visible at contacts. Can I do it?</string>
-    <string name="faq_1_text">Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_title">Je veux changer quelles champs sont visibles. Est-ce que je peux ?</string>
+    <string name="faq_1_text">Oui, tout ce que vous avez à faire c'est d\'aller dans Paramètres -> Configurer l\'affichage des champs de contact. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->

From 4e9b42efcdc5721f1ba54a1066b439fff4dd26cf Mon Sep 17 00:00:00 2001
From: xin <xinxinxinxinxin@users.noreply.github.com>
Date: Wed, 11 Apr 2018 10:31:17 +0000
Subject: [PATCH 54/61] Update strings.xml

---
 app/src/main/res/values-fr/strings.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index da8bee51..aac1ca62 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -97,7 +97,7 @@
 
     <!-- FAQ -->
     <string name="faq_1_title">Je veux changer quelles champs sont visibles. Est-ce que je peux ?</string>
-    <string name="faq_1_text">Oui, tout ce que vous avez à faire c'est d\'aller dans Paramètres -> Configurer l\'affichage des champs de contact. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there.</string>
+    <string name="faq_1_text">Oui, tout ce que vous avez à faire c'est d\'aller dans Paramètres -> Configurer l\'affichage des champs de contact. Ici vous pouvez sélectionner quelles champs vous voulez afficher. Certains sont désactivés par défaut, ainsi vous pourrez y trouver des nouveaux champs.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->

From 79f4c67439fa3871ce684206908b78db310e3dda Mon Sep 17 00:00:00 2001
From: Tibor Kaputa <tibor@kaputa.sk>
Date: Wed, 11 Apr 2018 13:20:52 +0200
Subject: [PATCH 55/61] escaping an apostrophe

---
 app/src/main/res/values-fr/strings.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index aac1ca62..cab415e4 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -97,7 +97,7 @@
 
     <!-- FAQ -->
     <string name="faq_1_title">Je veux changer quelles champs sont visibles. Est-ce que je peux ?</string>
-    <string name="faq_1_text">Oui, tout ce que vous avez à faire c'est d\'aller dans Paramètres -> Configurer l\'affichage des champs de contact. Ici vous pouvez sélectionner quelles champs vous voulez afficher. Certains sont désactivés par défaut, ainsi vous pourrez y trouver des nouveaux champs.</string>
+    <string name="faq_1_text">Oui, tout ce que vous avez à faire c\'est d\'aller dans Paramètres -> Configurer l\'affichage des champs de contact. Ici vous pouvez sélectionner quelles champs vous voulez afficher. Certains sont désactivés par défaut, ainsi vous pourrez y trouver des nouveaux champs.</string>
 
     <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
     <!-- Short description has to have less than 80 chars -->

From 3b7b74b074db4cb939b9eece00ecfd56a683324c Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 13 Apr 2018 11:07:23 +0200
Subject: [PATCH 56/61] fix some null pointer crashes

---
 app/build.gradle                                              | 2 +-
 .../contacts/activities/EditContactActivity.kt                | 4 ++--
 .../com/simplemobiletools/contacts/helpers/ContactsHelper.kt  | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index f4c70416..140b0da5 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -45,7 +45,7 @@ ext {
 }
 
 dependencies {
-    implementation 'com.simplemobiletools:commons:3.18.17'
+    implementation 'com.simplemobiletools:commons:3.18.23'
     implementation 'joda-time:joda-time:2.9.9'
     implementation 'com.facebook.stetho:stetho:1.5.0'
 
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 2a666f60..8a77a161 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -148,11 +148,11 @@ class EditContactActivity : ContactActivity() {
         }
 
         if (contact!!.id == 0 && intent.extras?.containsKey(KEY_PHONE) == true && (action == Intent.ACTION_INSERT_OR_EDIT || action == Intent.ACTION_INSERT)) {
-            val phoneNumber = intent.extras.get(KEY_PHONE).toString()
+            val phoneNumber = intent.extras.get(KEY_PHONE).toString() ?: ""
             contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE))
             setupPhoneNumbers()
 
-            val contactFullName = intent.extras.get(KEY_NAME).toString()
+            val contactFullName = intent.extras.get(KEY_NAME)?.toString() ?: ""
             contact_first_name.setText(contactFullName)
         }
 
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 c7130a79..397a5937 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
@@ -442,7 +442,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
             if (cursor?.moveToFirst() == true) {
                 do {
                     val id = cursor.getLongValue(ContactsContract.Groups._ID)
-                    val title = cursor.getStringValue(ContactsContract.Groups.TITLE)
+                    val title = cursor.getStringValue(ContactsContract.Groups.TITLE) ?: continue
 
                     val systemId = cursor.getStringValue(ContactsContract.Groups.SYSTEM_ID)
                     if (groups.map { it.title }.contains(title) && systemId != null) {

From 2fcdb042f2996203a4754b27f45548e20089065c Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 13 Apr 2018 11:11:53 +0200
Subject: [PATCH 57/61] adding a new Website field

---
 app/src/main/res/values-de/strings.xml     | 1 +
 app/src/main/res/values-el/strings.xml     | 1 +
 app/src/main/res/values-fr/strings.xml     | 1 +
 app/src/main/res/values-hr/strings.xml     | 1 +
 app/src/main/res/values-ko-rKR/strings.xml | 1 +
 app/src/main/res/values-lt/strings.xml     | 1 +
 app/src/main/res/values-pt/strings.xml     | 1 +
 app/src/main/res/values-ru/strings.xml     | 1 +
 app/src/main/res/values-sk/strings.xml     | 1 +
 app/src/main/res/values-sv/strings.xml     | 1 +
 app/src/main/res/values-zh-rTW/strings.xml | 1 +
 app/src/main/res/values/strings.xml        | 1 +
 12 files changed, 12 insertions(+)

diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index e7a2ecc5..4e108601 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -92,6 +92,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
+    <string name="website">Website</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index eb3dc26e..3fbdb241 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -92,6 +92,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
+    <string name="website">Website</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index cab415e4..37b5e590 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -92,6 +92,7 @@
     <string name="events">Évènements (naissances, anniversaires)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organisation</string>
+    <string name="website">Website</string>
     <string name="groups">Groupe</string>
     <string name="contact_source">Source du contact</string>
 
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index ca3cb0ed..41286f5c 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -92,6 +92,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
+    <string name="website">Website</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index 575da9c7..4ed26e91 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -92,6 +92,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
+    <string name="website">Website</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 57bb2cea..18738019 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -92,6 +92,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
+    <string name="website">Website</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 2fa28fe7..d1a1744e 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -92,6 +92,7 @@
     <string name="events">Eventos (data de nascimento, aniversário)</string>
     <string name="notes">Notas</string>
     <string name="organization">Organização</string>
+    <string name="website">Website</string>
     <string name="groups">Grupos</string>
     <string name="contact_source">Fonte do contacto</string>
 
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 87e44452..2b67667d 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -92,6 +92,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
+    <string name="website">Website</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 36cd7cea..bf0695b5 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -92,6 +92,7 @@
     <string name="events">Udalosti (narodeniny, výročia)</string>
     <string name="notes">Poznámky</string>
     <string name="organization">Firma</string>
+    <string name="website">Webstránka</string>
     <string name="groups">Skupiny</string>
     <string name="contact_source">Zdroje kontaktov</string>
 
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index fec3135b..6f7a93c0 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -92,6 +92,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
+    <string name="website">Website</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index f936661b..f515af04 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -92,6 +92,7 @@
     <string name="events">活動 (生日、紀念日)</string>
     <string name="notes">筆記</string>
     <string name="organization">組織</string>
+    <string name="website">Website</string>
     <string name="groups">群組</string>
     <string name="contact_source">聯絡人來源</string>
 
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 25cb9f29..35751adc 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -92,6 +92,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
+    <string name="website">Website</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 

From 5b55467691b2504e88cbfaf44365b7bb2dc6b3ee Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 13 Apr 2018 11:51:58 +0200
Subject: [PATCH 58/61] fetch contact websites

---
 .../activities/EditContactActivity.kt         |   3 +-
 .../contacts/fragments/MyViewPagerFragment.kt |   3 +-
 .../contacts/helpers/ContactsHelper.kt        |  53 +++++++++++++++++-
 .../contacts/helpers/DBHelper.kt              |   4 +-
 .../contacts/helpers/VcfImporter.kt           |  12 ++--
 .../contacts/models/Contact.kt                |   2 +-
 app/src/main/res/drawable-hdpi/ic_link.png    | Bin 0 -> 334 bytes
 app/src/main/res/drawable-xhdpi/ic_link.png   | Bin 0 -> 371 bytes
 app/src/main/res/drawable-xxhdpi/ic_link.png  | Bin 0 -> 537 bytes
 app/src/main/res/drawable-xxxhdpi/ic_link.png | Bin 0 -> 704 bytes
 10 files changed, 66 insertions(+), 11 deletions(-)
 create mode 100644 app/src/main/res/drawable-hdpi/ic_link.png
 create mode 100644 app/src/main/res/drawable-xhdpi/ic_link.png
 create mode 100644 app/src/main/res/drawable-xxhdpi/ic_link.png
 create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_link.png

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 8a77a161..6ba8d2f0 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt
@@ -467,7 +467,8 @@ class EditContactActivity : ContactActivity() {
         supportActionBar?.title = resources.getString(R.string.new_contact)
         val contactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE
         val organization = Organization("", "")
-        contact = Contact(0, "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), contactSource, 0, 0, "", null, "", ArrayList(), organization)
+        contact = Contact(0, "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), contactSource, 0, 0, "", null, "",
+                ArrayList(), organization, ArrayList())
         contact_source.text = getPublicContactSource(contact!!.source)
         contact_source.setOnClickListener {
             showContactSourcePicker(contact!!.source) {
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
index 7c3bd4cc..2bbcdd25 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt
@@ -240,7 +240,8 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet)
                         it.addresses.any { it.value.contains(text, true) } ||
                         it.notes.contains(text, true) ||
                         it.organization.company.contains(text, true) ||
-                        it.organization.jobPosition.contains(text, true)
+                        it.organization.jobPosition.contains(text, true) ||
+                        it.websites.any { it.contains(text, true) }
             } as ArrayList
 
             Contact.sorting = config.sorting
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 397a5937..8804a680 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt
@@ -87,8 +87,9 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                     val notes = ""
                     val groups = ArrayList<Group>()
                     val organization = Organization("", "")
+                    val websites = ArrayList<String>()
                     val contact = Contact(id, prefix, firstName, middleName, surname, suffix, photoUri, number, emails, addresses, events,
-                            accountName, starred, contactId, thumbnailUri, null, notes, groups, organization)
+                            accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites)
                     contacts.put(id, contact)
                 } while (cursor.moveToNext())
             }
@@ -139,6 +140,13 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
             val key = organizations.keyAt(i)
             contacts[key]?.organization = organizations.valueAt(i)
         }
+
+        val websites = getWebsites()
+        size = websites.size()
+        for (i in 0 until size) {
+            val key = websites.keyAt(i)
+            contacts[key]?.websites = websites.valueAt(i)
+        }
     }
 
     private fun getPhoneNumbers(contactId: Int? = null): SparseArray<ArrayList<PhoneNumber>> {
@@ -369,6 +377,46 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
         return organizations
     }
 
+    private fun getWebsites(contactId: Int? = null): SparseArray<ArrayList<String>> {
+        val websites = SparseArray<ArrayList<String>>()
+        val uri = ContactsContract.Data.CONTENT_URI
+        val projection = arrayOf(
+                ContactsContract.Data.RAW_CONTACT_ID,
+                CommonDataKinds.Website.URL
+        )
+
+        var selection = "${ContactsContract.Data.MIMETYPE} = ?"
+        var selectionArgs = arrayOf(CommonDataKinds.Website.CONTENT_ITEM_TYPE)
+
+        if (contactId != null) {
+            selection += " AND ${ContactsContract.Data.RAW_CONTACT_ID} = ?"
+            selectionArgs = arrayOf(CommonDataKinds.Website.CONTENT_ITEM_TYPE, contactId.toString())
+        }
+
+        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 url = cursor.getStringValue(CommonDataKinds.Website.URL) ?: continue
+
+                    if (websites[id] == null) {
+                        websites.put(id, ArrayList())
+                    }
+
+                    websites[id]!!.add(url)
+                } while (cursor.moveToNext())
+            }
+        } catch (e: Exception) {
+            activity.showErrorToast(e)
+        } finally {
+            cursor?.close()
+        }
+
+        return websites
+    }
+
     private fun getContactGroups(storedGroups: ArrayList<Group>, contactId: Int? = null): SparseArray<ArrayList<Group>> {
         val groups = SparseArray<ArrayList<Group>>()
         if (!activity.hasContactPermissions()) {
@@ -560,8 +608,9 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
                 val groups = getContactGroups(storedGroups, contactId)[contactId] ?: ArrayList()
                 val thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: ""
                 val organization = getOrganizations(id)[id] ?: Organization("", "")
+                val websites = getWebsites(id)[id] ?: ArrayList()
                 return Contact(id, prefix, firstName, middleName, surname, suffix, photoUri, number, emails, addresses, events, accountName,
-                        starred, contactId, thumbnailUri, null, notes, groups, organization)
+                        starred, contactId, thumbnailUri, null, notes, groups, organization, websites)
             }
         } 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 f16e2952..d0fe214e 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt
@@ -295,8 +295,10 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont
                 val jobPosition = cursor.getStringValue(COL_JOB_POSITION)
                 val organization = Organization(company, jobPosition)
 
+                val websites = ArrayList<String>()
+
                 val contact = Contact(id, prefix, firstName, middleName, surname, suffix, "", phoneNumbers, emails, addresses, events,
-                        SMT_PRIVATE, starred, id, "", photo, notes, groups, organization)
+                        SMT_PRIVATE, starred, id, "", photo, notes, groups, organization, websites)
                 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 ed998f9c..c1938d19 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt
@@ -26,13 +26,14 @@ class VcfImporter(val activity: SimpleActivity) {
     private var curSuffix = ""
     private var curPhotoUri = ""
     private var curNotes = ""
+    private var curCompany = ""
+    private var curJobPosition = ""
     private var curPhoneNumbers = ArrayList<PhoneNumber>()
     private var curEmails = ArrayList<Email>()
     private var curEvents = ArrayList<Event>()
     private var curAddresses = ArrayList<Address>()
     private var curGroups = ArrayList<Group>()
-    private var curCompany = ""
-    private var curJobPosition = ""
+    private var curWebsites = ArrayList<String>()
 
     private var isGettingPhoto = false
     private var currentPhotoString = StringBuilder()
@@ -253,7 +254,7 @@ class VcfImporter(val activity: SimpleActivity) {
     private fun saveContact(source: String) {
         val organization = Organization(curCompany, curJobPosition)
         val contact = Contact(0, curPrefix, curFirstName, curMiddleName, curSurname, curSuffix, curPhotoUri, curPhoneNumbers, curEmails, curAddresses, curEvents,
-                source, 0, 0, "", null, curNotes, curGroups, organization)
+                source, 0, 0, "", null, curNotes, curGroups, organization, curWebsites)
         if (ContactsHelper(activity).insertContact(contact)) {
             contactsImported++
         }
@@ -267,13 +268,14 @@ class VcfImporter(val activity: SimpleActivity) {
         curSuffix = ""
         curPhotoUri = ""
         curNotes = ""
+        curCompany = ""
+        curJobPosition = ""
         curPhoneNumbers = ArrayList()
         curEmails = ArrayList()
         curEvents = ArrayList()
         curAddresses = ArrayList()
         curGroups = ArrayList()
-        curCompany = ""
-        curJobPosition = ""
+        curWebsites = ArrayList()
 
         isGettingPhoto = false
         currentPhotoString = StringBuilder()
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 6ea68447..a4a422a3 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt
@@ -8,7 +8,7 @@ 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 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) : Comparable<Contact> {
+                   var groups: ArrayList<Group>, var organization: Organization, var websites: ArrayList<String>) : Comparable<Contact> {
     companion object {
         var sorting = 0
         var startWithSurname = false
diff --git a/app/src/main/res/drawable-hdpi/ic_link.png b/app/src/main/res/drawable-hdpi/ic_link.png
new file mode 100644
index 0000000000000000000000000000000000000000..cf0ce3836a2dea25cd9858ed215092f25716d3c3
GIT binary patch
literal 334
zcmV-U0kQsxP)<h;3K|Lk000e1NJLTq001Na001Ni1ONa4O9@aD0003MNkl<ZcmeIy
zziJdw9LLe$_!=UzB;~S=pqBdxDi(@vEiBkNEbA`QC!0T2LW(?6Ldb>~tpxD}EOab#
z?1s6pgELk_=KJYxabOtkjeh;^#ys-QLQypq!nk&_^xjjMs2A!zcY}0=5DKLG;$;)G
z3#}nI+yv!-b2D$esu~JmSUY*`gEPQP3K=LtE)y-v<e;>bLObACbm#=^rO+BY5LHD(
zQS}g9rO*$26SbNawZ7w53YGZ!Ptea4y2h>hojz><)+w|Pjzot}!77Ee{RXp^zyF>E
zC=F65%mEkXCf-(!gfOa|Onh_+$TwY)gU(lE)pTiJ_}m)$<e5mIq|6gj%fCD$Q;(aU
gk?!?S5B<N;AF~p0)4Lh@YybcN07*qoM6N<$g33^kod5s;

literal 0
HcmV?d00001

diff --git a/app/src/main/res/drawable-xhdpi/ic_link.png b/app/src/main/res/drawable-xhdpi/ic_link.png
new file mode 100644
index 0000000000000000000000000000000000000000..302e5d78c66bd23debab3f02638776558c351773
GIT binary patch
literal 371
zcmV-(0gV2MP)<h;3K|Lk000e1NJLTq001xm001xu1ONa4{R=S+0003xNkl<ZcmeIy
zF-qiM7{}okiwq9p;T9c~89dW240s1c%PoYx!4?ZzL<S8(y~04!JX@qP9|>#1RQvsZ
zU5Y&L6>sDnW_fvec^0nRtF`)zF8#G?cQzKHU+8z?L%MMQ;N5B*IC2e>0oXbk2Cf0H
z_vm-8=t{mn*?%GifC~VnGllp<g_RwEb17iq1Mt&QOz6Y|;7ySNSAcTj?>piJuug${
zz?qoQ8gQEeHP|O_KR)79#~M(jKnotlEFhGi83LYW1J9s2)DtbW;57yA04p)04d5mP
zHh`TIF|kt>;4%dk-T@C2iBrD-wIT(=3c!oCWATNSHYxz$hK}790FBb0UeT3&f7Sxv
z$Jn{v&OX=QlXKnc+}mWJ?jC0x2!*v<mFAy;#;Y5b3XuW_E(00JKnDH`;4fAJ%Imk3
R<?8?d002ovPDHLkV1gp^nMnWu

literal 0
HcmV?d00001

diff --git a/app/src/main/res/drawable-xxhdpi/ic_link.png b/app/src/main/res/drawable-xxhdpi/ic_link.png
new file mode 100644
index 0000000000000000000000000000000000000000..6845cbba5d4f5d8896f72dbda253e103f9813f30
GIT binary patch
literal 537
zcmV+!0_OdRP)<h;3K|Lk000e1NJLTq002k;002k`1ONa4|Kxkj0005tNkl<ZcmeI#
zy-Fit6o>JH`PfQByeuUa76IA9Ad7er5+q<@XE1`7um}rVY?|~TZ5ls7c1uYn-ar!K
zv(<2zz?n>R-oUcw_iv|oU=rqi#r;>DbIv*EoTJPE9R@_qu!s)JjEDg@)F>fo6YN!K
z@rL?LkeYBo<s(5yL;yJksS)+{f(qOL1PD?c3R!~+{D9y=a8Dsy&>hR>4C(UInCQ%B
zx(u1K>^4i#5lIg;*hX^L4ktX5R9_WTB|<G|QbclGi5Bmu5ta0yRwCys5@3x)QZp^6
z%v<u&K)XauDA_>=s0WI{g37$0_U)h!s(}RDDXMJ;4T#Omf7Y7J&(eZe-wuk14UwQh
z!XvS<9W*1>4Ib1ZHvK1pHvh_=vb?eZu{k?IgLbq1sBcgwNWh(;uI->2>X}looG<)A
z?WKJ>Ca6}hpes~F(GC(WQ12WE$@vDTb0jUO!YGk+Njc}2bp@zbw$p=zI!P~_Qq3i1
zmot8obeQD`+hN&)M|%7+COY$(9#1S-*3Np!zu(9q|2tdRuR*uLgW7DZcTub}3KsOr
z;YY606`D+P4~jTXyTz=&CG69t&zR|_f~Jh=bIsnWgR!vjd5{N%oCkT32YHYOd5{Nr
bkO%z*3sQ_1m6K7o00000NkvXXu0mjflS=WO

literal 0
HcmV?d00001

diff --git a/app/src/main/res/drawable-xxxhdpi/ic_link.png b/app/src/main/res/drawable-xxxhdpi/ic_link.png
new file mode 100644
index 0000000000000000000000000000000000000000..2f793953b187f8144bdea2f1193a3b81f63e34de
GIT binary patch
literal 704
zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z|`*P;uuoF`1Youw{)V+@sIlr
zH{S5vBD*T^Na%)EtzUL5tnsZc9=L`_$7)Bd77=$3<e2)bwqtgJZxUOl<W-f^+q37j
zA9?O~zS`yA{QFg>%}>TYkPGzETskEPN_>?FI<w&v=kqHWkCd*(%(`One1^>BB@;FX
zAIhEKs}+&Ny<zIj1dV+S{BJI@c<3-JIH<>5$f6U#>|w+3VA{{;tSL9xKZr4WnEWM}
z`QB&oJ?sZG_xf|52w?DM+-ARIG5ed#Cs`}`emtEKQ5;+EFpt~nW~bB!2kYrNhAn#@
zY|<%qwJr{1vI{y~c3de_r7<<)nOyYLe;*jDZ>*DW7rMiunsYmmxh*s4m%Er}h4K``
ztCBq88#-V16&^Xf??c1O=ot+nqCVXn%UNf5mF#3rGl-q^P3(fR<mD;W38I&U9u+b!
zJ0M%obnxe$dcDe$#WVWuFh1Y1%V7^2hilZ_oy=KVPF3@3Tv+vrFXPgy1Jwr<*GlCp
zJUIKmCGNIwOjnh#eDbL(UWx915@!>m+-&sPGmpv|^uFxkd6fBn$1#(ad>(~=v-UNc
z`nc}8!+3~oS+$w~|8FnZ%T_{a3f|1Yoq{S4dxH*!JP+Q%kSHEK^E_w$FVUQ6j~fk)
zc^hp7E=<0#cDI}CZQk04%q^9-G=&Yi_B=RtqR`iRb6|YV+e@AkncDx9`K;Nw&VGqQ
zr{A^-D;P8V;?J%=YIFA@b4#4|!Egt=Kc{1>Gt2g{=Un`|hq=#k)jg)X8NH7?R?g3T
z)yaP4r(=9gdrfoA@+lDx6H9-`UzdFl*QLqSXR+8z`C9{9=sAm|R?l6Jtkb^Q^LErr
fEnvinKFB-2vAFrLr|>W^WioiW`njxgN@xNALZvin

literal 0
HcmV?d00001


From 54df14442d51299f17b4b86faa44d39eb9ee78b3 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 13 Apr 2018 12:14:26 +0200
Subject: [PATCH 59/61] add website to the View screen

---
 .../activities/ViewContactActivity.kt         | 26 +++++++++++++++++++
 .../contacts/extensions/Context.kt            | 22 ++++++++++++----
 .../contacts/helpers/Constants.kt             |  1 +
 .../main/res/layout/activity_view_contact.xml | 21 ++++++++++++++-
 app/src/main/res/layout/item_website.xml      | 14 ++++++++++
 5 files changed, 78 insertions(+), 6 deletions(-)
 create mode 100644 app/src/main/res/layout/item_website.xml

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 c337c600..d47c2073 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_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_phone_number.view.*
+import kotlinx.android.synthetic.main.item_website.view.*
 
 class ViewContactActivity : ContactActivity() {
     private var isViewIntent = false
@@ -124,6 +125,7 @@ class ViewContactActivity : ContactActivity() {
         contact_source_image.applyColorFilter(textColor)
         contact_notes_image.applyColorFilter(textColor)
         contact_organization_image.applyColorFilter(textColor)
+        contact_websites_image.applyColorFilter(textColor)
         contact_groups_image.applyColorFilter(textColor)
 
         contact_send_sms.setOnClickListener { trySendSMS() }
@@ -180,6 +182,7 @@ class ViewContactActivity : ContactActivity() {
         setupEvents()
         setupNotes()
         setupOrganization()
+        setupWebsites()
         setupGroups()
     }
 
@@ -303,6 +306,29 @@ class ViewContactActivity : ContactActivity() {
         }
     }
 
+    private fun setupWebsites() {
+        contact_websites_holder.removeAllViews()
+        val websites = contact!!.websites
+        if (websites.isNotEmpty() && showFields and SHOW_WEBSITES_FIELD != 0) {
+            websites.forEach {
+                val url = it
+                layoutInflater.inflate(R.layout.item_website, contact_websites_holder, false).apply {
+                    contact_websites_holder.addView(this)
+                    contact_website.text = url
+
+                    setOnClickListener {
+                        openWebsiteIntent(url)
+                    }
+                }
+            }
+            contact_websites_image.beVisible()
+            contact_websites_holder.beVisible()
+        } else {
+            contact_websites_image.beGone()
+            contact_websites_holder.beGone()
+        }
+    }
+
     private fun setupGroups() {
         contact_groups_holder.removeAllViews()
         val groups = contact!!.groups
diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt
index 2507d169..dfcafded 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Context.kt
@@ -68,11 +68,23 @@ fun Context.sendAddressIntent(address: String) {
     val location = Uri.encode(address)
     val uri = Uri.parse("geo:0,0?q=$location")
 
-    val intent = Intent(Intent.ACTION_VIEW, uri)
-    if (intent.resolveActivity(packageManager) != null) {
-        startActivity(intent)
-    } else {
-        toast(R.string.no_app_found)
+    Intent(Intent.ACTION_VIEW, uri).apply {
+        if (resolveActivity(packageManager) != null) {
+            startActivity(this)
+        } else {
+            toast(R.string.no_app_found)
+        }
+    }
+}
+
+fun Context.openWebsiteIntent(url: String) {
+    Intent(Intent.ACTION_VIEW).apply {
+        data = Uri.parse(url)
+        if (resolveActivity(packageManager) != null) {
+            startActivity(this)
+        } else {
+            toast(R.string.no_app_found)
+        }
     }
 }
 
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 11084ef4..03e65cbe 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt
@@ -82,3 +82,4 @@ const val SHOW_NOTES_FIELD = 512
 const val SHOW_ORGANIZATION_FIELD = 1024
 const val SHOW_GROUPS_FIELD = 2048
 const val SHOW_CONTACT_SOURCE_FIELD = 4096
+const val SHOW_WEBSITES_FIELD = 8192
diff --git a/app/src/main/res/layout/activity_view_contact.xml b/app/src/main/res/layout/activity_view_contact.xml
index 523627b0..d72416a6 100644
--- a/app/src/main/res/layout/activity_view_contact.xml
+++ b/app/src/main/res/layout/activity_view_contact.xml
@@ -306,6 +306,25 @@
             android:paddingTop="@dimen/normal_margin"
             android:textSize="@dimen/bigger_text_size"/>
 
+        <ImageView
+            android:id="@+id/contact_websites_image"
+            android:layout_width="@dimen/contact_icons_size"
+            android:layout_height="@dimen/contact_icons_size"
+            android:layout_alignTop="@+id/contact_websites_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_link"/>
+
+        <LinearLayout
+            android:id="@+id/contact_websites_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/contact_organization_job_position"
+            android:layout_toRightOf="@+id/contact_name_image"
+            android:orientation="vertical"/>
+
         <ImageView
             android:id="@+id/contact_groups_image"
             android:layout_width="@dimen/contact_icons_size"
@@ -321,7 +340,7 @@
             android:id="@+id/contact_groups_holder"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_below="@+id/contact_organization_job_position"
+            android:layout_below="@+id/contact_websites_holder"
             android:layout_toRightOf="@+id/contact_name_image"
             android:orientation="vertical"
             android:paddingLeft="@dimen/small_margin"/>
diff --git a/app/src/main/res/layout/item_website.xml b/app/src/main/res/layout/item_website.xml
new file mode 100644
index 00000000..39d029bc
--- /dev/null
+++ b/app/src/main/res/layout/item_website.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.simplemobiletools.commons.views.MyTextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/contact_website"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_centerVertical="true"
+    android:background="?attr/selectableItemBackground"
+    android:paddingBottom="@dimen/normal_margin"
+    android:paddingLeft="@dimen/small_margin"
+    android:paddingRight="@dimen/small_margin"
+    android:paddingTop="@dimen/normal_margin"
+    android:text="@string/unknown"
+    android:textSize="@dimen/bigger_text_size"/>

From 8aadcb04c1ad6d1012253caff382a4491c2e99b0 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 13 Apr 2018 12:19:02 +0200
Subject: [PATCH 60/61] small code cleanup at the ViewContactActivity

---
 .../activities/ViewContactActivity.kt         | 59 +++++++++++--------
 1 file changed, 34 insertions(+), 25 deletions(-)

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 d47c2073..09ec8269 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt
@@ -138,6 +138,29 @@ class ViewContactActivity : ContactActivity() {
 
     private fun setupViewContact() {
         window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
+        setupFavorite()
+        setupNames()
+        setupPhoneNumbers()
+        setupEmails()
+        setupAddresses()
+        setupEvents()
+        setupNotes()
+        setupOrganization()
+        setupWebsites()
+        setupGroups()
+        setupContactSource()
+    }
+
+    private fun setupFavorite() {
+        contact_toggle_favorite.apply {
+            beVisible()
+            setImageDrawable(getStarDrawable(contact!!.starred == 1))
+            tag = contact!!.starred
+            applyColorFilter(config.textColor)
+        }
+    }
+
+    private fun setupNames() {
         contact!!.apply {
             contact_prefix.text = prefix
             contact_prefix.beVisibleIf(prefix.isNotEmpty() && showFields and SHOW_PREFIX_FIELD != 0)
@@ -158,32 +181,7 @@ class ViewContactActivity : ContactActivity() {
                 contact_name_image.beInvisible()
                 (contact_photo.layoutParams as RelativeLayout.LayoutParams).bottomMargin = resources.getDimension(R.dimen.medium_margin).toInt()
             }
-
-            if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) {
-                contact_source.text = getPublicContactSource(source)
-                contact_source_image.beVisible()
-                contact_source.beVisible()
-            } else {
-                contact_source_image.beGone()
-                contact_source.beGone()
-            }
         }
-
-        contact_toggle_favorite.apply {
-            beVisible()
-            setImageDrawable(getStarDrawable(contact!!.starred == 1))
-            tag = contact!!.starred
-            applyColorFilter(config.textColor)
-        }
-
-        setupPhoneNumbers()
-        setupEmails()
-        setupAddresses()
-        setupEvents()
-        setupNotes()
-        setupOrganization()
-        setupWebsites()
-        setupGroups()
     }
 
     private fun setupPhoneNumbers() {
@@ -348,5 +346,16 @@ class ViewContactActivity : ContactActivity() {
         }
     }
 
+    private fun setupContactSource() {
+        if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) {
+            contact_source.text = getPublicContactSource(contact!!.source)
+            contact_source_image.beVisible()
+            contact_source.beVisible()
+        } else {
+            contact_source_image.beGone()
+            contact_source.beGone()
+        }
+    }
+
     private fun getStarDrawable(on: Boolean) = resources.getDrawable(if (on) R.drawable.ic_star_on_big else R.drawable.ic_star_off_big)
 }

From 2fca861fc67100081770d9cac3073a6a895d4d91 Mon Sep 17 00:00:00 2001
From: tibbi <tibor@kaputa.sk>
Date: Fri, 13 Apr 2018 12:27:52 +0200
Subject: [PATCH 61/61] add websites to the list of available fields

---
 .../contacts/dialogs/ManageVisibleFieldsDialog.kt         | 1 +
 app/src/main/res/layout/dialog_manage_visible_fields.xml  | 8 ++++++++
 app/src/main/res/values-de/strings.xml                    | 3 ++-
 app/src/main/res/values-el/strings.xml                    | 7 ++++---
 app/src/main/res/values-fr/strings.xml                    | 3 ++-
 app/src/main/res/values-hr/strings.xml                    | 7 ++++---
 app/src/main/res/values-ko-rKR/strings.xml                | 3 ++-
 app/src/main/res/values-lt/strings.xml                    | 3 ++-
 app/src/main/res/values-pt/strings.xml                    | 3 ++-
 app/src/main/res/values-ru/strings.xml                    | 3 ++-
 app/src/main/res/values-sk/strings.xml                    | 3 ++-
 app/src/main/res/values-sv/strings.xml                    | 3 ++-
 app/src/main/res/values-zh-rTW/strings.xml                | 3 ++-
 app/src/main/res/values/strings.xml                       | 3 ++-
 14 files changed, 37 insertions(+), 16 deletions(-)

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 ff406346..cb0b8424 100644
--- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt
+++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt
@@ -25,6 +25,7 @@ class ManageVisibleFieldsDialog(val activity: BaseSimpleActivity) {
             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)
+            put(SHOW_WEBSITES_FIELD, R.id.manage_visible_fields_websites)
             put(SHOW_GROUPS_FIELD, R.id.manage_visible_fields_groups)
             put(SHOW_CONTACT_SOURCE_FIELD, R.id.manage_visible_fields_contact_source)
         }
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 718f2f5e..2b8bbf80 100644
--- a/app/src/main/res/layout/dialog_manage_visible_fields.xml
+++ b/app/src/main/res/layout/dialog_manage_visible_fields.xml
@@ -102,6 +102,14 @@
             android:paddingTop="@dimen/activity_margin"
             android:text="@string/organization"/>
 
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/manage_visible_fields_websites"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/websites"/>
+
         <com.simplemobiletools.commons.views.MyAppCompatCheckbox
             android:id="@+id/manage_visible_fields_groups"
             android:layout_width="match_parent"
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 4e108601..d8499871 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -8,6 +8,7 @@
     <string name="phone_storage_hidden">Gerätespeicher (nicht sichtbar für andere Apps)</string>
     <string name="company">Company</string>
     <string name="job_position">Job position</string>
+    <string name="website">Website</string>
 
     <string name="new_contact">Neuer Kontakt</string>
     <string name="edit_contact">Kontakt bearbeiten</string>
@@ -92,7 +93,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
-    <string name="website">Website</string>
+    <string name="websites">Websites</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 3fbdb241..d7b4b75f 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -2,12 +2,13 @@
     <string name="app_name">Απλές Επαφές</string>
     <string name="app_launcher_name">Επαφές</string>
     <string name="address">Διεύθυνση</string>
-    <string name="inserting">Εισαγωγή...</string>
-    <string name="updating">Ενημέρωση...</string>
+    <string name="inserting">Εισαγωγή…</string>
+    <string name="updating">Ενημέρωση…</string>
     <string name="phone_storage">Μνήμη τηλεφώνου</string>
     <string name="phone_storage_hidden">Μνήμη τηλεφώνου (δεν είναι ορατή από άλλες εφαρμογές)</string>
     <string name="company">Company</string>
     <string name="job_position">Job position</string>
+    <string name="website">Website</string>
 
     <string name="new_contact">Νέα επαφή</string>
     <string name="edit_contact">Επεξεργασία επαφής</string>
@@ -92,7 +93,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
-    <string name="website">Website</string>
+    <string name="websites">Websites</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index 37b5e590..9fb63361 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -8,6 +8,7 @@
     <string name="phone_storage_hidden">Stockage du téléphone (non visible par d\'autres applis)</string>
     <string name="company">Société</string>
     <string name="job_position">Poste</string>
+    <string name="website">Website</string>
 
     <string name="new_contact">Nouveau contact</string>
     <string name="edit_contact">Modifier contact</string>
@@ -92,7 +93,7 @@
     <string name="events">Évènements (naissances, anniversaires)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organisation</string>
-    <string name="website">Website</string>
+    <string name="websites">Websites</string>
     <string name="groups">Groupe</string>
     <string name="contact_source">Source du contact</string>
 
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 41286f5c..76955392 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -2,12 +2,13 @@
     <string name="app_name">Jednostavni kontakti</string>
     <string name="app_launcher_name">Kontakti</string>
     <string name="address">Adresa</string>
-    <string name="inserting">Dodavanje...</string>
-    <string name="updating">Ažuriranje...</string>
+    <string name="inserting">Dodavanje…</string>
+    <string name="updating">Ažuriranje…</string>
     <string name="phone_storage">Pohrana na telefonu</string>
     <string name="phone_storage_hidden">Pohrana na telefonu (nije vidljiva drugim aplikacijama))</string>
     <string name="company">Company</string>
     <string name="job_position">Job position</string>
+    <string name="website">Website</string>
 
     <string name="new_contact">Novi kontakt</string>
     <string name="edit_contact">Uredi kontakt</string>
@@ -92,7 +93,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
-    <string name="website">Website</string>
+    <string name="websites">Websites</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml
index 4ed26e91..7ccd0798 100644
--- a/app/src/main/res/values-ko-rKR/strings.xml
+++ b/app/src/main/res/values-ko-rKR/strings.xml
@@ -8,6 +8,7 @@
     <string name="phone_storage_hidden">Phone storage (not visible by other apps)</string>
     <string name="company">Company</string>
     <string name="job_position">Job position</string>
+    <string name="website">Website</string>
 
     <string name="new_contact">새로운 연락처</string>
     <string name="edit_contact">연락처 수정</string>
@@ -92,7 +93,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
-    <string name="website">Website</string>
+    <string name="websites">Websites</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index 18738019..164db0a4 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -8,6 +8,7 @@
     <string name="phone_storage_hidden">Telefono atmintis (nematoma kitų programėlių)</string>
     <string name="company">Company</string>
     <string name="job_position">Job position</string>
+    <string name="website">Website</string>
 
     <string name="new_contact">Naujas kontaktas</string>
     <string name="edit_contact">Redaguoti kontaktą</string>
@@ -92,7 +93,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
-    <string name="website">Website</string>
+    <string name="websites">Websites</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index d1a1744e..56d5f5fe 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -8,6 +8,7 @@
     <string name="phone_storage_hidden">Armazenamento do telefone (não visível por outras alicações)</string>
     <string name="company">Organização</string>
     <string name="job_position">Cargo</string>
+    <string name="website">Website</string>
 
     <string name="new_contact">Novo contacto</string>
     <string name="edit_contact">Editar contacto</string>
@@ -92,7 +93,7 @@
     <string name="events">Eventos (data de nascimento, aniversário)</string>
     <string name="notes">Notas</string>
     <string name="organization">Organização</string>
-    <string name="website">Website</string>
+    <string name="websites">Websites</string>
     <string name="groups">Grupos</string>
     <string name="contact_source">Fonte do contacto</string>
 
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index 2b67667d..58db5503 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -8,6 +8,7 @@
     <string name="phone_storage_hidden">Память устройства (не видна другим приложениям)</string>
     <string name="company">Company</string>
     <string name="job_position">Job position</string>
+    <string name="website">Website</string>
 
     <string name="new_contact">Новый контакт</string>
     <string name="edit_contact">Редактировать контакт</string>
@@ -92,7 +93,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
-    <string name="website">Website</string>
+    <string name="websites">Websites</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index bf0695b5..be962c4e 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -8,6 +8,7 @@
     <string name="phone_storage_hidden">Úložisko mobilu (neviditeľné pre ostatné apky)</string>
     <string name="company">Firma</string>
     <string name="job_position">Pracovná pozícia</string>
+    <string name="website">Website</string>
 
     <string name="new_contact">Nový kontakt</string>
     <string name="edit_contact">Upraviť kontakt</string>
@@ -92,7 +93,7 @@
     <string name="events">Udalosti (narodeniny, výročia)</string>
     <string name="notes">Poznámky</string>
     <string name="organization">Firma</string>
-    <string name="website">Webstránka</string>
+    <string name="websites">Webstránky</string>
     <string name="groups">Skupiny</string>
     <string name="contact_source">Zdroje kontaktov</string>
 
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 6f7a93c0..4fa202ed 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -8,6 +8,7 @@
     <string name="phone_storage_hidden">Telefonens lagringsutrymme (inte synligt för andra appar)</string>
     <string name="company">Company</string>
     <string name="job_position">Job position</string>
+    <string name="website">Website</string>
 
     <string name="new_contact">Ny kontakt</string>
     <string name="edit_contact">Redigera kontakt</string>
@@ -92,7 +93,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
-    <string name="website">Website</string>
+    <string name="websites">Websites</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>
 
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index f515af04..e10f2970 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -8,6 +8,7 @@
     <string name="phone_storage_hidden">手機空間 (其他程式不可見)</string>
     <string name="company">公司</string>
     <string name="job_position">職位</string>
+    <string name="website">Website</string>
 
     <string name="new_contact">新聯絡人</string>
     <string name="edit_contact">編輯聯絡人</string>
@@ -92,7 +93,7 @@
     <string name="events">活動 (生日、紀念日)</string>
     <string name="notes">筆記</string>
     <string name="organization">組織</string>
-    <string name="website">Website</string>
+    <string name="websites">Websites</string>
     <string name="groups">群組</string>
     <string name="contact_source">聯絡人來源</string>
 
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 35751adc..a62b2013 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -8,6 +8,7 @@
     <string name="phone_storage_hidden">Phone storage (not visible by other apps)</string>
     <string name="company">Company</string>
     <string name="job_position">Job position</string>
+    <string name="website">Website</string>
 
     <string name="new_contact">New contact</string>
     <string name="edit_contact">Edit contact</string>
@@ -92,7 +93,7 @@
     <string name="events">Events (birthdays, anniversaries)</string>
     <string name="notes">Notes</string>
     <string name="organization">Organization</string>
-    <string name="website">Website</string>
+    <string name="websites">Websites</string>
     <string name="groups">Groups</string>
     <string name="contact_source">Contact source</string>