Bump version to 1.3.07
am: ac4d5abe00

* commit 'ac4d5abe00047d177ff50d40945932e8faa36291':
  Bump version to 1.3.07
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index fd26035..0e9591d 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -24,6 +24,7 @@
 import android.content.res.TypedArray;
 import android.os.Bundle;
 import android.preference.PreferenceManager;
+import android.support.v4.content.ContextCompat;
 import android.text.Editable;
 import android.text.TextUtils;
 import android.text.TextWatcher;
@@ -44,6 +45,7 @@
 import com.android.contacts.activities.ActionBarAdapter.Listener.Action;
 import com.android.contacts.list.ContactsRequest;
 
+
 /**
  * Adapter for the action bar at the top of the Contacts activity.
  */
@@ -502,11 +504,12 @@
 
     private void updateStatusBarColor() {
         if (mSelectionMode) {
-            int cabStatusBarColor = mActivity.getResources().getColor(
+            final int cabStatusBarColor = mActivity.getResources().getColor(
                     R.color.contextual_selection_bar_status_bar_color);
             mActivity.getWindow().setStatusBarColor(cabStatusBarColor);
         } else {
-            int normalStatusBarColor = mActivity.getColor(R.color.primary_color_dark);
+            final int normalStatusBarColor = ContextCompat.getColor(
+                    mActivity, R.color.primary_color_dark);
             mActivity.getWindow().setStatusBarColor(normalStatusBarColor);
         }
     }
diff --git a/src/com/android/contacts/editor/AggregationSuggestionEngine.java b/src/com/android/contacts/editor/AggregationSuggestionEngine.java
index aa5f988..816bbc7 100644
--- a/src/com/android/contacts/editor/AggregationSuggestionEngine.java
+++ b/src/com/android/contacts/editor/AggregationSuggestionEngine.java
@@ -21,11 +21,11 @@
 import android.database.ContentObserver;
 import android.database.Cursor;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Message;
 import android.os.Process;
-import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.Email;
 import android.provider.ContactsContract.CommonDataKinds.Nickname;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
@@ -39,6 +39,7 @@
 import android.text.TextUtils;
 
 import com.android.contacts.common.model.ValuesDelta;
+import com.android.contacts.util.AggregationSuggestionsCompat;
 import com.google.common.collect.Lists;
 
 import java.util.ArrayList;
@@ -228,19 +229,32 @@
             return null;
         }
 
-        Builder builder = new AggregationSuggestions.Builder()
+        // AggregationSuggestions.Builder() became visible in API level 23, so use it if applicable.
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            final Builder uriBuilder = new AggregationSuggestions.Builder()
+                    .setLimit(mSuggestionsLimit)
+                    .setContactId(mContactId);
+            if (nameSb.length() != 0) {
+                uriBuilder.addNameParameter(nameSb.toString());
+            }
+            if (phoneticNameSb.length() != 0) {
+                uriBuilder.addNameParameter(phoneticNameSb.toString());
+            }
+            return uriBuilder.build();
+        }
+
+        // For previous SDKs, use the backup plan.
+        final AggregationSuggestionsCompat.Builder uriBuilder =
+                new AggregationSuggestionsCompat.Builder()
                 .setLimit(mSuggestionsLimit)
                 .setContactId(mContactId);
-
         if (nameSb.length() != 0) {
-            builder.addNameParameter(nameSb.toString());
+            uriBuilder.addNameParameter(nameSb.toString());
         }
-
         if (phoneticNameSb.length() != 0) {
-            builder.addNameParameter(phoneticNameSb.toString());
+            uriBuilder.addNameParameter(phoneticNameSb.toString());
         }
