From 222abd75d39b6e290f80eee53102a57185e30783 Mon Sep 17 00:00:00 2001 From: fricyo <30796677+fricyo@users.noreply.github.com> Date: Wed, 4 Sep 2019 09:34:10 +0800 Subject: [PATCH 01/48] Update Translation --- app/src/main/res/values-zh-rTW/strings.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 99febf65..c3a21967 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -145,17 +145,17 @@ 黑名單 - Are you sure you want to delete %s? + 你確認要刪除 %s 嗎? - %d contact - %d contacts + %d個聯絡人 + %d個聯絡人 - %d group - %d groups + %d個群組 + %d個群組 From 8e66d229fc9de31e35b85a527b26b3d395f5364b Mon Sep 17 00:00:00 2001 From: zmni Date: Wed, 4 Sep 2019 23:58:52 +0700 Subject: [PATCH 02/48] Update Indonesian translation --- app/src/main/res/values-id/strings.xml | 12 ++++++------ app/src/main/res/values-in/strings.xml | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index dcfb6b60..5bf89a65 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -96,7 +96,7 @@ Cari kontak Cari favorit - Search groups + Cari grup Impor kontak @@ -145,17 +145,17 @@ Nomor yang diblokir - Are you sure you want to delete %s? + Apakah anda yakin ingin menghapus %s? - %d contact - %d contacts + %d kontak + %d kontak - %d group - %d groups + %d grup + %d grup diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index dcfb6b60..5bf89a65 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -96,7 +96,7 @@ Cari kontak Cari favorit - Search groups + Cari grup Impor kontak @@ -145,17 +145,17 @@ Nomor yang diblokir - Are you sure you want to delete %s? + Apakah anda yakin ingin menghapus %s? - %d contact - %d contacts + %d kontak + %d kontak - %d group - %d groups + %d grup + %d grup From f25b7035e75d5cf72128beddab72eda1fffc7cd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Sat, 7 Sep 2019 01:25:59 +0100 Subject: [PATCH 03/48] Update strings.xml --- app/src/main/res/values-pt/strings.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 82a67c4d..f9c2752c 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -14,7 +14,7 @@ Enviar SMS para o grupo Enviar e-mail para o grupo Ligar a %s - Pedir a permissão necessária + Pedir permissão necessária Criar novo contacto Adicionar a contacto existente Tem que tornar esta a aplicação padrão para poder bloquear números. @@ -96,7 +96,7 @@ Pesquisar nos contactos Pesquisar nos favoritos - Search groups + Pesquisar nos grupos Importar contactos @@ -145,17 +145,17 @@ Números bloqueados - Are you sure you want to delete %s? + Tem a certeza de que deseja apagar %s? - %d contact - %d contacts + %d contacto + %d contactos - %d group - %d groups + %d grupo + %d grupos From 3603d926745ec5412dfa451757bf2d00c1b8ba1b Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 9 Sep 2019 10:31:39 +0200 Subject: [PATCH 04/48] update commons to 5.17.13 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0fa1c71d..25bae7b5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,7 +51,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.16.17' + implementation 'com.simplemobiletools:commons:5.17.13' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.5' From e3712ca22380fa599006c100f4495434c6801feb Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 9 Sep 2019 11:50:46 +0200 Subject: [PATCH 05/48] properly show contact avatars at SelectContact activity --- .../contacts/pro/activities/ContactActivity.kt | 2 +- .../simplemobiletools/contacts/pro/activities/MainActivity.kt | 4 ++-- .../contacts/pro/activities/SelectContactActivity.kt | 2 +- .../contacts/pro/adapters/ContactsAdapter.kt | 2 +- .../contacts/pro/adapters/SelectContactsAdapter.kt | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt index 84e2c247..d0067c4e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt @@ -51,7 +51,7 @@ abstract class ContactActivity : SimpleActivity() { .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .centerCrop() - if (isDestroyed) { + if (isDestroyed || isFinishing) { return } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index 37edb2b6..bfb8b4e5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -527,7 +527,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } override fun refreshContacts(refreshTabsMask: Int) { - if (isDestroyed || isGettingContacts) { + if (isDestroyed || isFinishing || isGettingContacts) { return } @@ -540,7 +540,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { ContactsHelper(this).getContacts { contacts -> isGettingContacts = false - if (isDestroyed) { + if (isDestroyed || isFinishing) { return@getContacts } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt index 670e8486..5199c704 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SelectContactActivity.kt @@ -84,7 +84,7 @@ class SelectContactActivity : SimpleActivity() { private fun initContacts() { ContactsHelper(this).getContacts { - if (isDestroyed) { + if (isDestroyed || isFinishing) { return@getContacts } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt index c1e19c88..6aba7e95 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt @@ -265,7 +265,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList Date: Mon, 9 Sep 2019 13:41:13 +0200 Subject: [PATCH 06/48] change the way contact sources are added, to allow multiple ones --- .../pro/activities/ViewContactActivity.kt | 19 +++++++++++------- .../main/res/layout/activity_view_contact.xml | 20 ++++++------------- .../res/layout/item_view_contact_source.xml | 15 ++++++++++++++ 3 files changed, 33 insertions(+), 21 deletions(-) create mode 100644 app/src/main/res/layout/item_view_contact_source.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 6c92f793..aeee4c3b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -19,6 +19,7 @@ import com.simplemobiletools.contacts.pro.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.* +import kotlinx.android.synthetic.main.item_view_contact_source.view.* import kotlinx.android.synthetic.main.item_view_email.view.* import kotlinx.android.synthetic.main.item_view_group.view.* import kotlinx.android.synthetic.main.item_view_im.view.* @@ -200,7 +201,7 @@ class ViewContactActivity : ContactActivity() { setupOrganization() setupWebsites() setupGroups() - setupContactSource() + setupContactSource(contact!!.source) } private fun editContact() { @@ -468,17 +469,21 @@ class ViewContactActivity : ContactActivity() { } } - private fun setupContactSource() { + private fun setupContactSource(source: String) { if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) { - getPublicContactSource(contact!!.source) { - contact_source.text = it - contact_source.copyOnLongClick(it) + layoutInflater.inflate(R.layout.item_view_contact_source, contact_sources_holder, false).apply { + getPublicContactSource(source) { + contact_source.text = it + contact_source.copyOnLongClick(it) + contact_sources_holder.addView(this) + } } + contact_source_image.beVisible() - contact_source.beVisible() + contact_sources_holder.beVisible() } else { contact_source_image.beGone() - contact_source.beGone() + contact_sources_holder.beGone() } } diff --git a/app/src/main/res/layout/activity_view_contact.xml b/app/src/main/res/layout/activity_view_contact.xml index dc0ac540..8c482eaa 100644 --- a/app/src/main/res/layout/activity_view_contact.xml +++ b/app/src/main/res/layout/activity_view_contact.xml @@ -389,28 +389,20 @@ android:id="@+id/contact_source_image" android:layout_width="@dimen/contact_icons_size" android:layout_height="@dimen/contact_icons_size" - android:layout_alignTop="@+id/contact_source" + android:layout_alignTop="@+id/contact_sources_holder" android:paddingTop="@dimen/medium_margin" android:paddingEnd="@dimen/small_margin" android:paddingBottom="@dimen/small_margin" android:src="@drawable/ic_account_box_vector"/> - + android:orientation="vertical" + android:paddingStart="@dimen/small_margin"/> diff --git a/app/src/main/res/layout/item_view_contact_source.xml b/app/src/main/res/layout/item_view_contact_source.xml new file mode 100644 index 00000000..cfa4fda6 --- /dev/null +++ b/app/src/main/res/layout/item_view_contact_source.xml @@ -0,0 +1,15 @@ + + From c1db2701d8dada866204d877a540371db4e160f2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 9 Sep 2019 15:19:07 +0200 Subject: [PATCH 07/48] show all contact sources of a given contact at View screen --- .../pro/activities/ViewContactActivity.kt | 15 +++++++++++++-- .../contacts/pro/models/Contact.kt | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index aeee4c3b..77e7a8da 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -113,6 +113,17 @@ class ViewContactActivity : ContactActivity() { if (contactId != 0 && !wasLookupKeyUsed) { contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) + + if (contact != null) { + ContactsHelper(this).getContacts { contacts -> + contacts.forEach { + if (it.id != contact!!.id && it.getHashToCompare() == contact!!.getHashToCompare()) { + addContactSource(it.source) + } + } + } + } + if (contact == null) { if (!wasEditLaunched) { toast(R.string.unknown_error_occurred) @@ -201,7 +212,7 @@ class ViewContactActivity : ContactActivity() { setupOrganization() setupWebsites() setupGroups() - setupContactSource(contact!!.source) + addContactSource(contact!!.source) } private fun editContact() { @@ -469,7 +480,7 @@ class ViewContactActivity : ContactActivity() { } } - private fun setupContactSource(source: String) { + private fun addContactSource(source: String) { if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) { layoutInflater.inflate(R.layout.item_view_contact_source, contact_sources_holder, false).apply { getPublicContactSource(source) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt index 1662cf78..df352182 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/models/Contact.kt @@ -112,7 +112,7 @@ data class Contact(var id: Int, var prefix: String, var firstName: String, var m emails.mapTo(newEmails) { Email(it.value, 0, "") } return copy(id = 0, prefix = "", firstName = getNameToDisplay().toLowerCase(), middleName = "", surname = "", suffix = "", nickname = "", photoUri = "", - phoneNumbers = ArrayList(), events = ArrayList(), addresses = ArrayList(), emails = newEmails, starred = 0, contactId = 0, + phoneNumbers = ArrayList(), events = ArrayList(), source = "", addresses = ArrayList(), emails = newEmails, starred = 0, contactId = 0, thumbnailUri = "", notes = "", groups = ArrayList(), websites = ArrayList(), organization = Organization("", ""), IMs = ArrayList()).toString() } From 92288db1979e6937d9f5c49ffff141cdda9a609b Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 9 Sep 2019 15:24:41 +0200 Subject: [PATCH 08/48] avoid showing the same contact sources multiple times --- .../pro/activities/ViewContactActivity.kt | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 77e7a8da..353d6040 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -114,16 +114,6 @@ class ViewContactActivity : ContactActivity() { if (contactId != 0 && !wasLookupKeyUsed) { contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) - if (contact != null) { - ContactsHelper(this).getContacts { contacts -> - contacts.forEach { - if (it.id != contact!!.id && it.getHashToCompare() == contact!!.getHashToCompare()) { - addContactSource(it.source) - } - } - } - } - if (contact == null) { if (!wasEditLaunched) { toast(R.string.unknown_error_occurred) @@ -212,7 +202,7 @@ class ViewContactActivity : ContactActivity() { setupOrganization() setupWebsites() setupGroups() - addContactSource(contact!!.source) + addContactSources() } private fun editContact() { @@ -480,6 +470,22 @@ class ViewContactActivity : ContactActivity() { } } + private fun addContactSources() { + contact_sources_holder.removeAllViews() + addContactSource(contact!!.source) + ensureBackgroundThread { + ContactsHelper(this).getContacts { contacts -> + contacts.forEach { + if (it.id != contact!!.id && it.getHashToCompare() == contact!!.getHashToCompare()) { + runOnUiThread { + addContactSource(it.source) + } + } + } + } + } + } + private fun addContactSource(source: String) { if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) { layoutInflater.inflate(R.layout.item_view_contact_source, contact_sources_holder, false).apply { From 79cc8d028de48fd9733081e686d10733f9159d10 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 9 Sep 2019 16:04:02 +0200 Subject: [PATCH 09/48] launch the given contact at clicking on a contact source at View screen --- .../pro/activities/ViewContactActivity.kt | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 353d6040..2e411daf 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -16,6 +16,7 @@ import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog import com.simplemobiletools.contacts.pro.extensions.* import com.simplemobiletools.contacts.pro.helpers.* +import com.simplemobiletools.contacts.pro.models.Contact 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.* @@ -78,7 +79,7 @@ class ViewContactActivity : ContactActivity() { } when (item.itemId) { - R.id.edit -> editContact() + R.id.edit -> launchEditContact(contact!!) R.id.share -> shareContact() R.id.open_with -> openWith() R.id.delete -> deleteContact() @@ -205,9 +206,9 @@ class ViewContactActivity : ContactActivity() { addContactSources() } - private fun editContact() { + private fun launchEditContact(contact: Contact) { wasEditLaunched = true - editContact(contact!!) + editContact(contact) } private fun openWith() { @@ -472,13 +473,13 @@ class ViewContactActivity : ContactActivity() { private fun addContactSources() { contact_sources_holder.removeAllViews() - addContactSource(contact!!.source) + addContactSource(contact!!) ensureBackgroundThread { ContactsHelper(this).getContacts { contacts -> contacts.forEach { if (it.id != contact!!.id && it.getHashToCompare() == contact!!.getHashToCompare()) { runOnUiThread { - addContactSource(it.source) + addContactSource(it) } } } @@ -486,13 +487,17 @@ class ViewContactActivity : ContactActivity() { } } - private fun addContactSource(source: String) { + private fun addContactSource(contact: Contact) { if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) { layoutInflater.inflate(R.layout.item_view_contact_source, contact_sources_holder, false).apply { - getPublicContactSource(source) { + getPublicContactSource(contact.source) { contact_source.text = it contact_source.copyOnLongClick(it) contact_sources_holder.addView(this) + + contact_source.setOnClickListener { + launchEditContact(contact) + } } } From dcd546b7cb1c1fed666cd3e9f23b6bbbfb88c60a Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 11 Sep 2019 21:50:00 +0200 Subject: [PATCH 10/48] avoid refreshing contact sources multiple times --- .../contacts/pro/activities/ViewContactActivity.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 2e411daf..7286dde5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -472,7 +472,10 @@ class ViewContactActivity : ContactActivity() { } private fun addContactSources() { - contact_sources_holder.removeAllViews() + if (contact_sources_holder.childCount > 0) { + return + } + addContactSource(contact!!) ensureBackgroundThread { ContactsHelper(this).getContacts { contacts -> From 797df0a2d7025405012ba4ef51e83e24059bfcd0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 11 Sep 2019 22:49:19 +0200 Subject: [PATCH 11/48] adding a helper function for retrieving contact duplicates --- .../contacts/pro/activities/ViewContactActivity.kt | 10 +++------- .../contacts/pro/helpers/ContactsHelper.kt | 9 +++++++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 7286dde5..22acb921 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -477,14 +477,10 @@ class ViewContactActivity : ContactActivity() { } addContactSource(contact!!) - ensureBackgroundThread { - ContactsHelper(this).getContacts { contacts -> + ContactsHelper(this).getDuplicatesOfContact(contact!!) { contacts -> + runOnUiThread { contacts.forEach { - if (it.id != contact!!.id && it.getHashToCompare() == contact!!.getHashToCompare()) { - runOnUiThread { - addContactSource(it) - } - } + addContactSource(it) } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 30d247d9..55a58655 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -1561,4 +1561,13 @@ class ContactsHelper(val context: Context) { context.showErrorToast(e) } } + + fun getDuplicatesOfContact(contact: Contact, callback: (ArrayList) -> Unit) { + ensureBackgroundThread { + getContacts { contacts -> + val duplicates = contacts.filter { it.id != contact.id && it.getHashToCompare() == contact.getHashToCompare() }.toMutableList() as ArrayList + callback(duplicates) + } + } + } } From 8fdb6ee0a8cde467a06b46828def3b195d2ea277 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 11 Sep 2019 23:07:53 +0200 Subject: [PATCH 12/48] at deleting a contact delete all duplicates too --- .../pro/activities/ViewContactActivity.kt | 2 +- .../contacts/pro/helpers/ContactsHelper.kt | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 22acb921..0c8f37b2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -477,7 +477,7 @@ class ViewContactActivity : ContactActivity() { } addContactSource(contact!!) - ContactsHelper(this).getDuplicatesOfContact(contact!!) { contacts -> + ContactsHelper(this).getDuplicatesOfContact(contact!!, false) { contacts -> runOnUiThread { contacts.forEach { addContactSource(it) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 55a58655..b8f461ee 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -1524,13 +1524,9 @@ class ContactsHelper(val context: Context) { LocalContactsHelper(context).toggleFavorites(localContacts, addToFavorites) } - fun deleteContact(contact: Contact) { - ensureBackgroundThread { - if (contact.isPrivate()) { - context.contactsDB.deleteContactId(contact.id) - } else { - deleteContacts(arrayListOf(contact)) - } + fun deleteContact(originalContact: Contact) { + getDuplicatesOfContact(originalContact, true) { contacts -> + deleteContacts(contacts) } } @@ -1562,10 +1558,13 @@ class ContactsHelper(val context: Context) { } } - fun getDuplicatesOfContact(contact: Contact, callback: (ArrayList) -> Unit) { + fun getDuplicatesOfContact(contact: Contact, addOriginal: Boolean, callback: (ArrayList) -> Unit) { ensureBackgroundThread { getContacts { contacts -> val duplicates = contacts.filter { it.id != contact.id && it.getHashToCompare() == contact.getHashToCompare() }.toMutableList() as ArrayList + if (addOriginal) { + duplicates.add(contact) + } callback(duplicates) } } From 415ef33c0989dbf554b49edf92725f573951b005 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 12 Sep 2019 12:16:17 +0200 Subject: [PATCH 13/48] adding a new string related to deleting contacts from all sources --- app/src/main/res/values-ar/strings.xml | 1 + app/src/main/res/values-az/strings.xml | 1 + app/src/main/res/values-cy/strings.xml | 1 + app/src/main/res/values-da/strings.xml | 1 + app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-eu/strings.xml | 1 + app/src/main/res/values-fi/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-hu/strings.xml | 1 + app/src/main/res/values-id/strings.xml | 1 + app/src/main/res/values-in/strings.xml | 1 + app/src/main/res/values-it/strings.xml | 1 + app/src/main/res/values-ja/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-nl/strings.xml | 1 + app/src/main/res/values-pl/strings.xml | 1 + app/src/main/res/values-pt-rBR/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-tr/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 29 files changed, 29 insertions(+) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 07c24211..3ea074e5 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 63ddbdaa..aa52c89e 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index 6212f761..de7f3c65 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 4e7e5a01..f891f9fb 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 69f542bd..d8f849d1 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index e7a49e29..e18d794d 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -146,6 +146,7 @@ Θέλετε σίγουρα να διαγράψετε %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 3a876325..19911d33 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 622c5425..fe02fd4c 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 65551d6f..b76250a9 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 1f62984b..4e15f891 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 46f82306..bd713247 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 5bf89a65..56728db2 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -146,6 +146,7 @@ Apakah anda yakin ingin menghapus %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 5bf89a65..56728db2 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -146,6 +146,7 @@ Apakah anda yakin ingin menghapus %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f330ea8c..ec316575 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 753fdfe5..54cb93c8 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 5088238d..6bb3d023 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 6aa55c79..3accc57f 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 5e316618..a9427e5b 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -146,6 +146,7 @@ %s verwijderen? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index a33e8e1d..8b7542a0 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 616c1a33..b303ec46 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index f9c2752c..ddb3ac7a 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -146,6 +146,7 @@ Tem a certeza de que deseja apagar %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index b6f4e0be..859df53f 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -146,6 +146,7 @@ Вы уверены, что хотите удалить %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 293d5b26..c289ff6b 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -146,6 +146,7 @@ Ste si istý, že chcete vymazať %s? + Kontakt bude vymazaný zo všetkých zdrojov kontaktov. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 9e85a22b..eea4c810 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d0bdd0e2..1505b03e 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 8cf27893..617256c3 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 661e6c3c..0699b165 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index c3a21967..2d97e6f5 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -146,6 +146,7 @@ 你確認要刪除 %s 嗎? + The contact will be removed from all contact sources. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8e28dcb8..b4c9f6ad 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -146,6 +146,7 @@ Are you sure you want to delete %s? + The contact will be removed from all contact sources. From aa4ee0cdc9af53dd73794ef16d862683fefba8ff Mon Sep 17 00:00:00 2001 From: spkprs Date: Thu, 12 Sep 2019 15:12:34 +0300 Subject: [PATCH 14/48] Update strings.xml --- app/src/main/res/values-el/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index e18d794d..b8d1802b 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -146,7 +146,7 @@ Θέλετε σίγουρα να διαγράψετε %s? - The contact will be removed from all contact sources. + Η επαφή θα καταργηθεί από όλες τις πηγές επαφών. From 3d24a8424852220fc4917d018f7e6a331347fc75 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 12 Sep 2019 14:44:37 +0200 Subject: [PATCH 15/48] delete contacts from all sources at deleting from the main screen --- .../contacts/pro/adapters/ContactsAdapter.kt | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt index 6aba7e95..38cd82b4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt @@ -176,16 +176,23 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList + ensureBackgroundThread { + contactsToRemove.forEach { + val contactToRemove = it + val duplicates = allContacts.filter { it.id != contactToRemove.id && it.getHashToCompare() == contactToRemove.getHashToCompare() }.toMutableList() as ArrayList + duplicates.add(contactToRemove) + ContactsHelper(activity).deleteContacts(duplicates) + } - activity.runOnUiThread { - if (contactItems.isEmpty()) { - refreshListener?.refreshContacts(ALL_TABS_MASK) - finishActMode() - } else { - removeSelectedItems(positions) - refreshListener?.refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK) + activity.runOnUiThread { + if (contactItems.isEmpty()) { + refreshListener?.refreshContacts(ALL_TABS_MASK) + finishActMode() + } else { + removeSelectedItems(positions) + refreshListener?.refreshContacts(CONTACTS_TAB_MASK or FAVORITES_TAB_MASK) + } } } } From aaaa18009a4f906da403611cc455fdf8f017ca1e Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 12 Sep 2019 14:44:42 +0200 Subject: [PATCH 16/48] renaming a parameter --- .../contacts/pro/helpers/ContactsHelper.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index b8f461ee..8085c5ed 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -28,12 +28,12 @@ class ContactsHelper(val context: Context) { private val BATCH_SIZE = 50 private var displayContactSources = ArrayList() - fun getContacts(isExporting: Boolean = false, ignoredContactSources: HashSet = HashSet(), callback: (ArrayList) -> Unit) { + fun getContacts(getAll: Boolean = false, ignoredContactSources: HashSet = HashSet(), callback: (ArrayList) -> Unit) { ensureBackgroundThread { val contacts = SparseArray() displayContactSources = context.getVisibleContactSources() - if (isExporting) { + if (getAll) { displayContactSources = if (ignoredContactSources.isEmpty()) { context.getAllContactSources().map { it.getFullIdentifier() }.toMutableList() as ArrayList } else { @@ -66,7 +66,7 @@ class ContactsHelper(val context: Context) { contacts.valueAt(it) } - if (ignoredContactSources.isEmpty() && context.config.filterDuplicates && !isExporting) { + if (ignoredContactSources.isEmpty() && context.config.filterDuplicates && !getAll) { tempContacts = tempContacts.distinctBy { it.getHashToCompare() } as ArrayList From ceb1ed8da0c15165210206a4dc014c114681ea38 Mon Sep 17 00:00:00 2001 From: Guillaume Date: Thu, 12 Sep 2019 23:50:18 +0200 Subject: [PATCH 17/48] Dutch --- app/src/main/res/values-nl/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index a9427e5b..2d72e6bd 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -146,7 +146,7 @@ %s verwijderen? - The contact will be removed from all contact sources. + De contactpersoon zal worden verwijderd uit alle accounts. From ed6373aed4d59c0d2bf12ed392c48b08c00f1b47 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Sep 2019 09:59:02 +0200 Subject: [PATCH 18/48] update commons to 5.17.16 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 25bae7b5..e1bf018e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,7 +51,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.17.13' + implementation 'com.simplemobiletools:commons:5.17.16' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.5' From 33357e14133c7ec550921c17fe5fd2fd45e801ff Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Sep 2019 10:39:51 +0200 Subject: [PATCH 19/48] show a warning about deleting from all sources at the View screen --- .../pro/activities/ViewContactActivity.kt | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 0c8f37b2..b8c10d60 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -9,6 +9,7 @@ import android.view.View import android.view.WindowManager import android.widget.RelativeLayout import com.bumptech.glide.Glide +import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.commons.helpers.ensureBackgroundThread @@ -82,7 +83,7 @@ class ViewContactActivity : ContactActivity() { R.id.edit -> launchEditContact(contact!!) R.id.share -> shareContact() R.id.open_with -> openWith() - R.id.delete -> deleteContact() + R.id.delete -> deleteContactFromAllSources() else -> return super.onOptionsItemSelected(item) } return true @@ -508,6 +509,22 @@ class ViewContactActivity : ContactActivity() { } } + private fun deleteContactFromAllSources() { + val addition = if (contact_sources_holder.childCount > 1) { + "\n\n${getString(R.string.delete_from_all_sources)}" + } else { + "" + } + + val message = "${getString(R.string.proceed_with_deletion)}$addition" + ConfirmationDialog(this, message) { + if (contact != null) { + ContactsHelper(this).deleteContact(contact!!) + finish() + } + } + } + private fun getStarDrawable(on: Boolean) = resources.getDrawable(if (on) R.drawable.ic_star_on_vector else R.drawable.ic_star_off_vector) private fun View.copyOnLongClick(value: String) { From 090c347e5f9eef752940f0d4056bc5769d2f30a5 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Sep 2019 21:43:11 +0200 Subject: [PATCH 20/48] improve some contact deleting scenarios, delete clones in some cases --- .../pro/activities/ContactActivity.kt | 5 +++-- .../pro/activities/EditContactActivity.kt | 10 ++++++--- .../pro/activities/ViewContactActivity.kt | 5 +++-- .../contacts/pro/helpers/ContactsHelper.kt | 22 ++++++++++++++----- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt index d0067c4e..47a00896 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt @@ -77,8 +77,9 @@ abstract class ContactActivity : SimpleActivity() { fun deleteContact() { ConfirmationDialog(this) { if (contact != null) { - ContactsHelper(this).deleteContact(contact!!) - finish() + ContactsHelper(this).deleteContact(contact!!, false) { + finish() + } } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index 821ffbe9..06a6d7f5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -992,10 +992,14 @@ class EditContactActivity : ContactActivity() { if (ContactsHelper(this@EditContactActivity).insertContact(contact!!)) { if (deleteCurrentContact) { contact!!.source = originalContactSource - ContactsHelper(this).deleteContact(contact!!) + ContactsHelper(this).deleteContact(contact!!, false) { + setResult(Activity.RESULT_OK) + finish() + } + } else { + setResult(Activity.RESULT_OK) + finish() } - setResult(Activity.RESULT_OK) - finish() } else { toast(R.string.unknown_error_occurred) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index b8c10d60..0122fdb3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -519,8 +519,9 @@ class ViewContactActivity : ContactActivity() { val message = "${getString(R.string.proceed_with_deletion)}$addition" ConfirmationDialog(this, message) { if (contact != null) { - ContactsHelper(this).deleteContact(contact!!) - finish() + ContactsHelper(this).deleteContact(contact!!, true) { + finish() + } } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 8085c5ed..c2474b99 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -1524,17 +1524,27 @@ class ContactsHelper(val context: Context) { LocalContactsHelper(context).toggleFavorites(localContacts, addToFavorites) } - fun deleteContact(originalContact: Contact) { - getDuplicatesOfContact(originalContact, true) { contacts -> - deleteContacts(contacts) + fun deleteContact(originalContact: Contact, deleteClones: Boolean = false, callback: (success: Boolean) -> Unit) { + ensureBackgroundThread { + if (deleteClones) { + getDuplicatesOfContact(originalContact, true) { contacts -> + if (deleteContacts(contacts)) { + callback(true) + } + } + } else { + if (deleteContacts(arrayListOf(originalContact))) { + callback(true) + } + } } } - fun deleteContacts(contacts: ArrayList) { + fun deleteContacts(contacts: ArrayList): Boolean { val localContacts = contacts.filter { it.isPrivate() }.map { it.id.toLong() }.toMutableList() LocalContactsHelper(context).deleteContactIds(localContacts) - try { + return try { val operations = ArrayList() val selection = "${ContactsContract.RawContacts._ID} = ?" contacts.filter { !it.isPrivate() }.forEach { @@ -1553,8 +1563,10 @@ class ContactsHelper(val context: Context) { if (context.hasPermission(PERMISSION_WRITE_CONTACTS)) { context.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations) } + true } catch (e: Exception) { context.showErrorToast(e) + false } } From c07e70ab1c8ea649592edfc38ee4e016d1e58bb7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Sep 2019 22:57:26 +0200 Subject: [PATCH 21/48] update shown contact sources at the View screen if necessary --- .../pro/activities/ViewContactActivity.kt | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 0122fdb3..711ac61c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -31,6 +31,7 @@ import kotlinx.android.synthetic.main.item_website.view.* class ViewContactActivity : ContactActivity() { private var isViewIntent = false private var wasEditLaunched = false + private var shownContactSources = ArrayList() private var showFields = 0 override fun onCreate(savedInstanceState: Bundle?) { @@ -473,15 +474,25 @@ class ViewContactActivity : ContactActivity() { } private fun addContactSources() { - if (contact_sources_holder.childCount > 0) { - return + if (contact_sources_holder.childCount == 0) { + addContactSource(contact!!) } - addContactSource(contact!!) ContactsHelper(this).getDuplicatesOfContact(contact!!, false) { contacts -> + val currContactSources = contacts.map { it.source } runOnUiThread { - contacts.forEach { - addContactSource(it) + if (currContactSources.toString() != shownContactSources.toString()) { + for (i in (contact_sources_holder.childCount - 1) downTo 1) { + contact_sources_holder.removeView(contact_sources_holder.getChildAt(i)) + shownContactSources.clear() + } + } + + if (shownContactSources.isEmpty()) { + contacts.forEach { + addContactSource(it) + shownContactSources.add(it.source) + } } } } From 523dfc039b80fafe50993e180b09e8f7fed562c4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 14 Sep 2019 21:47:01 +0200 Subject: [PATCH 22/48] get all contacts without merging duplicates in some cases --- .../simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt | 2 +- .../simplemobiletools/contacts/pro/helpers/ContactsHelper.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt index 38cd82b4..13cc99dd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/adapters/ContactsAdapter.kt @@ -176,7 +176,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList + ContactsHelper(activity).getContacts(true) { allContacts -> ensureBackgroundThread { contactsToRemove.forEach { val contactToRemove = it diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index c2474b99..0cdd3a01 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -1572,7 +1572,7 @@ class ContactsHelper(val context: Context) { fun getDuplicatesOfContact(contact: Contact, addOriginal: Boolean, callback: (ArrayList) -> Unit) { ensureBackgroundThread { - getContacts { contacts -> + getContacts(true) { contacts -> val duplicates = contacts.filter { it.id != contact.id && it.getHashToCompare() == contact.getHashToCompare() }.toMutableList() as ArrayList if (addOriginal) { duplicates.add(contact) From 28ae1eabd308ade312c0038436636f67b583f81f Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 14 Sep 2019 21:50:56 +0200 Subject: [PATCH 23/48] always try filtering out duplicate contacts, remove the setting --- .../contacts/pro/activities/MainActivity.kt | 6 ----- .../pro/activities/SettingsActivity.kt | 9 ------- .../contacts/pro/helpers/Config.kt | 4 ---- .../contacts/pro/helpers/Constants.kt | 1 - .../contacts/pro/helpers/ContactsHelper.kt | 2 +- app/src/main/res/layout/activity_settings.xml | 24 ------------------- 6 files changed, 1 insertion(+), 45 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index bfb8b4e5..f0dd2c18 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -58,7 +58,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { private var storedShowContactThumbnails = false private var storedShowPhoneNumbers = false private var storedStartNameWithSurname = false - private var storedFilterDuplicates = true private var storedShowTabs = 0 override fun onCreate(savedInstanceState: Bundle?) { @@ -137,10 +136,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { favorites_fragment?.startNameWithSurnameChanged(configStartNameWithSurname) } - if (storedFilterDuplicates != config.filterDuplicates) { - refreshContacts(ALL_TABS_MASK) - } - if (werePermissionsHandled && !isFirstResume) { if (viewpager.adapter == null) { initFragments() @@ -213,7 +208,6 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { storedShowContactThumbnails = showContactThumbnails storedShowPhoneNumbers = showPhoneNumbers storedStartNameWithSurname = startNameWithSurname - storedFilterDuplicates = filterDuplicates storedShowTabs = showTabs } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt index 6642034f..43e87563 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/SettingsActivity.kt @@ -39,7 +39,6 @@ class SettingsActivity : SimpleActivity() { setupShowPhoneNumbers() setupShowContactsWithNumbers() setupStartNameWithSurname() - setupFilterDuplicates() setupShowCallConfirmation() setupShowDialpadButton() setupShowDialpadLetters() @@ -130,14 +129,6 @@ class SettingsActivity : SimpleActivity() { } } - private fun setupFilterDuplicates() { - settings_filter_duplicates.isChecked = config.filterDuplicates - settings_filter_duplicates_holder.setOnClickListener { - settings_filter_duplicates.toggle() - config.filterDuplicates = settings_filter_duplicates.isChecked - } - } - private fun setupShowDialpadButton() { settings_show_dialpad_button.isChecked = config.showDialpadButton settings_show_dialpad_button_holder.setOnClickListener { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt index 1dd4a759..0098fbb3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Config.kt @@ -41,10 +41,6 @@ class Config(context: Context) : BaseConfig(context) { 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() - var filterDuplicates: Boolean - get() = prefs.getBoolean(FILTER_DUPLICATES, true) - set(filterDuplicates) = prefs.edit().putBoolean(FILTER_DUPLICATES, filterDuplicates).apply() - var showTabs: Int get() = prefs.getInt(SHOW_TABS, ALL_TABS_MASK) set(showTabs) = prefs.edit().putInt(SHOW_TABS, showTabs).apply() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt index 0fa64cf7..e9d95de1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/Constants.kt @@ -13,7 +13,6 @@ const val LAST_USED_CONTACT_SOURCE = "last_used_contact_source" const val ON_CONTACT_CLICK = "on_contact_click" const val SHOW_CONTACT_FIELDS = "show_contact_fields" const val SHOW_TABS = "show_tabs" -const val FILTER_DUPLICATES = "filter_duplicates" const val SHOW_CALL_CONFIRMATION = "show_call_confirmation" const val SHOW_DIALPAD_BUTTON = "show_dialpad_button" const val SHOW_DIALPAD_LETTERS = "show_dialpad_letters" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 0cdd3a01..8f4ed32e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -66,7 +66,7 @@ class ContactsHelper(val context: Context) { contacts.valueAt(it) } - if (ignoredContactSources.isEmpty() && context.config.filterDuplicates && !getAll) { + if (ignoredContactSources.isEmpty() && !getAll) { tempContacts = tempContacts.distinctBy { it.getHashToCompare() } as ArrayList diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index a6ea7d26..d5772d83 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -244,30 +244,6 @@ - - - - - - Date: Sat, 14 Sep 2019 22:22:01 +0200 Subject: [PATCH 24/48] move duplicate checking at View screen in a separate function --- .../contacts/pro/activities/ViewContactActivity.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 711ac61c..42bc5206 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -205,7 +205,8 @@ class ViewContactActivity : ContactActivity() { setupOrganization() setupWebsites() setupGroups() - addContactSources() + setupContactSources() + checkDuplicateContacts() } private fun launchEditContact(contact: Contact) { @@ -473,11 +474,13 @@ class ViewContactActivity : ContactActivity() { } } - private fun addContactSources() { + private fun setupContactSources() { if (contact_sources_holder.childCount == 0) { addContactSource(contact!!) } + } + private fun checkDuplicateContacts() { ContactsHelper(this).getDuplicatesOfContact(contact!!, false) { contacts -> val currContactSources = contacts.map { it.source } runOnUiThread { From 2dc2fe01df44f5a4fe285415039dc810a7eecf8f Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 14 Sep 2019 22:38:20 +0200 Subject: [PATCH 25/48] tweak duplicate contact source adding a bit --- .../pro/activities/ViewContactActivity.kt | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 42bc5206..4d2296ae 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -482,19 +482,29 @@ class ViewContactActivity : ContactActivity() { private fun checkDuplicateContacts() { ContactsHelper(this).getDuplicatesOfContact(contact!!, false) { contacts -> - val currContactSources = contacts.map { it.source } - runOnUiThread { - if (currContactSources.toString() != shownContactSources.toString()) { - for (i in (contact_sources_holder.childCount - 1) downTo 1) { - contact_sources_holder.removeView(contact_sources_holder.getChildAt(i)) - shownContactSources.clear() + ensureBackgroundThread { + val duplicates = ArrayList() + contacts.forEach { + val duplicate = ContactsHelper(this).getContactWithId(it.id, it.isPrivate()) + if (duplicate != null) { + duplicates.add(duplicate) } } - if (shownContactSources.isEmpty()) { - contacts.forEach { - addContactSource(it) - shownContactSources.add(it.source) + val currContactSources = duplicates.map { it.source } + runOnUiThread { + if (currContactSources.toString() != shownContactSources.toString()) { + for (i in (contact_sources_holder.childCount - 1) downTo 1) { + contact_sources_holder.removeView(contact_sources_holder.getChildAt(i)) + shownContactSources.clear() + } + } + + if (shownContactSources.isEmpty()) { + duplicates.forEach { + addContactSource(it) + shownContactSources.add(it.source) + } } } } From d06498eaa0f9f224bae4a681a0a1af0435be2808 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 10:22:15 +0200 Subject: [PATCH 26/48] delete contacts from a background thread --- .../contacts/pro/helpers/ContactsHelper.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 8f4ed32e..cf179b81 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -1528,8 +1528,10 @@ class ContactsHelper(val context: Context) { ensureBackgroundThread { if (deleteClones) { getDuplicatesOfContact(originalContact, true) { contacts -> - if (deleteContacts(contacts)) { - callback(true) + ensureBackgroundThread { + if (deleteContacts(contacts)) { + callback(true) + } } } } else { From 5827f2c64f7ce9317e83a34c8466e10ac6a2dc4a Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 10:50:48 +0200 Subject: [PATCH 27/48] hide the fields at View Contact by default --- .../main/res/layout/activity_view_contact.xml | 259 ++++++++++-------- 1 file changed, 140 insertions(+), 119 deletions(-) diff --git a/app/src/main/res/layout/activity_view_contact.xml b/app/src/main/res/layout/activity_view_contact.xml index 8c482eaa..d12aa28c 100644 --- a/app/src/main/res/layout/activity_view_contact.xml +++ b/app/src/main/res/layout/activity_view_contact.xml @@ -200,16 +200,8 @@ android:paddingTop="@dimen/medium_margin" android:paddingEnd="@dimen/small_margin" android:paddingBottom="@dimen/small_margin" - android:src="@drawable/ic_phone_vector"/> - - + android:src="@drawable/ic_phone_vector" + android:visibility="gone" /> - - + android:src="@drawable/ic_email_vector" + android:visibility="gone" /> - - + android:src="@drawable/ic_place_vector" + android:visibility="gone" /> - - + android:src="@drawable/ic_im" + android:visibility="gone" /> - - + android:src="@drawable/ic_cake_vector" + android:visibility="gone" /> + android:src="@drawable/ic_label_vector" + android:visibility="gone" /> + + + + + + + + + + + + + + + + + + + + + + + + - - + android:textSize="@dimen/bigger_text_size" + android:visibility="gone" /> + android:textSize="@dimen/bigger_text_size" + android:visibility="gone" /> - - - - - - - - - - - - + android:textSize="@dimen/bigger_text_size" + android:visibility="gone" /> From 128f191264fbf97641ee2f9e63b8083e33867e0e Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 11:26:04 +0200 Subject: [PATCH 28/48] show all available contact phone numbers at View screen --- .../pro/activities/ViewContactActivity.kt | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 4d2296ae..2bcec6eb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -18,6 +18,7 @@ import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog import com.simplemobiletools.contacts.pro.extensions.* import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.models.Contact +import com.simplemobiletools.contacts.pro.models.PhoneNumber 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.* @@ -32,6 +33,7 @@ class ViewContactActivity : ContactActivity() { private var isViewIntent = false private var wasEditLaunched = false private var shownContactSources = ArrayList() + private var duplicateContacts = ArrayList() private var showFields = 0 override fun onCreate(savedInstanceState: Bundle?) { @@ -196,7 +198,12 @@ class ViewContactActivity : ContactActivity() { window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) setupFavorite() setupNames() - setupPhoneNumbers() + setupContactSources() + + getDuplicateContacts { + setupPhoneNumbers() + } + setupEmails() setupAddresses() setupIMs() @@ -205,8 +212,6 @@ class ViewContactActivity : ContactActivity() { setupOrganization() setupWebsites() setupGroups() - setupContactSources() - checkDuplicateContacts() } private fun launchEditContact(contact: Contact) { @@ -274,7 +279,21 @@ class ViewContactActivity : ContactActivity() { private fun setupPhoneNumbers() { contact_numbers_holder.removeAllViews() - val phoneNumbers = contact!!.phoneNumbers + var phoneNumbers = contact!!.phoneNumbers.toMutableSet() as LinkedHashSet + duplicateContacts.forEach { + it.phoneNumbers.forEach { + phoneNumbers.add(it) + } + } + + phoneNumbers = phoneNumbers.distinctBy { + if (it.normalizedNumber != null && it.normalizedNumber!!.length >= 7) { + it.normalizedNumber?.substring(it.normalizedNumber!!.length - 7) + } else { + it.normalizedNumber + } + }.toMutableSet() as LinkedHashSet + 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 { @@ -480,19 +499,21 @@ class ViewContactActivity : ContactActivity() { } } - private fun checkDuplicateContacts() { + private fun getDuplicateContacts(callback: () -> Unit) { ContactsHelper(this).getDuplicatesOfContact(contact!!, false) { contacts -> ensureBackgroundThread { - val duplicates = ArrayList() + duplicateContacts.clear() contacts.forEach { val duplicate = ContactsHelper(this).getContactWithId(it.id, it.isPrivate()) if (duplicate != null) { - duplicates.add(duplicate) + duplicateContacts.add(duplicate) } } - val currContactSources = duplicates.map { it.source } runOnUiThread { + callback() + + val currContactSources = duplicateContacts.map { it.source } if (currContactSources.toString() != shownContactSources.toString()) { for (i in (contact_sources_holder.childCount - 1) downTo 1) { contact_sources_holder.removeView(contact_sources_holder.getChildAt(i)) @@ -501,7 +522,7 @@ class ViewContactActivity : ContactActivity() { } if (shownContactSources.isEmpty()) { - duplicates.forEach { + duplicateContacts.forEach { addContactSource(it) shownContactSources.add(it.source) } From f9bd62b2a7ab6f0685ab5632dc86299fe2009a5d Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 11:32:34 +0200 Subject: [PATCH 29/48] removing a magic number at adding phone numbers --- .../contacts/pro/activities/ViewContactActivity.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 2bcec6eb..8b80415b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -36,6 +36,8 @@ class ViewContactActivity : ContactActivity() { private var duplicateContacts = ArrayList() private var showFields = 0 + private val COMPARABLE_PHONE_NUMBER_LENGTH = 7 + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_view_contact) @@ -278,22 +280,20 @@ class ViewContactActivity : ContactActivity() { } private fun setupPhoneNumbers() { - contact_numbers_holder.removeAllViews() var phoneNumbers = contact!!.phoneNumbers.toMutableSet() as LinkedHashSet duplicateContacts.forEach { - it.phoneNumbers.forEach { - phoneNumbers.add(it) - } + phoneNumbers.addAll(it.phoneNumbers) } phoneNumbers = phoneNumbers.distinctBy { - if (it.normalizedNumber != null && it.normalizedNumber!!.length >= 7) { - it.normalizedNumber?.substring(it.normalizedNumber!!.length - 7) + if (it.normalizedNumber != null && it.normalizedNumber!!.length >= COMPARABLE_PHONE_NUMBER_LENGTH) { + it.normalizedNumber?.substring(it.normalizedNumber!!.length - COMPARABLE_PHONE_NUMBER_LENGTH) } else { it.normalizedNumber } }.toMutableSet() as LinkedHashSet + contact_numbers_holder.removeAllViews() 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 { From 72ccd10aa14ba6c3dba39f363e24a49498c8974a Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 12:04:38 +0200 Subject: [PATCH 30/48] do not mess with the phone numbers if they arent shown anyway --- .../pro/activities/ViewContactActivity.kt | 61 ++++++++++--------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 8b80415b..bd9d9a06 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -200,10 +200,10 @@ class ViewContactActivity : ContactActivity() { window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) setupFavorite() setupNames() - setupContactSources() getDuplicateContacts { setupPhoneNumbers() + setupContactSources() } setupEmails() @@ -280,42 +280,47 @@ class ViewContactActivity : ContactActivity() { } private fun setupPhoneNumbers() { - var phoneNumbers = contact!!.phoneNumbers.toMutableSet() as LinkedHashSet - duplicateContacts.forEach { - phoneNumbers.addAll(it.phoneNumbers) - } - - phoneNumbers = phoneNumbers.distinctBy { - if (it.normalizedNumber != null && it.normalizedNumber!!.length >= COMPARABLE_PHONE_NUMBER_LENGTH) { - it.normalizedNumber?.substring(it.normalizedNumber!!.length - COMPARABLE_PHONE_NUMBER_LENGTH) - } else { - it.normalizedNumber + if (showFields and SHOW_PHONE_NUMBERS_FIELD != 0) { + var phoneNumbers = contact!!.phoneNumbers.toMutableSet() as LinkedHashSet + duplicateContacts.forEach { + phoneNumbers.addAll(it.phoneNumbers) } - }.toMutableSet() as LinkedHashSet - contact_numbers_holder.removeAllViews() - 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.text = getPhoneNumberTypeText(phoneNumber.type, phoneNumber.label) - copyOnLongClick(phoneNumber.value) + phoneNumbers = phoneNumbers.distinctBy { + if (it.normalizedNumber != null && it.normalizedNumber!!.length >= COMPARABLE_PHONE_NUMBER_LENGTH) { + it.normalizedNumber?.substring(it.normalizedNumber!!.length - COMPARABLE_PHONE_NUMBER_LENGTH) + } else { + it.normalizedNumber + } + }.toMutableSet() as LinkedHashSet - setOnClickListener { - if (config.showCallConfirmation) { - CallConfirmationDialog(this@ViewContactActivity, phoneNumber.value) { + contact_numbers_holder.removeAllViews() + if (phoneNumbers.isNotEmpty()) { + 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.text = getPhoneNumberTypeText(phoneNumber.type, phoneNumber.label) + copyOnLongClick(phoneNumber.value) + + setOnClickListener { + if (config.showCallConfirmation) { + CallConfirmationDialog(this@ViewContactActivity, phoneNumber.value) { + startCallIntent(phoneNumber.value) + } + } else { startCallIntent(phoneNumber.value) } - } else { - startCallIntent(phoneNumber.value) } } } + contact_numbers_image.beVisible() + contact_numbers_holder.beVisible() + } else { + contact_numbers_image.beGone() + contact_numbers_holder.beGone() } - contact_numbers_image.beVisible() - contact_numbers_holder.beVisible() } else { contact_numbers_image.beGone() contact_numbers_holder.beGone() From 91e645b08e20e55c4fb9c2342e86a8619c3e2b7f Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 13:05:55 +0200 Subject: [PATCH 31/48] improve the contact source loading synchronicity --- .../pro/activities/ViewContactActivity.kt | 77 ++++++++----------- .../contacts/pro/extensions/Context.kt | 43 +++++++---- .../contacts/pro/helpers/ContactsHelper.kt | 2 +- 3 files changed, 65 insertions(+), 57 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index bd9d9a06..bd1b374d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -18,6 +18,7 @@ import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog import com.simplemobiletools.contacts.pro.extensions.* import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.models.Contact +import com.simplemobiletools.contacts.pro.models.ContactSource import com.simplemobiletools.contacts.pro.models.PhoneNumber import kotlinx.android.synthetic.main.activity_view_contact.* import kotlinx.android.synthetic.main.item_event.view.* @@ -32,8 +33,8 @@ import kotlinx.android.synthetic.main.item_website.view.* class ViewContactActivity : ContactActivity() { private var isViewIntent = false private var wasEditLaunched = false - private var shownContactSources = ArrayList() private var duplicateContacts = ArrayList() + private var contactSources = ArrayList() private var showFields = 0 private val COMPARABLE_PHONE_NUMBER_LENGTH = 7 @@ -201,9 +202,12 @@ class ViewContactActivity : ContactActivity() { setupFavorite() setupNames() - getDuplicateContacts { - setupPhoneNumbers() - setupContactSources() + ContactsHelper(this).getContactSources { + contactSources = it + getDuplicateContacts { + setupPhoneNumbers() + setupContactSources() + } } setupEmails() @@ -499,8 +503,32 @@ class ViewContactActivity : ContactActivity() { } private fun setupContactSources() { - if (contact_sources_holder.childCount == 0) { - addContactSource(contact!!) + if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) { + val sources = LinkedHashMap() + sources[contact!!] = contact!!.source + duplicateContacts.forEach { + sources[it] = it.source + } + + contact_sources_holder.removeAllViews() + for ((key, value) in sources) { + layoutInflater.inflate(R.layout.item_view_contact_source, contact_sources_holder, false).apply { + val contactSource = getPublicContactSourceSync(value, contactSources) + contact_source.text = contactSource + contact_source.copyOnLongClick(contactSource) + contact_sources_holder.addView(this) + + contact_source.setOnClickListener { + launchEditContact(key) + } + } + } + + contact_source_image.beVisible() + contact_sources_holder.beVisible() + } else { + contact_source_image.beGone() + contact_sources_holder.beGone() } } @@ -517,48 +545,11 @@ class ViewContactActivity : ContactActivity() { runOnUiThread { callback() - - val currContactSources = duplicateContacts.map { it.source } - if (currContactSources.toString() != shownContactSources.toString()) { - for (i in (contact_sources_holder.childCount - 1) downTo 1) { - contact_sources_holder.removeView(contact_sources_holder.getChildAt(i)) - shownContactSources.clear() - } - } - - if (shownContactSources.isEmpty()) { - duplicateContacts.forEach { - addContactSource(it) - shownContactSources.add(it.source) - } - } } } } } - private fun addContactSource(contact: Contact) { - if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) { - layoutInflater.inflate(R.layout.item_view_contact_source, contact_sources_holder, false).apply { - getPublicContactSource(contact.source) { - contact_source.text = it - contact_source.copyOnLongClick(it) - contact_sources_holder.addView(this) - - contact_source.setOnClickListener { - launchEditContact(contact) - } - } - } - - contact_source_image.beVisible() - contact_sources_holder.beVisible() - } else { - contact_source_image.beGone() - contact_sources_holder.beGone() - } - } - private fun deleteContactFromAllSources() { val addition = if (contact_sources_holder.childCount > 1) { "\n\n${getString(R.string.delete_from_all_sources)}" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt index 59868db0..2aafcf93 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Context.kt @@ -15,7 +15,10 @@ import android.provider.ContactsContract import android.telecom.TelecomManager import androidx.core.content.FileProvider import com.simplemobiletools.commons.extensions.* -import com.simplemobiletools.commons.helpers.* +import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS +import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS +import com.simplemobiletools.commons.helpers.isMarshmallowPlus +import com.simplemobiletools.commons.helpers.isNougatPlus import com.simplemobiletools.contacts.pro.BuildConfig import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.activities.EditContactActivity @@ -30,7 +33,6 @@ import com.simplemobiletools.contacts.pro.models.ContactSource import com.simplemobiletools.contacts.pro.models.Organization import java.io.File - val Context.config: Config get() = Config.newInstance(applicationContext) val Context.contactsDB: ContactsDao get() = ContactsDatabase.getInstance(applicationContext).ContactsDao() @@ -196,24 +198,39 @@ fun Context.getPublicContactSource(source: String, callback: (String) -> Unit) { when (source) { SMT_PRIVATE -> callback(getString(R.string.phone_storage_hidden)) else -> { - ensureBackgroundThread { - ContactsHelper(this).getContactSources { - var newSource = source - for (contactSource in it) { - if (contactSource.name == source && contactSource.type == TELEGRAM_PACKAGE) { - newSource += " (${getString(R.string.telegram)})" - break - } - } - Handler(Looper.getMainLooper()).post { - callback(newSource) + ContactsHelper(this).getContactSources { + var newSource = source + for (contactSource in it) { + if (contactSource.name == source && contactSource.type == TELEGRAM_PACKAGE) { + newSource += " (${getString(R.string.telegram)})" + break } } + Handler(Looper.getMainLooper()).post { + callback(newSource) + } } } } } +fun Context.getPublicContactSourceSync(source: String, contactSources: ArrayList): String { + return when (source) { + SMT_PRIVATE -> getString(R.string.phone_storage_hidden) + else -> { + var newSource = source + for (contactSource in contactSources) { + if (contactSource.name == source && contactSource.type == TELEGRAM_PACKAGE) { + newSource += " (${getString(R.string.telegram)})" + break + } + } + + return newSource + } + } +} + fun Context.sendSMSToContacts(contacts: ArrayList) { val numbers = StringBuilder() contacts.forEach { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index cf179b81..1b9a2df7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -848,7 +848,7 @@ class ContactsHelper(val context: Context) { } } - private fun getContactSourcesSync(): ArrayList { + fun getContactSourcesSync(): ArrayList { val sources = getDeviceContactSources() sources.add(context.getPrivateContactSource()) return ArrayList(sources) From 1ad3b3e5257de66be1924cc4ae887237a55ebc4f Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 19:55:14 +0200 Subject: [PATCH 32/48] sort contact sources by value --- .../pro/activities/ViewContactActivity.kt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index bd1b374d..05bb2830 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -504,18 +504,21 @@ class ViewContactActivity : ContactActivity() { private fun setupContactSources() { if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) { - val sources = LinkedHashMap() - sources[contact!!] = contact!!.source + var sources = HashMap() + sources[contact!!] = getPublicContactSourceSync(contact!!.source, contactSources) duplicateContacts.forEach { - sources[it] = it.source + sources[it] = getPublicContactSourceSync(it.source, contactSources) + } + + if (sources.size > 1) { + sources = sources.toList().sortedBy { (key, value) -> value.toLowerCase() }.toMap() as LinkedHashMap } contact_sources_holder.removeAllViews() for ((key, value) in sources) { layoutInflater.inflate(R.layout.item_view_contact_source, contact_sources_holder, false).apply { - val contactSource = getPublicContactSourceSync(value, contactSources) - contact_source.text = contactSource - contact_source.copyOnLongClick(contactSource) + contact_source.text = value + contact_source.copyOnLongClick(value) contact_sources_holder.addView(this) contact_source.setOnClickListener { From 0b4b0dd7635d44f7810b50e4114e704d22ae14e4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 20:10:41 +0200 Subject: [PATCH 33/48] sort shown contact phone numbers by type --- .../contacts/pro/activities/ViewContactActivity.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 05bb2830..ea35000b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -298,6 +298,8 @@ class ViewContactActivity : ContactActivity() { } }.toMutableSet() as LinkedHashSet + phoneNumbers = phoneNumbers.sortedBy { it.type }.toMutableSet() as LinkedHashSet + contact_numbers_holder.removeAllViews() if (phoneNumbers.isNotEmpty()) { phoneNumbers.forEach { From 671cb29a458d6aba458e2b49a003f3acccb3ca3a Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 20:15:34 +0200 Subject: [PATCH 34/48] properly show all available contact addresses --- .../pro/activities/ViewContactActivity.kt | 42 ++++++++++++------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index ea35000b..2bd3aa8f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -17,6 +17,7 @@ import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog import com.simplemobiletools.contacts.pro.extensions.* import com.simplemobiletools.contacts.pro.helpers.* +import com.simplemobiletools.contacts.pro.models.Address import com.simplemobiletools.contacts.pro.models.Contact import com.simplemobiletools.contacts.pro.models.ContactSource import com.simplemobiletools.contacts.pro.models.PhoneNumber @@ -206,12 +207,12 @@ class ViewContactActivity : ContactActivity() { contactSources = it getDuplicateContacts { setupPhoneNumbers() + setupEmails() + setupAddresses() setupContactSources() } } - setupEmails() - setupAddresses() setupIMs() setupEvents() setupNotes() @@ -360,23 +361,34 @@ class ViewContactActivity : ContactActivity() { private fun setupAddresses() { contact_addresses_holder.removeAllViews() - val addresses = contact!!.addresses - 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.text = getAddressTypeText(address.type, address.label) - copyOnLongClick(address.value) + if (showFields and SHOW_ADDRESSES_FIELD != 0) { + var addresses = contact!!.addresses.toMutableSet() as LinkedHashSet
+ duplicateContacts.forEach { + addresses.addAll(it.addresses) + } - setOnClickListener { - sendAddressIntent(address.value) + addresses = addresses.sortedBy { it.type }.toMutableSet() as LinkedHashSet
+ + if (addresses.isNotEmpty()) { + 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.text = getAddressTypeText(address.type, address.label) + copyOnLongClick(address.value) + + setOnClickListener { + sendAddressIntent(address.value) + } } } + contact_addresses_image.beVisible() + contact_addresses_holder.beVisible() + } else { + contact_addresses_image.beGone() + contact_addresses_holder.beGone() } - contact_addresses_image.beVisible() - contact_addresses_holder.beVisible() } else { contact_addresses_image.beGone() contact_addresses_holder.beGone() From a52bed42283ed2db259cd2ec3d4e0fe5110294b0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 20:29:36 +0200 Subject: [PATCH 35/48] collect and show all duplicate contact IMs --- .../pro/activities/ViewContactActivity.kt | 45 ++++++++++--------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 2bd3aa8f..cb198248 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -17,10 +17,7 @@ import com.simplemobiletools.contacts.pro.R import com.simplemobiletools.contacts.pro.dialogs.CallConfirmationDialog import com.simplemobiletools.contacts.pro.extensions.* import com.simplemobiletools.contacts.pro.helpers.* -import com.simplemobiletools.contacts.pro.models.Address -import com.simplemobiletools.contacts.pro.models.Contact -import com.simplemobiletools.contacts.pro.models.ContactSource -import com.simplemobiletools.contacts.pro.models.PhoneNumber +import com.simplemobiletools.contacts.pro.models.* 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.* @@ -209,11 +206,11 @@ class ViewContactActivity : ContactActivity() { setupPhoneNumbers() setupEmails() setupAddresses() + setupIMs() setupContactSources() } } - setupIMs() setupEvents() setupNotes() setupOrganization() @@ -285,6 +282,7 @@ class ViewContactActivity : ContactActivity() { } private fun setupPhoneNumbers() { + contact_numbers_holder.removeAllViews() if (showFields and SHOW_PHONE_NUMBERS_FIELD != 0) { var phoneNumbers = contact!!.phoneNumbers.toMutableSet() as LinkedHashSet duplicateContacts.forEach { @@ -300,8 +298,6 @@ class ViewContactActivity : ContactActivity() { }.toMutableSet() as LinkedHashSet phoneNumbers = phoneNumbers.sortedBy { it.type }.toMutableSet() as LinkedHashSet - - contact_numbers_holder.removeAllViews() if (phoneNumbers.isNotEmpty()) { phoneNumbers.forEach { layoutInflater.inflate(R.layout.item_view_phone_number, contact_numbers_holder, false).apply { @@ -368,7 +364,6 @@ class ViewContactActivity : ContactActivity() { } addresses = addresses.sortedBy { it.type }.toMutableSet() as LinkedHashSet
- if (addresses.isNotEmpty()) { addresses.forEach { layoutInflater.inflate(R.layout.item_view_address, contact_addresses_holder, false).apply { @@ -397,19 +392,29 @@ class ViewContactActivity : ContactActivity() { private fun setupIMs() { contact_ims_holder.removeAllViews() - val IMs = contact!!.IMs - if (IMs.isNotEmpty() && showFields and SHOW_IMS_FIELD != 0) { - IMs.forEach { - layoutInflater.inflate(R.layout.item_view_im, contact_ims_holder, false).apply { - val IM = it - contact_ims_holder.addView(this) - contact_im.text = IM.value - contact_im_type.text = getIMTypeText(IM.type, IM.label) - copyOnLongClick(IM.value) - } + if (showFields and SHOW_IMS_FIELD != 0) { + var IMs = contact!!.IMs.toMutableSet() as LinkedHashSet + duplicateContacts.forEach { + IMs.addAll(it.IMs) + } + + IMs = IMs.sortedBy { it.type }.toMutableSet() as LinkedHashSet + if (IMs.isNotEmpty()) { + IMs.forEach { + layoutInflater.inflate(R.layout.item_view_im, contact_ims_holder, false).apply { + val IM = it + contact_ims_holder.addView(this) + contact_im.text = IM.value + contact_im_type.text = getIMTypeText(IM.type, IM.label) + copyOnLongClick(IM.value) + } + } + contact_ims_image.beVisible() + contact_ims_holder.beVisible() + } else { + contact_ims_image.beGone() + contact_ims_holder.beGone() } - contact_ims_image.beVisible() - contact_ims_holder.beVisible() } else { contact_ims_image.beGone() contact_ims_holder.beGone() From 70d03f35b9b9449b60e1e525671d545815c69f86 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 20:50:55 +0200 Subject: [PATCH 36/48] gather events from all contacts at displaying --- .../pro/activities/ContactActivity.kt | 2 +- .../pro/activities/EditContactActivity.kt | 4 +-- .../pro/activities/ViewContactActivity.kt | 36 +++++++++++-------- .../contacts/pro/helpers/VcfExporter.kt | 2 +- .../contacts/pro/helpers/VcfImporter.kt | 8 ++--- app/src/main/res/layout/item_view_event.xml | 35 ++++++++++++++++++ 6 files changed, 65 insertions(+), 22 deletions(-) create mode 100644 app/src/main/res/layout/item_view_event.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt index 47a00896..9fc228cd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt @@ -180,8 +180,8 @@ abstract class ContactActivity : SimpleActivity() { } fun getEventTextId(type: Int) = when (type) { - ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY -> R.string.birthday ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY -> R.string.anniversary + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY -> R.string.birthday else -> R.string.other } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index 06a6d7f5..4abc748c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -821,8 +821,8 @@ class EditContactActivity : ContactActivity() { private fun showEventTypePicker(eventTypeField: TextView) { val items = arrayListOf( - RadioItem(CommonDataKinds.Event.TYPE_BIRTHDAY, getString(R.string.birthday)), RadioItem(CommonDataKinds.Event.TYPE_ANNIVERSARY, getString(R.string.anniversary)), + RadioItem(CommonDataKinds.Event.TYPE_BIRTHDAY, getString(R.string.birthday)), RadioItem(CommonDataKinds.Event.TYPE_OTHER, getString(R.string.other)) ) @@ -1221,8 +1221,8 @@ class EditContactActivity : ContactActivity() { } private fun getEventTypeId(value: String) = when (value) { - getString(R.string.birthday) -> CommonDataKinds.Event.TYPE_BIRTHDAY getString(R.string.anniversary) -> CommonDataKinds.Event.TYPE_ANNIVERSARY + getString(R.string.birthday) -> CommonDataKinds.Event.TYPE_BIRTHDAY else -> CommonDataKinds.Event.TYPE_OTHER } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index cb198248..d8ee9295 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -207,11 +207,11 @@ class ViewContactActivity : ContactActivity() { setupEmails() setupAddresses() setupIMs() + setupEvents() setupContactSources() } } - setupEvents() setupNotes() setupOrganization() setupWebsites() @@ -423,20 +423,28 @@ class ViewContactActivity : ContactActivity() { private fun setupEvents() { contact_events_holder.removeAllViews() - val events = contact!!.events - 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 - it.value.getDateTimeFromDateString(contact_event) - contact_event_type.setText(getEventTextId(it.type)) - contact_event_remove.beGone() - copyOnLongClick(it.value) - } + if (showFields and SHOW_EVENTS_FIELD != 0) { + var events = contact!!.events.toMutableSet() as LinkedHashSet + duplicateContacts.forEach { + events.addAll(it.events) + } + + events = events.sortedBy { it.type }.toMutableSet() as LinkedHashSet + if (events.isNotEmpty()) { + events.forEach { + layoutInflater.inflate(R.layout.item_view_event, contact_events_holder, false).apply { + contact_events_holder.addView(this) + it.value.getDateTimeFromDateString(contact_event) + contact_event_type.setText(getEventTextId(it.type)) + copyOnLongClick(it.value) + } + } + contact_events_image.beVisible() + contact_events_holder.beVisible() + } else { + contact_events_image.beGone() + contact_events_holder.beGone() } - contact_events_image.beVisible() - contact_events_holder.beVisible() } else { contact_events_image.beGone() contact_events_holder.beGone() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt index eb36d4dd..d973db4e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfExporter.kt @@ -70,7 +70,7 @@ class VcfExporter { } contact.events.forEach { - if (it.type == CommonDataKinds.Event.TYPE_BIRTHDAY || it.type == CommonDataKinds.Event.TYPE_ANNIVERSARY) { + if (it.type == CommonDataKinds.Event.TYPE_ANNIVERSARY || it.type == CommonDataKinds.Event.TYPE_BIRTHDAY) { val dateTime = it.value.getDateTimeFromDateString() if (it.value.startsWith("--")) { val partialDate = PartialDate.builder().year(null).month(dateTime.monthOfYear).date(dateTime.dayOfMonth).build() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt index 9a959764..a9030e19 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/VcfImporter.kt @@ -88,13 +88,13 @@ class VcfImporter(val activity: SimpleActivity) { } val events = ArrayList() - ezContact.birthdays.forEach { - val event = Event(formatDateToDayCode(it.date), CommonDataKinds.Event.TYPE_BIRTHDAY) + ezContact.anniversaries.forEach { + val event = Event(formatDateToDayCode(it.date), CommonDataKinds.Event.TYPE_ANNIVERSARY) events.add(event) } - ezContact.anniversaries.forEach { - val event = Event(formatDateToDayCode(it.date), CommonDataKinds.Event.TYPE_ANNIVERSARY) + ezContact.birthdays.forEach { + val event = Event(formatDateToDayCode(it.date), CommonDataKinds.Event.TYPE_BIRTHDAY) events.add(event) } diff --git a/app/src/main/res/layout/item_view_event.xml b/app/src/main/res/layout/item_view_event.xml new file mode 100644 index 00000000..002f5cf4 --- /dev/null +++ b/app/src/main/res/layout/item_view_event.xml @@ -0,0 +1,35 @@ + + + + + + + + From 4113aa681dd478da46a155a4088e304604d1fcaa Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 21:03:39 +0200 Subject: [PATCH 37/48] show websites at contact details --- .../pro/activities/ViewContactActivity.kt | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index d8ee9295..4b4eb194 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -19,10 +19,10 @@ import com.simplemobiletools.contacts.pro.extensions.* import com.simplemobiletools.contacts.pro.helpers.* import com.simplemobiletools.contacts.pro.models.* 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.* import kotlinx.android.synthetic.main.item_view_contact_source.view.* import kotlinx.android.synthetic.main.item_view_email.view.* +import kotlinx.android.synthetic.main.item_view_event.view.* import kotlinx.android.synthetic.main.item_view_group.view.* import kotlinx.android.synthetic.main.item_view_im.view.* import kotlinx.android.synthetic.main.item_view_phone_number.view.* @@ -208,13 +208,13 @@ class ViewContactActivity : ContactActivity() { setupAddresses() setupIMs() setupEvents() + setupNotes() + setupOrganization() + setupWebsites() setupContactSources() } } - setupNotes() - setupOrganization() - setupWebsites() setupGroups() } @@ -487,22 +487,33 @@ 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 - copyOnLongClick(url) + if (showFields and SHOW_WEBSITES_FIELD != 0) { + var websites = contact!!.websites.toMutableSet() as LinkedHashSet + duplicateContacts.forEach { + websites.addAll(it.websites) + } - setOnClickListener { - openWebsiteIntent(url) + websites = websites.sorted().toMutableSet() as LinkedHashSet + + if (websites.isNotEmpty()) { + 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 + copyOnLongClick(url) + + setOnClickListener { + openWebsiteIntent(url) + } } } + contact_websites_image.beVisible() + contact_websites_holder.beVisible() + } else { + contact_websites_image.beGone() + contact_websites_holder.beGone() } - contact_websites_image.beVisible() - contact_websites_holder.beVisible() } else { contact_websites_image.beGone() contact_websites_holder.beGone() From 8afdf0430ee8e00d2c6ee643e5e38984c30fc5d9 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 21:11:11 +0200 Subject: [PATCH 38/48] show groups as the last field at contacts too --- .../pro/activities/ViewContactActivity.kt | 40 ++++++++++++------- .../main/res/layout/activity_view_contact.xml | 2 +- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 4b4eb194..ecfe0498 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -208,14 +208,13 @@ class ViewContactActivity : ContactActivity() { setupAddresses() setupIMs() setupEvents() + setupWebsites() + setupGroups() + setupContactSources() setupNotes() setupOrganization() - setupWebsites() - setupContactSources() } } - - setupGroups() } private fun launchEditContact(contact: Contact) { @@ -522,18 +521,29 @@ class ViewContactActivity : ContactActivity() { private fun setupGroups() { contact_groups_holder.removeAllViews() - val groups = contact!!.groups - 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 - copyOnLongClick(group.title) - } + if (showFields and SHOW_GROUPS_FIELD != 0) { + var groups = contact!!.groups.toMutableSet() as LinkedHashSet + duplicateContacts.forEach { + groups.addAll(it.groups) + } + + groups = groups.sortedBy { it.title }.toMutableSet() as LinkedHashSet + + if (groups.isNotEmpty()) { + 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 + copyOnLongClick(group.title) + } + } + contact_groups_image.beVisible() + contact_groups_holder.beVisible() + } else { + contact_groups_image.beGone() + contact_groups_holder.beGone() } - contact_groups_image.beVisible() - contact_groups_holder.beVisible() } else { contact_groups_image.beGone() contact_groups_holder.beGone() diff --git a/app/src/main/res/layout/activity_view_contact.xml b/app/src/main/res/layout/activity_view_contact.xml index d12aa28c..81a0a1d6 100644 --- a/app/src/main/res/layout/activity_view_contact.xml +++ b/app/src/main/res/layout/activity_view_contact.xml @@ -374,7 +374,7 @@ android:id="@+id/contact_sources_holder" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_below="@+id/contact_websites_holder" + android:layout_below="@+id/contact_groups_holder" android:layout_toEndOf="@+id/contact_name_image" android:orientation="vertical" android:paddingStart="@dimen/small_margin" From 6b26ec4199154fd653e3f1606c3b7e7131566a47 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 21:14:40 +0200 Subject: [PATCH 39/48] some code and style cleanup --- .../contacts/pro/activities/ViewContactActivity.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index ecfe0498..92c5a5ca 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -329,6 +329,7 @@ class ViewContactActivity : ContactActivity() { } } + // a contact cannot have different emails per contact source. Such contacts are handled as separate ones, not duplicates of each other private fun setupEmails() { contact_emails_holder.removeAllViews() val emails = contact!!.emails @@ -493,7 +494,6 @@ class ViewContactActivity : ContactActivity() { } websites = websites.sorted().toMutableSet() as LinkedHashSet - if (websites.isNotEmpty()) { websites.forEach { val url = it @@ -528,7 +528,6 @@ class ViewContactActivity : ContactActivity() { } groups = groups.sortedBy { it.title }.toMutableSet() as LinkedHashSet - if (groups.isNotEmpty()) { groups.forEach { layoutInflater.inflate(R.layout.item_view_group, contact_groups_holder, false).apply { @@ -551,6 +550,7 @@ class ViewContactActivity : ContactActivity() { } private fun setupContactSources() { + contact_sources_holder.removeAllViews() if (showFields and SHOW_CONTACT_SOURCE_FIELD != 0) { var sources = HashMap() sources[contact!!] = getPublicContactSourceSync(contact!!.source, contactSources) @@ -562,7 +562,6 @@ class ViewContactActivity : ContactActivity() { sources = sources.toList().sortedBy { (key, value) -> value.toLowerCase() }.toMap() as LinkedHashMap } - contact_sources_holder.removeAllViews() for ((key, value) in sources) { layoutInflater.inflate(R.layout.item_view_contact_source, contact_sources_holder, false).apply { contact_source.text = value From e078fbf0a63a56a329f93dc96177983655c34219 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 22:36:02 +0200 Subject: [PATCH 40/48] improve contact sharing, merge all available contact source values --- .../contacts/pro/activities/ContactActivity.kt | 4 ++-- .../contacts/pro/activities/EditContactActivity.kt | 2 +- .../contacts/pro/activities/ViewContactActivity.kt | 11 ++++++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt index 9fc228cd..cdb316b8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ContactActivity.kt @@ -84,8 +84,8 @@ abstract class ContactActivity : SimpleActivity() { } } - fun shareContact() { - shareContacts(arrayListOf(contact!!)) + fun shareContact(contact: Contact) { + shareContacts(arrayListOf(contact)) } fun trySendSMS() { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt index 4abc748c..eb4c2531 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/EditContactActivity.kt @@ -108,7 +108,7 @@ class EditContactActivity : ContactActivity() { when (item.itemId) { R.id.save -> saveContact() - R.id.share -> shareContact() + R.id.share -> shareContact(contact!!) R.id.open_with -> openWith() R.id.delete -> deleteContact() else -> return super.onOptionsItemSelected(item) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 92c5a5ca..03420d78 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -34,6 +34,7 @@ class ViewContactActivity : ContactActivity() { private var duplicateContacts = ArrayList() private var contactSources = ArrayList() private var showFields = 0 + private var fullContact: Contact? = null // contact with all fields filled from duplicates private val COMPARABLE_PHONE_NUMBER_LENGTH = 7 @@ -85,7 +86,7 @@ class ViewContactActivity : ContactActivity() { when (item.itemId) { R.id.edit -> launchEditContact(contact!!) - R.id.share -> shareContact() + R.id.share -> shareContact(fullContact!!) R.id.open_with -> openWith() R.id.delete -> deleteContactFromAllSources() else -> return super.onOptionsItemSelected(item) @@ -103,6 +104,7 @@ class ViewContactActivity : ContactActivity() { val lookupKey = getLookupKeyFromUri(data) if (lookupKey != null) { contact = ContactsHelper(this).getContactWithLookupKey(lookupKey) + fullContact = contact wasLookupKeyUsed = true } @@ -119,6 +121,7 @@ class ViewContactActivity : ContactActivity() { if (contactId != 0 && !wasLookupKeyUsed) { contact = ContactsHelper(this).getContactWithId(contactId, intent.getBooleanExtra(IS_PRIVATE, false)) + fullContact = contact if (contact == null) { if (!wasEditLaunched) { @@ -297,6 +300,7 @@ class ViewContactActivity : ContactActivity() { }.toMutableSet() as LinkedHashSet phoneNumbers = phoneNumbers.sortedBy { it.type }.toMutableSet() as LinkedHashSet + fullContact!!.phoneNumbers = phoneNumbers.toMutableList() as ArrayList if (phoneNumbers.isNotEmpty()) { phoneNumbers.forEach { layoutInflater.inflate(R.layout.item_view_phone_number, contact_numbers_holder, false).apply { @@ -364,6 +368,7 @@ class ViewContactActivity : ContactActivity() { } addresses = addresses.sortedBy { it.type }.toMutableSet() as LinkedHashSet
+ fullContact!!.addresses = addresses.toMutableList() as ArrayList
if (addresses.isNotEmpty()) { addresses.forEach { layoutInflater.inflate(R.layout.item_view_address, contact_addresses_holder, false).apply { @@ -399,6 +404,7 @@ class ViewContactActivity : ContactActivity() { } IMs = IMs.sortedBy { it.type }.toMutableSet() as LinkedHashSet + fullContact!!.IMs = IMs.toMutableList() as ArrayList if (IMs.isNotEmpty()) { IMs.forEach { layoutInflater.inflate(R.layout.item_view_im, contact_ims_holder, false).apply { @@ -430,6 +436,7 @@ class ViewContactActivity : ContactActivity() { } events = events.sortedBy { it.type }.toMutableSet() as LinkedHashSet + fullContact!!.events = events.toMutableList() as ArrayList if (events.isNotEmpty()) { events.forEach { layoutInflater.inflate(R.layout.item_view_event, contact_events_holder, false).apply { @@ -494,6 +501,7 @@ class ViewContactActivity : ContactActivity() { } websites = websites.sorted().toMutableSet() as LinkedHashSet + fullContact!!.websites = websites.toMutableList() as ArrayList if (websites.isNotEmpty()) { websites.forEach { val url = it @@ -528,6 +536,7 @@ class ViewContactActivity : ContactActivity() { } groups = groups.sortedBy { it.title }.toMutableSet() as LinkedHashSet + fullContact!!.groups = groups.toMutableList() as ArrayList if (groups.isNotEmpty()) { groups.forEach { layoutInflater.inflate(R.layout.item_view_group, contact_groups_holder, false).apply { From cf2b6b6d5e6317077e4e03e4181b0c5c9f8bc28b Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 23:33:51 +0200 Subject: [PATCH 41/48] fix #440, #377, properly export all fields in .ics files --- .../com/simplemobiletools/contacts/pro/extensions/Activity.kt | 1 - .../simplemobiletools/contacts/pro/helpers/ContactsHelper.kt | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt index c032c720..c576b080 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/extensions/Activity.kt @@ -85,7 +85,6 @@ fun SimpleActivity.showContactSourcePicker(currentSource: String, callback: (new } } - fun BaseSimpleActivity.shareContacts(contacts: ArrayList) { val file = getTempFile() if (file == null) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt index 1b9a2df7..3bf36901 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/helpers/ContactsHelper.kt @@ -35,11 +35,11 @@ class ContactsHelper(val context: Context) { if (getAll) { displayContactSources = if (ignoredContactSources.isEmpty()) { - context.getAllContactSources().map { it.getFullIdentifier() }.toMutableList() as ArrayList + context.getAllContactSources().map { it.name }.toMutableList() as ArrayList } else { context.getAllContactSources().filter { it.getFullIdentifier().isNotEmpty() && !ignoredContactSources.contains(it.getFullIdentifier()) - }.map { it.getFullIdentifier() }.toMutableList() as ArrayList + }.map { it.name }.toMutableList() as ArrayList } } From 209dbc799b616076e6ad1696324317d2061bcc6d Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 23:39:09 +0200 Subject: [PATCH 42/48] properly fill all required fields at Sharing from View screen --- .../pro/activities/ViewContactActivity.kt | 260 ++++++++---------- 1 file changed, 118 insertions(+), 142 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 03420d78..4e8b50bc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -284,49 +284,45 @@ class ViewContactActivity : ContactActivity() { } private fun setupPhoneNumbers() { - contact_numbers_holder.removeAllViews() - if (showFields and SHOW_PHONE_NUMBERS_FIELD != 0) { - var phoneNumbers = contact!!.phoneNumbers.toMutableSet() as LinkedHashSet - duplicateContacts.forEach { - phoneNumbers.addAll(it.phoneNumbers) + var phoneNumbers = contact!!.phoneNumbers.toMutableSet() as LinkedHashSet + duplicateContacts.forEach { + phoneNumbers.addAll(it.phoneNumbers) + } + + phoneNumbers = phoneNumbers.distinctBy { + if (it.normalizedNumber != null && it.normalizedNumber!!.length >= COMPARABLE_PHONE_NUMBER_LENGTH) { + it.normalizedNumber?.substring(it.normalizedNumber!!.length - COMPARABLE_PHONE_NUMBER_LENGTH) + } else { + it.normalizedNumber } + }.toMutableSet() as LinkedHashSet - phoneNumbers = phoneNumbers.distinctBy { - if (it.normalizedNumber != null && it.normalizedNumber!!.length >= COMPARABLE_PHONE_NUMBER_LENGTH) { - it.normalizedNumber?.substring(it.normalizedNumber!!.length - COMPARABLE_PHONE_NUMBER_LENGTH) - } else { - it.normalizedNumber - } - }.toMutableSet() as LinkedHashSet + phoneNumbers = phoneNumbers.sortedBy { it.type }.toMutableSet() as LinkedHashSet + fullContact!!.phoneNumbers = phoneNumbers.toMutableList() as ArrayList + contact_numbers_holder.removeAllViews() - phoneNumbers = phoneNumbers.sortedBy { it.type }.toMutableSet() as LinkedHashSet - fullContact!!.phoneNumbers = phoneNumbers.toMutableList() as ArrayList - if (phoneNumbers.isNotEmpty()) { - 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.text = getPhoneNumberTypeText(phoneNumber.type, phoneNumber.label) - copyOnLongClick(phoneNumber.value) + 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.text = getPhoneNumberTypeText(phoneNumber.type, phoneNumber.label) + copyOnLongClick(phoneNumber.value) - setOnClickListener { - if (config.showCallConfirmation) { - CallConfirmationDialog(this@ViewContactActivity, phoneNumber.value) { - startCallIntent(phoneNumber.value) - } - } else { + setOnClickListener { + if (config.showCallConfirmation) { + CallConfirmationDialog(this@ViewContactActivity, phoneNumber.value) { startCallIntent(phoneNumber.value) } + } else { + startCallIntent(phoneNumber.value) } } } - contact_numbers_image.beVisible() - contact_numbers_holder.beVisible() - } else { - contact_numbers_image.beGone() - contact_numbers_holder.beGone() } + contact_numbers_image.beVisible() + contact_numbers_holder.beVisible() } else { contact_numbers_image.beGone() contact_numbers_holder.beGone() @@ -360,35 +356,31 @@ class ViewContactActivity : ContactActivity() { } private fun setupAddresses() { + var addresses = contact!!.addresses.toMutableSet() as LinkedHashSet
+ duplicateContacts.forEach { + addresses.addAll(it.addresses) + } + + addresses = addresses.sortedBy { it.type }.toMutableSet() as LinkedHashSet
+ fullContact!!.addresses = addresses.toMutableList() as ArrayList
contact_addresses_holder.removeAllViews() - if (showFields and SHOW_ADDRESSES_FIELD != 0) { - var addresses = contact!!.addresses.toMutableSet() as LinkedHashSet
- duplicateContacts.forEach { - addresses.addAll(it.addresses) - } - addresses = addresses.sortedBy { it.type }.toMutableSet() as LinkedHashSet
- fullContact!!.addresses = addresses.toMutableList() as ArrayList
- if (addresses.isNotEmpty()) { - 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.text = getAddressTypeText(address.type, address.label) - copyOnLongClick(address.value) + 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.text = getAddressTypeText(address.type, address.label) + copyOnLongClick(address.value) - setOnClickListener { - sendAddressIntent(address.value) - } + setOnClickListener { + sendAddressIntent(address.value) } } - contact_addresses_image.beVisible() - contact_addresses_holder.beVisible() - } else { - contact_addresses_image.beGone() - contact_addresses_holder.beGone() } + contact_addresses_image.beVisible() + contact_addresses_holder.beVisible() } else { contact_addresses_image.beGone() contact_addresses_holder.beGone() @@ -396,31 +388,27 @@ class ViewContactActivity : ContactActivity() { } private fun setupIMs() { - contact_ims_holder.removeAllViews() - if (showFields and SHOW_IMS_FIELD != 0) { - var IMs = contact!!.IMs.toMutableSet() as LinkedHashSet - duplicateContacts.forEach { - IMs.addAll(it.IMs) - } + var IMs = contact!!.IMs.toMutableSet() as LinkedHashSet + duplicateContacts.forEach { + IMs.addAll(it.IMs) + } - IMs = IMs.sortedBy { it.type }.toMutableSet() as LinkedHashSet - fullContact!!.IMs = IMs.toMutableList() as ArrayList - if (IMs.isNotEmpty()) { - IMs.forEach { - layoutInflater.inflate(R.layout.item_view_im, contact_ims_holder, false).apply { - val IM = it - contact_ims_holder.addView(this) - contact_im.text = IM.value - contact_im_type.text = getIMTypeText(IM.type, IM.label) - copyOnLongClick(IM.value) - } + IMs = IMs.sortedBy { it.type }.toMutableSet() as LinkedHashSet + fullContact!!.IMs = IMs.toMutableList() as ArrayList + contact_ims_holder.removeAllViews() + + if (IMs.isNotEmpty() && showFields and SHOW_IMS_FIELD != 0) { + IMs.forEach { + layoutInflater.inflate(R.layout.item_view_im, contact_ims_holder, false).apply { + val IM = it + contact_ims_holder.addView(this) + contact_im.text = IM.value + contact_im_type.text = getIMTypeText(IM.type, IM.label) + copyOnLongClick(IM.value) } - contact_ims_image.beVisible() - contact_ims_holder.beVisible() - } else { - contact_ims_image.beGone() - contact_ims_holder.beGone() } + contact_ims_image.beVisible() + contact_ims_holder.beVisible() } else { contact_ims_image.beGone() contact_ims_holder.beGone() @@ -428,30 +416,26 @@ class ViewContactActivity : ContactActivity() { } private fun setupEvents() { - contact_events_holder.removeAllViews() - if (showFields and SHOW_EVENTS_FIELD != 0) { - var events = contact!!.events.toMutableSet() as LinkedHashSet - duplicateContacts.forEach { - events.addAll(it.events) - } + var events = contact!!.events.toMutableSet() as LinkedHashSet + duplicateContacts.forEach { + events.addAll(it.events) + } - events = events.sortedBy { it.type }.toMutableSet() as LinkedHashSet - fullContact!!.events = events.toMutableList() as ArrayList - if (events.isNotEmpty()) { - events.forEach { - layoutInflater.inflate(R.layout.item_view_event, contact_events_holder, false).apply { - contact_events_holder.addView(this) - it.value.getDateTimeFromDateString(contact_event) - contact_event_type.setText(getEventTextId(it.type)) - copyOnLongClick(it.value) - } + events = events.sortedBy { it.type }.toMutableSet() as LinkedHashSet + fullContact!!.events = events.toMutableList() as ArrayList + contact_events_holder.removeAllViews() + + if (events.isNotEmpty() && showFields and SHOW_EVENTS_FIELD != 0) { + events.forEach { + layoutInflater.inflate(R.layout.item_view_event, contact_events_holder, false).apply { + contact_events_holder.addView(this) + it.value.getDateTimeFromDateString(contact_event) + contact_event_type.setText(getEventTextId(it.type)) + copyOnLongClick(it.value) } - contact_events_image.beVisible() - contact_events_holder.beVisible() - } else { - contact_events_image.beGone() - contact_events_holder.beGone() } + contact_events_image.beVisible() + contact_events_holder.beVisible() } else { contact_events_image.beGone() contact_events_holder.beGone() @@ -493,34 +477,30 @@ class ViewContactActivity : ContactActivity() { } private fun setupWebsites() { + var websites = contact!!.websites.toMutableSet() as LinkedHashSet + duplicateContacts.forEach { + websites.addAll(it.websites) + } + + websites = websites.sorted().toMutableSet() as LinkedHashSet + fullContact!!.websites = websites.toMutableList() as ArrayList contact_websites_holder.removeAllViews() - if (showFields and SHOW_WEBSITES_FIELD != 0) { - var websites = contact!!.websites.toMutableSet() as LinkedHashSet - duplicateContacts.forEach { - websites.addAll(it.websites) - } - websites = websites.sorted().toMutableSet() as LinkedHashSet - fullContact!!.websites = websites.toMutableList() as ArrayList - if (websites.isNotEmpty()) { - 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 - copyOnLongClick(url) + 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 + copyOnLongClick(url) - setOnClickListener { - openWebsiteIntent(url) - } + setOnClickListener { + openWebsiteIntent(url) } } - contact_websites_image.beVisible() - contact_websites_holder.beVisible() - } else { - contact_websites_image.beGone() - contact_websites_holder.beGone() } + contact_websites_image.beVisible() + contact_websites_holder.beVisible() } else { contact_websites_image.beGone() contact_websites_holder.beGone() @@ -528,30 +508,26 @@ class ViewContactActivity : ContactActivity() { } private fun setupGroups() { - contact_groups_holder.removeAllViews() - if (showFields and SHOW_GROUPS_FIELD != 0) { - var groups = contact!!.groups.toMutableSet() as LinkedHashSet - duplicateContacts.forEach { - groups.addAll(it.groups) - } + var groups = contact!!.groups.toMutableSet() as LinkedHashSet + duplicateContacts.forEach { + groups.addAll(it.groups) + } - groups = groups.sortedBy { it.title }.toMutableSet() as LinkedHashSet - fullContact!!.groups = groups.toMutableList() as ArrayList - if (groups.isNotEmpty()) { - 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 - copyOnLongClick(group.title) - } + groups = groups.sortedBy { it.title }.toMutableSet() as LinkedHashSet + fullContact!!.groups = groups.toMutableList() as ArrayList + contact_groups_holder.removeAllViews() + + 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 + copyOnLongClick(group.title) } - contact_groups_image.beVisible() - contact_groups_holder.beVisible() - } else { - contact_groups_image.beGone() - contact_groups_holder.beGone() } + contact_groups_image.beVisible() + contact_groups_holder.beVisible() } else { contact_groups_image.beGone() contact_groups_holder.beGone() From 83de6b1dce07a7f9d620dac412fbde7a7d83c589 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 23:40:03 +0200 Subject: [PATCH 43/48] reordering some functions --- .../pro/activities/ViewContactActivity.kt | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index 4e8b50bc..c9f91bad 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -442,40 +442,6 @@ class ViewContactActivity : ContactActivity() { } } - private fun setupNotes() { - val notes = contact!!.notes - if (notes.isNotEmpty() && showFields and SHOW_NOTES_FIELD != 0) { - contact_notes.text = notes - contact_notes_image.beVisible() - contact_notes.beVisible() - contact_notes.copyOnLongClick(notes) - } else { - contact_notes_image.beGone() - contact_notes.beGone() - } - } - - private fun setupOrganization() { - val organization = contact!!.organization - if (organization.isNotEmpty() && 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()) - contact_organization_company.copyOnLongClick(contact_organization_company.value) - contact_organization_job_position.copyOnLongClick(contact_organization_job_position.value) - - if (organization.company.isEmpty() && organization.jobPosition.isNotEmpty()) { - (contact_organization_image.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ALIGN_TOP, contact_organization_job_position.id) - } - } else { - contact_organization_image.beGone() - contact_organization_company.beGone() - contact_organization_job_position.beGone() - } - } - private fun setupWebsites() { var websites = contact!!.websites.toMutableSet() as LinkedHashSet duplicateContacts.forEach { @@ -567,6 +533,40 @@ class ViewContactActivity : ContactActivity() { } } + private fun setupNotes() { + val notes = contact!!.notes + if (notes.isNotEmpty() && showFields and SHOW_NOTES_FIELD != 0) { + contact_notes.text = notes + contact_notes_image.beVisible() + contact_notes.beVisible() + contact_notes.copyOnLongClick(notes) + } else { + contact_notes_image.beGone() + contact_notes.beGone() + } + } + + private fun setupOrganization() { + val organization = contact!!.organization + if (organization.isNotEmpty() && 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()) + contact_organization_company.copyOnLongClick(contact_organization_company.value) + contact_organization_job_position.copyOnLongClick(contact_organization_job_position.value) + + if (organization.company.isEmpty() && organization.jobPosition.isNotEmpty()) { + (contact_organization_image.layoutParams as RelativeLayout.LayoutParams).addRule(RelativeLayout.ALIGN_TOP, contact_organization_job_position.id) + } + } else { + contact_organization_image.beGone() + contact_organization_company.beGone() + contact_organization_job_position.beGone() + } + } + private fun getDuplicateContacts(callback: () -> Unit) { ContactsHelper(this).getDuplicatesOfContact(contact!!, false) { contacts -> ensureBackgroundThread { From ede2e3498aa6bf96ea185a2bd25cb1f00f93d60e Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 23:46:58 +0200 Subject: [PATCH 44/48] update commons to 5.17.17 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e1bf018e..147d167d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,7 +51,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:5.17.16' + implementation 'com.simplemobiletools:commons:5.17.17' implementation 'joda-time:joda-time:2.10.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta2' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.5' From 05458cede2f240c5a4e27974a2834fcc0e656127 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 23:49:27 +0200 Subject: [PATCH 45/48] mention duplicate contact merging in the release notes --- .../simplemobiletools/contacts/pro/activities/MainActivity.kt | 1 + app/src/main/res/values/donottranslate.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt index f0dd2c18..49abd800 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/MainActivity.kt @@ -569,6 +569,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { add(Release(34, R.string.release_34)) add(Release(39, R.string.release_39)) add(Release(40, R.string.release_40)) + add(Release(47, R.string.release_47)) checkWhatsNew(this, BuildConfig.VERSION_CODE) } } diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 6bd73043..e93bca01 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -14,6 +14,7 @@ Telegram + Removed the setting for merging duplicate contacts, merge them always Removed the Recents tab due to Googles\' latest security policies being stricter than initiall thought\n Allow showing letters on the dialpad From db164ae09077e0520ad61edf6c78f542d1f956d9 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 23:54:44 +0200 Subject: [PATCH 46/48] update version to 6.4.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 147d167d..b8a85159 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.simplemobiletools.contacts.pro" minSdkVersion 21 targetSdkVersion 28 - versionCode 46 - versionName "6.3.5" + versionCode 47 + versionName "6.4.0" setProperty("archivesBaseName", "contacts") } From e5a1e90ae6999d7911930bf3dcb94f60dc7ae951 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 15 Sep 2019 23:54:49 +0200 Subject: [PATCH 47/48] updating changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76f705a5..eda7e504 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========== +Version 6.4.0 *(2019-09-15)* +---------------------------- + + * Removed the setting for merging duplicate contacts, merge them always + * Show all contact sources of the contact at the View screen + * Fixed a glitch with some missing fields at exporting contacts in .ics files + Version 6.3.5 *(2019-08-27)* ---------------------------- From 8d8fdcb7d8899a6de37392b8a9ed9ac95f2706b3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 16 Sep 2019 09:20:50 +0200 Subject: [PATCH 48/48] properly update all text colors at the View screen --- .../contacts/pro/activities/ViewContactActivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt index c9f91bad..f92de407 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/pro/activities/ViewContactActivity.kt @@ -216,6 +216,7 @@ class ViewContactActivity : ContactActivity() { setupContactSources() setupNotes() setupOrganization() + updateTextColors(contact_scrollview) } } }