mirror of
https://github.com/SimpleMobileTools/Simple-Contacts.git
synced 2025-06-05 21:59:27 +02:00
allow setting custom ringtone per contact
This commit is contained in:
@ -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'
|
||||||
|
@ -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 = ""
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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()
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
Reference in New Issue
Block a user