Skip to content
This repository was archived by the owner on May 26, 2026. It is now read-only.

Commit 9c2dbe4

Browse files
authored
Remove fromReader/writeVCard from Contact data class (#425)
* Remove Contact.writeVCard * Remove deprecated Contact.fromReader * Minor test changes
1 parent d70e790 commit 9c2dbe4

4 files changed

Lines changed: 27 additions & 38 deletions

File tree

lib/src/androidTest/kotlin/at/bitfire/synctools/storage/contacts/AndroidContactTest.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,18 @@ import androidx.test.filters.MediumTest
1515
import androidx.test.platform.app.InstrumentationRegistry
1616
import androidx.test.rule.GrantPermissionRule
1717
import at.bitfire.synctools.mapping.contacts.Contact
18+
import at.bitfire.synctools.mapping.contacts.ContactReader
19+
import at.bitfire.synctools.mapping.contacts.ContactWriter
1820
import at.bitfire.synctools.mapping.contacts.LabeledProperty
1921
import at.bitfire.synctools.storage.LocalStorageException
22+
import at.bitfire.synctools.vcard.VCardParser
2023
import at.bitfire.synctools.vcard.property.XAbDate
2124
import ezvcard.VCardVersion
2225
import ezvcard.property.Address
2326
import ezvcard.property.Birthday
2427
import ezvcard.property.Email
2528
import ezvcard.util.PartialDate
29+
import kotlinx.coroutines.runBlocking
2630
import kotlinx.coroutines.test.runTest
2731
import org.junit.Assert.assertArrayEquals
2832
import org.junit.Assert.assertEquals
@@ -115,7 +119,7 @@ class AndroidContactTest {
115119
"TEL;CELL=;PREF=:+12345\r\n" +
116120
"EMAIL;PREF=invalid:test@example.com\r\n" +
117121
"END:VCARD\r\n"
118-
val contacts = Contact.fromReader(StringReader(vCard), null)
122+
val contacts = parseVCards(vCard)
119123

120124
val dbContact = AndroidContact(addressBook, contacts.first(), null, null)
121125
dbContact.add()
@@ -139,7 +143,7 @@ class AndroidContactTest {
139143
"FN:John Doe\n\n" +
140144
"BDAY:20010415T000000+0200\n\n" +
141145
"END:VCARD\n\n"
142-
val contacts = Contact.fromReader(StringReader(vCard), null)
146+
val contacts = parseVCards(vCard)
143147

144148
assertEquals(1, contacts.size)
145149
contacts.first().birthDay.let { birthday ->
@@ -210,8 +214,16 @@ class AndroidContactTest {
210214
* So, ADR value components may contain DQUOTE (0x22) and don't have to be encoded as defined in RFC 6868 */
211215

212216
val writer = StringWriter()
213-
contact.writeVCard(VCardVersion.V4_0, writer, testProductId)
217+
ContactWriter(contact, VCardVersion.V4_0, testProductId).writeVCard(writer)
214218
assertTrue(writer.toString().contains("ADR;LABEL=My ^'Label^'\\nLine 2:;;Street \"Address\";;;;"))
215219
}
216220

221+
222+
private fun parseVCards(vCardStr: String): List<Contact> =
223+
VCardParser().parse(StringReader(vCardStr)).map { vCard ->
224+
runBlocking {
225+
ContactReader(vCard).toContact()
226+
}
227+
}
228+
217229
}

lib/src/main/kotlin/at/bitfire/synctools/mapping/contacts/Contact.kt

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,9 @@
66

77
package at.bitfire.synctools.mapping.contacts
88

9-
import at.bitfire.synctools.vcard.VCardParser
109
import at.bitfire.synctools.vcard.property.XAbDate
1110
import com.google.common.base.Ascii
1211
import com.google.common.base.MoreObjects
13-
import ezvcard.VCardVersion
1412
import ezvcard.property.Address
1513
import ezvcard.property.Anniversary
1614
import ezvcard.property.Birthday
@@ -21,9 +19,6 @@ import ezvcard.property.Organization
2119
import ezvcard.property.Related
2220
import ezvcard.property.Telephone
2321
import ezvcard.property.Url
24-
import java.io.IOException
25-
import java.io.Reader
26-
import java.io.Writer
2722
import java.util.LinkedList
2823

2924
/**
@@ -89,30 +84,6 @@ data class Contact(
8984

9085
const val TO_STRING_MAX_VALUE_SIZE = 2000
9186

92-
/**
93-
* Parses a Reader that contains a vCard.
94-
*
95-
* @param reader reader for the input stream containing the vCard (pay attention to the charset)
96-
* @param downloader will be used to download external resources like contact photos (may be null)
97-
*
98-
* @return list of filled Contact data objects (may have size 0) – doesn't return null
99-
*
100-
* @throws IOException on I/O errors when reading the stream
101-
* @throws ezvcard.io.CannotParseException when the vCard can't be parsed
102-
*/
103-
suspend fun fromReader(reader: Reader, downloader: Downloader?): List<Contact> =
104-
VCardParser().parse(reader).map { vCard ->
105-
// convert every vCard to a Contact data object
106-
ContactReader.fromVCard(vCard, downloader)
107-
}
108-
109-
}
110-
111-
112-
@Throws(IOException::class)
113-
fun writeVCard(vCardVersion: VCardVersion, writer: Writer, productId: String) {
114-
val generator = ContactWriter(this, vCardVersion, productId)
115-
generator.writeVCard(writer)
11687
}
11788

11889

lib/src/main/kotlin/at/bitfire/synctools/mapping/contacts/ContactReader.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ class ContactReader internal constructor(val vCard: VCard, val downloader: Conta
154154
/**
155155
* Converts the vCard to a [Contact].
156156
*/
157-
private suspend fun toContact(): Contact {
157+
suspend fun toContact(): Contact {
158158
val c = Contact()
159159

160160
// process standard properties; after processing, only unknown properties will remain

lib/src/test/kotlin/at/bitfire/synctools/mapping/contacts/ContactTest.kt

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package at.bitfire.synctools.mapping.contacts
88

9+
import at.bitfire.synctools.vcard.VCardParser
910
import ezvcard.VCardVersion
1011
import ezvcard.parameter.AddressType
1112
import ezvcard.parameter.EmailType
@@ -24,27 +25,32 @@ import org.junit.Assert.assertNull
2425
import org.junit.Assert.assertTrue
2526
import org.junit.Test
2627
import java.io.InputStreamReader
28+
import java.io.Reader
2729
import java.io.StringReader
2830
import java.io.StringWriter
29-
import java.nio.charset.Charset
3031
import java.time.LocalDate
3132
import java.time.OffsetDateTime
3233
import java.time.ZoneOffset
3334
import java.util.LinkedList
3435

3536
class ContactTest {
3637

37-
private suspend fun parseContact(fname: String, charset: Charset = Charsets.UTF_8): Contact =
38+
private suspend fun parseVCard(reader: Reader): Contact {
39+
val vCard = VCardParser().parse(reader).first()
40+
return ContactReader.fromVCard(vCard)
41+
}
42+
43+
private suspend fun parseContact(fname: String): Contact =
3844
javaClass.classLoader!!.getResourceAsStream(fname).use { stream ->
39-
Contact.fromReader(InputStreamReader(stream, charset), null).first()
45+
parseVCard(InputStreamReader(stream, Charsets.UTF_8))
4046
}
4147

4248
private suspend fun regenerate(c: Contact, vCardVersion: VCardVersion): Contact {
4349
val writer = StringWriter()
44-
c.writeVCard(vCardVersion, writer, testProductId)
50+
ContactWriter(c, vCardVersion, testProductId).writeVCard(writer)
4551
val vCard = writer.toString()
4652

47-
return Contact.fromReader(StringReader(vCard), null).first()
53+
return parseVCard(StringReader(vCard))
4854
}
4955

5056

0 commit comments

Comments
 (0)