Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/bitfireAT/vcard4android.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRicki Hirner <hirner@bitfire.at>2021-08-20 16:46:41 +0300
committerRicki Hirner <hirner@bitfire.at>2021-08-22 15:33:30 +0300
commitc4f7abf79bf59d69f8c3ae8cf7a1c3286d26f545 (patch)
tree7bd79182112aaa06f50dd3d5181d27c43afa246d
parent3bc02c9dde4a22d6697e0adef1e82fcf714e0202 (diff)
Rename datarow package, tests
-rw-r--r--README.md2
-rw-r--r--build.gradle2
-rw-r--r--src/androidTest/assets/large.jpgbin0 -> 3519652 bytes
-rw-r--r--src/androidTest/assets/large.jpg.LICENSE2
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/LocaleNonWesternDigitsTest.kt15
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/EmailBuilderTest.kt117
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/EmailHandlerTest.kt (renamed from src/androidTest/java/at/bitfire/vcard4android/datarow/EmailHandlerTest.kt)16
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/EventBuilderTest.kt127
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/EventHandlerTest.kt98
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/ImBuilderTest.kt129
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/ImHandlerTest.kt138
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/NicknameBuilderTest.kt113
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/NicknameHandlerTest.kt79
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/NoteBuilderTest.kt38
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/NoteHandlerTest.kt30
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/OrganizationBuilderTest.kt (renamed from src/androidTest/java/at/bitfire/vcard4android/datarow/OrganizationBuilderTest.kt)6
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/OrganizationHandlerTest.kt74
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/PhoneBuilderTest.kt265
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/PhoneHandlerTest.kt204
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/PhotoBuilderTest.kt47
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/PhotoHandlerTest.kt35
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/RelationBuilderTest.kt275
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/RelationHandlerTest.kt194
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/SipAddressBuilderTest.kt106
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/SipAddressHandlerTest.kt84
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredNameBuilderTest.kt46
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredNameHandlerTest.kt51
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilderTest.kt109
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandlerTest.kt100
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/WebsiteBuilderTest.kt137
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/contactrow/WebsiteHandlerTest.kt113
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/datarow/NicknameBuilderTest.kt94
-rw-r--r--src/androidTest/java/at/bitfire/vcard4android/datarow/StructuredNameBuilderTest.kt45
-rw-r--r--src/main/java/at/bitfire/vcard4android/AndroidContact.kt4
-rw-r--r--src/main/java/at/bitfire/vcard4android/Contact.kt11
-rw-r--r--src/main/java/at/bitfire/vcard4android/ContactReader.kt1
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/ContactProcessor.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/ContactProcessor.kt)11
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/DataRowBuilder.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/DataRowBuilder.kt)3
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/DataRowHandler.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/DataRowHandler.kt)3
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/EmailBuilder.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/EmailBuilder.kt)11
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/EmailHandler.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/EmailHandler.kt)5
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/EventBuilder.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/EventBuilder.kt)20
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/EventHandler.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/EventHandler.kt)9
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/ImBuilder.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/ImBuilder.kt)8
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/ImHandler.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/ImHandler.kt)2
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/NicknameBuilder.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/NicknameBuilder.kt)8
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/NicknameHandler.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/NicknameHandler.kt)5
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/NoteBuilder.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/NoteBuilder.kt)8
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/NoteHandler.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/NoteHandler.kt)3
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/OrganizationBuilder.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/OrganizationBuilder.kt)8
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/OrganizationHandler.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/OrganizationHandler.kt)2
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/PhoneBuilder.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/PhoneBuilder.kt)29
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/PhoneHandler.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/PhoneNumberHandler.kt)15
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/PhotoBuilder.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/PhotoBuilder.kt)8
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/PhotoHandler.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/PhotoHandler.kt)2
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/RelationBuilder.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/RelationBuilder.kt)8
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/RelationHandler.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/RelationHandler.kt)3
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/SipAddressBuilder.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/SipAddressBuilder.kt)8
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/SipAddressHandler.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/SipAddressHandler.kt)3
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/StructuredNameBuilder.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/StructuredNameBuilder.kt)8
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/StructuredNameHandler.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/StructuredNameHandler.kt)2
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilder.kt103
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandler.kt64
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/WebsiteBuilder.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/WebsiteBuilder.kt)12
-rw-r--r--src/main/java/at/bitfire/vcard4android/contactrow/WebsiteHandler.kt (renamed from src/main/java/at/bitfire/vcard4android/datarow/WebsiteHandler.kt)4
-rw-r--r--src/main/java/at/bitfire/vcard4android/datarow/StructuredPostalBuilder.kt80
-rw-r--r--src/main/java/at/bitfire/vcard4android/datarow/StructuredPostalHandler.kt42
-rw-r--r--src/main/java/at/bitfire/vcard4android/property/CustomType.kt17
68 files changed, 3034 insertions, 387 deletions
diff --git a/README.md b/README.md
index 80e7072..21abbe2 100644
--- a/README.md
+++ b/README.md
@@ -16,7 +16,7 @@ It has been primarily developed for [DAVx⁵](https://www.davx5.com).
_This software is not affiliated to, nor has it been authorized, sponsored or otherwise approved
by Google LLC. Android is a trademark of Google LLC._
-Generated KDoc: https://bitfireAT.gitlab.io/vcard4android/dokka/vcard4android/
+Generated KDoc: https://bitfireAT.gitlab.io/vcard4android/dokka/html/
## Contact
diff --git a/build.gradle b/build.gradle
index 933090c..3697b85 100644
--- a/build.gradle
+++ b/build.gradle
@@ -14,7 +14,7 @@ buildscript {
}
dependencies {
- classpath 'com.android.tools.build:gradle:7.0.0'
+ classpath 'com.android.tools.build:gradle:7.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}"
classpath "org.jetbrains.dokka:dokka-gradle-plugin:${versions.dokka}"
}
diff --git a/src/androidTest/assets/large.jpg b/src/androidTest/assets/large.jpg
new file mode 100644
index 0000000..ef071b9
--- /dev/null
+++ b/src/androidTest/assets/large.jpg
Binary files differ
diff --git a/src/androidTest/assets/large.jpg.LICENSE b/src/androidTest/assets/large.jpg.LICENSE
new file mode 100644
index 0000000..2254977
--- /dev/null
+++ b/src/androidTest/assets/large.jpg.LICENSE
@@ -0,0 +1,2 @@
+CC BY-SA 4.0 Sarita98
+https://commons.wikimedia.org/wiki/Category:Images#/media/File:Friesenbergplatz_1_8045_Z%C3%BCrich.jpg
diff --git a/src/androidTest/java/at/bitfire/vcard4android/LocaleNonWesternDigitsTest.kt b/src/androidTest/java/at/bitfire/vcard4android/LocaleNonWesternDigitsTest.kt
index d1a235f..d9c5040 100644
--- a/src/androidTest/java/at/bitfire/vcard4android/LocaleNonWesternDigitsTest.kt
+++ b/src/androidTest/java/at/bitfire/vcard4android/LocaleNonWesternDigitsTest.kt
@@ -3,9 +3,12 @@ package at.bitfire.vcard4android
import ezvcard.Ezvcard
import ezvcard.VCard
import ezvcard.VCardVersion
+import ezvcard.property.Birthday
import ezvcard.property.Geo
+import ezvcard.util.PartialDate
import org.junit.Assert.assertEquals
import org.junit.Before
+import org.junit.ComparisonFailure
import org.junit.Test
import java.util.*
@@ -31,14 +34,18 @@ class LocaleNonWesternDigitsTest {
assertEquals("2020", String.format(Locale.ROOT, "%d", 2020))
}
- @Test
+ @Test(expected = ComparisonFailure::class)
fun testLocale_ezVCard() {
- val vCard = VCard(VCardVersion.V4_0)
- vCard.geo = Geo(1.0, 2.0)
+ // see https://github.com/mangstadt/ez-vcard/issues/113
+ val vCard = VCard(VCardVersion.V4_0).apply {
+ geo = Geo(1.0, 2.0)
+ birthday = Birthday(PartialDate.parse("--0820"))
+ }
assertEquals("BEGIN:VCARD\r\n" +
"VERSION:4.0\r\n" +
"PRODID:ez-vcard 0.11.2\r\n" +
- "GEO:geo:1.0,2.0\r\n" + // failed before 0.11.2: was "GEO:geo:۱.۰,۲.۰\r\n" instead
+ "GEO:geo:1.0,2.0\r\n" + // failed before 0.11.2: was "GEO:geo:۱.۰,۲.۰\r\n" instead
+ "BDAY:--08-20\r\n" + // currently fails
"END:VCARD\r\n", Ezvcard.write(vCard).go())
}
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/EmailBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/EmailBuilderTest.kt
new file mode 100644
index 0000000..bf46b49
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/EmailBuilderTest.kt
@@ -0,0 +1,117 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.LabeledProperty
+import at.bitfire.vcard4android.property.CustomType
+import ezvcard.parameter.EmailType
+import ezvcard.property.Email
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class EmailBuilderTest {
+
+ @Test
+ fun testEmpty() {
+ EmailBuilder(Uri.EMPTY, null, Contact()).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+
+ @Test
+ fun testAddress_Address() {
+ EmailBuilder(Uri.EMPTY, null, Contact().apply {
+ emails += LabeledProperty(Email("test@example.com"))
+ }).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals("test@example.com", result[0].values[CommonDataKinds.Email.ADDRESS])
+ }
+ }
+
+ @Test
+ fun testAddress_Blank() {
+ EmailBuilder(Uri.EMPTY, null, Contact().apply {
+ emails += LabeledProperty(Email(""))
+ }).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+
+ @Test
+ fun testLabel() {
+ EmailBuilder(Uri.EMPTY, null, Contact().apply {
+ emails += LabeledProperty(Email("test@example.com"), "Label")
+ }).build().also { result ->
+ assertEquals("Label", result[0].values[CommonDataKinds.Email.LABEL])
+ }
+ }
+
+
+ @Test
+ fun testMimeType() {
+ EmailBuilder(Uri.EMPTY, null, Contact().apply {
+ emails += LabeledProperty(Email("test@example.com"))
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Email.CONTENT_ITEM_TYPE, result[0].values[CommonDataKinds.Email.MIMETYPE])
+ }
+ }
+
+
+ @Test
+ fun testPref_None() {
+ EmailBuilder(Uri.EMPTY, null, Contact().apply {
+ emails += LabeledProperty(Email("test@example.com"))
+ }).build().also { result ->
+ assertEquals(0, result[0].values[CommonDataKinds.Email.IS_PRIMARY])
+ }
+ }
+
+ @Test
+ fun testPref_1() {
+ EmailBuilder(Uri.EMPTY, null, Contact().apply {
+ emails += LabeledProperty(Email("test@example.com").apply {
+ pref = 1
+ })
+ }).build().also { result ->
+ assertEquals(1, result[0].values[CommonDataKinds.Email.IS_PRIMARY])
+ }
+ }
+
+
+ @Test
+ fun testTypeHome() {
+ EmailBuilder(Uri.EMPTY, null, Contact().apply {
+ emails += LabeledProperty(Email("test@example.com").apply {
+ types.add(EmailType.HOME)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Email.TYPE_HOME, result[0].values[CommonDataKinds.Email.TYPE])
+ }
+ }
+
+ @Test
+ fun testTypeMobile() {
+ EmailBuilder(Uri.EMPTY, null, Contact().apply {
+ emails += LabeledProperty(Email("test@example.com").apply {
+ types.add(CustomType.Email.MOBILE)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Email.TYPE_MOBILE, result[0].values[CommonDataKinds.Email.TYPE])
+ }
+ }
+
+ @Test
+ fun testTypeWork() {
+ EmailBuilder(Uri.EMPTY, null, Contact().apply {
+ emails += LabeledProperty(Email("test@example.com").apply {
+ types.add(EmailType.WORK)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Email.TYPE_WORK, result[0].values[CommonDataKinds.Email.TYPE])
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/datarow/EmailHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/EmailHandlerTest.kt
index 0dcfbe8..e91d5b9 100644
--- a/src/androidTest/java/at/bitfire/vcard4android/datarow/EmailHandlerTest.kt
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/EmailHandlerTest.kt
@@ -1,9 +1,10 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.content.ContentValues
import android.provider.ContactsContract.CommonDataKinds.Email
import at.bitfire.vcard4android.Contact
import at.bitfire.vcard4android.datavalues.EmailHandler
+import at.bitfire.vcard4android.property.CustomType
import ezvcard.parameter.EmailType
import org.junit.Assert.*
import org.junit.Test
@@ -85,6 +86,17 @@ class EmailHandlerTest {
}
@Test
+ fun testTypeOther() {
+ val contact = Contact()
+ EmailHandler.handle(ContentValues().apply {
+ put(Email.ADDRESS, "test@example.com")
+ put(Email.TYPE, Email.TYPE_OTHER)
+ }, contact)
+ assertTrue(contact.emails[0].property.types.isEmpty())
+ assertNull(contact.emails[0].label)
+ }
+
+ @Test
fun testTypeWork() {
val contact = Contact()
EmailHandler.handle(ContentValues().apply {
@@ -102,7 +114,7 @@ class EmailHandlerTest {
put(Email.ADDRESS, "test@example.com")
put(Email.TYPE, Email.TYPE_MOBILE)
}, contact)
- assertArrayEquals(arrayOf(Contact.EMAIL_TYPE_MOBILE), contact.emails[0].property.types.toTypedArray())
+ assertArrayEquals(arrayOf(CustomType.Email.MOBILE), contact.emails[0].property.types.toTypedArray())
assertNull(contact.emails[0].label)
}
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/EventBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/EventBuilderTest.kt
new file mode 100644
index 0000000..261dc39
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/EventBuilderTest.kt
@@ -0,0 +1,127 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.LabeledProperty
+import at.bitfire.vcard4android.property.XAbDate
+import ezvcard.property.Anniversary
+import ezvcard.property.Birthday
+import ezvcard.util.PartialDate
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import java.util.*
+
+class EventBuilderTest {
+
+ @Test
+ fun testEmpty() {
+ EventBuilder(Uri.EMPTY, null, Contact()).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+
+ @Test
+ fun testStartDate_FullDate() {
+ EventBuilder(Uri.EMPTY, null, Contact().apply {
+ anniversary = Anniversary(Calendar.getInstance().apply {
+ set(1984, /* zero-based */ 7, 20)
+ })
+ }).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals("1984-08-20", result[0].values[CommonDataKinds.Event.START_DATE])
+ assertEquals(CommonDataKinds.Event.TYPE_ANNIVERSARY, result[0].values[CommonDataKinds.Event.TYPE])
+ }
+ }
+
+ // TODO enable test as soon as https://github.com/mangstadt/ez-vcard/issues/113 is fixed
+ /*@Test()
+ fun testStartDate_PartialDate() {
+ EventBuilder(Uri.EMPTY, null, Contact().apply {
+ anniversary = Anniversary(PartialDate.builder()
+ .date(20)
+ .month(8)
+ .build())
+ }).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals("--08-20", result[0].values[CommonDataKinds.Event.START_DATE])
+ }
+ }*/
+
+
+ @Test
+ fun testBirthday_FullDate() {
+ EventBuilder(Uri.EMPTY, null, Contact().apply {
+ anniversary = Anniversary(Calendar.getInstance().apply {
+ set(1984, /* zero-based */ 7, 20)
+ })
+ }).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals("1984-08-20", result[0].values[CommonDataKinds.Event.START_DATE])
+ }
+ }
+
+
+ @Test
+ fun testLabel() {
+ EventBuilder(Uri.EMPTY, null, Contact().apply {
+ customDates += LabeledProperty(XAbDate(PartialDate.builder()
+ .date(20)
+ .month(8)
+ .build()), "Custom Event")
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Event.TYPE_CUSTOM, result[0].values[CommonDataKinds.Event.TYPE])
+ assertEquals("Custom Event", result[0].values[CommonDataKinds.Event.LABEL])
+ }
+ }
+
+
+ @Test
+ fun testMimeType() {
+ val c = Contact().apply {
+ anniversary = Anniversary(Calendar.getInstance().apply {
+ set(1984, /* zero-based */ 7, 20)
+ })
+ }
+ EventBuilder(Uri.EMPTY, null, c).build().also { result ->
+ assertEquals(CommonDataKinds.Event.CONTENT_ITEM_TYPE, result[0].values[CommonDataKinds.Event.MIMETYPE])
+ }
+ }
+
+
+ @Test
+ fun testType_Anniversary() {
+ EventBuilder(Uri.EMPTY, null, Contact().apply {
+ anniversary = Anniversary(Calendar.getInstance().apply {
+ set(1984, /* zero-based */ 7, 20)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Event.TYPE_ANNIVERSARY, result[0].values[CommonDataKinds.Event.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Birthday() {
+ EventBuilder(Uri.EMPTY, null, Contact().apply {
+ birthDay = Birthday(Calendar.getInstance().apply {
+ set(1984, /* zero-based */ 7, 20)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Event.TYPE_BIRTHDAY, result[0].values[CommonDataKinds.Event.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Other() {
+ EventBuilder(Uri.EMPTY, null, Contact().apply {
+ customDates += LabeledProperty(XAbDate(PartialDate.builder()
+ .date(20)
+ .month(8)
+ .build()))
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Event.TYPE_OTHER, result[0].values[CommonDataKinds.Event.TYPE])
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/EventHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/EventHandlerTest.kt
new file mode 100644
index 0000000..d28a46e
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/EventHandlerTest.kt
@@ -0,0 +1,98 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.content.ContentValues
+import android.provider.ContactsContract.CommonDataKinds.Event
+import at.bitfire.vcard4android.Contact
+import ezvcard.util.PartialDate
+import org.junit.Assert.*
+import org.junit.Test
+import java.util.*
+
+class EventHandlerTest {
+
+ @Test
+ fun testStartDate_Empty() {
+ val contact = Contact()
+ EventHandler.handle(ContentValues().apply {
+ putNull(Event.START_DATE)
+ }, contact)
+ assertNull(contact.anniversary)
+ assertNull(contact.birthDay)
+ assertTrue(contact.customDates.isEmpty())
+ }
+
+ @Test
+ fun testStartDate_Full() {
+ val contact = Contact()
+ EventHandler.handle(ContentValues().apply {
+ put(Event.START_DATE, "1984-08-20")
+ }, contact)
+ assertEquals(
+ Calendar.getInstance().apply {
+ set(1984, /* zero-based */7, 20, 0, 0, 0)
+ set(Calendar.MILLISECOND, 0)
+ }.timeInMillis,
+ contact.customDates[0].property.date.time)
+ }
+
+ @Test
+ fun testStartDate_Partial() {
+ val contact = Contact()
+ EventHandler.handle(ContentValues().apply {
+ put(Event.START_DATE, "--08-20")
+ }, contact)
+ assertEquals(PartialDate.parse("--0820"), contact.customDates[0].property.partialDate)
+ }
+
+
+ @Test
+ fun testType_Anniversary() {
+ val contact = Contact()
+ EventHandler.handle(ContentValues().apply {
+ put(Event.START_DATE, "--08-20")
+ put(Event.TYPE, Event.TYPE_ANNIVERSARY)
+ }, contact)
+ assertNotNull(contact.anniversary)
+ assertNull(contact.birthDay)
+ assertTrue(contact.customDates.isEmpty())
+ }
+
+ @Test
+ fun testType_Birthday() {
+ val contact = Contact()
+ EventHandler.handle(ContentValues().apply {
+ put(Event.START_DATE, "--08-20")
+ put(Event.TYPE, Event.TYPE_BIRTHDAY)
+ }, contact)
+ assertNull(contact.anniversary)
+ assertNotNull(contact.birthDay)
+ assertTrue(contact.customDates.isEmpty())
+ }
+
+ @Test
+ fun testType_Custom_Label() {
+ val contact = Contact()
+ EventHandler.handle(ContentValues().apply {
+ put(Event.START_DATE, "--08-20")
+ put(Event.TYPE, Event.TYPE_CUSTOM)
+ put(Event.LABEL, "Label 1")
+ }, contact)
+ assertNull(contact.anniversary)
+ assertNull(contact.birthDay)
+ assertFalse(contact.customDates.isEmpty())
+ assertEquals("Label 1", contact.customDates[0].label)
+ }
+
+ @Test
+ fun testType_Other() {
+ val contact = Contact()
+ EventHandler.handle(ContentValues().apply {
+ put(Event.START_DATE, "--08-20")
+ put(Event.TYPE, Event.TYPE_OTHER)
+ }, contact)
+ assertNull(contact.anniversary)
+ assertNull(contact.birthDay)
+ assertFalse(contact.customDates.isEmpty())
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/ImBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/ImBuilderTest.kt
new file mode 100644
index 0000000..253f37e
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/ImBuilderTest.kt
@@ -0,0 +1,129 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.LabeledProperty
+import ezvcard.parameter.ImppType
+import ezvcard.property.Impp
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class ImBuilderTest {
+
+ @Test
+ fun testEmpty() {
+ ImBuilder(Uri.EMPTY, null, Contact()).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+
+ @Test
+ fun testHandle_Empty() {
+ ImBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp(""))
+ }).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+ @Test
+ fun testHandle_WithoutProtocol() {
+ ImBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp("test@example.com"))
+ }).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+ @Test
+ fun testHandle_WithProtocol() {
+ ImBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.xmpp("jabber@example.com"))
+ }).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals(CommonDataKinds.Im.PROTOCOL_CUSTOM, result[0].values[CommonDataKinds.Im.PROTOCOL])
+ assertEquals("xmpp", result[0].values[CommonDataKinds.Im.CUSTOM_PROTOCOL])
+ assertEquals("jabber@example.com", result[0].values[CommonDataKinds.Im.DATA])
+ }
+ }
+
+
+ @Test
+ fun testIgnoreSip() {
+ ImBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp("sip:voip@example.com"))
+ }).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+
+ @Test
+ fun testLabel() {
+ ImBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.xmpp("jabber@example.com"), "Label")
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Im.TYPE_CUSTOM, result[0].values[CommonDataKinds.Im.TYPE])
+ assertEquals("Label", result[0].values[CommonDataKinds.Im.LABEL])
+ }
+ }
+
+
+ @Test
+ fun testMimeType() {
+ ImBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.xmpp("jabber@example.com"))
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Im.CONTENT_ITEM_TYPE, result[0].values[CommonDataKinds.Im.MIMETYPE])
+ }
+ }
+
+
+ @Test
+ fun testProtocol_Sip() {
+ ImBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.sip("voip@example.com"))
+ }).build().also { result ->
+ // handled by SipAddressHandler
+ assertEquals(0, result.size)
+ }
+ }
+
+
+ @Test
+ fun testType_Home() {
+ ImBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.xmpp("jabber@example.com").apply {
+ types.add(ImppType.HOME)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Im.TYPE_HOME, result[0].values[CommonDataKinds.Im.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_NotInAndroid() {
+ // some vCard type that is not supported by Android
+ ImBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.xmpp("jabber@example.com").apply {
+ types.add(ImppType.MOBILE)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Im.TYPE_OTHER, result[0].values[CommonDataKinds.Im.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Work() {
+ ImBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.xmpp("jabber@example.com").apply {
+ types.add(ImppType.WORK)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Im.TYPE_WORK, result[0].values[CommonDataKinds.Im.TYPE])
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/ImHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/ImHandlerTest.kt
new file mode 100644
index 0000000..fb0a1dc
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/ImHandlerTest.kt
@@ -0,0 +1,138 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.content.ContentValues
+import android.provider.ContactsContract.CommonDataKinds.Im
+import at.bitfire.vcard4android.Contact
+import ezvcard.parameter.ImppType
+import org.junit.Assert.*
+import org.junit.Test
+
+class ImHandlerTest {
+
+ @Test
+ fun testHandle_Empty() {
+ val contact = Contact()
+ ImHandler.handle(ContentValues().apply {
+ put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM)
+ put(Im.CUSTOM_PROTOCOL, "new-messenger")
+ }, contact)
+ assertTrue(contact.impps.isEmpty())
+ }
+
+ @Test
+ fun testHandle_Value() {
+ val contact = Contact()
+ ImHandler.handle(ContentValues().apply {
+ put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM)
+ put(Im.CUSTOM_PROTOCOL, "new-messenger")
+ put(Im.DATA, "messenger-id")
+ }, contact)
+ assertEquals("messenger-id", contact.impps[0].property.handle)
+ }
+
+
+ @Test
+ fun testProtocol_Custom() {
+ val contact = Contact()
+ ImHandler.handle(ContentValues().apply {
+ put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM)
+ put(Im.CUSTOM_PROTOCOL, "new-messenger")
+ put(Im.DATA, "id")
+ }, contact)
+ assertEquals("new-messenger", contact.impps[0].property.protocol)
+ }
+
+ @Test
+ fun testProtocol_Empty() {
+ val contact = Contact()
+ ImHandler.handle(ContentValues().apply {
+ putNull(Im.PROTOCOL)
+ }, contact)
+ assertTrue(contact.impps.isEmpty())
+ }
+
+ @Test
+ fun testProtocol_Legacy_Aim() {
+ val contact = Contact()
+ ImHandler.handle(ContentValues().apply {
+ put(Im.PROTOCOL, Im.PROTOCOL_AIM)
+ put(Im.DATA, "aim-id")
+ }, contact)
+ assertEquals("aim", contact.impps[0].property.protocol)
+ }
+
+
+ @Test
+ fun testTypeCustom_NoLabel() {
+ val contact = Contact()
+ ImHandler.handle(ContentValues().apply {
+ put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM)
+ put(Im.CUSTOM_PROTOCOL, "new-messenger")
+ put(Im.DATA, "messenger-id")
+ put(Im.TYPE, Im.TYPE_CUSTOM)
+ }, contact)
+ assertTrue(contact.impps[0].property.types.isEmpty())
+ assertNull(contact.impps[0].label)
+ }
+
+ @Test
+ fun testTypeCustom_WithLabel() {
+ val contact = Contact()
+ ImHandler.handle(ContentValues().apply {
+ put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM)
+ put(Im.CUSTOM_PROTOCOL, "new-messenger")
+ put(Im.DATA, "messenger-id")
+ put(Im.TYPE, Im.TYPE_CUSTOM)
+ put(Im.LABEL, "New Messenger")
+ }, contact)
+ assertTrue(contact.impps[0].property.types.isEmpty())
+ assertEquals("New Messenger", contact.impps[0].label)
+ }
+
+ @Test
+ fun testType_Home() {
+ val contact = Contact()
+ ImHandler.handle(ContentValues().apply {
+ put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM)
+ put(Im.CUSTOM_PROTOCOL, "new-messenger")
+ put(Im.DATA, "messenger-id")
+ put(Im.TYPE, Im.TYPE_HOME)
+ }, contact)
+ assertEquals(ImppType.HOME, contact.impps[0].property.types[0])
+ }
+
+ @Test
+ fun testType_Other() {
+ val contact = Contact()
+ ImHandler.handle(ContentValues().apply {
+ put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM)
+ put(Im.CUSTOM_PROTOCOL, "new-messenger")
+ put(Im.DATA, "messenger-id")
+ put(Im.TYPE, Im.TYPE_OTHER)
+ }, contact)
+ assertTrue(contact.impps[0].property.types.isEmpty())
+ }
+
+ @Test
+ fun testType_Work() {
+ val contact = Contact()
+ ImHandler.handle(ContentValues().apply {
+ put(Im.PROTOCOL, Im.PROTOCOL_CUSTOM)
+ put(Im.CUSTOM_PROTOCOL, "new-messenger")
+ put(Im.DATA, "messenger-id")
+ put(Im.TYPE, Im.TYPE_WORK)
+ }, contact)
+ assertEquals(ImppType.WORK, contact.impps[0].property.types[0])
+ }
+
+
+ // tests for helpers
+
+ @Test
+ fun testProtocolToUriScheme() {
+ assertNull(ImHandler.protocolToUriScheme(null))
+ assertEquals("", ImHandler.protocolToUriScheme(""))
+ assertEquals("protocol", ImHandler.protocolToUriScheme("PrO/ätO\\cOl"))
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/NicknameBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/NicknameBuilderTest.kt
new file mode 100644
index 0000000..7a54f5f
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/NicknameBuilderTest.kt
@@ -0,0 +1,113 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.LabeledProperty
+import at.bitfire.vcard4android.property.CustomType
+import ezvcard.property.Nickname
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class NicknameBuilderTest {
+
+ @Test
+ fun testEmpty() {
+ NicknameBuilder(Uri.EMPTY, null, Contact()).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+
+ @Test
+ fun testLabel() {
+ val c = Contact().apply {
+ nickName = LabeledProperty(Nickname().apply {
+ values.add("Nick 1")
+ type = CustomType.Nickname.SHORT_NAME // will be ignored because there's a label
+ }, "Label 1")
+ }
+ NicknameBuilder(Uri.EMPTY, null, c).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals("Nick 1", result[0].values[CommonDataKinds.Nickname.NAME])
+ assertEquals(CommonDataKinds.Nickname.TYPE_CUSTOM, result[0].values[CommonDataKinds.Nickname.TYPE])
+ assertEquals("Label 1", result[0].values[CommonDataKinds.Nickname.LABEL])
+ }
+ }
+
+
+ @Test
+ fun testMimeType() {
+ val c = Contact().apply {
+ nickName = LabeledProperty(Nickname().apply {
+ values.add("Name 1")
+ })
+ }
+ NicknameBuilder(Uri.EMPTY, null, c).build().also { result ->
+ assertEquals(CommonDataKinds.Nickname.CONTENT_ITEM_TYPE, result[0].values[CommonDataKinds.Nickname.MIMETYPE])
+ }
+ }
+
+
+ @Test
+ fun testType_Initials() {
+ val c = Contact().apply {
+ nickName = LabeledProperty(Nickname().apply {
+ values.add("N1")
+ type = CustomType.Nickname.INITIALS
+ })
+ }
+ NicknameBuilder(Uri.EMPTY, null, c).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals("N1", result[0].values[CommonDataKinds.Nickname.NAME])
+ assertEquals(CommonDataKinds.Nickname.TYPE_INITIALS, result[0].values[CommonDataKinds.Nickname.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_MaidenName() {
+ val c = Contact().apply {
+ nickName = LabeledProperty(Nickname().apply {
+ values.add("Mai Den")
+ type = CustomType.Nickname.MAIDEN_NAME
+ })
+ }
+ NicknameBuilder(Uri.EMPTY, null, c).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals("Mai Den", result[0].values[CommonDataKinds.Nickname.NAME])
+ assertEquals(CommonDataKinds.Nickname.TYPE_MAIDEN_NAME, result[0].values[CommonDataKinds.Nickname.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_ShortName() {
+ val c = Contact().apply {
+ nickName = LabeledProperty(Nickname().apply {
+ values.add("Short Name")
+ type = CustomType.Nickname.SHORT_NAME
+ })
+ }
+ NicknameBuilder(Uri.EMPTY, null, c).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals("Short Name", result[0].values[CommonDataKinds.Nickname.NAME])
+ assertEquals(CommonDataKinds.Nickname.TYPE_SHORT_NAME, result[0].values[CommonDataKinds.Nickname.TYPE])
+ }
+ }
+
+
+ @Test
+ fun testValue_TwoValues() {
+ val c = Contact().apply {
+ nickName = LabeledProperty(Nickname().apply {
+ values.add("Nick 1")
+ values.add("Nick 2")
+ })
+ }
+ NicknameBuilder(Uri.EMPTY, null, c).build().also { result ->
+ assertEquals(2, result.size)
+ assertEquals("Nick 1", result[0].values[CommonDataKinds.Nickname.NAME])
+ assertEquals("Nick 2", result[1].values[CommonDataKinds.Nickname.NAME])
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/NicknameHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/NicknameHandlerTest.kt
new file mode 100644
index 0000000..4744d63
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/NicknameHandlerTest.kt
@@ -0,0 +1,79 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.content.ContentValues
+import android.provider.ContactsContract.CommonDataKinds.Nickname
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.property.CustomType
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Test
+
+class NicknameHandlerTest {
+
+ @Test
+ fun testNickname_Empty() {
+ val contact = Contact()
+ NicknameHandler.handle(ContentValues().apply {
+ putNull(Nickname.NAME)
+ }, contact)
+ assertNull(contact.nickName)
+ }
+
+
+ @Test
+ fun testNickname_TypeCustom_NoLabel() {
+ val contact = Contact()
+ NicknameHandler.handle(ContentValues().apply {
+ put(Nickname.NAME, "Nick")
+ put(Nickname.TYPE, Nickname.TYPE_CUSTOM)
+ }, contact)
+ assertEquals("Nick", contact.nickName!!.property.values[0])
+ assertNull(contact.nickName!!.label)
+ }
+
+ @Test
+ fun testNickname_TypeCustom_WithLabel() {
+ val contact = Contact()
+ NicknameHandler.handle(ContentValues().apply {
+ put(Nickname.NAME, "Nick")
+ put(Nickname.TYPE, Nickname.TYPE_CUSTOM)
+ put(Nickname.LABEL, "Label")
+ }, contact)
+ assertEquals("Nick", contact.nickName!!.property.values[0])
+ assertEquals("Label", contact.nickName!!.label)
+ }
+
+ @Test
+ fun testNickname_TypeInitials() {
+ val contact = Contact()
+ NicknameHandler.handle(ContentValues().apply {
+ put(Nickname.NAME, "I1")
+ put(Nickname.TYPE, Nickname.TYPE_INITIALS)
+ }, contact)
+ assertEquals("I1", contact.nickName!!.property.values[0])
+ assertEquals(CustomType.Nickname.INITIALS, contact.nickName!!.property.type)
+ }
+
+ @Test
+ fun testNickname_TypeMaidenName() {
+ val contact = Contact()
+ NicknameHandler.handle(ContentValues().apply {
+ put(Nickname.NAME, "Mai Den")
+ put(Nickname.TYPE, Nickname.TYPE_MAIDEN_NAME)
+ }, contact)
+ assertEquals("Mai Den", contact.nickName!!.property.values[0])
+ assertEquals(CustomType.Nickname.MAIDEN_NAME, contact.nickName!!.property.type)
+ }
+
+ @Test
+ fun testNickname_TypeShortName() {
+ val contact = Contact()
+ NicknameHandler.handle(ContentValues().apply {
+ put(Nickname.NAME, "Short Name")
+ put(Nickname.TYPE, Nickname.TYPE_SHORT_NAME)
+ }, contact)
+ assertEquals("Short Name", contact.nickName!!.property.values[0])
+ assertEquals(CustomType.Nickname.SHORT_NAME, contact.nickName!!.property.type)
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/NoteBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/NoteBuilderTest.kt
new file mode 100644
index 0000000..4cd5f61
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/NoteBuilderTest.kt
@@ -0,0 +1,38 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds
+import at.bitfire.vcard4android.Contact
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class NoteBuilderTest {
+
+ @Test
+ fun testNote_Empty() {
+ NoteBuilder(Uri.EMPTY, null, Contact()).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+ @Test
+ fun testNote_Blank() {
+ NoteBuilder(Uri.EMPTY, null, Contact().apply {
+ note = ""
+ }).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+ @Test
+ fun testNote_Value() {
+ NoteBuilder(Uri.EMPTY, null, Contact().apply {
+ note = "Some Note"
+ }).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals(CommonDataKinds.Note.CONTENT_ITEM_TYPE, result[0].values[CommonDataKinds.Note.MIMETYPE])
+ assertEquals("Some Note", result[0].values[CommonDataKinds.Note.NOTE])
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/NoteHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/NoteHandlerTest.kt
new file mode 100644
index 0000000..efd4987
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/NoteHandlerTest.kt
@@ -0,0 +1,30 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.content.ContentValues
+import android.provider.ContactsContract.CommonDataKinds.Note
+import at.bitfire.vcard4android.Contact
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Test
+
+class NoteHandlerTest {
+
+ @Test
+ fun testNote_Empty() {
+ val contact = Contact()
+ NoteHandler.handle(ContentValues().apply {
+ putNull(Note.NOTE)
+ }, contact)
+ assertNull(contact.note)
+ }
+
+ @Test
+ fun testNote_Value() {
+ val contact = Contact()
+ NoteHandler.handle(ContentValues().apply {
+ put(Note.NOTE, "Some Note")
+ }, contact)
+ assertEquals("Some Note", contact.note)
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/datarow/OrganizationBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/OrganizationBuilderTest.kt
index c5f702a..7537312 100644
--- a/src/androidTest/java/at/bitfire/vcard4android/datarow/OrganizationBuilderTest.kt
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/OrganizationBuilderTest.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.net.Uri
import android.provider.ContactsContract.CommonDataKinds
@@ -8,7 +8,7 @@ import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Test
-/*class OrganizationBuilderTest {
+class OrganizationBuilderTest {
@Test
fun testEmpty() {
@@ -96,4 +96,4 @@ import org.junit.Test
}
}
-}*/ \ No newline at end of file
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/OrganizationHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/OrganizationHandlerTest.kt
new file mode 100644
index 0000000..cb61c32
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/OrganizationHandlerTest.kt
@@ -0,0 +1,74 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.content.ContentValues
+import android.provider.ContactsContract.CommonDataKinds.Organization
+import at.bitfire.vcard4android.Contact
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Test
+
+class OrganizationHandlerTest {
+
+ @Test
+ fun testJobDescription() {
+ val contact = Contact()
+ OrganizationHandler.handle(ContentValues().apply {
+ put(Organization.JOB_DESCRIPTION, "Job Description")
+ }, contact)
+ assertEquals("Job Description", contact.jobDescription)
+ }
+
+
+ @Test
+ fun testJobTitle() {
+ val contact = Contact()
+ OrganizationHandler.handle(ContentValues().apply {
+ put(Organization.TITLE, "Job Title")
+ }, contact)
+ assertEquals("Job Title", contact.jobTitle)
+ }
+
+
+ @Test
+ fun testOrganization_Empty() {
+ val contact = Contact()
+ OrganizationHandler.handle(ContentValues().apply {
+ putNull(Organization.COMPANY)
+ putNull(Organization.DEPARTMENT)
+ }, contact)
+ assertNull(contact.organization)
+ }
+
+ @Test
+ fun testOrganization_Company() {
+ val contact = Contact()
+ OrganizationHandler.handle(ContentValues().apply {
+ put(Organization.COMPANY, "Company")
+ }, contact)
+ assertEquals(1, contact.organization!!.values.size)
+ assertEquals("Company", contact.organization!!.values.first())
+ }
+
+ @Test
+ fun testOrganization_CompanyDepartment() {
+ val contact = Contact()
+ OrganizationHandler.handle(ContentValues().apply {
+ put(Organization.COMPANY, "Company")
+ put(Organization.DEPARTMENT, "Department")
+ }, contact)
+ assertEquals(2, contact.organization!!.values.size)
+ assertEquals("Company", contact.organization!!.values[0])
+ assertEquals("Department", contact.organization!!.values[1])
+ }
+
+ @Test
+ fun testOrganization_Department() {
+ val contact = Contact()
+ OrganizationHandler.handle(ContentValues().apply {
+ put(Organization.DEPARTMENT, "Department")
+ }, contact)
+ assertEquals(1, contact.organization!!.values.size)
+ assertEquals("Department", contact.organization!!.values[0])
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/PhoneBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/PhoneBuilderTest.kt
new file mode 100644
index 0000000..32c78d1
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/PhoneBuilderTest.kt
@@ -0,0 +1,265 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.LabeledProperty
+import at.bitfire.vcard4android.property.CustomType
+import ezvcard.parameter.TelephoneType
+import ezvcard.property.Telephone
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class PhoneBuilderTest {
+
+ @Test
+ fun testEmpty() {
+ PhoneBuilder(Uri.EMPTY, null, Contact()).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+
+ @Test
+ fun testNumber_Blank() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone(""))
+ }).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+ @Test
+ fun testNumber_Value() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345"))
+ }).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals("+1 555 12345", result[0].values[CommonDataKinds.Phone.NUMBER])
+ }
+ }
+
+
+ @Test
+ fun testLabel() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345"), "Label")
+ }).build().also { result ->
+ assertEquals("Label", result[0].values[CommonDataKinds.Phone.LABEL])
+ }
+ }
+
+
+ @Test
+ fun testMimeType() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345"))
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.CONTENT_ITEM_TYPE, result[0].values[CommonDataKinds.Phone.MIMETYPE])
+ }
+ }
+
+
+ @Test
+ fun testPref_None() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345"))
+ }).build().also { result ->
+ assertEquals(0, result[0].values[CommonDataKinds.Phone.IS_PRIMARY])
+ }
+ }
+
+ @Test
+ fun testPref_1() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ pref = 1
+ })
+ }).build().also { result ->
+ assertEquals(1, result[0].values[CommonDataKinds.Phone.IS_PRIMARY])
+ }
+ }
+
+
+ @Test
+ fun testType_Assistant() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(CustomType.Phone.ASSISTANT)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_ASSISTANT, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Callback() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(CustomType.Phone.CALLBACK)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_CALLBACK, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Cell() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(TelephoneType.CELL)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_MOBILE, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_CellWork() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(TelephoneType.CELL)
+ types.add(TelephoneType.WORK)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_WORK_MOBILE, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_CompanyName() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(CustomType.Phone.COMPANY_MAIN)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_COMPANY_MAIN, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Fax() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(TelephoneType.FAX)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_OTHER_FAX, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_FaxHome() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(TelephoneType.FAX)
+ types.add(TelephoneType.HOME)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_FAX_HOME, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_FaxWork() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(TelephoneType.FAX)
+ types.add(TelephoneType.WORK)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_FAX_WORK, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Home() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(TelephoneType.HOME)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_HOME, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Isdn() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(TelephoneType.ISDN)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_ISDN, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Mms() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(CustomType.Phone.MMS)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_MMS, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_NotInAndroid() {
+ // some type which is not mapped in Android
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(TelephoneType.VIDEO)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_OTHER, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Pager() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(TelephoneType.PAGER)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_PAGER, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_PagerWork() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(TelephoneType.PAGER)
+ types.add(TelephoneType.WORK)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_WORK_PAGER, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Radio() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(CustomType.Phone.RADIO)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_RADIO, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Work() {
+ PhoneBuilder(Uri.EMPTY, null, Contact().apply {
+ phoneNumbers += LabeledProperty(Telephone("+1 555 12345").apply {
+ types.add(TelephoneType.WORK)
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Phone.TYPE_WORK, result[0].values[CommonDataKinds.Phone.TYPE])
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/PhoneHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/PhoneHandlerTest.kt
new file mode 100644
index 0000000..e762fc6
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/PhoneHandlerTest.kt
@@ -0,0 +1,204 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.content.ContentValues
+import android.provider.ContactsContract.CommonDataKinds.Phone
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.property.CustomType
+import ezvcard.parameter.TelephoneType
+import org.junit.Assert.*
+import org.junit.Test
+
+class PhoneHandlerTest {
+
+ @Test
+ fun testIsPrimary_False() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.IS_PRIMARY, 0)
+ }, contact)
+ assertNull(contact.phoneNumbers[0].property.pref)
+ }
+
+ @Test
+ fun testIsPrimary_True() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.IS_PRIMARY, 1)
+ }, contact)
+ assertEquals(1, contact.phoneNumbers[0].property.pref)
+ }
+
+
+ @Test
+ fun testNumber_Empty() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ putNull(Phone.NUMBER)
+ }, contact)
+ assertTrue(contact.phoneNumbers.isEmpty())
+ }
+
+ @Test
+ fun testNumber_Value() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ }, contact)
+ assertEquals(1, contact.phoneNumbers.size)
+ assertEquals("+1 555 12345", contact.phoneNumbers[0].property.text)
+ }
+
+
+ @Test
+ fun testType_Assistant() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_ASSISTANT)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Phone.ASSISTANT), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Callback() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_CALLBACK)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Phone.CALLBACK), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Car() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_CAR)
+ }, contact)
+ assertArrayEquals(arrayOf(TelephoneType.CAR), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_CompanyName() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_COMPANY_MAIN)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Phone.COMPANY_MAIN), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_FaxHome() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_FAX_HOME)
+ }, contact)
+ assertArrayEquals(arrayOf(TelephoneType.FAX, TelephoneType.HOME), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_FaxOther() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_OTHER_FAX)
+ }, contact)
+ assertArrayEquals(arrayOf(TelephoneType.FAX), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_FaxWork() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_FAX_WORK)
+ }, contact)
+ assertArrayEquals(arrayOf(TelephoneType.FAX, TelephoneType.WORK), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Home() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_HOME)
+ }, contact)
+ assertArrayEquals(arrayOf(TelephoneType.HOME), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Isdn() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_ISDN)
+ }, contact)
+ assertArrayEquals(arrayOf(TelephoneType.ISDN), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Mms() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_MMS)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Phone.MMS), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Pager() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_PAGER)
+ }, contact)
+ assertArrayEquals(arrayOf(TelephoneType.PAGER), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_PagerWork() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_WORK_PAGER)
+ }, contact)
+ assertArrayEquals(arrayOf(TelephoneType.PAGER, TelephoneType.WORK), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Radio() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_RADIO)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Phone.RADIO), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Work() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_WORK)
+ }, contact)
+ assertArrayEquals(arrayOf(TelephoneType.WORK), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_WorkMobile() {
+ val contact = Contact()
+ PhoneHandler.handle(ContentValues().apply {
+ put(Phone.NUMBER, "+1 555 12345")
+ put(Phone.TYPE, Phone.TYPE_WORK_MOBILE)
+ }, contact)
+ assertArrayEquals(arrayOf(TelephoneType.CELL, TelephoneType.WORK), contact.phoneNumbers[0].property.types.toTypedArray())
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/PhotoBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/PhotoBuilderTest.kt
new file mode 100644
index 0000000..99abe4c
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/PhotoBuilderTest.kt
@@ -0,0 +1,47 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds.Photo
+import androidx.test.platform.app.InstrumentationRegistry
+import at.bitfire.vcard4android.Contact
+import org.apache.commons.io.IOUtils
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import kotlin.random.Random
+
+class PhotoBuilderTest {
+
+ @Test
+ fun testEmpty() {
+ PhotoBuilder(Uri.EMPTY, null, Contact()).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+
+ @Test
+ fun testPhoto_NoResize() {
+ val blob = ByteArray(1024) { Random.nextInt().toByte() }
+ assertTrue(blob.size < PhotoBuilder.MAX_PHOTO_BLOB_SIZE)
+ PhotoBuilder(Uri.EMPTY, null, Contact().apply {
+ photo = blob
+ }).build().also { result ->
+ assertEquals(Photo.CONTENT_ITEM_TYPE, result[0].values[Photo.MIMETYPE])
+ assertEquals(blob, result[0].values[Photo.PHOTO])
+ }
+ }
+
+ @Test
+ fun testPhoto_Resize() {
+ val blob = IOUtils.readFully(InstrumentationRegistry.getInstrumentation().context.assets.open("large.jpg"), 3519652)
+ assertTrue(blob.size > PhotoBuilder.MAX_PHOTO_BLOB_SIZE)
+ PhotoBuilder(Uri.EMPTY, null, Contact().apply {
+ photo = blob
+ }).build().also { result ->
+ assertEquals(Photo.CONTENT_ITEM_TYPE, result[0].values[Photo.MIMETYPE])
+ assertTrue((result[0].values[Photo.PHOTO] as ByteArray).size < PhotoBuilder.MAX_PHOTO_BLOB_SIZE)
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/PhotoHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/PhotoHandlerTest.kt
new file mode 100644
index 0000000..9db3a19
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/PhotoHandlerTest.kt
@@ -0,0 +1,35 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.content.ContentValues
+import android.provider.ContactsContract.CommonDataKinds.Photo
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.datavalues.PhotoHandler
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Test
+import kotlin.random.Random
+
+class PhotoHandlerTest {
+
+ @Test
+ fun testPhoto_Empty() {
+ val contact = Contact()
+ PhotoHandler(null).handle(ContentValues().apply {
+ putNull(Photo.PHOTO)
+ }, contact)
+ assertNull(contact.photo)
+ }
+
+ @Test
+ fun testPhoto_Blob() {
+ val blob = ByteArray(1024) { Random.nextInt().toByte() }
+ val contact = Contact()
+ PhotoHandler(null).handle(ContentValues().apply {
+ put(Photo.PHOTO, blob)
+ }, contact)
+ assertEquals(blob, contact.photo)
+ }
+
+ // TODO testPhoto_FileId
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/RelationBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/RelationBuilderTest.kt
new file mode 100644
index 0000000..b647f0f
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/RelationBuilderTest.kt
@@ -0,0 +1,275 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds.Relation
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.property.CustomType
+import ezvcard.parameter.RelatedType
+import ezvcard.property.Related
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class RelationBuilderTest {
+
+ @Test
+ fun testEmpty() {
+ RelationBuilder(Uri.EMPTY, null, Contact()).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+
+ @Test
+ fun testMimeType() {
+ val c = Contact().apply {
+ relations += Related("somebody").apply {
+ types += RelatedType.FRIEND
+ }
+ }
+ RelationBuilder(Uri.EMPTY, null, c).build().also { result ->
+ assertEquals(Relation.CONTENT_ITEM_TYPE, result[0].values[Relation.MIMETYPE])
+ }
+ }
+
+
+ @Test
+ fun testName_Text() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related().apply {
+ text = "Somebody"
+ types += RelatedType.FRIEND
+ }
+ }).build().also { result ->
+ assertEquals("Somebody", result[0].values[Relation.NAME])
+ }
+ }
+
+ @Test
+ fun testName_TextAndUri() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("uri").apply {
+ text = "Text"
+ types += RelatedType.FRIEND
+ }
+ }).build().also { result ->
+ assertEquals("Text", result[0].values[Relation.NAME])
+ }
+ }
+
+ @Test
+ fun testName_Uri() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += RelatedType.FRIEND
+ }
+ }).build().also { result ->
+ assertEquals("somebody", result[0].values[Relation.NAME])
+ }
+ }
+
+
+ @Test
+ fun testType_Assistant() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += CustomType.Related.ASSISTANT
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_ASSISTANT, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Brother() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += CustomType.Related.BROTHER
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_BROTHER, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_BrotherAndSibling() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += RelatedType.SIBLING
+ types += CustomType.Related.BROTHER
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_BROTHER, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_DomesticPartner() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += CustomType.Related.DOMESTIC_PARTNER
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_DOMESTIC_PARTNER, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Father() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += CustomType.Related.FATHER
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_FATHER, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_FatherAndParent() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += RelatedType.PARENT
+ types += CustomType.Related.FATHER
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_FATHER, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Friend() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += RelatedType.FRIEND
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_FRIEND, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Kin() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += RelatedType.KIN
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_RELATIVE, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Manager() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += CustomType.Related.MANAGER
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_MANAGER, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Mother() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += CustomType.Related.MOTHER
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_MOTHER, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_MotherAndParent() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += RelatedType.PARENT
+ types += CustomType.Related.MOTHER
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_MOTHER, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_NoAndroidMapping() {
+ // some value that has no Android mapping
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += RelatedType.SWEETHEART
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_CUSTOM, result[0].values[Relation.TYPE])
+ assertEquals("Sweetheart", result[0].values[Relation.LABEL])
+ }
+ }
+
+ @Test
+ fun testType_Parent() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += RelatedType.PARENT
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_PARENT, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Partner() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += CustomType.Related.PARTNER
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_PARTNER, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_ReferredBy() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += CustomType.Related.REFERRED_BY
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_REFERRED_BY, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Sister() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += CustomType.Related.SISTER
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_SISTER, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_SisterAndSibling() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += RelatedType.SIBLING
+ types += CustomType.Related.SISTER
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_SISTER, result[0].values[Relation.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Spouse() {
+ RelationBuilder(Uri.EMPTY, null, Contact().apply {
+ relations += Related("somebody").apply {
+ types += RelatedType.SPOUSE
+ }
+ }).build().also { result ->
+ assertEquals(Relation.TYPE_SPOUSE, result[0].values[Relation.TYPE])
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/RelationHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/RelationHandlerTest.kt
new file mode 100644
index 0000000..94662bf
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/RelationHandlerTest.kt
@@ -0,0 +1,194 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.content.ContentValues
+import android.provider.ContactsContract.CommonDataKinds.Relation
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.property.CustomType
+import ezvcard.parameter.RelatedType
+import org.junit.Assert.*
+import org.junit.Test
+
+class RelationHandlerTest {
+
+ @Test
+ fun testName_Empty() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ putNull(Relation.NAME)
+ }, contact)
+ assertTrue(contact.relations.isEmpty())
+ }
+
+ @Test
+ fun testName_Text() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "A Friend")
+ put(Relation.TYPE, Relation.TYPE_FRIEND)
+ }, contact)
+ assertEquals("A Friend", contact.relations[0].text)
+ }
+
+
+ @Test
+ fun testType_Assistant() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_ASSISTANT)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Related.ASSISTANT, RelatedType.CO_WORKER), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Brother() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_BROTHER)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Related.BROTHER, RelatedType.SIBLING), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Child() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_CHILD)
+ }, contact)
+ assertArrayEquals(arrayOf(RelatedType.CHILD), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_CustomNoLabel() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_CUSTOM)
+ }, contact)
+ assertTrue(contact.relations[0].types.isEmpty())
+ }
+
+ @Test
+ fun testType_CustomWithLabel() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_CUSTOM)
+ put(Relation.LABEL, "Consultant")
+ }, contact)
+ assertArrayEquals(arrayOf(RelatedType.get("consultant")), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_DomesticPartner() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_DOMESTIC_PARTNER)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Related.DOMESTIC_PARTNER, RelatedType.SPOUSE), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Father() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_FATHER)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Related.FATHER, RelatedType.PARENT), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Friend() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_FRIEND)
+ }, contact)
+ assertArrayEquals(arrayOf(RelatedType.FRIEND), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Manager() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_MANAGER)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Related.MANAGER, RelatedType.CO_WORKER), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Mother() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_MOTHER)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Related.MOTHER, RelatedType.PARENT), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Parent() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_PARENT)
+ }, contact)
+ assertArrayEquals(arrayOf(RelatedType.PARENT), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Partner() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_PARTNER)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Related.PARTNER), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_ReferredBy() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_REFERRED_BY)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Related.REFERRED_BY), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Relative() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_RELATIVE)
+ }, contact)
+ assertArrayEquals(arrayOf(RelatedType.KIN), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Sister() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_SISTER)
+ }, contact)
+ assertArrayEquals(arrayOf(CustomType.Related.SISTER, RelatedType.SIBLING), contact.relations[0].types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Spouse() {
+ val contact = Contact()
+ RelationHandler.handle(ContentValues().apply {
+ put(Relation.NAME, "Somebody")
+ put(Relation.TYPE, Relation.TYPE_SPOUSE)
+ }, contact)
+ assertArrayEquals(arrayOf(RelatedType.SPOUSE), contact.relations[0].types.toTypedArray())
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/SipAddressBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/SipAddressBuilderTest.kt
new file mode 100644
index 0000000..02cc20f
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/SipAddressBuilderTest.kt
@@ -0,0 +1,106 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds.SipAddress
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.LabeledProperty
+import ezvcard.parameter.ImppType
+import ezvcard.property.Impp
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class SipAddressBuilderTest {
+
+ @Test
+ fun testEmpty() {
+ SipAddressBuilder(Uri.EMPTY, null, Contact()).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+
+ @Test
+ fun testHandle_Empty() {
+ SipAddressBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp(""))
+ }).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+ @Test
+ fun testHandle_NotSip() {
+ SipAddressBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.xmpp("test@example.com"))
+ }).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+ @Test
+ fun testHandle_Sip() {
+ SipAddressBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.sip("voip@example.com"))
+ }).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals("voip@example.com", result[0].values[SipAddress.SIP_ADDRESS])
+ }
+ }
+
+
+ @Test
+ fun testLabel() {
+ SipAddressBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.sip("voip@example.com"), "Label")
+ }).build().also { result ->
+ assertEquals(SipAddress.TYPE_CUSTOM, result[0].values[SipAddress.TYPE])
+ assertEquals("Label", result[0].values[SipAddress.LABEL])
+ }
+ }
+
+
+ @Test
+ fun testMimeType() {
+ SipAddressBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.sip("voip@example.com"))
+ }).build().also { result ->
+ assertEquals(SipAddress.CONTENT_ITEM_TYPE, result[0].values[SipAddress.MIMETYPE])
+ }
+ }
+
+
+ @Test
+ fun testType_Home() {
+ SipAddressBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.sip("voip@example.com").apply {
+ types.add(ImppType.HOME)
+ })
+ }).build().also { result ->
+ assertEquals(SipAddress.TYPE_HOME, result[0].values[SipAddress.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_NotInAndroid() {
+ // some vCard type that is not supported by Android
+ SipAddressBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.sip("voip@example.com").apply {
+ types.add(ImppType.MOBILE)
+ })
+ }).build().also { result ->
+ assertEquals(SipAddress.TYPE_OTHER, result[0].values[SipAddress.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Work() {
+ SipAddressBuilder(Uri.EMPTY, null, Contact().apply {
+ impps += LabeledProperty(Impp.sip("voip@example.com").apply {
+ types.add(ImppType.WORK)
+ })
+ }).build().also { result ->
+ assertEquals(SipAddress.TYPE_WORK, result[0].values[SipAddress.TYPE])
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/SipAddressHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/SipAddressHandlerTest.kt
new file mode 100644
index 0000000..66ef27c
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/SipAddressHandlerTest.kt
@@ -0,0 +1,84 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.content.ContentValues
+import android.provider.ContactsContract.CommonDataKinds.SipAddress
+import at.bitfire.vcard4android.Contact
+import ezvcard.parameter.ImppType
+import org.junit.Assert.*
+import org.junit.Test
+
+class SipAddressHandlerTest {
+
+ @Test
+ fun testHandle_Empty() {
+ val contact = Contact()
+ SipAddressHandler.handle(ContentValues().apply {
+ putNull(SipAddress.SIP_ADDRESS)
+ }, contact)
+ assertTrue(contact.impps.isEmpty())
+ }
+
+ @Test
+ fun testHandle_Value() {
+ val contact = Contact()
+ SipAddressHandler.handle(ContentValues().apply {
+ put(SipAddress.SIP_ADDRESS, "voip@example.com")
+ }, contact)
+ assertEquals("voip@example.com", contact.impps[0].property.handle)
+ }
+
+
+ @Test
+ fun testTypeCustom_NoLabel() {
+ val contact = Contact()
+ SipAddressHandler.handle(ContentValues().apply {
+ put(SipAddress.SIP_ADDRESS, "voip@example.com")
+ put(SipAddress.TYPE, SipAddress.TYPE_CUSTOM)
+ }, contact)
+ assertTrue(contact.impps[0].property.types.isEmpty())
+ assertNull(contact.impps[0].label)
+ }
+
+ @Test
+ fun testTypeCustom_WithLabel() {
+ val contact = Contact()
+ SipAddressHandler.handle(ContentValues().apply {
+ put(SipAddress.SIP_ADDRESS, "voip@example.com")
+ put(SipAddress.TYPE, SipAddress.TYPE_CUSTOM)
+ put(SipAddress.LABEL, "New SIP Type")
+ }, contact)
+ assertTrue(contact.impps[0].property.types.isEmpty())
+ assertEquals("New SIP Type", contact.impps[0].label)
+ }
+
+ @Test
+ fun testType_Home() {
+ val contact = Contact()
+ SipAddressHandler.handle(ContentValues().apply {
+ put(SipAddress.SIP_ADDRESS, "voip@example.com")
+ put(SipAddress.TYPE, SipAddress.TYPE_HOME)
+ }, contact)
+ assertEquals(ImppType.HOME, contact.impps[0].property.types[0])
+ }
+
+ @Test
+ fun testType_Other() {
+ val contact = Contact()
+ SipAddressHandler.handle(ContentValues().apply {
+ put(SipAddress.SIP_ADDRESS, "voip@example.com")
+ put(SipAddress.TYPE, SipAddress.TYPE_OTHER)
+ }, contact)
+ assertTrue(contact.impps[0].property.types.isEmpty())
+ }
+
+ @Test
+ fun testType_Work() {
+ val contact = Contact()
+ SipAddressHandler.handle(ContentValues().apply {
+ put(SipAddress.SIP_ADDRESS, "voip@example.com")
+ put(SipAddress.TYPE, SipAddress.TYPE_WORK)
+ }, contact)
+ assertEquals(ImppType.WORK, contact.impps[0].property.types[0])
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredNameBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredNameBuilderTest.kt
new file mode 100644
index 0000000..9d3af5e
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredNameBuilderTest.kt
@@ -0,0 +1,46 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds.StructuredName
+import at.bitfire.vcard4android.Contact
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class StructuredNameBuilderTest {
+
+ @Test
+ fun testEmpty() {
+ StructuredNameBuilder(Uri.EMPTY, null, Contact()).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+ @Test
+ fun testValues() {
+ StructuredNameBuilder(Uri.EMPTY, null, Contact().apply {
+ prefix = "P."
+ givenName = "Given"
+ middleName = "Middle"
+ familyName = "Family"
+ suffix = "S"
+
+ phoneticGivenName = "Phonetic Given"
+ phoneticMiddleName = "Phonetic Middle"
+ phoneticFamilyName = "Phonetic Family"
+ }).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals(StructuredName.CONTENT_ITEM_TYPE, result[0].values[StructuredName.MIMETYPE])
+
+ assertEquals("P.", result[0].values[StructuredName.PREFIX])
+ assertEquals("Given", result[0].values[StructuredName.GIVEN_NAME])
+ assertEquals("Middle", result[0].values[StructuredName.MIDDLE_NAME])
+ assertEquals("Family", result[0].values[StructuredName.FAMILY_NAME])
+ assertEquals("S", result[0].values[StructuredName.SUFFIX])
+
+ assertEquals("Phonetic Given", result[0].values[StructuredName.PHONETIC_GIVEN_NAME])
+ assertEquals("Phonetic Middle", result[0].values[StructuredName.PHONETIC_MIDDLE_NAME])
+ assertEquals("Phonetic Family", result[0].values[StructuredName.PHONETIC_FAMILY_NAME])
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredNameHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredNameHandlerTest.kt
new file mode 100644
index 0000000..7d970ec
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredNameHandlerTest.kt
@@ -0,0 +1,51 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.content.ContentValues
+import android.provider.ContactsContract.CommonDataKinds.StructuredName
+import at.bitfire.vcard4android.Contact
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNull
+import org.junit.Test
+
+class StructuredNameHandlerTest {
+
+ @Test
+ fun testEmpty() {
+ val contact = Contact()
+ StructuredNameHandler.handle(ContentValues().apply {
+ putNull(StructuredName.FAMILY_NAME)
+ }, contact)
+ assertNull(contact.prefix)
+ assertNull(contact.givenName)
+ assertNull(contact.middleName)
+ assertNull(contact.familyName)
+ assertNull(contact.suffix)
+ assertNull(contact.phoneticGivenName)
+ assertNull(contact.phoneticMiddleName)
+ assertNull(contact.phoneticFamilyName)
+ }
+
+ @Test
+ fun testValues() {
+ val contact = Contact()
+ StructuredNameHandler.handle(ContentValues().apply {
+ put(StructuredName.PREFIX, "P.")
+ put(StructuredName.GIVEN_NAME, "Given")
+ put(StructuredName.MIDDLE_NAME, "Middle")
+ put(StructuredName.FAMILY_NAME, "Family")
+ put(StructuredName.SUFFIX, "S")
+ put(StructuredName.PHONETIC_GIVEN_NAME, "PhoneticGiven")
+ put(StructuredName.PHONETIC_MIDDLE_NAME, "PhoneticMiddle")
+ put(StructuredName.PHONETIC_FAMILY_NAME, "PhoneticFamily")
+ }, contact)
+ assertEquals("P.", contact.prefix)
+ assertEquals("Given", contact.givenName)
+ assertEquals("Middle", contact.middleName)
+ assertEquals("Family", contact.familyName)
+ assertEquals("S", contact.suffix)
+ assertEquals("PhoneticGiven", contact.phoneticGivenName)
+ assertEquals("PhoneticMiddle", contact.phoneticMiddleName)
+ assertEquals("PhoneticFamily", contact.phoneticFamilyName)
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilderTest.kt
new file mode 100644
index 0000000..08b98b5
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilderTest.kt
@@ -0,0 +1,109 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds.StructuredPostal
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.LabeledProperty
+import ezvcard.parameter.AddressType
+import ezvcard.property.Address
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class StructuredPostalBuilderTest {
+
+ @Test
+ fun testEmpty() {
+ StructuredPostalBuilder(Uri.EMPTY, null, Contact()).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+
+ @Test
+ fun testLabel() {
+ val c = Contact().apply {
+ addresses += LabeledProperty(Address().apply {
+ streetAddress = "Street"
+ }, "Label")
+ }
+ StructuredPostalBuilder(Uri.EMPTY, null, c).build().also { result ->
+ assertEquals(StructuredPostal.TYPE_CUSTOM, result[0].values[StructuredPostal.TYPE])
+ assertEquals("Label", result[0].values[StructuredPostal.LABEL])
+ }
+ }
+
+
+ @Test
+ fun testValues() {
+ StructuredPostalBuilder(Uri.EMPTY, null, Contact().apply {
+ addresses += LabeledProperty(Address().apply {
+ streetAddresses += "Street 1"
+ streetAddresses += "(Corner Street 2)"
+ extendedAddress = "Hood"
+ poBox = "PO Box 123"
+ locality = "City"
+ region = "Region"
+ postalCode = "ZIP"
+ country = "Country"
+ })
+ }).build().also { result ->
+ assertEquals(1, result.size)
+ assertEquals(StructuredPostal.CONTENT_ITEM_TYPE, result[0].values[StructuredPostal.MIMETYPE])
+
+ assertEquals("Street 1\n(Corner Street 2)", result[0].values[StructuredPostal.STREET])
+ assertEquals("PO Box 123", result[0].values[StructuredPostal.POBOX])
+ assertEquals("Hood", result[0].values[StructuredPostal.NEIGHBORHOOD])
+ assertEquals("City", result[0].values[StructuredPostal.CITY])
+ assertEquals("Region", result[0].values[StructuredPostal.REGION])
+ assertEquals("ZIP", result[0].values[StructuredPostal.POSTCODE])
+ assertEquals("Country", result[0].values[StructuredPostal.COUNTRY])
+
+ assertEquals("Street 1\n" +
+ "(Corner Street 2)\n" +
+ "PO Box 123\n" +
+ "Hood\n" +
+ "ZIP City\n" +
+ "Country (Region)", result[0].values[StructuredPostal.FORMATTED_ADDRESS])
+ }
+ }
+
+
+ @Test
+ fun testType_Home() {
+ val c = Contact().apply {
+ addresses += LabeledProperty(Address().apply {
+ streetAddress = "Street"
+ types += AddressType.HOME
+ })
+ }
+ StructuredPostalBuilder(Uri.EMPTY, null, c).build().also { result ->
+ assertEquals(StructuredPostal.TYPE_HOME, result[0].values[StructuredPostal.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_None() {
+ val c = Contact().apply {
+ addresses += LabeledProperty(Address().apply {
+ streetAddress = "Street"
+ })
+ }
+ StructuredPostalBuilder(Uri.EMPTY, null, c).build().also { result ->
+ assertEquals(StructuredPostal.TYPE_OTHER, result[0].values[StructuredPostal.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Work() {
+ val c = Contact().apply {
+ addresses += LabeledProperty(Address().apply {
+ streetAddress = "Street"
+ types += AddressType.WORK
+ })
+ }
+ StructuredPostalBuilder(Uri.EMPTY, null, c).build().also { result ->
+ assertEquals(StructuredPostal.TYPE_WORK, result[0].values[StructuredPostal.TYPE])
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandlerTest.kt
new file mode 100644
index 0000000..ae5885e
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandlerTest.kt
@@ -0,0 +1,100 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.content.ContentValues
+import android.provider.ContactsContract.CommonDataKinds.StructuredPostal
+import at.bitfire.vcard4android.Contact
+import ezvcard.parameter.AddressType
+import org.junit.Assert.*
+import org.junit.Test
+
+class StructuredPostalHandlerTest {
+
+ @Test
+ fun testEmpty() {
+ val contact = Contact()
+ StructuredPostalHandler.handle(ContentValues().apply {
+ putNull(StructuredPostal.STREET)
+ }, contact)
+ assertTrue(contact.addresses.isEmpty())
+ }
+
+
+ @Test
+ fun testValues() {
+ val contact = Contact()
+ StructuredPostalHandler.handle(ContentValues().apply {
+ put(StructuredPostal.STREET, "Street 1\n(Corner Street 2)")
+ put(StructuredPostal.POBOX, "PO Box 123")
+ put(StructuredPostal.NEIGHBORHOOD, "Near the park")
+ put(StructuredPostal.CITY, "Sampletown")
+ put(StructuredPostal.REGION, "Sampleregion")
+ put(StructuredPostal.POSTCODE, "ZIP")
+ put(StructuredPostal.COUNTRY, "Samplecountry")
+
+ put(StructuredPostal.FORMATTED_ADDRESS, "Full Formatted Address")
+ }, contact)
+ assertArrayEquals(arrayOf("Street 1", "(Corner Street 2)"), contact.addresses[0].property.streetAddresses.toTypedArray())
+ assertArrayEquals(arrayOf("PO Box 123"), contact.addresses[0].property.poBoxes.toTypedArray())
+ assertArrayEquals(arrayOf("Near the park"), contact.addresses[0].property.extendedAddresses.toTypedArray())
+ assertArrayEquals(arrayOf("PO Box 123"), contact.addresses[0].property.poBoxes.toTypedArray())
+ assertArrayEquals(arrayOf("Sampletown"), contact.addresses[0].property.localities.toTypedArray())
+ assertArrayEquals(arrayOf("Sampleregion"), contact.addresses[0].property.regions.toTypedArray())
+ assertArrayEquals(arrayOf("ZIP"), contact.addresses[0].property.postalCodes.toTypedArray())
+ assertArrayEquals(arrayOf("Samplecountry"), contact.addresses[0].property.countries.toTypedArray())
+ assertEquals("Full Formatted Address", contact.addresses[0].property.label)
+ }
+
+
+ @Test
+ fun testType_CustomNoLabel() {
+ val contact = Contact()
+ StructuredPostalHandler.handle(ContentValues().apply {
+ put(StructuredPostal.STREET, "Street")
+ put(StructuredPostal.TYPE, StructuredPostal.TYPE_CUSTOM)
+ }, contact)
+ assertTrue(contact.addresses[0].property.types.isEmpty())
+ }
+
+ @Test
+ fun testType_CustomWithLabel() {
+ val contact = Contact()
+ StructuredPostalHandler.handle(ContentValues().apply {
+ put(StructuredPostal.STREET, "Street")
+ put(StructuredPostal.TYPE, StructuredPostal.TYPE_CUSTOM)
+ put(StructuredPostal.LABEL, "Label")
+ }, contact)
+ assertTrue(contact.addresses[0].property.types.isEmpty())
+ assertEquals("Label", contact.addresses[0].label)
+ }
+
+ @Test
+ fun testType_Home() {
+ val contact = Contact()
+ StructuredPostalHandler.handle(ContentValues().apply {
+ put(StructuredPostal.STREET, "Street")
+ put(StructuredPostal.TYPE, StructuredPostal.TYPE_HOME)
+ }, contact)
+ assertArrayEquals(arrayOf(AddressType.HOME), contact.addresses[0].property.types.toTypedArray())
+ }
+
+ @Test
+ fun testType_Other() {
+ val contact = Contact()
+ StructuredPostalHandler.handle(ContentValues().apply {
+ put(StructuredPostal.STREET, "Street")
+ put(StructuredPostal.TYPE, StructuredPostal.TYPE_OTHER)
+ }, contact)
+ assertTrue(contact.addresses[0].property.types.isEmpty())
+ }
+
+ @Test
+ fun testType_Work() {
+ val contact = Contact()
+ StructuredPostalHandler.handle(ContentValues().apply {
+ put(StructuredPostal.STREET, "Street")
+ put(StructuredPostal.TYPE, StructuredPostal.TYPE_WORK)
+ }, contact)
+ assertArrayEquals(arrayOf(AddressType.WORK), contact.addresses[0].property.types.toTypedArray())
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/WebsiteBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/WebsiteBuilderTest.kt
new file mode 100644
index 0000000..2b516d3
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/WebsiteBuilderTest.kt
@@ -0,0 +1,137 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.LabeledProperty
+import at.bitfire.vcard4android.property.CustomType
+import ezvcard.property.Url
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class WebsiteBuilderTest {
+
+ @Test
+ fun testEmpty() {
+ WebsiteBuilder(Uri.EMPTY, null, Contact()).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+
+ @Test
+ fun testUrl_Empty() {
+ WebsiteBuilder(Uri.EMPTY, null, Contact().apply {
+ urls += LabeledProperty(Url(""))
+ }).build().also { result ->
+ assertEquals(0, result.size)
+ }
+ }
+
+ @Test
+ fun testUrl_Value() {
+ WebsiteBuilder(Uri.EMPTY, null, Contact().apply {
+ urls += LabeledProperty(Url("https://example.com"))
+ }).build().also { result ->
+ assertEquals("https://example.com", result[0].values[CommonDataKinds.Website.URL])
+ }
+ }
+
+
+ @Test
+ fun testLabel() {
+ WebsiteBuilder(Uri.EMPTY, null, Contact().apply {
+ urls += LabeledProperty(Url("https://example.com"), "Label")
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Im.TYPE_CUSTOM, result[0].values[CommonDataKinds.Website.TYPE])
+ assertEquals("Label", result[0].values[CommonDataKinds.Website.LABEL])
+ }
+ }
+
+
+ @Test
+ fun testMimeType() {
+ WebsiteBuilder(Uri.EMPTY, null, Contact().apply {
+ urls += LabeledProperty(Url("https://example.com"))
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Website.CONTENT_ITEM_TYPE, result[0].values[CommonDataKinds.Website.MIMETYPE])
+ }
+ }
+
+
+ @Test
+ fun testType_Blog() {
+ WebsiteBuilder(Uri.EMPTY, null, Contact().apply {
+ urls += LabeledProperty(Url("https://example.com").apply {
+ type = CustomType.Url.TYPE_BLOG
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Website.TYPE_BLOG, result[0].values[CommonDataKinds.Im.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Ftp() {
+ WebsiteBuilder(Uri.EMPTY, null, Contact().apply {
+ urls += LabeledProperty(Url("ftps://example.com").apply {
+ type = CustomType.Url.TYPE_FTP
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Website.TYPE_FTP, result[0].values[CommonDataKinds.Im.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Home() {
+ WebsiteBuilder(Uri.EMPTY, null, Contact().apply {
+ urls += LabeledProperty(Url("https://example.com").apply {
+ type = CustomType.HOME
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Website.TYPE_HOME, result[0].values[CommonDataKinds.Im.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Homepage() {
+ WebsiteBuilder(Uri.EMPTY, null, Contact().apply {
+ urls += LabeledProperty(Url("https://example.com").apply {
+ type = CustomType.Url.TYPE_HOMEPAGE
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Website.TYPE_HOMEPAGE, result[0].values[CommonDataKinds.Im.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_None() {
+ WebsiteBuilder(Uri.EMPTY, null, Contact().apply {
+ urls += LabeledProperty(Url("ftps://example.com"))
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Website.TYPE_OTHER, result[0].values[CommonDataKinds.Im.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Profile() {
+ WebsiteBuilder(Uri.EMPTY, null, Contact().apply {
+ urls += LabeledProperty(Url("https://example.com").apply {
+ type = CustomType.Url.TYPE_PROFILE
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Website.TYPE_PROFILE, result[0].values[CommonDataKinds.Im.TYPE])
+ }
+ }
+
+ @Test
+ fun testType_Work() {
+ WebsiteBuilder(Uri.EMPTY, null, Contact().apply {
+ urls += LabeledProperty(Url("https://example.com").apply {
+ type = CustomType.WORK
+ })
+ }).build().also { result ->
+ assertEquals(CommonDataKinds.Website.TYPE_WORK, result[0].values[CommonDataKinds.Im.TYPE])
+ }
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/contactrow/WebsiteHandlerTest.kt b/src/androidTest/java/at/bitfire/vcard4android/contactrow/WebsiteHandlerTest.kt
new file mode 100644
index 0000000..745661b
--- /dev/null
+++ b/src/androidTest/java/at/bitfire/vcard4android/contactrow/WebsiteHandlerTest.kt
@@ -0,0 +1,113 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.content.ContentValues
+import android.provider.ContactsContract.CommonDataKinds.Website
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.property.CustomType
+import org.junit.Assert.*
+import org.junit.Test
+
+class WebsiteHandlerTest {
+
+ @Test
+ fun testUrl_Empty() {
+ val contact = Contact()
+ WebsiteHandler.handle(ContentValues().apply {
+ putNull(Website.URL)
+ }, contact)
+ assertTrue(contact.urls.isEmpty())
+ }
+
+ @Test
+ fun testUrl_Value() {
+ val contact = Contact()
+ WebsiteHandler.handle(ContentValues().apply {
+ put(Website.URL, "https://example.com")
+ }, contact)
+ assertEquals("https://example.com", contact.urls[0].property.value)
+ }
+
+
+ @Test
+ fun testType_Blog() {
+ val contact = Contact()
+ WebsiteHandler.handle(ContentValues().apply {
+ put(Website.URL, "https://example.com")
+ put(Website.TYPE, Website.TYPE_BLOG)
+ }, contact)
+ assertEquals(CustomType.Url.TYPE_BLOG, contact.urls[0].property.type)
+ }
+
+ @Test
+ fun testType_Custom_Label() {
+ val contact = Contact()
+ WebsiteHandler.handle(ContentValues().apply {
+ put(Website.URL, "https://example.com")
+ put(Website.TYPE, Website.TYPE_CUSTOM)
+ put(Website.LABEL, "Label")
+ }, contact)
+ assertNull(contact.urls[0].property.type)
+ assertEquals("Label", contact.urls[0].label)
+ }
+
+ @Test
+ fun testType_Custom_NoLabel() {
+ val contact = Contact()
+ WebsiteHandler.handle(ContentValues().apply {
+ put(Website.URL, "https://example.com")
+ put(Website.TYPE, Website.TYPE_CUSTOM)
+ }, contact)
+ assertNull(contact.urls[0].property.type)
+ }
+
+ @Test
+ fun testType_Ftp() {
+ val contact = Contact()
+ WebsiteHandler.handle(ContentValues().apply {
+ put(Website.URL, "https://example.com")
+ put(Website.TYPE, Website.TYPE_FTP)
+ }, contact)
+ assertEquals(CustomType.Url.TYPE_FTP, contact.urls[0].property.type)
+ }
+
+ @Test
+ fun testType_Home() {
+ val contact = Contact()
+ WebsiteHandler.handle(ContentValues().apply {
+ put(Website.URL, "https://example.com")
+ put(Website.TYPE, Website.TYPE_HOME)
+ }, contact)
+ assertEquals(CustomType.HOME, contact.urls[0].property.type)
+ }
+
+ @Test
+ fun testType_Homepage() {
+ val contact = Contact()
+ WebsiteHandler.handle(ContentValues().apply {
+ put(Website.URL, "https://example.com")
+ put(Website.TYPE, Website.TYPE_HOMEPAGE)
+ }, contact)
+ assertEquals(CustomType.Url.TYPE_HOMEPAGE, contact.urls[0].property.type)
+ }
+
+ @Test
+ fun testType_Profile() {
+ val contact = Contact()
+ WebsiteHandler.handle(ContentValues().apply {
+ put(Website.URL, "https://example.com")
+ put(Website.TYPE, Website.TYPE_PROFILE)
+ }, contact)
+ assertEquals(CustomType.Url.TYPE_PROFILE, contact.urls[0].property.type)
+ }
+
+ @Test
+ fun testType_Work() {
+ val contact = Contact()
+ WebsiteHandler.handle(ContentValues().apply {
+ put(Website.URL, "https://example.com")
+ put(Website.TYPE, Website.TYPE_WORK)
+ }, contact)
+ assertEquals(CustomType.WORK, contact.urls[0].property.type)
+ }
+
+} \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/datarow/NicknameBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/datarow/NicknameBuilderTest.kt
deleted file mode 100644
index 642b790..0000000
--- a/src/androidTest/java/at/bitfire/vcard4android/datarow/NicknameBuilderTest.kt
+++ /dev/null
@@ -1,94 +0,0 @@
-package at.bitfire.vcard4android.datarow
-
-import android.net.Uri
-import android.provider.ContactsContract.CommonDataKinds
-import at.bitfire.vcard4android.LabeledProperty
-import at.bitfire.vcard4android.property.CustomType
-import ezvcard.property.Nickname
-import org.junit.Assert.assertEquals
-import org.junit.Test
-
-/*class NicknameBuilderTest {
-
- @Test
- fun testEmpty() {
- NicknameBuilder(Uri.EMPTY, null, LabeledProperty(Nickname())).build().also { result ->
- assertEquals(0, result.size)
- }
- }
-
-
- @Test
- fun testLabel() {
- NicknameBuilder(Uri.EMPTY, null, LabeledProperty(Nickname().apply {
- values.add("Nick 1")
- type = CustomType.Nickname.SHORT_NAME // will be ignored because there's a label
- }, "Label 1")).build().also { result ->
- assertEquals(1, result.size)
- assertEquals("Nick 1", result[0].values[CommonDataKinds.Nickname.NAME])
- assertEquals(CommonDataKinds.Nickname.TYPE_CUSTOM, result[0].values[CommonDataKinds.Nickname.TYPE])
- assertEquals("Label 1", result[0].values[CommonDataKinds.Nickname.LABEL])
- }
- }
-
-
- @Test
- fun testMimeType() {
- NicknameBuilder(Uri.EMPTY, null, LabeledProperty(Nickname().apply {
- values.add("Name 1")
- })).build().also { result ->
- assertEquals(CommonDataKinds.Nickname.CONTENT_ITEM_TYPE, result[0].values[CommonDataKinds.Nickname.MIMETYPE])
- }
- }
-
-
- @Test
- fun testType_Initials() {
- NicknameBuilder(Uri.EMPTY, null, LabeledProperty(Nickname().apply {
- values.add("Nick 1")
- type = CustomType.Nickname.INITIALS
- })).build().also { result ->
- assertEquals(1, result.size)
- assertEquals("Nick 1", result[0].values[CommonDataKinds.Nickname.NAME])
- assertEquals(CommonDataKinds.Nickname.TYPE_INITIALS, result[0].values[CommonDataKinds.Nickname.TYPE])
- }
- }
-
- @Test
- fun testType_MaidenName() {
- NicknameBuilder(Uri.EMPTY, null, LabeledProperty(Nickname().apply {
- values.add("Nick 1")
- type = CustomType.Nickname.MAIDEN_NAME
- })).build().also { result ->
- assertEquals(1, result.size)
- assertEquals("Nick 1", result[0].values[CommonDataKinds.Nickname.NAME])
- assertEquals(CommonDataKinds.Nickname.TYPE_MAIDEN_NAME, result[0].values[CommonDataKinds.Nickname.TYPE])
- }
- }
-
- @Test
- fun testType_ShortName() {
- NicknameBuilder(Uri.EMPTY, null, LabeledProperty(Nickname().apply {
- values.add("Nick 1")
- type = CustomType.Nickname.SHORT_NAME
- })).build().also { result ->
- assertEquals(1, result.size)
- assertEquals("Nick 1", result[0].values[CommonDataKinds.Nickname.NAME])
- assertEquals(CommonDataKinds.Nickname.TYPE_SHORT_NAME, result[0].values[CommonDataKinds.Nickname.TYPE])
- }
- }
-
-
- @Test
- fun testValue_TwoValues() {
- NicknameBuilder(Uri.EMPTY, null, LabeledProperty(Nickname().apply {
- values.add("Nick 1")
- values.add("Nick 2")
- })).build().also { result ->
- assertEquals(2, result.size)
- assertEquals("Nick 1", result[0].values[CommonDataKinds.Nickname.NAME])
- assertEquals("Nick 2", result[1].values[CommonDataKinds.Nickname.NAME])
- }
- }
-
-}*/ \ No newline at end of file
diff --git a/src/androidTest/java/at/bitfire/vcard4android/datarow/StructuredNameBuilderTest.kt b/src/androidTest/java/at/bitfire/vcard4android/datarow/StructuredNameBuilderTest.kt
deleted file mode 100644
index da3b59b..0000000
--- a/src/androidTest/java/at/bitfire/vcard4android/datarow/StructuredNameBuilderTest.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-package at.bitfire.vcard4android.datarow
-
-import android.net.Uri
-import android.provider.ContactsContract
-import at.bitfire.vcard4android.Contact
-import org.junit.Assert.assertEquals
-import org.junit.Test
-
-class StructuredNameBuilderTest {
-
- @Test
- fun testEmpty() {
- StructuredNameBuilder("", Uri.EMPTY, null, Contact()).build().also { result ->
- assertEquals(0, result.size)
- }
- }
-
- @Test
- fun testValues() {
- StructuredNameBuilder("", Uri.EMPTY, null, Contact().apply {
- prefix = "P."
- givenName = "Given"
- middleName = "Middle"
- familyName = "Family"
- suffix = "S"
-
- phoneticGivenName = "Phonetic Given"
- phoneticMiddleName = "Phonetic Middle"
- phoneticFamilyName = "Phonetic Family"
- }).build().also { result ->
- assertEquals(1, result.size)
-
- assertEquals("P.", result[0].values[ContactsContract.CommonDataKinds.StructuredName.PREFIX])
- assertEquals("Given", result[0].values[ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME])
- assertEquals("Middle", result[0].values[ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME])
- assertEquals("Family", result[0].values[ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME])
- assertEquals("S", result[0].values[ContactsContract.CommonDataKinds.StructuredName.SUFFIX])
-
- assertEquals("Phonetic Given", result[0].values[ContactsContract.CommonDataKinds.StructuredName.PHONETIC_GIVEN_NAME])
- assertEquals("Phonetic Middle", result[0].values[ContactsContract.CommonDataKinds.StructuredName.PHONETIC_MIDDLE_NAME])
- assertEquals("Phonetic Family", result[0].values[ContactsContract.CommonDataKinds.StructuredName.PHONETIC_FAMILY_NAME])
- }
- }
-
-} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/AndroidContact.kt b/src/main/java/at/bitfire/vcard4android/AndroidContact.kt
index 45ca96b..a19b5aa 100644
--- a/src/main/java/at/bitfire/vcard4android/AndroidContact.kt
+++ b/src/main/java/at/bitfire/vcard4android/AndroidContact.kt
@@ -18,12 +18,12 @@ import android.provider.ContactsContract
import android.provider.ContactsContract.RawContacts
import android.provider.ContactsContract.RawContacts.Data
import androidx.annotation.CallSuper
-import at.bitfire.vcard4android.datarow.ContactProcessor
+import at.bitfire.vcard4android.contactrow.ContactProcessor
import org.apache.commons.lang3.builder.ToStringBuilder
import java.io.FileNotFoundException
open class AndroidContact(
- val addressBook: AndroidAddressBook<out AndroidContact, out AndroidGroup>
+ open val addressBook: AndroidAddressBook<out AndroidContact, out AndroidGroup>
) {
companion object {
diff --git a/src/main/java/at/bitfire/vcard4android/Contact.kt b/src/main/java/at/bitfire/vcard4android/Contact.kt
index 6935570..889a812 100644
--- a/src/main/java/at/bitfire/vcard4android/Contact.kt
+++ b/src/main/java/at/bitfire/vcard4android/Contact.kt
@@ -88,20 +88,9 @@ class Contact {
const val LABEL_GROUP_PREFIX = "item"
- // TEL x-types to store Android types
- val PHONE_TYPE_CALLBACK = TelephoneType.get("x-callback")!!
- val PHONE_TYPE_COMPANY_MAIN = TelephoneType.get("x-company_main")!!
- val PHONE_TYPE_RADIO = TelephoneType.get("x-radio")!!
- val PHONE_TYPE_ASSISTANT = TelephoneType.get("X-assistant")!!
- val PHONE_TYPE_MMS = TelephoneType.get("x-mms")!!
-
- // EMAIL x-types to store Android types
- val EMAIL_TYPE_MOBILE = EmailType.get("x-mobile")!!
-
const val DATE_PARAMETER_OMIT_YEAR = "X-APPLE-OMIT-YEAR"
const val DATE_PARAMETER_OMIT_YEAR_DEFAULT = 1604
-
/**
* Parses an InputStream that contains a vCard.
*
diff --git a/src/main/java/at/bitfire/vcard4android/ContactReader.kt b/src/main/java/at/bitfire/vcard4android/ContactReader.kt
index 2d65083..5590257 100644
--- a/src/main/java/at/bitfire/vcard4android/ContactReader.kt
+++ b/src/main/java/at/bitfire/vcard4android/ContactReader.kt
@@ -7,6 +7,7 @@ import ezvcard.VCard
import ezvcard.parameter.RelatedType
import ezvcard.property.*
import ezvcard.util.PartialDate
+import org.apache.commons.lang3.ObjectUtils
import org.apache.commons.lang3.StringUtils
import java.net.URI
import java.net.URISyntaxException
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/ContactProcessor.kt b/src/main/java/at/bitfire/vcard4android/contactrow/ContactProcessor.kt
index c34470a..3ceb183 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/ContactProcessor.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/ContactProcessor.kt
@@ -1,9 +1,8 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.content.ContentProviderClient
import android.content.ContentValues
import android.net.Uri
-import android.provider.ContactsContract.CommonDataKinds.GroupMembership
import android.provider.ContactsContract.RawContacts
import at.bitfire.vcard4android.AndroidContact
import at.bitfire.vcard4android.BatchOperation
@@ -11,7 +10,6 @@ import at.bitfire.vcard4android.Constants
import at.bitfire.vcard4android.Contact
import at.bitfire.vcard4android.datavalues.EmailHandler
import at.bitfire.vcard4android.datavalues.PhotoHandler
-import java.util.*
import java.util.logging.Level
class ContactProcessor(
@@ -26,7 +24,7 @@ class ContactProcessor(
NicknameHandler,
NoteHandler,
OrganizationHandler,
- PhoneNumberHandler,
+ PhoneHandler,
PhotoHandler(provider),
RelationHandler,
SipAddressHandler,
@@ -35,8 +33,7 @@ class ContactProcessor(
WebsiteHandler
)
- private val dataRowBuilderFactories = LinkedList<DataRowBuilder.Factory<*>>()
- private val defaultDataRowBuilderFactories = arrayOf(
+ private val dataRowBuilderFactories = mutableListOf<DataRowBuilder.Factory<*>>(
EmailBuilder.Factory,
EventBuilder.Factory,
ImBuilder.Factory,
@@ -56,8 +53,6 @@ class ContactProcessor(
init {
for (handler in defaultDataRowHandlers)
registerHandler(handler)
- for (factory in defaultDataRowBuilderFactories)
- registerBuilderFactory(factory)
}
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/DataRowBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/DataRowBuilder.kt
index b0f5f78..5e279d7 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/DataRowBuilder.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/DataRowBuilder.kt
@@ -1,7 +1,8 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.net.Uri
import android.provider.ContactsContract
+import at.bitfire.vcard4android.AndroidAddressBook
import at.bitfire.vcard4android.BatchOperation
import at.bitfire.vcard4android.Contact
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/DataRowHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/DataRowHandler.kt
index bffdfd3..d8401b8 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/DataRowHandler.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/DataRowHandler.kt
@@ -1,6 +1,5 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
-import android.content.ContentProviderClient
import android.content.ContentValues
import androidx.annotation.CallSuper
import at.bitfire.vcard4android.Contact
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/EmailBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/EmailBuilder.kt
index 4ae918c..8f27f52 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/EmailBuilder.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/EmailBuilder.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.net.Uri
import android.provider.ContactsContract
@@ -6,12 +6,13 @@ import android.provider.ContactsContract.CommonDataKinds.Email
import at.bitfire.vcard4android.BatchOperation
import at.bitfire.vcard4android.Constants
import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.property.CustomType
import ezvcard.parameter.EmailType
import java.util.*
import java.util.logging.Level
-class EmailBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact: Contact)
- : DataRowBuilder(mimeType, dataRowUri, rawContactId, contact) {
+class EmailBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact)
+ : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) {
override fun build(): List<BatchOperation.CpoBuilder> {
val result = LinkedList<BatchOperation.CpoBuilder>()
@@ -45,7 +46,7 @@ class EmailBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, conta
when (type) {
EmailType.HOME -> typeCode = Email.TYPE_HOME
EmailType.WORK -> typeCode = Email.TYPE_WORK
- Contact.EMAIL_TYPE_MOBILE -> typeCode = Email.TYPE_MOBILE
+ CustomType.Email.MOBILE -> typeCode = Email.TYPE_MOBILE
}
}
@@ -64,7 +65,7 @@ class EmailBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, conta
object Factory: DataRowBuilder.Factory<EmailBuilder> {
override fun mimeType() = Email.CONTENT_ITEM_TYPE
override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
- EmailBuilder(mimeType(), dataRowUri, rawContactId, contact)
+ EmailBuilder(dataRowUri, rawContactId, contact)
}
} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/EmailHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/EmailHandler.kt
index 6c6aed4..b8b8d84 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/EmailHandler.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/EmailHandler.kt
@@ -4,7 +4,8 @@ import android.content.ContentValues
import android.provider.ContactsContract.CommonDataKinds.Email
import at.bitfire.vcard4android.Contact
import at.bitfire.vcard4android.LabeledProperty
-import at.bitfire.vcard4android.datarow.DataRowHandler
+import at.bitfire.vcard4android.contactrow.DataRowHandler
+import at.bitfire.vcard4android.property.CustomType
import ezvcard.parameter.EmailType
object EmailHandler: DataRowHandler() {
@@ -25,7 +26,7 @@ object EmailHandler: DataRowHandler() {
Email.TYPE_WORK ->
email.types += EmailType.WORK
Email.TYPE_MOBILE ->
- email.types += Contact.EMAIL_TYPE_MOBILE
+ email.types += CustomType.Email.MOBILE
Email.TYPE_CUSTOM ->
values.getAsString(Email.LABEL)?.let {
labeledEmail.label = it
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/EventBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/EventBuilder.kt
index 2501148..b90211b 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/EventBuilder.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/EventBuilder.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.net.Uri
import android.provider.ContactsContract.CommonDataKinds.Event
@@ -10,8 +10,8 @@ import java.text.SimpleDateFormat
import java.util.*
import java.util.logging.Level
-class EventBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact: Contact)
- : DataRowBuilder(mimeType, dataRowUri, rawContactId, contact) {
+class EventBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact)
+ : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) {
override fun build(): List<BatchOperation.CpoBuilder> {
val result = LinkedList<BatchOperation.CpoBuilder>()
@@ -19,8 +19,14 @@ class EventBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, conta
buildEvent(contact.birthDay, Event.TYPE_BIRTHDAY)?.let { result += it }
buildEvent(contact.anniversary, Event.TYPE_ANNIVERSARY)?.let { result += it }
- for (customDate in contact.customDates)
- buildEvent(customDate.property, Event.TYPE_CUSTOM, customDate.label)?.let { result += it }
+ for (customDate in contact.customDates) {
+ val label = customDate.label
+ val typeCode = if (label != null)
+ Event.TYPE_CUSTOM
+ else
+ Event.TYPE_OTHER
+ buildEvent(customDate.property, typeCode, label)?.let { result += it }
+ }
return result
}
@@ -36,7 +42,7 @@ class EventBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, conta
format.format(dateOrTime.date)
}
dateOrTime.partialDate != null ->
- dateOrTime.partialDate.toString()
+ dateOrTime.partialDate.toISO8601(true) // AOSP Contacts app expects this format ("--06-01")
else -> {
Constants.log.log(Level.WARNING, "Ignoring date/time without (partial) date", dateOrTime)
return null
@@ -57,7 +63,7 @@ class EventBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, conta
object Factory: DataRowBuilder.Factory<EventBuilder> {
override fun mimeType() = Event.CONTENT_ITEM_TYPE
override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
- EventBuilder(mimeType(), dataRowUri, rawContactId, contact)
+ EventBuilder(dataRowUri, rawContactId, contact)
}
} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/EventHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/EventHandler.kt
index 0da95e5..1c6b7a2 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/EventHandler.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/EventHandler.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.content.ContentValues
import android.provider.ContactsContract.CommonDataKinds.Event
@@ -22,7 +22,7 @@ object EventHandler: DataRowHandler() {
override fun handle(values: ContentValues, contact: Contact) {
super.handle(values, contact)
- val dateStr = values.getAsString(Event.START_DATE)
+ val dateStr = values.getAsString(Event.START_DATE) ?: return
var full: Date? = null
var partial: PartialDate? = null
val fullFormat = SimpleDateFormat("yyyy-MM-dd", Locale.ROOT)
@@ -42,8 +42,9 @@ object EventHandler: DataRowHandler() {
contact.anniversary = if (full != null) Anniversary(full) else Anniversary(partial)
Event.TYPE_BIRTHDAY ->
contact.birthDay = if (full != null) Birthday(full) else Birthday(partial)
- Event.TYPE_OTHER,
- Event.TYPE_CUSTOM -> {
+ /* Event.TYPE_OTHER,
+ Event.TYPE_CUSTOM */
+ else -> {
val abDate = if (full != null) XAbDate(full) else XAbDate(partial)
val label = StringUtils.trimToNull(values.getAsString(Event.LABEL))
contact.customDates += LabeledProperty(abDate, label)
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/ImBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/ImBuilder.kt
index 69805ab..18ad3f5 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/ImBuilder.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/ImBuilder.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.net.Uri
import android.provider.ContactsContract.CommonDataKinds.Im
@@ -8,8 +8,8 @@ import at.bitfire.vcard4android.Contact
import ezvcard.parameter.ImppType
import java.util.*
-class ImBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact: Contact)
- : DataRowBuilder(mimeType, dataRowUri, rawContactId, contact) {
+class ImBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact)
+ : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) {
override fun build(): List<BatchOperation.CpoBuilder> {
val result = LinkedList<BatchOperation.CpoBuilder>()
@@ -55,7 +55,7 @@ class ImBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact:
object Factory: DataRowBuilder.Factory<ImBuilder> {
override fun mimeType() = Im.CONTENT_ITEM_TYPE
override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
- ImBuilder(mimeType(), dataRowUri, rawContactId, contact)
+ ImBuilder(dataRowUri, rawContactId, contact)
}
} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/ImHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/ImHandler.kt
index c491d05..f2c3968 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/ImHandler.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/ImHandler.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.content.ContentValues
import android.provider.ContactsContract.CommonDataKinds.Im
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/NicknameBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/NicknameBuilder.kt
index b96965c..ad28176 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/NicknameBuilder.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/NicknameBuilder.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.net.Uri
import android.provider.ContactsContract.CommonDataKinds
@@ -7,8 +7,8 @@ import at.bitfire.vcard4android.Contact
import at.bitfire.vcard4android.property.CustomType
import java.util.*
-class NicknameBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact: Contact)
- : DataRowBuilder(mimeType, dataRowUri, rawContactId, contact) {
+class NicknameBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact)
+ : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) {
override fun build(): List<BatchOperation.CpoBuilder> {
val labeledNick = contact.nickName ?: return emptyList()
@@ -49,7 +49,7 @@ class NicknameBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, co
object Factory: DataRowBuilder.Factory<NicknameBuilder> {
override fun mimeType() = CommonDataKinds.Nickname.CONTENT_ITEM_TYPE
override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
- NicknameBuilder(mimeType(), dataRowUri, rawContactId, contact)
+ NicknameBuilder(dataRowUri, rawContactId, contact)
}
} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/NicknameHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/NicknameHandler.kt
index 73d8108..558bf90 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/NicknameHandler.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/NicknameHandler.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.content.ContentValues
import android.provider.ContactsContract.CommonDataKinds.Nickname
@@ -11,8 +11,9 @@ object NicknameHandler: DataRowHandler() {
override fun forMimeType() = Nickname.CONTENT_ITEM_TYPE
override fun handle(values: ContentValues, contact: Contact) {
- val name = values.getAsString(Nickname.NAME) ?: return
+ super.handle(values, contact)
+ val name = values.getAsString(Nickname.NAME) ?: return
val nick = ezvcard.property.Nickname()
val labeledNick = LabeledProperty(nick)
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/NoteBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/NoteBuilder.kt
index 32229f7..9002935 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/NoteBuilder.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/NoteBuilder.kt
@@ -1,12 +1,12 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.net.Uri
import android.provider.ContactsContract.CommonDataKinds.Note
import at.bitfire.vcard4android.BatchOperation
import at.bitfire.vcard4android.Contact
-class NoteBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact: Contact)
- : DataRowBuilder(mimeType, dataRowUri, rawContactId, contact) {
+class NoteBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact)
+ : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) {
override fun build(): List<BatchOperation.CpoBuilder> {
val note = contact.note
@@ -22,7 +22,7 @@ class NoteBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contac
object Factory: DataRowBuilder.Factory<NoteBuilder> {
override fun mimeType() = Note.CONTENT_ITEM_TYPE
override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
- NoteBuilder(mimeType(), dataRowUri, rawContactId, contact)
+ NoteBuilder(dataRowUri, rawContactId, contact)
}
} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/NoteHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/NoteHandler.kt
index d5371e4..b42499a 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/NoteHandler.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/NoteHandler.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.content.ContentValues
import android.provider.ContactsContract.CommonDataKinds.Note
@@ -10,7 +10,6 @@ object NoteHandler: DataRowHandler() {
override fun handle(values: ContentValues, contact: Contact) {
super.handle(values, contact)
-
contact.note = values.getAsString(Note.NOTE)
}
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/OrganizationBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/OrganizationBuilder.kt
index 3af4c98..571ca04 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/OrganizationBuilder.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/OrganizationBuilder.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.net.Uri
import android.provider.ContactsContract.CommonDataKinds.Organization
@@ -7,8 +7,8 @@ import at.bitfire.vcard4android.Contact
import org.apache.commons.lang3.StringUtils
import java.util.*
-class OrganizationBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact: Contact)
- : DataRowBuilder(mimeType, dataRowUri, rawContactId, contact) {
+class OrganizationBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact)
+ : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) {
override fun build(): List<BatchOperation.CpoBuilder> {
var company: String? = null
@@ -39,7 +39,7 @@ class OrganizationBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?
object Factory: DataRowBuilder.Factory<OrganizationBuilder> {
override fun mimeType() = Organization.CONTENT_ITEM_TYPE
override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
- OrganizationBuilder(mimeType(), dataRowUri, rawContactId, contact)
+ OrganizationBuilder(dataRowUri, rawContactId, contact)
}
} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/OrganizationHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/OrganizationHandler.kt
index 18c88e8..3de189f 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/OrganizationHandler.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/OrganizationHandler.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.content.ContentValues
import android.provider.ContactsContract.CommonDataKinds.Organization
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/PhoneBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/PhoneBuilder.kt
index d9cb8f7..26718ee 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/PhoneBuilder.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/PhoneBuilder.kt
@@ -1,16 +1,17 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.net.Uri
import android.provider.ContactsContract.CommonDataKinds.Phone
import at.bitfire.vcard4android.BatchOperation
import at.bitfire.vcard4android.Constants
import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.property.CustomType
import ezvcard.parameter.TelephoneType
import java.util.*
import java.util.logging.Level
-class PhoneBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact: Contact)
- : DataRowBuilder(mimeType, dataRowUri, rawContactId, contact) {
+class PhoneBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact)
+ : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) {
override fun build(): List<BatchOperation.CpoBuilder> {
val result = LinkedList<BatchOperation.CpoBuilder>()
@@ -42,17 +43,17 @@ class PhoneBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, conta
} else {
when {
// 1 Android type <-> 2 vCard types: fax, cell, pager
+ types.contains(TelephoneType.CELL) ->
+ typeCode = if (types.contains(TelephoneType.WORK))
+ Phone.TYPE_WORK_MOBILE
+ else
+ Phone.TYPE_MOBILE
types.contains(TelephoneType.FAX) ->
typeCode = when {
types.contains(TelephoneType.HOME) -> Phone.TYPE_FAX_HOME
types.contains(TelephoneType.WORK) -> Phone.TYPE_FAX_WORK
else -> Phone.TYPE_OTHER_FAX
}
- types.contains(TelephoneType.CELL) ->
- typeCode = if (types.contains(TelephoneType.WORK))
- Phone.TYPE_WORK_MOBILE
- else
- Phone.TYPE_MOBILE
types.contains(TelephoneType.PAGER) ->
typeCode = if (types.contains(TelephoneType.WORK))
Phone.TYPE_WORK_PAGER
@@ -64,19 +65,19 @@ class PhoneBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, conta
typeCode = Phone.TYPE_HOME
types.contains(TelephoneType.WORK) ->
typeCode = Phone.TYPE_WORK
- types.contains(Contact.PHONE_TYPE_CALLBACK) ->
+ types.contains(CustomType.Phone.CALLBACK) ->
typeCode = Phone.TYPE_CALLBACK
types.contains(TelephoneType.CAR) ->
typeCode = Phone.TYPE_CAR
- types.contains(Contact.PHONE_TYPE_COMPANY_MAIN) ->
+ types.contains(CustomType.Phone.COMPANY_MAIN) ->
typeCode = Phone.TYPE_COMPANY_MAIN
types.contains(TelephoneType.ISDN) ->
typeCode = Phone.TYPE_ISDN
- types.contains(Contact.PHONE_TYPE_RADIO) ->
+ types.contains(CustomType.Phone.RADIO) ->
typeCode = Phone.TYPE_RADIO
- types.contains(Contact.PHONE_TYPE_ASSISTANT) ->
+ types.contains(CustomType.Phone.ASSISTANT) ->
typeCode = Phone.TYPE_ASSISTANT
- types.contains(Contact.PHONE_TYPE_MMS) ->
+ types.contains(CustomType.Phone.MMS) ->
typeCode = Phone.TYPE_MMS
}
}
@@ -96,7 +97,7 @@ class PhoneBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, conta
object Factory: DataRowBuilder.Factory<PhoneBuilder> {
override fun mimeType() = Phone.CONTENT_ITEM_TYPE
override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
- PhoneBuilder(mimeType(), dataRowUri, rawContactId, contact)
+ PhoneBuilder(dataRowUri, rawContactId, contact)
}
} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/PhoneNumberHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/PhoneHandler.kt
index 6650a39..7e3020e 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/PhoneNumberHandler.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/PhoneHandler.kt
@@ -1,13 +1,14 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.content.ContentValues
import android.provider.ContactsContract.CommonDataKinds.Phone
import at.bitfire.vcard4android.Contact
import at.bitfire.vcard4android.LabeledProperty
+import at.bitfire.vcard4android.property.CustomType
import ezvcard.parameter.TelephoneType
import ezvcard.property.Telephone
-object PhoneNumberHandler: DataRowHandler() {
+object PhoneHandler: DataRowHandler() {
override fun forMimeType() = Phone.CONTENT_ITEM_TYPE
@@ -36,11 +37,11 @@ object PhoneNumberHandler: DataRowHandler() {
Phone.TYPE_PAGER ->
tel.types += TelephoneType.PAGER
Phone.TYPE_CALLBACK ->
- tel.types += Contact.PHONE_TYPE_CALLBACK
+ tel.types += CustomType.Phone.CALLBACK
Phone.TYPE_CAR ->
tel.types += TelephoneType.CAR
Phone.TYPE_COMPANY_MAIN ->
- tel.types += Contact.PHONE_TYPE_COMPANY_MAIN
+ tel.types += CustomType.Phone.COMPANY_MAIN
Phone.TYPE_ISDN ->
tel.types += TelephoneType.ISDN
Phone.TYPE_MAIN ->
@@ -48,7 +49,7 @@ object PhoneNumberHandler: DataRowHandler() {
Phone.TYPE_OTHER_FAX ->
tel.types += TelephoneType.FAX
Phone.TYPE_RADIO ->
- tel.types += Contact.PHONE_TYPE_RADIO
+ tel.types += CustomType.Phone.RADIO
Phone.TYPE_TELEX ->
tel.types += TelephoneType.TEXTPHONE
Phone.TYPE_TTY_TDD ->
@@ -62,9 +63,9 @@ object PhoneNumberHandler: DataRowHandler() {
tel.types += TelephoneType.WORK
}
Phone.TYPE_ASSISTANT ->
- tel.types += Contact.PHONE_TYPE_ASSISTANT
+ tel.types += CustomType.Phone.ASSISTANT
Phone.TYPE_MMS ->
- tel.types += Contact.PHONE_TYPE_MMS
+ tel.types += CustomType.Phone.MMS
Phone.TYPE_CUSTOM -> {
values.getAsString(Phone.LABEL)?.let { label ->
labeledNumber.label = label
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/PhotoBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/PhotoBuilder.kt
index 3925ec9..5fca982 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/PhotoBuilder.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/PhotoBuilder.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.graphics.Bitmap
import android.graphics.BitmapFactory
@@ -11,8 +11,8 @@ import at.bitfire.vcard4android.Contact
import java.io.ByteArrayOutputStream
import java.util.*
-class PhotoBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact: Contact)
- : DataRowBuilder(mimeType, dataRowUri, rawContactId, contact) {
+class PhotoBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact)
+ : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) {
companion object {
val MAX_PHOTO_BLOB_SIZE = 950*1024 // IPC limit 1 MB, minus 50 kB for the protocol itself = 950 kB
@@ -89,7 +89,7 @@ class PhotoBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, conta
object Factory: DataRowBuilder.Factory<PhotoBuilder> {
override fun mimeType() = Photo.CONTENT_ITEM_TYPE
override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
- PhotoBuilder(mimeType(), dataRowUri, rawContactId, contact)
+ PhotoBuilder(dataRowUri, rawContactId, contact)
}
} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/PhotoHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/PhotoHandler.kt
index 7f57b5c..a7f03b6 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/PhotoHandler.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/PhotoHandler.kt
@@ -7,7 +7,7 @@ import android.provider.ContactsContract
import android.provider.ContactsContract.CommonDataKinds.Photo
import at.bitfire.vcard4android.Constants
import at.bitfire.vcard4android.Contact
-import at.bitfire.vcard4android.datarow.DataRowHandler
+import at.bitfire.vcard4android.contactrow.DataRowHandler
import org.apache.commons.io.IOUtils
import java.io.IOException
import java.util.logging.Level
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/RelationBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/RelationBuilder.kt
index fc0894e..0298e1a 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/RelationBuilder.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/RelationBuilder.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.net.Uri
import android.provider.ContactsContract.CommonDataKinds.Relation
@@ -10,8 +10,8 @@ import org.apache.commons.lang3.StringUtils
import org.apache.commons.text.WordUtils
import java.util.*
-class RelationBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact: Contact)
- : DataRowBuilder(mimeType, dataRowUri, rawContactId, contact) {
+class RelationBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact)
+ : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) {
override fun build(): List<BatchOperation.CpoBuilder> {
val result = LinkedList<BatchOperation.CpoBuilder>()
@@ -64,7 +64,7 @@ class RelationBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, co
object Factory: DataRowBuilder.Factory<RelationBuilder> {
override fun mimeType() = Relation.CONTENT_ITEM_TYPE
override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
- RelationBuilder(mimeType(), dataRowUri, rawContactId, contact)
+ RelationBuilder(dataRowUri, rawContactId, contact)
}
} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/RelationHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/RelationHandler.kt
index 302ccc7..b4d0283 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/RelationHandler.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/RelationHandler.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.content.ContentValues
import android.provider.ContactsContract.CommonDataKinds.Relation
@@ -14,7 +14,6 @@ object RelationHandler: DataRowHandler() {
override fun handle(values: ContentValues, contact: Contact) {
super.handle(values, contact)
-
val name = values.getAsString(Relation.NAME) ?: return
val related = Related()
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/SipAddressBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/SipAddressBuilder.kt
index ac147eb..1c3812a 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/SipAddressBuilder.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/SipAddressBuilder.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.net.Uri
import android.provider.ContactsContract.CommonDataKinds.SipAddress
@@ -7,8 +7,8 @@ import at.bitfire.vcard4android.Contact
import ezvcard.parameter.ImppType
import java.util.*
-class SipAddressBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact: Contact)
- : DataRowBuilder(mimeType, dataRowUri, rawContactId, contact) {
+class SipAddressBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact)
+ : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) {
override fun build(): List<BatchOperation.CpoBuilder> {
val result = LinkedList<BatchOperation.CpoBuilder>()
@@ -48,7 +48,7 @@ class SipAddressBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?,
object Factory: DataRowBuilder.Factory<SipAddressBuilder> {
override fun mimeType() = SipAddress.CONTENT_ITEM_TYPE
override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
- SipAddressBuilder(mimeType(), dataRowUri, rawContactId, contact)
+ SipAddressBuilder(dataRowUri, rawContactId, contact)
}
} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/SipAddressHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/SipAddressHandler.kt
index 0290c13..5fd48e3 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/SipAddressHandler.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/SipAddressHandler.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.content.ContentValues
import android.provider.ContactsContract.CommonDataKinds.SipAddress
@@ -14,7 +14,6 @@ object SipAddressHandler: DataRowHandler() {
override fun handle(values: ContentValues, contact: Contact) {
super.handle(values, contact)
-
val sip = values.getAsString(SipAddress.SIP_ADDRESS) ?: return
try {
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/StructuredNameBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/StructuredNameBuilder.kt
index 17ec159..1f050d7 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/StructuredNameBuilder.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/StructuredNameBuilder.kt
@@ -1,12 +1,12 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.net.Uri
import android.provider.ContactsContract.CommonDataKinds.StructuredName
import at.bitfire.vcard4android.BatchOperation
import at.bitfire.vcard4android.Contact
-class StructuredNameBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact: Contact)
- : DataRowBuilder(mimeType, dataRowUri, rawContactId, contact) {
+class StructuredNameBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact)
+ : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) {
override fun build(): List<BatchOperation.CpoBuilder> {
if (contact.displayName == null &&
@@ -33,7 +33,7 @@ class StructuredNameBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Lon
object Factory: DataRowBuilder.Factory<StructuredNameBuilder> {
override fun mimeType() = StructuredName.CONTENT_ITEM_TYPE
override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
- StructuredNameBuilder(mimeType(), dataRowUri, rawContactId, contact)
+ StructuredNameBuilder(dataRowUri, rawContactId, contact)
}
} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/StructuredNameHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/StructuredNameHandler.kt
index e242778..e293329 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/StructuredNameHandler.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/StructuredNameHandler.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.content.ContentValues
import android.provider.ContactsContract.CommonDataKinds.StructuredName
diff --git a/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilder.kt
new file mode 100644
index 0000000..4a367c3
--- /dev/null
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalBuilder.kt
@@ -0,0 +1,103 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.net.Uri
+import android.provider.ContactsContract.CommonDataKinds.StructuredPostal
+import at.bitfire.vcard4android.BatchOperation
+import at.bitfire.vcard4android.Contact
+import ezvcard.parameter.AddressType
+import org.apache.commons.lang3.StringUtils
+import java.util.*
+
+/**
+ * Data row builder for structured addresses.
+ *
+ * Android requires a formatted address. If the contact data doesn't contain a
+ * formatted address, it's built like this:
+ *
+ * | field | example |
+ * |-------------------|------------------------------|
+ * | street | Sample Street 123 |
+ * | poBox | P/O Box 45 |
+ * | extended | Near the park |
+ * | postalCode city | 12345 Sampletown |
+ * | country (region) | Samplecountry (Sampleregion) |
+ *
+ * TODO: should be localized (there are many different international formats)
+ *
+ */
+class StructuredPostalBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact)
+ : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) {
+
+ override fun build(): List<BatchOperation.CpoBuilder> {
+ val result = LinkedList<BatchOperation.CpoBuilder>()
+ for (labeledAddress in contact.addresses) {
+ val address = labeledAddress.property
+
+ var formattedAddress = address.label
+ if (formattedAddress.isNullOrBlank()) {
+ val lines = LinkedList<String>()
+ for (street in address.streetAddresses.filterNot { s -> s.isNullOrBlank() })
+ lines += street
+ for (poBox in address.poBoxes.filterNot { s -> s.isNullOrBlank() })
+ lines += poBox
+ for (extended in address.extendedAddresses.filterNot { s -> s.isNullOrBlank() })
+ lines += extended
+
+ val postalAndCity = LinkedList<String>()
+ if (StringUtils.trimToNull(address.postalCode) != null)
+ postalAndCity += address.postalCodes.joinToString(" / ")
+ if (StringUtils.trimToNull(address.locality) != null)
+ postalAndCity += address.localities.joinToString(" / ")
+ if (postalAndCity.isNotEmpty())
+ lines += postalAndCity.joinToString(" ")
+
+ if (StringUtils.trimToNull(address.country) != null) {
+ val line = StringBuilder(address.countries.joinToString(" / "))
+ if (!address.region.isNullOrBlank()) {
+ val regions = address.regions.joinToString(" / ")
+ line.append(" ($regions)")
+ }
+ lines += line.toString()
+ } else
+ if (!address.region.isNullOrBlank())
+ lines += address.regions.joinToString(" / ")
+
+ formattedAddress = lines.joinToString("\n")
+ }
+
+ val types = address.types
+ val typeCode: Int
+ var typeLabel: String? = null
+ if (labeledAddress.label != null) {
+ typeCode = StructuredPostal.TYPE_CUSTOM
+ typeLabel = labeledAddress.label
+ } else
+ typeCode = when {
+ types.contains(AddressType.HOME) -> StructuredPostal.TYPE_HOME
+ types.contains(AddressType.WORK) -> StructuredPostal.TYPE_WORK
+ else -> StructuredPostal.TYPE_OTHER
+ }
+
+ result += newDataRow()
+ .withValue(StructuredPostal.FORMATTED_ADDRESS, formattedAddress)
+ .withValue(StructuredPostal.TYPE, typeCode)
+ .withValue(StructuredPostal.LABEL, typeLabel)
+ .withValue(StructuredPostal.STREET, address.streetAddresses.joinToString("\n"))
+ .withValue(StructuredPostal.POBOX, address.poBoxes.joinToString("\n"))
+ .withValue(StructuredPostal.NEIGHBORHOOD, address.extendedAddresses.joinToString("\n"))
+ .withValue(StructuredPostal.CITY, address.localities.joinToString("\n"))
+ .withValue(StructuredPostal.REGION, address.regions.joinToString("\n"))
+ .withValue(StructuredPostal.POSTCODE, address.postalCodes.joinToString("\n"))
+ .withValue(StructuredPostal.COUNTRY, address.countries.joinToString("\n"))
+ }
+ return result
+ }
+
+
+ object Factory: DataRowBuilder.Factory<StructuredPostalBuilder> {
+ override fun mimeType() = StructuredPostal.CONTENT_ITEM_TYPE
+ override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
+ StructuredPostalBuilder(dataRowUri, rawContactId, contact)
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandler.kt
new file mode 100644
index 0000000..20d45e6
--- /dev/null
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/StructuredPostalHandler.kt
@@ -0,0 +1,64 @@
+package at.bitfire.vcard4android.contactrow
+
+import android.content.ContentValues
+import android.provider.ContactsContract.CommonDataKinds.StructuredPostal
+import at.bitfire.vcard4android.Contact
+import at.bitfire.vcard4android.LabeledProperty
+import ezvcard.parameter.AddressType
+import ezvcard.property.Address
+
+object StructuredPostalHandler: DataRowHandler() {
+
+ override fun forMimeType() = StructuredPostal.CONTENT_ITEM_TYPE
+
+ override fun handle(values: ContentValues, contact: Contact) {
+ super.handle(values, contact)
+
+ val address = Address()
+ val labeledAddress = LabeledProperty(address)
+
+ address.label = values.getAsString(StructuredPostal.FORMATTED_ADDRESS)
+ when (values.getAsInteger(StructuredPostal.TYPE)) {
+ StructuredPostal.TYPE_HOME ->
+ address.types += AddressType.HOME
+ StructuredPostal.TYPE_WORK ->
+ address.types += AddressType.WORK
+ StructuredPostal.TYPE_CUSTOM -> {
+ values.getAsString(StructuredPostal.LABEL)?.let {
+ labeledAddress.label = it
+ }
+ }
+ }
+ values.getAsString(StructuredPostal.STREET)?.let { streets ->
+ address.streetAddresses += streets.split('\n')
+ }
+ values.getAsString(StructuredPostal.POBOX)?.let { poBoxes ->
+ address.poBoxes += poBoxes.split('\n')
+ }
+ values.getAsString(StructuredPostal.NEIGHBORHOOD)?.let { neighborhoods ->
+ address.extendedAddresses += neighborhoods.split('\n')
+ }
+ values.getAsString(StructuredPostal.CITY)?.let { cities ->
+ address.localities += cities.split('\n')
+ }
+ values.getAsString(StructuredPostal.REGION)?.let { regions ->
+ address.regions += regions.split('\n')
+ }
+ values.getAsString(StructuredPostal.POSTCODE)?.let { postalCodes ->
+ address.postalCodes += postalCodes.split('\n')
+ }
+ values.getAsString(StructuredPostal.COUNTRY)?.let { countries ->
+ address.countries += countries.split('\n')
+ }
+
+ if (address.streetAddresses.isNotEmpty() ||
+ address.poBoxes.isNotEmpty() ||
+ address.extendedAddresses.isNotEmpty() ||
+ address.localities.isNotEmpty() ||
+ address.regions.isNotEmpty() ||
+ address.postalCodes.isNotEmpty() ||
+ address.countries.isNotEmpty())
+ contact.addresses += labeledAddress
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/WebsiteBuilder.kt b/src/main/java/at/bitfire/vcard4android/contactrow/WebsiteBuilder.kt
index f5b4eb5..16608ea 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/WebsiteBuilder.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/WebsiteBuilder.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.net.Uri
import android.provider.ContactsContract.CommonDataKinds.Website
@@ -7,8 +7,8 @@ import at.bitfire.vcard4android.Contact
import at.bitfire.vcard4android.property.CustomType
import java.util.*
-class WebsiteBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact: Contact)
- : DataRowBuilder(mimeType, dataRowUri, rawContactId, contact) {
+class WebsiteBuilder(dataRowUri: Uri, rawContactId: Long?, contact: Contact)
+ : DataRowBuilder(Factory.mimeType(), dataRowUri, rawContactId, contact) {
override fun build(): List<BatchOperation.CpoBuilder> {
val result = LinkedList<BatchOperation.CpoBuilder>()
@@ -27,13 +27,13 @@ class WebsiteBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, con
CustomType.Url.TYPE_HOMEPAGE -> Website.TYPE_HOMEPAGE
CustomType.Url.TYPE_BLOG -> Website.TYPE_BLOG
CustomType.Url.TYPE_PROFILE -> Website.TYPE_PROFILE
+ CustomType.Url.TYPE_FTP -> Website.TYPE_FTP
CustomType.HOME -> Website.TYPE_HOME
CustomType.WORK -> Website.TYPE_WORK
- CustomType.Url.TYPE_FTP -> Website.TYPE_FTP
else -> Website.TYPE_OTHER
}
- val builder = newDataRow()
+ result += newDataRow()
.withValue(Website.URL, url.value)
.withValue(Website.TYPE, typeCode)
.withValue(Website.LABEL, typeLabel)
@@ -45,7 +45,7 @@ class WebsiteBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, con
object Factory: DataRowBuilder.Factory<WebsiteBuilder> {
override fun mimeType() = Website.CONTENT_ITEM_TYPE
override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
- WebsiteBuilder(mimeType(), dataRowUri, rawContactId, contact)
+ WebsiteBuilder(dataRowUri, rawContactId, contact)
}
} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/WebsiteHandler.kt b/src/main/java/at/bitfire/vcard4android/contactrow/WebsiteHandler.kt
index 25a78a6..42255ab 100644
--- a/src/main/java/at/bitfire/vcard4android/datarow/WebsiteHandler.kt
+++ b/src/main/java/at/bitfire/vcard4android/contactrow/WebsiteHandler.kt
@@ -1,4 +1,4 @@
-package at.bitfire.vcard4android.datarow
+package at.bitfire.vcard4android.contactrow
import android.content.ContentValues
import android.provider.ContactsContract.CommonDataKinds.Website
@@ -14,7 +14,7 @@ object WebsiteHandler: DataRowHandler() {
override fun handle(values: ContentValues, contact: Contact) {
super.handle(values, contact)
- val url = Url(values.getAsString(Website.URL))
+ val url = Url(values.getAsString(Website.URL) ?: return)
val labeledUrl = LabeledProperty(url)
when (values.getAsInteger(Website.TYPE)) {
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/StructuredPostalBuilder.kt b/src/main/java/at/bitfire/vcard4android/datarow/StructuredPostalBuilder.kt
deleted file mode 100644
index ce9423a..0000000
--- a/src/main/java/at/bitfire/vcard4android/datarow/StructuredPostalBuilder.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-package at.bitfire.vcard4android.datarow
-
-import android.net.Uri
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal
-import at.bitfire.vcard4android.BatchOperation
-import at.bitfire.vcard4android.Contact
-import ezvcard.parameter.AddressType
-import java.util.*
-
-class StructuredPostalBuilder(mimeType: String, dataRowUri: Uri, rawContactId: Long?, contact: Contact)
- : DataRowBuilder(mimeType, dataRowUri, rawContactId, contact) {
-
- override fun build(): List<BatchOperation.CpoBuilder> {
- val result = LinkedList<BatchOperation.CpoBuilder>()
- for (labeledAddress in contact.addresses) {
- val address = labeledAddress.property
-
- var formattedAddress = address.label
- if (formattedAddress.isNullOrBlank()) {
- /* StructuredPostal.FORMATTED_ADDRESS must not be empty, but no formatted address
- * was in the vCard. So we build it like this:
- *
- * street po.box (extended)
- * postcode city
- * region
- * COUNTRY
- */
-
- val lineStreet = arrayOf(address.streetAddress, address.poBox, address.extendedAddress).filterNot { it.isNullOrEmpty() }.joinToString(" ")
- val lineLocality = arrayOf(address.postalCode, address.locality).filterNot { it.isNullOrEmpty() }.joinToString(" ")
-
- val lines = LinkedList<String>()
- if (lineStreet.isNotEmpty())
- lines += lineStreet
- if (lineLocality.isNotEmpty())
- lines += lineLocality
- if (!address.region.isNullOrEmpty())
- lines += address.region
- if (!address.country.isNullOrEmpty())
- lines += address.country.toUpperCase(Locale.getDefault())
-
- formattedAddress = lines.joinToString("\n")
- }
-
- val types = address.types
- val typeCode: Int
- var typeLabel: String? = null
- if (labeledAddress.label != null) {
- typeCode = StructuredPostal.TYPE_CUSTOM
- typeLabel = labeledAddress.label
- } else
- typeCode = when {
- types.contains(AddressType.HOME) -> StructuredPostal.TYPE_HOME
- types.contains(AddressType.WORK) -> StructuredPostal.TYPE_WORK
- else -> StructuredPostal.TYPE_OTHER
- }
-
- val builder = newDataRow()
- .withValue(StructuredPostal.FORMATTED_ADDRESS, formattedAddress)
- .withValue(StructuredPostal.TYPE, typeCode)
- .withValue(StructuredPostal.LABEL, typeLabel)
- .withValue(StructuredPostal.STREET, address.streetAddress)
- .withValue(StructuredPostal.POBOX, address.poBox)
- .withValue(StructuredPostal.NEIGHBORHOOD, address.extendedAddress)
- .withValue(StructuredPostal.CITY, address.locality)
- .withValue(StructuredPostal.REGION, address.region)
- .withValue(StructuredPostal.POSTCODE, address.postalCode)
- .withValue(StructuredPostal.COUNTRY, address.country)
- }
- return result
- }
-
-
- object Factory: DataRowBuilder.Factory<StructuredPostalBuilder> {
- override fun mimeType() = StructuredPostal.CONTENT_ITEM_TYPE
- override fun newInstance(dataRowUri: Uri, rawContactId: Long?, contact: Contact) =
- StructuredPostalBuilder(mimeType(), dataRowUri, rawContactId, contact)
- }
-
-} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/datarow/StructuredPostalHandler.kt b/src/main/java/at/bitfire/vcard4android/datarow/StructuredPostalHandler.kt
deleted file mode 100644
index 9d00ddb..0000000
--- a/src/main/java/at/bitfire/vcard4android/datarow/StructuredPostalHandler.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-package at.bitfire.vcard4android.datarow
-
-import android.content.ContentValues
-import android.provider.ContactsContract.CommonDataKinds.StructuredPostal
-import at.bitfire.vcard4android.Contact
-import at.bitfire.vcard4android.LabeledProperty
-import ezvcard.parameter.AddressType
-import ezvcard.property.Address
-
-object StructuredPostalHandler: DataRowHandler() {
-
- override fun forMimeType() = StructuredPostal.CONTENT_ITEM_TYPE
-
- override fun handle(values: ContentValues, contact: Contact) {
- super.handle(values, contact)
-
- val address = Address()
- val labeledAddress = LabeledProperty(address)
-
- address.label = values.getAsString(StructuredPostal.FORMATTED_ADDRESS)
- when (values.getAsInteger(StructuredPostal.TYPE)) {
- StructuredPostal.TYPE_HOME ->
- address.types += AddressType.HOME
- StructuredPostal.TYPE_WORK ->
- address.types += AddressType.WORK
- StructuredPostal.TYPE_CUSTOM -> {
- values.getAsString(StructuredPostal.LABEL)?.let {
- labeledAddress.label = it
- }
- }
- }
- address.streetAddress = values.getAsString(StructuredPostal.STREET)
- address.poBox = values.getAsString(StructuredPostal.POBOX)
- address.extendedAddress = values.getAsString(StructuredPostal.NEIGHBORHOOD)
- address.locality = values.getAsString(StructuredPostal.CITY)
- address.region = values.getAsString(StructuredPostal.REGION)
- address.postalCode = values.getAsString(StructuredPostal.POSTCODE)
- address.country = values.getAsString(StructuredPostal.COUNTRY)
- contact.addresses += labeledAddress
- }
-
-} \ No newline at end of file
diff --git a/src/main/java/at/bitfire/vcard4android/property/CustomType.kt b/src/main/java/at/bitfire/vcard4android/property/CustomType.kt
index 945182c..3a4df3f 100644
--- a/src/main/java/at/bitfire/vcard4android/property/CustomType.kt
+++ b/src/main/java/at/bitfire/vcard4android/property/CustomType.kt
@@ -1,18 +1,35 @@
package at.bitfire.vcard4android.property
+import ezvcard.parameter.EmailType
import ezvcard.parameter.RelatedType
+import ezvcard.parameter.TelephoneType
+/**
+ * Custom TYPE parameter definitions
+ */
object CustomType {
val HOME = "home"
val WORK = "work"
+ object Email {
+ val MOBILE = EmailType.get("x-mobile")
+ }
+
object Nickname {
val INITIALS = "x-initials"
val MAIDEN_NAME = "x-maiden-name"
val SHORT_NAME = "x-short-name"
}
+ object Phone {
+ val ASSISTANT = TelephoneType.get("x-assistant")!!
+ val CALLBACK = TelephoneType.get("x-callback")!!
+ val COMPANY_MAIN = TelephoneType.get("x-company_main")!!
+ val MMS = TelephoneType.get("x-mms")!!
+ val RADIO = TelephoneType.get("x-radio")!!
+ }
+
object Related {
val ASSISTANT = RelatedType.get("assistant")
val BROTHER = RelatedType.get("brother")