287 lines
11 KiB
Kotlin
287 lines
11 KiB
Kotlin
package com.simplemobiletools.contacts.activities
|
|
|
|
import android.graphics.drawable.ColorDrawable
|
|
import android.graphics.drawable.Drawable
|
|
import android.os.Bundle
|
|
import android.provider.ContactsContract
|
|
import android.view.Menu
|
|
import android.view.MenuItem
|
|
import android.view.ViewGroup
|
|
import android.view.WindowManager
|
|
import com.bumptech.glide.Glide
|
|
import com.bumptech.glide.load.DataSource
|
|
import com.bumptech.glide.load.engine.DiskCacheStrategy
|
|
import com.bumptech.glide.load.engine.GlideException
|
|
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
|
|
import com.bumptech.glide.request.RequestListener
|
|
import com.bumptech.glide.request.RequestOptions
|
|
import com.bumptech.glide.request.target.Target
|
|
import com.simplemobiletools.commons.dialogs.ConfirmationDialog
|
|
import com.simplemobiletools.commons.dialogs.RadioGroupDialog
|
|
import com.simplemobiletools.commons.extensions.*
|
|
import com.simplemobiletools.commons.helpers.PERMISSION_READ_CONTACTS
|
|
import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CONTACTS
|
|
import com.simplemobiletools.commons.models.RadioItem
|
|
import com.simplemobiletools.contacts.R
|
|
import com.simplemobiletools.contacts.extensions.config
|
|
import com.simplemobiletools.contacts.extensions.sendEmailIntent
|
|
import com.simplemobiletools.contacts.extensions.sendSMSIntent
|
|
import com.simplemobiletools.contacts.extensions.tryStartCall
|
|
import com.simplemobiletools.contacts.helpers.CONTACT_ID
|
|
import com.simplemobiletools.contacts.helpers.ContactsHelper
|
|
import com.simplemobiletools.contacts.models.Contact
|
|
import kotlinx.android.synthetic.main.activity_contact.*
|
|
import kotlinx.android.synthetic.main.item_email.view.*
|
|
import kotlinx.android.synthetic.main.item_phone_number.view.*
|
|
|
|
class ContactActivity : SimpleActivity() {
|
|
private val DEFAULT_EMAIL_TYPE = ContactsContract.CommonDataKinds.Email.TYPE_HOME
|
|
private val DEFAULT_PHONE_NUMBER_TYPE = ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE
|
|
|
|
private var wasActivityInitialized = false
|
|
private var contact: Contact? = null
|
|
|
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
super.onCreate(savedInstanceState)
|
|
setContentView(R.layout.activity_contact)
|
|
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_cross)
|
|
|
|
handlePermission(PERMISSION_READ_CONTACTS) {
|
|
if (it) {
|
|
handlePermission(PERMISSION_WRITE_CONTACTS) {
|
|
if (it) {
|
|
initContact()
|
|
} else {
|
|
toast(R.string.no_contacts_permission)
|
|
finish()
|
|
}
|
|
}
|
|
} else {
|
|
toast(R.string.no_contacts_permission)
|
|
finish()
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun initContact() {
|
|
val contactId = intent.getIntExtra(CONTACT_ID, 0)
|
|
if (contactId != 0) {
|
|
contact = ContactsHelper(this).getContactWithId(contactId)
|
|
if (contact == null) {
|
|
toast(R.string.unknown_error_occurred)
|
|
finish()
|
|
return
|
|
}
|
|
}
|
|
|
|
if (contact == null) {
|
|
setupNewContact()
|
|
} else {
|
|
setupEditContact()
|
|
}
|
|
|
|
contact_send_sms.beVisibleIf(contact!!.phoneNumbers.isNotEmpty())
|
|
contact_start_call.beVisibleIf(contact!!.phoneNumbers.isNotEmpty())
|
|
contact_send_email.beVisibleIf(contact!!.emails.isNotEmpty())
|
|
|
|
contact_photo.background = ColorDrawable(config.primaryColor)
|
|
|
|
if (contact!!.photoUri.isEmpty()) {
|
|
applyPhotoPlaceholder()
|
|
} else {
|
|
val options = RequestOptions()
|
|
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
|
|
.centerCrop()
|
|
|
|
Glide.with(this)
|
|
.load(contact!!.photoUri)
|
|
.transition(DrawableTransitionOptions.withCrossFade())
|
|
.apply(options)
|
|
.listener(object : RequestListener<Drawable> {
|
|
override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean) = false
|
|
|
|
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
|
|
applyPhotoPlaceholder()
|
|
return true
|
|
}
|
|
}).into(contact_photo)
|
|
}
|
|
|
|
val textColor = config.textColor
|
|
contact_send_sms.applyColorFilter(textColor)
|
|
contact_start_call.applyColorFilter(textColor)
|
|
contact_send_email.applyColorFilter(textColor)
|
|
contact_name_image.applyColorFilter(textColor)
|
|
contact_number_image.applyColorFilter(textColor)
|
|
contact_email_image.applyColorFilter(textColor)
|
|
contact_source_image.applyColorFilter(textColor)
|
|
contact_number_add_new.applyColorFilter(config.primaryColor)
|
|
contact_number_add_new.background.applyColorFilter(textColor)
|
|
contact_email_add_new.applyColorFilter(config.primaryColor)
|
|
contact_email_add_new.background.applyColorFilter(textColor)
|
|
|
|
contact_photo.setOnClickListener { }
|
|
contact_send_sms.setOnClickListener { trySendSMS() }
|
|
contact_start_call.setOnClickListener { tryStartCall(contact!!) }
|
|
contact_send_email.setOnClickListener { trySendEmail() }
|
|
contact_source.setOnClickListener { showAccountSourcePicker() }
|
|
contact_number_add_new.setOnClickListener { addNewPhoneNumberField() }
|
|
contact_email_add_new.setOnClickListener { addNewEmailField() }
|
|
|
|
updateTextColors(contact_scrollview)
|
|
wasActivityInitialized = true
|
|
invalidateOptionsMenu()
|
|
}
|
|
|
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
|
menuInflater.inflate(R.menu.menu_contact, menu)
|
|
if (wasActivityInitialized) {
|
|
menu.findItem(R.id.delete).isVisible = contact?.id != 0
|
|
}
|
|
return true
|
|
}
|
|
|
|
override fun onOptionsItemSelected(item: MenuItem): Boolean {
|
|
when (item.itemId) {
|
|
R.id.save -> saveContact()
|
|
R.id.delete -> deleteContact()
|
|
else -> return super.onOptionsItemSelected(item)
|
|
}
|
|
return true
|
|
}
|
|
|
|
private fun setupEditContact() {
|
|
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
|
|
supportActionBar?.title = resources.getString(R.string.edit_contact)
|
|
contact_first_name.setText(contact!!.firstName)
|
|
contact_middle_name.setText(contact!!.middleName)
|
|
contact_surname.setText(contact!!.surname)
|
|
contact_source.text = contact!!.source
|
|
|
|
contact!!.phoneNumbers.forEachIndexed { index, number ->
|
|
var numberHolder = contact_numbers_holder.getChildAt(index)
|
|
if (numberHolder == null) {
|
|
numberHolder = layoutInflater.inflate(R.layout.item_phone_number, contact_numbers_holder, false)
|
|
contact_numbers_holder.addView(numberHolder)
|
|
}
|
|
|
|
(numberHolder as? ViewGroup)?.apply {
|
|
contact_number.setText(number.value)
|
|
contact_number_type.setText(getPhoneNumberTextId(number.type))
|
|
}
|
|
}
|
|
|
|
contact!!.emails.forEachIndexed { index, email ->
|
|
var emailHolder = contact_emails_holder.getChildAt(index)
|
|
if (emailHolder == null) {
|
|
emailHolder = layoutInflater.inflate(R.layout.item_email, contact_emails_holder, false)
|
|
contact_emails_holder.addView(emailHolder)
|
|
}
|
|
|
|
(emailHolder as? ViewGroup)?.apply {
|
|
contact_email.setText(email.value)
|
|
contact_email_type.setText(getEmailTextId(email.type))
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun setupNewContact() {
|
|
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
|
|
supportActionBar?.title = resources.getString(R.string.new_contact)
|
|
contact = Contact(0, "", "", "", "", ArrayList(), ArrayList(), "")
|
|
}
|
|
|
|
private fun applyPhotoPlaceholder() {
|
|
val placeholder = resources.getColoredBitmap(R.drawable.ic_person, config.primaryColor.getContrastColor())
|
|
val padding = resources.getDimension(R.dimen.activity_margin).toInt()
|
|
contact_photo.setPadding(padding, padding, padding, padding)
|
|
contact_photo.setImageBitmap(placeholder)
|
|
}
|
|
|
|
private fun saveContact() {
|
|
contact!!.apply {
|
|
firstName = contact_first_name.value
|
|
middleName = contact_middle_name.value
|
|
surname = contact_surname.value
|
|
|
|
if (ContactsHelper(this@ContactActivity).updateContact(this)) {
|
|
finish()
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun addNewPhoneNumberField() {
|
|
val view = layoutInflater.inflate(R.layout.item_phone_number, contact_numbers_holder, false)
|
|
updateTextColors(view as ViewGroup)
|
|
view.contact_number_type.setText(getPhoneNumberTextId(DEFAULT_PHONE_NUMBER_TYPE))
|
|
contact_numbers_holder.addView(view)
|
|
}
|
|
|
|
private fun addNewEmailField() {
|
|
val view = layoutInflater.inflate(R.layout.item_email, contact_emails_holder, false)
|
|
updateTextColors(view as ViewGroup)
|
|
view.contact_email_type.setText(getEmailTextId(DEFAULT_EMAIL_TYPE))
|
|
contact_emails_holder.addView(view)
|
|
}
|
|
|
|
private fun deleteContact() {
|
|
ConfirmationDialog(this) {
|
|
ContactsHelper(this).deleteContact(contact!!)
|
|
finish()
|
|
}
|
|
}
|
|
|
|
private fun showAccountSourcePicker() {
|
|
|
|
}
|
|
|
|
private fun trySendSMS() {
|
|
val numbers = contact!!.phoneNumbers
|
|
if (numbers.size == 1) {
|
|
sendSMSIntent(numbers.first().value)
|
|
} else if (numbers.size > 1) {
|
|
val items = ArrayList<RadioItem>()
|
|
numbers.forEachIndexed { index, phoneNumber ->
|
|
items.add(RadioItem(index, phoneNumber.value, phoneNumber.value))
|
|
}
|
|
|
|
RadioGroupDialog(this, items) {
|
|
sendSMSIntent(it as String)
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun trySendEmail() {
|
|
val emails = contact!!.emails
|
|
if (emails.size == 1) {
|
|
sendEmailIntent(emails.first().value)
|
|
} else if (emails.size > 1) {
|
|
val items = ArrayList<RadioItem>()
|
|
emails.forEachIndexed { index, email ->
|
|
items.add(RadioItem(index, email.value, email.value))
|
|
}
|
|
|
|
RadioGroupDialog(this, items) {
|
|
sendEmailIntent(it as String)
|
|
}
|
|
}
|
|
}
|
|
|
|
private fun getEmailTextId(type: Int) = when (type) {
|
|
ContactsContract.CommonDataKinds.Email.TYPE_HOME -> R.string.home
|
|
ContactsContract.CommonDataKinds.Email.TYPE_WORK -> R.string.work
|
|
ContactsContract.CommonDataKinds.Email.TYPE_MOBILE -> R.string.mobile
|
|
else -> R.string.other
|
|
}
|
|
|
|
private fun getPhoneNumberTextId(type: Int) = when (type) {
|
|
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE -> R.string.mobile
|
|
ContactsContract.CommonDataKinds.Phone.TYPE_HOME -> R.string.home
|
|
ContactsContract.CommonDataKinds.Phone.TYPE_WORK -> R.string.work
|
|
ContactsContract.CommonDataKinds.Phone.TYPE_MAIN -> R.string.main_number
|
|
ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK -> R.string.work_fax
|
|
ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME -> R.string.home_fax
|
|
ContactsContract.CommonDataKinds.Phone.TYPE_PAGER -> R.string.pager
|
|
else -> R.string.other
|
|
}
|
|
}
|