allow setting custom ringtone per contact

This commit is contained in:
tibbi
2021-02-14 17:52:43 +01:00
parent 8c488ba5ca
commit c6a2f2c14b
8 changed files with 80 additions and 17 deletions

View File

@ -57,7 +57,7 @@ android {
} }
dependencies { dependencies {
implementation 'com.simplemobiletools:commons:5.33.28' implementation 'com.simplemobiletools:commons:5.33.30'
implementation 'joda-time:joda-time:2.10.1' implementation 'joda-time:joda-time:2.10.1'
implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.5' implementation 'com.googlecode.ez-vcard:ez-vcard:0.10.5'
implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a' implementation 'com.github.tibbi:IndicatorFastScroll:08f512858a'

View File

@ -30,6 +30,7 @@ import com.simplemobiletools.contacts.pro.models.Contact
import java.util.* import java.util.*
abstract class ContactActivity : SimpleActivity() { abstract class ContactActivity : SimpleActivity() {
protected val PICK_RINGTONE_INTENT_ID = 1000
protected var contact: Contact? = null protected var contact: Contact? = null
protected var currentContactPhotoPath = "" protected var currentContactPhotoPath = ""

View File

@ -5,8 +5,8 @@ import android.content.ClipData
import android.content.ContentValues import android.content.ContentValues
import android.content.Intent import android.content.Intent
import android.graphics.Bitmap import android.graphics.Bitmap
import android.graphics.Color import android.media.AudioManager
import android.graphics.drawable.ColorDrawable import android.media.RingtoneManager
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.provider.ContactsContract.CommonDataKinds import android.provider.ContactsContract.CommonDataKinds
@ -20,6 +20,7 @@ import android.widget.ImageView
import android.widget.RelativeLayout import android.widget.RelativeLayout
import android.widget.TextView import android.widget.TextView
import com.simplemobiletools.commons.dialogs.RadioGroupDialog import com.simplemobiletools.commons.dialogs.RadioGroupDialog
import com.simplemobiletools.commons.dialogs.SelectAlarmSoundDialog
import com.simplemobiletools.commons.extensions.* import com.simplemobiletools.commons.extensions.*
import com.simplemobiletools.commons.helpers.* import com.simplemobiletools.commons.helpers.*
import com.simplemobiletools.commons.models.RadioItem import com.simplemobiletools.commons.models.RadioItem
@ -184,6 +185,7 @@ class EditContactActivity : ContactActivity() {
} }
setupTypePickers() setupTypePickers()
setupRingtone()
if (contact!!.photoUri.isEmpty() && contact!!.photo == null) { if (contact!!.photoUri.isEmpty() && contact!!.photo == null) {
showPhotoPlaceholder(contact_photo) showPhotoPlaceholder(contact_photo)
@ -194,7 +196,7 @@ class EditContactActivity : ContactActivity() {
val textColor = config.textColor val textColor = config.textColor
arrayOf(contact_name_image, contact_numbers_image, contact_emails_image, contact_addresses_image, contact_ims_image, contact_events_image, arrayOf(contact_name_image, contact_numbers_image, contact_emails_image, contact_addresses_image, contact_ims_image, contact_events_image,
contact_notes_image, contact_organization_image, contact_websites_image, contact_groups_image, contact_source_image).forEach { contact_notes_image, contact_ringtone_image, contact_organization_image, contact_websites_image, contact_groups_image, contact_source_image).forEach {
it.applyColorFilter(textColor) it.applyColorFilter(textColor)
} }
@ -380,6 +382,10 @@ class EditContactActivity : ContactActivity() {
val areNotesVisible = showFields and SHOW_NOTES_FIELD != 0 val areNotesVisible = showFields and SHOW_NOTES_FIELD != 0
contact_notes.beVisibleIf(areNotesVisible) contact_notes.beVisibleIf(areNotesVisible)
contact_notes_image.beVisibleIf(areNotesVisible) contact_notes_image.beVisibleIf(areNotesVisible)
val isRingtoneVisible = showFields and SHOW_RINGTONE_FIELD != 0
contact_ringtone.beVisibleIf(isRingtoneVisible)
contact_ringtone_image.beVisibleIf(isRingtoneVisible)
} }
private fun setupEditContact() { private fun setupEditContact() {
@ -480,6 +486,27 @@ class EditContactActivity : ContactActivity() {
contact_notes.setText(contact!!.notes) contact_notes.setText(contact!!.notes)
} }
private fun setupRingtone() {
contact_ringtone.setOnClickListener {
val currentRingtone = contact!!.ringtone ?: getDefaultAlarmSound(RingtoneManager.TYPE_RINGTONE).uri
SelectAlarmSoundDialog(this, currentRingtone, AudioManager.STREAM_RING, PICK_RINGTONE_INTENT_ID, RingtoneManager.TYPE_RINGTONE, true,
onAlarmPicked = {
contact!!.ringtone = it?.uri
contact_ringtone.text = it?.title
}, onAlarmSoundDeleted = {}
)
}
val ringtone = contact!!.ringtone
if (ringtone != null && ringtone.isNotEmpty()) {
val contactRingtone = RingtoneManager.getRingtone(this, Uri.parse(ringtone))
contact_ringtone.text = contactRingtone.getTitle(this)
} else {
val default = getDefaultAlarmSound(RingtoneManager.TYPE_RINGTONE)
contact_ringtone.text = default.title
}
}
private fun setupOrganization() { private fun setupOrganization() {
contact_organization_company.setText(contact!!.organization.company) contact_organization_company.setText(contact!!.organization.company)
contact_organization_job_position.setText(contact!!.organization.jobPosition) contact_organization_job_position.setText(contact!!.organization.jobPosition)

View File

@ -570,13 +570,21 @@ class ViewContactActivity : ContactActivity() {
} }
private fun setupRingtone() { private fun setupRingtone() {
val ringtone = contact!!.ringtone if (showFields and SHOW_RINGTONE_FIELD != 0) {
if (ringtone != null && ringtone.isNotEmpty() && showFields and SHOW_RINGTONE != 0) {
val contactRingtone = RingtoneManager.getRingtone(this, Uri.parse(ringtone))
contact_ringtone.text = contactRingtone.getTitle(this)
contact_ringtone_image.beVisible() contact_ringtone_image.beVisible()
contact_ringtone.beVisible() contact_ringtone.beVisible()
contact_ringtone.setOnClickListener { }
val ringtone = contact!!.ringtone
if (ringtone != null && ringtone.isNotEmpty()) {
val contactRingtone = RingtoneManager.getRingtone(this, Uri.parse(ringtone))
val ringtoneTitle = contactRingtone.getTitle(this)
contact_ringtone.text = ringtoneTitle
} else {
val default = getDefaultAlarmSound(RingtoneManager.TYPE_RINGTONE)
contact_ringtone.text = default.title
}
contact_ringtone.copyOnLongClick(contact_ringtone.text.toString())
} else { } else {
contact_ringtone_image.beGone() contact_ringtone_image.beGone()
contact_ringtone.beGone() contact_ringtone.beGone()

View File

@ -30,7 +30,7 @@ class ManageVisibleFieldsDialog(val activity: BaseSimpleActivity) {
put(SHOW_WEBSITES_FIELD, R.id.manage_visible_fields_websites) put(SHOW_WEBSITES_FIELD, R.id.manage_visible_fields_websites)
put(SHOW_GROUPS_FIELD, R.id.manage_visible_fields_groups) put(SHOW_GROUPS_FIELD, R.id.manage_visible_fields_groups)
put(SHOW_CONTACT_SOURCE_FIELD, R.id.manage_visible_fields_contact_source) put(SHOW_CONTACT_SOURCE_FIELD, R.id.manage_visible_fields_contact_source)
put(SHOW_RINGTONE, R.id.manage_ringtone) put(SHOW_RINGTONE_FIELD, R.id.manage_ringtone)
} }
val showContactFields = activity.config.showContactFields val showContactFields = activity.config.showContactFields

View File

@ -93,7 +93,7 @@ const val SHOW_CONTACT_SOURCE_FIELD = 4096
const val SHOW_WEBSITES_FIELD = 8192 const val SHOW_WEBSITES_FIELD = 8192
const val SHOW_NICKNAME_FIELD = 16384 const val SHOW_NICKNAME_FIELD = 16384
const val SHOW_IMS_FIELD = 32768 const val SHOW_IMS_FIELD = 32768
const val SHOW_RINGTONE = 65536 const val SHOW_RINGTONE_FIELD = 65536
const val DEFAULT_EMAIL_TYPE = CommonDataKinds.Email.TYPE_HOME const val DEFAULT_EMAIL_TYPE = CommonDataKinds.Email.TYPE_HOME
const val DEFAULT_PHONE_NUMBER_TYPE = CommonDataKinds.Phone.TYPE_MOBILE const val DEFAULT_PHONE_NUMBER_TYPE = CommonDataKinds.Phone.TYPE_MOBILE

View File

@ -1070,11 +1070,12 @@ class ContactsHelper(val context: Context) {
} }
} }
// favorite // favorite, ringtone
try { try {
val uri = Uri.withAppendedPath(Contacts.CONTENT_URI, contact.contactId.toString()) val uri = Uri.withAppendedPath(Contacts.CONTENT_URI, contact.contactId.toString())
val contentValues = ContentValues(1) val contentValues = ContentValues(2)
contentValues.put(Contacts.STARRED, contact.starred) contentValues.put(Contacts.STARRED, contact.starred)
contentValues.put(Contacts.CUSTOM_RINGTONE, contact.ringtone)
context.contentResolver.update(uri, contentValues, null, null) context.contentResolver.update(uri, contentValues, null, null)
} catch (e: Exception) { } catch (e: Exception) {
context.showErrorToast(e) context.showErrorToast(e)
@ -1336,12 +1337,13 @@ class ContactsHelper(val context: Context) {
addFullSizePhoto(rawId, fullSizePhotoData) addFullSizePhoto(rawId, fullSizePhotoData)
} }
// favorite // favorite, ringtone
val userId = getRealContactId(rawId) val userId = getRealContactId(rawId)
if (userId != 0 && contact.starred == 1) { if (userId != 0) {
val uri = Uri.withAppendedPath(Contacts.CONTENT_URI, userId.toString()) val uri = Uri.withAppendedPath(Contacts.CONTENT_URI, userId.toString())
val contentValues = ContentValues(1) val contentValues = ContentValues(2)
contentValues.put(Contacts.STARRED, contact.starred) contentValues.put(Contacts.STARRED, contact.starred)
contentValues.put(Contacts.CUSTOM_RINGTONE, contact.ringtone)
context.contentResolver.update(uri, contentValues, null, null) context.contentResolver.update(uri, contentValues, null, null)
} }

View File

@ -384,6 +384,31 @@
android:textCursorDrawable="@null" android:textCursorDrawable="@null"
android:textSize="@dimen/bigger_text_size" /> android:textSize="@dimen/bigger_text_size" />
<ImageView
android:id="@+id/contact_ringtone_image"
android:layout_width="@dimen/contact_icons_size"
android:layout_height="@dimen/contact_icons_size"
android:layout_alignTop="@+id/contact_ringtone"
android:layout_marginStart="@dimen/normal_margin"
android:paddingTop="@dimen/medium_margin"
android:paddingEnd="@dimen/small_margin"
android:paddingBottom="@dimen/medium_margin"
android:src="@drawable/ic_bell_vector" />
<com.simplemobiletools.commons.views.MyTextView
android:id="@+id/contact_ringtone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/contact_notes"
android:layout_centerVertical="true"
android:layout_marginTop="@dimen/normal_margin"
android:layout_marginEnd="@dimen/activity_margin"
android:layout_toEndOf="@+id/contact_notes_image"
android:background="?attr/selectableItemBackground"
android:gravity="center_vertical"
android:minHeight="@dimen/contact_icons_size"
android:textSize="@dimen/bigger_text_size" />
<ImageView <ImageView
android:id="@+id/contact_organization_image" android:id="@+id/contact_organization_image"
android:layout_width="@dimen/contact_icons_size" android:layout_width="@dimen/contact_icons_size"
@ -399,7 +424,7 @@
android:id="@+id/contact_organization_company" android:id="@+id/contact_organization_company"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/contact_notes" android:layout_below="@+id/contact_ringtone"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginTop="@dimen/normal_margin" android:layout_marginTop="@dimen/normal_margin"
android:layout_marginEnd="@dimen/activity_margin" android:layout_marginEnd="@dimen/activity_margin"