diff --git a/app/src/main/kotlin/org/fossify/contacts/activities/EditContactActivity.kt b/app/src/main/kotlin/org/fossify/contacts/activities/EditContactActivity.kt
index bb0e0a60c..849f32734 100644
--- a/app/src/main/kotlin/org/fossify/contacts/activities/EditContactActivity.kt
+++ b/app/src/main/kotlin/org/fossify/contacts/activities/EditContactActivity.kt
@@ -50,6 +50,8 @@ import org.fossify.contacts.helpers.ADD_NEW_CONTACT_NUMBER
import org.fossify.contacts.helpers.IS_FROM_SIMPLE_CONTACTS
import org.fossify.contacts.helpers.KEY_EMAIL
import org.fossify.contacts.helpers.KEY_NAME
+import java.util.LinkedList
+import java.util.Locale
class EditContactActivity : ContactActivity() {
companion object {
@@ -609,19 +611,46 @@ class EditContactActivity : ContactActivity() {
}
private fun setupAddresses() {
+ if (binding.contactAddressesHolder.childCount > 0 &&
+ (binding.contactAddressesHolder.getChildAt(0).id == R.id.contact_structured_address_holder) !=
+ (config.showContactFields and SHOW_STRUCTURED_ADDRESSES_FIELD != 0)) {
+ // Config was changed with edit view loaded
+ binding.contactAddressesHolder.removeAllViews()
+ }
contact!!.addresses.forEachIndexed { index, address ->
- val addressHolderView = binding.contactAddressesHolder.getChildAt(index)
- val addressHolder = if (addressHolderView == null) {
- ItemEditAddressBinding.inflate(layoutInflater, binding.contactAddressesHolder, false).apply {
- binding.contactAddressesHolder.addView(root)
+ var addressHolderView = binding.contactAddressesHolder.getChildAt(index)
+ if (config.showContactFields and SHOW_STRUCTURED_ADDRESSES_FIELD != 0) {
+ var structuredAddressHolder = if (addressHolderView == null) {
+ ItemEditStructuredAddressBinding.inflate(layoutInflater, binding.contactAddressesHolder, false).apply {
+ binding.contactAddressesHolder.addView(root)
+ }
+ } else {
+ ItemEditStructuredAddressBinding.bind(addressHolderView)
+ }
+
+ structuredAddressHolder.apply {
+ contactStreet.setText(address.street)
+ contactNeighborhood.setText(address.neighborhood)
+ contactCity.setText(address.city)
+ contactPostcode.setText(address.postcode)
+ contactPobox.setText(address.pobox)
+ contactRegion.setText(address.region)
+ contactCountry.setText(address.country)
+ setupAddressTypePicker(contactStructuredAddressType, address.type, address.label)
}
} else {
- ItemEditAddressBinding.bind(addressHolderView)
- }
+ val addressHolder = if (addressHolderView == null) {
+ ItemEditAddressBinding.inflate(layoutInflater, binding.contactAddressesHolder, false).apply {
+ binding.contactAddressesHolder.addView(root)
+ }
+ } else {
+ ItemEditAddressBinding.bind(addressHolderView)
+ }
- addressHolder.apply {
- contactAddress.setText(address.value)
- setupAddressTypePicker(contactAddressType, address.type, address.label)
+ addressHolder.apply {
+ contactAddress.setText(address.value)
+ setupAddressTypePicker(contactAddressType, address.type, address.label)
+ }
}
}
}
@@ -828,10 +857,7 @@ class EditContactActivity : ContactActivity() {
}
if (contact!!.addresses.isEmpty()) {
- val addressHolder = ItemEditAddressBinding.bind(binding.contactAddressesHolder.getChildAt(0))
- addressHolder.contactAddressType.apply {
- setupAddressTypePicker(this, DEFAULT_ADDRESS_TYPE, "")
- }
+ addNewAddressField()
}
if (contact!!.IMs.isEmpty()) {
@@ -1188,13 +1214,44 @@ class EditContactActivity : ContactActivity() {
val addresses = ArrayList
()
val addressesCount = binding.contactAddressesHolder.childCount
for (i in 0 until addressesCount) {
- val addressHolder = ItemEditAddressBinding.bind(binding.contactAddressesHolder.getChildAt(i))
- val address = addressHolder.contactAddress.value
- val addressType = getAddressTypeId(addressHolder.contactAddressType.value)
- val addressLabel = if (addressType == StructuredPostal.TYPE_CUSTOM) addressHolder.contactAddressType.value else ""
+ val addressHolderView = binding.contactAddressesHolder.getChildAt(i)
+ // Don't rely on config.showContactFields since that might just have changed
+ if (addressHolderView.id == R.id.contact_structured_address_holder) {
+ val structuredAddressHolder = ItemEditStructuredAddressBinding.bind(addressHolderView)
+ val street = structuredAddressHolder.contactStreet.value
+ val neighborhood = structuredAddressHolder.contactNeighborhood.value
+ val city = structuredAddressHolder.contactCity.value
+ val postcode = structuredAddressHolder.contactPostcode.value
+ val pobox = structuredAddressHolder.contactPobox.value
+ val region = structuredAddressHolder.contactRegion.value
+ val country = structuredAddressHolder.contactCountry.value
+
+ /* from DAVdroid */
+ val lineStreet = arrayOf(street, pobox, neighborhood).filter { it.isNotEmpty() }.joinToString(" ")
+ val lineLocality = arrayOf(postcode, city).filter { it.isNotEmpty() }.joinToString(" ")
+ val lines = LinkedList()
+ if (lineStreet.isNotEmpty()) lines += lineStreet
+ if (lineLocality.isNotEmpty()) lines += lineLocality
+ if (region.isNotEmpty()) lines += region
+ if (country.isNotEmpty()) lines += country.uppercase(Locale.getDefault())
+ val address = lines.joinToString("\n")
+ val addressType = getAddressTypeId(structuredAddressHolder.contactStructuredAddressType.value)
+ val addressLabel = if (addressType == StructuredPostal.TYPE_CUSTOM)
+ structuredAddressHolder.contactStructuredAddressType.value else ""
+
+ if (address.isNotEmpty()) {
+ addresses.add(Address(address, addressType, addressLabel, country, region, city, postcode, pobox,
+ street, neighborhood))
+ }
+ } else {
+ val addressHolder = ItemEditAddressBinding.bind(addressHolderView)
+ val address = addressHolder.contactAddress.value
+ val addressType = getAddressTypeId(addressHolder.contactAddressType.value)
+ val addressLabel = if (addressType == StructuredPostal.TYPE_CUSTOM) addressHolder.contactAddressType.value else ""
- if (address.isNotEmpty()) {
- addresses.add(Address(address, addressType, addressLabel))
+ if (address.isNotEmpty()) {
+ addresses.add(Address(address, addressType, addressLabel, "", "", "", "", "", "", ""))
+ }
}
}
return addresses
@@ -1375,13 +1432,25 @@ class EditContactActivity : ContactActivity() {
}
private fun addNewAddressField() {
- val addressHolder = ItemEditAddressBinding.inflate(layoutInflater, binding.contactAddressesHolder, false)
- updateTextColors(addressHolder.root)
- setupAddressTypePicker(addressHolder.contactAddressType, DEFAULT_ADDRESS_TYPE, "")
- binding.contactAddressesHolder.addView(addressHolder.root)
- binding.contactAddressesHolder.onGlobalLayout {
- addressHolder.contactAddress.requestFocus()
- showKeyboard(addressHolder.contactAddress)
+ if (config.showContactFields and SHOW_STRUCTURED_ADDRESSES_FIELD != 0) {
+ val structutedAddressHolder = ItemEditStructuredAddressBinding.inflate(layoutInflater,
+ binding.contactAddressesHolder, false)
+ updateTextColors(structutedAddressHolder.root)
+ setupAddressTypePicker(structutedAddressHolder.contactStructuredAddressType, DEFAULT_ADDRESS_TYPE, "")
+ binding.contactAddressesHolder.addView(structutedAddressHolder.root)
+ binding.contactAddressesHolder.onGlobalLayout {
+ structutedAddressHolder.contactStreet.requestFocus()
+ showKeyboard(structutedAddressHolder.contactStreet)
+ }
+ } else {
+ val addressHolder = ItemEditAddressBinding.inflate(layoutInflater, binding.contactAddressesHolder, false)
+ updateTextColors(addressHolder.root)
+ setupAddressTypePicker(addressHolder.contactAddressType, DEFAULT_ADDRESS_TYPE, "")
+ binding.contactAddressesHolder.addView(addressHolder.root)
+ binding.contactAddressesHolder.onGlobalLayout {
+ addressHolder.contactAddress.requestFocus()
+ showKeyboard(addressHolder.contactAddress)
+ }
}
}
@@ -1473,8 +1542,15 @@ class EditContactActivity : ContactActivity() {
private fun parseAddress(contentValues: ContentValues) {
val type = contentValues.getAsInteger(StructuredPostal.DATA2) ?: DEFAULT_ADDRESS_TYPE
val addressValue = contentValues.getAsString(StructuredPostal.DATA4)
- ?: contentValues.getAsString(StructuredPostal.DATA1) ?: return
- val address = Address(addressValue, type, "")
+ ?: contentValues.getAsString(StructuredPostal.DATA1) ?: return
+ val country = contentValues.getAsString(StructuredPostal.COUNTRY)
+ val region = contentValues.getAsString(StructuredPostal.REGION)
+ val city = contentValues.getAsString(StructuredPostal.CITY)
+ val postcode = contentValues.getAsString(StructuredPostal.POSTCODE)
+ val pobox = contentValues.getAsString(StructuredPostal.POBOX)
+ val street = contentValues.getAsString(StructuredPostal.STREET)
+ val neighborhood = contentValues.getAsString(StructuredPostal.NEIGHBORHOOD)
+ val address = Address(addressValue, type, "", country, region, city, postcode, pobox, street, neighborhood)
contact!!.addresses.add(address)
}
diff --git a/app/src/main/kotlin/org/fossify/contacts/dialogs/ManageVisibleFieldsDialog.kt b/app/src/main/kotlin/org/fossify/contacts/dialogs/ManageVisibleFieldsDialog.kt
index 773fefd98..6b8f27494 100644
--- a/app/src/main/kotlin/org/fossify/contacts/dialogs/ManageVisibleFieldsDialog.kt
+++ b/app/src/main/kotlin/org/fossify/contacts/dialogs/ManageVisibleFieldsDialog.kt
@@ -24,6 +24,7 @@ class ManageVisibleFieldsDialog(val activity: BaseSimpleActivity, val callback:
put(SHOW_EMAILS_FIELD, R.id.manage_visible_fields_emails)
put(SHOW_ADDRESSES_FIELD, R.id.manage_visible_fields_addresses)
put(SHOW_IMS_FIELD, R.id.manage_visible_fields_ims)
+ put(SHOW_STRUCTURED_ADDRESSES_FIELD, R.id.manage_visible_fields_structured_addresses)
put(SHOW_EVENTS_FIELD, R.id.manage_visible_fields_events)
put(SHOW_NOTES_FIELD, R.id.manage_visible_fields_notes)
put(SHOW_ORGANIZATION_FIELD, R.id.manage_visible_fields_organization)
diff --git a/app/src/main/kotlin/org/fossify/contacts/helpers/VcfExporter.kt b/app/src/main/kotlin/org/fossify/contacts/helpers/VcfExporter.kt
index 698f4161a..89208e19b 100644
--- a/app/src/main/kotlin/org/fossify/contacts/helpers/VcfExporter.kt
+++ b/app/src/main/kotlin/org/fossify/contacts/helpers/VcfExporter.kt
@@ -1,7 +1,6 @@
package org.fossify.contacts.helpers
import android.content.Context
-import android.net.Uri
import android.os.Build
import android.provider.ContactsContract.CommonDataKinds.Email
import android.provider.ContactsContract.CommonDataKinds.Event
@@ -9,6 +8,7 @@ import android.provider.ContactsContract.CommonDataKinds.Im
import android.provider.ContactsContract.CommonDataKinds.Phone
import android.provider.ContactsContract.CommonDataKinds.StructuredPostal
import androidx.annotation.RequiresApi
+import androidx.core.net.toUri
import ezvcard.Ezvcard
import ezvcard.VCard
import ezvcard.VCardVersion
@@ -37,7 +37,7 @@ class VcfExporter {
contacts: ArrayList,
showExportingToast: Boolean,
version: VCardVersion = VCardVersion.V4_0,
- callback: (result: ExportResult) -> Unit
+ callback: (result: ExportResult) -> Unit,
) {
try {
if (outputStream == null) {
@@ -53,7 +53,13 @@ class VcfExporter {
for (contact in contacts) {
val card = VCard()
- val formattedName = arrayOf(contact.prefix, contact.firstName, contact.middleName, contact.surname, contact.suffix)
+ val formattedName = arrayOf(
+ contact.prefix,
+ contact.firstName,
+ contact.middleName,
+ contact.surname,
+ contact.suffix
+ )
.filter { it.isNotEmpty() }
.joinToString(separator = " ")
card.formattedName = FormattedName(formattedName)
@@ -110,7 +116,29 @@ class VcfExporter {
contact.addresses.forEach {
val address = Address()
- address.streetAddress = it.value
+ if (
+ listOf(
+ it.country,
+ it.region,
+ it.city,
+ it.postcode,
+ it.pobox,
+ it.street,
+ it.neighborhood
+ )
+ .map { it.isEmpty() }
+ .fold(false) { a, b -> a || b }
+ ) {
+ address.country = it.country
+ address.region = it.region
+ address.locality = it.city
+ address.postalCode = it.postcode
+ address.poBox = it.pobox
+ address.streetAddress = it.street
+ address.extendedAddress = it.neighborhood
+ } else {
+ address.streetAddress = it.value
+ }
address.parameters.addType(getAddressTypeLabel(it.type, it.label))
card.addAddress(address)
}
@@ -147,7 +175,8 @@ class VcfExporter {
}
try {
- val inputStream = context.contentResolver.openInputStream(Uri.parse(contact.photoUri))
+ val inputStream =
+ context.contentResolver.openInputStream(contact.photoUri.toUri())
if (inputStream != null) {
val photoByteArray = inputStream.readBytes()
diff --git a/app/src/main/kotlin/org/fossify/contacts/helpers/VcfImporter.kt b/app/src/main/kotlin/org/fossify/contacts/helpers/VcfImporter.kt
index dbfa1e121..041920b86 100644
--- a/app/src/main/kotlin/org/fossify/contacts/helpers/VcfImporter.kt
+++ b/app/src/main/kotlin/org/fossify/contacts/helpers/VcfImporter.kt
@@ -17,7 +17,13 @@ import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.helpers.ContactsHelper
import org.fossify.commons.helpers.DEFAULT_MIMETYPE
import org.fossify.commons.models.PhoneNumber
-import org.fossify.commons.models.contacts.*
+import org.fossify.commons.models.contacts.Address
+import org.fossify.commons.models.contacts.Contact
+import org.fossify.commons.models.contacts.Email
+import org.fossify.commons.models.contacts.Event
+import org.fossify.commons.models.contacts.Group
+import org.fossify.commons.models.contacts.IM
+import org.fossify.commons.models.contacts.Organization
import org.fossify.contacts.activities.SimpleActivity
import org.fossify.contacts.extensions.getCachePhotoUri
import org.fossify.contacts.helpers.VcfImporter.ImportResult.IMPORT_FAIL
@@ -59,15 +65,26 @@ class VcfImporter(val activity: SimpleActivity) {
val phoneNumbers = ArrayList()
ezContact.telephoneNumbers.forEach {
val number = it.text
- val type = getPhoneNumberTypeId(it.types.firstOrNull()?.value ?: MOBILE, it.types.getOrNull(1)?.value)
+ val type = getPhoneNumberTypeId(
+ type = it.types.firstOrNull()?.value ?: MOBILE,
+ subtype = it.types.getOrNull(1)?.value
+ )
val label = if (type == Phone.TYPE_CUSTOM) {
it.types.firstOrNull()?.value ?: ""
} else {
""
}
- val preferred = getPreferredValue(it.types.lastOrNull()?.value) == 1
- phoneNumbers.add(PhoneNumber(number, type, label, number.normalizePhoneNumber(), preferred))
+ val preferred = getPreferredValue(it.types.lastOrNull()?.value) == 1
+ phoneNumbers.add(
+ PhoneNumber(
+ value = number,
+ type = type,
+ label = label,
+ normalizedNumber = number.normalizePhoneNumber(),
+ isPrimary = preferred
+ )
+ )
}
val emails = ArrayList()
@@ -94,6 +111,13 @@ class VcfImporter(val activity: SimpleActivity) {
} else {
""
}
+ val country = it.country ?: ""
+ val region = it.region ?: ""
+ val city = it.locality ?: ""
+ val postcode = it.postalCode ?: ""
+ val pobox = it.poBox ?: ""
+ val street = it.streetAddress ?: ""
+ val neighborhood = it.extendedAddress ?: ""
if (it.locality?.isNotEmpty() == true) {
address += " ${it.locality} "
@@ -115,27 +139,51 @@ class VcfImporter(val activity: SimpleActivity) {
}
address = address.trim()
-
- if (address.isNotEmpty()) {
- addresses.add(Address(address, type, label))
+ if (address.isNotEmpty() == true) {
+ addresses.add(
+ Address(
+ value = address,
+ type = type,
+ label = label,
+ country = country,
+ region = region,
+ city = city,
+ postcode = postcode,
+ pobox = pobox,
+ street = street,
+ neighborhood = neighborhood
+ )
+ )
}
}
val events = ArrayList()
ezContact.anniversaries.forEach { anniversary ->
val event = if (anniversary.date != null) {
- Event(formatDateToDayCode(anniversary.date), CommonDataKinds.Event.TYPE_ANNIVERSARY)
+ Event(
+ formatDateToDayCode(anniversary.date),
+ CommonDataKinds.Event.TYPE_ANNIVERSARY
+ )
} else {
- Event(formatPartialDateToDayCode(anniversary.partialDate), CommonDataKinds.Event.TYPE_ANNIVERSARY)
+ Event(
+ formatPartialDateToDayCode(anniversary.partialDate),
+ CommonDataKinds.Event.TYPE_ANNIVERSARY
+ )
}
events.add(event)
}
ezContact.birthdays.forEach { birthday ->
val event = if (birthday.date != null) {
- Event(formatDateToDayCode(birthday.date), CommonDataKinds.Event.TYPE_BIRTHDAY)
+ Event(
+ formatDateToDayCode(birthday.date),
+ CommonDataKinds.Event.TYPE_BIRTHDAY
+ )
} else {
- Event(formatPartialDateToDayCode(birthday.partialDate), CommonDataKinds.Event.TYPE_BIRTHDAY)
+ Event(
+ formatPartialDateToDayCode(birthday.partialDate),
+ CommonDataKinds.Event.TYPE_BIRTHDAY
+ )
}
events.add(event)
}
@@ -165,7 +213,10 @@ class VcfImporter(val activity: SimpleActivity) {
val IMs = ArrayList()
ezContact.impps.forEach {
val typeString = it.uri.scheme
- val value = URLDecoder.decode(it.uri.toString().substring(it.uri.scheme.length + 1), "UTF-8")
+ val value = URLDecoder.decode(
+ it.uri.toString().substring(it.uri.scheme.length + 1),
+ "UTF-8"
+ )
val type = when {
it.isAim -> Im.PROTOCOL_AIM
it.isYahoo -> Im.PROTOCOL_YAHOO
@@ -178,18 +229,45 @@ class VcfImporter(val activity: SimpleActivity) {
else -> Im.PROTOCOL_CUSTOM
}
- val label = if (type == Im.PROTOCOL_CUSTOM) URLDecoder.decode(typeString, "UTF-8") else ""
+ val label = if (type == Im.PROTOCOL_CUSTOM) URLDecoder.decode(
+ typeString,
+ "UTF-8"
+ ) else ""
val IM = IM(value, type, label)
IMs.add(IM)
}
val contact = Contact(
- 0, prefix, firstName, middleName, surname, suffix, nickname, photoUri, phoneNumbers, emails, addresses, events,
- targetContactSource, starred, contactId, thumbnailUri, photo, notes, groups, organization, websites, IMs, DEFAULT_MIMETYPE, ringtone
+ 0,
+ prefix,
+ firstName,
+ middleName,
+ surname,
+ suffix,
+ nickname,
+ photoUri,
+ phoneNumbers,
+ emails,
+ addresses,
+ events,
+ targetContactSource,
+ starred,
+ contactId,
+ thumbnailUri,
+ photo,
+ notes,
+ groups,
+ organization,
+ websites,
+ IMs,
+ DEFAULT_MIMETYPE,
+ ringtone
)
// if there is no N and ORG fields at the given contact, only FN, treat it as an organization
- if (contact.getNameToDisplay().isEmpty() && contact.organization.isEmpty() && ezContact.formattedName?.value?.isNotEmpty() == true) {
+ if (contact.getNameToDisplay()
+ .isEmpty() && contact.organization.isEmpty() && ezContact.formattedName?.value?.isNotEmpty() == true
+ ) {
contact.organization.company = ezContact.formattedName.value
contact.mimetype = CommonDataKinds.Organization.CONTENT_ITEM_TYPE
}
@@ -253,32 +331,33 @@ class VcfImporter(val activity: SimpleActivity) {
return groups
}
- private fun getPhoneNumberTypeId(type: String, subtype: String?) = when (type.uppercase(Locale.getDefault())) {
- CELL -> Phone.TYPE_MOBILE
- HOME -> {
- if (subtype?.uppercase(Locale.getDefault()) == FAX) {
- Phone.TYPE_FAX_HOME
- } else {
- Phone.TYPE_HOME
+ private fun getPhoneNumberTypeId(type: String, subtype: String?) =
+ when (type.uppercase(Locale.getDefault())) {
+ CELL -> Phone.TYPE_MOBILE
+ HOME -> {
+ if (subtype?.uppercase(Locale.getDefault()) == FAX) {
+ Phone.TYPE_FAX_HOME
+ } else {
+ Phone.TYPE_HOME
+ }
}
- }
- WORK -> {
- if (subtype?.uppercase(Locale.getDefault()) == FAX) {
- Phone.TYPE_FAX_WORK
- } else {
- Phone.TYPE_WORK
+ WORK -> {
+ if (subtype?.uppercase(Locale.getDefault()) == FAX) {
+ Phone.TYPE_FAX_WORK
+ } else {
+ Phone.TYPE_WORK
+ }
}
- }
- MAIN -> Phone.TYPE_MAIN
- WORK_FAX -> Phone.TYPE_FAX_WORK
- HOME_FAX -> Phone.TYPE_FAX_HOME
- FAX -> Phone.TYPE_FAX_WORK
- PAGER -> Phone.TYPE_PAGER
- OTHER -> Phone.TYPE_OTHER
- else -> Phone.TYPE_CUSTOM
- }
+ MAIN -> Phone.TYPE_MAIN
+ WORK_FAX -> Phone.TYPE_FAX_WORK
+ HOME_FAX -> Phone.TYPE_FAX_HOME
+ FAX -> Phone.TYPE_FAX_WORK
+ PAGER -> Phone.TYPE_PAGER
+ OTHER -> Phone.TYPE_OTHER
+ else -> Phone.TYPE_CUSTOM
+ }
private fun getEmailTypeId(type: String) = when (type.uppercase(Locale.getDefault())) {
HOME -> CommonDataKinds.Email.TYPE_HOME
diff --git a/app/src/main/res/layout/activity_edit_contact.xml b/app/src/main/res/layout/activity_edit_contact.xml
index 5b7b260dd..99482f3b6 100644
--- a/app/src/main/res/layout/activity_edit_contact.xml
+++ b/app/src/main/res/layout/activity_edit_contact.xml
@@ -278,8 +278,6 @@
android:layout_toEndOf="@+id/contact_name_image"
android:orientation="vertical">
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7c4a7c8c5..4fc886e5f 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -2,6 +2,13 @@
Contacts
Address
+ Street
+ Appartment or suite number
+ City
+ Postal code
+ Post office box
+ State
+ Country
Inserting…
Updating…
Phone storage
@@ -82,6 +89,7 @@
Phone numbers
Emails
Addresses
+ Structured addresses (edit mode)
Events (birthdays, anniversaries)
Organization
Websites
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 59e64e4a5..ada127e41 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -16,7 +16,7 @@ indicatorfastscroll = "4524cd0b61"
#Room
room = "2.7.1"
#Fossify
-commons = "2.0.3"
+commons = "3.0.0"
#Gradle
gradlePlugins-agp = "8.10.1"
#build