Read the unrestricted pacakages list from XML.

Change-Id: I9af814b8bb1b95051a0371d1e3d3769c052ffd95
diff --git a/res/values/unrestricted_packages.xml b/res/values/unrestricted_packages.xml
new file mode 100644
index 0000000..090c72a
--- /dev/null
+++ b/res/values/unrestricted_packages.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 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.
+-->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+           xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+
+    <!-- The list of packages that have access to data that is marked as being restricted -->
+    <string-array name="unrestricted_packages">
+
+        <item>com.android.contacts</item>
+
+    </string-array>
+
+</resources>
diff --git a/src/com/android/providers/contacts/ContactsDatabaseHelper.java b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
index 0ade2f5..4439fbb 100644
--- a/src/com/android/providers/contacts/ContactsDatabaseHelper.java
+++ b/src/com/android/providers/contacts/ContactsDatabaseHelper.java
@@ -24,6 +24,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
 import android.database.DatabaseUtils;
 import android.database.SQLException;
 import android.database.sqlite.SQLiteDatabase;
@@ -474,6 +475,11 @@
 
     private boolean mUseStrictPhoneNumberComparation;
 
+    /**
+     * List of package names with access to {@link RawContacts#IS_RESTRICTED} data.
+     */
+    private String[] mUnrestrictedPackages;
+
     public static synchronized ContactsDatabaseHelper getInstance(Context context) {
         if (sSingleton == null) {
             sSingleton = new ContactsDatabaseHelper(context);
@@ -488,12 +494,16 @@
     ContactsDatabaseHelper(Context context) {
         super(context, DATABASE_NAME, null, DATABASE_VERSION);
         Log.i(TAG, "Creating OpenHelper");
+        Resources resources = context.getResources();
 
         mContext = context;
         mSyncState = new SyncStateContentProviderHelper();
         mUseStrictPhoneNumberComparation =
-            context.getResources().getBoolean(
-                    com.android.internal.R.bool.config_use_strict_phone_number_comparation);
+                resources.getBoolean(
+                        com.android.internal.R.bool.config_use_strict_phone_number_comparation);
+        mUnrestrictedPackages = resources.getStringArray(
+                resources.getIdentifier("unrestricted_packages", "array",
+                        context.getPackageName()));
     }
 
     @Override
@@ -1622,24 +1632,16 @@
     }
 
     /**
-     * List of package names with access to {@link RawContacts#IS_RESTRICTED} data.
-     */
-    static final String[] sAllowedPackages = new String[] {
-        "com.android.contacts",
-        "com.facebook.katana",
-    };
-
-    /**
      * Check if {@link Binder#getCallingUid()} should be allowed access to
      * {@link RawContacts#IS_RESTRICTED} data.
      */
-    boolean hasRestrictedAccess() {
+    boolean hasAccessToRestrictedData() {
         final PackageManager pm = mContext.getPackageManager();
         final String[] callerPackages = pm.getPackagesForUid(Binder.getCallingUid());
 
         // Has restricted access if caller matches any packages
         for (String callerPackage : callerPackages) {
-            if (hasRestrictedAccess(callerPackage)) {
+            if (hasAccessToRestrictedData(callerPackage)) {
                 return true;
             }
         }
@@ -1650,10 +1652,12 @@
      * Check if requestingPackage should be allowed access to
      * {@link RawContacts#IS_RESTRICTED} data.
      */
-    static boolean hasRestrictedAccess(String requestingPackage) {
-        for (String allowedPackage : sAllowedPackages) {
-            if (allowedPackage.equals(requestingPackage)) {
-                return true;
+    boolean hasAccessToRestrictedData(String requestingPackage) {
+        if (mUnrestrictedPackages != null) {
+            for (String allowedPackage : mUnrestrictedPackages) {
+                if (allowedPackage.equals(requestingPackage)) {
+                    return true;
+                }
             }
         }
         return false;
@@ -1664,7 +1668,7 @@
     }
 
     public String getDataView(boolean requireRestrictedView) {
-        return (hasRestrictedAccess() && !requireRestrictedView) ?
+        return (hasAccessToRestrictedData() && !requireRestrictedView) ?
                 Views.DATA_ALL : Views.DATA_RESTRICTED;
     }
 
@@ -1673,7 +1677,7 @@
     }
 
     public String getRawContactView(boolean requireRestrictedView) {
-        return (hasRestrictedAccess() && !requireRestrictedView) ?
+        return (hasAccessToRestrictedData() && !requireRestrictedView) ?
                 Views.RAW_CONTACTS_ALL : Views.RAW_CONTACTS_RESTRICTED;
     }
 
@@ -1682,7 +1686,7 @@
     }
 
     public String getContactView(boolean requireRestrictedView) {
-        return (hasRestrictedAccess() && !requireRestrictedView) ?
+        return (hasAccessToRestrictedData() && !requireRestrictedView) ?
                 Views.CONTACTS_ALL : Views.CONTACTS_RESTRICTED;
     }
 
@@ -1695,7 +1699,7 @@
     }
 
     public String getContactEntitiesView(boolean requireRestrictedView) {
-        return (hasRestrictedAccess() && !requireRestrictedView) ?
+        return (hasAccessToRestrictedData() && !requireRestrictedView) ?
                 Tables.CONTACT_ENTITIES : Tables.CONTACT_ENTITIES_RESTRICTED;
     }
 
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 32cefdc..ef5fb66 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -3760,7 +3760,7 @@
         String requestingPackage = uri.getQueryParameter(
                 ContactsContract.REQUESTING_PACKAGE_PARAM_KEY);
         if (requestingPackage != null) {
-            excludeRestrictedData = !ContactsDatabaseHelper.hasRestrictedAccess(requestingPackage);
+            excludeRestrictedData = !mDbHelper.hasAccessToRestrictedData(requestingPackage);
         }
         sb.append(mDbHelper.getContactView(excludeRestrictedData));
         if (mDbHelper.isInProjection(projection,
@@ -3788,7 +3788,7 @@
         String requestingPackage = uri.getQueryParameter(
                 ContactsContract.REQUESTING_PACKAGE_PARAM_KEY);
         if (requestingPackage != null) {
-            excludeRestrictedData = !ContactsDatabaseHelper.hasRestrictedAccess(requestingPackage);
+            excludeRestrictedData = !mDbHelper.hasAccessToRestrictedData(requestingPackage);
         }
         sb.append(mDbHelper.getRawContactView(excludeRestrictedData));
         qb.setTables(sb.toString());
@@ -3807,7 +3807,7 @@
                 ContactsContract.REQUESTING_PACKAGE_PARAM_KEY);
         if (requestingPackage != null) {
             excludeRestrictedData = excludeRestrictedData
-                    || !ContactsDatabaseHelper.hasRestrictedAccess(requestingPackage);
+                    || !mDbHelper.hasAccessToRestrictedData(requestingPackage);
         }
 
         sb.append(mDbHelper.getDataView(excludeRestrictedData));
@@ -3948,7 +3948,7 @@
     }
 
     String getContactsRestrictions() {
-        if (mDbHelper.hasRestrictedAccess()) {
+        if (mDbHelper.hasAccessToRestrictedData()) {
             return "1";
         } else {
             return RawContacts.IS_RESTRICTED + "=0";
@@ -3956,7 +3956,7 @@
     }
 
     public String getContactsRestrictionExceptionAsNestedQuery(String contactIdColumn) {
-        if (mDbHelper.hasRestrictedAccess()) {
+        if (mDbHelper.hasAccessToRestrictedData()) {
             return "1";
         } else {
             return "(SELECT " + RawContacts.IS_RESTRICTED + " FROM " + Tables.RAW_CONTACTS