Move dependencies in prep for PhoneNumberInteraction move.

Committing this change first which is a pre-factor to moving
PhoneNumberInteraction into Dialer completely.

Bug: 6993891
Change-Id: I8a8f2d2d54b1aa8268e8ac9bd7d97d165a3e55c2
diff --git a/src/com/android/contacts/Collapser.java b/src/com/android/contacts/Collapser.java
deleted file mode 100644
index 3b2f2a9..0000000
--- a/src/com/android/contacts/Collapser.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2009 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 java.util.Iterator;
-import java.util.List;
-
-/**
- * Class used for collapsing data items into groups of similar items. The data items that should be
- * collapsible should implement the Collapsible interface. The class also contains a utility
- * function that takes an ArrayList of items and returns a list of the same items collapsed into
- * groups.
- */
-public final class Collapser {
-
-    /*
-     * This utility class cannot be instantiated.
-     */
-    private Collapser() {}
-
-    /*
-     * Interface implemented by data types that can be collapsed into groups of similar data. This
-     * can be used for example to collapse similar contact data items into a single item.
-     */
-    public interface Collapsible<T> {
-        public boolean collapseWith(T t);
-        public boolean shouldCollapseWith(T t);
-    }
-
-    /**
-     * Collapses a list of Collapsible items into a list of collapsed items. Items are collapsed
-     * if {@link Collapsible#shouldCollapseWith(Object)} returns true, and are collapsed
-     * through the {@Link Collapsible#collapseWith(Object)} function implemented by the data item.
-     *
-     * @param list List of Objects of type <T extends Collapsible<T>> to be collapsed.
-     */
-    public static <T extends Collapsible<T>> void collapseList(List<T> list) {
-
-        int listSize = list.size();
-
-        for (int i = 0; i < listSize; i++) {
-            T iItem = list.get(i);
-            if (iItem != null) {
-                for (int j = i + 1; j < listSize; j++) {
-                    T jItem = list.get(j);
-                    if (jItem != null) {
-                        if (iItem.shouldCollapseWith(jItem)) {
-                            iItem.collapseWith(jItem);
-                            list.set(j, null);
-                        }
-                    }
-                }
-            }
-        }
-
-        // Remove the null items
-        Iterator<T> itr = list.iterator();
-        while (itr.hasNext()) {
-            if (itr.next() == null) {
-                itr.remove();
-            }
-        }
-
-    }
-}
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index c756752..f1a5a72 100644
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -46,6 +46,7 @@
 import android.util.Log;
 import android.widget.Toast;
 
+import com.android.contacts.common.database.ContactUpdateUtils;
 import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.model.RawContactDelta;
 import com.android.contacts.model.RawContactDeltaList;
@@ -903,13 +904,7 @@
             return;
         }
 
