From 97bd5dacefdc0f4a5f16d454ab6e832db83d4f36 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Apr 2018 13:46:31 +0200 Subject: [PATCH 01/33] add websites to the Edit screen too --- .../activities/EditContactActivity.kt | 40 ++++++++++++++++-- .../main/res/layout/activity_edit_contact.xml | 42 ++++++++++++++++++- app/src/main/res/layout/item_edit_website.xml | 21 ++++++++++ 3 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/layout/item_edit_website.xml 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 6ba8d2f0..4f34e043 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -29,6 +29,7 @@ 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_phone_number.view.* +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 @@ -179,9 +180,10 @@ class EditContactActivity : ContactActivity() { contact_addresses_image.applyColorFilter(textColor) contact_events_image.applyColorFilter(textColor) contact_notes_image.applyColorFilter(textColor) - contact_source_image.applyColorFilter(textColor) - contact_groups_image.applyColorFilter(textColor) contact_organization_image.applyColorFilter(textColor) + contact_websites_image.applyColorFilter(textColor) + contact_groups_image.applyColorFilter(textColor) + contact_source_image.applyColorFilter(textColor) val adjustedPrimaryColor = getAdjustedPrimaryColor() contact_numbers_add_new.applyColorFilter(adjustedPrimaryColor) @@ -192,6 +194,8 @@ class EditContactActivity : ContactActivity() { contact_addresses_add_new.background.applyColorFilter(textColor) contact_events_add_new.applyColorFilter(adjustedPrimaryColor) contact_events_add_new.background.applyColorFilter(textColor) + contact_websites_add_new.applyColorFilter(adjustedPrimaryColor) + contact_websites_add_new.background.applyColorFilter(textColor) contact_groups_add_new.applyColorFilter(adjustedPrimaryColor) contact_groups_add_new.background.applyColorFilter(textColor) @@ -204,6 +208,7 @@ class EditContactActivity : ContactActivity() { contact_emails_add_new.setOnClickListener { addNewEmailField() } contact_addresses_add_new.setOnClickListener { addNewAddressField() } contact_events_add_new.setOnClickListener { addNewEventField() } + contact_websites_add_new.setOnClickListener { addNewWebsiteField() } contact_groups_add_new.setOnClickListener { showSelectGroupsDialog() } setupFieldVisibility() @@ -285,6 +290,11 @@ class EditContactActivity : ContactActivity() { contact_events_holder.beVisibleIf(areEventsVisible) contact_events_add_new.beVisibleIf(areEventsVisible) + val areWebsitesVisible = showFields and SHOW_WEBSITES_FIELD != 0 + contact_websites_image.beVisibleIf(areWebsitesVisible) + contact_websites_holder.beVisibleIf(areWebsitesVisible) + contact_websites_add_new.beVisibleIf(areWebsitesVisible) + val areGroupsVisible = showFields and SHOW_GROUPS_FIELD != 0 contact_groups_image.beVisibleIf(areGroupsVisible) contact_groups_holder.beVisibleIf(areGroupsVisible) @@ -311,6 +321,7 @@ class EditContactActivity : ContactActivity() { setupAddresses() setupNotes() setupOrganization() + setupWebsites() setupEvents() setupGroups() } @@ -379,6 +390,20 @@ class EditContactActivity : ContactActivity() { } } + private fun setupWebsites() { + if (showFields and SHOW_WEBSITES_FIELD != 0) { + contact!!.websites.forEachIndexed { index, website -> + var websitesHolder = contact_websites_holder.getChildAt(index) + if (websitesHolder == null) { + websitesHolder = layoutInflater.inflate(R.layout.item_edit_website, contact_websites_holder, false) + contact_websites_holder.addView(websitesHolder) + } + + websitesHolder!!.contact_website.setText(website) + } + } + } + private fun setupEvents() { if (showFields and SHOW_EVENTS_FIELD != 0) { contact!!.events.forEachIndexed { index, event -> @@ -463,7 +488,6 @@ class EditContactActivity : ContactActivity() { } private fun setupNewContact() { - //window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) supportActionBar?.title = resources.getString(R.string.new_contact) val contactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE val organization = Organization("", "") @@ -844,6 +868,16 @@ class EditContactActivity : ContactActivity() { } } + private fun addNewWebsiteField() { + val websitesHolder = layoutInflater.inflate(R.layout.item_edit_website, contact_websites_holder, false) as ViewGroup + updateTextColors(websitesHolder) + contact_websites_holder.addView(websitesHolder) + contact_websites_holder.onGlobalLayout { + websitesHolder.contact_website.requestFocus() + showKeyboard(websitesHolder.contact_website) + } + } + private fun isContactStarred() = contact_toggle_favorite.tag == 1 private fun getStarDrawable(on: Boolean) = resources.getDrawable(if (on) R.drawable.ic_star_on_big else R.drawable.ic_star_off_big) diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml index 68f6ac87..9cfce75f 100644 --- a/app/src/main/res/layout/activity_edit_contact.xml +++ b/app/src/main/res/layout/activity_edit_contact.xml @@ -200,9 +200,9 @@ android:layout_height="wrap_content" android:layout_below="@+id/contact_numbers_holder" android:layout_centerHorizontal="true" + android:layout_marginBottom="@dimen/medium_margin" android:background="@drawable/button_background" android:paddingBottom="@dimen/medium_margin" - android:layout_marginBottom="@dimen/medium_margin" android:paddingLeft="@dimen/activity_margin" android:paddingRight="@dimen/activity_margin" android:paddingTop="@dimen/medium_margin" @@ -386,6 +386,44 @@ android:textCursorDrawable="@null" android:textSize="@dimen/bigger_text_size"/> + + + + + + + + + + diff --git a/app/src/main/res/layout/item_edit_website.xml b/app/src/main/res/layout/item_edit_website.xml new file mode 100644 index 00000000..8eda6c0c --- /dev/null +++ b/app/src/main/res/layout/item_edit_website.xml @@ -0,0 +1,21 @@ + + + + + + From 4962a955e5c277049ad5b9a1d0da56c742251390 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Apr 2018 14:23:35 +0200 Subject: [PATCH 02/33] handle website at contact update/insert --- .../activities/EditContactActivity.kt | 14 +++++++++ .../contacts/helpers/ContactsHelper.kt | 30 +++++++++++++++++++ 2 files changed, 44 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 4f34e043..ecd5813a 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -710,6 +710,7 @@ class EditContactActivity : ContactActivity() { source = contact!!.source starred = if (isContactStarred()) 1 else 0 notes = contact_notes.value + websites = getFilledWebsites() val company = contact_organization_company.value val jobPosition = contact_organization_job_position.value @@ -788,6 +789,19 @@ class EditContactActivity : ContactActivity() { return events } + private fun getFilledWebsites(): ArrayList { + val websites = ArrayList() + val websitesCount = contact_websites_holder.childCount + for (i in 0 until websitesCount) { + val websiteHolder = contact_websites_holder.getChildAt(i) + val website = websiteHolder.contact_website.value + if (website.isNotEmpty()) { + websites.add(website) + } + } + return websites + } + private fun insertNewContact() { isSaving = true toast(R.string.inserting) 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 8804a680..b88454ed 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -845,6 +845,25 @@ class ContactsHelper(val activity: BaseSimpleActivity) { operations.add(build()) } + // delete websites + 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.Website.CONTENT_ITEM_TYPE) + withSelection(selection, selectionArgs) + operations.add(build()) + } + + // add websites + contact.websites.forEach { + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { + withValue(ContactsContract.Data.RAW_CONTACT_ID, contact.id) + withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Website.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Website.URL, it) + withValue(CommonDataKinds.Website.TYPE, CommonDataKinds.Website.TYPE_HOMEPAGE) + operations.add(build()) + } + } + // delete groups val relevantGroupIDs = getStoredGroups().map { it.id } if (relevantGroupIDs.isNotEmpty()) { @@ -1051,6 +1070,17 @@ class ContactsHelper(val activity: BaseSimpleActivity) { operations.add(build()) } + // websites + contact.websites.forEach { + ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { + withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Website.CONTENT_ITEM_TYPE) + withValue(CommonDataKinds.Website.URL, it) + withValue(CommonDataKinds.Website.TYPE, CommonDataKinds.Website.TYPE_HOMEPAGE) + operations.add(build()) + } + } + // groups contact.groups.forEach { ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply { From cf15832dcee2e7a00103bf7136d7add962ae6989 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Apr 2018 14:38:52 +0200 Subject: [PATCH 03/33] add Website handling to the local database --- .../contacts/helpers/DBHelper.kt | 18 ++++++++++++++---- 1 file changed, 14 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 d0fe214e..c082d6bf 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/DBHelper.kt @@ -38,6 +38,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont private val COL_COMPANY = "company" private val COL_JOB_POSITION = "job_position" private val COL_GROUPS = "groups" + private val COL_WEBSITES = "websites" private val GROUPS_TABLE_NAME = "groups" private val COL_TITLE = "title" @@ -47,7 +48,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont private val mDb = writableDatabase companion object { - private const val DB_VERSION = 4 + private const val DB_VERSION = 5 const val DB_NAME = "contacts.db" var dbInstance: DBHelper? = null var gson = Gson() @@ -63,7 +64,8 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont override fun onCreate(db: SQLiteDatabase) { db.execSQL("CREATE TABLE $CONTACTS_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_FIRST_NAME TEXT, $COL_MIDDLE_NAME TEXT, " + "$COL_SURNAME TEXT, $COL_PHOTO BLOB, $COL_PHONE_NUMBERS TEXT, $COL_EMAILS TEXT, $COL_EVENTS TEXT, $COL_STARRED INTEGER, " + - "$COL_ADDRESSES TEXT, $COL_NOTES TEXT, $COL_GROUPS TEXT, $COL_PREFIX TEXT, $COL_SUFFIX TEXT, $COL_COMPANY TEXT, $COL_JOB_POSITION TEXT)") + "$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)") // 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)") @@ -88,6 +90,10 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_COMPANY TEXT DEFAULT ''") db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_JOB_POSITION TEXT DEFAULT ''") } + + if (oldVersion < 5) { + db.execSQL("ALTER TABLE $CONTACTS_TABLE_NAME ADD COLUMN $COL_WEBSITES TEXT DEFAULT ''") + } } private fun createGroupsTable(db: SQLiteDatabase) { @@ -134,6 +140,7 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont put(COL_GROUPS, gson.toJson(contact.groups.map { it.id })) put(COL_COMPANY, contact.organization.company) put(COL_JOB_POSITION, contact.organization.jobPosition) + put(COL_WEBSITES, gson.toJson(contact.websites)) if (contact.photoUri.isNotEmpty()) { put(COL_PHOTO, getPhotoByteArray(contact.photoUri)) @@ -242,13 +249,14 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont val storedGroups = ContactsHelper(activity).getStoredGroups() val contacts = ArrayList() val projection = arrayOf(COL_ID, COL_PREFIX, COL_FIRST_NAME, COL_MIDDLE_NAME, COL_SURNAME, COL_SUFFIX, COL_PHONE_NUMBERS, COL_EMAILS, - COL_EVENTS, COL_STARRED, COL_PHOTO, COL_ADDRESSES, COL_NOTES, COL_GROUPS, COL_COMPANY, COL_JOB_POSITION) + COL_EVENTS, COL_STARRED, COL_PHOTO, COL_ADDRESSES, 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 eventsToken = object : TypeToken>() {}.type val groupIdsToken = object : TypeToken>() {}.type + val websitesToken = object : TypeToken>() {}.type val cursor = mDb.query(CONTACTS_TABLE_NAME, projection, selection, selectionArgs, null, null, null) cursor.use { @@ -295,7 +303,9 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont val jobPosition = cursor.getStringValue(COL_JOB_POSITION) val organization = Organization(company, jobPosition) - val websites = ArrayList() + val websitesJson = cursor.getStringValue(COL_WEBSITES) + val websites = if (websitesJson == "[]") ArrayList() else gson.fromJson>(websitesJson, websitesToken) + ?: ArrayList(1) val contact = Contact(id, prefix, firstName, middleName, surname, suffix, "", phoneNumbers, emails, addresses, events, SMT_PRIVATE, starred, id, "", photo, notes, groups, organization, websites) From b7d7eb5e8a9baa13663d7bd934f064d44bbd3e8c Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Apr 2018 14:53:19 +0200 Subject: [PATCH 04/33] handle contact website import/export --- .../com/simplemobiletools/contacts/helpers/Constants.kt | 1 + .../com/simplemobiletools/contacts/helpers/VcfExporter.kt | 4 ++++ .../com/simplemobiletools/contacts/helpers/VcfImporter.kt | 5 +++++ 3 files changed, 10 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 03e65cbe..670aedad 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -46,6 +46,7 @@ const val ADR = "ADR" const val NOTE = "NOTE:" const val ORG = "ORG:" const val TITLE = "TITLE:" +const val URL = "URL:" const val ENCODING = "ENCODING" const val BASE64 = "BASE64" const val JPEG = "JPEG" diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt index 80e503eb..bd573b75 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt @@ -71,6 +71,10 @@ class VcfExporter { out.writeLn("$TITLE${contact.organization.jobPosition.replace("\n", "\\n")}") } + contact.websites.forEach { + out.writeLn("$URL$it") + } + if (contact.thumbnailUri.isNotEmpty()) { val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, Uri.parse(contact.thumbnailUri)) addBitmap(bitmap, out) 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 c1938d19..f1c45102 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -91,6 +91,7 @@ class VcfImporter(val activity: SimpleActivity) { line.toUpperCase().startsWith(PHOTO) -> addPhoto(line.substring(PHOTO.length)) line.toUpperCase().startsWith(ORG) -> addCompany(line.substring(ORG.length)) line.toUpperCase().startsWith(TITLE) -> addJobPosition(line.substring(TITLE.length)) + line.toUpperCase().startsWith(URL) -> addWebsite(line.substring(URL.length)) line.toUpperCase() == END_VCARD -> saveContact(targetContactSource) isGettingPhoto -> currentPhotoString.append(line.trim()) } @@ -251,6 +252,10 @@ class VcfImporter(val activity: SimpleActivity) { curJobPosition = jobPosition } + private fun addWebsite(website: String) { + curWebsites.add(website) + } + private fun saveContact(source: String) { val organization = Organization(curCompany, curJobPosition) val contact = Contact(0, curPrefix, curFirstName, curMiddleName, curSurname, curSuffix, curPhotoUri, curPhoneNumbers, curEmails, curAddresses, curEvents, From de864f362cc5707e5654435dea91f0648dfb8ee6 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Apr 2018 15:01:29 +0200 Subject: [PATCH 05/33] fix exporting contacts on sd cards --- .../contacts/activities/MainActivity.kt | 3 +- .../contacts/extensions/Activity.kt | 2 +- .../contacts/helpers/VcfExporter.kt | 37 ++++++++++--------- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt index 664acf60..22722186 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/MainActivity.kt @@ -374,8 +374,7 @@ class MainActivity : SimpleActivity(), RefreshContactsListener { if (contacts.isEmpty()) { toast(R.string.no_entries_for_exporting) } else { - toast(R.string.exporting) - VcfExporter().exportContacts(this, file, contacts as ArrayList) { + VcfExporter().exportContacts(this, file, contacts as ArrayList, true) { toast(when (it) { VcfExporter.ExportResult.EXPORT_OK -> R.string.exporting_successful VcfExporter.ExportResult.EXPORT_PARTIAL -> R.string.exporting_some_entries_failed 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 71af206e..34b74393 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt @@ -90,7 +90,7 @@ fun BaseSimpleActivity.shareContacts(contacts: ArrayList) { return } - VcfExporter().exportContacts(this, file, contacts) { + VcfExporter().exportContacts(this, file, contacts, false) { if (it == VcfExporter.ExportResult.EXPORT_OK) { sharePathIntent(file.absolutePath, BuildConfig.APPLICATION_ID) } else { 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 bd573b75..91d817d8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt @@ -6,11 +6,9 @@ import android.provider.ContactsContract.CommonDataKinds import android.provider.MediaStore import android.util.Base64 import com.simplemobiletools.commons.activities.BaseSimpleActivity -import com.simplemobiletools.commons.extensions.getFileOutputStream -import com.simplemobiletools.commons.extensions.showErrorToast -import com.simplemobiletools.commons.extensions.toFileDirItem -import com.simplemobiletools.commons.extensions.writeLn -import com.simplemobiletools.contacts.helpers.VcfExporter.ExportResult.* +import com.simplemobiletools.commons.extensions.* +import com.simplemobiletools.contacts.R +import com.simplemobiletools.contacts.helpers.VcfExporter.ExportResult.EXPORT_FAIL import com.simplemobiletools.contacts.models.Contact import java.io.BufferedWriter import java.io.ByteArrayOutputStream @@ -26,14 +24,18 @@ class VcfExporter { private var contactsExported = 0 private var contactsFailed = 0 - fun exportContacts(activity: BaseSimpleActivity, file: File, contacts: ArrayList, callback: (result: ExportResult) -> Unit) { - try { - activity.getFileOutputStream(file.toFileDirItem(activity)) { + fun exportContacts(activity: BaseSimpleActivity, file: File, contacts: ArrayList, showExportingToast: Boolean, callback: (result: ExportResult) -> Unit) { + activity.getFileOutputStream(file.toFileDirItem(activity), true) { + try { if (it == null) { callback(EXPORT_FAIL) return@getFileOutputStream } + if (showExportingToast) { + activity.toast(R.string.exporting) + } + it.bufferedWriter().use { out -> for (contact in contacts) { out.writeLn(BEGIN_VCARD) @@ -88,16 +90,17 @@ class VcfExporter { contactsExported++ } } - } - } catch (e: Exception) { - activity.showErrorToast(e) - } - callback(when { - contactsExported == 0 -> EXPORT_FAIL - contactsFailed > 0 -> EXPORT_PARTIAL - else -> EXPORT_OK - }) + } catch (e: Exception) { + activity.showErrorToast(e) + } + + callback(when { + contactsExported == 0 -> EXPORT_FAIL + contactsFailed > 0 -> ExportResult.EXPORT_PARTIAL + else -> ExportResult.EXPORT_OK + }) + } } private fun addBitmap(bitmap: Bitmap, out: BufferedWriter) { From 1cb0d1b1bde5c974431385544f45d03a18300fac Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Apr 2018 15:25:59 +0200 Subject: [PATCH 06/33] making phone key nullable at Edit screen --- .../contacts/activities/EditContactActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt index ecd5813a..c03d7171 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -149,7 +149,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() ?: "" + val phoneNumber = intent.extras.get(KEY_PHONE)?.toString() ?: "" contact!!.phoneNumbers.add(PhoneNumber(phoneNumber, DEFAULT_PHONE_NUMBER_TYPE)) setupPhoneNumbers() From 401f0aed6ea48081837a88320a6e9369d429615f Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Apr 2018 19:14:47 +0200 Subject: [PATCH 07/33] fix #125, parse a couple more contact details from WhatsApp intent --- .../activities/EditContactActivity.kt | 72 ++++++++++++++++--- 1 file changed, 62 insertions(+), 10 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 c03d7171..ffc236d4 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -2,6 +2,7 @@ package com.simplemobiletools.contacts.activities import android.app.DatePickerDialog import android.content.ClipData +import android.content.ContentValues import android.content.Intent import android.graphics.drawable.ColorDrawable import android.net.Uri @@ -151,10 +152,14 @@ 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)) - setupPhoneNumbers() - val contactFullName = intent.extras.get(KEY_NAME)?.toString() ?: "" - contact_first_name.setText(contactFullName) + contact!!.firstName = intent.extras.get(KEY_NAME)?.toString() ?: "" + + val data = intent.extras.getParcelableArrayList("data") + if (data != null) { + parseIntentData(data) + } + setupEditContact() } setupTypePickers() @@ -308,14 +313,8 @@ class EditContactActivity : ContactActivity() { private fun setupEditContact() { window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN) supportActionBar?.title = resources.getString(R.string.edit_contact) - contact_prefix.setText(contact!!.prefix) - contact_first_name.setText(contact!!.firstName) - contact_middle_name.setText(contact!!.middleName) - contact_surname.setText(contact!!.surname) - contact_suffix.setText(contact!!.suffix) - - contact_source.text = getPublicContactSource(contact!!.source) + setupNames() setupPhoneNumbers() setupEmails() setupAddresses() @@ -324,6 +323,17 @@ class EditContactActivity : ContactActivity() { setupWebsites() setupEvents() setupGroups() + setupContactSource() + } + + private fun setupNames() { + contact!!.apply { + contact_prefix.setText(prefix) + contact_first_name.setText(firstName) + contact_middle_name.setText(middleName) + contact_surname.setText(surname) + contact_suffix.setText(suffix) + } } private fun setupPhoneNumbers() { @@ -487,6 +497,10 @@ class EditContactActivity : ContactActivity() { } } + private fun setupContactSource() { + contact_source.text = getPublicContactSource(contact!!.source) + } + private fun setupNewContact() { supportActionBar?.title = resources.getString(R.string.new_contact) val contactSource = if (hasContactPermissions()) config.lastUsedContactSource else SMT_PRIVATE @@ -915,6 +929,44 @@ class EditContactActivity : ContactActivity() { } } + private fun parseIntentData(data: ArrayList) { + data.forEach { + when (it.get(CommonDataKinds.StructuredName.MIMETYPE)) { + CommonDataKinds.Email.CONTENT_ITEM_TYPE -> parseEmail(it) + CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE -> parseAddress(it) + CommonDataKinds.Organization.CONTENT_ITEM_TYPE -> parseOrganization(it) + CommonDataKinds.Event.CONTENT_ITEM_TYPE -> parseEvent(it) + } + } + } + + 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) + contact!!.emails.add(email) + } + + private fun parseAddress(contentValues: ContentValues) { + val type = contentValues.getAsInteger(CommonDataKinds.StructuredPostal.DATA2) ?: DEFAULT_ADDRESS_TYPE + val addressValue = contentValues.getAsString(CommonDataKinds.StructuredPostal.DATA4) ?: return + val address = Address(addressValue, type) + contact!!.addresses.add(address) + } + + private fun parseOrganization(contentValues: ContentValues) { + val company = contentValues.getAsString(CommonDataKinds.Organization.DATA5) + val jobPosition = contentValues.getAsString(CommonDataKinds.Organization.DATA4) + contact!!.organization = Organization(company, jobPosition) + } + + private fun parseEvent(contentValues: ContentValues) { + val type = contentValues.getAsInteger(CommonDataKinds.Event.DATA2) ?: DEFAULT_EVENT_TYPE + val eventValue = contentValues.getAsString(CommonDataKinds.Event.DATA1) + val event = Event(eventValue, type) + contact!!.events.add(event) + } + private fun startTakePhotoIntent() { val uri = getCachePhotoUri() lastPhotoIntentUri = uri From 25d48ba08c632422f35827c266117cc2e937f04c Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Apr 2018 20:13:04 +0200 Subject: [PATCH 08/33] parse a couple additional fields from WhatsApp Add Contact intent --- .../activities/EditContactActivity.kt | 26 ++++++++++++------- .../contacts/helpers/Constants.kt | 9 +++++++ .../contacts/helpers/ContactsHelper.kt | 12 ++++----- 3 files changed, 32 insertions(+), 15 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 ffc236d4..031f561f 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/EditContactActivity.kt @@ -37,11 +37,6 @@ import org.joda.time.format.DateTimeFormat import java.util.* class EditContactActivity : ContactActivity() { - private val DEFAULT_EMAIL_TYPE = CommonDataKinds.Email.TYPE_HOME - private val DEFAULT_PHONE_NUMBER_TYPE = CommonDataKinds.Phone.TYPE_MOBILE - private val DEFAULT_ADDRESS_TYPE = CommonDataKinds.StructuredPostal.TYPE_HOME - private val DEFAULT_EVENT_TYPE = CommonDataKinds.Event.TYPE_BIRTHDAY - private val INTENT_TAKE_PHOTO = 1 private val INTENT_CHOOSE_PHOTO = 2 private val INTENT_CROP_PHOTO = 3 @@ -936,6 +931,8 @@ class EditContactActivity : ContactActivity() { CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE -> parseAddress(it) CommonDataKinds.Organization.CONTENT_ITEM_TYPE -> parseOrganization(it) CommonDataKinds.Event.CONTENT_ITEM_TYPE -> parseEvent(it) + CommonDataKinds.Website.CONTENT_ITEM_TYPE -> parseWebsite(it) + CommonDataKinds.Note.CONTENT_ITEM_TYPE -> parseNote(it) } } } @@ -949,24 +946,35 @@ class EditContactActivity : ContactActivity() { private fun parseAddress(contentValues: ContentValues) { val type = contentValues.getAsInteger(CommonDataKinds.StructuredPostal.DATA2) ?: DEFAULT_ADDRESS_TYPE - val addressValue = contentValues.getAsString(CommonDataKinds.StructuredPostal.DATA4) ?: return + val addressValue = contentValues.getAsString(CommonDataKinds.StructuredPostal.DATA4) + ?: contentValues.getAsString(CommonDataKinds.StructuredPostal.DATA1) ?: return val address = Address(addressValue, type) contact!!.addresses.add(address) } private fun parseOrganization(contentValues: ContentValues) { - val company = contentValues.getAsString(CommonDataKinds.Organization.DATA5) - val jobPosition = contentValues.getAsString(CommonDataKinds.Organization.DATA4) + val company = contentValues.getAsString(CommonDataKinds.Organization.DATA1) ?: "" + val jobPosition = contentValues.getAsString(CommonDataKinds.Organization.DATA4) ?: "" contact!!.organization = Organization(company, jobPosition) } private fun parseEvent(contentValues: ContentValues) { val type = contentValues.getAsInteger(CommonDataKinds.Event.DATA2) ?: DEFAULT_EVENT_TYPE - val eventValue = contentValues.getAsString(CommonDataKinds.Event.DATA1) + val eventValue = contentValues.getAsString(CommonDataKinds.Event.DATA1) ?: return val event = Event(eventValue, type) contact!!.events.add(event) } + private fun parseWebsite(contentValues: ContentValues) { + val website = contentValues.getAsString(CommonDataKinds.Website.DATA1) ?: return + contact!!.websites.add(website) + } + + private fun parseNote(contentValues: ContentValues) { + val note = contentValues.getAsString(CommonDataKinds.Note.DATA1) ?: return + contact!!.notes = note + } + private fun startTakePhotoIntent() { val uri = getCachePhotoUri() lastPhotoIntentUri = uri 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 670aedad..a4f0b9b7 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/Constants.kt @@ -1,5 +1,7 @@ package com.simplemobiletools.contacts.helpers +import android.provider.ContactsContract.CommonDataKinds + // shared prefs const val SHOW_CONTACT_THUMBNAILS = "show_contact_thumbnails" const val SHOW_PHONE_NUMBERS = "show_phone_numbers" @@ -84,3 +86,10 @@ const val SHOW_ORGANIZATION_FIELD = 1024 const val SHOW_GROUPS_FIELD = 2048 const val SHOW_CONTACT_SOURCE_FIELD = 4096 const val SHOW_WEBSITES_FIELD = 8192 + +const val DEFAULT_EMAIL_TYPE = CommonDataKinds.Email.TYPE_HOME +const val DEFAULT_PHONE_NUMBER_TYPE = CommonDataKinds.Phone.TYPE_MOBILE +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 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 b88454ed..fc09e35d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/ContactsHelper.kt @@ -839,9 +839,9 @@ class ContactsHelper(val activity: BaseSimpleActivity) { val selectionArgs = arrayOf(contact.id.toString(), CommonDataKinds.Organization.CONTENT_ITEM_TYPE) withSelection(selection, selectionArgs) withValue(CommonDataKinds.Organization.COMPANY, contact.organization.company) - withValue(CommonDataKinds.Organization.TYPE, CommonDataKinds.Organization.TYPE_WORK) + withValue(CommonDataKinds.Organization.TYPE, DEFAULT_ORGANIZATION_TYPE) withValue(CommonDataKinds.Organization.TITLE, contact.organization.jobPosition) - withValue(CommonDataKinds.Organization.TYPE, CommonDataKinds.Organization.TYPE_WORK) + withValue(CommonDataKinds.Organization.TYPE, DEFAULT_ORGANIZATION_TYPE) operations.add(build()) } @@ -859,7 +859,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) { withValue(ContactsContract.Data.RAW_CONTACT_ID, contact.id) withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Website.CONTENT_ITEM_TYPE) withValue(CommonDataKinds.Website.URL, it) - withValue(CommonDataKinds.Website.TYPE, CommonDataKinds.Website.TYPE_HOMEPAGE) + withValue(CommonDataKinds.Website.TYPE, DEFAULT_WEBSITE_TYPE) operations.add(build()) } } @@ -1064,9 +1064,9 @@ class ContactsHelper(val activity: BaseSimpleActivity) { withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Organization.CONTENT_ITEM_TYPE) withValue(CommonDataKinds.Organization.COMPANY, contact.organization.company) - withValue(CommonDataKinds.Organization.TYPE, CommonDataKinds.Organization.TYPE_WORK) + withValue(CommonDataKinds.Organization.TYPE, DEFAULT_ORGANIZATION_TYPE) withValue(CommonDataKinds.Organization.TITLE, contact.organization.jobPosition) - withValue(CommonDataKinds.Organization.TYPE, CommonDataKinds.Organization.TYPE_WORK) + withValue(CommonDataKinds.Organization.TYPE, DEFAULT_ORGANIZATION_TYPE) operations.add(build()) } @@ -1076,7 +1076,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) { withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) withValue(ContactsContract.Data.MIMETYPE, CommonDataKinds.Website.CONTENT_ITEM_TYPE) withValue(CommonDataKinds.Website.URL, it) - withValue(CommonDataKinds.Website.TYPE, CommonDataKinds.Website.TYPE_HOMEPAGE) + withValue(CommonDataKinds.Website.TYPE, DEFAULT_WEBSITE_TYPE) operations.add(build()) } } From dd79c7f0872c911eb20fc1dfc3c583cc7537364a Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Apr 2018 20:22:41 +0200 Subject: [PATCH 09/33] update version to 3.5.2 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 140b0da5..53a34e63 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.simplemobiletools.contacts" minSdkVersion 16 targetSdkVersion 27 - versionCode 17 - versionName "3.5.1" + versionCode 18 + versionName "3.5.2" setProperty("archivesBaseName", "contacts") } From 0e7bba9b49317b1aedaf1117d7cc1ce8a93a4ddd Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 13 Apr 2018 20:22:47 +0200 Subject: [PATCH 10/33] updating changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f21ecede..ba680742 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========== +Version 3.5.2 *(2018-04-13)* +---------------------------- + + * Added an optional website field + * Parse more fields from Add Contact third party intents, like the one from WhatsApp + * Fix exporting contacts on SD cards + Version 3.5.1 *(2018-04-10)* ---------------------------- From 9649afac989f286c501b45244db2aa9b9ca96040 Mon Sep 17 00:00:00 2001 From: tibbi Date: Sat, 14 Apr 2018 19:14:04 +0200 Subject: [PATCH 11/33] sort groups on the groups picker alphabetically --- .../simplemobiletools/contacts/dialogs/SelectGroupsDialog.kt | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectGroupsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectGroupsDialog.kt index 66d1344e..f69a34a0 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectGroupsDialog.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/dialogs/SelectGroupsDialog.kt @@ -22,7 +22,7 @@ class SelectGroupsDialog(val activity: SimpleActivity, val selectedGroups: Array private val dialog: AlertDialog? init { - groups.forEach { + groups.sortedBy { it.title }.forEach { addGroupCheckbox(it) } diff --git a/build.gradle b/build.gradle index 3437621a..139d4786 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.1.0' + classpath 'com.android.tools.build:gradle:3.1.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From ebe1f08f3f518c8303e78f9a040fd47a0b4ae5d5 Mon Sep 17 00:00:00 2001 From: en2sv Date: Sat, 14 Apr 2018 20:16:59 +0200 Subject: [PATCH 12/33] Update Swedish translation --- app/src/main/res/values-sv/strings.xml | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 4fa202ed..56a6738a 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -6,9 +6,9 @@ Uppdaterar… Telefonens lagringsutrymme Telefonens lagringsutrymme (inte synligt för andra appar) - Company - Job position - Website + Företag + Befattning + Webbplats Ny kontakt Redigera kontakt @@ -43,7 +43,7 @@ Visa kontaktuppgifter Visa fliken Favoriter Visa fliken Grupper - Manage shown contact fields + Hantera visade kontaktfält E-post @@ -84,18 +84,18 @@ Filnamn (utan .vcf) - Select fields to show + Välj vilka fält som ska visas Prefix Suffix - Phone numbers - Emails - Addresses - Events (birthdays, anniversaries) - Notes - Organization - Websites - Groups - Contact source + Telefonnummer + E-postadresser + Adresser + Händelser (födelsedagar, årsdagar) + Anteckningar + Organisation + Webbplatser + Grupper + Kontaktkälla I want to change what fields are visible at contacts. Can I do it? From 1242ba813b33921d493df4150de0941d9ae547ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kompiuteri=C5=B3=20meistras=20+37060040020?= Date: Mon, 16 Apr 2018 00:52:51 +0300 Subject: [PATCH 13/33] Update strings.xml --- app/src/main/res/values-lt/strings.xml | 57 +++++++++++++++++++------- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 164db0a4..3b1916ce 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -1,3 +1,32 @@ + +Skip to content +This repository + + Pull requests + Issues + Marketplace + Explore + + @mobtechpd + +6 +52 + + 19 + +SimpleMobileTools/Simple-Contacts +Code +Issues 25 +Pull requests 0 +Projects 0 +Wiki +Insights +Simple-Contacts/app/src/main/res/values-lt/strings.xml +2fca861 2 days ago +@tibbi tibbi add websites to the list of available fields +@tibbi +@mobtechpd +122 lines (104 sloc) 6.4 KB Paprasti kontaktai Kontaktai @@ -84,22 +113,22 @@ Bylos vardas (be .vcf) - Select fields to show - Prefix - Suffix - Phone numbers - Emails - Addresses - Events (birthdays, anniversaries) - Notes - Organization - Websites - Groups - Contact source + Pasirinkti rodomus laukelius + Priešdėlis + Priesaga + Telefonų numeriai + Elektroniniaipaštai + Adresai + Įvykiai (gimtadieniai, sukaktys) + Užrašai + Organizacija + Interneto puslapiai + Grupės + Kontakto šaltinis - I want to change what fields are visible at contacts. Can I do it? - Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there. + Noriu pakeisti, kokie laukai yra matomi kontaktuose. Ar galiu tai padaryti? + Taip, viskas, ką jums reikia padaryti, tai eiti į Nustatymai -> Tvarkyti rodomus kontaktų laukus. Čia galite pasirinkti, kurie laukai turėtų būti matomi. Kai kurie iš jų netgi yra išjungiami pagal numatytuosius nustatymus, todėl ten galite rasti naujų. From 066a8522119a700d004388b900afe1d73d066f32 Mon Sep 17 00:00:00 2001 From: Tibor Kaputa Date: Mon, 16 Apr 2018 09:38:55 +0200 Subject: [PATCH 14/33] removing some copypaste errors --- app/src/main/res/values-lt/strings.xml | 29 -------------------------- 1 file changed, 29 deletions(-) diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 3b1916ce..b34aa146 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -1,32 +1,3 @@ - -Skip to content -This repository - - Pull requests - Issues - Marketplace - Explore - - @mobtechpd - -6 -52 - - 19 - -SimpleMobileTools/Simple-Contacts -Code -Issues 25 -Pull requests 0 -Projects 0 -Wiki -Insights -Simple-Contacts/app/src/main/res/values-lt/strings.xml -2fca861 2 days ago -@tibbi tibbi add websites to the list of available fields -@tibbi -@mobtechpd -122 lines (104 sloc) 6.4 KB Paprasti kontaktai Kontaktai From a36ab25d58e130aa54eab977c9ef26bd1a595cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Marques?= Date: Mon, 16 Apr 2018 21:14:35 +0000 Subject: [PATCH 15/33] Update strings.xml --- app/src/main/res/values-pt/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 56d5f5fe..aa84ac06 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -8,7 +8,7 @@ Armazenamento do telefone (não visível por outras alicações) Organização Cargo - Website + Site Novo contacto Editar contacto @@ -38,7 +38,7 @@ Ordenar por apelido Mostrar número de telefone no ecrã principal Mostrar miniatura do contacto - Ao clicar no contacto + Ao tocar no contacto Ligar Ver detalhes Mostrar favoritos @@ -65,7 +65,7 @@ Aniversário - Parece que ainda não adicionou contactos como favoritos. + Parece que ainda não adicionou contactos como favoritos Adicionar favoritos Adicionar aos favoritos Remover dos favoritos @@ -79,7 +79,7 @@ Exportar contactos Importar contactos de um ficheiro .vcf Exportar contactos para um ficheiro .vcf - Destino da fonte do contacto + Destino da origem do contacto Incluir fontes dos contactos Nome do ficheiro (sem .vcf) @@ -93,9 +93,9 @@ Eventos (data de nascimento, aniversário) Notas Organização - Websites + Site Grupos - Fonte do contacto + Origem do contacto I want to change what fields are visible at contacts. Can I do it? From 55108ecb112db7b0b3028705e8208d07cb782016 Mon Sep 17 00:00:00 2001 From: dugi991 Date: Tue, 17 Apr 2018 21:21:10 +0000 Subject: [PATCH 16/33] Update strings.xml --- app/src/main/res/values-hr/strings.xml | 36 +++++++++++++------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 76955392..91ad1a1d 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -6,9 +6,9 @@ Ažuriranje… Pohrana na telefonu Pohrana na telefonu (nije vidljiva drugim aplikacijama)) - Company - Job position - Website + Tvrtka + Radno mjesto + Web stranica Novi kontakt Uredi kontakt @@ -84,25 +84,25 @@ Naziv datoteke (bez .vcf) - Select fields to show - Prefix - Suffix - Phone numbers - Emails - Addresses - Events (birthdays, anniversaries) - Notes - Organization - Websites - Groups - Contact source + Odaberi polja za prikaz + Prefiks + Sufiks + Brojevi telefona + E-pošte + Adrese + Događaji (rođendani, godišnjice) + Bilješke + Organizacije + Web stranice + Grupe + Izvori kontakata - I want to change what fields are visible at contacts. Can I do it? - Yes, all you have to do is go in Settings -> Manage shown contact fields. There you can select what fields should be visible. Some of them are even disabled by default, so you might find some new ones there. + Želim promijeniti polja koja su vidljiva na kontaktima. Mogu li to napraviti? + Da, sve što morate učiniti je otići u Postavke -> Upravljanje poljima za prikaz. Tamo možete odabrati polja koja bi trebala biti vidljiva. Neka od njih su čak i onemogućena prema zadanim postavkama, tako da možete pronaći neke nove. - + Da, sve što morate učiniti je otići u Postavke -> Upravljanje prikazanim kontaktnim poljima. Tamo možete odabrati polja koja bi trebala biti vidljiva. Neke od njih su čak i onemogućene prema zadanim postavkama, tako da možete pronaći neke nove. Aplikacija za upravljanje kontaktima bez oglasa. Jednostavna aplikacija za izradu ili upravljanje kontaktima iz bilo kojeg izvora. Kontakti mogu biti pohranjeni samo na Vašem uređaju, ali i sinkronizirani putem Googlea ili drugih računa. Možete prikazati svoje omiljene kontakte na zasebnom popisu. From 05f8bf71cf99be1ea5cf89860cca2024287186fe Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Apr 2018 09:07:02 +0200 Subject: [PATCH 17/33] removing a copypaste error --- app/src/main/res/values-hr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 91ad1a1d..1b2ea865 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -102,7 +102,7 @@ Da, sve što morate učiniti je otići u Postavke -> Upravljanje poljima za prikaz. Tamo možete odabrati polja koja bi trebala biti vidljiva. Neka od njih su čak i onemogućena prema zadanim postavkama, tako da možete pronaći neke nove. - Da, sve što morate učiniti je otići u Postavke -> Upravljanje prikazanim kontaktnim poljima. Tamo možete odabrati polja koja bi trebala biti vidljiva. Neke od njih su čak i onemogućene prema zadanim postavkama, tako da možete pronaći neke nove. + Aplikacija za upravljanje kontaktima bez oglasa. Jednostavna aplikacija za izradu ili upravljanje kontaktima iz bilo kojeg izvora. Kontakti mogu biti pohranjeni samo na Vašem uređaju, ali i sinkronizirani putem Googlea ili drugih računa. Možete prikazati svoje omiljene kontakte na zasebnom popisu. From e572ecb6784df78f5109ef0c870f44fc84ba66f4 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Apr 2018 11:04:34 +0200 Subject: [PATCH 18/33] fix #142, make address field multiline --- .../com/simplemobiletools/contacts/helpers/VcfExporter.kt | 2 +- .../com/simplemobiletools/contacts/helpers/VcfImporter.kt | 2 +- app/src/main/res/layout/item_edit_address.xml | 5 +---- app/src/main/res/layout/item_view_address.xml | 3 --- 4 files changed, 3 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 91d817d8..88f077f3 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfExporter.kt @@ -55,7 +55,7 @@ class VcfExporter { contact.addresses.forEach { val type = getAddressTypeLabel(it.type) val delimiterType = if (type.isEmpty()) "" else ";$type" - out.writeLn("$ADR$delimiterType:;;${it.value};;;;") + out.writeLn("$ADR$delimiterType:;;${it.value.replace("\n", "\\n")};;;;") } contact.events.forEach { 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 f1c45102..85561636 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/helpers/VcfImporter.kt @@ -187,7 +187,7 @@ class VcfImporter(val activity: SimpleActivity) { val type = getAddressTypeId(rawType.toUpperCase()) val addresses = addressParts[1].split(";") if (addresses.size == 7) { - curAddresses.add(Address(addresses[2], type)) + curAddresses.add(Address(addresses[2].replace("\\n", "\n"), type)) } } diff --git a/app/src/main/res/layout/item_edit_address.xml b/app/src/main/res/layout/item_edit_address.xml index f18e5552..36a6e910 100644 --- a/app/src/main/res/layout/item_edit_address.xml +++ b/app/src/main/res/layout/item_edit_address.xml @@ -13,10 +13,7 @@ android:layout_toLeftOf="@+id/contact_address_type" android:layout_toStartOf="@+id/contact_address_type" android:hint="@string/address" - android:inputType="textCapWords" - android:lines="1" - android:maxLines="1" - android:singleLine="true" + android:inputType="textCapWords|textMultiLine" android:textCursorDrawable="@null" android:textSize="@dimen/bigger_text_size"/> diff --git a/app/src/main/res/layout/item_view_address.xml b/app/src/main/res/layout/item_view_address.xml index fa3497b8..c3f46463 100644 --- a/app/src/main/res/layout/item_view_address.xml +++ b/app/src/main/res/layout/item_view_address.xml @@ -15,9 +15,6 @@ android:layout_centerVertical="true" android:layout_toLeftOf="@+id/contact_address_type" android:layout_toStartOf="@+id/contact_address_type" - android:lines="1" - android:maxLines="1" - android:singleLine="true" android:textSize="@dimen/bigger_text_size"/> Date: Wed, 18 Apr 2018 15:21:21 +0200 Subject: [PATCH 19/33] allow sending batch SMS or emails --- .../contacts/adapters/ContactsAdapter.kt | 50 +++++++++++++++++++ app/src/main/res/menu/cab.xml | 8 +++ app/src/main/res/values-de/strings.xml | 4 ++ app/src/main/res/values-el/strings.xml | 4 ++ app/src/main/res/values-fr/strings.xml | 4 ++ app/src/main/res/values-hr/strings.xml | 4 ++ app/src/main/res/values-ko-rKR/strings.xml | 4 ++ app/src/main/res/values-lt/strings.xml | 4 ++ app/src/main/res/values-pt/strings.xml | 4 ++ app/src/main/res/values-ru/strings.xml | 4 ++ app/src/main/res/values-sk/strings.xml | 4 ++ app/src/main/res/values-sv/strings.xml | 4 ++ app/src/main/res/values-zh-rTW/strings.xml | 4 ++ app/src/main/res/values/strings.xml | 4 ++ 14 files changed, 106 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 347a6f88..81151ea6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -1,6 +1,8 @@ package com.simplemobiletools.contacts.adapters +import android.content.Intent import android.graphics.drawable.Drawable +import android.net.Uri import android.view.Menu import android.view.View import android.view.ViewGroup @@ -15,6 +17,7 @@ import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor import com.simplemobiletools.commons.extensions.isActivityDestroyed +import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView @@ -62,6 +65,8 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList addToFavorites() R.id.cab_add_to_group -> addToGroup() R.id.cab_share -> shareContacts() + R.id.cab_send_sms_to_contacts -> sendSMSToContacts() + R.id.cab_send_email_to_contacts -> sendEmailToContacts() R.id.cab_remove -> removeContacts() R.id.cab_delete -> askConfirmDelete() } @@ -225,6 +232,49 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList() + selectedPositions.forEach { + val contact = contactItems[it] + contact.emails.forEach { + if (it.value.isNotEmpty()) { + emails.add(it.value) + } + } + } + + Intent(Intent.ACTION_SEND_MULTIPLE).apply { + type = "message/rfc822" + putExtra(Intent.EXTRA_EMAIL, emails.toTypedArray()) + if (resolveActivity(activity.packageManager) != null) { + activity.startActivity(this) + } else { + activity.toast(R.string.no_app_found) + } + } + } + override fun onViewRecycled(holder: ViewHolder) { super.onViewRecycled(holder) if (!activity.isActivityDestroyed()) { diff --git a/app/src/main/res/menu/cab.xml b/app/src/main/res/menu/cab.xml index 1e6fe78b..ccf454d3 100644 --- a/app/src/main/res/menu/cab.xml +++ b/app/src/main/res/menu/cab.xml @@ -26,6 +26,14 @@ android:icon="@drawable/ic_share" android:title="@string/share" app:showAsAction="ifRoom"/> + + Company Job position Website + Send SMS to contacts + Send email to contacts + Send SMS to group + Send email to group 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 d7b4b75f..99c4cf4f 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -9,6 +9,10 @@ Company Job position Website + Send SMS to contacts + Send email to contacts + Send SMS to group + Send email to group Νέα επαφή Επεξεργασία επαφής diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9fb63361..658974c6 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -9,6 +9,10 @@ Société Poste Website + Send SMS to contacts + Send email to contacts + Send SMS to group + Send email to group 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 1b2ea865..7b60b843 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -9,6 +9,10 @@ Tvrtka Radno mjesto Web stranica + Send SMS to contacts + Send email to contacts + Send SMS to group + Send email to group Novi kontakt Uredi kontakt diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 7ccd0798..9757f1f2 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -9,6 +9,10 @@ Company Job position Website + Send SMS to contacts + Send email to contacts + Send SMS to group + Send email to group 새로운 연락처 연락처 수정 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index b34aa146..62792dd9 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -9,6 +9,10 @@ Company Job position Website + Send SMS to contacts + Send email to contacts + Send SMS to group + Send email to group 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 aa84ac06..14f1913b 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -9,6 +9,10 @@ Organização Cargo Site + Send SMS to contacts + Send email to contacts + Send SMS to group + Send email to group 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 b9818f63..c84c275a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -9,6 +9,10 @@ Организация Должность Сайт + Send SMS to contacts + Send email to contacts + Send SMS to group + Send email to group Новый контакт Редактировать контакт diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index be962c4e..1595f0bd 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -9,6 +9,10 @@ Firma Pracovná pozícia Website + Poslať kontaktom SMS + Poslať kontaktom email + Poslať skupine SMS + Poslať skupine email 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 56a6738a..97d87bb8 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -9,6 +9,10 @@ Företag Befattning Webbplats + Send SMS to contacts + Send email to contacts + Send SMS to group + Send email to group Ny kontakt Redigera kontakt diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index e10f2970..bee24b25 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -9,6 +9,10 @@ 公司 職位 Website + Send SMS to contacts + Send email to contacts + Send SMS to group + Send email to group 新聯絡人 編輯聯絡人 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a62b2013..ef8ecf66 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,10 @@ Company Job position Website + Send SMS to contacts + Send email to contacts + Send SMS to group + Send email to group New contact Edit contact From 8c6d94a4614a4e25e977357e372a83f83f57db9c Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Apr 2018 15:30:55 +0200 Subject: [PATCH 20/33] add icons to the batch email and sms buttons --- app/src/main/res/menu/cab.xml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/menu/cab.xml b/app/src/main/res/menu/cab.xml index ccf454d3..d775dbc5 100644 --- a/app/src/main/res/menu/cab.xml +++ b/app/src/main/res/menu/cab.xml @@ -28,12 +28,14 @@ app:showAsAction="ifRoom"/> + app:showAsAction="ifRoom"/> + app:showAsAction="ifRoom"/> Date: Wed, 18 Apr 2018 15:34:16 +0200 Subject: [PATCH 21/33] show the batch sending icons at the Group screen too --- .../simplemobiletools/contacts/adapters/ContactsAdapter.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 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 81151ea6..e4de64d5 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -65,8 +65,8 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList Date: Wed, 18 Apr 2018 15:50:37 +0200 Subject: [PATCH 22/33] fix #137, allow sending SMS and emails to whole groups --- .../activities/GroupContactsActivity.kt | 24 +++++++ .../contacts/adapters/ContactsAdapter.kt | 63 ++++--------------- .../contacts/extensions/Activity.kt | 41 ++++++++++++ app/src/main/res/menu/menu_group.xml | 14 +++++ 4 files changed, 90 insertions(+), 52 deletions(-) create mode 100644 app/src/main/res/menu/menu_group.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt index 2ee2ab73..c81d309b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/GroupContactsActivity.kt @@ -1,6 +1,8 @@ package com.simplemobiletools.contacts.activities import android.os.Bundle +import android.view.Menu +import android.view.MenuItem import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.adapters.ContactsAdapter @@ -46,6 +48,20 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh refreshContacts() } + override fun onCreateOptionsMenu(menu: Menu?): Boolean { + menuInflater.inflate(R.menu.menu_group, menu) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.send_sms_to_group -> sendSMSToGroup() + R.id.send_email_to_group -> sendEmailToGroup() + else -> return super.onOptionsItemSelected(item) + } + return true + } + private fun fabClicked() { SelectContactsDialog(this, allContacts, groupContacts) { addedContacts, removedContacts -> Thread { @@ -74,6 +90,14 @@ class GroupContactsActivity : SimpleActivity(), RemoveFromGroupListener, Refresh } } + private fun sendSMSToGroup() { + sendSMSToContacts(groupContacts) + } + + private fun sendEmailToGroup() { + sendEmailToContacts(groupContacts) + } + private fun updateContacts(contacts: ArrayList) { val currAdapter = group_contacts_list.adapter if (currAdapter == null) { 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 e4de64d5..2bbc6d2b 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -1,8 +1,6 @@ package com.simplemobiletools.contacts.adapters -import android.content.Intent import android.graphics.drawable.Drawable -import android.net.Uri import android.view.Menu import android.view.View import android.view.ViewGroup @@ -17,17 +15,13 @@ import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor import com.simplemobiletools.commons.extensions.isActivityDestroyed -import com.simplemobiletools.commons.extensions.toast import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView import com.simplemobiletools.contacts.R import com.simplemobiletools.contacts.activities.SimpleActivity import com.simplemobiletools.contacts.dialogs.CreateNewGroupDialog -import com.simplemobiletools.contacts.extensions.addContactsToGroup -import com.simplemobiletools.contacts.extensions.config -import com.simplemobiletools.contacts.extensions.editContact -import com.simplemobiletools.contacts.extensions.shareContacts +import com.simplemobiletools.contacts.extensions.* import com.simplemobiletools.contacts.helpers.* import com.simplemobiletools.contacts.interfaces.RefreshContactsListener import com.simplemobiletools.contacts.interfaces.RemoveFromGroupListener @@ -181,21 +175,13 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList() - selectedPositions.forEach { - newFavorites.add(contactItems[it]) - } - ContactsHelper(activity).addFavorites(newFavorites) + ContactsHelper(activity).addFavorites(getSelectedContacts()) refreshListener?.refreshContacts(FAVORITES_TAB_MASK) finishActMode() } private fun addToGroup() { - val selectedContacts = ArrayList() - selectedPositions.forEach { - selectedContacts.add(contactItems[it]) - } - + val selectedContacts = getSelectedContacts() val NEW_GROUP_ID = -1 val items = ArrayList() ContactsHelper(activity).getStoredGroups().forEach { @@ -233,46 +219,19 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList() - selectedPositions.forEach { - val contact = contactItems[it] - contact.emails.forEach { - if (it.value.isNotEmpty()) { - emails.add(it.value) - } - } - } + activity.sendEmailToContacts(getSelectedContacts()) + } - Intent(Intent.ACTION_SEND_MULTIPLE).apply { - type = "message/rfc822" - putExtra(Intent.EXTRA_EMAIL, emails.toTypedArray()) - if (resolveActivity(activity.packageManager) != null) { - activity.startActivity(this) - } else { - activity.toast(R.string.no_app_found) - } + private fun getSelectedContacts(): ArrayList { + val contacts = ArrayList() + selectedPositions.forEach { + contacts.add(contactItems[it]) } + return contacts } override fun onViewRecycled(holder: ViewHolder) { 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 34b74393..a02e7101 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/extensions/Activity.kt @@ -99,6 +99,47 @@ fun BaseSimpleActivity.shareContacts(contacts: ArrayList) { } } +fun BaseSimpleActivity.sendSMSToContacts(contacts: ArrayList) { + val numbers = StringBuilder() + contacts.forEach { + it.phoneNumbers.forEach { + if (it.value.isNotEmpty()) { + numbers.append("${it.value};") + } + } + + val uriString = "smsto:${numbers.toString().trimEnd(';')}" + Intent(Intent.ACTION_SENDTO, Uri.parse(uriString)).apply { + if (resolveActivity(packageManager) != null) { + startActivity(this) + } else { + toast(R.string.no_app_found) + } + } + } +} + +fun BaseSimpleActivity.sendEmailToContacts(contacts: ArrayList) { + val emails = ArrayList() + contacts.forEach { + it.emails.forEach { + if (it.value.isNotEmpty()) { + emails.add(it.value) + } + } + } + + Intent(Intent.ACTION_SEND_MULTIPLE).apply { + type = "message/rfc822" + putExtra(Intent.EXTRA_EMAIL, emails.toTypedArray()) + if (resolveActivity(packageManager) != null) { + startActivity(this) + } else { + toast(R.string.no_app_found) + } + } +} + fun BaseSimpleActivity.getTempFile(): File? { val folder = File(cacheDir, "contacts") if (!folder.exists()) { diff --git a/app/src/main/res/menu/menu_group.xml b/app/src/main/res/menu/menu_group.xml new file mode 100644 index 00000000..c8073523 --- /dev/null +++ b/app/src/main/res/menu/menu_group.xml @@ -0,0 +1,14 @@ + + + + + From e23da2c183ebf2056b625236c202afc5d4591219 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Apr 2018 15:59:36 +0200 Subject: [PATCH 23/33] use big icons for SMS and Email only when appropriate --- app/build.gradle | 2 +- app/src/main/res/layout/activity_edit_contact.xml | 4 ++-- app/src/main/res/layout/activity_view_contact.xml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 53a34e63..d32630f0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,7 +45,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:3.18.23' + implementation 'com.simplemobiletools:commons:3.19.2' implementation 'joda-time:joda-time:2.9.9' implementation 'com.facebook.stetho:stetho:1.5.0' diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml index 9cfce75f..f09f6d3d 100644 --- a/app/src/main/res/layout/activity_edit_contact.xml +++ b/app/src/main/res/layout/activity_edit_contact.xml @@ -51,7 +51,7 @@ android:paddingLeft="@dimen/activity_margin" android:paddingRight="@dimen/activity_margin" android:scaleType="center" - android:src="@drawable/ic_email"/> + android:src="@drawable/ic_email_big"/> + android:src="@drawable/ic_sms_big"/> diff --git a/app/src/main/res/layout/activity_view_contact.xml b/app/src/main/res/layout/activity_view_contact.xml index d72416a6..8d50e8cf 100644 --- a/app/src/main/res/layout/activity_view_contact.xml +++ b/app/src/main/res/layout/activity_view_contact.xml @@ -52,7 +52,7 @@ android:paddingLeft="@dimen/activity_margin" android:paddingRight="@dimen/activity_margin" android:scaleType="center" - android:src="@drawable/ic_email"/> + android:src="@drawable/ic_email_big"/> + android:src="@drawable/ic_sms_big"/> From d9133ca5b60cd823cb854c3b0dd99466caaba473 Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Apr 2018 20:05:18 +0200 Subject: [PATCH 24/33] highlight the searched string at contacts --- app/build.gradle | 2 +- .../contacts/adapters/ContactsAdapter.kt | 21 ++++++++++++++----- .../contacts/fragments/MyViewPagerFragment.kt | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d32630f0..fa87370c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,7 +45,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:3.19.2' + implementation 'com.simplemobiletools:commons:3.19.3' implementation 'joda-time:joda-time:2.9.9' implementation 'com.facebook.stetho:stetho:1.5.0' diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index 2bbc6d2b..33aaf91e 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -14,6 +14,7 @@ import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.extensions.beVisibleIf import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor +import com.simplemobiletools.commons.extensions.highlightTextPart import com.simplemobiletools.commons.extensions.isActivityDestroyed import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.views.FastScroller @@ -36,6 +37,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList) { + fun updateItems(newItems: ArrayList, highlightText: String = "") { if (newItems.hashCode() != contactItems.hashCode()) { contactItems = newItems + textToHighlight = highlightText notifyDataSetChanged() finishActMode() + } else if (textToHighlight != highlightText) { + textToHighlight = highlightText + notifyDataSetChanged() } } @@ -243,13 +249,18 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList Date: Wed, 18 Apr 2018 20:23:28 +0200 Subject: [PATCH 25/33] update primary color at Search selection if it changes --- app/build.gradle | 2 +- .../contacts/adapters/ContactsAdapter.kt | 11 +++++------ .../contacts/fragments/MyViewPagerFragment.kt | 3 +++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index fa87370c..158e8bec 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,7 +45,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:3.19.3' + implementation 'com.simplemobiletools:commons:3.19.4' implementation 'joda-time:joda-time:2.9.9' implementation 'com.facebook.stetho:stetho:1.5.0' diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index 33aaf91e..ee5a9430 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -12,10 +12,7 @@ import com.bumptech.glide.signature.ObjectKey import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter import com.simplemobiletools.commons.dialogs.ConfirmationDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog -import com.simplemobiletools.commons.extensions.beVisibleIf -import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor -import com.simplemobiletools.commons.extensions.highlightTextPart -import com.simplemobiletools.commons.extensions.isActivityDestroyed +import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.views.FastScroller import com.simplemobiletools.commons.views.MyRecyclerView @@ -38,6 +35,8 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList Date: Wed, 18 Apr 2018 21:40:23 +0200 Subject: [PATCH 26/33] update version to 3.5.3 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 158e8bec..d26954e8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.simplemobiletools.contacts" minSdkVersion 16 targetSdkVersion 27 - versionCode 18 - versionName "3.5.2" + versionCode 19 + versionName "3.5.3" setProperty("archivesBaseName", "contacts") } From 5c78f49af0029188f819746e65ee85ecb8e3637b Mon Sep 17 00:00:00 2001 From: tibbi Date: Wed, 18 Apr 2018 21:40:29 +0200 Subject: [PATCH 27/33] updating changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba680742..4f8ea65c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Changelog ========== +Version 3.5.3 *(2018-04-18)* +---------------------------- + + * Allow splitting the Address in multiple lines + * Allow batch sending SMS or emails to selected contacts or whole group + * Highlight the searched string at the result contacts + Version 3.5.2 *(2018-04-13)* ---------------------------- From 51cb0d7e261cf1cc64597573226398fd16d52754 Mon Sep 17 00:00:00 2001 From: xin Date: Fri, 20 Apr 2018 18:24:20 +0000 Subject: [PATCH 28/33] Update french translation --- app/src/main/res/values-fr/strings.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 658974c6..81038949 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -8,11 +8,11 @@ Stockage du téléphone (non visible par d\'autres applis) Société Poste - Website - Send SMS to contacts - Send email to contacts - Send SMS to group - Send email to group + Site web + Envoyer un SMS aux contacts + Envoyer un e-mail aux contacts + Envoyer un SMS au groupe + Envoyer un e-mail au groupe Nouveau contact Modifier contact @@ -97,7 +97,7 @@ Évènements (naissances, anniversaires) Notes Organisation - Websites + Sites web Groupe Source du contact From 27fd7fb2dc0137def4aa7aa508314763d4656da0 Mon Sep 17 00:00:00 2001 From: en2sv Date: Sat, 21 Apr 2018 20:22:56 +0200 Subject: [PATCH 29/33] Update Swedish translation --- app/src/main/res/values-sv/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 97d87bb8..a6ea7e46 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -9,10 +9,10 @@ Företag Befattning Webbplats - Send SMS to contacts - Send email to contacts - Send SMS to group - Send email to group + Skicka sms till kontakter + Skicka e-post till kontakter + Skicka sms till grupp + Skicka e-post till grupp Ny kontakt Redigera kontakt From 6e98724679611205a3536e4b710f6c04cc05e637 Mon Sep 17 00:00:00 2001 From: narzb Date: Tue, 24 Apr 2018 23:29:16 +0200 Subject: [PATCH 30/33] fix french translation --- app/src/main/res/values-fr/strings.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 81038949..9d9b2f00 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -39,15 +39,15 @@ Supprimer la photo - Commencer le nom par le nom de famille - Afficher les numéros de téléphone sur l\'écran principal + Trier les contacts par nom de famille + Afficher les numéros de téléphone Afficher les vignettes des contacts Sur appui du contact Appeler le contact Voir les détails du contact Afficher l\'onglet favoris Afficher l\'onglet groupes - Configurer l\'affichage des champs de contact + Configurer l\'affichage des champs des contacts E-mail @@ -69,7 +69,7 @@ Anniversaire - Il semble que vous n\'ayez pas encore ajouté de contact favori. + Vous n\'ayez pas encore ajouté de contact favori. Ajouter des favoris Ajouter aux favoris Retirer des favoris From a3f3cc5fbef586baaa18a4032fa6cabb479aa547 Mon Sep 17 00:00:00 2001 From: tibbi Date: Thu, 26 Apr 2018 21:32:16 +0200 Subject: [PATCH 31/33] create a copy of contact items at updating them --- app/build.gradle | 2 +- .../com/simplemobiletools/contacts/adapters/ContactsAdapter.kt | 2 +- build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index d26954e8..b357cbab 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -45,7 +45,7 @@ ext { } dependencies { - implementation 'com.simplemobiletools:commons:3.19.4' + implementation 'com.simplemobiletools:commons:3.19.21' implementation 'joda-time:joda-time:2.9.9' implementation 'com.facebook.stetho:stetho:1.5.0' diff --git a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt index ee5a9430..ca85d078 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/adapters/ContactsAdapter.kt @@ -117,7 +117,7 @@ class ContactsAdapter(activity: SimpleActivity, var contactItems: ArrayList, highlightText: String = "") { if (newItems.hashCode() != contactItems.hashCode()) { - contactItems = newItems + contactItems = newItems.clone() as ArrayList textToHighlight = highlightText notifyDataSetChanged() finishActMode() diff --git a/build.gradle b/build.gradle index 139d4786..1bde8c32 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.1.1' + classpath 'com.android.tools.build:gradle:3.1.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From 0031be51fb2efcd67ea153f9de44b44cb7afa299 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 27 Apr 2018 09:46:54 +0200 Subject: [PATCH 32/33] show a toast if the user tries toggling Favorite at the View screen --- .../contacts/activities/ViewContactActivity.kt | 3 +++ app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values-el/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 1 + app/src/main/res/values-hr/strings.xml | 1 + app/src/main/res/values-ko-rKR/strings.xml | 1 + app/src/main/res/values-lt/strings.xml | 1 + app/src/main/res/values-pt/strings.xml | 1 + app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-sk/strings.xml | 1 + app/src/main/res/values-sv/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 13 files changed, 15 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 09ec8269..80e754d8 100644 --- a/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/contacts/activities/ViewContactActivity.kt @@ -157,6 +157,9 @@ class ViewContactActivity : ContactActivity() { setImageDrawable(getStarDrawable(contact!!.starred == 1)) tag = contact!!.starred applyColorFilter(config.textColor) + setOnClickListener { + toast(R.string.must_be_at_edit) + } } } diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c2eef0e6..ad6daa49 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -73,6 +73,7 @@ Favoriten hinzufügen Zu Favoriten hinzufügen Aus Favoriten entfernen + You must be at the Edit screen to modify a contact Kontakte durchsuchen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 99c4cf4f..fc2e9af5 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -73,6 +73,7 @@ Προσθήκη αγαπημένων Προσθήκη στα αγαπημένα Αφαίρεση από τα αγαπημένα + You must be at the Edit screen to modify a contact Αναζήτηση επαφών diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9d9b2f00..89a0769e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -73,6 +73,7 @@ Ajouter des favoris Ajouter aux favoris Retirer des favoris + You must be at the Edit screen to modify a contact Rechercher des contacts diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 7b60b843..446dd86b 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -73,6 +73,7 @@ Dodaj favorite Dodaj u favorite Ukloni iz favorita + You must be at the Edit screen to modify a contact Pretraži kontakte diff --git a/app/src/main/res/values-ko-rKR/strings.xml b/app/src/main/res/values-ko-rKR/strings.xml index 9757f1f2..a1f591d6 100644 --- a/app/src/main/res/values-ko-rKR/strings.xml +++ b/app/src/main/res/values-ko-rKR/strings.xml @@ -73,6 +73,7 @@ 자주쓰는 연락처 등록 자주쓰는 연락처에 추가 자주쓰는 연락처에서 제거 + You must be at the Edit screen to modify a contact 연락처 검색 diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 62792dd9..c6c2d496 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -73,6 +73,7 @@ Pridėti mėgiamiausiuosius Pridėti į mėgiamiausiuosius Pašalinti iš mėgiamiausiųjų + You must be at the Edit screen to modify a contact Ieškoti kontaktų diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 14f1913b..3fcc26e8 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -73,6 +73,7 @@ Adicionar favoritos Adicionar aos favoritos Remover dos favoritos + You must be at the Edit screen to modify a contact Pesquisar contactos diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c84c275a..1a29ddf2 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -73,6 +73,7 @@ Добавить избранные Добавить в избранные Удалить из избранных + You must be at the Edit screen to modify a contact Поиск контактов diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 1595f0bd..a16d32fb 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -73,6 +73,7 @@ Pridať obľúbené Pridať medzi obľúbené Odstrániť z obľúbených + Pre úpravu kontaktu musíte byť v Editore kontaktu Hľadať v kontaktoch diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index a6ea7e46..c6f7c6d3 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -73,6 +73,7 @@ Lägg till favoriter Lägg till i favoriter Ta bort från favoriter + You must be at the Edit screen to modify a contact Sök efter kontakter diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index bee24b25..22d3d9d1 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -73,6 +73,7 @@ 添加我的最愛 加入我的最愛 從我的最愛移除 + You must be at the Edit screen to modify a contact 搜尋聯絡人 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ef8ecf66..a5b8c8ae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -73,6 +73,7 @@ Add favorites Add to favorites Remove from favorites + You must be at the Edit screen to modify a contact Search contacts From 4266de427ee9218fca661736847323acb51f0a26 Mon Sep 17 00:00:00 2001 From: tibbi Date: Fri, 27 Apr 2018 19:11:07 +0200 Subject: [PATCH 33/33] update kotlin to 1.2.40 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1bde8c32..9b9625a9 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.31' + ext.kotlin_version = '1.2.40' repositories { google()