-
-        return builder.build();
+        return uriBuilder.build();
     }
 
     private void appendValue(StringBuilder sb, ValuesDelta values, String column) {
diff --git a/src/com/android/contacts/editor/CompactContactEditorFragment.java b/src/com/android/contacts/editor/CompactContactEditorFragment.java
index cd7f0ab..3f401ee 100644
--- a/src/com/android/contacts/editor/CompactContactEditorFragment.java
+++ b/src/com/android/contacts/editor/CompactContactEditorFragment.java
@@ -205,7 +205,7 @@
     public void updatePhoto(Uri uri) throws FileNotFoundException {
         final Bitmap bitmap = ContactPhotoUtils.getBitmapFromUri(getActivity(), uri);
         if (bitmap == null || bitmap.getHeight() <= 0 || bitmap.getWidth() <= 0) {
-            Toast.makeText(getContext(), R.string.contactPhotoSavedErrorToast,
+            Toast.makeText(mContext, R.string.contactPhotoSavedErrorToast,
                     Toast.LENGTH_SHORT).show();
             return;
         }
diff --git a/src/com/android/contacts/editor/CompactPhotoSelectionFragment.java b/src/com/android/contacts/editor/CompactPhotoSelectionFragment.java
index bd6444f..fe725c0 100644
--- a/src/com/android/contacts/editor/CompactPhotoSelectionFragment.java
+++ b/src/com/android/contacts/editor/CompactPhotoSelectionFragment.java
@@ -226,14 +226,14 @@
             // Bind the photo
             final ImageView imageView = (ImageView) photoItemView.findViewById(R.id.image);
             if (photo.updatedPhotoUri != null) {
-                EditorUiUtils.loadPhoto(ContactPhotoManager.getInstance(getContext()),
+                EditorUiUtils.loadPhoto(ContactPhotoManager.getInstance(mContext),
                         imageView, photo.updatedPhotoUri);
             } else {
                 final Long photoFileId = EditorUiUtils.getPhotoFileId(photo.valuesDelta);
                 if (photoFileId != null) {
                     final Uri photoUri = ContactsContract.DisplayPhoto.CONTENT_URI.buildUpon()
                             .appendPath(photoFileId.toString()).build();
-                    EditorUiUtils.loadPhoto(ContactPhotoManager.getInstance(getContext()),
+                    EditorUiUtils.loadPhoto(ContactPhotoManager.getInstance(mContext),
                             imageView, photoUri);
                 } else {
                     imageView.setImageBitmap(EditorUiUtils.getPhotoBitmap(photo.valuesDelta));
@@ -366,4 +366,9 @@
                 return super.onOptionsItemSelected(item);
         }
     }
+
+    @Override
+    public Context getContext() {
+        return getActivity();
+    }
 }
\ No newline at end of file
diff --git a/src/com/android/contacts/editor/TextFieldsEditorView.java b/src/com/android/contacts/editor/TextFieldsEditorView.java
index 98b46ef..0ec71fb 100644
--- a/src/com/android/contacts/editor/TextFieldsEditorView.java
+++ b/src/com/android/contacts/editor/TextFieldsEditorView.java
@@ -21,7 +21,6 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.provider.ContactsContract;
-import android.telephony.PhoneNumberUtils;
 import android.text.Editable;
 import android.text.InputType;
 import android.text.TextUtils;
@@ -39,6 +38,7 @@
 
 import com.android.contacts.R;
 import com.android.contacts.common.model.RawContactDelta;
+import com.android.contacts.common.compat.PhoneNumberUtilsCompat;
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.model.ValuesDelta;
 import com.android.contacts.common.model.account.AccountType.EditField;
@@ -255,7 +255,7 @@
             final String column = field.column;
             final String value = entry.getAsString(column);
             if (ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE.equals(kind.mimeType)) {
-                fieldView.setText(PhoneNumberUtils.createTtsSpannable(value));
+                fieldView.setText(PhoneNumberUtilsCompat.createTtsSpannable(value));
             } else {
                 fieldView.setText(value);
             }
diff --git a/src/com/android/contacts/list/ContactsUnavailableFragment.java b/src/com/android/contacts/list/ContactsUnavailableFragment.java
index bd811b2..293ed04 100644
--- a/src/com/android/contacts/list/ContactsUnavailableFragment.java
+++ b/src/com/android/contacts/list/ContactsUnavailableFragment.java
@@ -16,6 +16,7 @@
 package com.android.contacts.list;
 
 import android.app.Fragment;
+import android.content.Context;
 import android.graphics.PorterDuff;
 import android.os.Bundle;
 import android.provider.ContactsContract.ProviderStatus;
@@ -157,4 +158,9 @@
             }
         }
     }
+
+    @Override
+    public Context getContext() {
+        return getActivity();
+    }
 }
diff --git a/src/com/android/contacts/quickcontact/QuickContactActivity.java b/src/com/android/contacts/quickcontact/QuickContactActivity.java
index d552c96..0f5b3b0 100644
--- a/src/com/android/contacts/quickcontact/QuickContactActivity.java
+++ b/src/com/android/contacts/quickcontact/QuickContactActivity.java
@@ -67,6 +67,7 @@
 import android.provider.ContactsContract.Intents;
 import android.provider.ContactsContract.QuickContact;
 import android.provider.ContactsContract.RawContacts;
+import android.support.v4.content.ContextCompat;
 import android.support.v7.graphics.Palette;
 import android.support.v7.widget.CardView;
 import android.telecom.PhoneAccount;
