diff options
author | Eric Erfanian <erfanian@google.com> | 2017-06-19 11:26:01 -0700 |
---|---|---|
committer | Eric Erfanian <erfanian@google.com> | 2017-06-19 11:30:45 -0700 |
commit | 2f1c7586bcce334ca69022eb8dc6d8965ceb6a05 (patch) | |
tree | bf00ada449ee3de31ec983a14e84159200aa18c2 /java/com/android/contacts/common/format | |
parent | 3d0ca68e466482971a4cf46576c50cb2bd42bcb5 (diff) |
Update AOSP Dialer source from internal google3 repository at
cl/159428781.
Test: make, treehugger
This CL updates the AOSP Dialer source with all the changes that have
gone into the private google3 repository. This includes all the
changes from cl/152373142 (4/06/2017) to cl/159428781 (6/19/2017).
This goal of these drops is to keep the AOSP source in sync with the
internal google3 repository. Currently these sync are done by hand
with very minor modifications to the internal source code.
See the Android.mk file for list of modifications.
Our current goal is to do frequent drops (daily if possible) and
eventually switched to an automated process.
Change-Id: Ie60a84b3936efd0ea3d95d7c86bf96d2b1663030
Diffstat (limited to 'java/com/android/contacts/common/format')
3 files changed, 52 insertions, 269 deletions
diff --git a/java/com/android/contacts/common/format/FormatUtils.java b/java/com/android/contacts/common/format/FormatUtils.java deleted file mode 100644 index 727c15b83..000000000 --- a/java/com/android/contacts/common/format/FormatUtils.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.contacts.common.format; - -import android.database.CharArrayBuffer; -import android.graphics.Typeface; -import android.support.annotation.VisibleForTesting; -import android.text.SpannableString; -import android.text.style.StyleSpan; -import java.util.Arrays; - -/** Assorted utility methods related to text formatting in Contacts. */ -public class FormatUtils { - - /** - * Finds the earliest point in buffer1 at which the first part of buffer2 matches. For example, - * overlapPoint("abcd", "cdef") == 2. - */ - public static int overlapPoint(CharArrayBuffer buffer1, CharArrayBuffer buffer2) { - if (buffer1 == null || buffer2 == null) { - return -1; - } - return overlapPoint( - Arrays.copyOfRange(buffer1.data, 0, buffer1.sizeCopied), - Arrays.copyOfRange(buffer2.data, 0, buffer2.sizeCopied)); - } - - /** - * Finds the earliest point in string1 at which the first part of string2 matches. For example, - * overlapPoint("abcd", "cdef") == 2. - */ - @VisibleForTesting - public static int overlapPoint(String string1, String string2) { - if (string1 == null || string2 == null) { - return -1; - } - return overlapPoint(string1.toCharArray(), string2.toCharArray()); - } - - /** - * Finds the earliest point in array1 at which the first part of array2 matches. For example, - * overlapPoint("abcd", "cdef") == 2. - */ - public static int overlapPoint(char[] array1, char[] array2) { - if (array1 == null || array2 == null) { - return -1; - } - int count1 = array1.length; - int count2 = array2.length; - - // Ignore matching tails of the two arrays. - while (count1 > 0 && count2 > 0 && array1[count1 - 1] == array2[count2 - 1]) { - count1--; - count2--; - } - - int size = count2; - for (int i = 0; i < count1; i++) { - if (i + size > count1) { - size = count1 - i; - } - int j; - for (j = 0; j < size; j++) { - if (array1[i + j] != array2[j]) { - break; - } - } - if (j == size) { - return i; - } - } - - return -1; - } - - /** - * Applies the given style to a range of the input CharSequence. - * - * @param style The style to apply (see the style constants in {@link Typeface}). - * @param input The CharSequence to style. - * @param start Starting index of the range to style (will be clamped to be a minimum of 0). - * @param end Ending index of the range to style (will be clamped to a maximum of the input - * length). - * @param flags Bitmask for configuring behavior of the span. See {@link android.text.Spanned}. - * @return The styled CharSequence. - */ - public static CharSequence applyStyleToSpan( - int style, CharSequence input, int start, int end, int flags) { - // Enforce bounds of the char sequence. - start = Math.max(0, start); - end = Math.min(input.length(), end); - SpannableString text = new SpannableString(input); - text.setSpan(new StyleSpan(style), start, end, flags); - return text; - } - - @VisibleForTesting - public static void copyToCharArrayBuffer(String text, CharArrayBuffer buffer) { - if (text != null) { - char[] data = buffer.data; - if (data == null || data.length < text.length()) { - buffer.data = text.toCharArray(); - } else { - text.getChars(0, text.length(), data, 0); - } - buffer.sizeCopied = text.length(); - } else { - buffer.sizeCopied = 0; - } - } - - /** Returns a String that represents the content of the given {@link CharArrayBuffer}. */ - @VisibleForTesting - public static String charArrayBufferToString(CharArrayBuffer buffer) { - return new String(buffer.data, 0, buffer.sizeCopied); - } - - /** - * Finds the index of the first word that starts with the given prefix. - * - * <p>If not found, returns -1. - * - * @param text the text in which to search for the prefix - * @param prefix the text to find, in upper case letters - */ - public static int indexOfWordPrefix(CharSequence text, String prefix) { - if (prefix == null || text == null) { - return -1; - } - - int textLength = text.length(); - int prefixLength = prefix.length(); - - if (prefixLength == 0 || textLength < prefixLength) { - return -1; - } - - int i = 0; - while (i < textLength) { - // Skip non-word characters - while (i < textLength && !Character.isLetterOrDigit(text.charAt(i))) { - i++; - } - - if (i + prefixLength > textLength) { - return -1; - } - - // Compare the prefixes - int j; - for (j = 0; j < prefixLength; j++) { - if (Character.toUpperCase(text.charAt(i + j)) != prefix.charAt(j)) { - break; - } - } - if (j == prefixLength) { - return i; - } - - // Skip this word - while (i < textLength && Character.isLetterOrDigit(text.charAt(i))) { - i++; - } - } - - return -1; - } -} diff --git a/java/com/android/contacts/common/format/TextHighlighter.java b/java/com/android/contacts/common/format/TextHighlighter.java index 30c03fdf3..f397f0429 100644 --- a/java/com/android/contacts/common/format/TextHighlighter.java +++ b/java/com/android/contacts/common/format/TextHighlighter.java @@ -24,8 +24,6 @@ import android.widget.TextView; /** Highlights the text in a text field. */ public class TextHighlighter { - private static final boolean DEBUG = false; - private final String TAG = TextHighlighter.class.getSimpleName(); private int mTextStyle; private CharacterStyle mTextStyleSpan; @@ -81,7 +79,7 @@ public class TextHighlighter { } final String trimmedPrefix = prefix.substring(prefixStart); - int index = FormatUtils.indexOfWordPrefix(text, trimmedPrefix); + int index = indexOfWordPrefix(text, trimmedPrefix); if (index != -1) { final SpannableString result = new SpannableString(text); result.setSpan(mTextStyleSpan, index, index + trimmedPrefix.length(), 0 /* flags */); @@ -90,4 +88,55 @@ public class TextHighlighter { return text; } } + + /** + * Finds the index of the first word that starts with the given prefix. + * + * <p>If not found, returns -1. + * + * @param text the text in which to search for the prefix + * @param prefix the text to find, in upper case letters + */ + public static int indexOfWordPrefix(CharSequence text, String prefix) { + if (prefix == null || text == null) { + return -1; + } + + int textLength = text.length(); + int prefixLength = prefix.length(); + + if (prefixLength == 0 || textLength < prefixLength) { + return -1; + } + + int i = 0; + while (i < textLength) { + // Skip non-word characters + while (i < textLength && !Character.isLetterOrDigit(text.charAt(i))) { + i++; + } + + if (i + prefixLength > textLength) { + return -1; + } + + // Compare the prefixes + int j; + for (j = 0; j < prefixLength; j++) { + if (Character.toUpperCase(text.charAt(i + j)) != prefix.charAt(j)) { + break; + } + } + if (j == prefixLength) { + return i; + } + + // Skip this word + while (i < textLength && Character.isLetterOrDigit(text.charAt(i))) { + i++; + } + } + + return -1; + } } diff --git a/java/com/android/contacts/common/format/testing/SpannedTestUtils.java b/java/com/android/contacts/common/format/testing/SpannedTestUtils.java deleted file mode 100644 index 293d9d5ad..000000000 --- a/java/com/android/contacts/common/format/testing/SpannedTestUtils.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2011 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.contacts.common.format.testing; - -import android.test.suitebuilder.annotation.SmallTest; -import android.text.Html; -import android.text.SpannableString; -import android.text.Spanned; -import android.text.TextUtils; -import android.text.style.StyleSpan; -import android.widget.TextView; -import junit.framework.Assert; - -/** Utility class to check the value of spanned text in text views. */ -@SmallTest -public class SpannedTestUtils { - - /** - * Checks that the text contained in the text view matches the given HTML text. - * - * @param expectedHtmlText the expected text to be in the text view - * @param textView the text view from which to get the text - */ - public static void checkHtmlText(String expectedHtmlText, TextView textView) { - String actualHtmlText = Html.toHtml((Spanned) textView.getText()); - if (TextUtils.isEmpty(expectedHtmlText)) { - // If the text is empty, it does not add the <p></p> bits to it. - Assert.assertEquals("", actualHtmlText); - } else { - Assert.assertEquals("<p dir=ltr>" + expectedHtmlText + "</p>\n", actualHtmlText); - } - } - - /** - * Assert span exists in the correct location. - * - * @param seq The spannable string to check. - * @param start The starting index. - * @param end The ending index. - */ - public static void assertPrefixSpan(CharSequence seq, int start, int end) { - Assert.assertTrue(seq instanceof Spanned); - Spanned spannable = (Spanned) seq; - - if (start > 0) { - Assert.assertEquals(0, getNumForegroundColorSpansBetween(spannable, 0, start - 1)); - } - Assert.assertEquals(1, getNumForegroundColorSpansBetween(spannable, start, end)); - Assert.assertEquals( - 0, getNumForegroundColorSpansBetween(spannable, end + 1, spannable.length() - 1)); - } - - private static int getNumForegroundColorSpansBetween(Spanned value, int start, int end) { - return value.getSpans(start, end, StyleSpan.class).length; - } - - /** - * Asserts that the given character sequence is not a Spanned object and text is correct. - * - * @param seq The sequence to check. - * @param expected The expected text. - */ - public static void assertNotSpanned(CharSequence seq, String expected) { - Assert.assertFalse(seq instanceof Spanned); - Assert.assertEquals(expected, seq); - } - - public static int getNextTransition(SpannableString seq, int start) { - return seq.nextSpanTransition(start, seq.length(), StyleSpan.class); - } -} |