Added setting to choose wether to save new contact to default or app sync account + fixed contact sip address update
This commit is contained in:
parent
88befd40ac
commit
c28f2373d9
8 changed files with 51 additions and 12 deletions
|
@ -29,8 +29,10 @@ import java.io.ByteArrayOutputStream
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import org.linphone.LinphoneApplication.Companion.coreContext
|
import org.linphone.LinphoneApplication.Companion.coreContext
|
||||||
import org.linphone.LinphoneApplication.Companion.corePreferences
|
import org.linphone.LinphoneApplication.Companion.corePreferences
|
||||||
|
import org.linphone.R
|
||||||
import org.linphone.contact.*
|
import org.linphone.contact.*
|
||||||
import org.linphone.core.tools.Log
|
import org.linphone.core.tools.Log
|
||||||
|
import org.linphone.utils.AppUtils
|
||||||
import org.linphone.utils.ImageUtils
|
import org.linphone.utils.ImageUtils
|
||||||
import org.linphone.utils.PermissionHelper
|
import org.linphone.utils.PermissionHelper
|
||||||
|
|
||||||
|
@ -82,7 +84,11 @@ class ContactEditorViewModel(val c: Contact?) : ViewModel(), ContactViewModelInt
|
||||||
created = true
|
created = true
|
||||||
contact = if (PermissionHelper.get().hasWriteContactsPermission()) {
|
contact = if (PermissionHelper.get().hasWriteContactsPermission()) {
|
||||||
// Store native contact in default sync account
|
// Store native contact in default sync account
|
||||||
NativeContact(NativeContactEditor.createAndroidContact().toString())
|
if (corePreferences.storeCreatedContactsInAppSyncAccount) {
|
||||||
|
NativeContact(NativeContactEditor.createAndroidContact(AppUtils.getString(R.string.sync_account_name), AppUtils.getString(R.string.sync_account_type)).toString())
|
||||||
|
} else {
|
||||||
|
NativeContact(NativeContactEditor.createAndroidContact(null, null).toString())
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Contact()
|
Contact()
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,7 @@ class ContactViewModel(private val c: Contact) : ErrorReportingViewModel(), Cont
|
||||||
private val contactsUpdatedListener = object : ContactsUpdatedListenerStub() {
|
private val contactsUpdatedListener = object : ContactsUpdatedListenerStub() {
|
||||||
override fun onContactUpdated(contact: Contact) {
|
override fun onContactUpdated(contact: Contact) {
|
||||||
if (c is NativeContact && contact is NativeContact && c.nativeId == contact.nativeId) {
|
if (c is NativeContact && contact is NativeContact && c.nativeId == contact.nativeId) {
|
||||||
Log.i("[Contact] $contact has changed")
|
Log.d("[Contact] $contact has changed")
|
||||||
updateNumbersAndAddresses()
|
updateNumbersAndAddresses()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,13 @@ class ContactsSettingsViewModel : GenericSettingsViewModel() {
|
||||||
}
|
}
|
||||||
val friendListSubscribe = MutableLiveData<Boolean>()
|
val friendListSubscribe = MutableLiveData<Boolean>()
|
||||||
|
|
||||||
|
val contactStorageAppSyncAccountListener = object : SettingListenerStub() {
|
||||||
|
override fun onBoolValueChanged(newValue: Boolean) {
|
||||||
|
prefs.storeCreatedContactsInAppSyncAccount = newValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val contactStorageAppSyncAccount = MutableLiveData<Boolean>()
|
||||||
|
|
||||||
val nativePresenceListener = object : SettingListenerStub() {
|
val nativePresenceListener = object : SettingListenerStub() {
|
||||||
override fun onBoolValueChanged(newValue: Boolean) {
|
override fun onBoolValueChanged(newValue: Boolean) {
|
||||||
if (newValue) {
|
if (newValue) {
|
||||||
|
@ -73,6 +80,7 @@ class ContactsSettingsViewModel : GenericSettingsViewModel() {
|
||||||
readContactsPermissionGranted.value = PermissionHelper.get().hasReadContactsPermission()
|
readContactsPermissionGranted.value = PermissionHelper.get().hasReadContactsPermission()
|
||||||
|
|
||||||
friendListSubscribe.value = core.isFriendListSubscriptionEnabled
|
friendListSubscribe.value = core.isFriendListSubscriptionEnabled
|
||||||
|
contactStorageAppSyncAccount.value = prefs.storeCreatedContactsInAppSyncAccount
|
||||||
nativePresence.value = prefs.storePresenceInNativeContact
|
nativePresence.value = prefs.storePresenceInNativeContact
|
||||||
showOrganization.value = prefs.displayOrganization
|
showOrganization.value = prefs.displayOrganization
|
||||||
launcherShortcuts.value = prefs.contactsShortcuts
|
launcherShortcuts.value = prefs.contactsShortcuts
|
||||||
|
|
|
@ -133,7 +133,7 @@ class NativeContact(val nativeId: String, private val lookupKey: String? = null)
|
||||||
val stringAddress = address.asStringUriOnly()
|
val stringAddress = address.asStringUriOnly()
|
||||||
if (!rawSipAddresses.contains(stringAddress)) {
|
if (!rawSipAddresses.contains(stringAddress)) {
|
||||||
sipAddresses.add(address)
|
sipAddresses.add(address)
|
||||||
rawSipAddresses.add(stringAddress)
|
rawSipAddresses.add(data1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE -> {
|
ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE -> {
|
||||||
|
|
|
@ -39,7 +39,7 @@ class NativeContactEditor(
|
||||||
private var syncAccountType: String? = null
|
private var syncAccountType: String? = null
|
||||||
) {
|
) {
|
||||||
companion object {
|
companion object {
|
||||||
fun createAndroidContact(accountName: String? = null, accountType: String? = null): Long {
|
fun createAndroidContact(accountName: String?, accountType: String?): Long {
|
||||||
val values = ContentValues()
|
val values = ContentValues()
|
||||||
values.put(RawContacts.ACCOUNT_NAME, accountName)
|
values.put(RawContacts.ACCOUNT_NAME, accountName)
|
||||||
values.put(RawContacts.ACCOUNT_TYPE, accountType)
|
values.put(RawContacts.ACCOUNT_TYPE, accountType)
|
||||||
|
@ -371,31 +371,40 @@ class NativeContactEditor(
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateLinphoneOrSipAddress(currentValue: String, sipAddress: String) {
|
private fun updateLinphoneOrSipAddress(currentValue: String, sipAddress: String) {
|
||||||
val update = ContentProviderOperation.newUpdate(contactUri)
|
val updateLegacy = ContentProviderOperation.newUpdate(contactUri)
|
||||||
.withSelection(
|
.withSelection(
|
||||||
sipAddressSelection,
|
"${ContactsContract.Data.CONTACT_ID} =? AND ${ContactsContract.Data.MIMETYPE} =? AND data1=?",
|
||||||
arrayOf(
|
arrayOf(
|
||||||
contact.nativeId,
|
contact.nativeId,
|
||||||
CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE,
|
|
||||||
AppUtils.getString(R.string.linphone_address_mime_type),
|
AppUtils.getString(R.string.linphone_address_mime_type),
|
||||||
currentValue
|
currentValue
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.withValue(
|
|
||||||
ContactsContract.Data.MIMETYPE,
|
|
||||||
AppUtils.getString(R.string.linphone_address_mime_type)
|
|
||||||
)
|
|
||||||
.withValue("data1", sipAddress) // value
|
.withValue("data1", sipAddress) // value
|
||||||
.withValue("data2", AppUtils.getString(R.string.app_name)) // summary
|
.withValue("data2", AppUtils.getString(R.string.app_name)) // summary
|
||||||
.withValue("data3", sipAddress) // detail
|
.withValue("data3", sipAddress) // detail
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
|
val update = ContentProviderOperation.newUpdate(contactUri)
|
||||||
|
.withSelection(
|
||||||
|
"${ContactsContract.Data.CONTACT_ID} =? AND ${ContactsContract.Data.MIMETYPE} =? AND data1=?",
|
||||||
|
arrayOf(
|
||||||
|
contact.nativeId,
|
||||||
|
CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE,
|
||||||
|
currentValue
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.withValue("data1", sipAddress) // value
|
||||||
|
.build()
|
||||||
|
|
||||||
|
addChanges(updateLegacy)
|
||||||
addChanges(update)
|
addChanges(update)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun removeLinphoneOrSipAddress(sipAddress: String) {
|
private fun removeLinphoneOrSipAddress(sipAddress: String) {
|
||||||
val delete = ContentProviderOperation.newDelete(contactUri)
|
val delete = ContentProviderOperation.newDelete(contactUri)
|
||||||
.withSelection(
|
.withSelection(
|
||||||
sipAddressSelection,
|
"${ContactsContract.Data.CONTACT_ID} =? AND (${ContactsContract.Data.MIMETYPE} =? OR ${ContactsContract.Data.MIMETYPE} =?) AND data1=?",
|
||||||
arrayOf(
|
arrayOf(
|
||||||
contact.nativeId,
|
contact.nativeId,
|
||||||
CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE,
|
CommonDataKinds.SipAddress.CONTENT_ITEM_TYPE,
|
||||||
|
|
|
@ -119,6 +119,12 @@ class CorePreferences constructor(private val context: Context) {
|
||||||
|
|
||||||
/* Contacts */
|
/* Contacts */
|
||||||
|
|
||||||
|
var storeCreatedContactsInAppSyncAccount: Boolean
|
||||||
|
get() = config.getBool("app", "store_contacts_in_app_sync_account", false)
|
||||||
|
set(value) {
|
||||||
|
config.setBool("app", "store_contacts_in_app_sync_account", value)
|
||||||
|
}
|
||||||
|
|
||||||
var storePresenceInNativeContact: Boolean
|
var storePresenceInNativeContact: Boolean
|
||||||
get() = config.getBool("app", "store_presence_in_native_contact", false)
|
get() = config.getBool("app", "store_presence_in_native_contact", false)
|
||||||
set(value) {
|
set(value) {
|
||||||
|
|
|
@ -72,6 +72,14 @@
|
||||||
linphone:checked="@={viewModel.friendListSubscribe}"
|
linphone:checked="@={viewModel.friendListSubscribe}"
|
||||||
linphone:enabled="@{viewModel.readContactsPermissionGranted}"/>
|
linphone:enabled="@{viewModel.readContactsPermissionGranted}"/>
|
||||||
|
|
||||||
|
<include
|
||||||
|
layout="@layout/settings_widget_switch"
|
||||||
|
linphone:title="@{@string/contacts_settings_contact_storage_title}"
|
||||||
|
linphone:subtitle="@{@string/contacts_settings_contact_storage_summary}"
|
||||||
|
linphone:listener="@{viewModel.contactStorageAppSyncAccountListener}"
|
||||||
|
linphone:checked="@={viewModel.contactStorageAppSyncAccount}"
|
||||||
|
linphone:enabled="@{viewModel.readContactsPermissionGranted}"/>
|
||||||
|
|
||||||
<include
|
<include
|
||||||
layout="@layout/settings_widget_switch"
|
layout="@layout/settings_widget_switch"
|
||||||
linphone:title="@{@string/contacts_settings_native_presence_title}"
|
linphone:title="@{@string/contacts_settings_native_presence_title}"
|
||||||
|
|
|
@ -430,6 +430,8 @@
|
||||||
<!-- Contacts settings -->
|
<!-- Contacts settings -->
|
||||||
<string name="contacts_settings_friendlist_subscribe_title">Friendlist subscribe</string>
|
<string name="contacts_settings_friendlist_subscribe_title">Friendlist subscribe</string>
|
||||||
<string name="contacts_settings_friendlist_subscribe_summary"></string>
|
<string name="contacts_settings_friendlist_subscribe_summary"></string>
|
||||||
|
<string name="contacts_settings_contact_storage_title">Store new contacts in the app sync account</string>
|
||||||
|
<string name="contacts_settings_contact_storage_summary">If enabled, contacts created via the app will be removed when the app will be uninstalled.</string>
|
||||||
<string name="contacts_settings_native_presence_title">Presence information in native contact</string>
|
<string name="contacts_settings_native_presence_title">Presence information in native contact</string>
|
||||||
<string name="contacts_settings_native_presence_summary">Inserting information shortcuts from the &appName; contact into native Android contacts</string>
|
<string name="contacts_settings_native_presence_summary">Inserting information shortcuts from the &appName; contact into native Android contacts</string>
|
||||||
<string name="contacts_settings_show_organization_title">Display contact organization</string>
|
<string name="contacts_settings_show_organization_title">Display contact organization</string>
|
||||||
|
|
Loading…
Reference in a new issue