mirror of
https://github.com/SimpleMobileTools/Simple-Contacts.git
synced 2025-04-24 06:27:18 +02:00
handle the contact photo at inserting too
This commit is contained in:
parent
4da25f25f2
commit
84be33dbbf
@ -60,6 +60,7 @@ class ContactActivity : SimpleActivity() {
|
|||||||
private var currentContactPhotoPath = ""
|
private var currentContactPhotoPath = ""
|
||||||
private var lastPhotoIntentUri: Uri? = null
|
private var lastPhotoIntentUri: Uri? = null
|
||||||
private var contact: Contact? = null
|
private var contact: Contact? = null
|
||||||
|
private var isSaving = false
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@ -321,6 +322,10 @@ class ContactActivity : SimpleActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun saveContact() {
|
private fun saveContact() {
|
||||||
|
if (isSaving) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
contact!!.apply {
|
contact!!.apply {
|
||||||
firstName = contact_first_name.value
|
firstName = contact_first_name.value
|
||||||
middleName = contact_middle_name.value
|
middleName = contact_middle_name.value
|
||||||
@ -330,11 +335,13 @@ class ContactActivity : SimpleActivity() {
|
|||||||
emails = getFilledEmails()
|
emails = getFilledEmails()
|
||||||
source = contact_source.value
|
source = contact_source.value
|
||||||
|
|
||||||
if (id == 0) {
|
Thread {
|
||||||
insertNewContact()
|
if (id == 0) {
|
||||||
} else {
|
insertNewContact()
|
||||||
updateContact()
|
} else {
|
||||||
}
|
updateContact()
|
||||||
|
}
|
||||||
|
}.start()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -369,6 +376,7 @@ class ContactActivity : SimpleActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun insertNewContact() {
|
private fun insertNewContact() {
|
||||||
|
isSaving = true
|
||||||
if (ContactsHelper(this@ContactActivity).insertContact(contact!!)) {
|
if (ContactsHelper(this@ContactActivity).insertContact(contact!!)) {
|
||||||
finish()
|
finish()
|
||||||
} else {
|
} else {
|
||||||
@ -377,6 +385,7 @@ class ContactActivity : SimpleActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun updateContact() {
|
private fun updateContact() {
|
||||||
|
isSaving = true
|
||||||
if (ContactsHelper(this@ContactActivity).updateContact(contact!!)) {
|
if (ContactsHelper(this@ContactActivity).updateContact(contact!!)) {
|
||||||
finish()
|
finish()
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,24 +1,33 @@
|
|||||||
package com.simplemobiletools.contacts.helpers
|
package com.simplemobiletools.contacts.helpers
|
||||||
|
|
||||||
import android.content.ContentProviderOperation
|
import android.content.ContentProviderOperation
|
||||||
|
import android.content.ContentProviderResult
|
||||||
|
import android.content.ContentUris
|
||||||
import android.database.Cursor
|
import android.database.Cursor
|
||||||
|
import android.graphics.Bitmap
|
||||||
|
import android.net.Uri
|
||||||
import android.provider.ContactsContract
|
import android.provider.ContactsContract
|
||||||
|
import android.provider.MediaStore
|
||||||
import android.util.SparseArray
|
import android.util.SparseArray
|
||||||
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
import com.simplemobiletools.commons.activities.BaseSimpleActivity
|
||||||
import com.simplemobiletools.commons.extensions.getIntValue
|
import com.simplemobiletools.commons.extensions.getIntValue
|
||||||
import com.simplemobiletools.commons.extensions.getStringValue
|
import com.simplemobiletools.commons.extensions.getStringValue
|
||||||
import com.simplemobiletools.commons.extensions.showErrorToast
|
import com.simplemobiletools.commons.extensions.showErrorToast
|
||||||
|
import com.simplemobiletools.commons.extensions.toast
|
||||||
import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME
|
import com.simplemobiletools.commons.helpers.SORT_BY_FIRST_NAME
|
||||||
import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME
|
import com.simplemobiletools.commons.helpers.SORT_BY_MIDDLE_NAME
|
||||||
import com.simplemobiletools.commons.helpers.SORT_BY_SURNAME
|
import com.simplemobiletools.commons.helpers.SORT_BY_SURNAME
|
||||||
import com.simplemobiletools.commons.helpers.SORT_DESCENDING
|
import com.simplemobiletools.commons.helpers.SORT_DESCENDING
|
||||||
|
import com.simplemobiletools.contacts.R
|
||||||
import com.simplemobiletools.contacts.extensions.config
|
import com.simplemobiletools.contacts.extensions.config
|
||||||
import com.simplemobiletools.contacts.models.Contact
|
import com.simplemobiletools.contacts.models.Contact
|
||||||
import com.simplemobiletools.contacts.models.Email
|
import com.simplemobiletools.contacts.models.Email
|
||||||
import com.simplemobiletools.contacts.models.PhoneNumber
|
import com.simplemobiletools.contacts.models.PhoneNumber
|
||||||
import com.simplemobiletools.contacts.overloads.times
|
import com.simplemobiletools.contacts.overloads.times
|
||||||
|
import java.io.ByteArrayOutputStream
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
|
|
||||||
class ContactsHelper(val activity: BaseSimpleActivity) {
|
class ContactsHelper(val activity: BaseSimpleActivity) {
|
||||||
fun getContactSources(callback: (ArrayList<String>) -> Unit) {
|
fun getContactSources(callback: (ArrayList<String>) -> Unit) {
|
||||||
val accounts = HashSet<String>()
|
val accounts = HashSet<String>()
|
||||||
@ -107,20 +116,6 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
|
|||||||
}.start()
|
}.start()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun doesSourceContainContacts(source: String): Boolean {
|
|
||||||
val uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI
|
|
||||||
val projection = arrayOf(ContactsContract.CommonDataKinds.Email.CONTACT_ID)
|
|
||||||
val selection = "${ContactsContract.RawContacts.ACCOUNT_NAME} = ?"
|
|
||||||
val selectionArgs = arrayOf(source)
|
|
||||||
var cursor: Cursor? = null
|
|
||||||
try {
|
|
||||||
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null)
|
|
||||||
return (cursor?.moveToFirst() == true)
|
|
||||||
} finally {
|
|
||||||
cursor?.close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getEmails(contactId: Int? = null): SparseArray<ArrayList<Email>> {
|
private fun getEmails(contactId: Int? = null): SparseArray<ArrayList<Email>> {
|
||||||
val emails = SparseArray<ArrayList<Email>>()
|
val emails = SparseArray<ArrayList<Email>>()
|
||||||
val uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI
|
val uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI
|
||||||
@ -304,6 +299,7 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
|
|||||||
|
|
||||||
fun insertContact(contact: Contact): Boolean {
|
fun insertContact(contact: Contact): Boolean {
|
||||||
return try {
|
return try {
|
||||||
|
activity.toast(R.string.inserting)
|
||||||
val operations = ArrayList<ContentProviderOperation>()
|
val operations = ArrayList<ContentProviderOperation>()
|
||||||
ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).apply {
|
ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI).apply {
|
||||||
withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
|
withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
|
||||||
@ -343,7 +339,52 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
|
// photo (inspired by https://gist.github.com/slightfoot/5985900)
|
||||||
|
var fullSizePhotoData: ByteArray? = null
|
||||||
|
var scaledSizePhotoData: ByteArray?
|
||||||
|
if (contact.photoUri.isNotEmpty()) {
|
||||||
|
val photoUri = Uri.parse(contact.photoUri)
|
||||||
|
val bitmap = MediaStore.Images.Media.getBitmap(activity.contentResolver, photoUri)
|
||||||
|
|
||||||
|
val thumbnailSize = getThumbnailSize()
|
||||||
|
val scaledPhoto = Bitmap.createScaledBitmap(bitmap, thumbnailSize, thumbnailSize, false)
|
||||||
|
scaledSizePhotoData = bitmapToByteArray(scaledPhoto)
|
||||||
|
scaledPhoto.recycle()
|
||||||
|
|
||||||
|
fullSizePhotoData = bitmapToByteArray(bitmap)
|
||||||
|
bitmap.recycle()
|
||||||
|
ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply {
|
||||||
|
withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
|
||||||
|
withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
|
||||||
|
withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, scaledSizePhotoData)
|
||||||
|
operations.add(this.build())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val results: Array<ContentProviderResult>
|
||||||
|
try {
|
||||||
|
results = activity.contentResolver.applyBatch(ContactsContract.AUTHORITY, operations)
|
||||||
|
} finally {
|
||||||
|
scaledSizePhotoData = null
|
||||||
|
}
|
||||||
|
|
||||||
|
// fullsize photo
|
||||||
|
if (contact.photoUri.isNotEmpty() && fullSizePhotoData != null) {
|
||||||
|
val rawContactId = ContentUris.parseId(results[0].uri)
|
||||||
|
val baseUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, rawContactId)
|
||||||
|
val displayPhotoUri = Uri.withAppendedPath(baseUri, ContactsContract.RawContacts.DisplayPhoto.CONTENT_DIRECTORY)
|
||||||
|
val photoStream = activity.contentResolver.openAssetFileDescriptor(displayPhotoUri, "rw").createOutputStream()
|
||||||
|
photoStream.use {
|
||||||
|
var bufferSize = 16 * 1024
|
||||||
|
var offset = 0
|
||||||
|
while (offset < fullSizePhotoData.size) {
|
||||||
|
bufferSize = Math.min(bufferSize, fullSizePhotoData.size - offset)
|
||||||
|
photoStream.write(fullSizePhotoData, offset, bufferSize)
|
||||||
|
offset += bufferSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
true
|
true
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
activity.showErrorToast(e)
|
activity.showErrorToast(e)
|
||||||
@ -351,6 +392,17 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun bitmapToByteArray(bitmap: Bitmap): ByteArray {
|
||||||
|
var baos: ByteArrayOutputStream? = null
|
||||||
|
try {
|
||||||
|
baos = ByteArrayOutputStream()
|
||||||
|
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, baos)
|
||||||
|
return baos.toByteArray()
|
||||||
|
} finally {
|
||||||
|
baos?.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun deleteContact(contact: Contact) = deleteContacts(arrayListOf(contact))
|
fun deleteContact(contact: Contact) = deleteContacts(arrayListOf(contact))
|
||||||
|
|
||||||
fun deleteContacts(contacts: ArrayList<Contact>) {
|
fun deleteContacts(contacts: ArrayList<Contact>) {
|
||||||
@ -366,4 +418,33 @@ class ContactsHelper(val activity: BaseSimpleActivity) {
|
|||||||
activity.showErrorToast(e)
|
activity.showErrorToast(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun doesSourceContainContacts(source: String): Boolean {
|
||||||
|
val uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI
|
||||||
|
val projection = arrayOf(ContactsContract.CommonDataKinds.Email.CONTACT_ID)
|
||||||
|
val selection = "${ContactsContract.RawContacts.ACCOUNT_NAME} = ?"
|
||||||
|
val selectionArgs = arrayOf(source)
|
||||||
|
var cursor: Cursor? = null
|
||||||
|
try {
|
||||||
|
cursor = activity.contentResolver.query(uri, projection, selection, selectionArgs, null)
|
||||||
|
return (cursor?.moveToFirst() == true)
|
||||||
|
} finally {
|
||||||
|
cursor?.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getThumbnailSize(): Int {
|
||||||
|
var cursor: Cursor? = null
|
||||||
|
try {
|
||||||
|
val uri = ContactsContract.DisplayPhoto.CONTENT_MAX_DIMENSIONS_URI
|
||||||
|
val projection = arrayOf(ContactsContract.DisplayPhoto.THUMBNAIL_MAX_DIM)
|
||||||
|
cursor = activity.contentResolver.query(uri, projection, null, null, null)
|
||||||
|
if (cursor?.moveToFirst() == true) {
|
||||||
|
return cursor.getIntValue(ContactsContract.DisplayPhoto.THUMBNAIL_MAX_DIM)
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
cursor?.close()
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
<string name="app_name">Schlichte Kontakte</string>
|
<string name="app_name">Schlichte Kontakte</string>
|
||||||
<string name="app_launcher_name">Kontakte</string>
|
<string name="app_launcher_name">Kontakte</string>
|
||||||
<string name="address">Adresse</string>
|
<string name="address">Adresse</string>
|
||||||
|
<string name="inserting">Inserting…</string>
|
||||||
|
<string name="updating">Updating…</string>
|
||||||
|
|
||||||
<string name="new_contact">Neuer Kontakt</string>
|
<string name="new_contact">Neuer Kontakt</string>
|
||||||
<string name="edit_contact">Kontakt bearbeiten</string>
|
<string name="edit_contact">Kontakt bearbeiten</string>
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
<string name="app_name">심플 연락처</string>
|
<string name="app_name">심플 연락처</string>
|
||||||
<string name="app_launcher_name">연락처</string>
|
<string name="app_launcher_name">연락처</string>
|
||||||
<string name="address">주소</string>
|
<string name="address">주소</string>
|
||||||
|
<string name="inserting">Inserting…</string>
|
||||||
|
<string name="updating">Updating…</string>
|
||||||
|
|
||||||
<string name="new_contact">새로운 연락처</string>
|
<string name="new_contact">새로운 연락처</string>
|
||||||
<string name="edit_contact">연락처 수정</string>
|
<string name="edit_contact">연락처 수정</string>
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
<string name="app_name">Simple Contacts</string>
|
<string name="app_name">Simple Contacts</string>
|
||||||
<string name="app_launcher_name">Contactos</string>
|
<string name="app_launcher_name">Contactos</string>
|
||||||
<string name="address">Address</string>
|
<string name="address">Address</string>
|
||||||
|
<string name="inserting">Inserting…</string>
|
||||||
|
<string name="updating">Updating…</string>
|
||||||
|
|
||||||
<string name="new_contact">Novo contacto</string>
|
<string name="new_contact">Novo contacto</string>
|
||||||
<string name="edit_contact">Editar contacto</string>
|
<string name="edit_contact">Editar contacto</string>
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
<string name="app_name">Simple Contacts</string>
|
<string name="app_name">Simple Contacts</string>
|
||||||
<string name="app_launcher_name">Контакты</string>
|
<string name="app_launcher_name">Контакты</string>
|
||||||
<string name="address">Адрес</string>
|
<string name="address">Адрес</string>
|
||||||
|
<string name="inserting">Inserting…</string>
|
||||||
|
<string name="updating">Updating…</string>
|
||||||
|
|
||||||
<string name="new_contact">Новый контакт</string>
|
<string name="new_contact">Новый контакт</string>
|
||||||
<string name="edit_contact">Редактировать контакт</string>
|
<string name="edit_contact">Редактировать контакт</string>
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
<string name="app_name">Jednoduché kontakty</string>
|
<string name="app_name">Jednoduché kontakty</string>
|
||||||
<string name="app_launcher_name">Kontakty</string>
|
<string name="app_launcher_name">Kontakty</string>
|
||||||
<string name="address">Adresa</string>
|
<string name="address">Adresa</string>
|
||||||
|
<string name="inserting">Vytvára sa…</string>
|
||||||
|
<string name="updating">Upravuje sa…</string>
|
||||||
|
|
||||||
<string name="new_contact">Nový kontakt</string>
|
<string name="new_contact">Nový kontakt</string>
|
||||||
<string name="edit_contact">Upraviť kontakt</string>
|
<string name="edit_contact">Upraviť kontakt</string>
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
<string name="app_name">Simple Contacts</string>
|
<string name="app_name">Simple Contacts</string>
|
||||||
<string name="app_launcher_name">Contacts</string>
|
<string name="app_launcher_name">Contacts</string>
|
||||||
<string name="address">Address</string>
|
<string name="address">Address</string>
|
||||||
|
<string name="inserting">Inserting…</string>
|
||||||
|
<string name="updating">Updating…</string>
|
||||||
|
|
||||||
<string name="new_contact">New contact</string>
|
<string name="new_contact">New contact</string>
|
||||||
<string name="edit_contact">Edit contact</string>
|
<string name="edit_contact">Edit contact</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user