Backport ContactsContract.PinnedPositions and create compat package

This class was unhidden in API level 21 and the undemote method was
added in API level 21 as well.

Bug: 25629359
Change-Id: I7eecd28338a8f14fca7b8249599c3f7eac70442c
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index 0bc80e7..c3a7f24 100755
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -42,7 +42,6 @@
 import android.provider.ContactsContract.Contacts;
 import android.provider.ContactsContract.Data;
 import android.provider.ContactsContract.Groups;
-import android.provider.ContactsContract.PinnedPositions;
 import android.provider.ContactsContract.Profile;
 import android.provider.ContactsContract.RawContacts;
 import android.provider.ContactsContract.RawContactsEntity;
@@ -59,6 +58,7 @@
 import com.android.contacts.common.model.RawContactModifier;
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.util.PermissionsUtil;
+import com.android.contacts.compat.PinnedPositionsCompat;
 import com.android.contacts.util.ContactPhotoUtils;
 
 import com.google.common.collect.Lists;
@@ -952,7 +952,7 @@
 
                 // Don't bother undemoting if this contact is the user's profile.
                 if (id < Profile.MIN_ID) {
-                    PinnedPositions.undemote(getContentResolver(), id);
+                    PinnedPositionsCompat.undemote(getContentResolver(), id);
                 }
             }
         } finally {
diff --git a/src/com/android/contacts/util/AggregationSuggestionsCompat.java b/src/com/android/contacts/compat/AggregationSuggestionsCompat.java
similarity index 98%
rename from src/com/android/contacts/util/AggregationSuggestionsCompat.java
rename to src/com/android/contacts/compat/AggregationSuggestionsCompat.java
index 75d1333..aa15f70 100644
--- a/src/com/android/contacts/util/AggregationSuggestionsCompat.java
+++ b/src/com/android/contacts/compat/AggregationSuggestionsCompat.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.contacts.util;
+package com.android.contacts.compat;
 
 import android.net.Uri;
 import android.provider.ContactsContract;
diff --git a/src/com/android/contacts/compat/PinnedPositionsCompat.java b/src/com/android/contacts/compat/PinnedPositionsCompat.java
new file mode 100644
index 0000000..044ef20
--- /dev/null
+++ b/src/com/android/contacts/compat/PinnedPositionsCompat.java
@@ -0,0 +1,56 @@
+/*
+ * 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.compat;
+
+import android.content.ContentResolver;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.PinnedPositions;
+
+import com.android.contacts.common.compat.CompatUtils;
+
+/**
+ * Compatibility class for {@link android.provider.ContactsContract.PinnedPositions}
+ */
+public class PinnedPositionsCompat {
+    /**
+     * Not instantiable.
+     */
+    private PinnedPositionsCompat() {
+    }
+
+    /**
+     * copied from android.provider.ContactsContract.PinnedPositions#UNDEMOTE_METHOD
+     */
+    private static final String UNDEMOTE_METHOD = "undemote";
+
+    /**
+     * Compatibility method for {@link android.provider.ContactsContract.PinnedPositions#undemote}
+     */
+    public static void undemote(ContentResolver contentResolver, long contactId) {
+        if (contentResolver == null) {
+            return;
+        }
+        if (CompatUtils.isLollipopCompatible()) {
+            PinnedPositions.undemote(contentResolver, contactId);
+        } else {
+            // copied from android.provider.ContactsContract.PinnedPositions.undemote()
+            contentResolver.call(ContactsContract.AUTHORITY_URI, UNDEMOTE_METHOD,
+                    String.valueOf(contactId), null);
+        }
+    }
+
+}
diff --git a/src/com/android/contacts/util/ProviderStatusCompat.java b/src/com/android/contacts/compat/ProviderStatusCompat.java
similarity index 98%
rename from src/com/android/contacts/util/ProviderStatusCompat.java
rename to src/com/android/contacts/compat/ProviderStatusCompat.java
index 72476f9..4c36d12 100644
--- a/src/com/android/contacts/util/ProviderStatusCompat.java
+++ b/src/com/android/contacts/compat/ProviderStatusCompat.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.contacts.util;
+package com.android.contacts.compat;
 
 import android.os.Build;
 import android.provider.ContactsContract.ProviderStatus;
diff --git a/src/com/android/contacts/util/TelephonyManagerCompat.java b/src/com/android/contacts/compat/TelephonyManagerCompat.java
similarity index 97%
rename from src/com/android/contacts/util/TelephonyManagerCompat.java
rename to src/com/android/contacts/compat/TelephonyManagerCompat.java
index 1559a89..1620ba8 100644
--- a/src/com/android/contacts/util/TelephonyManagerCompat.java
+++ b/src/com/android/contacts/compat/TelephonyManagerCompat.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.contacts.util;
+package com.android.contacts.compat;
 
 import android.content.Context;
 import android.os.Build;
diff --git a/src/com/android/contacts/editor/AggregationSuggestionEngine.java b/src/com/android/contacts/editor/AggregationSuggestionEngine.java
index 816bbc7..6447ff4 100644
--- a/src/com/android/contacts/editor/AggregationSuggestionEngine.java
+++ b/src/com/android/contacts/editor/AggregationSuggestionEngine.java
@@ -39,7 +39,7 @@
 import android.text.TextUtils;
 
 import com.android.contacts.common.model.ValuesDelta;
-import com.android.contacts.util.AggregationSuggestionsCompat;
+import com.android.contacts.compat.AggregationSuggestionsCompat;
 import com.google.common.collect.Lists;
 
 import java.util.ArrayList;
diff --git a/src/com/android/contacts/list/ContactsUnavailableFragment.java b/src/com/android/contacts/list/ContactsUnavailableFragment.java
index fec3553..8cbbaa8 100644
--- a/src/com/android/contacts/list/ContactsUnavailableFragment.java
+++ b/src/com/android/contacts/list/ContactsUnavailableFragment.java
@@ -31,9 +31,9 @@
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
-import com.android.contacts.activities.ActionBarAdapter.TabState;
 import com.android.contacts.R;
-import com.android.contacts.util.ProviderStatusCompat;
+import com.android.contacts.activities.ActionBarAdapter.TabState;
+import com.android.contacts.compat.ProviderStatusCompat;
 
 /**
  * Fragment shown when contacts are unavailable. It contains provider status
diff --git a/src/com/android/contacts/list/ProviderStatusWatcher.java b/src/com/android/contacts/list/ProviderStatusWatcher.java
index 50ed653..51f776b 100644
--- a/src/com/android/contacts/list/ProviderStatusWatcher.java
+++ b/src/com/android/contacts/list/ProviderStatusWatcher.java
@@ -25,7 +25,7 @@
 import android.provider.ContactsContract.ProviderStatus;
 import android.util.Log;
 
-import com.android.contacts.util.ProviderStatusCompat;
+import com.android.contacts.compat.ProviderStatusCompat;
 
 import com.google.common.collect.Lists;
 
diff --git a/src/com/android/contacts/util/PhoneCapabilityTester.java b/src/com/android/contacts/util/PhoneCapabilityTester.java
index d8609a0..37cebf1 100644
--- a/src/com/android/contacts/util/PhoneCapabilityTester.java
+++ b/src/com/android/contacts/util/PhoneCapabilityTester.java
@@ -27,6 +27,7 @@
 import android.provider.Telephony;
 
 import com.android.contacts.common.ContactsUtils;
+import com.android.contacts.compat.TelephonyManagerCompat;
 
 import java.util.List;