Moving dependencies of PhoneFavoriteFragment.
Move common classes from Contacts to Contacts Common.
Bug: 6993891
Change-Id: Icff2a57875c47a5141842ca3ab980cfc76931cb6
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8dc91cc..c902320 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -378,18 +378,6 @@
[CHAR LIMIT=NONE] -->
<string name="contactsFavoritesLabel">Favorites</string>
- <!-- Title of the confirmation dialog for clearing frequents. [CHAR LIMIT=37] -->
- <string name="clearFrequentsConfirmation_title">Clear frequently contacted?</string>
-
- <!-- Confirmation dialog for clearing frequents. [CHAR LIMIT=NONE] -->
- <string name="clearFrequentsConfirmation">You\'ll clear the frequently contacted list in the
- People and Phone apps, and force email apps to learn your addressing preferences from
- scratch.
- </string>
-
- <!-- Title of the "Clearing frequently contacted" progress-dialog [CHAR LIMIT=35] -->
- <string name="clearFrequentsProgress_title">Clearing frequently contacted\u2026</string>
-
<!-- The title of a dialog that displays the IMEI of the phone -->
<string name="imei">IMEI</string>
@@ -1443,15 +1431,6 @@
<!-- Menu item used to show all calls in the call log. [CHAR LIMIT=30] -->
<string name="menu_show_all_calls">Show all calls</string>
- <!-- Used to display as default status when the contact is available for chat [CHAR LIMIT=19] -->
- <string name="status_available">Available</string>
-
- <!-- Used to display as default status when the contact is away or idle for chat [CHAR LIMIT=19] -->
- <string name="status_away">Away</string>
-
- <!-- Used to display as default status when the contact is busy or Do not disturb for chat [CHAR LIMIT=19] -->
- <string name="status_busy">Busy</string>
-
<!-- String describing the icon in the call log used to play a voicemail.
Note: AccessibilityServices use this attribute to announce what the view represents.
diff --git a/src/com/android/contacts/ContactPresenceIconUtil.java b/src/com/android/contacts/ContactPresenceIconUtil.java
deleted file mode 100644
index 0cb5b93..0000000
--- a/src/com/android/contacts/ContactPresenceIconUtil.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2010 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;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.provider.ContactsContract.StatusUpdates;
-
-/**
- * Define the contact present show policy in Contacts
- */
-public class ContactPresenceIconUtil {
- /**
- * Get the presence icon resource according the status.
- *
- * @return null means don't show the status icon.
- */
- public static Drawable getPresenceIcon (Context context, int status) {
- // We don't show the offline status in Contacts
- switch(status) {
- case StatusUpdates.AVAILABLE:
- case StatusUpdates.IDLE:
- case StatusUpdates.AWAY:
- case StatusUpdates.DO_NOT_DISTURB:
- case StatusUpdates.INVISIBLE:
- return context.getResources().getDrawable(
- StatusUpdates.getPresenceIconResourceId(status));
- case StatusUpdates.OFFLINE:
- // The undefined status is treated as OFFLINE in getPresenceIconResourceId();
- default:
- return null;
- }
- }
-}
diff --git a/src/com/android/contacts/ContactStatusUtil.java b/src/com/android/contacts/ContactStatusUtil.java
deleted file mode 100644
index 4aa24b0..0000000
--- a/src/com/android/contacts/ContactStatusUtil.java
+++ /dev/null
@@ -1,47 +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;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.provider.ContactsContract.StatusUpdates;
-
-/**
- * Provides static function to get default contact status message.
- */
-public class ContactStatusUtil {
-
- private static final String TAG = "ContactStatusUtil";
-
- public static String getStatusString(Context context, int presence) {
- Resources resources = context.getResources();
- switch (presence) {
- case StatusUpdates.AVAILABLE:
- return resources.getString(R.string.status_available);
- case StatusUpdates.IDLE:
- case StatusUpdates.AWAY:
- return resources.getString(R.string.status_away);
- case StatusUpdates.DO_NOT_DISTURB:
- return resources.getString(R.string.status_busy);
- case StatusUpdates.OFFLINE:
- case StatusUpdates.INVISIBLE:
- default:
- return null;
- }
- }
-
-}
diff --git a/src/com/android/contacts/ContactTileLoaderFactory.java b/src/com/android/contacts/ContactTileLoaderFactory.java
deleted file mode 100644
index f3ca47a..0000000
--- a/src/com/android/contacts/ContactTileLoaderFactory.java
+++ /dev/null
@@ -1,91 +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;
-
-import android.content.Context;
-import android.content.CursorLoader;
-import android.net.Uri;
-import android.provider.ContactsContract;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
-import android.provider.ContactsContract.Contacts;
-
-/**
- * Used to create {@link CursorLoader}s to load different groups of
- * {@link com.android.contacts.list.ContactTileView}.
- */
-public final class ContactTileLoaderFactory {
-
- public final static int CONTACT_ID = 0;
- public final static int DISPLAY_NAME = 1;
- public final static int STARRED = 2;
- public final static int PHOTO_URI = 3;
- public final static int LOOKUP_KEY = 4;
- public final static int CONTACT_PRESENCE = 5;
- public final static int CONTACT_STATUS = 6;
-
- // Only used for StrequentPhoneOnlyLoader
- public final static int PHONE_NUMBER = 5;
- public final static int PHONE_NUMBER_TYPE = 6;
- public final static int PHONE_NUMBER_LABEL = 7;
-
- private static final String[] COLUMNS = new String[] {
- Contacts._ID, // ..........................................0
- Contacts.DISPLAY_NAME, // .................................1
- Contacts.STARRED, // ......................................2
- Contacts.PHOTO_URI, // ....................................3
- Contacts.LOOKUP_KEY, // ...................................4
- Contacts.CONTACT_PRESENCE, // .............................5
- Contacts.CONTACT_STATUS, // ...............................6
- };
-
- /**
- * Projection used for the {@link Contacts#CONTENT_STREQUENT_URI}
- * query when {@link ContactsContract#STREQUENT_PHONE_ONLY} flag
- * is set to true. The main difference is the lack of presence
- * and status data and the addition of phone number and label.
- */
- private static final String[] COLUMNS_PHONE_ONLY = new String[] {
- Contacts._ID, // ..........................................0
- Contacts.DISPLAY_NAME, // .................................1
- Contacts.STARRED, // ......................................2
- Contacts.PHOTO_URI, // ....................................3
- Contacts.LOOKUP_KEY, // ...................................4
- Phone.NUMBER, // ..........................................5
- Phone.TYPE, // ............................................6
- Phone.LABEL // ............................................7
- };
-
- public static CursorLoader createStrequentLoader(Context context) {
- return new CursorLoader(context, Contacts.CONTENT_STREQUENT_URI, COLUMNS, null, null, null);
- }
-
- public static CursorLoader createStrequentPhoneOnlyLoader(Context context) {
- Uri uri = Contacts.CONTENT_STREQUENT_URI.buildUpon()
- .appendQueryParameter(ContactsContract.STREQUENT_PHONE_ONLY, "true").build();
-
- return new CursorLoader(context, uri, COLUMNS_PHONE_ONLY, null, null, null);
- }
-
- public static CursorLoader createStarredLoader(Context context) {
- return new CursorLoader(context, Contacts.CONTENT_URI, COLUMNS,
- Contacts.STARRED + "=?", new String[]{"1"}, Contacts.DISPLAY_NAME + " ASC");
- }
-
- public static CursorLoader createFrequentLoader(Context context) {
- return new CursorLoader(context, Contacts.CONTENT_FREQUENT_URI, COLUMNS,
- Contacts.STARRED + "=?", new String[]{"0"}, null);
- }
-}
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 576806a..b607408 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -57,7 +57,7 @@
import com.android.contacts.detail.ContactDetailUpdatesFragment;
import com.android.contacts.detail.ContactLoaderFragment;
import com.android.contacts.detail.ContactLoaderFragment.ContactLoaderFragmentListener;
-import com.android.contacts.dialog.ClearFrequentsDialog;
+import com.android.contacts.common.dialog.ClearFrequentsDialog;
import com.android.contacts.group.GroupBrowseListFragment;
import com.android.contacts.group.GroupBrowseListFragment.OnGroupBrowserActionListener;
import com.android.contacts.group.GroupDetailFragment;
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index 35ca00b..7cc95b9 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -68,7 +68,7 @@
import android.widget.ListView;
import android.widget.TextView;
-import com.android.contacts.ContactPresenceIconUtil;
+import com.android.contacts.common.ContactPresenceIconUtil;
import com.android.contacts.ContactSaveService;
import com.android.contacts.ContactsUtils;
import com.android.contacts.GroupMetaData;
diff --git a/src/com/android/contacts/dialog/ClearFrequentsDialog.java b/src/com/android/contacts/dialog/ClearFrequentsDialog.java
deleted file mode 100644
index 800ba9d..0000000
--- a/src/com/android/contacts/dialog/ClearFrequentsDialog.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2012 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.dialog;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.FragmentManager;
-import android.content.ContentResolver;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnClickListener;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.provider.ContactsContract;
-
-import com.android.contacts.R;
-
-/**
- * Dialog that clears the frequently contacted list after confirming with the user.
- */
-public class ClearFrequentsDialog extends DialogFragment {
- /** Preferred way to show this dialog */
- public static void show(FragmentManager fragmentManager) {
- ClearFrequentsDialog dialog = new ClearFrequentsDialog();
- dialog.show(fragmentManager, "clearFrequents");
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- final ContentResolver resolver = getActivity().getContentResolver();
- final OnClickListener okListener = new OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- final IndeterminateProgressDialog progressDialog = IndeterminateProgressDialog.show(
- getFragmentManager(), getString(R.string.clearFrequentsProgress_title),
- null, 500);
- final AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... params) {
- resolver.delete(ContactsContract.DataUsageFeedback.DELETE_USAGE_URI,
- null, null);
- return null;
- }
-
- @Override
- protected void onPostExecute(Void result) {
- progressDialog.dismiss();
- }
- };
- task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
- };
- return new AlertDialog.Builder(getActivity())
- .setTitle(R.string.clearFrequentsConfirmation_title)
- .setMessage(R.string.clearFrequentsConfirmation)
- .setNegativeButton(android.R.string.cancel, null)
- .setPositiveButton(android.R.string.ok, okListener)
- .setCancelable(true)
- .create();
- }
-}
diff --git a/src/com/android/contacts/dialog/IndeterminateProgressDialog.java b/src/com/android/contacts/dialog/IndeterminateProgressDialog.java
deleted file mode 100644
index 21cd4bb..0000000
--- a/src/com/android/contacts/dialog/IndeterminateProgressDialog.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * Copyright (C) 2012 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.dialog;
-
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.FragmentManager;
-import android.app.ProgressDialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.os.Handler;
-
-/**
- * Indeterminate progress dialog wrapped up in a DialogFragment to work even when the device
- * orientation is changed. Currently, only supports adding a title and/or message to the progress
- * dialog. There is an additional parameter of the minimum amount of time to display the progress
- * dialog even after a call to dismiss the dialog {@link #dismiss()} or
- * {@link #dismissAllowingStateLoss()}.
- * <p>
- * To create and show the progress dialog, use
- * {@link #show(FragmentManager, CharSequence, CharSequence, long)} and retain the reference to the
- * IndeterminateProgressDialog instance.
- * <p>
- * To dismiss the dialog, use {@link #dismiss()} or {@link #dismissAllowingStateLoss()} on the
- * instance. The instance returned by
- * {@link #show(FragmentManager, CharSequence, CharSequence, long)} is guaranteed to be valid
- * after a device orientation change because the {@link #setRetainInstance(boolean)} is called
- * internally with true.
- */
-public class IndeterminateProgressDialog extends DialogFragment {
- private static final String TAG = IndeterminateProgressDialog.class.getSimpleName();
-
- private CharSequence mTitle;
- private CharSequence mMessage;
- private long mMinDisplayTime;
- private long mShowTime = 0;
- private boolean mActivityReady = false;
- private Dialog mOldDialog;
- private final Handler mHandler = new Handler();
- private boolean mCalledSuperDismiss = false;
- private boolean mAllowStateLoss;
- private final Runnable mDismisser = new Runnable() {
- @Override
- public void run() {
- superDismiss();
- }
- };
-
- /**
- * Creates and shows an indeterminate progress dialog. Once the progress dialog is shown, it
- * will be shown for at least the minDisplayTime (in milliseconds), so that the progress dialog
- * does not flash in and out to quickly.
- */
- public static IndeterminateProgressDialog show(FragmentManager fragmentManager,
- CharSequence title, CharSequence message, long minDisplayTime) {
- IndeterminateProgressDialog dialogFragment = new IndeterminateProgressDialog();
- dialogFragment.mTitle = title;
- dialogFragment.mMessage = message;
- dialogFragment.mMinDisplayTime = minDisplayTime;
- dialogFragment.show(fragmentManager, TAG);
- dialogFragment.mShowTime = System.currentTimeMillis();
- dialogFragment.setCancelable(false);
-
- return dialogFragment;
- }
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setRetainInstance(true);
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- // Create the progress dialog and set its properties
- final ProgressDialog dialog = new ProgressDialog(getActivity());
- dialog.setIndeterminate(true);
- dialog.setIndeterminateDrawable(null);
- dialog.setTitle(mTitle);
- dialog.setMessage(mMessage);
-
- return dialog;
- }
-
- @Override
- public void onStart() {
- super.onStart();
- mActivityReady = true;
-
- // Check if superDismiss() had been called before. This can happen if in a long
- // running operation, the user hits the home button and closes this fragment's activity.
- // Upon returning, we want to dismiss this progress dialog fragment.
- if (mCalledSuperDismiss) {
- superDismiss();
- }
- }
-
- @Override
- public void onStop() {
- super.onStop();
- mActivityReady = false;
- }
-
- /**
- * There is a race condition that is not handled properly by the DialogFragment class.
- * If we don't check that this onDismiss callback isn't for the old progress dialog from before
- * the device orientation change, then this will cause the newly created dialog after the
- * orientation change to be dismissed immediately.
- */
- @Override
- public void onDismiss(DialogInterface dialog) {
- if (mOldDialog != null && mOldDialog == dialog) {
- // This is the callback from the old progress dialog that was already dismissed before
- // the device orientation change, so just ignore it.
- return;
- }
- super.onDismiss(dialog);
- }
-
- /**
- * Save the old dialog that is about to get destroyed in case this is due to a change
- * in device orientation. This will allow us to intercept the callback to
- * {@link #onDismiss(DialogInterface)} in case the callback happens after a new progress dialog
- * instance was created.
- */
- @Override
- public void onDestroyView() {
- mOldDialog = getDialog();
- super.onDestroyView();
- }
-
- /**
- * This tells the progress dialog to dismiss itself after guaranteeing to be shown for the
- * specified time in {@link #show(FragmentManager, CharSequence, CharSequence, long)}.
- */
- @Override
- public void dismiss() {
- mAllowStateLoss = false;
- dismissWhenReady();
- }
-
- /**
- * This tells the progress dialog to dismiss itself (with state loss) after guaranteeing to be
- * shown for the specified time in
- * {@link #show(FragmentManager, CharSequence, CharSequence, long)}.
- */
- @Override
- public void dismissAllowingStateLoss() {
- mAllowStateLoss = true;
- dismissWhenReady();
- }
-
- /**
- * Tells the progress dialog to dismiss itself after guaranteeing that the dialog had been
- * showing for at least the minimum display time as set in
- * {@link #show(FragmentManager, CharSequence, CharSequence, long)}.
- */
- private void dismissWhenReady() {
- // Compute how long the dialog has been showing
- final long shownTime = System.currentTimeMillis() - mShowTime;
- if (shownTime >= mMinDisplayTime) {
- // dismiss immediately
- mHandler.post(mDismisser);
- } else {
- // Need to wait some more, so compute the amount of time to sleep.
- final long sleepTime = mMinDisplayTime - shownTime;
- mHandler.postDelayed(mDismisser, sleepTime);
- }
- }
-
- /**
- * Actually dismiss the dialog fragment.
- */
- private void superDismiss() {
- mCalledSuperDismiss = true;
- if (mActivityReady) {
- // The fragment is either in onStart or past it, but has not gotten to onStop yet.
- // It is safe to dismiss this dialog fragment.
- if (mAllowStateLoss) {
- super.dismissAllowingStateLoss();
- } else {
- super.dismiss();
- }
- }
- // If mActivityReady is false, then this dialog fragment has already passed the onStop
- // state. This can happen if the user hit the 'home' button before this dialog fragment was
- // dismissed or if there is a configuration change.
- // In the event that this dialog fragment is re-attached and reaches onStart (e.g.,
- // because the user returns to this fragment's activity or the device configuration change
- // has re-attached this dialog fragment), because the mCalledSuperDismiss flag was set to
- // true, this dialog fragment will be dismissed within onStart. So, there's nothing else
- // that needs to be done.
- }
-}
diff --git a/src/com/android/contacts/format/FormatUtils.java b/src/com/android/contacts/format/FormatUtils.java
deleted file mode 100644
index 2c5427d..0000000
--- a/src/com/android/contacts/format/FormatUtils.java
+++ /dev/null
@@ -1,184 +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.format;
-
-import android.database.CharArrayBuffer;
-import android.graphics.Typeface;
-import android.text.SpannableString;
-import android.text.style.StyleSpan;
-
-import com.android.contacts.test.NeededForTesting;
-
-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.
- */
- @NeededForTesting // App itself doesn't use this right now, but we don't want to remove it.
- 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;
- }
-
- @NeededForTesting
- 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}. */
- @NeededForTesting
- 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, char[] 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[j]) {
- break;
- }
- }
- if (j == prefixLength) {
- return i;
- }
-
- // Skip this word
- while (i < textLength && Character.isLetterOrDigit(text.charAt(i))) {
- i++;
- }
- }
-
- return -1;
- }
-
-}
diff --git a/src/com/android/contacts/format/PrefixHighlighter.java b/src/com/android/contacts/format/PrefixHighlighter.java
deleted file mode 100644
index 0bc67a6..0000000
--- a/src/com/android/contacts/format/PrefixHighlighter.java
+++ /dev/null
@@ -1,66 +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.format;
-
-import android.text.SpannableString;
-import android.text.style.ForegroundColorSpan;
-import android.widget.TextView;
-
-/**
- * Highlights the text in a text field.
- */
-public class PrefixHighlighter {
- private final int mPrefixHighlightColor;
-
- private ForegroundColorSpan mPrefixColorSpan;
-
- public PrefixHighlighter(int prefixHighlightColor) {
- mPrefixHighlightColor = prefixHighlightColor;
- }
-
- /**
- * Sets the text on the given text view, highlighting the word that matches the given prefix.
- *
- * @param view the view on which to set the text
- * @param text the string to use as the text
- * @param prefix the prefix to look for
- */
- public void setText(TextView view, String text, char[] prefix) {
- view.setText(apply(text, prefix));
- }
-
- /**
- * Returns a CharSequence which highlights the given prefix if found in the given text.
- *
- * @param text the text to which to apply the highlight
- * @param prefix the prefix to look for
- */
- public CharSequence apply(CharSequence text, char[] prefix) {
- int index = FormatUtils.indexOfWordPrefix(text, prefix);
- if (index != -1) {
- if (mPrefixColorSpan == null) {
- mPrefixColorSpan = new ForegroundColorSpan(mPrefixHighlightColor);
- }
-
- SpannableString result = new SpannableString(text);
- result.setSpan(mPrefixColorSpan, index, index + prefix.length, 0 /* flags */);
- return result;
- } else {
- return text;
- }
- }
-}
diff --git a/src/com/android/contacts/list/ContactListItemView.java b/src/com/android/contacts/list/ContactListItemView.java
index 4b2e254..bef1c44 100644
--- a/src/com/android/contacts/list/ContactListItemView.java
+++ b/src/com/android/contacts/list/ContactListItemView.java
@@ -44,10 +44,10 @@
import android.widget.QuickContactBadge;
import android.widget.TextView;
-import com.android.contacts.ContactPresenceIconUtil;
-import com.android.contacts.ContactStatusUtil;
+import com.android.contacts.common.ContactPresenceIconUtil;
+import com.android.contacts.common.ContactStatusUtil;
import com.android.contacts.R;
-import com.android.contacts.format.PrefixHighlighter;
+import com.android.contacts.common.format.PrefixHighlighter;
/**
* A custom view for an item in the contact list.
diff --git a/src/com/android/contacts/list/ContactTileAdapter.java b/src/com/android/contacts/list/ContactTileAdapter.java
index a5a8c65..da06671 100644
--- a/src/com/android/contacts/list/ContactTileAdapter.java
+++ b/src/com/android/contacts/list/ContactTileAdapter.java
@@ -29,9 +29,9 @@
import android.widget.FrameLayout;
import com.android.contacts.common.ContactPhotoManager;
-import com.android.contacts.ContactPresenceIconUtil;
-import com.android.contacts.ContactStatusUtil;
-import com.android.contacts.ContactTileLoaderFactory;
+import com.android.contacts.common.ContactPresenceIconUtil;
+import com.android.contacts.common.ContactStatusUtil;
+import com.android.contacts.common.ContactTileLoaderFactory;
import com.android.contacts.ContactsUtils;
import com.android.contacts.GroupMemberLoader;
import com.android.contacts.GroupMemberLoader.GroupDetailQuery;
diff --git a/src/com/android/contacts/list/ContactTileListFragment.java b/src/com/android/contacts/list/ContactTileListFragment.java
index a69e125..29d915a 100644
--- a/src/com/android/contacts/list/ContactTileListFragment.java
+++ b/src/com/android/contacts/list/ContactTileListFragment.java
@@ -33,7 +33,7 @@
import android.widget.TextView;
import com.android.contacts.common.ContactPhotoManager;
-import com.android.contacts.ContactTileLoaderFactory;
+import com.android.contacts.common.ContactTileLoaderFactory;
import com.android.contacts.R;
import com.android.contacts.list.ContactTileAdapter.DisplayType;
diff --git a/src/com/android/contacts/quickcontact/QuickContactListFragment.java b/src/com/android/contacts/quickcontact/QuickContactListFragment.java
index 6fed31d..59355fb 100644
--- a/src/com/android/contacts/quickcontact/QuickContactListFragment.java
+++ b/src/com/android/contacts/quickcontact/QuickContactListFragment.java
@@ -32,7 +32,7 @@
import android.widget.RelativeLayout;
import android.widget.TextView;
-import com.android.contacts.ContactPresenceIconUtil;
+import com.android.contacts.common.ContactPresenceIconUtil;
import com.android.contacts.R;
import java.util.List;
diff --git a/src/com/android/contacts/widget/TextHighlightingAnimation.java b/src/com/android/contacts/widget/TextHighlightingAnimation.java
index 2924e4e..d269276 100644
--- a/src/com/android/contacts/widget/TextHighlightingAnimation.java
+++ b/src/com/android/contacts/widget/TextHighlightingAnimation.java
@@ -23,7 +23,7 @@
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
-import com.android.contacts.format.FormatUtils;
+import com.android.contacts.common.format.FormatUtils;
import com.android.internal.R;
/**
diff --git a/tests/src/com/android/contacts/format/FormatUtilsTests.java b/tests/src/com/android/contacts/format/FormatUtilsTests.java
deleted file mode 100644
index c3e6236..0000000
--- a/tests/src/com/android/contacts/format/FormatUtilsTests.java
+++ /dev/null
@@ -1,114 +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.format;
-
-import android.database.CharArrayBuffer;
-import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-/**
- * Test cases for format utility methods.
- */
-@SmallTest
-public class FormatUtilsTests extends AndroidTestCase {
-
- public void testOverlapPoint() throws Exception {
- assertEquals(2, FormatUtils.overlapPoint("abcde", "cdefg"));
- assertEquals(-1, FormatUtils.overlapPoint("John Doe", "John Doe"));
- assertEquals(5, FormatUtils.overlapPoint("John Doe", "Doe, John"));
- assertEquals(-1, FormatUtils.overlapPoint("Mr. John Doe", "Mr. Doe, John"));
- assertEquals(13, FormatUtils.overlapPoint("John Herbert Doe", "Doe, John Herbert"));
- }
-
- public void testCopyToCharArrayBuffer() {
- CharArrayBuffer charArrayBuffer = new CharArrayBuffer(20);
- checkCopyToCharArrayBuffer(charArrayBuffer, null, 0);
- checkCopyToCharArrayBuffer(charArrayBuffer, "", 0);
- checkCopyToCharArrayBuffer(charArrayBuffer, "test", 4);
- // Check that it works after copying something into it.
- checkCopyToCharArrayBuffer(charArrayBuffer, "", 0);
- checkCopyToCharArrayBuffer(charArrayBuffer, "test", 4);
- checkCopyToCharArrayBuffer(charArrayBuffer, null, 0);
- // This requires a resize of the actual buffer.
- checkCopyToCharArrayBuffer(charArrayBuffer, "test test test test test", 24);
- }
-
- public void testCharArrayBufferToString() {
- checkCharArrayBufferToString("");
- checkCharArrayBufferToString("test");
- checkCharArrayBufferToString("test test test test test");
- }
-
- /** Checks that copying a string into a {@link CharArrayBuffer} and back works correctly. */
- private void checkCharArrayBufferToString(String text) {
- CharArrayBuffer buffer = new CharArrayBuffer(20);
- FormatUtils.copyToCharArrayBuffer(text, buffer);
- assertEquals(text, FormatUtils.charArrayBufferToString(buffer));
- }
-
- /**
- * Checks that copying into the char array buffer copies the values correctly.
- */
- private void checkCopyToCharArrayBuffer(CharArrayBuffer buffer, String value, int length) {
- FormatUtils.copyToCharArrayBuffer(value, buffer);
- assertEquals(length, buffer.sizeCopied);
- for (int index = 0; index < length; ++index) {
- assertEquals(value.charAt(index), buffer.data[index]);
- }
- }
-
- public void testIndexOfWordPrefix_NullPrefix() {
- assertEquals(-1, FormatUtils.indexOfWordPrefix("test", null));
- }
-
- public void testIndexOfWordPrefix_NullText() {
- assertEquals(-1, FormatUtils.indexOfWordPrefix(null, "TE".toCharArray()));
- }
-
- public void testIndexOfWordPrefix_MatchingPrefix() {
- checkIndexOfWordPrefix("test", "TE", 0);
- checkIndexOfWordPrefix("Test", "TE", 0);
- checkIndexOfWordPrefix("TEst", "TE", 0);
- checkIndexOfWordPrefix("TEST", "TE", 0);
- checkIndexOfWordPrefix("a test", "TE", 2);
- checkIndexOfWordPrefix("test test", "TE", 0);
- checkIndexOfWordPrefix("a test test", "TE", 2);
- }
-
- public void testIndexOfWordPrefix_NotMatchingPrefix() {
- checkIndexOfWordPrefix("test", "TA", -1);
- checkIndexOfWordPrefix("test type theme", "TA", -1);
- checkIndexOfWordPrefix("atest retest pretest", "TEST", -1);
- checkIndexOfWordPrefix("tes", "TEST", -1);
- }
-
- public void testIndexOfWordPrefix_LowerCase() {
- // The prefix match only works if the prefix is un upper case.
- checkIndexOfWordPrefix("test", "te", -1);
- }
-
- /**
- * Checks that getting the index of a word prefix in the given text returns the expected index.
- *
- * @param text the text in which to look for the word
- * @param wordPrefix the word prefix to look for
- * @param expectedIndex the expected value to be returned by the function
- */
- private void checkIndexOfWordPrefix(String text, String wordPrefix, int expectedIndex) {
- assertEquals(expectedIndex, FormatUtils.indexOfWordPrefix(text, wordPrefix.toCharArray()));
- }
-}
diff --git a/tests/src/com/android/contacts/format/PrefixHighligherTest.java b/tests/src/com/android/contacts/format/PrefixHighligherTest.java
deleted file mode 100644
index 7f6e491..0000000
--- a/tests/src/com/android/contacts/format/PrefixHighligherTest.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.format;
-
-import android.test.suitebuilder.annotation.SmallTest;
-
-import junit.framework.TestCase;
-
-/**
- * Unit tests for {@link PrefixHighlighter}.
- */
-@SmallTest
-public class PrefixHighligherTest extends TestCase {
- private static final int TEST_PREFIX_HIGHLIGHT_COLOR = 0xFF0000;
-
- /** The object under test. */
- private PrefixHighlighter mPrefixHighlighter;
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- mPrefixHighlighter = new PrefixHighlighter(TEST_PREFIX_HIGHLIGHT_COLOR);
- }
-
- public void testApply_EmptyPrefix() {
- CharSequence seq = mPrefixHighlighter.apply("", new char[0]);
- SpannedTestUtils.assertNotSpanned(seq, "");
-
- seq = mPrefixHighlighter.apply("test", new char[0]);
- SpannedTestUtils.assertNotSpanned(seq, "test");
- }
-
- public void testSetText_MatchingPrefix() {
- final char[] charArray = "TE".toCharArray();
-
- CharSequence seq = mPrefixHighlighter.apply("test", charArray);
- SpannedTestUtils.assertPrefixSpan(seq, 0, 1);
-
- seq = mPrefixHighlighter.apply("Test", charArray);
- SpannedTestUtils.assertPrefixSpan(seq, 0, 1);
-
- seq = mPrefixHighlighter.apply("TEst", charArray);
- SpannedTestUtils.assertPrefixSpan(seq, 0, 1);
-
- seq = mPrefixHighlighter.apply("a test", charArray);
- SpannedTestUtils.assertPrefixSpan(seq, 2, 3);
- }
-
- public void testSetText_NotMatchingPrefix() {
- final CharSequence seq = mPrefixHighlighter.apply("test", "TA".toCharArray());
- SpannedTestUtils.assertNotSpanned(seq, "test");
- }
-
- public void testSetText_FirstMatch() {
- final CharSequence seq = mPrefixHighlighter.apply("a test's tests are not tests",
- "TE".toCharArray());
- SpannedTestUtils.assertPrefixSpan(seq, 2, 3);
- }
-
- public void testSetText_NoMatchingMiddleOfWord() {
- final char[] charArray = "TE".toCharArray();
- CharSequence seq = mPrefixHighlighter.apply("atest", charArray);
- SpannedTestUtils.assertNotSpanned(seq, "atest");
-
- seq = mPrefixHighlighter.apply("atest otest", charArray);
- SpannedTestUtils.assertNotSpanned(seq, "atest otest");
-
- seq = mPrefixHighlighter.apply("atest test", charArray);
- SpannedTestUtils.assertPrefixSpan(seq, 6, 7);
- }
-}
diff --git a/tests/src/com/android/contacts/format/SpannedTestUtils.java b/tests/src/com/android/contacts/format/SpannedTestUtils.java
deleted file mode 100644
index 6fa028d..0000000
--- a/tests/src/com/android/contacts/format/SpannedTestUtils.java
+++ /dev/null
@@ -1,83 +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.format;
-
-import android.test.suitebuilder.annotation.SmallTest;
-import android.text.Html;
-import android.text.Spanned;
-import android.text.TextUtils;
-import android.text.style.ForegroundColorSpan;
-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, ForegroundColorSpan.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);
- }
-}
diff --git a/tests/src/com/android/contacts/list/ContactListItemViewTest.java b/tests/src/com/android/contacts/list/ContactListItemViewTest.java
index 996a1aa..09ac768 100644
--- a/tests/src/com/android/contacts/list/ContactListItemViewTest.java
+++ b/tests/src/com/android/contacts/list/ContactListItemViewTest.java
@@ -21,13 +21,11 @@
import android.provider.ContactsContract;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.LargeTest;
-import android.text.SpannableString;
-import android.text.Spanned;
import android.widget.TextView;
import com.android.contacts.activities.PeopleActivity;
import com.android.contacts.common.test.IntegrationTestUtils;
-import com.android.contacts.format.SpannedTestUtils;
+import com.android.contacts.common.format.SpannedTestUtils;
/**
* Unit tests for {@link ContactListItemView}.