Merge "Merge tag 'AU_LINUX_ANDROID_LA.BF64.1.2.1_RB2.05.00.02.081.002' into HEAD"
diff --git a/src/com/android/contacts/common/MoreContactUtils.java b/src/com/android/contacts/common/MoreContactUtils.java
index 4d284ab..bb6ed53 100644
--- a/src/com/android/contacts/common/MoreContactUtils.java
+++ b/src/com/android/contacts/common/MoreContactUtils.java
@@ -338,7 +338,7 @@
 
     public static int getAnrCount(int slot) {
         int anrCount = 0;
-        long[] subId = SubscriptionManager.getSubId(slot);
+        int[] subId = SubscriptionManager.getSubId(slot);
         try {
             IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
                 ServiceManager.getService("simphonebook"));
@@ -360,7 +360,7 @@
 
     public static int getSpareAnrCount(int slot) {
         int anrCount = 0;
-        long[] subId = SubscriptionManager.getSubId(slot);
+        int[] subId = SubscriptionManager.getSubId(slot);
                 try {
             IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
                 ServiceManager.getService("simphonebook"));
@@ -382,7 +382,7 @@
 
     public static int getAdnCount(int slot) {
         int adnCount = 0;
-        long[] subId = SubscriptionManager.getSubId(slot);
+        int[] subId = SubscriptionManager.getSubId(slot);
                 try {
             IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
                 ServiceManager.getService("simphonebook"));
@@ -404,7 +404,7 @@
 
     public static int getEmailCount(int slot) {
         int emailCount = 0;
-        long[] subId = SubscriptionManager.getSubId(slot);
+        int[] subId = SubscriptionManager.getSubId(slot);
                 try {
             IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
                 ServiceManager.getService("simphonebook"));
@@ -426,7 +426,7 @@
 
     public static int getSpareEmailCount(int slot) {
         int emailCount = 0;
-        long[] subId = SubscriptionManager.getSubId(slot);
+        int[] subId = SubscriptionManager.getSubId(slot);
                 try {
             IIccPhoneBook iccIpb = IIccPhoneBook.Stub.asInterface(
                 ServiceManager.getService("simphonebook"));
diff --git a/src/com/android/contacts/common/SimContactsConstants.java b/src/com/android/contacts/common/SimContactsConstants.java
index 759dcd9..5928b1e 100644
--- a/src/com/android/contacts/common/SimContactsConstants.java
+++ b/src/com/android/contacts/common/SimContactsConstants.java
@@ -70,7 +70,7 @@
             "com.android.contacts.action.MULTI_PICK_SIM";
     public static final int SUB_1 = PhoneConstants.SUB1;
     public static final int SUB_2 = PhoneConstants.SUB2;
-    public static final int SUB_INVALID = SubscriptionManager.INVALID_SLOT_ID;
+    public static final int SUB_INVALID = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
 
 }
 
diff --git a/src/com/android/contacts/common/SimContactsOperation.java b/src/com/android/contacts/common/SimContactsOperation.java
index 55c7b79..ef34fcc 100644
--- a/src/com/android/contacts/common/SimContactsOperation.java
+++ b/src/com/android/contacts/common/SimContactsOperation.java
@@ -165,7 +165,7 @@
 
     private Uri getContentUri(int subscription) {
         Uri uri = null;
-        long[] subId = SubscriptionManager.getSubId(subscription);
+        int[] subId = SubscriptionManager.getSubId(subscription);
 
         if (subId != null && TelephonyManager.getDefault().isMultiSimEnabled()) {
             uri = Uri.parse(SimContactsConstants.SIM_SUB_URI + subId[0]);
diff --git a/src/com/android/contacts/common/interactions/ImportExportDialogFragment.java b/src/com/android/contacts/common/interactions/ImportExportDialogFragment.java
index 6b1433d..e6e46a3 100644
--- a/src/com/android/contacts/common/interactions/ImportExportDialogFragment.java
+++ b/src/com/android/contacts/common/interactions/ImportExportDialogFragment.java
@@ -444,7 +444,7 @@
             // call query first, otherwise insert will fail if this insert is called
             // without any query before
             try{
-                long[] subId = SubscriptionManager.getSubId(subscription);
+                int[] subId = SubscriptionManager.getSubId(subscription);
                 if (subId != null
                         && TelephonyManager.getDefault().isMultiSimEnabled()) {
                     cr = mPeople.getContentResolver().query(
diff --git a/src/com/android/contacts/common/model/ContactLoader.java b/src/com/android/contacts/common/model/ContactLoader.java
index eba825b..bea7210 100644
--- a/src/com/android/contacts/common/model/ContactLoader.java
+++ b/src/com/android/contacts/common/model/ContactLoader.java
@@ -316,7 +316,7 @@
                 resultIsCached = true;
             } else {
                 if (uriCurrentFormat.getLastPathSegment().equals(Constants.LOOKUP_URI_ENCODED)) {
-                    result = loadEncodedContactEntity(uriCurrentFormat);
+                    result = loadEncodedContactEntity(uriCurrentFormat, mLookupUri);
                 } else {
                     result = loadContactEntity(resolver, uriCurrentFormat);
                 }
@@ -349,7 +349,22 @@
         }
     }
 
-    private Contact loadEncodedContactEntity(Uri uri) throws JSONException {
+    /**
+     * Parses a {@link Contact} stored as a JSON string in a lookup URI.
+     *
+     * @param lookupUri The contact information to parse .
+     * @return The parsed {@code Contact} information.
+     * @throws JSONException
+     */
+    public static Contact parseEncodedContactEntity(Uri lookupUri)  {
+        try {
+            return loadEncodedContactEntity(lookupUri, lookupUri);
+        } catch (JSONException je) {
+            return null;
+        }
+    }
+
+    private static Contact loadEncodedContactEntity(Uri uri, Uri lookupUri) throws JSONException {
         final String jsonString = uri.getEncodedFragment();
         final JSONObject json = new JSONObject(jsonString);
 
@@ -363,7 +378,7 @@
         final String photoUri = json.optString(Contacts.PHOTO_URI, null);
         final Contact contact = new Contact(
                 uri, uri,
-                mLookupUri,
+                lookupUri,
                 directoryId,
                 null /* lookupKey */,
                 -1 /* id */,
@@ -423,7 +438,7 @@
         return contact;
     }
 
-    private void processOneRecord(RawContact rawContact, JSONObject item, String mimetype)
+    private static void processOneRecord(RawContact rawContact, JSONObject item, String mimetype)
             throws JSONException {
         final ContentValues itemValues = new ContentValues();
         itemValues.put(Data.MIMETYPE, mimetype);
diff --git a/src/com/android/contacts/common/util/MaterialColorMapUtils.java b/src/com/android/contacts/common/util/MaterialColorMapUtils.java
index 9c8862c..7827ae3 100644
--- a/src/com/android/contacts/common/util/MaterialColorMapUtils.java
+++ b/src/com/android/contacts/common/util/MaterialColorMapUtils.java
@@ -20,6 +20,8 @@
 
 import android.content.res.Resources;
 import android.content.res.TypedArray;
+import android.os.Parcel;
+import android.os.Parcelable;
 import android.os.Trace;
 
 public class MaterialColorMapUtils {
@@ -34,13 +36,71 @@
                 com.android.contacts.common.R.array.letter_tile_colors_dark);
     }
 
-    public static class MaterialPalette {
+    public static class MaterialPalette implements Parcelable {
         public MaterialPalette(int primaryColor, int secondaryColor) {
             mPrimaryColor = primaryColor;
             mSecondaryColor = secondaryColor;
         }
         public final int mPrimaryColor;
         public final int mSecondaryColor;
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj) {
+                return true;
+            }
+            if (obj == null) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            MaterialPalette other = (MaterialPalette) obj;
+            if (mPrimaryColor != other.mPrimaryColor) {
+                return false;
+            }
+            if (mSecondaryColor != other.mSecondaryColor) {
+                return false;
+            }
+            return true;
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime * result + mPrimaryColor;
+            result = prime * result + mSecondaryColor;
+            return result;
+        }
+
+        @Override
+        public int describeContents() {
+            return 0;
+        }
+
+        @Override
+        public void writeToParcel(Parcel dest, int flags) {
+            dest.writeInt(mPrimaryColor);
+            dest.writeInt(mSecondaryColor);
+        }
+
+        private MaterialPalette(Parcel in) {
+            mPrimaryColor = in.readInt();
+            mSecondaryColor = in.readInt();
+        }
+
+        public static final Creator<MaterialPalette> CREATOR = new Creator<MaterialPalette>() {
+                @Override
+                public MaterialPalette createFromParcel(Parcel in) {
+                    return new MaterialPalette(in);
+                }
+
+                @Override
+                public MaterialPalette[] newArray(int size) {
+                    return new MaterialPalette[size];
+                }
+        };
     }
 
     /**