159827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira/*
259827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira * Copyright (C) 2011 The Android Open Source Project
359827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira *
459827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira * Licensed under the Apache License, Version 2.0 (the "License");
559827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira * you may not use this file except in compliance with the License.
659827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira * You may obtain a copy of the License at
759827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira *
859827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira *      http://www.apache.org/licenses/LICENSE-2.0
959827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira *
1059827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira * Unless required by applicable law or agreed to in writing, software
1159827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira * distributed under the License is distributed on an "AS IS" BASIS,
1259827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1359827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira * See the License for the specific language governing permissions and
1459827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira * limitations under the License.
1559827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira */
1659827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira
1759827bad5b89a47bcb7074448b37547efca5abcbMindy Pereirapackage com.android.ex.chips;
1859827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira
194031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereiraimport android.content.Context;
20ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereiraimport android.graphics.Bitmap;
21ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereiraimport android.graphics.drawable.BitmapDrawable;
22ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereiraimport android.graphics.drawable.Drawable;
2359827bad5b89a47bcb7074448b37547efca5abcbMindy Pereiraimport android.test.AndroidTestCase;
24878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereiraimport android.test.suitebuilder.annotation.SmallTest;
254031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereiraimport android.text.Editable;
264031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereiraimport android.text.SpannableStringBuilder;
27a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereiraimport android.text.style.ImageSpan;
284031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereiraimport android.text.util.Rfc822Tokenizer;
29a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereiraimport android.widget.TextView;
304031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
314031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereiraimport com.android.ex.chips.RecipientEditTextView;
324031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereiraimport com.android.ex.chips.RecipientEntry;
334031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
34878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira@SmallTest
3559827bad5b89a47bcb7074448b37547efca5abcbMindy Pereirapublic class ChipsTest extends AndroidTestCase {
36a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira    private RecipientChip[] mMockRecips;
374031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
38a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira    private RecipientEntry[] mMockEntries;
394031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
404031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira    private Rfc822Tokenizer mTokenizer;
414031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
424031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira    private Editable mEditable;
434031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
448faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira    class BaseMockRecipientEditTextView extends RecipientEditTextView {
454031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
468faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        public BaseMockRecipientEditTextView(Context context) {
474031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira            super(context, null);
484031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira            mTokenizer = new Rfc822Tokenizer();
494031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira            setTokenizer(mTokenizer);
504031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        }
514031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
524031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        @Override
534031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        public RecipientChip[] getSortedRecipients() {
544031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira            return mMockRecips;
554031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        }
564031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
574031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        @Override
588faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        public int getLineHeight() {
598faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira            return 48;
608faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        }
618faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira
628faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        @Override
638faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        Drawable getChipBackground(RecipientEntry contact) {
648faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira            return createChipBackground();
658faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        }
668faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira
678faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        @Override
688faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        public int getViewWidth() {
698faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira            return 100;
708faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        }
718faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira    }
728faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira
738faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira    class MockRecipientEditTextView extends BaseMockRecipientEditTextView {
748faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira
758faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        public MockRecipientEditTextView(Context context) {
768faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira            super(context);
778faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira            mTokenizer = new Rfc822Tokenizer();
788faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira            setTokenizer(mTokenizer);
798faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        }
808faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira
818faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        @Override
828faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        public RecipientChip[] getSortedRecipients() {
838faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira            return mMockRecips;
848faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        }
858faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira
868faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        @Override
874031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        public Editable getText() {
884031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira            return mEditable;
894031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        }
904031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
914031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        @Override
924031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        public Editable getSpannable() {
934031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira            return mEditable;
944031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        }
95a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
96a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        @Override
97a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        public int getLineHeight() {
98a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira            return 48;
99a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        }
100ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira
10149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        @Override
10200be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        Drawable getChipBackground(RecipientEntry contact) {
103ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira            return createChipBackground();
104ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        }
10549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
10649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        @Override
10749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        public int length() {
10849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira            return mEditable != null ? mEditable.length() : 0;
10949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        }
11049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
11149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        @Override
11249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        public String toString() {
11349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira            return mEditable != null ? mEditable.toString() : "";
11449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        }
1158faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira
1168faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        @Override
1178faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        public int getViewWidth() {
1188faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira            return 100;
1198faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        }
1204031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira    }
1214031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
122391de8f776bcd194a4c155987960c5150a0059fcMindy Pereira    private class TestBaseRecipientAdapter extends BaseRecipientAdapter {
123391de8f776bcd194a4c155987960c5150a0059fcMindy Pereira        public TestBaseRecipientAdapter(Context context) {
124391de8f776bcd194a4c155987960c5150a0059fcMindy Pereira            super(context);
125391de8f776bcd194a4c155987960c5150a0059fcMindy Pereira        }
126391de8f776bcd194a4c155987960c5150a0059fcMindy Pereira    }
127391de8f776bcd194a4c155987960c5150a0059fcMindy Pereira
1284031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira    private MockRecipientEditTextView createViewForTesting() {
1294031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        mEditable = new SpannableStringBuilder();
1304031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        MockRecipientEditTextView view = new MockRecipientEditTextView(getContext());
131391de8f776bcd194a4c155987960c5150a0059fcMindy Pereira        view.setAdapter(new TestBaseRecipientAdapter(getContext()));
1324031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        return view;
1334031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira    }
1344031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
1354031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira    public void testCreateDisplayText() {
1364031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        RecipientEditTextView view = createViewForTesting();
1374031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        RecipientEntry entry = RecipientEntry.constructGeneratedEntry("User Name, Jr",
1384031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira                "user@username.com");
13900be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        String testAddress = view.createAddressText(entry);
14000be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        String testDisplay = view.createChipDisplayText(entry);
1414031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        assertEquals("Expected a properly formatted RFC email address",
14200be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira                "\"User Name, Jr\" <user@username.com>, ", testAddress);
14300be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        assertEquals("Expected a displayable name", "User Name, Jr", testDisplay);
14400be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira
1454031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
1464031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        RecipientEntry alreadyFormatted = RecipientEntry.constructFakeEntry("user@username.com, ");
14700be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        testAddress = view.createAddressText(alreadyFormatted);
14800be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        testDisplay = view.createChipDisplayText(alreadyFormatted);
1494031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        assertEquals("Expected a properly formatted RFC email address", "<user@username.com>, ",
15000be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira                testAddress);
15100be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        assertEquals("Expected a displayable name", "user@username.com", testDisplay);
1524031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
1534031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        RecipientEntry alreadyFormattedNoSpace = RecipientEntry
1544031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira                .constructFakeEntry("user@username.com,");
15500be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        testAddress = view.createAddressText(alreadyFormattedNoSpace);
1564031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        assertEquals("Expected a properly formatted RFC email address", "<user@username.com>, ",
15700be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira                testAddress);
1584031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira
1594031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        RecipientEntry alreadyNamed = RecipientEntry.constructGeneratedEntry("User Name",
1604031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira                "\"User Name, Jr\" <user@username.com>");
16100be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        testAddress = view.createAddressText(alreadyNamed);
16200be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        testDisplay = view.createChipDisplayText(alreadyNamed);
1634031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        assertEquals(
1644031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira                "Expected address that used the name not the excess address name",
16500be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira                "User Name <user@username.com>, ", testAddress);
16600be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        assertEquals("Expected a displayable name", "User Name", testDisplay);
1674031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira    }
16859827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira
1694031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira    public void testSanitizeBetween() {
170878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // First, add 2 chips and then make sure we remove
171878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // the extra content between them correctly.
172a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira        populateMocks(2);
1734031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
1744031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        String first = (String) mTokenizer.terminateToken("FIRST");
1754031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        String second = (String) mTokenizer.terminateToken("SECOND");
1764031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        String extra = "EXTRA";
177a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable = new SpannableStringBuilder();
1784031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        mEditable.append(first + extra + second);
1794031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        int firstStart = mEditable.toString().indexOf(first);
180b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int firstEnd = firstStart + first.trim().length();
1814031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        int secondStart = mEditable.toString().indexOf(second);
182b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int secondEnd = secondStart + second.trim().length();
1834031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], firstStart, firstEnd, 0);
1844031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], secondStart, secondEnd, 0);
1854031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        view.sanitizeBetween();
1864031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        String editableString = mEditable.toString();
1874031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        assertEquals(editableString.indexOf(extra), -1);
1884031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        assertEquals(editableString.indexOf(first), firstStart);
1894031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        assertEquals(editableString.indexOf(second), secondStart - extra.length());
1904031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        assertEquals(editableString, (first + second));
191c7afc9841ee6dd3bc5e19ee7269fecd466a8c6e9Mindy Pereira
192878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // Add 1 chip and make sure that we remove the extra stuff before it correctly.
1934031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        mEditable = new SpannableStringBuilder();
194a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira        populateMocks(1);
195a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira        mEditable.append(extra);
1964031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        mEditable.append(first);
1974031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        firstStart = mEditable.toString().indexOf(first);
1984031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        firstEnd = firstStart + first.length();
1994031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], firstStart, firstEnd, 0);
2004031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        view.sanitizeBetween();
2014031c89f46edea42c64e183e46d49484f1f203c0Mindy Pereira        assertEquals(mEditable.toString(), first);
202a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), firstStart
203a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira                - extra.length());
204a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira    }
205a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira
20600be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira    public void testSanitizeEnd() {
20700be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        // First, add 2 chips and then make sure we remove
20800be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        // the extra content between them correctly.
20900be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        populateMocks(2);
21000be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
21100be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        String first = (String) mTokenizer.terminateToken("FIRST");
21200be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        String second = (String) mTokenizer.terminateToken("SECOND");
21300be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        String extra = "EXTRA";
21400be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        mEditable = new SpannableStringBuilder();
21500be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        mEditable.append(first + second);
21600be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        int firstStart = mEditable.toString().indexOf(first);
21700be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        int firstEnd = firstStart + first.trim().length();
21800be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        int secondStart = mEditable.toString().indexOf(second);
21900be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        int secondEnd = secondStart + second.trim().length();
22000be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], firstStart, firstEnd, 0);
22100be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], secondStart, secondEnd, 0);
22200be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        view.sanitizeEnd();
22300be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        String editableString = mEditable.toString();
22400be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        assertEquals(editableString.indexOf(extra), -1);
22500be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        assertEquals(editableString.indexOf(first), firstStart);
22600be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        assertEquals(editableString.indexOf(second), secondStart);
22700be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        assertEquals(editableString, (first + second));
22800be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        mEditable.append(extra);
22900be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        editableString = mEditable.toString();
23000be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        assertEquals(mEditable.toString(), (first + second + extra));
23100be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        view.sanitizeEnd();
23200be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        assertEquals(mEditable.toString(), (first + second));
23300be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira    }
23400be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira
2358faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira    public void testMoreChipPlainText() {
2368faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
2378faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        view.setMoreItem(createTestMoreItem());
2388faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        String first = (String) mTokenizer.terminateToken("FIRST");
2398faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        String second = (String) mTokenizer.terminateToken("SECOND");
2408faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        String third = (String) mTokenizer.terminateToken("THIRD");
2418faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        mEditable = new SpannableStringBuilder();
2428faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        mEditable.append(first+second+third);
2438faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        int thirdStart = mEditable.toString().indexOf(third);
2448faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        int thirdEnd = thirdStart + third.trim().length();
2458faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        view.createMoreChipPlainText();
2468faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        ImageSpan moreChip = view.getMoreChip();
2478faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        assertEquals(mEditable.getSpanStart(moreChip), thirdStart);
2488faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        assertEquals(mEditable.getSpanEnd(moreChip), thirdEnd + 1);
2498faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira    }
2508faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira
2518faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira    public void testCountTokens() {
2528faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
2538faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        view.setMoreItem(createTestMoreItem());
2548faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        String first = (String) mTokenizer.terminateToken("FIRST");
2558faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        String second = (String) mTokenizer.terminateToken("SECOND");
2568faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        String third = (String) mTokenizer.terminateToken("THIRD");
2578faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        String fourth = (String) ("FOURTH,");
2588faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        String fifth = (String) ("FIFTH,");
2598faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        mEditable = new SpannableStringBuilder();
2608faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        mEditable.append(first+second+third+fourth+fifth);
2618faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        assertEquals(view.countTokens(mEditable), 5);
2628faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira    }
2638faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira
2648faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira    public void testTooManyRecips() {
2658faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        BaseMockRecipientEditTextView view = new BaseMockRecipientEditTextView(getContext());
2668faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        view.setMoreItem(createTestMoreItem());
2678faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        for (int i = 0; i < 100; i++) {
2688faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira            view.append(mTokenizer.terminateToken(i + ""));
2698faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        }
2708faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        assertEquals(view.countTokens(view.getText()), 100);
2718faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        view.handlePendingChips();
2728faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        view.createMoreChip();
2738faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        ImageSpan moreChip = view.getMoreChip();
2748faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        // We show 2 chips then place a more chip.
2758faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        int secondStart = view.getText().toString().indexOf(
2768faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira                (String) mTokenizer.terminateToken(RecipientEditTextView.CHIP_LIMIT + ""));
2778faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        assertEquals(view.getText().getSpanStart(moreChip), secondStart);
2788faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        assertEquals(view.getText().getSpanEnd(moreChip), view.length());
2798faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        assertEquals(view.getSortedRecipients(), null);
2808faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira    }
2818faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira
282a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira    public void testMoreChip() {
283878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // Add 3 chips: this is the trigger point at which the more chip will be created.
284878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // Test that adding the chips and then creating and removing the more chip, as if
285878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // the user were focusing/ removing focus from the chips field.
286a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        populateMocks(3);
287a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
288a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        view.setMoreItem(createTestMoreItem());
289a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String first = (String) mTokenizer.terminateToken("FIRST");
290a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String second = (String) mTokenizer.terminateToken("SECOND");
291a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String third = (String) mTokenizer.terminateToken("THIRD");
292a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable = new SpannableStringBuilder();
293a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.append(first+second+third);
294a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
295a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int firstStart = mEditable.toString().indexOf(first);
296b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int firstEnd = firstStart + first.trim().length();
297a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int secondStart = mEditable.toString().indexOf(second);
298b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int secondEnd = secondStart + second.trim().length();
299a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int thirdStart = mEditable.toString().indexOf(third);
300b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int thirdEnd = thirdStart + third.trim().length();
301a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0);
302a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0);
303a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0);
304a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
305a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        view.createMoreChip();
306a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.toString(), first+second+third);
307a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart);
308a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart);
309a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        // Find the more chip.
310a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        ImageSpan moreChip = view.getMoreChip();
311a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(moreChip), thirdStart);
3128faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        assertEquals(mEditable.getSpanEnd(moreChip), thirdEnd + 1);
313a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
314a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        view.removeMoreChip();
315a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.toString(), first+second+third);
316a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart);
317a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd);
318a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart);
319a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), thirdStart);
320a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), thirdEnd);
321a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        moreChip = view.getMoreChip();
322a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(moreChip), -1);
323a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
324a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        // Rinse and repeat, just in case!
325a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        view.createMoreChip();
326a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.toString(), first+second+third);
327a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart);
328a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart);
329a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        // Find the more chip.
330a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        moreChip = view.getMoreChip();
331a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(moreChip), thirdStart);
3328faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        assertEquals(mEditable.getSpanEnd(moreChip), thirdEnd + 1);
333a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
334a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        view.removeMoreChip();
335a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.toString(), first+second+third);
336a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart);
337a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd);
338a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart);
339a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), thirdStart);
340a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), thirdEnd);
341a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        moreChip = view.getMoreChip();
342a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(moreChip), -1);
343a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira    }
344a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
345a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira    public void testMoreChipLotsOfUsers() {
346878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // Test adding and removing the more chip in the case where we have a lot of users.
347a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        populateMocks(10);
348a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
349a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        view.setMoreItem(createTestMoreItem());
350a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String first = (String) mTokenizer.terminateToken("FIRST");
351a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String second = (String) mTokenizer.terminateToken("SECOND");
352a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String third = (String) mTokenizer.terminateToken("THIRD");
353a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String fourth = (String) mTokenizer.terminateToken("FOURTH");
354a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String fifth = (String) mTokenizer.terminateToken("FIFTH");
355a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String sixth = (String) mTokenizer.terminateToken("SIXTH");
356a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String seventh = (String) mTokenizer.terminateToken("SEVENTH");
357a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String eigth = (String) mTokenizer.terminateToken("EIGHTH");
358a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String ninth = (String) mTokenizer.terminateToken("NINTH");
359a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String tenth = (String) mTokenizer.terminateToken("TENTH");
360a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable = new SpannableStringBuilder();
361a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.append(first+second+third+fourth+fifth+sixth+seventh+eigth+ninth+tenth);
362a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
363a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int firstStart = mEditable.toString().indexOf(first);
364b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int firstEnd = firstStart + first.trim().length();
365a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int secondStart = mEditable.toString().indexOf(second);
366b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int secondEnd = secondStart + second.trim().length();
367a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int thirdStart = mEditable.toString().indexOf(third);
368b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int thirdEnd = thirdStart + third.trim().length();
369a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int fourthStart = mEditable.toString().indexOf(fourth);
370b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int fourthEnd = fourthStart + fourth.trim().length();
371a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int fifthStart = mEditable.toString().indexOf(fifth);
372b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int fifthEnd = fifthStart + fifth.trim().length();
373a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int sixthStart = mEditable.toString().indexOf(sixth);
374b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int sixthEnd = sixthStart + sixth.trim().length();
375a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int seventhStart = mEditable.toString().indexOf(seventh);
376b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int seventhEnd = seventhStart + seventh.trim().length();
377a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int eighthStart = mEditable.toString().indexOf(eigth);
378b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int eighthEnd = eighthStart + eigth.trim().length();
379a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int ninthStart = mEditable.toString().indexOf(ninth);
380b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int ninthEnd = ninthStart + ninth.trim().length();
381a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int tenthStart = mEditable.toString().indexOf(tenth);
382b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int tenthEnd = tenthStart + tenth.trim().length();
383a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 10], firstStart, firstEnd, 0);
384a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 9], secondStart, secondEnd, 0);
385a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 8], thirdStart, thirdEnd, 0);
386a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 7], fourthStart, fourthEnd, 0);
387a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 6], fifthStart, fifthEnd, 0);
388a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 5], sixthStart, sixthEnd, 0);
389a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 4], seventhStart, seventhEnd, 0);
390a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], eighthStart, eighthEnd, 0);
391a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], ninthStart, ninthEnd, 0);
392a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], tenthStart, tenthEnd, 0);
393a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
394a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        view.createMoreChip();
395a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.toString(), first + second + third + fourth + fifth + sixth
396a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira                + seventh + eigth + ninth + tenth);
397a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 10]), firstStart);
398a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 9]), secondStart);
399a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        // Find the more chip.
400a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        ImageSpan moreChip = view.getMoreChip();
401a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(moreChip), thirdStart);
4028faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        assertEquals(mEditable.getSpanEnd(moreChip), tenthEnd + 1);
403a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
404a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        view.removeMoreChip();
405a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.toString(), first + second + third + fourth + fifth + sixth
406a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira                + seventh + eigth + ninth + tenth);
407a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 10]), firstStart);
408a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 9]), secondStart);
409a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
410a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 8]), thirdStart);
411a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 7]), fourthStart);
412a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 6]), fifthStart);
413a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 5]), sixthStart);
414a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 4]), seventhStart);
415a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), eighthStart);
416a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), ninthStart);
417a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), tenthStart);
418a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        moreChip = view.getMoreChip();
419a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(moreChip), -1);
420a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
421a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira    }
422a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
423a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira    public void testMoreChipSpecialChars() {
424878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // Make sure the more chip correctly handles extra tokenizer characters in the middle
425878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // of chip text.
426a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        populateMocks(3);
427a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
428a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        view.setMoreItem(createTestMoreItem());
429a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String first = (String) mTokenizer.terminateToken("FI,RST");
430a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String second = (String) mTokenizer.terminateToken("SE,COND");
431a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        String third = (String) mTokenizer.terminateToken("THI,RD");
432a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable = new SpannableStringBuilder();
433a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.append(first+second+third);
434a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
435a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int firstStart = mEditable.toString().indexOf(first);
436b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int firstEnd = firstStart + first.trim().length();
437a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int secondStart = mEditable.toString().indexOf(second);
438b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int secondEnd = secondStart + second.trim().length();
439a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        int thirdStart = mEditable.toString().indexOf(third);
440b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int thirdEnd = thirdStart + third.trim().length();
441a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0);
442a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0);
443a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0);
444a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
445a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        view.createMoreChip();
446a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.toString(), first+second+third);
447a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart);
448a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart);
449a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        // Find the more chip.
450a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        ImageSpan moreChip = view.getMoreChip();
451a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(moreChip), thirdStart);
4528faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        assertEquals(mEditable.getSpanEnd(moreChip), thirdEnd + 1);
453a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
454a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        view.removeMoreChip();
455a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.toString(), first+second+third);
456a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart);
457a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd);
458a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart);
459a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), thirdStart);
460a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), thirdEnd);
461a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        moreChip = view.getMoreChip();
462a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        assertEquals(mEditable.getSpanStart(moreChip), -1);
463a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira    }
464a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
465a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira    public void testMoreChipDupes() {
466878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // Make sure the more chip is correctly added and removed when we have duplicate chips.
467a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        populateMocks(4);
468a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
469a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        view.setMoreItem(createTestMoreItem());
470a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        String first = (String) mTokenizer.terminateToken("FIRST");
471a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        String second = (String) mTokenizer.terminateToken("SECOND");
472a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        String third = (String) mTokenizer.terminateToken("THIRD");
473a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        mEditable = new SpannableStringBuilder();
474a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        mEditable.append(first+second+third+third);
475a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira
476a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        int firstStart = mEditable.toString().indexOf(first);
477b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int firstEnd = firstStart + first.trim().length();
478a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        int secondStart = mEditable.toString().indexOf(second);
479b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int secondEnd = secondStart + second.trim().length();
480a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        int thirdStart = mEditable.toString().indexOf(third);
481b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int thirdEnd = thirdStart + third.trim().length();
482a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        int thirdNextStart = mEditable.toString().indexOf(third, thirdEnd);
483b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int thirdNextEnd = thirdNextStart + third.trim().length();
484a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 4], firstStart, firstEnd, 0);
485a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], secondStart, secondEnd, 0);
486a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], thirdStart, thirdEnd, 0);
487a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdNextStart, thirdNextEnd, 0);
488a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira
489a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        view.createMoreChip();
490a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        assertEquals(mEditable.toString(), first+second+third+third);
491a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 4]), firstStart);
492a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), secondStart);
493a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        // Find the more chip.
494a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        ImageSpan moreChip = view.getMoreChip();
495a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        assertEquals(mEditable.getSpanStart(moreChip), thirdStart);
4968faa56ff909edb20154219f8d2ba6feecf1b5238Mindy Pereira        assertEquals(mEditable.getSpanEnd(moreChip), thirdNextEnd + 1);
497a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira
498a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        view.removeMoreChip();
499a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        assertEquals(mEditable.toString(), first+second+third+third);
500a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 4]), firstStart);
501a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 4]), firstEnd);
502a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), secondStart);
503a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), thirdStart);
504a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), thirdEnd);
505a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), thirdNextStart);
506a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), thirdNextEnd);
507a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        moreChip = view.getMoreChip();
508a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira        assertEquals(mEditable.getSpanStart(moreChip), -1);
509a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira    }
510a1d52e9203ea3cdfc0d1c69a8a4f99445fdd5ca1Mindy Pereira
511ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira    public void testRemoveChip() {
512878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // Create 3 chips to start and test removing chips in various postions.
513ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        populateMocks(3);
514ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
515ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        view.setMoreItem(createTestMoreItem());
516ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        String first = (String) mTokenizer.terminateToken("FIRST");
517ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        String second = (String) mTokenizer.terminateToken("SECOND");
518ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        String third = (String) mTokenizer.terminateToken("THIRD");
519ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable = new SpannableStringBuilder();
520ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.append(first + second + third);
521ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira
522ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        int firstStart = mEditable.toString().indexOf(first);
523ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        int firstEnd = firstStart + first.length();
524ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        int secondStart = mEditable.toString().indexOf(second);
525ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        int secondEnd = secondStart + second.length();
526ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        int thirdStart = mEditable.toString().indexOf(third);
527ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        int thirdEnd = thirdStart + third.length();
528ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0);
529ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0);
530ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0);
531ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.toString(), first + second + third);
532878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // Test removing the middle chip.
533ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        view.removeChip(mMockRecips[mMockRecips.length - 2]);
534ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.toString(), first + third);
535ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart);
536ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd);
537ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), -1);
538ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), -1);
539ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        int newThirdStart = mEditable.toString().indexOf(third);
540ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), newThirdStart);
541ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), newThirdStart
542ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira                + third.length());
543ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira
544878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // Test removing the first chip.
545ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        populateMocks(3);
546ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        view = createViewForTesting();
547ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        view.setMoreItem(createTestMoreItem());
548ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable = new SpannableStringBuilder();
549ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.append(first + second + third);
550ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira
551ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        firstStart = mEditable.toString().indexOf(first);
552ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        firstEnd = firstStart + first.length();
553ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        secondStart = mEditable.toString().indexOf(second);
554ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        secondEnd = secondStart + second.length();
555ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        thirdStart = mEditable.toString().indexOf(third);
556ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        thirdEnd = thirdStart + third.length();
557ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0);
558ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0);
559ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0);
560ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.toString(), first + second + third);
561ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        view.removeChip(mMockRecips[mMockRecips.length - 3]);
562ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.toString(), second + third);
563ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), -1);
564ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), -1);
565ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), 0);
566ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), second.length());
567ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        newThirdStart = mEditable.toString().indexOf(third);
568ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), newThirdStart);
569ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), newThirdStart
570ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira                + third.length());
571ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira
572878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // Test removing the last chip.
573ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        populateMocks(3);
574ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        view = createViewForTesting();
575ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        view.setMoreItem(createTestMoreItem());
576ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable = new SpannableStringBuilder();
577ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.append(first + second + third);
578ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira
579ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        firstStart = mEditable.toString().indexOf(first);
580ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        firstEnd = firstStart + first.length();
581ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        secondStart = mEditable.toString().indexOf(second);
582ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        secondEnd = secondStart + second.length();
583ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        thirdStart = mEditable.toString().indexOf(third);
584ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        thirdEnd = thirdStart + third.length();
585ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0);
586ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0);
587ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0);
588ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.toString(), first + second + third);
589ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        view.removeChip(mMockRecips[mMockRecips.length - 1]);
590ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.toString(), first + second);
591ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart);
592ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd);
593ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart);
594ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), secondEnd);
595ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), -1);
596ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), -1);
597ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira    }
598ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira
599ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira    public void testReplaceChip() {
600ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        populateMocks(3);
601ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
602ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        view.setMoreItem(createTestMoreItem());
603ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        view.setChipBackground(createChipBackground());
604ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        view.setChipHeight(48);
605ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        String first = (String) mTokenizer.terminateToken("FIRST");
606ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        String second = (String) mTokenizer.terminateToken("SECOND");
607ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        String third = (String) mTokenizer.terminateToken("THIRD");
608ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable = new SpannableStringBuilder();
609ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.append(first + second + third);
610ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira
611878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // Test replacing the first chip with a new chip.
612ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        int firstStart = mEditable.toString().indexOf(first);
613b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int firstEnd = firstStart + first.trim().length();
614ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        int secondStart = mEditable.toString().indexOf(second);
615b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int secondEnd = secondStart + second.trim().length();
616ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        int thirdStart = mEditable.toString().indexOf(third);
617b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        int thirdEnd = thirdStart + third.trim().length();
618ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0);
619ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0);
620ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0);
621ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.toString(), first + second + third);
622ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        view.replaceChip(mMockRecips[mMockRecips.length - 3], RecipientEntry
623ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira                .constructGeneratedEntry("replacement", "replacement@replacement.com"));
624ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.toString(), mTokenizer
625ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira                .terminateToken("replacement <replacement@replacement.com>")
626ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira                + second + third);
627ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), -1);
628ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), -1);
629ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), mEditable
630ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira                .toString().indexOf(second));
631ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), mEditable
632ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira                .toString().indexOf(second)
633b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira                + second.trim().length());
634ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), mEditable
635ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira                .toString().indexOf(third));
636ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), mEditable
637ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira                .toString().indexOf(third)
638b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira                + third.trim().length());
639ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        RecipientChip[] spans = mEditable.getSpans(0, mEditable.length(), RecipientChip.class);
640ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals(spans.length, 3);
641ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        spans = mEditable
642ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira                .getSpans(0, mEditable.toString().indexOf(second) - 1, RecipientChip.class);
643ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        assertEquals((String) spans[0].getDisplay(), "replacement");
644878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira
645878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira
646878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // Test replacing the middle chip with a new chip.
647878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        mEditable = new SpannableStringBuilder();
648878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        mEditable.append(first + second + third);
649878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        firstStart = mEditable.toString().indexOf(first);
650b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        firstEnd = firstStart + first.trim().length();
651878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        secondStart = mEditable.toString().indexOf(second);
652b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        secondEnd = secondStart + second.trim().length();
653878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        thirdStart = mEditable.toString().indexOf(third);
654b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        thirdEnd = thirdStart + third.trim().length();
655878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0);
656878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0);
657878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0);
658878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.toString(), first + second + third);
659878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        view.replaceChip(mMockRecips[mMockRecips.length - 2], RecipientEntry
660878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira                .constructGeneratedEntry("replacement", "replacement@replacement.com"));
661b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        assertEquals(mEditable.toString(), first + mTokenizer
662b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira                .terminateToken("replacement <replacement@replacement.com>") + third);
663878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart);
664878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd);
665878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), -1);
666878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), -1);
667878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), mEditable
668878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira                .toString().indexOf(third));
669878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), mEditable
670878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira                .toString().indexOf(third)
671b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira                + third.trim().length());
672878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        spans = mEditable.getSpans(0, mEditable.length(), RecipientChip.class);
673878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(spans.length, 3);
674878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        spans = mEditable
675878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira                .getSpans(firstEnd, mEditable.toString().indexOf(third) - 1, RecipientChip.class);
676878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals((String) spans[0].getDisplay(), "replacement");
677878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira
678878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira
679878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        // Test replacing the last chip with a new chip.
680878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        mEditable = new SpannableStringBuilder();
681878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        mEditable.append(first + second + third);
682878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        firstStart = mEditable.toString().indexOf(first);
683b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        firstEnd = firstStart + first.trim().length();
684878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        secondStart = mEditable.toString().indexOf(second);
685b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        secondEnd = secondStart + second.trim().length();
686878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        thirdStart = mEditable.toString().indexOf(third);
687b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        thirdEnd = thirdStart + third.trim().length();
688878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0);
689878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0);
690878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0);
691878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.toString(), first + second + third);
692878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        view.replaceChip(mMockRecips[mMockRecips.length - 1], RecipientEntry
693878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira                .constructGeneratedEntry("replacement", "replacement@replacement.com"));
694b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira        assertEquals(mEditable.toString(), first + second + mTokenizer
695b3e42aaf97e476719cede047394718fd001fd79bMindy Pereira                .terminateToken("replacement <replacement@replacement.com>"));
696878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 3]), firstStart);
697878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 3]), firstEnd);
698878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 2]), secondStart);
699878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 2]), secondEnd);
700878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.getSpanStart(mMockRecips[mMockRecips.length - 1]), -1);
701878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(mEditable.getSpanEnd(mMockRecips[mMockRecips.length - 1]), -1);
702878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        spans = mEditable.getSpans(0, mEditable.length(), RecipientChip.class);
703878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals(spans.length, 3);
704878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        spans = mEditable
705878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira                .getSpans(secondEnd, mEditable.length(), RecipientChip.class);
706878b7cea14b1f8583611a7df58a4406b3eca34b6Mindy Pereira        assertEquals((String) spans[0].getDisplay(), "replacement");
707ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira    }
708ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira
70949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira    public void testHandlePaste() {
71049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // Start with an empty edit field.
71149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // Add an address; the text should be left as is.
71249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
71349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setMoreItem(createTestMoreItem());
71449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setChipBackground(createChipBackground());
71549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setChipHeight(48);
71649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable = new SpannableStringBuilder();
71749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append("user@user.com");
71849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setSelection(mEditable.length());
71949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.handlePaste();
72049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length, 0);
72149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.toString(), "user@user.com");
72249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
72349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // Test adding a single address to an empty chips field with a space at
72449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // the end of it. The address should stay as text.
72549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable = new SpannableStringBuilder();
72649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        String tokenizedUser = "user@user.com" + " ";
72749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append(tokenizedUser);
72849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setSelection(mEditable.length());
72949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.handlePaste();
73049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length, 0);
73149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.toString(), tokenizedUser);
73249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
73349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // Test adding a single address to an empty chips field with a semicolon at
73449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // the end of it. The address should become a chip
73549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable = new SpannableStringBuilder();
73649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        tokenizedUser = "user@user.com;";
73749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append(tokenizedUser);
73849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setSelection(mEditable.length());
73949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.handlePaste();
74049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length, 1);
74149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
74249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // Test adding 2 address to an empty chips field. The second to last
74349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // address should become a chip and the last address should stay as
74449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // text.
74549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable = new SpannableStringBuilder();
74649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append("user1,user2@user.com");
74749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setSelection(mEditable.length());
74849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.handlePaste();
74949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length, 1);
75049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(0, mEditable.toString().indexOf("user2@user.com"),
75149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                RecipientChip.class).length, 1);
75249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.toString(), "<user1>, user2@user.com");
75349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
75449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // Test adding a single address to the end of existing chips. The existing
75549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // chips should remain, and the last address should stay as text.
75649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        populateMocks(3);
75749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        String first = (String) mTokenizer.terminateToken("FIRST");
75849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        String second = (String) mTokenizer.terminateToken("SECOND");
75949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        String third = (String) mTokenizer.terminateToken("THIRD");
76049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable = new SpannableStringBuilder();
76149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append(first + second + third);
76249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setSelection(mEditable.length());
76349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        int firstStart = mEditable.toString().indexOf(first);
76449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        int firstEnd = firstStart + first.trim().length();
76549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        int secondStart = mEditable.toString().indexOf(second);
76649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        int secondEnd = secondStart + second.trim().length();
76749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        int thirdStart = mEditable.toString().indexOf(third);
76849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        int thirdEnd = thirdStart + third.trim().length();
76949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0);
77049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0);
77149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0);
77249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
77349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append("user@user.com");
77449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setSelection(mEditable.length());
77549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.handlePaste();
77649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length,
77749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                mMockRecips.length);
77849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.toString(), first + second + third + "user@user.com");
77949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
78049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // Paste 2 addresses after existing chips. We expect the first address to be turned into
78149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // a chip and the second to be left as text.
78249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        populateMocks(3);
78349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable = new SpannableStringBuilder();
78449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append(first + second + third);
78549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
78649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0);
78749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0);
78849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0);
78949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
79049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append("user1, user2@user.com");
79149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setSelection(mEditable.length());
79249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.handlePaste();
79349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length,
79449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                mMockRecips.length + 1);
79549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(mEditable.toString().indexOf("<user1>"), mEditable
79649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                .toString().indexOf("user2@user.com") - 1, RecipientChip.class).length, 1);
79749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(mEditable.toString().indexOf("user2@user.com"), mEditable
79849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                .length(), RecipientChip.class).length, 0);
79949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.toString(), first + second + third + "<user1>, user2@user.com");
80049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
80149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // Paste 2 addresses after existing chips. We expect the first address to be turned into
80249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // a chip and the second to be left as text. This removes the space seperator char between
80349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // addresses.
80449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        populateMocks(3);
80549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable = new SpannableStringBuilder();
80649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append(first + second + third);
80749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
80849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0);
80949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0);
81049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0);
81149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
81249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append("user1,user2@user.com");
81349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setSelection(mEditable.length());
81449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.handlePaste();
81549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length,
81649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                mMockRecips.length + 1);
81749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(mEditable.toString().indexOf("<user1>"), mEditable
81849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                .toString().indexOf("user2@user.com") - 1, RecipientChip.class).length, 1);
81949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(mEditable.toString().indexOf("user2@user.com"), mEditable
82049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                .length(), RecipientChip.class).length, 0);
82149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.toString(), first + second + third + "<user1>, user2@user.com");
82249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
82349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        // Test a complete token pasted in at the end. It should be turned into a chip.
82449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable = new SpannableStringBuilder();
82549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append("user1, user2@user.com,");
82649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setSelection(mEditable.length());
82749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.handlePaste();
82849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(0, mEditable.length(), RecipientChip.class).length, 2);
82949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(mEditable.toString().indexOf("<user1>"), mEditable
83049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                .toString().indexOf("user2@user.com") - 1, RecipientChip.class).length, 1);
83149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.getSpans(mEditable.toString().indexOf("user2@user.com"), mEditable
83249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                .length(), RecipientChip.class).length, 1);
83349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(mEditable.toString(), "<user1>, <user2@user.com>, ");
83449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira    }
83549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
83649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira    public void testGetPastTerminators() {
83749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
83849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setMoreItem(createTestMoreItem());
83949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setChipBackground(createChipBackground());
84049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setChipHeight(48);
84149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        String test = "test";
84249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable = new SpannableStringBuilder();
84349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append(test);
84449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(view.movePastTerminators(mTokenizer.findTokenEnd(mEditable.toString(), 0)),
84549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                test.length());
84649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
84749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        test = "test,";
84849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable = new SpannableStringBuilder();
84949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append(test);
85049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(view.movePastTerminators(mTokenizer.findTokenEnd(mEditable.toString(), 0)),
85149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                test.length());
85249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
85349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        test = "test, ";
85449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable = new SpannableStringBuilder();
85549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append(test);
85649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(view.movePastTerminators(mTokenizer.findTokenEnd(mEditable.toString(), 0)),
85749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                test.length());
85849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
85949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        test = "test;";
86049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable = new SpannableStringBuilder();
86149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append(test);
86249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(view.movePastTerminators(mTokenizer.findTokenEnd(mEditable.toString(), 0)),
86349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                test.length());
86449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
86549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        test = "test; ";
86649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable = new SpannableStringBuilder();
86749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        mEditable.append(test);
86849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertEquals(view.movePastTerminators(mTokenizer.findTokenEnd(mEditable.toString(), 0)),
86949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira                test.length());
87049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira    }
87149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
87249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira    public void testIsCompletedToken() {
87349ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
87449ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setMoreItem(createTestMoreItem());
87549ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setChipBackground(createChipBackground());
87649ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        view.setChipHeight(48);
87749ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertTrue(view.isCompletedToken("test;"));
87849ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertTrue(view.isCompletedToken("test,"));
87949ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertFalse(view.isCompletedToken("test"));
88049ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira        assertFalse(view.isCompletedToken("test "));
88149ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira    }
88249ce9866ae314b3513e17008f107ceded23f9cf0Mindy Pereira
88300be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira    public void testGetLastChip() {
88400be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        populateMocks(3);
88500be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        MockRecipientEditTextView view = createViewForTesting();
88600be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        view.setMoreItem(createTestMoreItem());
88700be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        view.setChipBackground(createChipBackground());
88800be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        view.setChipHeight(48);
88900be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        String first = (String) mTokenizer.terminateToken("FIRST");
89000be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        String second = (String) mTokenizer.terminateToken("SECOND");
89100be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        String third = (String) mTokenizer.terminateToken("THIRD");
89200be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        mEditable = new SpannableStringBuilder();
89300be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        mEditable.append(first + second + third);
89400be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira
89500be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        // Test replacing the first chip with a new chip.
89600be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        int firstStart = mEditable.toString().indexOf(first);
89700be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        int firstEnd = firstStart + first.trim().length();
89800be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        int secondStart = mEditable.toString().indexOf(second);
89900be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        int secondEnd = secondStart + second.trim().length();
90000be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        int thirdStart = mEditable.toString().indexOf(third);
90100be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        int thirdEnd = thirdStart + third.trim().length();
90200be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 3], firstStart, firstEnd, 0);
90300be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 2], secondStart, secondEnd, 0);
90400be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        mEditable.setSpan(mMockRecips[mMockRecips.length - 1], thirdStart, thirdEnd, 0);
90500be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        assertEquals(view.getLastChip(), mMockRecips[mMockRecips.length - 1]);
90600be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        mEditable.append("extra");
90700be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira        assertEquals(view.getLastChip(), mMockRecips[mMockRecips.length - 1]);
90800be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira    }
90900be4ce28569ae7d1871a2f95453b0e6a6a47852Mindy Pereira
910ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira    private Drawable createChipBackground() {
911ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        Bitmap drawable = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
912ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira        return new BitmapDrawable(getContext().getResources(), drawable);
913ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira    }
914ae7e41106f289f2668c54fff6c457c6fc91ab4a9Mindy Pereira
915a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira    private TextView createTestMoreItem() {
916a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        TextView view = new TextView(getContext());
917a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        view.setText("<xliff:g id='count'>%1$s</xliff:g> more...");
918a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira        return view;
919a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira    }
920a3806ce9e97ef635dc6d4495f9664b690de74960Mindy Pereira
921a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira    private void populateMocks(int size) {
922a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira        mMockEntries = new RecipientEntry[size];
923a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira        for (int i = 0; i < size; i++) {
924a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira            mMockEntries[i] = RecipientEntry.constructGeneratedEntry("user",
925a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira                    "user@username.com");
926a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira        }
927a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira        mMockRecips = new RecipientChip[size];
928a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira        for (int i = 0; i < size; i++) {
929a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira            mMockRecips[i] = new RecipientChip(null, mMockEntries[i], i);
930a63e3fa13ddf1370125b7b005775c538ec22b83aMindy Pereira        }
93159827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira    }
93259827bad5b89a47bcb7074448b37547efca5abcbMindy Pereira}
933