@@ -183,9 +184,6 @@
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 
-import android.graphics.PorterDuff;
-import android.support.v4.content.ContextCompat;
-
 /**
  * Mostly translucent {@link Activity} that shows QuickContact dialog. It loads
  * data asynchronously, and then shows a popup with details centered around
@@ -644,10 +642,11 @@
 
     private void enableLinkButton() {
         mSuggestionsLinkButton.setClickable(true);
-        mSuggestionsLinkButton.getBackground().setColorFilter(getResources().getColor(
-                R.color.primary_color, getTheme()), PorterDuff.Mode.SRC_ATOP);
-        mSuggestionsLinkButton.setTextColor(getResources().getColor(android.R.color.white,
-                getTheme()));
+        mSuggestionsLinkButton.getBackground().setColorFilter(
+                ContextCompat.getColor(this, R.color.primary_color),
+                PorterDuff.Mode.SRC_ATOP);
+        mSuggestionsLinkButton.setTextColor(
+                ContextCompat.getColor(this, android.R.color.white));
         mSuggestionsLinkButton.setOnClickListener(new OnClickListener() {
             @Override
             public void onClick(View view) {
@@ -669,10 +668,10 @@
     private void disableLinkButton() {
         mSuggestionsLinkButton.setClickable(false);
         mSuggestionsLinkButton.getBackground().setColorFilter(
-                getResources().getColor(R.color.disabled_button_background, getTheme()),
+                ContextCompat.getColor(this, R.color.disabled_button_background),
                 PorterDuff.Mode.SRC_ATOP);
         mSuggestionsLinkButton.setTextColor(
-                getResources().getColor(R.color.disabled_button_text, getTheme()));
+                ContextCompat.getColor(this, R.color.disabled_button_text));
     }
 
     private interface ContextMenuIds {
@@ -983,7 +982,6 @@
                 mCollapsedSuggestionCardView.setVisibility(View.GONE);
                 mExpandSuggestionCardView.setVisibility(View.VISIBLE);
                 mIsSuggestionListCollapsed = false;
-                mSuggestionsShouldAutoSelected = true;
             }
         });
 
@@ -1382,6 +1380,7 @@
             mCollapsedSuggestionCardView.setVisibility(View.GONE);
             mExpandSuggestionCardView.setVisibility(View.GONE);
             mIsSuggestionListCollapsed = true;
+            mSuggestionsShouldAutoSelected = true;
             mSuggestionList.removeAllViews();
         }
 
diff --git a/src/com/android/contacts/util/AggregationSuggestionsCompat.java b/src/com/android/contacts/util/AggregationSuggestionsCompat.java
new file mode 100644
index 0000000..75d1333
--- /dev/null
+++ b/src/com/android/contacts/util/AggregationSuggestionsCompat.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2015 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.util;
+
+import android.net.Uri;
+import android.provider.ContactsContract;
+
+import java.util.ArrayList;
+
+/**
+ * This class contains Builder class extracted from ContactsContract, and it became visible in API
+ * level 23. We need maintain this class and keep it synced with ContactsContract.
+ */
+public class AggregationSuggestionsCompat {
+
+    /**
+     * Used to specify what kind of data is supplied for the suggestion query.
+     */
+    public static final String PARAMETER_MATCH_NAME = "name";
+
+    /**
+     * A convenience builder for aggregation suggestion content URIs.
+     */
+    public static final class Builder {
+        private long mContactId;
+        private final ArrayList<String> mValues = new ArrayList<String>();
+        private int mLimit;
+
+        /**
+         * Optional existing contact ID.  If it is not provided, the search
+         * will be based exclusively on the values supplied with {@link #addNameParameter}.
+         *
+         * @param contactId contact to find aggregation suggestions for
+         * @return This Builder object to allow for chaining of calls to builder methods
+         */
+        public Builder setContactId(long contactId) {
+            this.mContactId = contactId;
+            return this;
+        }
+
+        /**
+         * Add a name to be used when searching for aggregation suggestions.
+         *
+         * @param name name to find aggregation suggestions for
+         * @return This Builder object to allow for chaining of calls to builder methods
+         */
+        public Builder addNameParameter(String name) {
+            mValues.add(name);
+            return this;
+        }
+
+        /**
+         * Sets the Maximum number of suggested aggregations that should be returned.
+         * @param limit The maximum number of suggested aggregations
+         *
+         * @return This Builder object to allow for chaining of calls to builder methods
+         */
+        public Builder setLimit(int limit) {
+            mLimit = limit;
+            return this;
+        }
+
+        /**
+         * Combine all of the options that have been set and return a new {@link Uri}
+         * object for fetching aggregation suggestions.
+         */
+        public Uri build() {
+            android.net.Uri.Builder builder = ContactsContract.Contacts.CONTENT_URI.buildUpon();
+            builder.appendEncodedPath(String.valueOf(mContactId));
+            builder.appendPath(ContactsContract.Contacts.AggregationSuggestions.CONTENT_DIRECTORY);
+            if (mLimit != 0) {
+                builder.appendQueryParameter("limit", String.valueOf(mLimit));
+            }
+
+            int count = mValues.size();
+            for (int i = 0; i < count; i++) {
+                builder.appendQueryParameter("query", PARAMETER_MATCH_NAME
+                        + ":" + mValues.get(i));
+            }
+
+            return builder.build();
+        }
+    }
+}