Loading app/ui/src/main/java/com/fsck/k9/activity/misc/ContactPictureLoader.java +3 −22 Original line number Diff line number Diff line Loading @@ -3,8 +3,6 @@ package com.fsck.k9.activity.misc; import java.io.IOException; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.content.Context; import android.content.res.Resources; Loading @@ -18,7 +16,6 @@ import android.net.Uri; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.support.annotation.WorkerThread; import android.text.TextUtils; import android.widget.ImageView; import com.bumptech.glide.Glide; Loading @@ -38,6 +35,7 @@ import com.bumptech.glide.load.resource.transcode.BitmapToGlideDrawableTranscode import com.bumptech.glide.request.FutureTarget; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import com.fsck.k9.contacts.ContactLetterExtractor; import com.fsck.k9.helper.Contacts; import com.fsck.k9.mail.Address; import com.fsck.k9.view.RecipientSelectView.Recipient; Loading @@ -49,15 +47,7 @@ public class ContactPictureLoader { */ private static final int PICTURE_SIZE = 40; /** * Pattern to extract the letter to be displayed as fallback image. */ private static final Pattern EXTRACT_LETTER_PATTERN = Pattern.compile("\\p{L}\\p{M}*"); /** * Letter to use when {@link #EXTRACT_LETTER_PATTERN} couldn't find a match. */ private static final String FALLBACK_CONTACT_LETTER = "?"; private static final ContactLetterExtractor CONTACT_LETTER_EXTRACTOR = new ContactLetterExtractor(); private final Context context; Loading @@ -84,16 +74,7 @@ public class ContactPictureLoader { @VisibleForTesting protected static String calcUnknownContactLetter(Address address) { String letter = null; String personal = address.getPersonal(); String str = (personal != null) ? personal : address.getAddress(); Matcher m = EXTRACT_LETTER_PATTERN.matcher(str); if (m.find()) { letter = m.group(0).toUpperCase(Locale.US); } return (TextUtils.isEmpty(letter)) ? FALLBACK_CONTACT_LETTER : letter; return CONTACT_LETTER_EXTRACTOR.extractContactLetter(address); } /** Loading app/ui/src/main/java/com/fsck/k9/contacts/ContactLetterExtractor.kt 0 → 100644 +18 −0 Original line number Diff line number Diff line package com.fsck.k9.contacts import com.fsck.k9.mail.Address import java.util.Locale class ContactLetterExtractor { fun extractContactLetter(address: Address): String { val displayName = address.personal ?: address.address val matchResult = EXTRACT_LETTER_PATTERN.find(displayName) return matchResult?.value?.toUpperCase(Locale.ROOT) ?: FALLBACK_CONTACT_LETTER } companion object { private val EXTRACT_LETTER_PATTERN = Regex("\\p{L}\\p{M}*") private const val FALLBACK_CONTACT_LETTER = "?" } } app/ui/src/test/java/com/fsck/k9/contacts/ContactLetterExtractorTest.kt 0 → 100644 +60 −0 Original line number Diff line number Diff line package com.fsck.k9.contacts import com.fsck.k9.RobolectricTest import com.fsck.k9.mail.Address import org.junit.Assert.assertEquals import org.junit.Test class ContactLetterExtractorTest : RobolectricTest() { val letterExtractor = ContactLetterExtractor() @Test fun extractContactLetter_withNoNameUsesAddress() { assertExtractedLetterEquals("C", "<c@d.com>") } @Test fun extractContactLetter_withAsciiName() { assertExtractedLetterEquals("A", "abcd <a@b.com>") } @Test fun extractContactLetter_withLstroke() { assertExtractedLetterEquals("Ł", "Łatynka <a@b.com>") } @Test fun extractContactLetter_withChinese() { assertExtractedLetterEquals("千", "千里之行﹐始于足下 <a@b.com>") } @Test fun extractContactLetter_withCombinedGlyphs() { assertExtractedLetterEquals("\u0041\u0300", "\u0061\u0300 <a@b.com>") } @Test fun extractContactLetter_withSurrogatePair() { assertExtractedLetterEquals("\uD800\uDFB5", "\uD800\uDFB5 <a@b.com>") } @Test fun extractContactLetter_ignoresSpace() { assertExtractedLetterEquals("A", " abcd <a@b.com>") } @Test fun extractContactLetter_ignoresUsePunctuation() { assertExtractedLetterEquals("A", "-a <a@b.com>") } @Test fun extractContactLetter_ignoresMatchEmoji() { assertExtractedLetterEquals("?", "\uD83D\uDE00 <a@b.com>") } private fun assertExtractedLetterEquals(expected: String, address: String) { assertEquals(expected, letterExtractor.extractContactLetter(Address(address))) } } Loading
app/ui/src/main/java/com/fsck/k9/activity/misc/ContactPictureLoader.java +3 −22 Original line number Diff line number Diff line Loading @@ -3,8 +3,6 @@ package com.fsck.k9.activity.misc; import java.io.IOException; import java.util.Locale; import java.util.regex.Matcher; import java.util.regex.Pattern; import android.content.Context; import android.content.res.Resources; Loading @@ -18,7 +16,6 @@ import android.net.Uri; import android.support.annotation.Nullable; import android.support.annotation.VisibleForTesting; import android.support.annotation.WorkerThread; import android.text.TextUtils; import android.widget.ImageView; import com.bumptech.glide.Glide; Loading @@ -38,6 +35,7 @@ import com.bumptech.glide.load.resource.transcode.BitmapToGlideDrawableTranscode import com.bumptech.glide.request.FutureTarget; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import com.fsck.k9.contacts.ContactLetterExtractor; import com.fsck.k9.helper.Contacts; import com.fsck.k9.mail.Address; import com.fsck.k9.view.RecipientSelectView.Recipient; Loading @@ -49,15 +47,7 @@ public class ContactPictureLoader { */ private static final int PICTURE_SIZE = 40; /** * Pattern to extract the letter to be displayed as fallback image. */ private static final Pattern EXTRACT_LETTER_PATTERN = Pattern.compile("\\p{L}\\p{M}*"); /** * Letter to use when {@link #EXTRACT_LETTER_PATTERN} couldn't find a match. */ private static final String FALLBACK_CONTACT_LETTER = "?"; private static final ContactLetterExtractor CONTACT_LETTER_EXTRACTOR = new ContactLetterExtractor(); private final Context context; Loading @@ -84,16 +74,7 @@ public class ContactPictureLoader { @VisibleForTesting protected static String calcUnknownContactLetter(Address address) { String letter = null; String personal = address.getPersonal(); String str = (personal != null) ? personal : address.getAddress(); Matcher m = EXTRACT_LETTER_PATTERN.matcher(str); if (m.find()) { letter = m.group(0).toUpperCase(Locale.US); } return (TextUtils.isEmpty(letter)) ? FALLBACK_CONTACT_LETTER : letter; return CONTACT_LETTER_EXTRACTOR.extractContactLetter(address); } /** Loading
app/ui/src/main/java/com/fsck/k9/contacts/ContactLetterExtractor.kt 0 → 100644 +18 −0 Original line number Diff line number Diff line package com.fsck.k9.contacts import com.fsck.k9.mail.Address import java.util.Locale class ContactLetterExtractor { fun extractContactLetter(address: Address): String { val displayName = address.personal ?: address.address val matchResult = EXTRACT_LETTER_PATTERN.find(displayName) return matchResult?.value?.toUpperCase(Locale.ROOT) ?: FALLBACK_CONTACT_LETTER } companion object { private val EXTRACT_LETTER_PATTERN = Regex("\\p{L}\\p{M}*") private const val FALLBACK_CONTACT_LETTER = "?" } }
app/ui/src/test/java/com/fsck/k9/contacts/ContactLetterExtractorTest.kt 0 → 100644 +60 −0 Original line number Diff line number Diff line package com.fsck.k9.contacts import com.fsck.k9.RobolectricTest import com.fsck.k9.mail.Address import org.junit.Assert.assertEquals import org.junit.Test class ContactLetterExtractorTest : RobolectricTest() { val letterExtractor = ContactLetterExtractor() @Test fun extractContactLetter_withNoNameUsesAddress() { assertExtractedLetterEquals("C", "<c@d.com>") } @Test fun extractContactLetter_withAsciiName() { assertExtractedLetterEquals("A", "abcd <a@b.com>") } @Test fun extractContactLetter_withLstroke() { assertExtractedLetterEquals("Ł", "Łatynka <a@b.com>") } @Test fun extractContactLetter_withChinese() { assertExtractedLetterEquals("千", "千里之行﹐始于足下 <a@b.com>") } @Test fun extractContactLetter_withCombinedGlyphs() { assertExtractedLetterEquals("\u0041\u0300", "\u0061\u0300 <a@b.com>") } @Test fun extractContactLetter_withSurrogatePair() { assertExtractedLetterEquals("\uD800\uDFB5", "\uD800\uDFB5 <a@b.com>") } @Test fun extractContactLetter_ignoresSpace() { assertExtractedLetterEquals("A", " abcd <a@b.com>") } @Test fun extractContactLetter_ignoresUsePunctuation() { assertExtractedLetterEquals("A", "-a <a@b.com>") } @Test fun extractContactLetter_ignoresMatchEmoji() { assertExtractedLetterEquals("?", "\uD83D\uDE00 <a@b.com>") } private fun assertExtractedLetterEquals(expected: String, address: String) { assertEquals(expected, letterExtractor.extractContactLetter(Address(address))) } }