-        // Update the primary values in the data record.
-        ContentValues values = new ContentValues(1);
-        values.put(Data.IS_SUPER_PRIMARY, 1);
-        values.put(Data.IS_PRIMARY, 1);
-
-        getContentResolver().update(ContentUris.withAppendedId(Data.CONTENT_URI, dataId),
-                values, null, null);
+        ContactUpdateUtils.setSuperPrimary(this, dataId);
     }
 
     /**
diff --git a/src/com/android/contacts/ContactsActivity.java b/src/com/android/contacts/ContactsActivity.java
index 90900ce..f3ac147 100644
--- a/src/com/android/contacts/ContactsActivity.java
+++ b/src/com/android/contacts/ContactsActivity.java
@@ -25,7 +25,7 @@
 import android.os.Bundle;
 import android.view.View;
 
-import com.android.contacts.activities.TransactionSafeActivity;
+import com.android.contacts.common.activity.TransactionSafeActivity;
 import com.android.contacts.test.InjectedServices;
 
 /**
diff --git a/src/com/android/contacts/ContactsUtils.java b/src/com/android/contacts/ContactsUtils.java
index 196e353..b6e4772 100644
--- a/src/com/android/contacts/ContactsUtils.java
+++ b/src/com/android/contacts/ContactsUtils.java
@@ -23,7 +23,6 @@
 import android.net.Uri;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.Im;
-import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.DisplayPhoto;
 import android.provider.ContactsContract.QuickContact;
 import android.telephony.PhoneNumberUtils;
@@ -106,63 +105,6 @@
     }
 
     /**
-     * Returns true if two data with mimetypes which represent values in contact entries are
-     * considered equal for collapsing in the GUI. For caller-id, use
-     * {@link PhoneNumberUtils#compare(Context, String, String)} instead
-     */
-    public static final boolean shouldCollapse(CharSequence mimetype1, CharSequence data1,
-            CharSequence mimetype2, CharSequence data2) {
-        // different mimetypes? don't collapse
-        if (!TextUtils.equals(mimetype1, mimetype2)) return false;
-
-        // exact same string? good, bail out early
-        if (TextUtils.equals(data1, data2)) return true;
-
-        // so if either is null, these two must be different
-        if (data1 == null || data2 == null) return false;
-
-        // if this is not about phone numbers, we know this is not a match (of course, some
-        // mimetypes could have more sophisticated matching is the future, e.g. addresses)
-        if (!TextUtils.equals(Phone.CONTENT_ITEM_TYPE, mimetype1)) return false;
-
-        return shouldCollapsePhoneNumbers(data1.toString(), data2.toString());
-    }
-
-    private static final boolean shouldCollapsePhoneNumbers(
-            String number1WithLetters, String number2WithLetters) {
-        final String number1 = PhoneNumberUtils.convertKeypadLettersToDigits(number1WithLetters);
-        final String number2 = PhoneNumberUtils.convertKeypadLettersToDigits(number2WithLetters);
-
-        int index1 = 0;
-        int index2 = 0;
-        for (;;) {
-            // Skip formatting characters.
-            while (index1 < number1.length() &&
-                    !PhoneNumberUtils.isNonSeparator(number1.charAt(index1))) {
-                index1++;
-            }
-            while (index2 < number2.length() &&
-                    !PhoneNumberUtils.isNonSeparator(number2.charAt(index2))) {
-                index2++;
-            }
-            // If both have finished, match.  If only one has finished, not match.
-            final boolean number1End = (index1 == number1.length());
-            final boolean number2End = (index2 == number2.length());
-            if (number1End) {
-                return number2End;
-            }
-            if (number2End) return false;
-
-            // If the non-formatting characters are different, not match.
-            if (number1.charAt(index1) != number2.charAt(index2)) return false;
-
-            // Go to the next characters.
-            index1++;
-            index2++;
-        }
-    }
-
-    /**
      * Returns true if two {@link Intent}s are both null, or have the same action.
      */
     public static final boolean areIntentActionEqual(Intent a, Intent b) {
diff --git a/src/com/android/contacts/activities/TransactionSafeActivity.java b/src/com/android/contacts/activities/TransactionSafeActivity.java
deleted file mode 100644
index b177665..0000000
--- a/src/com/android/contacts/activities/TransactionSafeActivity.java
+++ /dev/null
@@ -1,65 +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.activities;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * A common superclass that keeps track of whether an {@link Activity} has saved its state yet or
- * not.
- */
-public abstract class TransactionSafeActivity extends Activity {
-
-    private boolean mIsSafeToCommitTransactions;
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        mIsSafeToCommitTransactions = true;
-    }
-
-    @Override
-    protected void onStart() {
-        super.onStart();
-        mIsSafeToCommitTransactions = true;
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-        mIsSafeToCommitTransactions = true;
-    }
-
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        mIsSafeToCommitTransactions = false;
-    }
-
-    /**
-     * Returns true if it is safe to commit {@link FragmentTransaction}s at this time, based on
-     * whether {@link Activity#onSaveInstanceState} has been called or not.
-     *
-     * Make sure that the current activity calls into
-     * {@link super.onSaveInstanceState(Bundle outState)} (if that method is overridden),
-     * so the flag is properly set.
-     */
-    public boolean isSafeToCommitTransactions() {
-        return mIsSafeToCommitTransactions;
-    }
-}
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index 592db44..35ca00b 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -68,9 +68,6 @@
 import android.widget.ListView;
 import android.widget.TextView;
 
-import com.android.contacts.common.CallUtil;
-import com.android.contacts.Collapser;
-import com.android.contacts.Collapser.Collapsible;
 import com.android.contacts.ContactPresenceIconUtil;
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.ContactsUtils;
@@ -78,8 +75,12 @@
 import com.android.contacts.R;
 import com.android.contacts.TypePrecedence;
 import com.android.contacts.activities.ContactDetailActivity.FragmentKeyListener;
+import com.android.contacts.common.CallUtil;
 import com.android.contacts.common.ClipboardUtils;
