From 5e028ac238cb6acc7ca554986096be8618bc9be2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 24 Aug 2018 22:56:01 +0200 Subject: [PATCH 01/98] update commons to 4.7.0 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index dd3e3290..bf481c76 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,7 +45,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.6.15' + implementation 'com.simplemobiletools:commons:4.7.0' implementation 'joda-time:joda-time:2.9.9' implementation 'com.facebook.stetho:stetho:1.5.0' implementation 'com.android.support.constraint:constraint-layout:1.1.2' From 522eb9635d36c8fcbdbc900c44800529a364d680 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 24 Aug 2018 22:56:07 +0200 Subject: [PATCH 02/98] update version to 4.3.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bf481c76..92f8db6c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.simplemobiletools.contacts" minSdkVersion 16 targetSdkVersion 28 - versionCode 29 - versionName "4.2.2" + versionCode 30 + versionName "4.3.0" setProperty("archivesBaseName", "contacts") } From 121cd92dc366c9c63e547cdc5226c52ff860ef60 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 24 Aug 2018 22:56:18 +0200 Subject: [PATCH 03/98] updating changelog --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c6a8c2c..f3cefa33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Changelog ========== +Version 4.3.0 *(2018-08-24)* +---------------------------- + + * Reworked contact exporting/importing from scratch, use ez-vcard for parsing files + * Couple stability and translation improvements + Version 4.2.2 *(2018-08-13)* ---------------------------- From e4eb7385dda6fb71c4ce61d2dfabfd32d6fcd199 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 1 Sep 2018 23:32:18 +0200 Subject: [PATCH 04/98] update commons to 4.7.1 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 92f8db6c..bc6d47dd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,10 +45,10 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:4.7.0' + implementation 'com.simplemobiletools:commons:4.7.1' implementation 'joda-time:joda-time:2.9.9' implementation 'com.facebook.stetho:stetho:1.5.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.2' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' compile 'com.googlecode.ez-vcard:ez-vcard:0.10.4' debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakCanaryVersion" From 63d3702af336ab0ae5f54bed6efb6e5c577c2e84 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 1 Sep 2018 23:34:04 +0200 Subject: [PATCH 05/98] removing LeakCanary --- app/build.gradle | 7 ------- app/src/main/kotlin/com/simplemobiletools/contacts/App.kt | 5 ----- 2 files changed, 12 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index bc6d47dd..16f18252 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -40,19 +40,12 @@ android { } } -ext { - leakCanaryVersion = '1.5.4' -} - dependencies { implementation 'com.simplemobiletools:commons:4.7.1' implementation 'joda-time:joda-time:2.9.9' implementation 'com.facebook.stetho:stetho:1.5.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' compile 'com.googlecode.ez-vcard:ez-vcard:0.10.4' - - debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakCanaryVersion" - releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:$leakCanaryVersion" } Properties props = new Properties() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/App.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/App.kt index 354a793f..482c5976 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/App.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/App.kt @@ -3,16 +3,11 @@ package com.simplemobiletools.contacts import android.app.Application import com.facebook.stetho.Stetho import com.simplemobiletools.commons.extensions.checkUseEnglish -import com.squareup.leakcanary.LeakCanary class App : Application() { override fun onCreate() { super.onCreate() if (BuildConfig.DEBUG) { - if (LeakCanary.isInAnalyzerProcess(this)) { - return - } - LeakCanary.install(this) Stetho.initializeWithDefaults(this) } From 353462e684e41c933fec7174b9f1acedd5662267 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 1 Sep 2018 23:44:01 +0200 Subject: [PATCH 06/98] fix #241, make sure we show the call confirmation on number click --- .../contacts/activities/ViewContactActivity.kt | 9 ++++++++- .../contacts/dialogs/CallConfirmationDialog.kt | 5 ++--- .../simplemobiletools/contacts/extensions/Activity.kt | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt index 3b41f777..f4af0e7e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt @@ -11,6 +11,7 @@ import android.widget.RelativeLayout import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.dialogs.CallConfirmationDialog import com.simplemobiletools.contacts.extensions.* import com.simplemobiletools.contacts.helpers.* import kotlinx.android.synthetic.main.activity_view_contact.* @@ -225,7 +226,13 @@ class ViewContactActivity : ContactActivity() { contact_number_type.setText(getPhoneNumberTextId(phoneNumber.type)) setOnClickListener { - startCallIntent(phoneNumber.value) + if (config.showCallConfirmation) { + CallConfirmationDialog(this@ViewContactActivity, phoneNumber.value) { + startCallIntent(phoneNumber.value) + } + } else { + startCallIntent(phoneNumber.value) + } } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CallConfirmationDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CallConfirmationDialog.kt index 40f3ef89..66575647 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CallConfirmationDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CallConfirmationDialog.kt @@ -7,10 +7,9 @@ import com.simplemobiletools.commons.extensions.applyColorFilter import com.simplemobiletools.commons.extensions.setupDialogStuff import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.extensions.config -import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.dialog_call_confirmation.view.* -class CallConfirmationDialog(val activity: BaseSimpleActivity, val contact: Contact, private val callback: () -> Unit) { +class CallConfirmationDialog(val activity: BaseSimpleActivity, val callee: String, private val callback: () -> Unit) { private var view = activity.layoutInflater.inflate(R.layout.dialog_call_confirmation, null) init { @@ -18,7 +17,7 @@ class CallConfirmationDialog(val activity: BaseSimpleActivity, val contact: Cont AlertDialog.Builder(activity) .setNegativeButton(R.string.cancel, null) .create().apply { - val title = String.format(activity.getString(R.string.call_person), contact.getFullName()) + val title = String.format(activity.getString(R.string.call_person), callee) activity.setupDialogStuff(view, this, titleText = title) { view.call_confirm_phone.apply { startAnimation(AnimationUtils.loadAnimation(activity, R.anim.pulsing_animation)) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt index a63eb96d..41397cfc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt @@ -36,7 +36,7 @@ fun SimpleActivity.startCallIntent(recipient: String) { fun SimpleActivity.tryStartCall(contact: Contact) { if (config.showCallConfirmation) { - CallConfirmationDialog(this, contact) { + CallConfirmationDialog(this, contact.getFullName()) { startCall(contact) } } else { From 5a0ebde4d30edbc1964a6d3e77f8ab5e029d4f0d Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 2 Sep 2018 10:48:24 +0200 Subject: [PATCH 07/98] fix #244, PartialDate months start at 1 --- .../com/simplemobiletools/contacts/helpers/VcfExporter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt index 4832c2ac..30c5237b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt @@ -76,7 +76,7 @@ class VcfExporter { if (it.type == CommonDataKinds.Event.TYPE_BIRTHDAY || it.type == CommonDataKinds.Event.TYPE_ANNIVERSARY) { val dateTime = it.value.getDateTimeFromDateString() if (it.value.startsWith("--")) { - val partialDate = PartialDate.builder().year(null).month(dateTime.monthOfYear - 1).date(dateTime.dayOfMonth).build() + val partialDate = PartialDate.builder().year(null).month(dateTime.monthOfYear).date(dateTime.dayOfMonth).build() if (it.type == CommonDataKinds.Event.TYPE_BIRTHDAY) { card.birthdays.add(Birthday(partialDate)) } else { From f74cc8cd31c31c7d45b5adf6bb261cb4feaf2ccf Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 2 Sep 2018 12:39:07 +0200 Subject: [PATCH 08/98] retrieve Custom type labels at phone number, email, address --- .../contacts/activities/EditContactActivity.kt | 12 ++++++------ .../contacts/activities/ViewContactActivity.kt | 1 - .../contacts/helpers/ContactsHelper.kt | 18 ++++++++++++------ .../contacts/helpers/VcfImporter.kt | 6 +++--- .../contacts/models/Address.kt | 2 +- .../contacts/models/Contact.kt | 4 ++-- .../simplemobiletools/contacts/models/Email.kt | 2 +- .../contacts/models/PhoneNumber.kt | 2 +- 8 files changed, 26 insertions(+), 21 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index 5acf55af..61bca85f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -150,7 +150,7 @@ class EditContactActivity : ContactActivity() { if (contact!!.id == 0 && intent.extras?.containsKey(KEY_PHONE) == true && (action == Intent.ACTION_INSERT_OR_EDIT || action == Intent.ACTION_INSERT)) { val phoneNumber = intent.extras.get(KEY_PHONE)?.toString() ?: "" - contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE)) + contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE, "")) contact!!.firstName = intent.extras.get(KEY_NAME)?.toString() ?: "" @@ -754,7 +754,7 @@ class EditContactActivity : ContactActivity() { val numberType = getPhoneNumberTypeId(numberHolder.contact_number_type.value) if (number.isNotEmpty()) { - phoneNumbers.add(PhoneNumber(number, numberType)) + phoneNumbers.add(PhoneNumber(number, numberType, "")) } } return phoneNumbers @@ -769,7 +769,7 @@ class EditContactActivity : ContactActivity() { val emailType = getEmailTypeId(emailHolder.contact_email_type.value) if (email.isNotEmpty()) { - emails.add(Email(email, emailType)) + emails.add(Email(email, emailType, "")) } } return emails @@ -784,7 +784,7 @@ class EditContactActivity : ContactActivity() { val addressType = getAddressTypeId(addressHolder.contact_address_type.value) if (address.isNotEmpty()) { - addresses.add(Address(address, addressType)) + addresses.add(Address(address, addressType, "")) } } return addresses @@ -955,7 +955,7 @@ class EditContactActivity : ContactActivity() { private fun parseEmail(contentValues: ContentValues) { val type = contentValues.getAsInteger(CommonDataKinds.Email.DATA2) ?: DEFAULT_EMAIL_TYPE val emailValue = contentValues.getAsString(CommonDataKinds.Email.DATA1) ?: return - val email = Email(emailValue, type) + val email = Email(emailValue, type, "") contact!!.emails.add(email) } @@ -963,7 +963,7 @@ class EditContactActivity : ContactActivity() { val type = contentValues.getAsInteger(CommonDataKinds.StructuredPostal.DATA2) ?: DEFAULT_ADDRESS_TYPE val addressValue = contentValues.getAsString(CommonDataKinds.StructuredPostal.DATA4) ?: contentValues.getAsString(CommonDataKinds.StructuredPostal.DATA1) ?: return - val address = Address(addressValue, type) + val address = Address(addressValue, type, "") contact!!.addresses.add(address) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt index f4af0e7e..6a27df01 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt @@ -57,7 +57,6 @@ class ViewContactActivity : ContactActivity() { return true } - override fun onOptionsItemSelected(item: MenuItem): Boolean { if (contact == null) { return true diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index 17d26c16..b3d441b6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -202,7 +202,8 @@ class ContactsHelper(val activity: Activity) { val projection = arrayOf( ContactsContract.Data.RAW_CONTACT_ID, CommonDataKinds.Phone.NUMBER, - CommonDataKinds.Phone.TYPE + CommonDataKinds.Phone.TYPE, + CommonDataKinds.Phone.LABEL ) val selection = if (contactId == null) getSourcesSelection() else "${ContactsContract.Data.RAW_CONTACT_ID} = ?" @@ -216,12 +217,13 @@ class ContactsHelper(val activity: Activity) { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val number = cursor.getStringValue(CommonDataKinds.Phone.NUMBER) ?: continue val type = cursor.getIntValue(CommonDataKinds.Phone.TYPE) + val label = cursor.getStringValue(CommonDataKinds.Phone.LABEL) ?: "" if (phoneNumbers[id] == null) { phoneNumbers.put(id, ArrayList()) } - val phoneNumber = PhoneNumber(number, type) + val phoneNumber = PhoneNumber(number, type, label) phoneNumbers[id].add(phoneNumber) } while (cursor.moveToNext()) } @@ -270,7 +272,8 @@ class ContactsHelper(val activity: Activity) { val projection = arrayOf( ContactsContract.Data.RAW_CONTACT_ID, CommonDataKinds.Email.DATA, - CommonDataKinds.Email.TYPE + CommonDataKinds.Email.TYPE, + CommonDataKinds.Email.LABEL ) val selection = if (contactId == null) getSourcesSelection() else "${ContactsContract.Data.RAW_CONTACT_ID} = ?" @@ -284,12 +287,13 @@ class ContactsHelper(val activity: Activity) { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val email = cursor.getStringValue(CommonDataKinds.Email.DATA) ?: continue val type = cursor.getIntValue(CommonDataKinds.Email.TYPE) + val label = cursor.getStringValue(CommonDataKinds.Email.LABEL) ?: "" if (emails[id] == null) { emails.put(id, ArrayList()) } - emails[id]!!.add(Email(email, type)) + emails[id]!!.add(Email(email, type, label)) } while (cursor.moveToNext()) } } catch (e: Exception) { @@ -307,7 +311,8 @@ class ContactsHelper(val activity: Activity) { val projection = arrayOf( ContactsContract.Data.RAW_CONTACT_ID, CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, - CommonDataKinds.StructuredPostal.TYPE + CommonDataKinds.StructuredPostal.TYPE, + CommonDataKinds.StructuredPostal.LABEL ) val selection = if (contactId == null) getSourcesSelection() else "${ContactsContract.Data.RAW_CONTACT_ID} = ?" @@ -321,12 +326,13 @@ class ContactsHelper(val activity: Activity) { val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) val address = cursor.getStringValue(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS) ?: continue val type = cursor.getIntValue(CommonDataKinds.StructuredPostal.TYPE) + val label = cursor.getStringValue(CommonDataKinds.StructuredPostal.LABEL) ?: "" if (addresses[id] == null) { addresses.put(id, ArrayList()) } - addresses[id]!!.add(Address(address, type)) + addresses[id]!!.add(Address(address, type, label)) } while (cursor.moveToNext()) } } catch (e: Exception) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt index d247b0ba..fc21a2e0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -50,14 +50,14 @@ class VcfImporter(val activity: SimpleActivity) { ezContact.telephoneNumbers.forEach { val type = getPhoneNumberTypeId(it.types.firstOrNull()?.value ?: MOBILE) val number = it.text - phoneNumbers.add(PhoneNumber(number, type)) + phoneNumbers.add(PhoneNumber(number, type, "")) } val emails = ArrayList() ezContact.emails.forEach { val type = getEmailTypeId(it.types.firstOrNull()?.value ?: HOME) val email = it.value - emails.add(Email(email, type)) + emails.add(Email(email, type, "")) } val addresses = ArrayList
() @@ -65,7 +65,7 @@ class VcfImporter(val activity: SimpleActivity) { val type = getAddressTypeId(it.types.firstOrNull()?.value ?: HOME) val address = it.streetAddress if (address?.isNotEmpty() == true) { - addresses.add(Address(address, type)) + addresses.add(Address(address, type, "")) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Address.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Address.kt index 7571a228..cc07321b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Address.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Address.kt @@ -1,3 +1,3 @@ package com.simplemobiletools.contacts.models -data class Address(var value: String, var type: Int) +data class Address(var value: String, var type: Int, var label: String) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt index 6a18a265..ccf31bca 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt @@ -94,10 +94,10 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m fun getHashToCompare(): Int { val newPhoneNumbers = ArrayList() - phoneNumbers.mapTo(newPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0) } + phoneNumbers.mapTo(newPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } val newEmails = ArrayList() - emails.mapTo(newEmails) { Email(it.value, 0) } + emails.mapTo(newEmails) { Email(it.value, 0, "") } return copy(id = 0, prefix = "", firstName = getFullName().toLowerCase(), middleName = "", surname = "", suffix = "", nickname = "", photoUri = "", phoneNumbers = newPhoneNumbers, events = ArrayList(), addresses = ArrayList(), emails = newEmails, source = "", starred = 0, diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Email.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Email.kt index 268bf7e9..caeafc0d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Email.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Email.kt @@ -1,3 +1,3 @@ package com.simplemobiletools.contacts.models -data class Email(var value: String, var type: Int) +data class Email(var value: String, var type: Int, var label: String) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/PhoneNumber.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/PhoneNumber.kt index e1eee4cf..1dd39896 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/PhoneNumber.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/PhoneNumber.kt @@ -1,3 +1,3 @@ package com.simplemobiletools.contacts.models -data class PhoneNumber(var value: String, var type: Int) +data class PhoneNumber(var value: String, var type: Int, var label: String) From ccd995dc44b02f5d6609282b981be9d832e735a1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 2 Sep 2018 21:12:39 +0200 Subject: [PATCH 09/98] display custom phone number type label when appropriate --- .../contacts/activities/ContactActivity.kt | 24 ++++++++++++------- .../activities/EditContactActivity.kt | 12 +++++----- .../activities/ViewContactActivity.kt | 2 +- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt index 77e4e764..20b8b188 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt @@ -107,15 +107,21 @@ abstract class ContactActivity : SimpleActivity() { } } - fun getPhoneNumberTextId(type: Int) = when (type) { - ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE -> R.string.mobile - ContactsContract.CommonDataKinds.Phone.TYPE_HOME -> R.string.home - ContactsContract.CommonDataKinds.Phone.TYPE_WORK -> R.string.work - ContactsContract.CommonDataKinds.Phone.TYPE_MAIN -> R.string.main_number - ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK -> R.string.work_fax - ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME -> R.string.home_fax - ContactsContract.CommonDataKinds.Phone.TYPE_PAGER -> R.string.pager - else -> R.string.other + fun getPhoneNumberText(type: Int, label: String): String { + return if (type == ContactsContract.CommonDataKinds.BaseTypes.TYPE_CUSTOM) { + label + } else { + getString(when (type) { + ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE -> R.string.mobile + ContactsContract.CommonDataKinds.Phone.TYPE_HOME -> R.string.home + ContactsContract.CommonDataKinds.Phone.TYPE_WORK -> R.string.work + ContactsContract.CommonDataKinds.Phone.TYPE_MAIN -> R.string.main_number + ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK -> R.string.work_fax + ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME -> R.string.home_fax + ContactsContract.CommonDataKinds.Phone.TYPE_PAGER -> R.string.pager + else -> R.string.other + }) + } } fun getEmailTextId(type: Int) = when (type) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index 61bca85f..76db6966 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -361,7 +361,7 @@ class EditContactActivity : ContactActivity() { numberHolder!!.apply { contact_number.setText(number.value) - setupPhoneNumberTypePicker(contact_number_type, number.type) + setupPhoneNumberTypePicker(contact_number_type, number.type, number.label) } } } @@ -514,7 +514,7 @@ class EditContactActivity : ContactActivity() { if (contact!!.phoneNumbers.isEmpty()) { val numberHolder = contact_numbers_holder.getChildAt(0) (numberHolder as? ViewGroup)?.contact_number_type?.apply { - setupPhoneNumberTypePicker(this) + setupPhoneNumberTypePicker(this, DEFAULT_PHONE_NUMBER_TYPE, "") } } @@ -547,9 +547,9 @@ class EditContactActivity : ContactActivity() { } } - private fun setupPhoneNumberTypePicker(numberTypeField: TextView, type: Int = DEFAULT_PHONE_NUMBER_TYPE) { + private fun setupPhoneNumberTypePicker(numberTypeField: TextView, type: Int, label: String) { numberTypeField.apply { - setText(getPhoneNumberTextId(type)) + text = getPhoneNumberText(type, label) setOnClickListener { showNumberTypePicker(it as TextView) } @@ -646,7 +646,7 @@ class EditContactActivity : ContactActivity() { val currentNumberTypeId = getPhoneNumberTypeId(numberTypeField.value) RadioGroupDialog(this, items, currentNumberTypeId) { - numberTypeField.setText(getPhoneNumberTextId(it as Int)) + numberTypeField.text = getPhoneNumberText(it as Int, "") } } @@ -860,7 +860,7 @@ class EditContactActivity : ContactActivity() { private fun addNewPhoneNumberField() { val numberHolder = layoutInflater.inflate(R.layout.item_edit_phone_number, contact_numbers_holder, false) as ViewGroup updateTextColors(numberHolder) - setupPhoneNumberTypePicker(numberHolder.contact_number_type) + setupPhoneNumberTypePicker(numberHolder.contact_number_type, DEFAULT_PHONE_NUMBER_TYPE, "") contact_numbers_holder.addView(numberHolder) contact_numbers_holder.onGlobalLayout { numberHolder.contact_number.requestFocus() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt index 6a27df01..ea5e77af 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt @@ -222,7 +222,7 @@ class ViewContactActivity : ContactActivity() { val phoneNumber = it contact_numbers_holder.addView(this) contact_number.text = phoneNumber.value - contact_number_type.setText(getPhoneNumberTextId(phoneNumber.type)) + contact_number_type.text = getPhoneNumberText(phoneNumber.type, phoneNumber.label) setOnClickListener { if (config.showCallConfirmation) { From a96949ffb5e613afe62c0391304c92ae2c67a2cc Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 2 Sep 2018 21:19:17 +0200 Subject: [PATCH 10/98] show custom email labels as appropriate --- .../contacts/activities/ContactActivity.kt | 20 ++++++++++++------- .../activities/EditContactActivity.kt | 20 +++++++++---------- .../activities/ViewContactActivity.kt | 6 +++--- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt index 20b8b188..52ae1690 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt @@ -107,7 +107,7 @@ abstract class ContactActivity : SimpleActivity() { } } - fun getPhoneNumberText(type: Int, label: String): String { + fun getPhoneNumberTypeText(type: Int, label: String): String { return if (type == ContactsContract.CommonDataKinds.BaseTypes.TYPE_CUSTOM) { label } else { @@ -124,14 +124,20 @@ abstract class ContactActivity : SimpleActivity() { } } - fun getEmailTextId(type: Int) = when (type) { - ContactsContract.CommonDataKinds.Email.TYPE_HOME -> R.string.home - ContactsContract.CommonDataKinds.Email.TYPE_WORK -> R.string.work - ContactsContract.CommonDataKinds.Email.TYPE_MOBILE -> R.string.mobile - else -> R.string.other + fun getEmailTypeText(type: Int, label: String): String { + return if (type == ContactsContract.CommonDataKinds.BaseTypes.TYPE_CUSTOM) { + label + } else { + getString(when (type) { + ContactsContract.CommonDataKinds.Email.TYPE_HOME -> R.string.home + ContactsContract.CommonDataKinds.Email.TYPE_WORK -> R.string.work + ContactsContract.CommonDataKinds.Email.TYPE_MOBILE -> R.string.mobile + else -> R.string.other + }) + } } - fun getAddressTextId(type: Int) = when (type) { + fun getAddressTypeText(type: Int) = when (type) { ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME -> R.string.home ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK -> R.string.work else -> R.string.other diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index 76db6966..1f3dca4c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -376,7 +376,7 @@ class EditContactActivity : ContactActivity() { emailHolder!!.apply { contact_email.setText(email.value) - setupEmailTypePicker(contact_email_type, email.type) + setupEmailTypePicker(contact_email_type, email.type, email.label) } } } @@ -521,7 +521,7 @@ class EditContactActivity : ContactActivity() { if (contact!!.emails.isEmpty()) { val emailHolder = contact_emails_holder.getChildAt(0) (emailHolder as? ViewGroup)?.contact_email_type?.apply { - setupEmailTypePicker(this) + setupEmailTypePicker(this, DEFAULT_EMAIL_TYPE, "") } } @@ -549,16 +549,16 @@ class EditContactActivity : ContactActivity() { private fun setupPhoneNumberTypePicker(numberTypeField: TextView, type: Int, label: String) { numberTypeField.apply { - text = getPhoneNumberText(type, label) + text = getPhoneNumberTypeText(type, label) setOnClickListener { showNumberTypePicker(it as TextView) } } } - private fun setupEmailTypePicker(emailTypeField: TextView, type: Int = DEFAULT_EMAIL_TYPE) { + private fun setupEmailTypePicker(emailTypeField: TextView, type: Int, label: String) { emailTypeField.apply { - setText(getEmailTextId(type)) + text = getEmailTypeText(type, label) setOnClickListener { showEmailTypePicker(it as TextView) } @@ -567,7 +567,7 @@ class EditContactActivity : ContactActivity() { private fun setupAddressTypePicker(addressTypeField: TextView, type: Int = DEFAULT_ADDRESS_TYPE) { addressTypeField.apply { - setText(getAddressTextId(type)) + setText(getAddressTypeText(type)) setOnClickListener { showAddressTypePicker(it as TextView) } @@ -646,7 +646,7 @@ class EditContactActivity : ContactActivity() { val currentNumberTypeId = getPhoneNumberTypeId(numberTypeField.value) RadioGroupDialog(this, items, currentNumberTypeId) { - numberTypeField.text = getPhoneNumberText(it as Int, "") + numberTypeField.text = getPhoneNumberTypeText(it as Int, "") } } @@ -660,7 +660,7 @@ class EditContactActivity : ContactActivity() { val currentEmailTypeId = getEmailTypeId(emailTypeField.value) RadioGroupDialog(this, items, currentEmailTypeId) { - emailTypeField.setText(getEmailTextId(it as Int)) + emailTypeField.setText(getEmailTypeText(it as Int, "")) } } @@ -673,7 +673,7 @@ class EditContactActivity : ContactActivity() { val currentAddressTypeId = getAddressTypeId(addressTypeField.value) RadioGroupDialog(this, items, currentAddressTypeId) { - addressTypeField.setText(getAddressTextId(it as Int)) + addressTypeField.setText(getAddressTypeText(it as Int)) } } @@ -871,7 +871,7 @@ class EditContactActivity : ContactActivity() { private fun addNewEmailField() { val emailHolder = layoutInflater.inflate(R.layout.item_edit_email, contact_emails_holder, false) as ViewGroup updateTextColors(emailHolder) - setupEmailTypePicker(emailHolder.contact_email_type) + setupEmailTypePicker(emailHolder.contact_email_type, DEFAULT_EMAIL_TYPE, "") contact_emails_holder.addView(emailHolder) contact_emails_holder.onGlobalLayout { emailHolder.contact_email.requestFocus() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt index ea5e77af..46a9cebf 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt @@ -222,7 +222,7 @@ class ViewContactActivity : ContactActivity() { val phoneNumber = it contact_numbers_holder.addView(this) contact_number.text = phoneNumber.value - contact_number_type.text = getPhoneNumberText(phoneNumber.type, phoneNumber.label) + contact_number_type.text = getPhoneNumberTypeText(phoneNumber.type, phoneNumber.label) setOnClickListener { if (config.showCallConfirmation) { @@ -252,7 +252,7 @@ class ViewContactActivity : ContactActivity() { val email = it contact_emails_holder.addView(this) contact_email.text = email.value - contact_email_type.setText(getEmailTextId(email.type)) + contact_email_type.text = getEmailTypeText(email.type, email.label) setOnClickListener { sendEmailIntent(email.value) @@ -276,7 +276,7 @@ class ViewContactActivity : ContactActivity() { val address = it contact_addresses_holder.addView(this) contact_address.text = address.value - contact_address_type.setText(getAddressTextId(address.type)) + contact_address_type.setText(getAddressTypeText(address.type)) setOnClickListener { sendAddressIntent(address.value) From 297b7b3be85e04838990f03dc1a97a9ba8d50483 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 2 Sep 2018 21:38:10 +0200 Subject: [PATCH 11/98] show proper custom address types too --- .../contacts/activities/ContactActivity.kt | 14 ++++++++++---- .../contacts/activities/EditContactActivity.kt | 14 +++++++------- .../contacts/activities/ViewContactActivity.kt | 2 +- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt index 52ae1690..fc61b549 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt @@ -137,10 +137,16 @@ abstract class ContactActivity : SimpleActivity() { } } - fun getAddressTypeText(type: Int) = when (type) { - ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME -> R.string.home - ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK -> R.string.work - else -> R.string.other + fun getAddressTypeText(type: Int, label: String): String { + return if (type == ContactsContract.CommonDataKinds.BaseTypes.TYPE_CUSTOM) { + label + } else { + getString(when (type) { + ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME -> R.string.home + ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK -> R.string.work + else -> R.string.other + }) + } } fun getEventTextId(type: Int) = when (type) { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index 1f3dca4c..b3b0a187 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -391,7 +391,7 @@ class EditContactActivity : ContactActivity() { addressHolder!!.apply { contact_address.setText(address.value) - setupAddressTypePicker(contact_address_type, address.type) + setupAddressTypePicker(contact_address_type, address.type, address.label) } } } @@ -528,7 +528,7 @@ class EditContactActivity : ContactActivity() { if (contact!!.addresses.isEmpty()) { val addressHolder = contact_addresses_holder.getChildAt(0) (addressHolder as? ViewGroup)?.contact_address_type?.apply { - setupAddressTypePicker(this) + setupAddressTypePicker(this, DEFAULT_ADDRESS_TYPE, "") } } @@ -565,9 +565,9 @@ class EditContactActivity : ContactActivity() { } } - private fun setupAddressTypePicker(addressTypeField: TextView, type: Int = DEFAULT_ADDRESS_TYPE) { + private fun setupAddressTypePicker(addressTypeField: TextView, type: Int, label: String) { addressTypeField.apply { - setText(getAddressTypeText(type)) + text = getAddressTypeText(type, label) setOnClickListener { showAddressTypePicker(it as TextView) } @@ -660,7 +660,7 @@ class EditContactActivity : ContactActivity() { val currentEmailTypeId = getEmailTypeId(emailTypeField.value) RadioGroupDialog(this, items, currentEmailTypeId) { - emailTypeField.setText(getEmailTypeText(it as Int, "")) + emailTypeField.text = getEmailTypeText(it as Int, "") } } @@ -673,7 +673,7 @@ class EditContactActivity : ContactActivity() { val currentAddressTypeId = getAddressTypeId(addressTypeField.value) RadioGroupDialog(this, items, currentAddressTypeId) { - addressTypeField.setText(getAddressTypeText(it as Int)) + addressTypeField.text = getAddressTypeText(it as Int, "") } } @@ -882,7 +882,7 @@ class EditContactActivity : ContactActivity() { private fun addNewAddressField() { val addressHolder = layoutInflater.inflate(R.layout.item_edit_address, contact_addresses_holder, false) as ViewGroup updateTextColors(addressHolder) - setupAddressTypePicker(addressHolder.contact_address_type) + setupAddressTypePicker(addressHolder.contact_address_type, DEFAULT_ADDRESS_TYPE, "") contact_addresses_holder.addView(addressHolder) contact_addresses_holder.onGlobalLayout { addressHolder.contact_address.requestFocus() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt index 46a9cebf..0da6abe9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt @@ -276,7 +276,7 @@ class ViewContactActivity : ContactActivity() { val address = it contact_addresses_holder.addView(this) contact_address.text = address.value - contact_address_type.setText(getAddressTypeText(address.type)) + contact_address_type.text = getAddressTypeText(address.type, address.label) setOnClickListener { sendAddressIntent(address.value) From 5bd429709bdb83211210a9f28dc94590662cbc0c Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 2 Sep 2018 23:27:30 +0200 Subject: [PATCH 12/98] allow inserting and saving custom labels --- app/build.gradle | 2 +- .../activities/EditContactActivity.kt | 52 ++++++++++++++----- .../contacts/dialogs/CustomLabelDialog.kt | 36 +++++++++++++ .../contacts/helpers/ContactsHelper.kt | 6 +++ .../main/res/layout/dialog_custom_label.xml | 19 +++++++ 5 files changed, 102 insertions(+), 13 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CustomLabelDialog.kt create mode 100644 app/src/main/res/layout/dialog_custom_label.xml diff --git a/app/build.gradle b/app/build.gradle index 16f18252..fc1fb411 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,7 +41,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:4.7.1' + implementation 'com.simplemobiletools:commons:4.7.2' implementation 'joda-time:joda-time:2.9.9' implementation 'com.facebook.stetho:stetho:1.5.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index b3b0a187..267129bd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -21,6 +21,7 @@ import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.dialogs.CustomLabelDialog import com.simplemobiletools.contacts.dialogs.SelectGroupsDialog import com.simplemobiletools.contacts.extensions.* import com.simplemobiletools.contacts.helpers.* @@ -641,12 +642,19 @@ class EditContactActivity : ContactActivity() { RadioItem(CommonDataKinds.Phone.TYPE_FAX_WORK, getString(R.string.work_fax)), RadioItem(CommonDataKinds.Phone.TYPE_FAX_HOME, getString(R.string.home_fax)), RadioItem(CommonDataKinds.Phone.TYPE_PAGER, getString(R.string.pager)), - RadioItem(CommonDataKinds.Phone.TYPE_OTHER, getString(R.string.other)) + RadioItem(CommonDataKinds.Phone.TYPE_OTHER, getString(R.string.other)), + RadioItem(CommonDataKinds.Phone.TYPE_CUSTOM, getString(R.string.custom)) ) val currentNumberTypeId = getPhoneNumberTypeId(numberTypeField.value) RadioGroupDialog(this, items, currentNumberTypeId) { - numberTypeField.text = getPhoneNumberTypeText(it as Int, "") + if (it as Int == CommonDataKinds.Phone.TYPE_CUSTOM) { + CustomLabelDialog(this) { + numberTypeField.text = it + } + } else { + numberTypeField.text = getPhoneNumberTypeText(it, "") + } } } @@ -655,12 +663,19 @@ class EditContactActivity : ContactActivity() { RadioItem(CommonDataKinds.Email.TYPE_HOME, getString(R.string.home)), RadioItem(CommonDataKinds.Email.TYPE_WORK, getString(R.string.work)), RadioItem(CommonDataKinds.Email.TYPE_MOBILE, getString(R.string.mobile)), - RadioItem(CommonDataKinds.Email.TYPE_OTHER, getString(R.string.other)) + RadioItem(CommonDataKinds.Email.TYPE_OTHER, getString(R.string.other)), + RadioItem(CommonDataKinds.Email.TYPE_CUSTOM, getString(R.string.custom)) ) val currentEmailTypeId = getEmailTypeId(emailTypeField.value) RadioGroupDialog(this, items, currentEmailTypeId) { - emailTypeField.text = getEmailTypeText(it as Int, "") + if (it as Int == CommonDataKinds.Email.TYPE_CUSTOM) { + CustomLabelDialog(this) { + emailTypeField.text = it + } + } else { + emailTypeField.text = getEmailTypeText(it, "") + } } } @@ -668,12 +683,19 @@ class EditContactActivity : ContactActivity() { val items = arrayListOf( RadioItem(CommonDataKinds.StructuredPostal.TYPE_HOME, getString(R.string.home)), RadioItem(CommonDataKinds.StructuredPostal.TYPE_WORK, getString(R.string.work)), - RadioItem(CommonDataKinds.StructuredPostal.TYPE_OTHER, getString(R.string.other)) + RadioItem(CommonDataKinds.StructuredPostal.TYPE_OTHER, getString(R.string.other)), + RadioItem(CommonDataKinds.StructuredPostal.TYPE_CUSTOM, getString(R.string.custom)) ) val currentAddressTypeId = getAddressTypeId(addressTypeField.value) RadioGroupDialog(this, items, currentAddressTypeId) { - addressTypeField.text = getAddressTypeText(it as Int, "") + if (it as Int == CommonDataKinds.StructuredPostal.TYPE_CUSTOM) { + CustomLabelDialog(this) { + addressTypeField.text = it + } + } else { + addressTypeField.text = getAddressTypeText(it, "") + } } } @@ -752,9 +774,10 @@ class EditContactActivity : ContactActivity() { val numberHolder = contact_numbers_holder.getChildAt(i) val number = numberHolder.contact_number.value val numberType = getPhoneNumberTypeId(numberHolder.contact_number_type.value) + val numberLabel = if (numberType == CommonDataKinds.Phone.TYPE_CUSTOM) numberHolder.contact_number_type.value else "" if (number.isNotEmpty()) { - phoneNumbers.add(PhoneNumber(number, numberType, "")) + phoneNumbers.add(PhoneNumber(number, numberType, numberLabel)) } } return phoneNumbers @@ -767,9 +790,10 @@ class EditContactActivity : ContactActivity() { val emailHolder = contact_emails_holder.getChildAt(i) val email = emailHolder.contact_email.value val emailType = getEmailTypeId(emailHolder.contact_email_type.value) + val emailLabel = if (emailType == CommonDataKinds.Email.TYPE_CUSTOM) emailHolder.contact_email_type.value else "" if (email.isNotEmpty()) { - emails.add(Email(email, emailType, "")) + emails.add(Email(email, emailType, emailLabel)) } } return emails @@ -782,9 +806,10 @@ class EditContactActivity : ContactActivity() { val addressHolder = contact_addresses_holder.getChildAt(i) val address = addressHolder.contact_address.value val addressType = getAddressTypeId(addressHolder.contact_address_type.value) + val addressLabel = if (addressType == CommonDataKinds.StructuredPostal.TYPE_CUSTOM) addressHolder.contact_address_type.value else "" if (address.isNotEmpty()) { - addresses.add(Address(address, addressType, "")) + addresses.add(Address(address, addressType, addressLabel)) } } return addresses @@ -1027,14 +1052,16 @@ class EditContactActivity : ContactActivity() { getString(R.string.work_fax) -> CommonDataKinds.Phone.TYPE_FAX_WORK getString(R.string.home_fax) -> CommonDataKinds.Phone.TYPE_FAX_HOME getString(R.string.pager) -> CommonDataKinds.Phone.TYPE_PAGER - else -> CommonDataKinds.Phone.TYPE_OTHER + getString(R.string.other) -> CommonDataKinds.Phone.TYPE_OTHER + else -> CommonDataKinds.Phone.TYPE_CUSTOM } private fun getEmailTypeId(value: String) = when (value) { getString(R.string.home) -> CommonDataKinds.Email.TYPE_HOME getString(R.string.work) -> CommonDataKinds.Email.TYPE_WORK getString(R.string.mobile) -> CommonDataKinds.Email.TYPE_MOBILE - else -> CommonDataKinds.Email.TYPE_OTHER + getString(R.string.other) -> CommonDataKinds.Email.TYPE_OTHER + else -> CommonDataKinds.Email.TYPE_CUSTOM } private fun getEventTypeId(value: String) = when (value) { @@ -1046,6 +1073,7 @@ class EditContactActivity : ContactActivity() { private fun getAddressTypeId(value: String) = when (value) { getString(R.string.home) -> CommonDataKinds.StructuredPostal.TYPE_HOME getString(R.string.work) -> CommonDataKinds.StructuredPostal.TYPE_WORK - else -> CommonDataKinds.StructuredPostal.TYPE_OTHER + getString(R.string.other) -> CommonDataKinds.StructuredPostal.TYPE_OTHER + else -> CommonDataKinds.StructuredPostal.TYPE_CUSTOM } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CustomLabelDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CustomLabelDialog.kt new file mode 100644 index 00000000..047f5fe5 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/CustomLabelDialog.kt @@ -0,0 +1,36 @@ +package com.simplemobiletools.contacts.dialogs + +import android.support.v7.app.AlertDialog +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.setupDialogStuff +import com.simplemobiletools.commons.extensions.showKeyboard +import com.simplemobiletools.commons.extensions.toast +import com.simplemobiletools.commons.extensions.value +import com.simplemobiletools.contacts.R +import kotlinx.android.synthetic.main.dialog_custom_label.view.* + +class CustomLabelDialog(val activity: BaseSimpleActivity, val callback: (label: String) -> Unit) { + init { + + val view = activity.layoutInflater.inflate(R.layout.dialog_custom_label, null) + + AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok, null) + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this, R.string.label) { + showKeyboard(view.custom_label_edittext) + getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener { + val label = view.custom_label_edittext.value + if (label.isEmpty()) { + activity.toast(R.string.empty_name) + return@setOnClickListener + } + + callback(label) + dismiss() + } + } + } + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index b3d441b6..bc3699c0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -862,6 +862,7 @@ class ContactsHelper(val activity: Activity) { withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE) withValue(CommonDataKinds.Phone.NUMBER, it.value) withValue(CommonDataKinds.Phone.TYPE, it.type) + withValue(CommonDataKinds.Phone.LABEL, it.label) operations.add(build()) } } @@ -881,6 +882,7 @@ class ContactsHelper(val activity: Activity) { withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Email.CONTENT_ITEM_TYPE) withValue(CommonDataKinds.Email.DATA, it.value) withValue(CommonDataKinds.Email.TYPE, it.type) + withValue(CommonDataKinds.Email.LABEL, it.label) operations.add(build()) } } @@ -900,6 +902,7 @@ class ContactsHelper(val activity: Activity) { withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) withValue(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, it.value) withValue(CommonDataKinds.StructuredPostal.TYPE, it.type) + withValue(CommonDataKinds.StructuredPostal.LABEL, it.label) operations.add(build()) } } @@ -1140,6 +1143,7 @@ class ContactsHelper(val activity: Activity) { withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE) withValue(CommonDataKinds.Phone.NUMBER, it.value) withValue(CommonDataKinds.Phone.TYPE, it.type) + withValue(CommonDataKinds.Phone.LABEL, it.label) operations.add(build()) } } @@ -1151,6 +1155,7 @@ class ContactsHelper(val activity: Activity) { withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Email.CONTENT_ITEM_TYPE) withValue(CommonDataKinds.Email.DATA, it.value) withValue(CommonDataKinds.Email.TYPE, it.type) + withValue(CommonDataKinds.Email.LABEL, it.label) operations.add(build()) } } @@ -1162,6 +1167,7 @@ class ContactsHelper(val activity: Activity) { withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE) withValue(CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, it.value) withValue(CommonDataKinds.StructuredPostal.TYPE, it.type) + withValue(CommonDataKinds.StructuredPostal.LABEL, it.label) operations.add(build()) } } diff --git a/app/src/main/res/layout/dialog_custom_label.xml b/app/src/main/res/layout/dialog_custom_label.xml new file mode 100644 index 00000000..746ae0cd --- /dev/null +++ b/app/src/main/res/layout/dialog_custom_label.xml @@ -0,0 +1,19 @@ + + + + + + From 00d5fbc6beaa7ae221c409162271131eee14f082 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 3 Sep 2018 11:44:17 +0200 Subject: [PATCH 13/98] fix some crashes related to missing Label fields at upgrading from older versions --- .../simplemobiletools/contacts/helpers/DBHelper.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 860b3698..26da1385 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -283,14 +283,27 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont val phoneNumbers = if (phoneNumbersJson == "[]") ArrayList() else gson.fromJson>(phoneNumbersJson, phoneNumbersToken) ?: ArrayList(1) + // labels can be null at upgrading from older app versions, when the label wasn't available at all yet + phoneNumbers.filter { it.label == null }.forEach { + it.label = "" + } + val emailsJson = cursor.getStringValue(COL_EMAILS) val emails = if (emailsJson == "[]") ArrayList() else gson.fromJson>(emailsJson, emailsToken) ?: ArrayList(1) + emails.filter { it.label == null }.forEach { + it.label = "" + } + val addressesJson = cursor.getStringValue(COL_ADDRESSES) val addresses = if (addressesJson == "[]") ArrayList() else gson.fromJson>(addressesJson, addressesToken) ?: ArrayList(1) + addresses.filter { it.label == null }.forEach { + it.label = "" + } + val eventsJson = cursor.getStringValue(COL_EVENTS) val events = if (eventsJson == "[]") ArrayList() else gson.fromJson>(eventsJson, eventsToken) ?: ArrayList(1) From 375cb14e970f26db08914bcadfc372273ef511f1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 3 Sep 2018 12:12:47 +0200 Subject: [PATCH 14/98] properly export custom type values --- .../contacts/helpers/Constants.kt | 1 + .../contacts/helpers/VcfExporter.kt | 27 ++++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index 0f56d22b..c6ec72be 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -56,6 +56,7 @@ const val PHOTO_UNCHANGED = 4 const val CELL = "CELL" const val WORK = "WORK" const val HOME = "HOME" +const val OTHER = "OTHER" const val PREF = "PREF" const val MAIN = "MAIN" const val FAX = "FAX" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt index 30c5237b..b4651fb5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt @@ -15,10 +15,7 @@ import com.simplemobiletools.contacts.helpers.VcfExporter.ExportResult.EXPORT_FA import com.simplemobiletools.contacts.models.Contact import ezvcard.Ezvcard import ezvcard.VCard -import ezvcard.parameter.AddressType -import ezvcard.parameter.EmailType import ezvcard.parameter.ImageType -import ezvcard.parameter.TelephoneType import ezvcard.property.* import ezvcard.util.PartialDate import java.io.File @@ -62,13 +59,13 @@ class VcfExporter { contact.phoneNumbers.forEach { val phoneNumber = Telephone(it.value) - phoneNumber.types.add(TelephoneType.find(getPhoneNumberLabel(it.type))) + phoneNumber.parameters.addType(getPhoneNumberTypeLabel(it.type, it.label)) card.addTelephoneNumber(phoneNumber) } contact.emails.forEach { val email = Email(it.value) - email.types.add(EmailType.find(getEmailTypeLabel(it.type))) + email.parameters.addType(getEmailTypeLabel(it.type, it.label)) card.addEmail(email) } @@ -101,7 +98,7 @@ class VcfExporter { contact.addresses.forEach { val address = Address() address.streetAddress = it.value - address.types.add(AddressType.find(getAddressTypeLabel(it.type))) + address.parameters.addType(getAddressTypeLabel(it.type, it.label)) card.addAddress(address) } @@ -143,24 +140,30 @@ class VcfExporter { } } - private fun getPhoneNumberLabel(type: Int) = when (type) { + private fun getPhoneNumberTypeLabel(type: Int, label: String) = when (type) { CommonDataKinds.Phone.TYPE_MOBILE -> CELL + CommonDataKinds.Phone.TYPE_HOME -> HOME CommonDataKinds.Phone.TYPE_WORK -> WORK CommonDataKinds.Phone.TYPE_MAIN -> PREF CommonDataKinds.Phone.TYPE_FAX_WORK -> WORK_FAX CommonDataKinds.Phone.TYPE_FAX_HOME -> HOME_FAX CommonDataKinds.Phone.TYPE_PAGER -> PAGER - else -> HOME + CommonDataKinds.Phone.TYPE_OTHER -> OTHER + else -> label } - private fun getEmailTypeLabel(type: Int) = when (type) { + private fun getEmailTypeLabel(type: Int, label: String) = when (type) { + CommonDataKinds.Email.TYPE_HOME -> HOME CommonDataKinds.Email.TYPE_WORK -> WORK CommonDataKinds.Email.TYPE_MOBILE -> MOBILE - else -> HOME + CommonDataKinds.Email.TYPE_OTHER -> OTHER + else -> label } - private fun getAddressTypeLabel(type: Int) = when (type) { + private fun getAddressTypeLabel(type: Int, label: String) = when (type) { + CommonDataKinds.StructuredPostal.TYPE_HOME -> HOME CommonDataKinds.StructuredPostal.TYPE_WORK -> WORK - else -> HOME + CommonDataKinds.StructuredPostal.TYPE_OTHER -> OTHER + else -> label } } From 349f3a1fc33327fc33993fb604c32c7541829568 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 3 Sep 2018 13:24:26 +0200 Subject: [PATCH 15/98] fix importing contacts with custom field types --- .../contacts/helpers/VcfImporter.kt | 43 ++++++++++++++----- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt index fc21a2e0..614d5cf6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -48,24 +48,42 @@ class VcfImporter(val activity: SimpleActivity) { val phoneNumbers = ArrayList() ezContact.telephoneNumbers.forEach { - val type = getPhoneNumberTypeId(it.types.firstOrNull()?.value ?: MOBILE) val number = it.text - phoneNumbers.add(PhoneNumber(number, type, "")) + val type = getPhoneNumberTypeId(it.types.firstOrNull()?.value ?: MOBILE) + val label = if (type == CommonDataKinds.Phone.TYPE_CUSTOM) { + it.types.firstOrNull()?.value ?: "" + } else { + "" + } + + phoneNumbers.add(PhoneNumber(number, type, label)) } val emails = ArrayList() ezContact.emails.forEach { - val type = getEmailTypeId(it.types.firstOrNull()?.value ?: HOME) val email = it.value - emails.add(Email(email, type, "")) + val type = getEmailTypeId(it.types.firstOrNull()?.value ?: HOME) + val label = if (type == CommonDataKinds.Email.TYPE_CUSTOM) { + it.types.firstOrNull()?.value ?: "" + } else { + "" + } + + emails.add(Email(email, type, label)) } val addresses = ArrayList
() ezContact.addresses.forEach { - val type = getAddressTypeId(it.types.firstOrNull()?.value ?: HOME) val address = it.streetAddress + val type = getAddressTypeId(it.types.firstOrNull()?.value ?: HOME) + val label = if (type == CommonDataKinds.StructuredPostal.TYPE_CUSTOM) { + it.types.firstOrNull()?.value ?: "" + } else { + "" + } + if (address?.isNotEmpty() == true) { - addresses.add(Address(address, type, "")) + addresses.add(Address(address, type, label)) } } @@ -126,20 +144,23 @@ class VcfImporter(val activity: SimpleActivity) { HOME_FAX -> CommonDataKinds.Phone.TYPE_FAX_HOME FAX -> CommonDataKinds.Phone.TYPE_FAX_WORK PAGER -> CommonDataKinds.Phone.TYPE_PAGER - else -> CommonDataKinds.Phone.TYPE_OTHER + OTHER -> CommonDataKinds.Phone.TYPE_OTHER + else -> CommonDataKinds.Phone.TYPE_CUSTOM } private fun getEmailTypeId(type: String) = when (type.toUpperCase()) { HOME -> CommonDataKinds.Email.TYPE_HOME WORK -> CommonDataKinds.Email.TYPE_WORK MOBILE -> CommonDataKinds.Email.TYPE_MOBILE - else -> CommonDataKinds.Email.TYPE_OTHER + OTHER -> CommonDataKinds.Email.TYPE_OTHER + else -> CommonDataKinds.Email.TYPE_CUSTOM } private fun getAddressTypeId(type: String) = when (type.toUpperCase()) { - HOME -> CommonDataKinds.Email.TYPE_HOME - WORK -> CommonDataKinds.Email.TYPE_WORK - else -> CommonDataKinds.Email.TYPE_OTHER + HOME -> CommonDataKinds.StructuredPostal.TYPE_HOME + WORK -> CommonDataKinds.StructuredPostal.TYPE_WORK + OTHER -> CommonDataKinds.StructuredPostal.TYPE_OTHER + else -> CommonDataKinds.StructuredPostal.TYPE_CUSTOM } private fun savePhoto(byteArray: ByteArray?): String { From bf386f557be29e60d0aae19bb420797d4591dcd7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 3 Sep 2018 14:06:35 +0200 Subject: [PATCH 16/98] fix importing fax type phone numbers --- .../contacts/helpers/VcfImporter.kt | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt index 614d5cf6..ae9dc510 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -49,7 +49,7 @@ class VcfImporter(val activity: SimpleActivity) { val phoneNumbers = ArrayList() ezContact.telephoneNumbers.forEach { val number = it.text - val type = getPhoneNumberTypeId(it.types.firstOrNull()?.value ?: MOBILE) + val type = getPhoneNumberTypeId(it.types.firstOrNull()?.value ?: MOBILE, it.types.getOrNull(1)?.value) val label = if (type == CommonDataKinds.Phone.TYPE_CUSTOM) { it.types.firstOrNull()?.value ?: "" } else { @@ -135,10 +135,22 @@ class VcfImporter(val activity: SimpleActivity) { return dateTime.toString("yyyy-MM-dd") } - private fun getPhoneNumberTypeId(type: String) = when (type.toUpperCase()) { + private fun getPhoneNumberTypeId(type: String, subtype: String?) = when (type.toUpperCase()) { CELL -> CommonDataKinds.Phone.TYPE_MOBILE - HOME -> CommonDataKinds.Phone.TYPE_HOME - WORK -> CommonDataKinds.Phone.TYPE_WORK + HOME -> { + if (subtype?.toUpperCase() == FAX) { + CommonDataKinds.Phone.TYPE_FAX_HOME + } else { + CommonDataKinds.Phone.TYPE_HOME + } + } + WORK -> { + if (subtype?.toUpperCase() == FAX) { + CommonDataKinds.Phone.TYPE_FAX_WORK + } else { + CommonDataKinds.Phone.TYPE_WORK + } + } PREF, MAIN -> CommonDataKinds.Phone.TYPE_MAIN WORK_FAX -> CommonDataKinds.Phone.TYPE_FAX_WORK HOME_FAX -> CommonDataKinds.Phone.TYPE_FAX_HOME From b3d99e99e0bc0724a723c8ee283e15987e46c445 Mon Sep 17 00:00:00 2001 From: Dirkster99 Date: Mon, 3 Sep 2018 16:32:53 +0200 Subject: [PATCH 17/98] Adding group import and export capability https://github.com/SimpleMobileTools/Simple-Contacts/issues/146 --- .../contacts/helpers/VcfExporter.kt | 12 +++++++ .../contacts/helpers/VcfImporter.kt | 32 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt index b4651fb5..399ab49b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt @@ -123,6 +123,18 @@ class VcfExporter { card.addPhoto(photo) } + // Export a list of groups where this contact is a member of + if (contact.groups.size > 0){ + + // Copy groups into a categorized list and add this category into VCard + val groupList = Categories(); + contact.groups.forEach{ + groupList.addParameter("GROUP", it.title); + } + + card.addCategories(groupList); + } + cards.add(card) contactsExported++ } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt index ae9dc510..ca81848c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -5,7 +5,9 @@ import android.graphics.BitmapFactory import android.provider.ContactsContract.CommonDataKinds import android.widget.Toast import com.simplemobiletools.commons.extensions.showErrorToast +import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.activities.SimpleActivity +import com.simplemobiletools.contacts.extensions.dbHelper import com.simplemobiletools.contacts.extensions.getCachePhoto import com.simplemobiletools.contacts.extensions.getCachePhotoUri import com.simplemobiletools.contacts.helpers.VcfImporter.ImportResult.* @@ -102,6 +104,36 @@ class VcfImporter(val activity: SimpleActivity) { val contactId = 0 val notes = ezContact.notes.firstOrNull()?.value ?: "" val groups = ArrayList() + + if (ezContact.categories != null){ // Iterate through categories of this contact (if any) + + // Iterate through group names for this contact + // Check if group already exist and create it if not + // Associate group with this user + val groupNames = ezContact.categories.getParameters("GROUP"); + + if (groupNames != null){ // Resolve group references for this contact + + val storedGroups = ContactsHelper(activity).getStoredGroups(); + groupNames.forEach { + + val groupName = it; + val storedGroup = storedGroups.firstOrNull { it.title == groupName } + + if (storedGroup != null){ + groups.add(storedGroup); // Group is already present on this device + } + else { + // Group is not present on this device, yet so we create a new one + val newcontactGroup = activity.dbHelper.insertGroup(Group(0, groupName)); + + if (newcontactGroup != null) // and associate it with this contact + groups.add(newcontactGroup); + } + } + } + } + val company = ezContact.organization?.values?.firstOrNull() ?: "" val jobPosition = ezContact.titles?.firstOrNull()?.value ?: "" val organization = Organization(company, jobPosition) From 03b739f01e22d3d4a3729f0bf06e92282ee390fa Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 3 Sep 2018 20:33:42 +0200 Subject: [PATCH 18/98] fix #236, specify Telephony as not required in manifest --- app/src/main/AndroidManifest.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4422660d..133f9d70 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -14,6 +14,10 @@ + + From de387a938d6f0346e0f4f899e12c000fd3373714 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 3 Sep 2018 23:41:16 +0200 Subject: [PATCH 19/98] fix #218, improve duplicate contact filtering, show the one with more info --- .../contacts/helpers/ContactsHelper.kt | 16 +++++++++++++--- .../simplemobiletools/contacts/models/Contact.kt | 8 +++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index bc3699c0..9fcf2bb1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -42,12 +42,22 @@ class ContactsHelper(val activity: Activity) { } val contactsSize = contacts.size() - var resultContacts = ArrayList(contactsSize) - (0 until contactsSize).mapTo(resultContacts) { contacts.valueAt(it) } + var tempContacts = ArrayList(contactsSize) + val resultContacts = ArrayList(contactsSize) + (0 until contactsSize).mapTo(tempContacts) { contacts.valueAt(it) } if (activity.config.filterDuplicates) { - resultContacts = resultContacts.distinctBy { + tempContacts = tempContacts.distinctBy { it.getHashToCompare() } as ArrayList + + tempContacts.groupBy { "${it.getFullName().toLowerCase()}${it.emails}" }.values.forEach { + if (it.size == 1) { + resultContacts.add(it.first()) + } else { + val sorted = it.sortedByDescending { it.getStringToCompare().length } + resultContacts.add(sorted.first()) + } + } } // groups are obtained with contactID, not rawID, so assign them to proper contacts like this diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt index ccf31bca..fdbcda8e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt @@ -92,7 +92,7 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m } } - fun getHashToCompare(): Int { + fun getStringToCompare(): String { val newPhoneNumbers = ArrayList() phoneNumbers.mapTo(newPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } @@ -100,7 +100,9 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m emails.mapTo(newEmails) { Email(it.value, 0, "") } return copy(id = 0, prefix = "", firstName = getFullName().toLowerCase(), middleName = "", surname = "", suffix = "", nickname = "", photoUri = "", - phoneNumbers = newPhoneNumbers, events = ArrayList(), addresses = ArrayList(), emails = newEmails, source = "", starred = 0, - contactId = 0, thumbnailUri = "", notes = "", groups = ArrayList(), websites = ArrayList(), organization = Organization("", "")).hashCode() + phoneNumbers = phoneNumbers, events = ArrayList(), addresses = ArrayList(), emails = newEmails, source = "", starred = 0, + contactId = 0, thumbnailUri = "", notes = "", groups = ArrayList(), websites = ArrayList(), organization = Organization("", "")).toString() } + + fun getHashToCompare() = getStringToCompare().hashCode() } From 461ffdfd0eb2fdff345ac4371619a8a1f315fed8 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 09:38:49 +0200 Subject: [PATCH 20/98] make sure we show all contacts if duplicate filtering is disabled --- .../com/simplemobiletools/contacts/helpers/ContactsHelper.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index 9fcf2bb1..e9d8f447 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -58,6 +58,8 @@ class ContactsHelper(val activity: Activity) { resultContacts.add(sorted.first()) } } + } else { + resultContacts.addAll(tempContacts) } // groups are obtained with contactID, not rawID, so assign them to proper contacts like this From 26c4da4f69c476fb579c1a56da8a51d0993bfcca Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 10:09:59 +0200 Subject: [PATCH 21/98] remove special chars from phone numbers at creating, not just at sorting --- .../activities/EditContactActivity.kt | 2 +- .../contacts/helpers/ContactsHelper.kt | 20 ++++++++++++++----- .../contacts/helpers/DBHelper.kt | 5 ++++- .../contacts/helpers/VcfImporter.kt | 3 ++- .../contacts/models/Contact.kt | 9 +++------ 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index 267129bd..86866c4b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -507,7 +507,7 @@ class EditContactActivity : ContactActivity() { originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE val organization = Organization("", "") contact = Contact(0, "", "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), originalContactSource, 0, 0, "", - null, "", ArrayList(), organization, ArrayList()) + null, "", ArrayList(), organization, ArrayList(), ArrayList()) contact_source.text = getPublicContactSource(contact!!.source) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index e9d8f447..6536b555 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -24,6 +24,7 @@ import com.simplemobiletools.contacts.models.* import com.simplemobiletools.contacts.overloads.times import java.text.SimpleDateFormat import java.util.* +import kotlin.collections.ArrayList class ContactsHelper(val activity: Activity) { private val BATCH_SIZE = 100 @@ -127,7 +128,7 @@ class ContactsHelper(val activity: Activity) { val suffix = cursor.getStringValue(CommonDataKinds.StructuredName.SUFFIX) ?: "" val nickname = "" val photoUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_URI) ?: "" - val number = ArrayList() // proper value is obtained below + val numbers = ArrayList() // proper value is obtained below val emails = ArrayList() val addresses = ArrayList
() val events = ArrayList() @@ -139,8 +140,9 @@ class ContactsHelper(val activity: Activity) { val groups = ArrayList() val organization = Organization("", "") val websites = ArrayList() - val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, number, emails, addresses, - events, accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites) + val cleanNumbers = ArrayList() + val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, numbers, emails, addresses, + events, accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, cleanNumbers) contacts.put(id, contact) } while (cursor.moveToNext()) @@ -155,7 +157,15 @@ class ContactsHelper(val activity: Activity) { var size = phoneNumbers.size() for (i in 0 until size) { val key = phoneNumbers.keyAt(i) - contacts[key]?.phoneNumbers = phoneNumbers.valueAt(i) + if (contacts[key] != null) { + val numbers = phoneNumbers.valueAt(i) + contacts[key].phoneNumbers = numbers + + // remove all spaces, dashes etc from numbers for easier comparing, used only at list views + numbers.forEach { + numbers.mapTo(contacts[key].cleanPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } + } + } } val nicknames = getNicknames() @@ -726,7 +736,7 @@ class ContactsHelper(val activity: Activity) { val organization = getOrganizations(id)[id] ?: Organization("", "") val websites = getWebsites(id)[id] ?: ArrayList() return Contact(id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, number, emails, addresses, events, - accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites) + accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ArrayList()) } } finally { cursor?.close() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 26da1385..986443f5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -335,8 +335,11 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont val websites = if (websitesJson == "[]") ArrayList() else gson.fromJson>(websitesJson, websitesToken) ?: ArrayList(1) + val cleanPhoneNumbers = ArrayList() + phoneNumbers.mapTo(cleanPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } + val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, "", phoneNumbers, emails, addresses, - events, SMT_PRIVATE, starred, id, "", photo, notes, groups, organization, websites) + events, SMT_PRIVATE, starred, id, "", photo, notes, groups, organization, websites, cleanPhoneNumbers) contacts.add(contact) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt index ae9dc510..bb7a59ff 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -110,9 +110,10 @@ class VcfImporter(val activity: SimpleActivity) { val photoData = ezContact.photos.firstOrNull()?.data val photo = null val thumbnailUri = savePhoto(photoData) + val cleanPhoneNumbers = ArrayList() val contact = Contact(0, prefix, firstName, middleName, surname, suffix, nickname, photoUri, phoneNumbers, emails, addresses, events, - targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites) + targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, cleanPhoneNumbers) if (ContactsHelper(activity).insertContact(contact)) { contactsImported++ diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt index fdbcda8e..1d7d0a76 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt @@ -5,12 +5,12 @@ import com.simplemobiletools.commons.extensions.normalizeString import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME import com.simplemobiletools.commons.helpers.SORT_DESCENDING -import com.simplemobiletools.contacts.helpers.PHONE_NUMBER_PATTERN data class Contact(val id: Int, var prefix: String, var firstName: String, var middleName: String, var surname: String, var suffix: String, var nickname: String, var photoUri: String, var phoneNumbers: ArrayList, var emails: ArrayList, var addresses: ArrayList
, var events: ArrayList, var source: String, var starred: Int, val contactId: Int, val thumbnailUri: String, var photo: Bitmap?, var notes: String, - var groups: ArrayList, var organization: Organization, var websites: ArrayList) : Comparable { + var groups: ArrayList, var organization: Organization, var websites: ArrayList, var cleanPhoneNumbers: ArrayList) : + Comparable { companion object { var sorting = 0 var startWithSurname = false @@ -93,14 +93,11 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m } fun getStringToCompare(): String { - val newPhoneNumbers = ArrayList() - phoneNumbers.mapTo(newPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } - val newEmails = ArrayList() emails.mapTo(newEmails) { Email(it.value, 0, "") } return copy(id = 0, prefix = "", firstName = getFullName().toLowerCase(), middleName = "", surname = "", suffix = "", nickname = "", photoUri = "", - phoneNumbers = phoneNumbers, events = ArrayList(), addresses = ArrayList(), emails = newEmails, source = "", starred = 0, + phoneNumbers = ArrayList(), events = ArrayList(), addresses = ArrayList(), emails = newEmails, source = "", starred = 0, contactId = 0, thumbnailUri = "", notes = "", groups = ArrayList(), websites = ArrayList(), organization = Organization("", "")).toString() } From d0596df5f38d6823a8174430579a39a68bae5748 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 10:23:27 +0200 Subject: [PATCH 22/98] fill clean phone numbers only if we are going to filter duplicates --- .../simplemobiletools/contacts/helpers/ContactsHelper.kt | 9 ++++++--- .../com/simplemobiletools/contacts/helpers/DBHelper.kt | 6 +++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index 6536b555..fb29adc9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -153,6 +153,7 @@ class ContactsHelper(val activity: Activity) { cursor?.close() } + val filterDuplicates = activity.config.filterDuplicates val phoneNumbers = getPhoneNumbers(null) var size = phoneNumbers.size() for (i in 0 until size) { @@ -161,9 +162,11 @@ class ContactsHelper(val activity: Activity) { val numbers = phoneNumbers.valueAt(i) contacts[key].phoneNumbers = numbers - // remove all spaces, dashes etc from numbers for easier comparing, used only at list views - numbers.forEach { - numbers.mapTo(contacts[key].cleanPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } + if (filterDuplicates) { + // remove all spaces, dashes etc from numbers for easier comparing, used only at list views + numbers.forEach { + numbers.mapTo(contacts[key].cleanPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } + } } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 986443f5..3463d12f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -16,6 +16,7 @@ import com.simplemobiletools.commons.extensions.getBlobValue import com.simplemobiletools.commons.extensions.getIntValue import com.simplemobiletools.commons.extensions.getLongValue import com.simplemobiletools.commons.extensions.getStringValue +import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.getByteArray import com.simplemobiletools.contacts.extensions.getPhotoThumbnailSize import com.simplemobiletools.contacts.models.* @@ -257,6 +258,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont fun getContacts(activity: Activity, selection: String? = null, selectionArgs: Array? = null): ArrayList { val storedGroups = ContactsHelper(activity).getStoredGroups() + val filterDuplicates = activity.config.filterDuplicates val contacts = ArrayList() val projection = arrayOf(COL_ID, COL_PREFIX, COL_FIRST_NAME, COL_MIDDLE_NAME, COL_SURNAME, COL_SUFFIX, COL_NICKNAME, COL_PHONE_NUMBERS, COL_EMAILS, COL_EVENTS, COL_STARRED, COL_PHOTO, COL_ADDRESSES, COL_NOTES, COL_GROUPS, COL_COMPANY, COL_JOB_POSITION, COL_WEBSITES) @@ -336,7 +338,9 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont ?: ArrayList(1) val cleanPhoneNumbers = ArrayList() - phoneNumbers.mapTo(cleanPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } + if (filterDuplicates) { + phoneNumbers.mapTo(cleanPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } + } val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, "", phoneNumbers, emails, addresses, events, SMT_PRIVATE, starred, id, "", photo, notes, groups, organization, websites, cleanPhoneNumbers) From 5f4476c6af07f2b5a425acf35d75a104dae7ac93 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 12:28:42 +0200 Subject: [PATCH 23/98] adding some IM related strings --- app/src/main/res/drawable-hdpi/ic_im.png | Bin 0 -> 332 bytes app/src/main/res/drawable-xhdpi/ic_im.png | Bin 0 -> 395 bytes app/src/main/res/drawable-xxhdpi/ic_im.png | Bin 0 -> 408 bytes app/src/main/res/drawable-xxxhdpi/ic_im.png | Bin 0 -> 533 bytes app/src/main/res/values-az/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-fr/strings.xml | 1 + app/src/main/res/values-hr/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-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-zh-rTW/strings.xml | 1 + app/src/main/res/values/donottranslate.xml | 9 +++++++++ app/src/main/res/values/strings.xml | 1 + 20 files changed, 24 insertions(+) create mode 100644 app/src/main/res/drawable-hdpi/ic_im.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_im.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_im.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_im.png diff --git a/app/src/main/res/drawable-hdpi/ic_im.png b/app/src/main/res/drawable-hdpi/ic_im.png new file mode 100644 index 0000000000000000000000000000000000000000..7a16bc7c6ef8797575803906605533963cea8c89 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8JTQ)&0;z(m1Q>+Lp7+`eqtzWRsO(YS=ZKYmF}Z)by{VyCZBvc2{rvxLZQ7 z;fk@t`dzQ9rmW_^$sH1^bctQXe!a)-Rj(@3p3C?7IDC3p@SgwK2BrPi!w)dZ{#@o4 z7y5ih_M>%wm(Knl*mgu}%7Z@)o_(TR+CGg-pO{*I*>FH6*!hg0bB$8&HHJLct9<0WdJRh#4qCL6S$o1SI497_B@h^eW4q z+3)SHBuh|KRAk{mM^uawBQB`zqXi)2k}D=uF|?yZ%@cRro0?zF^{kaVw9<<%)^P_v z#hG%Njuc4LB~FrWdSs2%jVgWSR%7*B?>+7_TS@H@t?n= z61R%9z`d=5(Y{VM`QDY!AvgKJ0G2-kxyDr!u;9%V@Xj&@)I2)oAReeAfX%sK=7bP4 pZf)Mv@!kId^2uv>0Vyg<*B7cfk`@dtjOqXY002ovPDHLkV1ip;ojU*k literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_im.png b/app/src/main/res/drawable-xxhdpi/ic_im.png new file mode 100644 index 0000000000000000000000000000000000000000..822a47dd9accfe9e4750f7398f764e71b612e53d GIT binary patch literal 408 zcmV;J0cZY+P)OcMOe*1@{nZ3vDd)M8*pk4}@31L~GANFfqn&r$AiL-DOwFe;tX%bLQ_b z8$?$P!|Z%v)G zGxdN-`KRG%-Cu0S#VM+p*eTyjin_ zD1ZWT1gNkA6cDxmQH)K;J9bwfHZ9=QE#SelfP42@XaliXXQbGizJiVebsaytlar Qruplar Kontakt kökü + Instant messaging (IM) I want to change what fields are visible at contacts. Can I do it? diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 74ec5350..849c7b58 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -108,6 +108,7 @@ Webseiten Gruppen Kontaktquelle + Instant messaging (IM) Ich möchte die sichtbaren Kontaktfelder ändern. Kann ich das machen? diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 34fd69ec..6b962c3a 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -108,6 +108,7 @@ Ιστοσελίδα Ομάδες Προέλευση επαφής + Instant messaging (IM) Θέλω να αλλάξω τα πεδία που θα είναι ορατά στις επαφές. Μπορώ να το κάνω? diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index c8ecf2f7..41cbcd62 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -108,6 +108,7 @@ Sites web Groupe Source du contact + Instant messaging (IM) Je veux changer quelles champs sont visibles. Est-ce que je peux ? diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index e3b2bb3f..ace16063 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -108,6 +108,7 @@ Web stranice Grupe Izvori kontakata + Instant messaging (IM) Želim promijeniti polja koja su vidljiva na kontaktima. Mogu li to napraviti? diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 3235994a..2eec9101 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -108,6 +108,7 @@ ウェブサイト グループ インポート元 + Instant messaging (IM) 連絡先に表示される項目(フィールド)を変更することはできますか? diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 94819d86..f6fdee3a 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -108,6 +108,7 @@ Websites Groups Contact source + Instant messaging (IM) I want to change what fields are visible at contacts. Can I do it? diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 4dbd270c..7d211427 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -108,6 +108,7 @@ Interneto puslapiai Grupės Kontakto šaltinis + Instant messaging (IM) Noriu pakeisti, kokie laukai yra matomi kontaktuose. Ar galiu tai padaryti? diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index f2a6d47f..3745a41f 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -108,6 +108,7 @@ Site Grupos Origem do contacto + Instant messaging (IM) I want to change what fields are visible at contacts. Can I do it? diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c4cc2259..50e4c369 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -108,6 +108,7 @@ Сайты Группы Источник контакта + Instant messaging (IM) Я хочу изменить поля, отображаемые у контактов. Могу ли я это сделать? diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 6e3f3d25..d4a23b33 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -108,6 +108,7 @@ Webstránky Skupiny Zdroje kontaktov + Rýchle správy (IM) Chcem upraviť viditeľné polia kontaktov. Dá sa to? diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index c5f3e8a7..480be2fc 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -108,6 +108,7 @@ Webbplatser Grupper Kontaktkälla + Instant messaging (IM) I want to change what fields are visible at contacts. Can I do it? diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index f849e887..ba9cfd93 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -108,6 +108,7 @@ Web siteleri Gruplar Kişi kaynağı + Instant messaging (IM) Rehberde görüntülenecek alanları değiştirmek istiyorum. Bunu yapabilir miyim? diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index c6f1b48b..362ba455 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -108,6 +108,7 @@ 網站 群組 聯絡人來源 + Instant messaging (IM) 我想要更改在通訊錄會看到哪些欄位。我能這麼做嗎? diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index aa83af5e..1314df06 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -1,6 +1,15 @@ + AIM + Windows Live + Yahoo + Skype + QQ + Hangouts + ICQ + Jabber + Added an optional Nickname field diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d0c4b5f5..eb065320 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -108,6 +108,7 @@ Websites Groups Contact source + Instant messaging (IM) I want to change what fields are visible at contacts. Can I do it? From c416a46214621e16453dc343850067ace866bd55 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 14:47:23 +0200 Subject: [PATCH 24/98] show user IMs when appropriate --- .../contacts/activities/ContactActivity.kt | 17 +++++++ .../activities/EditContactActivity.kt | 25 +++++++++- .../activities/ViewContactActivity.kt | 22 +++++++++ .../dialogs/ManageVisibleFieldsDialog.kt | 1 + .../contacts/helpers/Constants.kt | 1 + .../contacts/helpers/ContactsHelper.kt | 48 ++++++++++++++++++- .../contacts/helpers/DBHelper.kt | 4 +- .../contacts/helpers/VcfImporter.kt | 3 +- .../contacts/models/Contact.kt | 6 ++- .../simplemobiletools/contacts/models/IM.kt | 3 ++ .../main/res/layout/activity_edit_contact.xml | 40 +++++++++++++++- .../main/res/layout/activity_view_contact.xml | 22 ++++++++- .../layout/dialog_manage_visible_fields.xml | 8 ++++ app/src/main/res/layout/item_edit_im.xml | 38 +++++++++++++++ app/src/main/res/layout/item_view_im.xml | 38 +++++++++++++++ app/src/main/res/values/donottranslate.xml | 1 + 16 files changed, 267 insertions(+), 10 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/models/IM.kt create mode 100644 app/src/main/res/layout/item_edit_im.xml create mode 100644 app/src/main/res/layout/item_view_im.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt index fc61b549..08fc75c1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ContactActivity.kt @@ -149,6 +149,23 @@ abstract class ContactActivity : SimpleActivity() { } } + fun getIMTypeText(type: Int, label: String): String { + return if (type == ContactsContract.CommonDataKinds.Im.PROTOCOL_CUSTOM) { + label + } else { + getString(when (type) { + ContactsContract.CommonDataKinds.Im.PROTOCOL_AIM -> R.string.aim + ContactsContract.CommonDataKinds.Im.PROTOCOL_MSN -> R.string.windows_live + ContactsContract.CommonDataKinds.Im.PROTOCOL_YAHOO -> R.string.yahoo + ContactsContract.CommonDataKinds.Im.PROTOCOL_SKYPE -> R.string.skype + ContactsContract.CommonDataKinds.Im.PROTOCOL_QQ -> R.string.qq + ContactsContract.CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK -> R.string.hangouts + ContactsContract.CommonDataKinds.Im.PROTOCOL_ICQ -> R.string.icq + else -> R.string.jabber + }) + } + } + fun getEventTextId(type: Int) = when (type) { ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY -> R.string.birthday ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY -> R.string.anniversary diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index 86866c4b..eae9de09 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -35,7 +35,6 @@ import kotlinx.android.synthetic.main.item_edit_website.view.* import kotlinx.android.synthetic.main.item_event.view.* import org.joda.time.DateTime import org.joda.time.format.DateTimeFormat -import java.util.* class EditContactActivity : ContactActivity() { private val INTENT_TAKE_PHOTO = 1 @@ -183,6 +182,7 @@ class EditContactActivity : ContactActivity() { contact_numbers_image.applyColorFilter(textColor) contact_emails_image.applyColorFilter(textColor) contact_addresses_image.applyColorFilter(textColor) + contact_ims_image.applyColorFilter(textColor) contact_events_image.applyColorFilter(textColor) contact_notes_image.applyColorFilter(textColor) contact_organization_image.applyColorFilter(textColor) @@ -197,6 +197,8 @@ class EditContactActivity : ContactActivity() { contact_emails_add_new.background.applyColorFilter(textColor) contact_addresses_add_new.applyColorFilter(adjustedPrimaryColor) contact_addresses_add_new.background.applyColorFilter(textColor) + contact_ims_add_new.applyColorFilter(adjustedPrimaryColor) + contact_ims_add_new.background.applyColorFilter(textColor) contact_events_add_new.applyColorFilter(adjustedPrimaryColor) contact_events_add_new.background.applyColorFilter(textColor) contact_websites_add_new.applyColorFilter(adjustedPrimaryColor) @@ -212,6 +214,7 @@ class EditContactActivity : ContactActivity() { contact_numbers_add_new.setOnClickListener { addNewPhoneNumberField() } contact_emails_add_new.setOnClickListener { addNewEmailField() } contact_addresses_add_new.setOnClickListener { addNewAddressField() } + contact_ims_add_new.setOnClickListener { addNewIMField() } contact_events_add_new.setOnClickListener { addNewEventField() } contact_websites_add_new.setOnClickListener { addNewWebsiteField() } contact_groups_add_new.setOnClickListener { showSelectGroupsDialog() } @@ -300,6 +303,11 @@ class EditContactActivity : ContactActivity() { contact_addresses_holder.beVisibleIf(areAddressesVisible) contact_addresses_add_new.beVisibleIf(areAddressesVisible) + val areIMsVisible = showFields and SHOW_IMS_FIELD != 0 + contact_ims_image.beVisibleIf(areIMsVisible) + contact_ims_holder.beVisibleIf(areIMsVisible) + contact_ims_add_new.beVisibleIf(areIMsVisible) + val isOrganizationVisible = showFields and SHOW_ORGANIZATION_FIELD != 0 contact_organization_company.beVisibleIf(isOrganizationVisible) contact_organization_job_position.beVisibleIf(isOrganizationVisible) @@ -333,6 +341,7 @@ class EditContactActivity : ContactActivity() { setupPhoneNumbers() setupEmails() setupAddresses() + setupIMs() setupNotes() setupOrganization() setupWebsites() @@ -397,6 +406,10 @@ class EditContactActivity : ContactActivity() { } } + private fun setupIMs() { + + } + private fun setupNotes() { contact_notes.setText(contact!!.notes) } @@ -507,7 +520,7 @@ class EditContactActivity : ContactActivity() { originalContactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE val organization = Organization("", "") contact = Contact(0, "", "", "", "", "", "", "", ArrayList(), ArrayList(), ArrayList(), ArrayList(), originalContactSource, 0, 0, "", - null, "", ArrayList(), organization, ArrayList(), ArrayList()) + null, "", ArrayList(), organization, ArrayList(), ArrayList(), ArrayList()) contact_source.text = getPublicContactSource(contact!!.source) } @@ -815,6 +828,10 @@ class EditContactActivity : ContactActivity() { return addresses } + private fun getFilledIMs() { + + } + private fun getFilledEvents(): ArrayList { val unknown = getString(R.string.unknown) val events = ArrayList() @@ -915,6 +932,10 @@ class EditContactActivity : ContactActivity() { } } + private fun addNewIMField() { + + } + private fun addNewEventField() { val eventHolder = layoutInflater.inflate(R.layout.item_event, contact_events_holder, false) as ViewGroup updateTextColors(eventHolder) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt index 0da6abe9..886d86c5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt @@ -19,6 +19,7 @@ import kotlinx.android.synthetic.main.item_event.view.* import kotlinx.android.synthetic.main.item_view_address.view.* import kotlinx.android.synthetic.main.item_view_email.view.* import kotlinx.android.synthetic.main.item_view_group.view.* +import kotlinx.android.synthetic.main.item_view_im.view.* import kotlinx.android.synthetic.main.item_view_phone_number.view.* import kotlinx.android.synthetic.main.item_website.view.* @@ -153,6 +154,7 @@ class ViewContactActivity : ContactActivity() { setupPhoneNumbers() setupEmails() setupAddresses() + setupIMs() setupEvents() setupNotes() setupOrganization() @@ -291,6 +293,26 @@ class ViewContactActivity : ContactActivity() { } } + private fun setupIMs() { + contact_ims_holder.removeAllViews() + val IMs = contact!!.IMs + if (IMs.isNotEmpty() && showFields and SHOW_IMS_FIELD != 0) { + IMs.forEach { + layoutInflater.inflate(R.layout.item_view_im, contact_ims_holder, false).apply { + val IM = it + contact_ims_holder.addView(this) + contact_im.text = IM.value + contact_im_type.text = getIMTypeText(IM.type, IM.label) + } + } + contact_ims_image.beVisible() + contact_ims_holder.beVisible() + } else { + contact_ims_image.beGone() + contact_ims_holder.beGone() + } + } + private fun setupEvents() { contact_events_holder.removeAllViews() val events = contact!!.events diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt index 9560f4b2..9b9afcf6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/ManageVisibleFieldsDialog.kt @@ -23,6 +23,7 @@ class ManageVisibleFieldsDialog(val activity: BaseSimpleActivity) { put(SHOW_PHONE_NUMBERS_FIELD, R.id.manage_visible_fields_phone_numbers) put(SHOW_EMAILS_FIELD, R.id.manage_visible_fields_emails) put(SHOW_ADDRESSES_FIELD, R.id.manage_visible_fields_addresses) + put(SHOW_IMS_FIELD, R.id.manage_visible_fields_ims) put(SHOW_EVENTS_FIELD, R.id.manage_visible_fields_events) put(SHOW_NOTES_FIELD, R.id.manage_visible_fields_notes) put(SHOW_ORGANIZATION_FIELD, R.id.manage_visible_fields_organization) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index c6ec72be..cd120548 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -85,6 +85,7 @@ const val SHOW_GROUPS_FIELD = 2048 const val SHOW_CONTACT_SOURCE_FIELD = 4096 const val SHOW_WEBSITES_FIELD = 8192 const val SHOW_NICKNAME_FIELD = 16384 +const val SHOW_IMS_FIELD = 32768 const val DEFAULT_EMAIL_TYPE = CommonDataKinds.Email.TYPE_HOME const val DEFAULT_PHONE_NUMBER_TYPE = CommonDataKinds.Phone.TYPE_MOBILE diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index fb29adc9..11cad798 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -141,8 +141,9 @@ class ContactsHelper(val activity: Activity) { val organization = Organization("", "") val websites = ArrayList() val cleanNumbers = ArrayList() + val ims = ArrayList() val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, numbers, emails, addresses, - events, accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, cleanNumbers) + events, accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, cleanNumbers, ims) contacts.put(id, contact) } while (cursor.moveToNext()) @@ -192,6 +193,8 @@ class ContactsHelper(val activity: Activity) { contacts[key]?.addresses = addresses.valueAt(i) } + val IMs = getIMs() + val events = getEvents() size = events.size() for (i in 0 until size) { @@ -369,6 +372,45 @@ class ContactsHelper(val activity: Activity) { return addresses } + private fun getIMs(contactId: Int? = null): SparseArray> { + val IMs = SparseArray>() + val uri = ContactsContract.Data.CONTENT_URI + val projection = arrayOf( + ContactsContract.Data.RAW_CONTACT_ID, + CommonDataKinds.Im.DATA, + CommonDataKinds.Im.PROTOCOL, + CommonDataKinds.Im.CUSTOM_PROTOCOL + ) + + val selection = getSourcesSelection(true, contactId != null) + val selectionArgs = getSourcesSelectionArgs(CommonDataKinds.Im.CONTENT_ITEM_TYPE, contactId) + + var cursor: Cursor? = null + try { + cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null) + if (cursor?.moveToFirst() == true) { + do { + val id = cursor.getIntValue(ContactsContract.Data.RAW_CONTACT_ID) + val IM = cursor.getStringValue(CommonDataKinds.Im.DATA) ?: continue + val type = cursor.getIntValue(CommonDataKinds.Im.PROTOCOL) + val label = cursor.getStringValue(CommonDataKinds.Im.CUSTOM_PROTOCOL) ?: "" + + if (IMs[id] == null) { + IMs.put(id, ArrayList()) + } + + IMs[id]!!.add(IM(IM, type, label)) + } while (cursor.moveToNext()) + } + } catch (e: Exception) { + activity.showErrorToast(e) + } finally { + cursor?.close() + } + + return IMs + } + private fun getEvents(contactId: Int? = null): SparseArray> { val events = SparseArray>() val uri = ContactsContract.Data.CONTENT_URI @@ -738,8 +780,10 @@ class ContactsHelper(val activity: Activity) { val thumbnailUri = cursor.getStringValue(CommonDataKinds.StructuredName.PHOTO_THUMBNAIL_URI) ?: "" val organization = getOrganizations(id)[id] ?: Organization("", "") val websites = getWebsites(id)[id] ?: ArrayList() + val cleanNumbers = ArrayList() + val ims = getIMs(id)[id] ?: ArrayList() return Contact(id, prefix, firstName, middleName, surname, suffix, nickname, photoUri, number, emails, addresses, events, - accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, ArrayList()) + accountName, starred, contactId, thumbnailUri, null, notes, groups, organization, websites, cleanNumbers, ims) } } finally { cursor?.close() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 3463d12f..41845d05 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -342,8 +342,10 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont phoneNumbers.mapTo(cleanPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } } + val IMs = ArrayList() + val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, "", phoneNumbers, emails, addresses, - events, SMT_PRIVATE, starred, id, "", photo, notes, groups, organization, websites, cleanPhoneNumbers) + events, SMT_PRIVATE, starred, id, "", photo, notes, groups, organization, websites, cleanPhoneNumbers, IMs) contacts.add(contact) } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt index bb7a59ff..81f46041 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -111,9 +111,10 @@ class VcfImporter(val activity: SimpleActivity) { val photo = null val thumbnailUri = savePhoto(photoData) val cleanPhoneNumbers = ArrayList() + val IMs = ArrayList() val contact = Contact(0, prefix, firstName, middleName, surname, suffix, nickname, photoUri, phoneNumbers, emails, addresses, events, - targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, cleanPhoneNumbers) + targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, cleanPhoneNumbers, IMs) if (ContactsHelper(activity).insertContact(contact)) { contactsImported++ diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt index 1d7d0a76..de579144 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt @@ -9,7 +9,8 @@ import com.simplemobiletools.commons.helpers.SORT_DESCENDING data class Contact(val id: Int, var prefix: String, var firstName: String, var middleName: String, var surname: String, var suffix: String, var nickname: String, var photoUri: String, var phoneNumbers: ArrayList, var emails: ArrayList, var addresses: ArrayList
, var events: ArrayList, var source: String, var starred: Int, val contactId: Int, val thumbnailUri: String, var photo: Bitmap?, var notes: String, - var groups: ArrayList, var organization: Organization, var websites: ArrayList, var cleanPhoneNumbers: ArrayList) : + var groups: ArrayList, var organization: Organization, var websites: ArrayList, var cleanPhoneNumbers: ArrayList, + var IMs: ArrayList) : Comparable { companion object { var sorting = 0 @@ -98,7 +99,8 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m return copy(id = 0, prefix = "", firstName = getFullName().toLowerCase(), middleName = "", surname = "", suffix = "", nickname = "", photoUri = "", phoneNumbers = ArrayList(), events = ArrayList(), addresses = ArrayList(), emails = newEmails, source = "", starred = 0, - contactId = 0, thumbnailUri = "", notes = "", groups = ArrayList(), websites = ArrayList(), organization = Organization("", "")).toString() + contactId = 0, thumbnailUri = "", notes = "", groups = ArrayList(), websites = ArrayList(), organization = Organization("", ""), + IMs = ArrayList()).toString() } fun getHashToCompare() = getStringToCompare().hashCode() diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/IM.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/IM.kt new file mode 100644 index 00000000..f646e9f4 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/IM.kt @@ -0,0 +1,3 @@ +package com.simplemobiletools.contacts.models + +data class IM(var value: String, var type: Int, var label: String) diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml index 15c77a7c..fa6e8eb7 100644 --- a/app/src/main/res/layout/activity_edit_contact.xml +++ b/app/src/main/res/layout/activity_edit_contact.xml @@ -299,6 +299,44 @@ android:paddingTop="@dimen/medium_margin" android:src="@drawable/ic_plus"/> + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_view_contact.xml b/app/src/main/res/layout/activity_view_contact.xml index e471ae49..74ce627d 100644 --- a/app/src/main/res/layout/activity_view_contact.xml +++ b/app/src/main/res/layout/activity_view_contact.xml @@ -241,6 +241,26 @@ android:orientation="vertical" android:paddingLeft="@dimen/small_margin"/> + + + + diff --git a/app/src/main/res/layout/dialog_manage_visible_fields.xml b/app/src/main/res/layout/dialog_manage_visible_fields.xml index 599fdb88..477e1210 100644 --- a/app/src/main/res/layout/dialog_manage_visible_fields.xml +++ b/app/src/main/res/layout/dialog_manage_visible_fields.xml @@ -86,6 +86,14 @@ android:paddingTop="@dimen/activity_margin" android:text="@string/addresses"/> + + + + + + + + + diff --git a/app/src/main/res/layout/item_view_im.xml b/app/src/main/res/layout/item_view_im.xml new file mode 100644 index 00000000..fb689418 --- /dev/null +++ b/app/src/main/res/layout/item_view_im.xml @@ -0,0 +1,38 @@ + + + + + + + + diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 1314df06..1c7e350b 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -1,6 +1,7 @@ + IM AIM Windows Live Yahoo From fbd58b4bb90293437560c6461bed98f50d07fd8e Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 15:26:56 +0200 Subject: [PATCH 25/98] properly handle IM fields at the edit screen --- .../activities/EditContactActivity.kt | 89 ++++++++++++++++++- .../contacts/helpers/Constants.kt | 1 + 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index eae9de09..dcd70766 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -30,6 +30,7 @@ import kotlinx.android.synthetic.main.activity_edit_contact.* import kotlinx.android.synthetic.main.item_edit_address.view.* import kotlinx.android.synthetic.main.item_edit_email.view.* import kotlinx.android.synthetic.main.item_edit_group.view.* +import kotlinx.android.synthetic.main.item_edit_im.view.* import kotlinx.android.synthetic.main.item_edit_phone_number.view.* import kotlinx.android.synthetic.main.item_edit_website.view.* import kotlinx.android.synthetic.main.item_event.view.* @@ -407,7 +408,18 @@ class EditContactActivity : ContactActivity() { } private fun setupIMs() { + contact!!.IMs.forEachIndexed { index, IM -> + var imHolder = contact_ims_holder.getChildAt(index) + if (imHolder == null) { + imHolder = layoutInflater.inflate(R.layout.item_edit_im, contact_ims_holder, false) + contact_ims_holder.addView(imHolder) + } + imHolder!!.apply { + contact_im.setText(IM.value) + setupIMTypePicker(contact_im_type, IM.type, IM.label) + } + } } private fun setupNotes() { @@ -546,6 +558,13 @@ class EditContactActivity : ContactActivity() { } } + if (contact!!.IMs.isEmpty()) { + val IMHolder = contact_ims_holder.getChildAt(0) + (IMHolder as? ViewGroup)?.contact_im_type?.apply { + setupIMTypePicker(this, DEFAULT_IM_TYPE, "") + } + } + if (contact!!.events.isEmpty()) { val eventHolder = contact_events_holder.getChildAt(0) (eventHolder as? ViewGroup)?.apply { @@ -588,6 +607,15 @@ class EditContactActivity : ContactActivity() { } } + private fun setupIMTypePicker(imTypeField: TextView, type: Int, label: String) { + imTypeField.apply { + text = getIMTypeText(type, label) + setOnClickListener { + showIMTypePicker(it as TextView) + } + } + } + private fun setupEventTypePicker(eventHolder: ViewGroup, type: Int = DEFAULT_EVENT_TYPE) { eventHolder.contact_event_type.apply { setText(getEventTextId(type)) @@ -712,6 +740,31 @@ class EditContactActivity : ContactActivity() { } } + private fun showIMTypePicker(imTypeField: TextView) { + val items = arrayListOf( + RadioItem(CommonDataKinds.Im.PROTOCOL_AIM, getString(R.string.aim)), + RadioItem(CommonDataKinds.Im.PROTOCOL_MSN, getString(R.string.windows_live)), + RadioItem(CommonDataKinds.Im.PROTOCOL_YAHOO, getString(R.string.yahoo)), + RadioItem(CommonDataKinds.Im.PROTOCOL_SKYPE, getString(R.string.skype)), + RadioItem(CommonDataKinds.Im.PROTOCOL_QQ, getString(R.string.qq)), + RadioItem(CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK, getString(R.string.hangouts)), + RadioItem(CommonDataKinds.Im.PROTOCOL_ICQ, getString(R.string.icq)), + RadioItem(CommonDataKinds.Im.PROTOCOL_JABBER, getString(R.string.jabber)), + RadioItem(CommonDataKinds.Im.PROTOCOL_CUSTOM, getString(R.string.custom)) + ) + + val currentIMTypeId = getIMTypeId(imTypeField.value) + RadioGroupDialog(this, items, currentIMTypeId) { + if (it as Int == CommonDataKinds.Im.PROTOCOL_CUSTOM) { + CustomLabelDialog(this) { + imTypeField.text = it + } + } else { + imTypeField.text = getIMTypeText(it, "") + } + } + } + private fun showEventTypePicker(eventTypeField: TextView) { val items = arrayListOf( RadioItem(CommonDataKinds.Event.TYPE_BIRTHDAY, getString(R.string.birthday)), @@ -757,6 +810,7 @@ class EditContactActivity : ContactActivity() { phoneNumbers = getFilledPhoneNumbers() emails = getFilledEmails() addresses = getFilledAddresses() + IMs = getFilledIMs() events = getFilledEvents() starred = if (isContactStarred()) 1 else 0 notes = contact_notes.value @@ -828,8 +882,20 @@ class EditContactActivity : ContactActivity() { return addresses } - private fun getFilledIMs() { + private fun getFilledIMs(): ArrayList { + val IMs = ArrayList() + val IMsCount = contact_ims_holder.childCount + for (i in 0 until IMsCount) { + val IMsHolder = contact_ims_holder.getChildAt(i) + val IM = IMsHolder.contact_im.value + val IMType = getIMTypeId(IMsHolder.contact_im_type.value) + val IMLabel = if (IMType == CommonDataKinds.Im.PROTOCOL_CUSTOM) IMsHolder.contact_im_type.value else "" + if (IM.isNotEmpty()) { + IMs.add(IM(IM, IMType, IMLabel)) + } + } + return IMs } private fun getFilledEvents(): ArrayList { @@ -933,7 +999,14 @@ class EditContactActivity : ContactActivity() { } private fun addNewIMField() { - + val IMHolder = layoutInflater.inflate(R.layout.item_edit_im, contact_ims_holder, false) as ViewGroup + updateTextColors(IMHolder) + setupIMTypePicker(IMHolder.contact_im_type, DEFAULT_IM_TYPE, "") + contact_ims_holder.addView(IMHolder) + contact_ims_holder.onGlobalLayout { + IMHolder.contact_im.requestFocus() + showKeyboard(IMHolder.contact_im) + } } private fun addNewEventField() { @@ -1097,4 +1170,16 @@ class EditContactActivity : ContactActivity() { getString(R.string.other) -> CommonDataKinds.StructuredPostal.TYPE_OTHER else -> CommonDataKinds.StructuredPostal.TYPE_CUSTOM } + + private fun getIMTypeId(value: String) = when (value) { + getString(R.string.aim) -> CommonDataKinds.Im.PROTOCOL_AIM + getString(R.string.windows_live) -> CommonDataKinds.Im.PROTOCOL_MSN + getString(R.string.yahoo) -> CommonDataKinds.Im.PROTOCOL_YAHOO + getString(R.string.skype) -> CommonDataKinds.Im.PROTOCOL_SKYPE + getString(R.string.qq) -> CommonDataKinds.Im.PROTOCOL_QQ + getString(R.string.hangouts) -> CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK + getString(R.string.icq) -> CommonDataKinds.Im.PROTOCOL_ICQ + getString(R.string.jabber) -> CommonDataKinds.Im.PROTOCOL_JABBER + else -> CommonDataKinds.Im.PROTOCOL_CUSTOM + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index cd120548..b21cacd7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -93,6 +93,7 @@ const val DEFAULT_ADDRESS_TYPE = CommonDataKinds.StructuredPostal.TYPE_HOME const val DEFAULT_EVENT_TYPE = CommonDataKinds.Event.TYPE_BIRTHDAY const val DEFAULT_ORGANIZATION_TYPE = CommonDataKinds.Organization.TYPE_WORK const val DEFAULT_WEBSITE_TYPE = CommonDataKinds.Website.TYPE_HOMEPAGE +const val DEFAULT_IM_TYPE = CommonDataKinds.Im.PROTOCOL_SKYPE // some manufacturer contact account types from https://stackoverflow.com/a/44802016/1967672 val localAccountTypes = arrayListOf("vnd.sec.contact.phone", From b4d62f64aaa914b34c40bb512aa2f2e26ac59560 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 15:32:07 +0200 Subject: [PATCH 26/98] search at user IMs too --- .../contacts/fragments/MyViewPagerFragment.kt | 1 + .../com/simplemobiletools/contacts/helpers/ContactsHelper.kt | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt index 7afecd04..0419aa25 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt @@ -244,6 +244,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) it.phoneNumbers.any { it.value.contains(text, true) } || it.emails.any { it.value.contains(text, true) } || it.addresses.any { getProperText(it.value, shouldNormalize).contains(text, true) } || + it.IMs.any { it.value.contains(text, true) } || getProperText(it.notes, shouldNormalize).contains(text, true) || getProperText(it.organization.company, shouldNormalize).contains(text, true) || getProperText(it.organization.jobPosition, shouldNormalize).contains(text, true) || diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index 11cad798..b04fbd33 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -194,6 +194,11 @@ class ContactsHelper(val activity: Activity) { } val IMs = getIMs() + size = IMs.size() + for (i in 0 until size) { + val key = IMs.keyAt(i) + contacts[key]?.IMs = IMs.valueAt(i) + } val events = getEvents() size = events.size() From 7eb21842854857e6858756552040fa9ab3e6e126 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 15:36:30 +0200 Subject: [PATCH 27/98] handle IM fields at inserting/updating contacts --- .../contacts/helpers/ContactsHelper.kt | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index b04fbd33..090c2a07 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -981,6 +981,26 @@ class ContactsHelper(val activity: Activity) { } } + // delete IMs + ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).apply { + val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ? " + val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.Im.CONTENT_ITEM_TYPE) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + // add IMs + contact.IMs.forEach { + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { + withValue(ContactsContract.Data.RAW_CONTACT_ID, contact.id) + withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Im.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Im.DATA, it.value) + withValue(CommonDataKinds.Im.PROTOCOL, it.type) + withValue(CommonDataKinds.Im.CUSTOM_PROTOCOL, it.label) + operations.add(build()) + } + } + // delete events ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI).apply { val selection = "${ContactsContract.Data.RAW_CONTACT_ID} = ? AND ${ContactsContract.Data.MIMETYPE} = ? " @@ -1246,6 +1266,18 @@ class ContactsHelper(val activity: Activity) { } } + // IMs + contact.IMs.forEach { + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { + withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Im.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Im.DATA, it.value) + withValue(CommonDataKinds.Im.PROTOCOL, it.type) + withValue(CommonDataKinds.Im.CUSTOM_PROTOCOL, it.label) + operations.add(build()) + } + } + // events contact.events.forEach { ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { From 36fbc9f0c66d09e93e808de5e2f4d37a149e69cd Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 15:58:12 +0200 Subject: [PATCH 28/98] handle IMs at locally stored contacts too --- .../contacts/helpers/DBHelper.kt | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 41845d05..88e38dc9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -36,6 +36,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont private val COL_EVENTS = "events" private val COL_STARRED = "starred" private val COL_ADDRESSES = "addresses" + private val COL_IMS = "ims" private val COL_NOTES = "notes" private val COL_COMPANY = "company" private val COL_JOB_POSITION = "job_position" @@ -51,7 +52,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont companion object { const val DB_NAME = "contacts.db" - private const val DB_VERSION = 6 + private const val DB_VERSION = 7 private var dbInstance: DBHelper? = null var gson = Gson() @@ -100,6 +101,10 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont if (oldVersion < 6) { db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_NICKNAME TEXT DEFAULT ''") } + + if (oldVersion < 7) { + db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_IMS TEXT DEFAULT ''") + } } private fun createGroupsTable(db: SQLiteDatabase) { @@ -145,6 +150,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont put(COL_PHONE_NUMBERS, gson.toJson(contact.phoneNumbers)) put(COL_EMAILS, gson.toJson(contact.emails)) put(COL_ADDRESSES, gson.toJson(contact.addresses)) + put(COL_IMS, gson.toJson(contact.IMs)) put(COL_EVENTS, gson.toJson(contact.events)) put(COL_STARRED, contact.starred) put(COL_NOTES, contact.notes) @@ -261,11 +267,12 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont val filterDuplicates = activity.config.filterDuplicates val contacts = ArrayList() val projection = arrayOf(COL_ID, COL_PREFIX, COL_FIRST_NAME, COL_MIDDLE_NAME, COL_SURNAME, COL_SUFFIX, COL_NICKNAME, COL_PHONE_NUMBERS, - COL_EMAILS, COL_EVENTS, COL_STARRED, COL_PHOTO, COL_ADDRESSES, COL_NOTES, COL_GROUPS, COL_COMPANY, COL_JOB_POSITION, COL_WEBSITES) + COL_EMAILS, COL_EVENTS, COL_STARRED, COL_PHOTO, COL_ADDRESSES, COL_IMS, COL_NOTES, COL_GROUPS, COL_COMPANY, COL_JOB_POSITION, COL_WEBSITES) val phoneNumbersToken = object : TypeToken>() {}.type val emailsToken = object : TypeToken>() {}.type val addressesToken = object : TypeToken>() {}.type + val IMsToken = object : TypeToken>() {}.type val eventsToken = object : TypeToken>() {}.type val groupIdsToken = object : TypeToken>() {}.type val websitesToken = object : TypeToken>() {}.type @@ -306,6 +313,9 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont it.label = "" } + val IMsJson = cursor.getStringValue(COL_IMS) + val IMs = if (IMsJson == "[]") ArrayList() else gson.fromJson>(IMsJson, IMsToken) ?: ArrayList(1) + val eventsJson = cursor.getStringValue(COL_EVENTS) val events = if (eventsJson == "[]") ArrayList() else gson.fromJson>(eventsJson, eventsToken) ?: ArrayList(1) @@ -342,8 +352,6 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont phoneNumbers.mapTo(cleanPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } } - val IMs = ArrayList() - val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, "", phoneNumbers, emails, addresses, events, SMT_PRIVATE, starred, id, "", photo, notes, groups, organization, websites, cleanPhoneNumbers, IMs) contacts.add(contact) From 60bcbcb4a6495f5126440e06a15cd35e368fb794 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 17:07:01 +0200 Subject: [PATCH 29/98] add IM exporting/importing --- .../contacts/helpers/Constants.kt | 5 +++++ .../contacts/helpers/VcfExporter.kt | 16 ++++++++++++++ .../contacts/helpers/VcfImporter.kt | 21 +++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index b21cacd7..34cf1ca8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -65,6 +65,11 @@ const val HOME_FAX = "HOME;FAX" const val PAGER = "PAGER" const val MOBILE = "MOBILE" +// IMs not supported by Ez-vcard +const val HANGOUTS = "Hangouts" +const val QQ = "QQ" +const val JABBER = "Jabber" + const val ON_CLICK_CALL_CONTACT = 1 const val ON_CLICK_VIEW_CONTACT = 2 const val ON_CLICK_EDIT_CONTACT = 3 diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt index b4651fb5..a5dd3e06 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt @@ -102,6 +102,22 @@ class VcfExporter { card.addAddress(address) } + contact.IMs.forEach { + val impp = when (it.type) { + CommonDataKinds.Im.PROTOCOL_AIM -> Impp.aim(it.value) + CommonDataKinds.Im.PROTOCOL_YAHOO -> Impp.yahoo(it.value) + CommonDataKinds.Im.PROTOCOL_MSN -> Impp.msn(it.value) + CommonDataKinds.Im.PROTOCOL_ICQ -> Impp.icq(it.value) + CommonDataKinds.Im.PROTOCOL_SKYPE -> Impp.skype(it.value) + CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK -> Impp(HANGOUTS, it.value) + CommonDataKinds.Im.PROTOCOL_QQ -> Impp(QQ, it.value) + CommonDataKinds.Im.PROTOCOL_JABBER -> Impp(JABBER, it.value) + else -> Impp(it.label, it.value) + } + + card.addImpp(impp) + } + if (contact.notes.isNotEmpty()) { card.addNote(contact.notes) } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt index 81f46041..14eed066 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -15,6 +15,7 @@ import org.joda.time.DateTime import org.joda.time.format.DateTimeFormat import java.io.File import java.io.FileOutputStream +import java.net.URLDecoder import java.util.* class VcfImporter(val activity: SimpleActivity) { @@ -111,7 +112,27 @@ class VcfImporter(val activity: SimpleActivity) { val photo = null val thumbnailUri = savePhoto(photoData) val cleanPhoneNumbers = ArrayList() + val IMs = ArrayList() + ezContact.impps.forEach { + val typeString = it.uri.scheme + val value = URLDecoder.decode(it.uri.toString().substring(it.uri.scheme.length + 1), "UTF-8") + val type = when { + it.isAim -> CommonDataKinds.Im.PROTOCOL_AIM + it.isYahoo -> CommonDataKinds.Im.PROTOCOL_YAHOO + it.isMsn -> CommonDataKinds.Im.PROTOCOL_MSN + it.isIcq -> CommonDataKinds.Im.PROTOCOL_ICQ + it.isSkype -> CommonDataKinds.Im.PROTOCOL_SKYPE + typeString == HANGOUTS -> CommonDataKinds.Im.PROTOCOL_GOOGLE_TALK + typeString == QQ -> CommonDataKinds.Im.PROTOCOL_QQ + typeString == JABBER -> CommonDataKinds.Im.PROTOCOL_JABBER + else -> CommonDataKinds.Im.PROTOCOL_CUSTOM + } + + val label = if (type == CommonDataKinds.Im.PROTOCOL_CUSTOM) URLDecoder.decode(typeString, "UTF-8") else "" + val IM = IM(value, type, label) + IMs.add(IM) + } val contact = Contact(0, prefix, firstName, middleName, surname, suffix, nickname, photoUri, phoneNumbers, emails, addresses, events, targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, cleanPhoneNumbers, IMs) From a228622377a1fead7471c79c4940400e737550b2 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 17:25:00 +0200 Subject: [PATCH 30/98] update commons to 4.7.3 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index fc1fb411..daf11071 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,7 +41,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:4.7.2' + implementation 'com.simplemobiletools:commons:4.7.3' implementation 'joda-time:joda-time:2.9.9' implementation 'com.facebook.stetho:stetho:1.5.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' From 2f0150d89b2cb706d0cad3828015f9479e4e9601 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 17:25:18 +0200 Subject: [PATCH 31/98] adding some new functions in the release notes --- .../com/simplemobiletools/contacts/activities/MainActivity.kt | 1 + app/src/main/res/values/donottranslate.xml | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt index 19c92a75..31f4ed0f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt @@ -539,6 +539,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { add(Release(16, R.string.release_16)) add(Release(27, R.string.release_27)) add(Release(29, R.string.release_29)) + add(Release(31, R.string.release_31)) checkWhatsNew(this, BuildConfig.VERSION_CODE) } } diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 1c7e350b..59a112ff 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -12,6 +12,10 @@ Jabber + + Added an optional IM field\n + Added support for custom phone number/email/address types + Added an optional Nickname field Allow customizing which tabs are visible\n From 1e0d8e7787dce381ad701da95a29441b674dd070 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 17:29:22 +0200 Subject: [PATCH 32/98] make sure the local DB has IM field created --- .../kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 88e38dc9..508a4c80 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -68,7 +68,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont db.execSQL("CREATE TABLE $CONTACTS_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_FIRST_NAME TEXT, $COL_MIDDLE_NAME TEXT, " + "$COL_SURNAME TEXT, $COL_PHOTO BLOB, $COL_PHONE_NUMBERS TEXT, $COL_EMAILS TEXT, $COL_EVENTS TEXT, $COL_STARRED INTEGER, " + "$COL_ADDRESSES TEXT, $COL_NOTES TEXT, $COL_GROUPS TEXT, $COL_PREFIX TEXT, $COL_SUFFIX TEXT, $COL_COMPANY TEXT, $COL_JOB_POSITION TEXT," + - "$COL_WEBSITES TEXT, $COL_NICKNAME TEXT)") + "$COL_WEBSITES TEXT, $COL_NICKNAME TEXT, $COL_IMS TEXT)") // start autoincrement ID from FIRST_CONTACT_ID to avoid conflicts db.execSQL("REPLACE INTO sqlite_sequence (name, seq) VALUES ('$CONTACTS_TABLE_NAME', $FIRST_CONTACT_ID)") From 6d5bace1ba2dd7fc1e1dda3117e72cf13885823f Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 17:29:36 +0200 Subject: [PATCH 33/98] update version to 4.4.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index daf11071..3896c72e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.simplemobiletools.contacts" minSdkVersion 16 targetSdkVersion 28 - versionCode 30 - versionName "4.3.0" + versionCode 31 + versionName "4.4.0" setProperty("archivesBaseName", "contacts") } From 518d8491a688a5c3df584cde42f5f433671e91d9 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 4 Sep 2018 17:29:41 +0200 Subject: [PATCH 34/98] updating changelog --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3cefa33..e6beac38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Changelog ========== +Version 4.4.0 *(2018-09-04)* +---------------------------- + + * Added support for custom phone number/email/address types + * Added IM field + * Fixed some exporting/importing issues + * Improved duplicate filtering + Version 4.3.0 *(2018-08-24)* ---------------------------- From a153427646552d7b99bc4c24d0b31694071f98ea Mon Sep 17 00:00:00 2001 From: Dirkster99 Date: Tue, 4 Sep 2018 17:33:43 +0200 Subject: [PATCH 35/98] Minor change Adjusted coding style and removed GROUP attribute as per comment from here: https://github.com/SimpleMobileTools/Simple-Contacts/issues/146 previous post, it should look like CATEGORIES:Testgroup,Testgroup1. Regarding the code, check the spacing, newlines, remove comments. --- .../contacts/helpers/VcfExporter.kt | 11 ++++------ .../contacts/helpers/VcfImporter.kt | 20 +++++++------------ 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt index 399ab49b..e948258d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt @@ -123,16 +123,13 @@ class VcfExporter { card.addPhoto(photo) } - // Export a list of groups where this contact is a member of - if (contact.groups.size > 0){ - - // Copy groups into a categorized list and add this category into VCard + if (contact.groups.size > 0) { val groupList = Categories(); - contact.groups.forEach{ - groupList.addParameter("GROUP", it.title); + contact.groups.forEach { + groupList.getValues().add(it.title); } - card.addCategories(groupList); + card.setCategories(groupList); } cards.add(card) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt index ca81848c..d5ccc61b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -105,29 +105,23 @@ class VcfImporter(val activity: SimpleActivity) { val notes = ezContact.notes.firstOrNull()?.value ?: "" val groups = ArrayList() - if (ezContact.categories != null){ // Iterate through categories of this contact (if any) - - // Iterate through group names for this contact - // Check if group already exist and create it if not - // Associate group with this user - val groupNames = ezContact.categories.getParameters("GROUP"); - - if (groupNames != null){ // Resolve group references for this contact + if (ezContact.categories != null) { + val groupNames = ezContact.categories.getValues(); + if (groupNames != null) { val storedGroups = ContactsHelper(activity).getStoredGroups(); - groupNames.forEach { + groupNames.forEach { val groupName = it; val storedGroup = storedGroups.firstOrNull { it.title == groupName } - if (storedGroup != null){ - groups.add(storedGroup); // Group is already present on this device + if (storedGroup != null) { + groups.add(storedGroup); } else { - // Group is not present on this device, yet so we create a new one val newcontactGroup = activity.dbHelper.insertGroup(Group(0, groupName)); - if (newcontactGroup != null) // and associate it with this contact + if (newcontactGroup != null) groups.add(newcontactGroup); } } From 6c1b1e2d70457d553b7b86d7bd054596b55f4e93 Mon Sep 17 00:00:00 2001 From: Dirkster99 Date: Fri, 7 Sep 2018 17:49:20 +0200 Subject: [PATCH 36/98] Removed ; and adjsuted to property syntax --- .../contacts/helpers/VcfExporter.kt | 6 +++--- .../contacts/helpers/VcfImporter.kt | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt index e948258d..f539e0d3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt @@ -124,12 +124,12 @@ class VcfExporter { } if (contact.groups.size > 0) { - val groupList = Categories(); + val groupList = Categories() contact.groups.forEach { - groupList.getValues().add(it.title); + groupList.values.add(it.title) } - card.setCategories(groupList); + card.categories = groupList } cards.add(card) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt index d5ccc61b..6d0820a0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -106,23 +106,23 @@ class VcfImporter(val activity: SimpleActivity) { val groups = ArrayList() if (ezContact.categories != null) { - val groupNames = ezContact.categories.getValues(); + val groupNames = ezContact.categories.values if (groupNames != null) { - val storedGroups = ContactsHelper(activity).getStoredGroups(); + val storedGroups = ContactsHelper(activity).getStoredGroups() groupNames.forEach { - val groupName = it; + val groupName = it val storedGroup = storedGroups.firstOrNull { it.title == groupName } if (storedGroup != null) { - groups.add(storedGroup); + groups.add(storedGroup) } else { - val newcontactGroup = activity.dbHelper.insertGroup(Group(0, groupName)); + val newcontactGroup = activity.dbHelper.insertGroup(Group(0, groupName)) if (newcontactGroup != null) - groups.add(newcontactGroup); + groups.add(newcontactGroup) } } } From 37016b53cbd20478fb586efc30dd28c97a90da79 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 9 Sep 2018 14:59:26 +0200 Subject: [PATCH 37/98] minor code cleanup at importing/exporting --- .../contacts/helpers/VcfExporter.kt | 2 +- .../contacts/helpers/VcfImporter.kt | 56 ++++++++++--------- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt index 5800e3c3..3a3dfb92 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt @@ -139,7 +139,7 @@ class VcfExporter { card.addPhoto(photo) } - if (contact.groups.size > 0) { + if (contact.groups.isNotEmpty()) { val groupList = Categories() contact.groups.forEach { groupList.values.add(it.title) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt index a2bba934..f186505b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -5,7 +5,6 @@ import android.graphics.BitmapFactory import android.provider.ContactsContract.CommonDataKinds import android.widget.Toast import com.simplemobiletools.commons.extensions.showErrorToast -import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.extensions.dbHelper import com.simplemobiletools.contacts.extensions.getCachePhoto @@ -13,6 +12,7 @@ import com.simplemobiletools.contacts.extensions.getCachePhotoUri import com.simplemobiletools.contacts.helpers.VcfImporter.ImportResult.* import com.simplemobiletools.contacts.models.* import ezvcard.Ezvcard +import ezvcard.VCard import org.joda.time.DateTime import org.joda.time.format.DateTimeFormat import java.io.File @@ -104,36 +104,11 @@ class VcfImporter(val activity: SimpleActivity) { val starred = 0 val contactId = 0 val notes = ezContact.notes.firstOrNull()?.value ?: "" - val groups = ArrayList() - - if (ezContact.categories != null) { - val groupNames = ezContact.categories.values - - if (groupNames != null) { - val storedGroups = ContactsHelper(activity).getStoredGroups() - - groupNames.forEach { - val groupName = it - val storedGroup = storedGroups.firstOrNull { it.title == groupName } - - if (storedGroup != null) { - groups.add(storedGroup) - } - else { - val newcontactGroup = activity.dbHelper.insertGroup(Group(0, groupName)) - - if (newcontactGroup != null) - groups.add(newcontactGroup) - } - } - } - } - + val groups = getContactGroups(ezContact) val company = ezContact.organization?.values?.firstOrNull() ?: "" val jobPosition = ezContact.titles?.firstOrNull()?.value ?: "" val organization = Organization(company, jobPosition) val websites = ezContact.urls.map { it.value } as ArrayList - val photoData = ezContact.photos.firstOrNull()?.data val photo = null val thumbnailUri = savePhoto(photoData) @@ -184,6 +159,33 @@ class VcfImporter(val activity: SimpleActivity) { return dateTime.toString("yyyy-MM-dd") } + private fun getContactGroups(ezContact: VCard): ArrayList { + val groups = ArrayList() + if (ezContact.categories != null) { + val groupNames = ezContact.categories.values + + if (groupNames != null) { + val storedGroups = ContactsHelper(activity).getStoredGroups() + + groupNames.forEach { + val groupName = it + val storedGroup = storedGroups.firstOrNull { it.title == groupName } + + if (storedGroup != null) { + groups.add(storedGroup) + } else { + val newContactGroup = activity.dbHelper.insertGroup(Group(0, groupName)) + + if (newContactGroup != null) { + groups.add(newContactGroup) + } + } + } + } + } + return groups + } + private fun getPhoneNumberTypeId(type: String, subtype: String?) = when (type.toUpperCase()) { CELL -> CommonDataKinds.Phone.TYPE_MOBILE HOME -> { From fad4c0a5ebcf916227e155ac7e4044a596f3e166 Mon Sep 17 00:00:00 2001 From: dugi991 Date: Sat, 15 Sep 2018 10:50:37 +0000 Subject: [PATCH 38/98] Updated Croatian translations Translated new strings. --- app/src/main/res/values-hr/strings.xml | 30 +++++++++++++------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index ace16063..d788a73d 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -9,12 +9,12 @@ Tvrtka Radno mjesto Web stranica - Send SMS to contacts - Send email to contacts - Send SMS to group - Send email to group - Call %s - Request the required permissions + Pošalji SMS kontaktima + Pošalji e-poštu kontaktima + Pošalji SMS grupi + Pošalji e-poštu grupi + Nazovi %s + Zatraži potrebna dopuštenja Novi kontakt Uredi kontakt @@ -48,13 +48,13 @@ Prilikom dodira kontakta Nazovi kontakt Prikaži pojedinosti o kontaktu - Manage shown contact fields - Try filtering out duplicate contacts - Manage shown tabs - Contacts - Favorites - Recent calls - Show a call confirmation dialog before initiating a call + Upravljaj prikazanim poljima kontakta + Pokušaj filtrirati duple kontakte + Upravljaj prikazanim karticama + Kontakti + Favoriti + Nedavni pozivi + Pokažite dijaloški okvir za potvrdu poziva prije pokretanja poziva E-pošta @@ -80,7 +80,7 @@ Dodaj favorite Dodaj u favorite Ukloni iz favorita - You must be at the Edit screen to modify a contact + Morate biti na zaslonu Uređivanje da biste izmijenili kontakt Pretraži kontakte @@ -108,7 +108,7 @@ Web stranice Grupe Izvori kontakata - Instant messaging (IM) + Brzo slanje poruka (IM) Želim promijeniti polja koja su vidljiva na kontaktima. Mogu li to napraviti? From 0b1c57fb37df48a6150492efa98065349a369b94 Mon Sep 17 00:00:00 2001 From: Nikola Trubitsyn Date: Sat, 15 Sep 2018 15:11:09 +0300 Subject: [PATCH 39/98] Update values-ru/strings.xml --- app/src/main/res/values-ru/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 50e4c369..e26bfa89 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -108,7 +108,7 @@ Сайты Группы Источник контакта - Instant messaging (IM) + Мессенджеры (IM) Я хочу изменить поля, отображаемые у контактов. Могу ли я это сделать? From 87e1d0d9be56bf5b94a83bacf684e8f61d23b512 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Sat, 15 Sep 2018 15:16:22 +0100 Subject: [PATCH 40/98] Update strings.xml --- app/src/main/res/values-pt/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 3745a41f..b1a2e6c0 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 - Request the required permissions + Pedir a permissão necessária Novo contacto Editar contacto @@ -50,7 +50,7 @@ Ver detalhes Gerir campos a exibir Tentar filtrar contactos duplicados - Manage shown tabs + Gerir separadores a exibir Contactos Favoritos Chamadas recentes @@ -76,7 +76,7 @@ Aniversário - Parece que ainda não adicionou contactos como favoritos + Parece que ainda não adicionou contactos aos favoritos Adicionar favoritos Adicionar aos favoritos Remover dos favoritos @@ -108,7 +108,7 @@ Site Grupos Origem do contacto - Instant messaging (IM) + Mensagem instantânea (IM) I want to change what fields are visible at contacts. Can I do it? From f934cfc95c8707b01bc2d514f10e544304569932 Mon Sep 17 00:00:00 2001 From: unknowtech <41585567+unknowtech@users.noreply.github.com> Date: Thu, 20 Sep 2018 00:59:13 +0200 Subject: [PATCH 41/98] Updated fr (French) translation Commit made via Stringlate --- app/src/debug/res/values-fr/strings.xml | 4 ++++ app/src/main/res/values-fr/strings.xml | 26 +++++++++---------------- 2 files changed, 13 insertions(+), 17 deletions(-) create mode 100644 app/src/debug/res/values-fr/strings.xml diff --git a/app/src/debug/res/values-fr/strings.xml b/app/src/debug/res/values-fr/strings.xml new file mode 100644 index 00000000..8acf9edd --- /dev/null +++ b/app/src/debug/res/values-fr/strings.xml @@ -0,0 +1,4 @@ + + + Contacts + diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 41cbcd62..e65a3955 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -14,7 +14,7 @@ Envoyer un SMS au groupe Envoyer un e-mail au groupe Call %s - Request the required permissions + Demander les autorisations requises Nouveau contact Modifier contact @@ -23,7 +23,7 @@ Prénom Deuxième prénom Nom - Nickname + Surnom Pas de groupe @@ -49,12 +49,12 @@ Appeler le contact Voir les détails du contact Configurer l\'affichage des champs des contacts - Try filtering out duplicate contacts - Manage shown tabs + Essayez de filtrer les contacts en double + Gérer les onglets affichés Contacts Favorites - Recent calls - Show a call confirmation dialog before initiating a call + Appels récents + Afficher une boîte de dialogue de confirmation d\'appel avant de lancer un appel E-mail @@ -80,7 +80,7 @@ Ajouter des favoris Ajouter aux favoris Retirer des favoris - You must be at the Edit screen to modify a contact + Vous devez être sur l\'écran Modifier pour modifier un contact Rechercher des contacts @@ -108,7 +108,7 @@ Sites web Groupe Source du contact - Instant messaging (IM) + Messagerie instantanée (MI) Je veux changer quelles champs sont visibles. Est-ce que je peux ? @@ -117,15 +117,7 @@ Une appli de contacts pour gérer vos contacts sans pubs. - - Une appli simple pour créer et gérer vos contacts depuis n\'importe quelle source. Les contacts peuvent être stockés sur votre appareil mais aussi synchronisés via Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée. - - Vous pouvez l\'utiliser pour gérer les e-mail et événements de vos contacts. Elle permet de trier/filter via de multiples paramètres, et même afficher le surnom en premier. - - Aucune publicité ni de permission inutile. Elle est entièrement open source et vous permet de personnaliser les couleurs. - - Cette application fait parti d\'un groupe d\'applications. Vous pouvez trouver le reste des applis sur https://www.simplemobiletools.com - + Une appli simple pour créer et gérer vos contacts depuis n\'importe quelle source. Les contacts peuvent être stockés sur votre appareil mais aussi synchronisés via Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée. Vous pouvez l\'utiliser pour gérer les e-mail et événements de vos contacts. Elle permet de trier/filter via de multiples paramètres, et même afficher le surnom en premier. Aucune publicité ni de permission inutile. Elle est entièrement open source et vous permet de personnaliser les couleurs. Cette application fait parti d\'un groupe d\'applications. Vous pouvez trouver le reste des applis sur https://www.simplemobiletools.com Une appli de contacts pour gérer vos contacts sans pubs. - Une appli simple pour créer et gérer vos contacts depuis n\'importe quelle source. Les contacts peuvent être stockés sur votre appareil mais aussi synchronisés via Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée. Vous pouvez l\'utiliser pour gérer les e-mail et événements de vos contacts. Elle permet de trier/filter via de multiples paramètres, et même afficher le surnom en premier. Aucune publicité ni de permission inutile. Elle est entièrement open source et vous permet de personnaliser les couleurs. Cette application fait parti d\'un groupe d\'applications. Vous pouvez trouver le reste des applis sur https://www.simplemobiletools.com + + Une appli simple pour créer et gérer vos contacts depuis n\'importe quelle source. Les contacts peuvent être stockés sur votre appareil mais aussi synchronisés via Google ou d\'autres comptes. Vous pouvez afficher vos contacts favoris dans une liste séparée. + + Vous pouvez l\'utiliser pour gérer les e-mail et événements de vos contacts. Elle permet de trier/filter via de multiples paramètres, et même afficher le surnom en premier. + + Aucune publicité ni de permission inutile. Elle est entièrement open source et vous permet de personnaliser les couleurs. + + Cette application fait parti d\'un groupe d\'applications. Vous pouvez trouver le reste des applis sur https://www.simplemobiletools.com + + Dialpad + Göstərmək üçün sahəni seç Ön şəkilçi diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 849c7b58..31d124e0 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -95,6 +95,9 @@ Kontaktquellen einschließen Dateiname (ohne .vcf) + + Dialpad + Sichtbare Felder auswählen Titel diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 6b962c3a..4a55f0c1 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -95,6 +95,9 @@ Συμπερίληψη πηγών επαφών Όνομα αρχείου (χωρίς .vcf) + + Dialpad + Επιλογή εμφάνισης πεδίων Πρόθεμα diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 352508a0..acbdf9ac 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -95,6 +95,9 @@ Inclure les sources du contact Nom du fichier (sans .vcf) + + Dialpad + Sélectionner les champs à afficher Préfixe diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index d788a73d..963f9a5d 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -95,6 +95,9 @@ Uključi izvore kontakta Naziv datoteke (bez .vcf) + + Dialpad + Odaberi polja za prikaz Prefiks diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 2eec9101..e044a4d8 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -95,6 +95,9 @@ Include contact sources ファイル名 (.vcfを含めない) + + Dialpad + 表示する項目を選択 敬称(名前の前) diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index f6fdee3a..41017aea 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -95,6 +95,9 @@ 가져오기 대상 파일이름 (.vcf 확장자 생략) + + Dialpad + Select fields to show Prefix diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 7d211427..baa7e996 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -95,6 +95,9 @@ Įtraukti kontaktų šaltinius Bylos vardas (be .vcf) + + Dialpad + Pasirinkti rodomus laukelius Priešdėlis diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index b1a2e6c0..471022e4 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -95,6 +95,9 @@ Incluir fontes dos contactos Nome do ficheiro (sem .vcf) + + Dialpad + Selecione os campos a mostrar Prefixo diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index e26bfa89..98f52187 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -95,6 +95,9 @@ Включить источники контактов Имя файла (без .vcf) + + Dialpad + Выберите отображаемые поля Префикс diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index d4a23b33..0c8c7e6d 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -95,6 +95,9 @@ Zahrnúť zdroje kontaktov Názov súboru (bez .vcf) + + Číselník + Zvoľte polia na zobrazenie Titul pred menom diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 480be2fc..fe7d0145 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -95,6 +95,9 @@ Inkludera kontaktkällor Filnamn (utan .vcf) + + Dialpad + Välj vilka fält som ska visas Prefix diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index ba9cfd93..a6d28640 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -95,6 +95,9 @@ Kişi kaynaklarını dahil et Dosya adı (.vcf olmadan) + + Dialpad + Görüntülenecek alanları seç Önek diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 362ba455..448f3713 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -95,6 +95,9 @@ 包含聯絡人來源 檔案名稱 (不含.vcf) + + Dialpad + 選擇要顯示的欄位 前缀 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index ae6e5ebe..3283fd64 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -4,5 +4,5 @@ 45dp 40dp 52dp - 60dp + 60dp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eb065320..f63785f1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -95,6 +95,9 @@ Include contact sources Filename (without .vcf) + + Dialpad + Select fields to show Prefix From 872a7f19d4c14c0bc80fcf476aaa0b4488500883 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 22 Sep 2018 23:26:33 +0200 Subject: [PATCH 47/98] adding some elevation to the dialpad activity button --- app/src/main/res/layout/activity_main.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d3ba2743..948c5fa9 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -30,6 +30,7 @@ android:layout_centerHorizontal="true" android:layout_marginBottom="@dimen/activity_margin" android:background="@drawable/circle_background" + android:elevation="@dimen/medium_margin" android:padding="@dimen/normal_margin" android:src="@drawable/ic_phone_big"/> From 9ab4f3ea7f59198d267ae843f6d91b7cc4edf5fb Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 22 Sep 2018 23:35:34 +0200 Subject: [PATCH 48/98] adding some dialpad numbers and symbols --- .../contacts/activities/DialpadActivity.kt | 19 +++ app/src/main/res/layout/activity_dialpad.xml | 147 +++++++++++++++++- app/src/main/res/values-v21/styles.xml | 7 + app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/styles.xml | 11 ++ 5 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/values-v21/styles.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index d0952a48..8b950be5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -1,11 +1,30 @@ package com.simplemobiletools.contacts.activities import android.os.Bundle +import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.contacts.R +import kotlinx.android.synthetic.main.activity_dialpad.* class DialpadActivity : SimpleActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_dialpad) + dialpad_0.setOnClickListener { } + dialpad_1.setOnClickListener { } + dialpad_2.setOnClickListener { } + dialpad_3.setOnClickListener { } + dialpad_4.setOnClickListener { } + dialpad_5.setOnClickListener { } + dialpad_6.setOnClickListener { } + dialpad_7.setOnClickListener { } + dialpad_8.setOnClickListener { } + dialpad_9.setOnClickListener { } + dialpad_asterisk.setOnClickListener { } + dialpad_hashtag.setOnClickListener { } + } + + override fun onResume() { + super.onResume() + updateTextColors(dialpad_wrapper) } } diff --git a/app/src/main/res/layout/activity_dialpad.xml b/app/src/main/res/layout/activity_dialpad.xml index 561aa9ea..0b653a7e 100644 --- a/app/src/main/res/layout/activity_dialpad.xml +++ b/app/src/main/res/layout/activity_dialpad.xml @@ -1,8 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml new file mode 100644 index 00000000..afdc4448 --- /dev/null +++ b/app/src/main/res/values-v21/styles.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 3283fd64..cfa2f5db 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -5,4 +5,5 @@ 40dp 52dp 60dp + 44sp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 0be50415..dd117a86 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -2,4 +2,15 @@ + + + From 96c6e8cd5a3edfc026ca2a12e142770e584db140 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 23 Sep 2018 10:23:23 +0200 Subject: [PATCH 49/98] add a dialpad input for showing dialed chars --- .../contacts/activities/DialpadActivity.kt | 29 ++++++++++-------- .../main/res/drawable-hdpi/ic_clear_char.png | Bin 0 -> 437 bytes .../main/res/drawable-xhdpi/ic_clear_char.png | Bin 0 -> 524 bytes .../res/drawable-xxhdpi/ic_clear_char.png | Bin 0 -> 732 bytes .../res/drawable-xxxhdpi/ic_clear_char.png | Bin 0 -> 919 bytes app/src/main/res/layout/activity_dialpad.xml | 10 ++++++ app/src/main/res/values/dimens.xml | 1 + 7 files changed, 28 insertions(+), 12 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_clear_char.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_clear_char.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_clear_char.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_clear_char.png diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index 8b950be5..0c5ad59a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -9,22 +9,27 @@ class DialpadActivity : SimpleActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_dialpad) - dialpad_0.setOnClickListener { } - dialpad_1.setOnClickListener { } - dialpad_2.setOnClickListener { } - dialpad_3.setOnClickListener { } - dialpad_4.setOnClickListener { } - dialpad_5.setOnClickListener { } - dialpad_6.setOnClickListener { } - dialpad_7.setOnClickListener { } - dialpad_8.setOnClickListener { } - dialpad_9.setOnClickListener { } - dialpad_asterisk.setOnClickListener { } - dialpad_hashtag.setOnClickListener { } + + dialpad_0.setOnClickListener { dialpadPressed("0") } + dialpad_1.setOnClickListener { dialpadPressed("1") } + dialpad_2.setOnClickListener { dialpadPressed("2") } + dialpad_3.setOnClickListener { dialpadPressed("3") } + dialpad_4.setOnClickListener { dialpadPressed("4") } + dialpad_5.setOnClickListener { dialpadPressed("5") } + dialpad_6.setOnClickListener { dialpadPressed("6") } + dialpad_7.setOnClickListener { dialpadPressed("7") } + dialpad_8.setOnClickListener { dialpadPressed("8") } + dialpad_9.setOnClickListener { dialpadPressed("9") } + dialpad_asterisk.setOnClickListener { dialpadPressed("*") } + dialpad_hashtag.setOnClickListener { dialpadPressed("#") } } override fun onResume() { super.onResume() updateTextColors(dialpad_wrapper) } + + private fun dialpadPressed(char: String) { + dialpad_input.append(char) + } } diff --git a/app/src/main/res/drawable-hdpi/ic_clear_char.png b/app/src/main/res/drawable-hdpi/ic_clear_char.png new file mode 100644 index 0000000000000000000000000000000000000000..3fd9c535b048107eabc5b93effa7d158e7362e4a GIT binary patch literal 437 zcmV;m0ZRUfP)!686nZdW;+rZ8{$uZ&eB*A8!7FOps}Q&g`NasNa#)W zSg@`;J9qXmY{{8wZ|;7%uek#plqZ!o(8CSRN-@?Lsc*x|XO`ERjWp(#ZklPSv5p0f zok|pX+UJua21s&v%{>&S##1a&b8r8DNRI+$0EM<;ZNtNZg~z54?K?pb3^Z#HSwD5> zC@pTq#5>VX9RqWhcHMzqtu@q9CO8S=WoA46Vz`enf#e3BaFf$npNJy2Vn}e5J0c;k z;->gECl6tPAvsDm*w*-hsl~?2= f7hZ%X`yfNVS0RAJl1zV}00000NkvXXu0mjfr;x23 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_clear_char.png b/app/src/main/res/drawable-xhdpi/ic_clear_char.png new file mode 100644 index 0000000000000000000000000000000000000000..b51790d1f9b592c43bb996243da264b9b707eda9 GIT binary patch literal 524 zcmV+n0`vWeP)o*1?rG25bLLhgM~)SN9j7f7jAUr&+&(kf+~-^ z$hyDX43s<9KFccvoXMWwek?4=^DGs=1i^wl72l3Z5OA6z&sZALHmbs{EBAd~iCW&lOVU6po zVK+ICjRXg&aUD9uwMC}%11BOx*tHxuu}t3viV;UCu8n9ivh2YMraA!B$*${nGW!3~ zvG6XJ9zUQTXg;bXkKPEL^!d8w=?A3GrYXW}wD`$Xe84@m{AVe0&Ph|K~!ko z?b$y|96=Zc@Mll%Jdj*rAwm2Geu+bJa4`l#igZFsAs@rWRxJb@|AY_`Ayv$2V(bjq zi$w?|q&iRwK{&K{Qrwwy+1=Uqo!y(gka;aV-QUeKv-8d_;LDdUU%s@(fUmgE3l6e= z@C`?0oGQQ2O`UU60$QWH`o>@+g)@UyhqGe}zl|V{;TVscPT0pK39WA2gbOL z+^^|G5NkMhK0W}FBU>(llQ=?riv414!$Cq^-!V}PC_b{)qByZ5R9sxKBg7gug@5}Q zbGQ?I@(y!2u-)6=3iq8umI*d^oBGLHHV9VOlKk69Tq+I(q%H>pD?CzyIL@|`lSb-u zK(Lxl3WMGW$LINji)Ve7T;3UcI)b3;hLC{C5~`q? zvLpjAFaQG*C<_vZDk*d!4}+n!`SRWQ9KSaAbj?-I&-dDX@3}MJ*)7 z>f&%g`NzxR>;nZ{+o5>83TjvaGlcx zeKxd5Hs}+a=DO~{VfHT>*`FZ@1BB2%2+rst3@IOe*S5d0X zM2JvV8d=|F9|Ws92!rfjG$^0B9upu~Qb4G)G+^Xh3;?6@A!{reAPlx&WGxOrV7NZj zN3dYO4FU|gvgQwP-n;CU-qO>}9P-SANWtnjO) zxM}pwY1RH#fPnTi9AU+-{Y?O#vmE*jMwsAEyY~M8SS+6?g#JH2j{Uy?0h5plf=TP$ z3&699rN{k^nq~W>$1*;koY;!5iR#dGmXB3T#a~k1PtZOvg;n^;*#`>vB{ou1%Y`yu zLf$tlq+%cFplX<4^sND&B=QVuL_C9RJw^eR6M2#OV|$SSJTskcV)a_MEp!4tDrUsqL%b9T@LcEk z{X6UyX1|L=$|=3q!VPiP|AF^OFU7t~Nz(lU1)#_4F^_}TQkPG|kAU<)!`g>=oW>;f tr&Km;c!dCuHH*i|$;rvd$;l~~`VB=SE5R1O-*Er{002ovPDHLkV1iG1oTUH& literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_dialpad.xml b/app/src/main/res/layout/activity_dialpad.xml index 0b653a7e..80e2955e 100644 --- a/app/src/main/res/layout/activity_dialpad.xml +++ b/app/src/main/res/layout/activity_dialpad.xml @@ -16,6 +16,16 @@ android:layout_marginLeft="@dimen/activity_margin" android:layout_marginRight="@dimen/activity_margin"> + + 52dp 60dp 44sp + 40sp From 9b86c694ff82d88036deba374a208861788f7874 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 23 Sep 2018 10:58:51 +0200 Subject: [PATCH 50/98] implement char clearing at the dialpad --- .../contacts/activities/DialpadActivity.kt | 19 +++++++++++++++++++ app/src/main/res/layout/activity_dialpad.xml | 18 ++++++++++++++++-- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index 0c5ad59a..5f8190dd 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -1,8 +1,11 @@ package com.simplemobiletools.contacts.activities import android.os.Bundle +import android.text.SpannableStringBuilder +import com.simplemobiletools.commons.extensions.applyColorFilter import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.extensions.config import kotlinx.android.synthetic.main.activity_dialpad.* class DialpadActivity : SimpleActivity() { @@ -22,14 +25,30 @@ class DialpadActivity : SimpleActivity() { dialpad_9.setOnClickListener { dialpadPressed("9") } dialpad_asterisk.setOnClickListener { dialpadPressed("*") } dialpad_hashtag.setOnClickListener { dialpadPressed("#") } + dialpad_clear_char.setOnClickListener { clearChar() } + dialpad_clear_char.setOnLongClickListener { clearInput(); true } } override fun onResume() { super.onResume() updateTextColors(dialpad_wrapper) + dialpad_clear_char.applyColorFilter(config.textColor) } private fun dialpadPressed(char: String) { dialpad_input.append(char) } + + private fun clearChar() { + val curPostion = dialpad_input.selectionEnd + val reducedPos = Math.max(curPostion - 1, 0) + val selectedString = SpannableStringBuilder(dialpad_input.text) + selectedString.replace(reducedPos, curPostion, "") + dialpad_input.text = selectedString + dialpad_input.setSelection(reducedPos) + } + + private fun clearInput() { + dialpad_input.setText("") + } } diff --git a/app/src/main/res/layout/activity_dialpad.xml b/app/src/main/res/layout/activity_dialpad.xml index 80e2955e..5a9f8f5d 100644 --- a/app/src/main/res/layout/activity_dialpad.xml +++ b/app/src/main/res/layout/activity_dialpad.xml @@ -18,13 +18,27 @@ + app:layout_constraintBottom_toTopOf="@+id/dialpad_2" + app:layout_constraintEnd_toStartOf="@+id/dialpad_clear_char" + app:layout_constraintStart_toStartOf="parent"/> + + Date: Sun, 23 Sep 2018 20:13:12 +0200 Subject: [PATCH 51/98] dispatch fake key events to dialpad input --- .../contacts/activities/DialpadActivity.kt | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index 5f8190dd..3e4bc566 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -1,7 +1,7 @@ package com.simplemobiletools.contacts.activities import android.os.Bundle -import android.text.SpannableStringBuilder +import android.view.KeyEvent import com.simplemobiletools.commons.extensions.applyColorFilter import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.contacts.R @@ -36,19 +36,31 @@ class DialpadActivity : SimpleActivity() { } private fun dialpadPressed(char: String) { - dialpad_input.append(char) + dialpad_input.dispatchKeyEvent(getKeyEvent(getCharKeyCode(char))) } private fun clearChar() { - val curPostion = dialpad_input.selectionEnd - val reducedPos = Math.max(curPostion - 1, 0) - val selectedString = SpannableStringBuilder(dialpad_input.text) - selectedString.replace(reducedPos, curPostion, "") - dialpad_input.text = selectedString - dialpad_input.setSelection(reducedPos) + dialpad_input.dispatchKeyEvent(getKeyEvent(KeyEvent.KEYCODE_DEL)) } private fun clearInput() { dialpad_input.setText("") } + + private fun getKeyEvent(keyCode: Int) = KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0) + + private fun getCharKeyCode(char: String) = when (char) { + "0" -> KeyEvent.KEYCODE_0 + "1" -> KeyEvent.KEYCODE_1 + "2" -> KeyEvent.KEYCODE_2 + "3" -> KeyEvent.KEYCODE_3 + "4" -> KeyEvent.KEYCODE_4 + "5" -> KeyEvent.KEYCODE_5 + "6" -> KeyEvent.KEYCODE_6 + "7" -> KeyEvent.KEYCODE_7 + "8" -> KeyEvent.KEYCODE_8 + "9" -> KeyEvent.KEYCODE_9 + "*" -> KeyEvent.KEYCODE_STAR + else -> KeyEvent.KEYCODE_POUND + } } From 5e66eee9533e3283c1e0adc6d09bd032554d02db Mon Sep 17 00:00:00 2001 From: tibbi Date: Sun, 23 Sep 2018 20:33:07 +0200 Subject: [PATCH 52/98] hide the dialpad input cursor by default --- app/src/main/res/layout/activity_dialpad.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_dialpad.xml b/app/src/main/res/layout/activity_dialpad.xml index 5a9f8f5d..04bb29b0 100644 --- a/app/src/main/res/layout/activity_dialpad.xml +++ b/app/src/main/res/layout/activity_dialpad.xml @@ -14,7 +14,8 @@ android:layout_alignParentBottom="true" android:layout_marginBottom="@dimen/activity_margin" android:layout_marginLeft="@dimen/activity_margin" - android:layout_marginRight="@dimen/activity_margin"> + android:layout_marginRight="@dimen/activity_margin" + android:focusableInTouchMode="true"> Date: Sun, 23 Sep 2018 20:41:04 +0200 Subject: [PATCH 53/98] avoid showing the soft keyboard at clicking on the dialpad input --- .../contacts/activities/DialpadActivity.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index 3e4bc566..bd3ef3b7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -1,9 +1,13 @@ package com.simplemobiletools.contacts.activities +import android.annotation.TargetApi +import android.os.Build import android.os.Bundle +import android.text.InputType import android.view.KeyEvent import com.simplemobiletools.commons.extensions.applyColorFilter import com.simplemobiletools.commons.extensions.updateTextColors +import com.simplemobiletools.commons.helpers.isLollipopPlus import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.extensions.config import kotlinx.android.synthetic.main.activity_dialpad.* @@ -27,6 +31,7 @@ class DialpadActivity : SimpleActivity() { dialpad_hashtag.setOnClickListener { dialpadPressed("#") } dialpad_clear_char.setOnClickListener { clearChar() } dialpad_clear_char.setOnLongClickListener { clearInput(); true } + disableKeyboardPopping() } override fun onResume() { @@ -63,4 +68,13 @@ class DialpadActivity : SimpleActivity() { "*" -> KeyEvent.KEYCODE_STAR else -> KeyEvent.KEYCODE_POUND } + + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + private fun disableKeyboardPopping() { + if (isLollipopPlus()) { + dialpad_input.showSoftInputOnFocus = false + } else { + dialpad_input.inputType = InputType.TYPE_NULL + } + } } From 6159e551838059fdbfca674a94264099e0a0c815 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Sep 2018 12:05:50 +0200 Subject: [PATCH 54/98] add a text change listener to the dialpad input value --- .../contacts/activities/DialpadActivity.kt | 6 ++++++ .../contacts/extensions/EditText.kt | 13 +++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/extensions/EditText.kt diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index bd3ef3b7..f9fa6856 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -9,6 +9,7 @@ import com.simplemobiletools.commons.extensions.applyColorFilter import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.commons.helpers.isLollipopPlus import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.extensions.afterTextChanged import com.simplemobiletools.contacts.extensions.config import kotlinx.android.synthetic.main.activity_dialpad.* @@ -31,6 +32,7 @@ class DialpadActivity : SimpleActivity() { dialpad_hashtag.setOnClickListener { dialpadPressed("#") } dialpad_clear_char.setOnClickListener { clearChar() } dialpad_clear_char.setOnLongClickListener { clearInput(); true } + dialpad_input.afterTextChanged { dialpadValueChanged(it) } disableKeyboardPopping() } @@ -77,4 +79,8 @@ class DialpadActivity : SimpleActivity() { dialpad_input.inputType = InputType.TYPE_NULL } } + + private fun dialpadValueChanged(text: String) { + + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/EditText.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/EditText.kt new file mode 100644 index 00000000..65f826c2 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/EditText.kt @@ -0,0 +1,13 @@ +package com.simplemobiletools.contacts.extensions + +import android.text.Editable +import android.text.TextWatcher +import android.widget.EditText + +fun EditText.afterTextChanged(callback: (String) -> Unit) = addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} + + override fun afterTextChanged(text: Editable) = callback(text.toString()) +}) From 2beb5eb3a692e686e2707ec3841a9c9f05bc0a81 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Sep 2018 14:13:27 +0200 Subject: [PATCH 55/98] filter contacts based on the dialpad input --- .../contacts/activities/DialpadActivity.kt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index f9fa6856..8c6840f3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -11,9 +11,13 @@ import com.simplemobiletools.commons.helpers.isLollipopPlus import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.extensions.afterTextChanged import com.simplemobiletools.contacts.extensions.config +import com.simplemobiletools.contacts.helpers.ContactsHelper +import com.simplemobiletools.contacts.helpers.PHONE_NUMBER_PATTERN +import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.activity_dialpad.* class DialpadActivity : SimpleActivity() { + var contacts = ArrayList() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_dialpad) @@ -33,6 +37,7 @@ class DialpadActivity : SimpleActivity() { dialpad_clear_char.setOnClickListener { clearChar() } dialpad_clear_char.setOnLongClickListener { clearInput(); true } dialpad_input.afterTextChanged { dialpadValueChanged(it) } + ContactsHelper(this).getContacts { gotContacts(it) } disableKeyboardPopping() } @@ -80,7 +85,15 @@ class DialpadActivity : SimpleActivity() { } } - private fun dialpadValueChanged(text: String) { + private fun gotContacts(newContacts: ArrayList) { + contacts = newContacts + Contact.sorting = config.sorting + Contact.startWithSurname = config.startNameWithSurname + contacts.sort() + } + private fun dialpadValueChanged(text: String) { + val numericOnly = text.replace(PHONE_NUMBER_PATTERN.toRegex(), "") + val filtered = contacts.filter { it.cleanPhoneNumbers.any { it.value.contains(text) || it.value.contains(numericOnly) } } } } From 2aadd93fa6156094cf9a67bd16d3606f63583d01 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Sep 2018 14:15:08 +0200 Subject: [PATCH 56/98] check contact real phone numbers too, not just the cleared ones --- .../simplemobiletools/contacts/activities/DialpadActivity.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index 8c6840f3..fcb044b4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -94,6 +94,9 @@ class DialpadActivity : SimpleActivity() { private fun dialpadValueChanged(text: String) { val numericOnly = text.replace(PHONE_NUMBER_PATTERN.toRegex(), "") - val filtered = contacts.filter { it.cleanPhoneNumbers.any { it.value.contains(text) || it.value.contains(numericOnly) } } + val filtered = contacts.filter { + it.phoneNumbers.any { it.value.contains(text) || it.value.contains(numericOnly) } || + it.cleanPhoneNumbers.any { it.value.contains(text) || it.value.contains(numericOnly) } + } } } From 6718fb9a20594ab2c01175b82e2af2260ef15a90 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 24 Sep 2018 15:12:31 +0200 Subject: [PATCH 57/98] show the filtered contacts on a list above dialpad --- .../contacts/activities/DialpadActivity.kt | 20 +++++++++- .../contacts/helpers/Constants.kt | 1 + app/src/main/res/layout/activity_dialpad.xml | 38 ++++++++++++++++++- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index fcb044b4..d20d8aa5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -9,9 +9,12 @@ import com.simplemobiletools.commons.extensions.applyColorFilter import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.commons.helpers.isLollipopPlus import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.adapters.ContactsAdapter import com.simplemobiletools.contacts.extensions.afterTextChanged import com.simplemobiletools.contacts.extensions.config +import com.simplemobiletools.contacts.extensions.contactClicked import com.simplemobiletools.contacts.helpers.ContactsHelper +import com.simplemobiletools.contacts.helpers.LOCATION_DIALPAD import com.simplemobiletools.contacts.helpers.PHONE_NUMBER_PATTERN import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.activity_dialpad.* @@ -95,8 +98,21 @@ class DialpadActivity : SimpleActivity() { private fun dialpadValueChanged(text: String) { val numericOnly = text.replace(PHONE_NUMBER_PATTERN.toRegex(), "") val filtered = contacts.filter { - it.phoneNumbers.any { it.value.contains(text) || it.value.contains(numericOnly) } || - it.cleanPhoneNumbers.any { it.value.contains(text) || it.value.contains(numericOnly) } + it.phoneNumbers.any { (text.isNotEmpty() && it.value.contains(text)) || (numericOnly.isNotEmpty() && it.value.contains(numericOnly)) } || + it.cleanPhoneNumbers.any { (text.isNotEmpty() && it.value.contains(text)) || (numericOnly.isNotEmpty() && it.value.contains(numericOnly)) } + } as ArrayList + + ContactsAdapter(this, filtered, null, LOCATION_DIALPAD, null, dialpad_list, dialpad_fastscroller) { + contactClicked(it as Contact) + }.apply { + addVerticalDividers(true) + dialpad_list.adapter = this + } + + dialpad_fastscroller.setScrollToY(0) + dialpad_fastscroller.setViews(dialpad_list) { + val item = (dialpad_list.adapter as ContactsAdapter).contactItems.getOrNull(it) + dialpad_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index 34cf1ca8..d3b7fb06 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -33,6 +33,7 @@ const val LOCATION_FAVORITES_TAB = 1 const val LOCATION_RECENTS_TAB = 2 const val LOCATION_GROUPS_TAB = 3 const val LOCATION_GROUP_CONTACTS = 4 +const val LOCATION_DIALPAD = 5 const val CONTACTS_TAB_MASK = 1 const val FAVORITES_TAB_MASK = 2 diff --git a/app/src/main/res/layout/activity_dialpad.xml b/app/src/main/res/layout/activity_dialpad.xml index 04bb29b0..5a8704f6 100644 --- a/app/src/main/res/layout/activity_dialpad.xml +++ b/app/src/main/res/layout/activity_dialpad.xml @@ -13,14 +13,39 @@ android:layout_height="match_parent" android:layout_alignParentBottom="true" android:layout_marginBottom="@dimen/activity_margin" - android:layout_marginLeft="@dimen/activity_margin" - android:layout_marginRight="@dimen/activity_margin" android:focusableInTouchMode="true"> + + + + + + + + Date: Mon, 24 Sep 2018 15:17:15 +0200 Subject: [PATCH 58/98] try calling contact directly from the dialpad screen, do not trigger edit/view --- .../contacts/activities/DialpadActivity.kt | 4 ++-- .../contacts/extensions/Activity.kt | 16 +++++++++------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index d20d8aa5..4d19b26a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -11,8 +11,8 @@ import com.simplemobiletools.commons.helpers.isLollipopPlus import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.adapters.ContactsAdapter import com.simplemobiletools.contacts.extensions.afterTextChanged +import com.simplemobiletools.contacts.extensions.callContact import com.simplemobiletools.contacts.extensions.config -import com.simplemobiletools.contacts.extensions.contactClicked import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.helpers.LOCATION_DIALPAD import com.simplemobiletools.contacts.helpers.PHONE_NUMBER_PATTERN @@ -103,7 +103,7 @@ class DialpadActivity : SimpleActivity() { } as ArrayList ContactsAdapter(this, filtered, null, LOCATION_DIALPAD, null, dialpad_list, dialpad_fastscroller) { - contactClicked(it as Contact) + callContact(it as Contact) }.apply { addVerticalDividers(true) dialpad_list.adapter = this diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt index 41397cfc..b2adcb75 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt @@ -203,14 +203,16 @@ fun Activity.getVisibleContactSources(): ArrayList { fun SimpleActivity.contactClicked(contact: Contact) { when (config.onContactClick) { - ON_CLICK_CALL_CONTACT -> { - if (contact.phoneNumbers.isNotEmpty()) { - tryStartCall(contact) - } else { - toast(R.string.no_phone_number_found) - } - } + ON_CLICK_CALL_CONTACT -> callContact(contact) ON_CLICK_VIEW_CONTACT -> viewContact(contact) ON_CLICK_EDIT_CONTACT -> editContact(contact) } } + +fun SimpleActivity.callContact(contact: Contact) { + if (contact.phoneNumbers.isNotEmpty()) { + tryStartCall(contact) + } else { + toast(R.string.no_phone_number_found) + } +} From b0c1f4e30d9cf6902f65290330ffc9a02007ae58 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 25 Sep 2018 13:25:07 +0200 Subject: [PATCH 59/98] updating some things related to Android Studio 3.2 --- app/build.gradle | 2 +- build.gradle | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 98d5b869..5f97607f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,7 +4,7 @@ apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 28 - buildToolsVersion "28.0.2" + buildToolsVersion "28.0.3" defaultConfig { applicationId "com.simplemobiletools.contacts" diff --git a/build.gradle b/build.gradle index 2d064442..76ac6173 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.2.70' + ext.kotlin_version = '1.2.71' repositories { google() @@ -9,7 +9,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.android.tools.build:gradle:3.2.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7d73f3c2..503fd67b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Dec 10 10:08:39 CET 2017 +#Tue Sep 25 13:09:34 CEST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip From dac59dabcf2095e34930651a19c00acefd4c4ac0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 25 Sep 2018 13:34:31 +0200 Subject: [PATCH 60/98] removing a redundant wrapper of the dialpad --- .../contacts/activities/DialpadActivity.kt | 2 +- app/src/main/res/layout/activity_dialpad.xml | 368 +++++++++--------- 2 files changed, 182 insertions(+), 188 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index 4d19b26a..00c3c828 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -46,7 +46,7 @@ class DialpadActivity : SimpleActivity() { override fun onResume() { super.onResume() - updateTextColors(dialpad_wrapper) + updateTextColors(dialpad_holder) dialpad_clear_char.applyColorFilter(config.textColor) } diff --git a/app/src/main/res/layout/activity_dialpad.xml b/app/src/main/res/layout/activity_dialpad.xml index 5a8704f6..a9b6535a 100644 --- a/app/src/main/res/layout/activity_dialpad.xml +++ b/app/src/main/res/layout/activity_dialpad.xml @@ -1,212 +1,206 @@ - + android:layout_height="match_parent" + android:layout_alignParentBottom="true" + android:layout_marginBottom="@dimen/activity_margin" + android:focusableInTouchMode="true"> - + android:layout_height="0dp" + android:clipToPadding="false" + android:scrollbars="none" + app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager" + app:layout_constraintBottom_toTopOf="@+id/dialpad_input" + app:layout_constraintTop_toTopOf="parent"/> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + From 8ae60448f4b6d27b8a784ac2727bc11d57e8af5c Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 25 Sep 2018 14:11:29 +0200 Subject: [PATCH 61/98] finish the action mode at changing the input at dialpad --- .../com/simplemobiletools/contacts/activities/DialpadActivity.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index 00c3c828..790d95a6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -96,6 +96,7 @@ class DialpadActivity : SimpleActivity() { } private fun dialpadValueChanged(text: String) { + (dialpad_list.adapter as? ContactsAdapter)?.finishActMode() val numericOnly = text.replace(PHONE_NUMBER_PATTERN.toRegex(), "") val filtered = contacts.filter { it.phoneNumbers.any { (text.isNotEmpty() && it.value.contains(text)) || (numericOnly.isNotEmpty() && it.value.contains(numericOnly)) } || From 980368adddd01dad445add20ebeaebae25703766 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 25 Sep 2018 14:11:43 +0200 Subject: [PATCH 62/98] hide the Select All and Share menu buttons at dialpad --- .../com/simplemobiletools/contacts/adapters/ContactsAdapter.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index 39bd3220..691e0eaf 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -63,6 +63,8 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList Date: Tue, 25 Sep 2018 14:17:55 +0200 Subject: [PATCH 63/98] highlight contact number from the search query --- .../simplemobiletools/contacts/activities/DialpadActivity.kt | 2 +- .../simplemobiletools/contacts/adapters/ContactsAdapter.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index 790d95a6..73e7dd6e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -103,7 +103,7 @@ class DialpadActivity : SimpleActivity() { it.cleanPhoneNumbers.any { (text.isNotEmpty() && it.value.contains(text)) || (numericOnly.isNotEmpty() && it.value.contains(numericOnly)) } } as ArrayList - ContactsAdapter(this, filtered, null, LOCATION_DIALPAD, null, dialpad_list, dialpad_fastscroller) { + ContactsAdapter(this, filtered, null, LOCATION_DIALPAD, null, dialpad_list, dialpad_fastscroller, text) { callContact(it as Contact) }.apply { addVerticalDividers(true) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index 691e0eaf..802d074c 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -29,12 +29,12 @@ import java.util.* class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList, private val refreshListener: RefreshContactsListener?, private val location: Int, private val removeListener: RemoveFromGroupListener?, recyclerView: MyRecyclerView, - fastScroller: FastScroller, itemClick: (Any) -> Unit) : + fastScroller: FastScroller, highlightText: String = "", itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, fastScroller, itemClick) { private lateinit var contactDrawable: Drawable private var config = activity.config - private var textToHighlight = "" + private var textToHighlight = highlightText var adjustedPrimaryColor = activity.getAdjustedPrimaryColor() var startNameWithSurname: Boolean From 04a7cfc9a50ef768c0f5c034554a3d0ed5adce95 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 25 Sep 2018 14:24:29 +0200 Subject: [PATCH 64/98] try showing the searched phone number under contacts --- .../simplemobiletools/contacts/adapters/ContactsAdapter.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index 802d074c..bb310fb4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -262,7 +262,12 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList Date: Tue, 25 Sep 2018 14:42:08 +0200 Subject: [PATCH 65/98] improve the contact number fetching at the dialpad --- .../simplemobiletools/contacts/adapters/ContactsAdapter.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index bb310fb4..867a8771 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -262,12 +262,13 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList Date: Tue, 25 Sep 2018 20:04:42 +0200 Subject: [PATCH 66/98] add a helper function for a more advanced check if a contact contains some numbers --- .../contacts/activities/DialpadActivity.kt | 7 +------ .../contacts/fragments/MyViewPagerFragment.kt | 2 +- .../contacts/models/Contact.kt | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index 73e7dd6e..abd029f5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -15,7 +15,6 @@ import com.simplemobiletools.contacts.extensions.callContact import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.helpers.LOCATION_DIALPAD -import com.simplemobiletools.contacts.helpers.PHONE_NUMBER_PATTERN import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.activity_dialpad.* @@ -97,11 +96,7 @@ class DialpadActivity : SimpleActivity() { private fun dialpadValueChanged(text: String) { (dialpad_list.adapter as? ContactsAdapter)?.finishActMode() - val numericOnly = text.replace(PHONE_NUMBER_PATTERN.toRegex(), "") - val filtered = contacts.filter { - it.phoneNumbers.any { (text.isNotEmpty() && it.value.contains(text)) || (numericOnly.isNotEmpty() && it.value.contains(numericOnly)) } || - it.cleanPhoneNumbers.any { (text.isNotEmpty() && it.value.contains(text)) || (numericOnly.isNotEmpty() && it.value.contains(numericOnly)) } - } as ArrayList + val filtered = contacts.filter { it.doesContainPhoneNumber(text) } as ArrayList ContactsAdapter(this, filtered, null, LOCATION_DIALPAD, null, dialpad_list, dialpad_fastscroller, text) { callContact(it as Contact) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt index 0419aa25..208c7715 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/MyViewPagerFragment.kt @@ -241,7 +241,7 @@ abstract class MyViewPagerFragment(context: Context, attributeSet: AttributeSet) val filtered = contactsIgnoringSearch.filter { getProperText(it.getFullName(), shouldNormalize).contains(text, true) || getProperText(it.nickname, shouldNormalize).contains(text, true) || - it.phoneNumbers.any { it.value.contains(text, true) } || + it.doesContainPhoneNumber(text) || it.emails.any { it.value.contains(text, true) } || it.addresses.any { getProperText(it.value, shouldNormalize).contains(text, true) } || it.IMs.any { it.value.contains(text, true) } || diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt index de579144..e44dbd8a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt @@ -5,6 +5,7 @@ import com.simplemobiletools.commons.extensions.normalizeString import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME import com.simplemobiletools.commons.helpers.SORT_DESCENDING +import com.simplemobiletools.contacts.helpers.PHONE_NUMBER_PATTERN data class Contact(val id: Int, var prefix: String, var firstName: String, var middleName: String, var surname: String, var suffix: String, var nickname: String, var photoUri: String, var phoneNumbers: ArrayList, var emails: ArrayList, var addresses: ArrayList
, @@ -104,4 +105,22 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m } fun getHashToCompare() = getStringToCompare().hashCode() + + // do a more advanced phone number check here, compare numbers and and search query with dashes, spaces and everything but numbers removed + fun doesContainPhoneNumber(text: String): Boolean { + if (text.isNotEmpty()) { + if (phoneNumbers.any { it.value.contains(text) } || cleanPhoneNumbers.any { it.value.contains(text) }) { + return true + } + } + + val numericOnly = text.replace(PHONE_NUMBER_PATTERN.toRegex(), "") + if (numericOnly.isNotEmpty()) { + if (phoneNumbers.any { it.value.contains(numericOnly) } || cleanPhoneNumbers.any { it.value.contains(numericOnly) }) { + return true + } + } + + return false + } } From 282594c1253ab1c3d7161ccdd2a507bf40d1db54 Mon Sep 17 00:00:00 2001 From: tibbi Date: Tue, 25 Sep 2018 23:34:43 +0200 Subject: [PATCH 67/98] adding a button at the dialpad for creating new contact from number --- .../contacts/activities/DialpadActivity.kt | 32 +++++++++++++++++++ app/src/main/res/menu/menu_dialpad.xml | 9 ++++++ app/src/main/res/values-az/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-fr/strings.xml | 1 + app/src/main/res/values-hr/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-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-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 17 files changed, 56 insertions(+) create mode 100644 app/src/main/res/menu/menu_dialpad.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index abd029f5..f182912e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -1,12 +1,17 @@ package com.simplemobiletools.contacts.activities import android.annotation.TargetApi +import android.content.Intent import android.os.Build import android.os.Bundle import android.text.InputType import android.view.KeyEvent +import android.view.Menu +import android.view.MenuItem import com.simplemobiletools.commons.extensions.applyColorFilter +import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.extensions.updateTextColors +import com.simplemobiletools.commons.extensions.value import com.simplemobiletools.commons.helpers.isLollipopPlus import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.adapters.ContactsAdapter @@ -14,6 +19,7 @@ import com.simplemobiletools.contacts.extensions.afterTextChanged import com.simplemobiletools.contacts.extensions.callContact import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.helpers.ContactsHelper +import com.simplemobiletools.contacts.helpers.KEY_PHONE import com.simplemobiletools.contacts.helpers.LOCATION_DIALPAD import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.activity_dialpad.* @@ -49,6 +55,32 @@ class DialpadActivity : SimpleActivity() { dialpad_clear_char.applyColorFilter(config.textColor) } + override fun onCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.menu_dialpad, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.create_new_contact -> createNewContact() + else -> return super.onOptionsItemSelected(item) + } + return true + } + + private fun createNewContact() { + Intent().apply { + action = Intent.ACTION_INSERT_OR_EDIT + type = "vnd.android.cursor.item/contact" + putExtra(KEY_PHONE, dialpad_input.value) + if (resolveActivity(packageManager) != null) { + startActivity(this) + } else { + toast(R.string.no_app_found) + } + } + } + private fun dialpadPressed(char: String) { dialpad_input.dispatchKeyEvent(getKeyEvent(getCharKeyCode(char))) } diff --git a/app/src/main/res/menu/menu_dialpad.xml b/app/src/main/res/menu/menu_dialpad.xml new file mode 100644 index 00000000..8a1ab41d --- /dev/null +++ b/app/src/main/res/menu/menu_dialpad.xml @@ -0,0 +1,9 @@ + + + + diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index b73e2384..e624edca 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number Göstərmək üçün sahəni seç diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 31d124e0..0fecfa66 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number Sichtbare Felder auswählen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 4a55f0c1..1328162b 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number Επιλογή εμφάνισης πεδίων diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index acbdf9ac..dca32b94 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number Sélectionner les champs à afficher diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 963f9a5d..00c7183e 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number Odaberi polja za prikaz diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e044a4d8..7b3a24b1 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number 表示する項目を選択 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 41017aea..60867b85 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number Select fields to show diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index baa7e996..cd643243 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number Pasirinkti rodomus laukelius diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 471022e4..c6696378 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number Selecione os campos a mostrar diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 98f52187..a9987c6c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number Выберите отображаемые поля diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 0c8c7e6d..c8cce6c5 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -97,6 +97,7 @@ Číselník + Vytvoriť nový kontakt z čísla Zvoľte polia na zobrazenie diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index fe7d0145..45469d81 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number Välj vilka fält som ska visas diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index a6d28640..c2fc8d90 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number Görüntülenecek alanları seç diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 448f3713..d2deece6 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number 選擇要顯示的欄位 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f63785f1..ebb5d39a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -97,6 +97,7 @@ Dialpad + Create new contact from number Select fields to show From 6102028435295efbea3d1c908c9b1373ff62d55d Mon Sep 17 00:00:00 2001 From: ScratchBuild Date: Wed, 26 Sep 2018 12:15:52 +0900 Subject: [PATCH 68/98] Update Japanese translation --- app/src/main/res/values-ja/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 7b3a24b1..504bfc7b 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -96,8 +96,8 @@ ファイル名 (.vcfを含めない) - Dialpad - Create new contact from number + ダイヤルパッド + 番号から新しい連絡先を作成 表示する項目を選択 From eb914ddfdf6ec4ddb2ce90de4ca192c53d54a22a Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Sep 2018 10:11:13 +0200 Subject: [PATCH 69/98] create a new activity for handling ACTION_INSERT_OR_EDIT intent --- app/src/main/AndroidManifest.xml | 24 ++++++++++++------- .../activities/EditContactActivity.kt | 4 ++-- .../activities/InsertOrEditContactActivity.kt | 17 +++++++++++++ .../layout/activity_insert_edit_contact.xml | 8 +++++++ 4 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt create mode 100644 app/src/main/res/layout/activity_insert_edit_contact.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e2f5328a..25d5f869 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -118,15 +118,6 @@ android:name=".activities.EditContactActivity" android:parentActivityName=".activities.MainActivity"> - - - - - - - - - @@ -163,6 +154,21 @@ + + + + + + + + + + + + + + + From e429b140e45d0241719901d150688aed3fc9217e Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Sep 2018 11:45:25 +0200 Subject: [PATCH 70/98] update the "Insert Or Edit" activity title --- app/src/main/AndroidManifest.xml | 1 - .../contacts/activities/InsertOrEditContactActivity.kt | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 25d5f869..998d518a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -156,7 +156,6 @@ diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt index 407089ff..3a2c5063 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt @@ -8,6 +8,7 @@ class InsertOrEditContactActivity : ContactActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_insert_edit_contact) + title = getString(R.string.select_contact) handlePermission(PERMISSION_READ_CONTACTS) { // we do not really care about the permission request result. Even if it was denied, load private contacts From 5d8d0dd7b02f6eaa3b47fce2de8c9506e0fd5018 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Sep 2018 12:13:05 +0200 Subject: [PATCH 71/98] implement the "Create new contact" button on the insert_or_Edit screen --- .../activities/InsertOrEditContactActivity.kt | 27 ++++++++++++++++- .../main/res/drawable-hdpi/ic_new_contact.png | Bin 0 -> 269 bytes .../res/drawable-xhdpi/ic_new_contact.png | Bin 0 -> 322 bytes .../res/drawable-xxhdpi/ic_new_contact.png | Bin 0 -> 421 bytes .../res/drawable-xxxhdpi/ic_new_contact.png | Bin 0 -> 578 bytes .../layout/activity_insert_edit_contact.xml | 28 ++++++++++++++++++ app/src/main/res/values-az/strings.xml | 2 ++ app/src/main/res/values-de/strings.xml | 2 ++ app/src/main/res/values-el/strings.xml | 2 ++ app/src/main/res/values-fr/strings.xml | 2 ++ app/src/main/res/values-hr/strings.xml | 2 ++ app/src/main/res/values-ja/strings.xml | 2 ++ app/src/main/res/values-ko-rKR/strings.xml | 2 ++ app/src/main/res/values-lt/strings.xml | 2 ++ app/src/main/res/values-pt/strings.xml | 2 ++ app/src/main/res/values-ru/strings.xml | 2 ++ app/src/main/res/values-sk/strings.xml | 2 ++ app/src/main/res/values-sv/strings.xml | 2 ++ app/src/main/res/values-tr/strings.xml | 2 ++ app/src/main/res/values-zh-rTW/strings.xml | 2 ++ app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/strings.xml | 2 ++ 22 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_new_contact.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_new_contact.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_new_contact.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_new_contact.png diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt index 3a2c5063..7feea511 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt @@ -1,18 +1,43 @@ package com.simplemobiletools.contacts.activities +import android.content.Intent import android.os.Bundle +import android.provider.ContactsContract +import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor +import com.simplemobiletools.commons.extensions.toast +import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.extensions.config +import com.simplemobiletools.contacts.helpers.KEY_PHONE +import kotlinx.android.synthetic.main.activity_insert_edit_contact.* -class InsertOrEditContactActivity : ContactActivity() { +class InsertOrEditContactActivity : SimpleActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_insert_edit_contact) title = getString(R.string.select_contact) + updateTextColors(insert_edit_contact_holder) handlePermission(PERMISSION_READ_CONTACTS) { // we do not really care about the permission request result. Even if it was denied, load private contacts + setupViews() + } + } + private fun setupViews() { + new_contact_tmb.setImageDrawable(resources.getColoredDrawableWithColor(R.drawable.ic_new_contact, config.textColor)) + new_contact_holder.setOnClickListener { + Intent().apply { + action = Intent.ACTION_INSERT + data = ContactsContract.Contacts.CONTENT_URI + putExtra(KEY_PHONE, intent.getStringExtra(KEY_PHONE)) + if (resolveActivity(packageManager) != null) { + startActivity(this) + } else { + toast(R.string.no_app_found) + } + } } } } diff --git a/app/src/main/res/drawable-hdpi/ic_new_contact.png b/app/src/main/res/drawable-hdpi/ic_new_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..ded0ae9204330f787b238e650155b0929d65f1cc GIT binary patch literal 269 zcmV+o0rLKdP)H&J1pq`*e50DfD0w{nI>Jb_R2!cY$l!E#Tqp01xb_Q|3 z0mk{c+dY;MjbV_X&Vu9fSx_ev?{J4Pci!C@e$jbvQ zR9fMN_`bedqTts+PdJP| zmfgr-cH)4KEH!^!&#Ar6Ui^{ebgenCq z3X04KYew<6;Yo)4YDhBd_!0-AI8e6qNU7@tOnT-VUU>EvzJ_nT_GbV`@WYeMq}A3RVwBiit|R`|J9X}R@4okQ z!~5HZ|MtF*LI@#*P>pUDIpLZjZ(MWC5?%T)43Ou8-^%3aQ})PFqLvalWs6nnSyOhH zroL}xlnr`#Cy94@l?C=mYES+c#9~n1*uY{#jiG}6L;;I}f6yHkcm6@2SQPz(imeuO zkHx)z&>0qI{z02qZ2AWcVKM9(WIrAIN(LiUq1SX={evWCNMc&bC`e+Rde)^3gCu4t zQ%jkgEHH9^@-a#{gKjuVZ3a<6t$+xMpa^1=IkwoQzyn_ZeDT03dA68mG_xQ^SmBUo z>UrjX6-FF`m>|y+R!?j*sdUl70v9ynf(1I14yL#z4Yy3GS#+{Pns(__;~3+Sv^_Ge z#?a3z9$pxb9c^6U<&t(;v5co>S#gf1b6HWsQ%P1hi=YUKpq3Ou2qF9cn1^3$=;qUg P00000NkvXXu0mjf0jarG literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_new_contact.png b/app/src/main/res/drawable-xxxhdpi/ic_new_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..07435b94a46a5a0ebea6ded6f76b1e5394d799e4 GIT binary patch literal 578 zcmV-I0=@l-P)41mTFnG&hjq9cYom=e&NlW$yRkJf>o%zEHnwZqwh`2$;H}*qojY^RB>xjT z@Ads;j4{R-V~jD?Kog_v;T(_1km51t*~L5>R10Wl9Vz}N#X8y*GNzK`1NnR)$y9}j zW{y&fqckf#%-}x7y3Y)Sg*Kj0iYIg`95iy4Qe7gZP_U44EKnHeB~3Zf^eF_aqg?Cd zA9bWCSBg6M#t1G(6czrWBC#45Yy1Zsz{LUo0k?2*%YVQ}Tzv2!@E#ZM{RiB}#clrq zhj4L7uIw>d^DnYGKKlQZa0rlCOS#rbAp~@m{W;yC(%~q=ADV?yC;^RJq*P~V3?@LL zi^r7W32jn90TMI0>prV^43KE%1jRT-vlL)}L>);|VgZPhjBJ> zo*c!7rbb#;3Gg;h6 + + + + + + + diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index e624edca..650b76f5 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -15,6 +15,8 @@ Grupa e-poçt göndər %s şəxsinə zng et Lazım olan icazələri istə + Create new contact + Add to an existing contact Yeni kontakt Redaktə et diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 0fecfa66..041a1687 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -15,6 +15,8 @@ Sende E-Mail an Gruppe %s anrufen Benötigte Berechtigungen anfordern + Create new contact + Add to an existing contact Neuer Kontakt Kontakt bearbeiten diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 1328162b..0a3751f8 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -15,6 +15,8 @@ Αποστολή email σε ομάδες Κλήση %s Ζητούνται τα απαιτούμενα δικαιώματα + Create new contact + Add to an existing contact Νέα επαφή Επεξεργασία επαφής diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index dca32b94..d646b479 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -15,6 +15,8 @@ Envoyer un e-mail au groupe Call %s Demander les autorisations requises + Create new contact + Add to an existing contact Nouveau contact Modifier contact diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 00c7183e..6f564596 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -15,6 +15,8 @@ Pošalji e-poštu grupi Nazovi %s Zatraži potrebna dopuštenja + Create new contact + Add to an existing contact Novi kontakt Uredi kontakt diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 504bfc7b..ee37c62a 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -15,6 +15,8 @@ グループにメールを送信 Call %s Request the required permissions + Create new contact + Add to an existing contact 新しい連絡先 連絡先を編集 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 60867b85..fa4c5d54 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -15,6 +15,8 @@ Send email to group Call %s Request the required permissions + Create new contact + Add to an existing contact 새로운 연락처 연락처 수정 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index cd643243..c16881d5 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -15,6 +15,8 @@ Send email to group Call %s Request the required permissions + Create new contact + Add to an existing contact Naujas kontaktas Redaguoti kontaktą diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index c6696378..0c72f160 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -15,6 +15,8 @@ Enviar e-mail para o grupo Ligar a %s Pedir a permissão necessária + Create new contact + Add to an existing contact Novo contacto Editar contacto diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index a9987c6c..dd978592 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -15,6 +15,8 @@ Отправить письмо группе Вызов %s Запрос необходимых разрешений + Create new contact + Add to an existing contact Новый контакт Редактировать контакт diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index c8cce6c5..8c738576 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -15,6 +15,8 @@ Poslať skupine email Zavolať %s Vyžiadať potrebné oprávnenia + Vytvoriť nový kontakt + Pridať k existujúcemu kontaktu Nový kontakt Upraviť kontakt diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 45469d81..0fb23153 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -15,6 +15,8 @@ Skicka e-post till grupp Ring %s Begär de behörigheter som krävs + Create new contact + Add to an existing contact Ny kontakt Redigera kontakt diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index c2fc8d90..710fa376 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -15,6 +15,8 @@ Gruba e-posta gönder Call %s Request the required permissions + Create new contact + Add to an existing contact Yeni kişi Kişiyi düzenle diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index d2deece6..af88bce6 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -15,6 +15,8 @@ 發送電子郵件給群組 打電話給 %s 請求必要的權限 + Create new contact + Add to an existing contact 新聯絡人 編輯聯絡人 diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 56d5d4fc..e72744fc 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -4,6 +4,7 @@ 45dp 40dp 52dp + 68dp 60dp 44sp 40sp diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ebb5d39a..2ec0cd04 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,8 @@ Send email to group Call %s Request the required permissions + Create new contact + Add to an existing contact New contact Edit contact From a7b79f89ed90f7c1daf23bbb37a59d4942439447 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Sep 2018 14:47:28 +0200 Subject: [PATCH 72/98] add a label at the insert_or_edit activity --- .../activities/InsertOrEditContactActivity.kt | 7 +++++-- .../main/res/layout/activity_insert_edit_contact.xml | 12 ++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt index 7feea511..9e5bc8d9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt @@ -3,6 +3,7 @@ package com.simplemobiletools.contacts.activities import android.content.Intent import android.os.Bundle import android.provider.ContactsContract +import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.extensions.updateTextColors @@ -17,15 +18,15 @@ class InsertOrEditContactActivity : SimpleActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_insert_edit_contact) title = getString(R.string.select_contact) - updateTextColors(insert_edit_contact_holder) + setupViews() handlePermission(PERMISSION_READ_CONTACTS) { // we do not really care about the permission request result. Even if it was denied, load private contacts - setupViews() } } private fun setupViews() { + updateTextColors(insert_edit_contact_holder) new_contact_tmb.setImageDrawable(resources.getColoredDrawableWithColor(R.drawable.ic_new_contact, config.textColor)) new_contact_holder.setOnClickListener { Intent().apply { @@ -39,5 +40,7 @@ class InsertOrEditContactActivity : SimpleActivity() { } } } + + existing_contact_label.setTextColor(getAdjustedPrimaryColor()) } } diff --git a/app/src/main/res/layout/activity_insert_edit_contact.xml b/app/src/main/res/layout/activity_insert_edit_contact.xml index d98b8d7e..ad3769dd 100644 --- a/app/src/main/res/layout/activity_insert_edit_contact.xml +++ b/app/src/main/res/layout/activity_insert_edit_contact.xml @@ -33,4 +33,16 @@ android:textSize="@dimen/big_text_size"/> + + + From 78240eeb2b5c251b82873b1df4f7f3ced52db276 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Sep 2018 15:28:47 +0200 Subject: [PATCH 73/98] fill the list of contacts at insert_or_edit --- .../activities/InsertOrEditContactActivity.kt | 26 +++++++++++++++++++ .../contacts/adapters/ContactsAdapter.kt | 3 ++- .../contacts/helpers/Constants.kt | 1 + .../layout/activity_insert_edit_contact.xml | 24 +++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt index 9e5bc8d9..610f84b3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt @@ -9,8 +9,12 @@ import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.extensions.updateTextColors import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.adapters.ContactsAdapter import com.simplemobiletools.contacts.extensions.config +import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.helpers.KEY_PHONE +import com.simplemobiletools.contacts.helpers.LOCATION_INSERT_OR_EDIT +import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.activity_insert_edit_contact.* class InsertOrEditContactActivity : SimpleActivity() { @@ -22,6 +26,9 @@ class InsertOrEditContactActivity : SimpleActivity() { handlePermission(PERMISSION_READ_CONTACTS) { // we do not really care about the permission request result. Even if it was denied, load private contacts + ContactsHelper(this).getContacts { + gotContacts(it) + } } } @@ -43,4 +50,23 @@ class InsertOrEditContactActivity : SimpleActivity() { existing_contact_label.setTextColor(getAdjustedPrimaryColor()) } + + private fun gotContacts(contacts: ArrayList) { + Contact.sorting = config.sorting + Contact.startWithSurname = config.startNameWithSurname + contacts.sort() + + ContactsAdapter(this, contacts, null, LOCATION_INSERT_OR_EDIT, null, existing_contact_list, existing_contact_fastscroller) { + + }.apply { + addVerticalDividers(true) + existing_contact_list.adapter = this + } + + existing_contact_fastscroller.setScrollToY(0) + existing_contact_fastscroller.setViews(existing_contact_list) { + val item = (existing_contact_list.adapter as ContactsAdapter).contactItems.getOrNull(it) + existing_contact_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") + } + } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index 867a8771..4372437e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -107,7 +107,8 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList + val allowLongClick = location != LOCATION_INSERT_OR_EDIT + val view = holder.bindView(contact, true, allowLongClick) { itemView, layoutPosition -> setupView(itemView, contact) } bindViewHolder(holder, position, view) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index d3b7fb06..58f5d9fa 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -34,6 +34,7 @@ const val LOCATION_RECENTS_TAB = 2 const val LOCATION_GROUPS_TAB = 3 const val LOCATION_GROUP_CONTACTS = 4 const val LOCATION_DIALPAD = 5 +const val LOCATION_INSERT_OR_EDIT = 6 const val CONTACTS_TAB_MASK = 1 const val FAVORITES_TAB_MASK = 2 diff --git a/app/src/main/res/layout/activity_insert_edit_contact.xml b/app/src/main/res/layout/activity_insert_edit_contact.xml index ad3769dd..50edfe57 100644 --- a/app/src/main/res/layout/activity_insert_edit_contact.xml +++ b/app/src/main/res/layout/activity_insert_edit_contact.xml @@ -1,6 +1,7 @@ @@ -41,8 +42,31 @@ android:layout_below="@+id/new_contact_holder" android:layout_marginStart="@dimen/bigger_margin" android:layout_marginLeft="@dimen/bigger_margin" + android:layout_marginBottom="@dimen/activity_margin" android:text="@string/add_to_existing_contact" android:textAllCaps="true" android:textSize="@dimen/smaller_text_size"/> + + + + + + + From 5e5de8b90aae0f6eb6f805cef33a0e3a4413642c Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Sep 2018 23:02:23 +0200 Subject: [PATCH 74/98] fix #166, properly handle intents adding numbers to existing contacts --- .../contacts/activities/EditContactActivity.kt | 6 +++--- .../contacts/activities/InsertOrEditContactActivity.kt | 9 ++++++++- .../com/simplemobiletools/contacts/helpers/Constants.kt | 1 + 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index 26b9e96a..b0156746 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -58,7 +58,7 @@ class EditContactActivity : ContactActivity() { supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_cross) val action = intent.action - isThirdPartyIntent = action == Intent.ACTION_EDIT || action == Intent.ACTION_INSERT + isThirdPartyIntent = action == Intent.ACTION_EDIT || action == Intent.ACTION_INSERT || action == ADD_NEW_CONTACT_NUMBER val isFromSimpleContacts = intent.getBooleanExtra(IS_FROM_SIMPLE_CONTACTS, false) if (isThirdPartyIntent && !isFromSimpleContacts) { handlePermission(PERMISSION_READ_CONTACTS) { @@ -119,7 +119,7 @@ class EditContactActivity : ContactActivity() { private fun initContact() { var contactId = intent.getIntExtra(CONTACT_ID, 0) val action = intent.action - if (contactId == 0 && action == Intent.ACTION_EDIT) { + if (contactId == 0 && (action == Intent.ACTION_EDIT || action == ADD_NEW_CONTACT_NUMBER)) { val data = intent.data if (data != null) { val rawId = if (data.path.contains("lookup")) { @@ -149,7 +149,7 @@ class EditContactActivity : ContactActivity() { setupEditContact() } - if (contact!!.id == 0 && intent.extras?.containsKey(KEY_PHONE) == true && action == Intent.ACTION_INSERT) { + if ((contact!!.id == 0 && intent.extras?.containsKey(KEY_PHONE) == true && action == Intent.ACTION_INSERT) || action == ADD_NEW_CONTACT_NUMBER) { val phoneNumber = intent.extras.get(KEY_PHONE)?.toString() ?: "" contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE, "")) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt index 610f84b3..46b1131f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt @@ -11,6 +11,8 @@ import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.adapters.ContactsAdapter import com.simplemobiletools.contacts.extensions.config +import com.simplemobiletools.contacts.extensions.getContactPublicUri +import com.simplemobiletools.contacts.helpers.ADD_NEW_CONTACT_NUMBER import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.helpers.KEY_PHONE import com.simplemobiletools.contacts.helpers.LOCATION_INSERT_OR_EDIT @@ -57,7 +59,12 @@ class InsertOrEditContactActivity : SimpleActivity() { contacts.sort() ContactsAdapter(this, contacts, null, LOCATION_INSERT_OR_EDIT, null, existing_contact_list, existing_contact_fastscroller) { - + Intent(applicationContext, EditContactActivity::class.java).apply { + data = getContactPublicUri(it as Contact) + action = ADD_NEW_CONTACT_NUMBER + putExtra(KEY_PHONE, intent.getStringExtra(KEY_PHONE)) + startActivity(this) + } }.apply { addVerticalDividers(true) existing_contact_list.adapter = this diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index 58f5d9fa..936744bc 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -23,6 +23,7 @@ const val GROUP = "group" const val FIRST_GROUP_ID = 10000 const val PHONE_NUMBER_PATTERN = "\\D+" const val IS_FROM_SIMPLE_CONTACTS = "is_from_simple_contacts" +const val ADD_NEW_CONTACT_NUMBER = "add_new_contact_number" // extras used at third party intents const val KEY_PHONE = "phone" From 4b645b70b3495c7bcef8adb700687f846fe7b1d3 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Sep 2018 23:27:42 +0200 Subject: [PATCH 75/98] close the contact picker after successfull insert or edit --- .../contacts/activities/EditContactActivity.kt | 3 +++ .../activities/InsertOrEditContactActivity.kt | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index b0156746..3a496137 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -1,5 +1,6 @@ package com.simplemobiletools.contacts.activities +import android.app.Activity import android.app.DatePickerDialog import android.content.ClipData import android.content.ContentValues @@ -938,6 +939,7 @@ class EditContactActivity : ContactActivity() { contact!!.source = originalContactSource ContactsHelper(this).deleteContact(contact!!) } + setResult(Activity.RESULT_OK) finish() } else { toast(R.string.unknown_error_occurred) @@ -947,6 +949,7 @@ class EditContactActivity : ContactActivity() { private fun updateContact(photoUpdateStatus: Int) { isSaving = true if (ContactsHelper(this@EditContactActivity).updateContact(contact!!, photoUpdateStatus)) { + setResult(Activity.RESULT_OK) finish() } else { toast(R.string.unknown_error_occurred) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt index 46b1131f..16430225 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/InsertOrEditContactActivity.kt @@ -1,5 +1,6 @@ package com.simplemobiletools.contacts.activities +import android.app.Activity import android.content.Intent import android.os.Bundle import android.provider.ContactsContract @@ -20,6 +21,9 @@ import com.simplemobiletools.contacts.models.Contact import kotlinx.android.synthetic.main.activity_insert_edit_contact.* class InsertOrEditContactActivity : SimpleActivity() { + private val START_INSERT_ACTIVITY = 1 + private val START_EDIT_ACTIVITY = 2 + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_insert_edit_contact) @@ -43,7 +47,7 @@ class InsertOrEditContactActivity : SimpleActivity() { data = ContactsContract.Contacts.CONTENT_URI putExtra(KEY_PHONE, intent.getStringExtra(KEY_PHONE)) if (resolveActivity(packageManager) != null) { - startActivity(this) + startActivityForResult(this, START_INSERT_ACTIVITY) } else { toast(R.string.no_app_found) } @@ -63,7 +67,7 @@ class InsertOrEditContactActivity : SimpleActivity() { data = getContactPublicUri(it as Contact) action = ADD_NEW_CONTACT_NUMBER putExtra(KEY_PHONE, intent.getStringExtra(KEY_PHONE)) - startActivity(this) + startActivityForResult(this, START_EDIT_ACTIVITY) } }.apply { addVerticalDividers(true) @@ -76,4 +80,11 @@ class InsertOrEditContactActivity : SimpleActivity() { existing_contact_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") } } + + override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) { + super.onActivityResult(requestCode, resultCode, resultData) + if (resultCode == Activity.RESULT_OK) { + finish() + } + } } From 5a9513b75d81c77e86fa3d0d7e241ed3b23dd052 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 26 Sep 2018 23:45:27 +0200 Subject: [PATCH 76/98] add haptic feedback to dialpad buttons --- .../contacts/activities/DialpadActivity.kt | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index f182912e..25b6fc60 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -8,10 +8,8 @@ import android.text.InputType import android.view.KeyEvent import android.view.Menu import android.view.MenuItem -import com.simplemobiletools.commons.extensions.applyColorFilter -import com.simplemobiletools.commons.extensions.toast -import com.simplemobiletools.commons.extensions.updateTextColors -import com.simplemobiletools.commons.extensions.value +import android.view.View +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.isLollipopPlus import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.adapters.ContactsAdapter @@ -30,19 +28,19 @@ class DialpadActivity : SimpleActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_dialpad) - dialpad_0.setOnClickListener { dialpadPressed("0") } - dialpad_1.setOnClickListener { dialpadPressed("1") } - dialpad_2.setOnClickListener { dialpadPressed("2") } - dialpad_3.setOnClickListener { dialpadPressed("3") } - dialpad_4.setOnClickListener { dialpadPressed("4") } - dialpad_5.setOnClickListener { dialpadPressed("5") } - dialpad_6.setOnClickListener { dialpadPressed("6") } - dialpad_7.setOnClickListener { dialpadPressed("7") } - dialpad_8.setOnClickListener { dialpadPressed("8") } - dialpad_9.setOnClickListener { dialpadPressed("9") } - dialpad_asterisk.setOnClickListener { dialpadPressed("*") } - dialpad_hashtag.setOnClickListener { dialpadPressed("#") } - dialpad_clear_char.setOnClickListener { clearChar() } + dialpad_0.setOnClickListener { dialpadPressed("0", it) } + dialpad_1.setOnClickListener { dialpadPressed("1", it) } + dialpad_2.setOnClickListener { dialpadPressed("2", it) } + dialpad_3.setOnClickListener { dialpadPressed("3", it) } + dialpad_4.setOnClickListener { dialpadPressed("4", it) } + dialpad_5.setOnClickListener { dialpadPressed("5", it) } + dialpad_6.setOnClickListener { dialpadPressed("6", it) } + dialpad_7.setOnClickListener { dialpadPressed("7", it) } + dialpad_8.setOnClickListener { dialpadPressed("8", it) } + dialpad_9.setOnClickListener { dialpadPressed("9", it) } + dialpad_asterisk.setOnClickListener { dialpadPressed("*", it) } + dialpad_hashtag.setOnClickListener { dialpadPressed("#", it) } + dialpad_clear_char.setOnClickListener { clearChar(it) } dialpad_clear_char.setOnLongClickListener { clearInput(); true } dialpad_input.afterTextChanged { dialpadValueChanged(it) } ContactsHelper(this).getContacts { gotContacts(it) } @@ -81,12 +79,14 @@ class DialpadActivity : SimpleActivity() { } } - private fun dialpadPressed(char: String) { + private fun dialpadPressed(char: String, view: View) { dialpad_input.dispatchKeyEvent(getKeyEvent(getCharKeyCode(char))) + view.performHapticFeedback() } - private fun clearChar() { + private fun clearChar(view: View) { dialpad_input.dispatchKeyEvent(getKeyEvent(KeyEvent.KEYCODE_DEL)) + view.performHapticFeedback() } private fun clearInput() { From 11349a3112a6383f8bd6d14368aa90c2240ef2fd Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 27 Sep 2018 10:32:28 +0200 Subject: [PATCH 77/98] highlight new phone number at adding it to an existing contact --- .../contacts/activities/EditContactActivity.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index 3a496137..2e14cba5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -14,6 +14,7 @@ import android.view.Menu import android.view.MenuItem import android.view.ViewGroup import android.view.WindowManager +import android.widget.EditText import android.widget.ImageView import android.widget.TextView import com.simplemobiletools.commons.dialogs.RadioGroupDialog @@ -51,6 +52,8 @@ class EditContactActivity : ContactActivity() { private var lastPhotoIntentUri: Uri? = null private var isSaving = false private var isThirdPartyIntent = false + private var highlightLastPhoneNumber = false + private var numberViewToColor: EditText? = null private var originalContactSource = "" override fun onCreate(savedInstanceState: Bundle?) { @@ -153,6 +156,9 @@ class EditContactActivity : ContactActivity() { if ((contact!!.id == 0 && intent.extras?.containsKey(KEY_PHONE) == true && action == Intent.ACTION_INSERT) || action == ADD_NEW_CONTACT_NUMBER) { val phoneNumber = intent.extras.get(KEY_PHONE)?.toString() ?: "" contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE, "")) + if (phoneNumber.isNotEmpty() && action == ADD_NEW_CONTACT_NUMBER) { + highlightLastPhoneNumber = true + } contact!!.firstName = intent.extras.get(KEY_NAME)?.toString() ?: "" @@ -231,6 +237,7 @@ class EditContactActivity : ContactActivity() { } updateTextColors(contact_scrollview) + numberViewToColor?.setTextColor(getAdjustedPrimaryColor()) wasActivityInitialized = true invalidateOptionsMenu() } @@ -374,6 +381,9 @@ class EditContactActivity : ContactActivity() { numberHolder!!.apply { contact_number.setText(number.value) setupPhoneNumberTypePicker(contact_number_type, number.type, number.label) + if (highlightLastPhoneNumber && index == contact!!.phoneNumbers.size - 1) { + numberViewToColor = contact_number + } } } } From 12c5f520925bce0f78c567d5c1a39ace8799f06f Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 27 Sep 2018 12:16:39 +0200 Subject: [PATCH 78/98] fix #254, if there is no N and ORG fields at the given contact, only FN, treat it as an organization --- .../com/simplemobiletools/contacts/helpers/VcfImporter.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt index f186505b..9cc27af8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -138,6 +138,11 @@ class VcfImporter(val activity: SimpleActivity) { val contact = Contact(0, prefix, firstName, middleName, surname, suffix, nickname, photoUri, phoneNumbers, emails, addresses, events, targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, cleanPhoneNumbers, IMs) + // if there is no N and ORG fields at the given contact, only FN, treat it as an organization + if (contact.getFullName().isEmpty() && contact.organization.isEmpty() && ezContact.formattedName.value.isNotEmpty()) { + contact.organization.company = ezContact.formattedName.value + } + if (ContactsHelper(activity).insertContact(contact)) { contactsImported++ } From 02002297c0fd487eafce69874c1c39fcbb3f0b9b Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 27 Sep 2018 12:19:40 +0200 Subject: [PATCH 79/98] fix #250, allow copying phone number to clipboard by long pressing it Works at the View contact screen only --- .../contacts/activities/ViewContactActivity.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt index 886d86c5..a7995535 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt @@ -235,6 +235,12 @@ class ViewContactActivity : ContactActivity() { startCallIntent(phoneNumber.value) } } + + setOnLongClickListener { + copyToClipboard(phoneNumber.value) + toast(R.string.value_copied_to_clipboard) + true + } } } contact_numbers_image.beVisible() From 15f09bd52a6e4bb7dd6a3269fc1b3c90b9b89806 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 27 Sep 2018 13:42:07 +0200 Subject: [PATCH 80/98] increase list item heights if phone number is shown --- app/src/main/res/layout/item_contact_with_number.xml | 9 +++++---- app/src/main/res/layout/item_recent_call.xml | 7 ++++--- app/src/main/res/values/dimens.xml | 1 + 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/layout/item_contact_with_number.xml b/app/src/main/res/layout/item_contact_with_number.xml index e08b13ee..4ecf2645 100644 --- a/app/src/main/res/layout/item_contact_with_number.xml +++ b/app/src/main/res/layout/item_contact_with_number.xml @@ -13,13 +13,14 @@ @@ -31,15 +32,15 @@ android:layout_toRightOf="@+id/contact_tmb" android:ellipsize="end" android:maxLines="1" - android:textSize="@dimen/bigger_text_size" + android:textSize="@dimen/big_text_size" tools:text="John Doe"/> 45dp 40dp 52dp + 56dp 68dp 60dp 44sp From d35c0af68afec055f7a57f57431470489ff44562 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 27 Sep 2018 13:50:25 +0200 Subject: [PATCH 81/98] add a screen divider line at the dialpad --- app/src/main/res/layout/activity_dialpad.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/res/layout/activity_dialpad.xml b/app/src/main/res/layout/activity_dialpad.xml index a9b6535a..a0b899c9 100644 --- a/app/src/main/res/layout/activity_dialpad.xml +++ b/app/src/main/res/layout/activity_dialpad.xml @@ -36,6 +36,13 @@ + + Date: Thu, 27 Sep 2018 13:51:02 +0200 Subject: [PATCH 82/98] make the dialpad buttons smaller --- app/src/main/res/values/dimens.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index eb64d7a4..29c380b7 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -7,6 +7,6 @@ 56dp 68dp 60dp - 44sp + 34sp 40sp From 26061d8827ec4c6d87e3fef5b839f97deba92225 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 27 Sep 2018 13:55:00 +0200 Subject: [PATCH 83/98] change the menu button text at the dialpad --- .../simplemobiletools/contacts/activities/DialpadActivity.kt | 4 ++-- app/src/main/res/menu/menu_dialpad.xml | 4 ++-- app/src/main/res/values-az/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-el/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-hr/strings.xml | 2 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-ko-rKR/strings.xml | 2 +- app/src/main/res/values-lt/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 17 files changed, 19 insertions(+), 19 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index 25b6fc60..b21abeeb 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -60,13 +60,13 @@ class DialpadActivity : SimpleActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { - R.id.create_new_contact -> createNewContact() + R.id.add_number_to_contact -> addNumberToContact() else -> return super.onOptionsItemSelected(item) } return true } - private fun createNewContact() { + private fun addNumberToContact() { Intent().apply { action = Intent.ACTION_INSERT_OR_EDIT type = "vnd.android.cursor.item/contact" diff --git a/app/src/main/res/menu/menu_dialpad.xml b/app/src/main/res/menu/menu_dialpad.xml index 8a1ab41d..66fa1d06 100644 --- a/app/src/main/res/menu/menu_dialpad.xml +++ b/app/src/main/res/menu/menu_dialpad.xml @@ -2,8 +2,8 @@ diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 650b76f5..8f2f3892 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -99,7 +99,7 @@ Dialpad - Create new contact from number + Add number to contact Göstərmək üçün sahəni seç diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 041a1687..ec3adbe4 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -99,7 +99,7 @@ Dialpad - Create new contact from number + Add number to contact Sichtbare Felder auswählen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 0a3751f8..b548d329 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -99,7 +99,7 @@ Dialpad - Create new contact from number + Add number to contact Επιλογή εμφάνισης πεδίων diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index d646b479..b3dc4634 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -99,7 +99,7 @@ Dialpad - Create new contact from number + Add number to contact Sélectionner les champs à afficher diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 6f564596..d5c8544e 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -99,7 +99,7 @@ Dialpad - Create new contact from number + Add number to contact Odaberi polja za prikaz diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index ee37c62a..e87a4211 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -99,7 +99,7 @@ ダイヤルパッド - 番号から新しい連絡先を作成 + Add number to contact 表示する項目を選択 diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index fa4c5d54..4c7bbb68 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -99,7 +99,7 @@ Dialpad - Create new contact from number + Add number to contact Select fields to show diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index c16881d5..e99c1beb 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -99,7 +99,7 @@ Dialpad - Create new contact from number + Add number to contact Pasirinkti rodomus laukelius diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 0c72f160..de97bde8 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -99,7 +99,7 @@ Dialpad - Create new contact from number + Add number to contact Selecione os campos a mostrar diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index dd978592..cd412417 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -99,7 +99,7 @@ Dialpad - Create new contact from number + Add number to contact Выберите отображаемые поля diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 8c738576..ac542986 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -99,7 +99,7 @@ Číselník - Vytvoriť nový kontakt z čísla + Pridať číslo kontaktu Zvoľte polia na zobrazenie diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 0fb23153..b2198c6e 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -99,7 +99,7 @@ Dialpad - Create new contact from number + Add number to contact Välj vilka fält som ska visas diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 710fa376..583219d7 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -99,7 +99,7 @@ Dialpad - Create new contact from number + Add number to contact Görüntülenecek alanları seç diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index af88bce6..1fe54476 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -99,7 +99,7 @@ Dialpad - Create new contact from number + Add number to contact 選擇要顯示的欄位 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2ec0cd04..53be90a2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -99,7 +99,7 @@ Dialpad - Create new contact from number + Add number to contact Select fields to show From 2f59a847484ed09f2a3745078502ef79c79d6585 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 27 Sep 2018 14:00:55 +0200 Subject: [PATCH 84/98] avoid some null extras at third party intents --- .../contacts/activities/EditContactActivity.kt | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index 2e14cba5..385f155a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -153,14 +153,20 @@ class EditContactActivity : ContactActivity() { setupEditContact() } - if ((contact!!.id == 0 && intent.extras?.containsKey(KEY_PHONE) == true && action == Intent.ACTION_INSERT) || action == ADD_NEW_CONTACT_NUMBER) { - val phoneNumber = intent.extras.get(KEY_PHONE)?.toString() ?: "" - contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE, "")) - if (phoneNumber.isNotEmpty() && action == ADD_NEW_CONTACT_NUMBER) { - highlightLastPhoneNumber = true + if ((contact!!.id == 0 && intent.extras != null && intent.extras.containsKey(KEY_PHONE) && action == Intent.ACTION_INSERT) || action == ADD_NEW_CONTACT_NUMBER) { + val phone = intent.extras.get(KEY_PHONE) + if (phone != null) { + val phoneNumber = phone.toString() + contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE, "")) + if (phoneNumber.isNotEmpty() && action == ADD_NEW_CONTACT_NUMBER) { + highlightLastPhoneNumber = true + } } - contact!!.firstName = intent.extras.get(KEY_NAME)?.toString() ?: "" + val firstName = intent.extras.get(KEY_NAME) + if (firstName != null) { + contact!!.firstName = firstName.toString() + } val data = intent.extras.getParcelableArrayList("data") if (data != null) { From d0ef3368f545f43ac0c9e82157a0bb942979f9a4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 27 Sep 2018 14:28:25 +0200 Subject: [PATCH 85/98] make the dialpad input text the same size as the buttons --- app/src/main/res/layout/activity_dialpad.xml | 2 +- app/src/main/res/values/dimens.xml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_dialpad.xml b/app/src/main/res/layout/activity_dialpad.xml index a0b899c9..acae2500 100644 --- a/app/src/main/res/layout/activity_dialpad.xml +++ b/app/src/main/res/layout/activity_dialpad.xml @@ -51,7 +51,7 @@ android:gravity="center" android:inputType="phone" android:textCursorDrawable="@null" - android:textSize="@dimen/dialpad_input_text_size" + android:textSize="@dimen/dialpad_text_size" app:layout_constraintBottom_toTopOf="@+id/dialpad_2" app:layout_constraintEnd_toStartOf="@+id/dialpad_clear_char" app:layout_constraintStart_toStartOf="parent"/> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 29c380b7..b0496177 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -8,5 +8,4 @@ 68dp 60dp 34sp - 40sp From 51b953f8163c0aaa15e1584f193b1d08ceb9ee7b Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 27 Sep 2018 14:39:26 +0200 Subject: [PATCH 86/98] reduce the padding of dialpad buttons --- app/src/main/res/values/styles.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index dd117a86..b7e0377a 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -4,8 +4,8 @@ From cacbbcedc18277dc730931b5b1e6e1d927c2a8b7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 27 Sep 2018 14:49:31 +0200 Subject: [PATCH 87/98] replace the phone icon with a dialpad for getting to the dialpad --- .../contacts/activities/MainActivity.kt | 2 +- app/src/main/res/drawable-hdpi/ic_dialpad.png | Bin 0 -> 186 bytes app/src/main/res/drawable-xhdpi/ic_dialpad.png | Bin 0 -> 184 bytes app/src/main/res/drawable-xxhdpi/ic_dialpad.png | Bin 0 -> 250 bytes app/src/main/res/drawable-xxxhdpi/ic_dialpad.png | Bin 0 -> 336 bytes app/src/main/res/layout/activity_main.xml | 4 ++-- 6 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_dialpad.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_dialpad.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_dialpad.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_dialpad.png diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt index 17b430e7..5f7f05c3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt @@ -165,7 +165,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } isFirstResume = false - val blackIcon = resources.getColoredDrawableWithColor(R.drawable.ic_phone_big, if (isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) + val blackIcon = resources.getColoredDrawableWithColor(R.drawable.ic_dialpad, if (isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) main_dialpad_button.setImageDrawable(blackIcon) main_dialpad_button.background.applyColorFilter(getAdjustedPrimaryColor()) } diff --git a/app/src/main/res/drawable-hdpi/ic_dialpad.png b/app/src/main/res/drawable-hdpi/ic_dialpad.png new file mode 100644 index 0000000000000000000000000000000000000000..f600b5b7b6127d857438cfdd785ae9b7eef67579 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB8a-VcLn;{GUfC#k$U%U`ancVB zhf2?tT%R5oPq@kQ;hbf($kDB~-|p0Lv6a1%Xk5l8t;V3X%^|pX`Bm);R~~HI#pKKD zx7rxU>@#OjlLIPXX6Ne(xm?v_drU65-*D+yiE1$O^cmyzc6;~yve~}?M1A@6>hkH| cr(f1GI2tv)`}8;S0?;uGp00i_>zopr0DIs|u>b%7 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_dialpad.png b/app/src/main/res/drawable-xhdpi/ic_dialpad.png new file mode 100644 index 0000000000000000000000000000000000000000..793da560dce610bb80c1e7dddcf0009798352967 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}b0DdQTU}kP61PR~XqE97J3%ZWHi& zyKh@SRFLp0(>n(Y4t#GhxyNX8;Q9S!ZaiyZV%G3{l3T1iQFhBOxr9X~ud5p-Ut0N| zvCM1tp8EPl^IWFA_+oqH#Idty5B*3p-+n^3sQZpmF%WM*k(E8gFJp>dy~ErK8gnnK isGsYR(Rc1_C4=og+vmm>d0T-_VeoYIb6Mw<&;$Sx5lmPB literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_dialpad.png b/app/src/main/res/drawable-xxhdpi/ic_dialpad.png new file mode 100644 index 0000000000000000000000000000000000000000..1f6bf85670e14c3918c760388708570d1c2ca252 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhaw4tlychEy=Vy=KVO>>$DVFypc0 zqmPp=6(3V!7tlWFJfrGTSI*`SToZr3y8iZ%{dR9bS!QkqZsyp!;8ttnYUA3f;Knv_ z_xxFJmND^r&AaK#YB!~3^K7m^8aFr1=E|9pv+^wKyf-EDccnhbSkjyO>Z0*R^NY{T zzb;Q^O-NnPoy(*W*(0|2Xog`Fh|)Njv_(SKt@|Q~I+i_Q&8Z0~p=~Owja14ToQpbz vCapd-AtLlw%JN@V8l`-^t|!bhU15K{sP#eil2=cGo?-BG^>bP0l+XkK2Fqyc literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_dialpad.png b/app/src/main/res/drawable-xxxhdpi/ic_dialpad.png new file mode 100644 index 0000000000000000000000000000000000000000..7754a7c9942de820f386531f3cc2b2062b98d8fc GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD0wg^q?%&M7z$otN;uuoF_~zP1-ew0Lw}&Mr z+nJUmy3AlSbdq3l<4`V`t*}HxbdQOql4`o^rXQ<+zY34qrXM-&Z~LTaGpA0SIW6eE zwZIIEA0-BYDtqNwC&nwaF8H3TkQ(rn@5-AcZ?4R`*U0C+{H1Kf1{dG=2ZT>MU$)+m zc+>CwXO6ECRgUiuUyUiAy5RdGw^Ir){%S<@1na-J%h3~m{+frtx4ICM_vPRHoWEur z=gS4USfK6if75WC8Gg!vweM9uA34Qza2G1-9ckSmAP(htPC~HZ5+0M5+?)7I$^F%9 z*_G?dm+S*_s(>891wc-H + android:padding="@dimen/activity_margin" + android:src="@drawable/ic_dialpad"/> From d024bc7551a582256e739eaebf840d4834e8a7c6 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 27 Sep 2018 15:09:01 +0200 Subject: [PATCH 88/98] add a Call button at the dialpad activity --- .../contacts/activities/DialpadActivity.kt | 16 +++++++++++++ app/src/main/res/layout/activity_dialpad.xml | 24 +++++++++++++------ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index b21abeeb..251e1001 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -13,9 +13,11 @@ import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.helpers.isLollipopPlus import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.adapters.ContactsAdapter +import com.simplemobiletools.contacts.dialogs.CallConfirmationDialog import com.simplemobiletools.contacts.extensions.afterTextChanged import com.simplemobiletools.contacts.extensions.callContact import com.simplemobiletools.contacts.extensions.config +import com.simplemobiletools.contacts.extensions.startCallIntent import com.simplemobiletools.contacts.helpers.ContactsHelper import com.simplemobiletools.contacts.helpers.KEY_PHONE import com.simplemobiletools.contacts.helpers.LOCATION_DIALPAD @@ -42,6 +44,7 @@ class DialpadActivity : SimpleActivity() { dialpad_hashtag.setOnClickListener { dialpadPressed("#", it) } dialpad_clear_char.setOnClickListener { clearChar(it) } dialpad_clear_char.setOnLongClickListener { clearInput(); true } + dialpad_call_button.setOnClickListener { initCall() } dialpad_input.afterTextChanged { dialpadValueChanged(it) } ContactsHelper(this).getContacts { gotContacts(it) } disableKeyboardPopping() @@ -143,4 +146,17 @@ class DialpadActivity : SimpleActivity() { dialpad_fastscroller.updateBubbleText(item?.getBubbleText() ?: "") } } + + private fun initCall() { + val number = dialpad_input.value + if (number.isNotEmpty()) { + if (config.showCallConfirmation) { + CallConfirmationDialog(this, number) { + startCallIntent(number) + } + } else { + startCallIntent(number) + } + } + } } diff --git a/app/src/main/res/layout/activity_dialpad.xml b/app/src/main/res/layout/activity_dialpad.xml index acae2500..175b22f5 100644 --- a/app/src/main/res/layout/activity_dialpad.xml +++ b/app/src/main/res/layout/activity_dialpad.xml @@ -2,12 +2,10 @@ + app:layout_constraintStart_toStartOf="parent"/> @@ -205,9 +202,22 @@ android:layout_height="wrap_content" android:layout_marginRight="@dimen/activity_margin" android:text="#" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintBottom_toTopOf="@+id/dialpad_call_button" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/dialpad_0"/> + + From 0ebe7bb286997cae3e42cc06fd525fbc7dc7f6b1 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 27 Sep 2018 15:18:23 +0200 Subject: [PATCH 89/98] treat long pressing the Zero at dialpad as Plus --- .../contacts/activities/DialpadActivity.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index 251e1001..233e02c8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -40,6 +40,7 @@ class DialpadActivity : SimpleActivity() { dialpad_7.setOnClickListener { dialpadPressed("7", it) } dialpad_8.setOnClickListener { dialpadPressed("8", it) } dialpad_9.setOnClickListener { dialpadPressed("9", it) } + dialpad_0.setOnLongClickListener { dialpadPressed("+", null); true } dialpad_asterisk.setOnClickListener { dialpadPressed("*", it) } dialpad_hashtag.setOnClickListener { dialpadPressed("#", it) } dialpad_clear_char.setOnClickListener { clearChar(it) } @@ -82,9 +83,9 @@ class DialpadActivity : SimpleActivity() { } } - private fun dialpadPressed(char: String, view: View) { + private fun dialpadPressed(char: String, view: View?) { dialpad_input.dispatchKeyEvent(getKeyEvent(getCharKeyCode(char))) - view.performHapticFeedback() + view?.performHapticFeedback() } private fun clearChar(view: View) { @@ -110,6 +111,7 @@ class DialpadActivity : SimpleActivity() { "8" -> KeyEvent.KEYCODE_8 "9" -> KeyEvent.KEYCODE_9 "*" -> KeyEvent.KEYCODE_STAR + "+" -> KeyEvent.KEYCODE_PLUS else -> KeyEvent.KEYCODE_POUND } From 446db13091946db437696a44013244743d9a4227 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 28 Sep 2018 11:57:57 +0200 Subject: [PATCH 90/98] allow some other chars except digits at the regex replacing --- .../kotlin/com/simplemobiletools/contacts/helpers/Constants.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt index 936744bc..58309511 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -21,7 +21,7 @@ const val SMT_PRIVATE = "smt_private" // used at the contact source of local c const val IS_PRIVATE = "is_private" const val GROUP = "group" const val FIRST_GROUP_ID = 10000 -const val PHONE_NUMBER_PATTERN = "\\D+" +const val PHONE_NUMBER_PATTERN = "[^0-9#*+]" const val IS_FROM_SIMPLE_CONTACTS = "is_from_simple_contacts" const val ADD_NEW_CONTACT_NUMBER = "add_new_contact_number" From 27e1366339b4fb89e6074c8af7c9daba7a31f442 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 28 Sep 2018 12:02:04 +0200 Subject: [PATCH 91/98] adding a helper extension for filtering phone numbers --- .../com/simplemobiletools/contacts/extensions/String.kt | 3 +++ .../contacts/fragments/RecentsFragment.kt | 6 +++--- .../simplemobiletools/contacts/helpers/ContactsHelper.kt | 2 +- .../com/simplemobiletools/contacts/helpers/DBHelper.kt | 3 ++- .../com/simplemobiletools/contacts/models/Contact.kt | 8 ++++---- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/String.kt index 6134b1ad..f6d41a2b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/String.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/String.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.contacts.extensions import android.widget.TextView import com.simplemobiletools.commons.helpers.getDateFormats +import com.simplemobiletools.contacts.helpers.PHONE_NUMBER_PATTERN import org.joda.time.DateTime import org.joda.time.format.DateTimeFormat import java.text.DateFormat @@ -32,3 +33,5 @@ fun String.getDateTimeFromDateString(viewToUpdate: TextView? = null): DateTime { } return date } + +fun String.applyRegexFiltering() = replace(PHONE_NUMBER_PATTERN.toRegex(), "") diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/RecentsFragment.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/RecentsFragment.kt index c1319997..d4b30ab9 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/RecentsFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/fragments/RecentsFragment.kt @@ -10,10 +10,10 @@ import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALL_LOG import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CALL_LOG import com.simplemobiletools.contacts.activities.EditContactActivity import com.simplemobiletools.contacts.adapters.RecentCallsAdapter +import com.simplemobiletools.contacts.extensions.applyRegexFiltering import com.simplemobiletools.contacts.extensions.contactClicked import com.simplemobiletools.contacts.helpers.IS_FROM_SIMPLE_CONTACTS import com.simplemobiletools.contacts.helpers.KEY_PHONE -import com.simplemobiletools.contacts.helpers.PHONE_NUMBER_PATTERN import com.simplemobiletools.contacts.helpers.RECENTS_TAB_MASK import com.simplemobiletools.contacts.models.Contact import com.simplemobiletools.contacts.models.RecentCall @@ -44,10 +44,10 @@ class RecentsFragment(context: Context, attributeSet: AttributeSet) : MyViewPage val currAdapter = fragment_list.adapter if (currAdapter == null) { RecentCallsAdapter(activity!!, recentCalls, activity, fragment_list, fragment_fastscroller) { - val recentCall = (it as RecentCall).number.replace(PHONE_NUMBER_PATTERN.toRegex(), "") + val recentCall = (it as RecentCall).number.applyRegexFiltering() var selectedContact: Contact? = null for (contact in allContacts) { - if (contact.phoneNumbers.any { it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), "") == recentCall }) { + if (contact.phoneNumbers.any { it.value.applyRegexFiltering() == recentCall }) { selectedContact = contact break } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt index 090c2a07..88e3b7d7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -166,7 +166,7 @@ class ContactsHelper(val activity: Activity) { if (filterDuplicates) { // remove all spaces, dashes etc from numbers for easier comparing, used only at list views numbers.forEach { - numbers.mapTo(contacts[key].cleanPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } + numbers.mapTo(contacts[key].cleanPhoneNumbers) { PhoneNumber(it.value.applyRegexFiltering(), 0, "") } } } } diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt index 508a4c80..b73283c6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -16,6 +16,7 @@ import com.simplemobiletools.commons.extensions.getBlobValue import com.simplemobiletools.commons.extensions.getIntValue import com.simplemobiletools.commons.extensions.getLongValue import com.simplemobiletools.commons.extensions.getStringValue +import com.simplemobiletools.contacts.extensions.applyRegexFiltering import com.simplemobiletools.contacts.extensions.config import com.simplemobiletools.contacts.extensions.getByteArray import com.simplemobiletools.contacts.extensions.getPhotoThumbnailSize @@ -349,7 +350,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont val cleanPhoneNumbers = ArrayList() if (filterDuplicates) { - phoneNumbers.mapTo(cleanPhoneNumbers) { PhoneNumber(it.value.replace(PHONE_NUMBER_PATTERN.toRegex(), ""), 0, "") } + phoneNumbers.mapTo(cleanPhoneNumbers) { PhoneNumber(it.value.applyRegexFiltering(), 0, "") } } val contact = Contact(id, prefix, firstName, middleName, surname, suffix, nickname, "", phoneNumbers, emails, addresses, diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt index e44dbd8a..c710d572 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/models/Contact.kt @@ -5,7 +5,7 @@ import com.simplemobiletools.commons.extensions.normalizeString import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME import com.simplemobiletools.commons.helpers.SORT_DESCENDING -import com.simplemobiletools.contacts.helpers.PHONE_NUMBER_PATTERN +import com.simplemobiletools.contacts.extensions.applyRegexFiltering data class Contact(val id: Int, var prefix: String, var firstName: String, var middleName: String, var surname: String, var suffix: String, var nickname: String, var photoUri: String, var phoneNumbers: ArrayList, var emails: ArrayList, var addresses: ArrayList
, @@ -114,9 +114,9 @@ data class Contact(val id: Int, var prefix: String, var firstName: String, var m } } - val numericOnly = text.replace(PHONE_NUMBER_PATTERN.toRegex(), "") - if (numericOnly.isNotEmpty()) { - if (phoneNumbers.any { it.value.contains(numericOnly) } || cleanPhoneNumbers.any { it.value.contains(numericOnly) }) { + val filteredNumber = text.applyRegexFiltering() + if (filteredNumber.isNotEmpty()) { + if (phoneNumbers.any { it.value.contains(filteredNumber) } || cleanPhoneNumbers.any { it.value.contains(filteredNumber) }) { return true } } From 877fe454fa006fcc2ef55463758bc3eda5406d56 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 28 Sep 2018 12:56:00 +0200 Subject: [PATCH 92/98] add a Plus sign to 0 at the dialpad --- .../contacts/activities/DialpadActivity.kt | 4 +- app/src/main/res/layout/activity_dialpad.xml | 39 +++++++++++++++---- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index 233e02c8..c90ae103 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -30,7 +30,7 @@ class DialpadActivity : SimpleActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_dialpad) - dialpad_0.setOnClickListener { dialpadPressed("0", it) } + dialpad_0_holder.setOnClickListener { dialpadPressed("0", it) } dialpad_1.setOnClickListener { dialpadPressed("1", it) } dialpad_2.setOnClickListener { dialpadPressed("2", it) } dialpad_3.setOnClickListener { dialpadPressed("3", it) } @@ -40,7 +40,7 @@ class DialpadActivity : SimpleActivity() { dialpad_7.setOnClickListener { dialpadPressed("7", it) } dialpad_8.setOnClickListener { dialpadPressed("8", it) } dialpad_9.setOnClickListener { dialpadPressed("9", it) } - dialpad_0.setOnLongClickListener { dialpadPressed("+", null); true } + dialpad_0_holder.setOnLongClickListener { dialpadPressed("+", null); true } dialpad_asterisk.setOnClickListener { dialpadPressed("*", it) } dialpad_hashtag.setOnClickListener { dialpadPressed("#", it) } dialpad_clear_char.setOnClickListener { clearChar(it) } diff --git a/app/src/main/res/layout/activity_dialpad.xml b/app/src/main/res/layout/activity_dialpad.xml index 175b22f5..6378918f 100644 --- a/app/src/main/res/layout/activity_dialpad.xml +++ b/app/src/main/res/layout/activity_dialpad.xml @@ -155,7 +155,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:text="8" - app:layout_constraintBottom_toTopOf="@+id/dialpad_0" + app:layout_constraintBottom_toTopOf="@+id/dialpad_0_holder" app:layout_constraintEnd_toStartOf="@+id/dialpad_9" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/dialpad_7"/> @@ -180,20 +180,43 @@ android:layout_marginLeft="@dimen/activity_margin" android:text="*" app:layout_constraintBottom_toTopOf="@+id/dialpad_call_button" - app:layout_constraintEnd_toStartOf="@+id/dialpad_0" + app:layout_constraintEnd_toStartOf="@+id/dialpad_0_holder" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent"/> - + app:layout_constraintStart_toEndOf="@+id/dialpad_asterisk"> + + + + + + + app:layout_constraintStart_toEndOf="@+id/dialpad_0_holder"/> Date: Fri, 28 Sep 2018 12:59:36 +0200 Subject: [PATCH 93/98] make sure the dialpad Call button is properly colored --- .../simplemobiletools/contacts/activities/DialpadActivity.kt | 5 +++++ .../simplemobiletools/contacts/activities/MainActivity.kt | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt index c90ae103..11a45b07 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/DialpadActivity.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.contacts.activities import android.annotation.TargetApi import android.content.Intent +import android.graphics.Color import android.os.Build import android.os.Bundle import android.text.InputType @@ -49,6 +50,10 @@ class DialpadActivity : SimpleActivity() { dialpad_input.afterTextChanged { dialpadValueChanged(it) } ContactsHelper(this).getContacts { gotContacts(it) } disableKeyboardPopping() + + val callIcon = resources.getColoredDrawableWithColor(R.drawable.ic_phone_big, if (isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) + dialpad_call_button.setImageDrawable(callIcon) + dialpad_call_button.background.applyColorFilter(getAdjustedPrimaryColor()) } override fun onResume() { diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt index 5f7f05c3..c98e60b1 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt @@ -165,8 +165,8 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { } isFirstResume = false - val blackIcon = resources.getColoredDrawableWithColor(R.drawable.ic_dialpad, if (isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) - main_dialpad_button.setImageDrawable(blackIcon) + val dialpadIcon = resources.getColoredDrawableWithColor(R.drawable.ic_dialpad, if (isBlackAndWhiteTheme()) Color.BLACK else Color.WHITE) + main_dialpad_button.setImageDrawable(dialpadIcon) main_dialpad_button.background.applyColorFilter(getAdjustedPrimaryColor()) } From c17e7ff47e84316f36aed305d62fcb0e532020ea Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 28 Sep 2018 14:42:15 +0200 Subject: [PATCH 94/98] do not allow creating contacts under Signal or Telegram accounts --- .../com/simplemobiletools/contacts/extensions/Activity.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt index b2adcb75..a61b26f2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt @@ -62,8 +62,13 @@ fun SimpleActivity.startCall(contact: Contact) { fun SimpleActivity.showContactSourcePicker(currentSource: String, callback: (newSource: String) -> Unit) { ContactsHelper(this).getContactSources { + val ignoredTypes = arrayListOf( + "org.thoughtcrime.securesms", // Signal + "org.telegram.messenger" // Telegram + ) + val items = ArrayList() - val sources = it.map { it.name } + val sources = it.filter { !ignoredTypes.contains(it.type) }.map { it.name } var currentSourceIndex = -1 sources.forEachIndexed { index, account -> var publicAccount = account From c1ba8b0d1367b7f57898f9d9c1c1f4a987c533a0 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 28 Sep 2018 15:13:11 +0200 Subject: [PATCH 95/98] update commons to 4.8.0 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 5f97607f..19b7c0ac 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -41,7 +41,7 @@ android { } dependencies { - implementation 'com.simplemobiletools:commons:4.7.17' + implementation 'com.simplemobiletools:commons:4.8.0' implementation 'joda-time:joda-time:2.9.9' implementation 'com.facebook.stetho:stetho:1.5.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' From 98e527eba8de1f80f61fa89b383146715a95cc44 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 28 Sep 2018 20:19:53 +0200 Subject: [PATCH 96/98] adding dialpad into release notes --- .../com/simplemobiletools/contacts/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/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt index c98e60b1..0cb2281b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt @@ -550,6 +550,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { add(Release(27, R.string.release_27)) add(Release(29, R.string.release_29)) add(Release(31, R.string.release_31)) + add(Release(32, R.string.release_32)) checkWhatsNew(this, BuildConfig.VERSION_CODE) } } diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index 59a112ff..c3d9f092 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -12,6 +12,7 @@ Jabber + Added a simple dialpad, dialer will come soon Added an optional IM field\n Added support for custom phone number/email/address types From c0e1ad84db26ec5967ad0041c0386efefd6efaa8 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 28 Sep 2018 20:21:35 +0200 Subject: [PATCH 97/98] update version to 4.5.0 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 19b7c0ac..63ebf515 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.simplemobiletools.contacts" minSdkVersion 16 targetSdkVersion 28 - versionCode 31 - versionName "4.4.0" + versionCode 32 + versionName "4.5.0" setProperty("archivesBaseName", "contacts") } From bc6f5aeee5e70ab89d709e8e7c9c757da97217a7 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 28 Sep 2018 20:21:41 +0200 Subject: [PATCH 98/98] updating changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6beac38..ae86dd8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,15 @@ Changelog ========== +Version 4.5.0 *(2018-09-28)* +---------------------------- + + * Added a simple dialpad + * Do not allow creating contacts under Signal or Telegram contact source + * Allow copying phone numbers into clipboard by long pressing them on the View screen + * Properly handle intents adding numbers to existing contacts + * Many other smaller improvements and bugfixes + Version 4.4.0 *(2018-09-04)* ----------------------------