Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c787845e authored by cketti's avatar cketti
Browse files

Extract code to get a displayable contact letter to separate class

parent 7d11244d
Loading
Loading
Loading
Loading
+3 −22
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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);
    }

    /**
+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 = "?"
   }
}
+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)))
    }
}