+import com.android.contacts.common.Collapser;
+import com.android.contacts.common.Collapser.Collapsible;
 import com.android.contacts.common.GeoUtil;
+import com.android.contacts.common.MoreContactUtils;
 import com.android.contacts.editor.SelectAccountDialogFragment;
 import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.model.Contact;
@@ -1338,7 +1339,7 @@
                 return false;
             }
 
-            if (!ContactsUtils.shouldCollapse(mimetype, data, entry.mimetype, entry.data)) {
+            if (!MoreContactUtils.shouldCollapse(mimetype, data, entry.mimetype, entry.data)) {
                 return false;
             }
 
diff --git a/src/com/android/contacts/interactions/PhoneNumberInteraction.java b/src/com/android/contacts/interactions/PhoneNumberInteraction.java
index 12ab431..7ecd5d8 100644
--- a/src/com/android/contacts/interactions/PhoneNumberInteraction.java
+++ b/src/com/android/contacts/interactions/PhoneNumberInteraction.java
@@ -46,17 +46,17 @@
 import android.widget.ListAdapter;
 import android.widget.TextView;
 
-import com.android.contacts.common.CallUtil;
-import com.android.contacts.Collapser;
-import com.android.contacts.Collapser.Collapsible;
 import com.android.contacts.ContactSaveService;
-import com.android.contacts.ContactsUtils;
 import com.android.contacts.R;
-import com.android.contacts.activities.TransactionSafeActivity;
+import com.android.contacts.common.CallUtil;
+import com.android.contacts.common.Collapser;
+import com.android.contacts.common.Collapser.Collapsible;
+import com.android.contacts.common.MoreContactUtils;
+import com.android.contacts.common.activity.TransactionSafeActivity;
+import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.model.account.AccountType;
 import com.android.contacts.model.account.AccountType.StringInflater;
 import com.android.contacts.model.dataitem.DataKind;
-import com.android.contacts.model.AccountTypeManager;
 import com.google.common.annotations.VisibleForTesting;
 
 import java.util.ArrayList;
@@ -135,7 +135,7 @@
 
         @Override
         public boolean shouldCollapseWith(PhoneItem phoneItem) {
-            return ContactsUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, phoneNumber,
+            return MoreContactUtils.shouldCollapse(Phone.CONTENT_ITEM_TYPE, phoneNumber,
                     Phone.CONTENT_ITEM_TYPE, phoneItem.phoneNumber);
         }
 
diff --git a/src/com/android/contacts/quickcontact/Action.java b/src/com/android/contacts/quickcontact/Action.java
index 08fbce4..fa23286 100644
--- a/src/com/android/contacts/quickcontact/Action.java
+++ b/src/com/android/contacts/quickcontact/Action.java
@@ -20,7 +20,7 @@
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 
-import com.android.contacts.Collapser;
+import com.android.contacts.common.Collapser;
 
 /**
  * Abstract definition of an action that could be performed, along with
diff --git a/src/com/android/contacts/quickcontact/DataAction.java b/src/com/android/contacts/quickcontact/DataAction.java
index e2bcc8f..3cf3adf 100644
--- a/src/com/android/contacts/quickcontact/DataAction.java
+++ b/src/com/android/contacts/quickcontact/DataAction.java
@@ -31,6 +31,7 @@
 import com.android.contacts.common.CallUtil;
 import com.android.contacts.ContactsUtils;
 import com.android.contacts.R;
+import com.android.contacts.common.MoreContactUtils;
 import com.android.contacts.model.account.AccountType.EditType;
 import com.android.contacts.model.dataitem.DataItem;
 import com.android.contacts.model.dataitem.DataKind;
@@ -309,7 +310,7 @@
             return false;
         }
         DataAction that = (DataAction)t;
-        if (!ContactsUtils.shouldCollapse(mMimeType, mBody, that.mMimeType, that.mBody)) {
+        if (!MoreContactUtils.shouldCollapse(mMimeType, mBody, that.mMimeType, that.mBody)) {
             return false;
         }
         if (!TextUtils.equals(mMimeType, that.mMimeType)
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index 72d8521..0d9f3de 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -56,7 +56,7 @@
 import android.widget.TextView;
 import android.widget.Toast;
 
-import com.android.contacts.Collapser;
+import com.android.contacts.common.Collapser;
 import com.android.contacts.R;
 import com.android.contacts.model.AccountTypeManager;
 import com.android.contacts.model.Contact;