Restoring the data restriction based on calling package

Bug: 3230263
Change-Id: If035dbc1a061d94b84e750c988a4e086d22e60eb
diff --git a/src/com/android/contacts/list/ContactEntryListAdapter.java b/src/com/android/contacts/list/ContactEntryListAdapter.java
index d0d0a91..e61e00c 100644
--- a/src/com/android/contacts/list/ContactEntryListAdapter.java
+++ b/src/com/android/contacts/list/ContactEntryListAdapter.java
@@ -19,10 +19,13 @@
 import com.android.contacts.widget.IndexerListAdapter;
 import com.android.contacts.widget.TextWithHighlightingFactory;
 
+import android.app.Activity;
 import android.content.Context;
 import android.content.CursorLoader;
 import android.database.Cursor;
+import android.net.Uri;
 import android.os.Bundle;
+import android.provider.ContactsContract;
 import android.provider.ContactsContract.ContactCounts;
 import android.provider.ContactsContract.Directory;
 import android.text.TextUtils;
@@ -54,6 +57,7 @@
     private int mDisplayOrder;
     private int mSortOrder;
     private boolean mNameHighlightingEnabled;
+    private boolean mDataRestrictedByCallingPackage;
 
     private boolean mDisplayPhotos;
     private boolean mQuickContactEnabled;
@@ -261,6 +265,43 @@
         mQuickContactEnabled = quickContactEnabled;
     }
 
+    public boolean isDataRestrictedByCallingPackage() {
+        return mDataRestrictedByCallingPackage;
+    }
+
+    public void setDataRestrictedByCallingPackage(boolean flag) {
+        mDataRestrictedByCallingPackage = flag;
+    }
+
+    /**
+     * Adds a parameter to the URI that ensures that only unrestricted data
+     * is included in the list, if {@link #isDataRestrictedByCallingPackage()} is true.
+     */
+    protected Uri applyDataRestriction(Uri uri) {
+        if (!mDataRestrictedByCallingPackage) {
+            return uri;
+        }
+
+        return applyDataRestriction(uri.buildUpon()).build();
+    }
+
+    /**
+     * See {@link #applyDataRestriction(Uri)}.
+     */
+    protected Uri.Builder applyDataRestriction(Uri.Builder builder) {
+        if (!mDataRestrictedByCallingPackage) {
+            return builder;
+        }
+
+        String callingPackage = ((Activity)getContext()).getCallingPackage();
+        if (!TextUtils.isEmpty(callingPackage)) {
+            return builder.appendQueryParameter(
+                    ContactsContract.REQUESTING_PACKAGE_PARAM_KEY, callingPackage);
+        }
+
+        return builder;
+    }
+
     public void configureDirectoryLoader(DirectoryListLoader loader) {
         loader.setDirectorySearchMode(mDirectorySearchMode);
         loader.setLocalInvisibleDirectoryEnabled(LOCAL_INVISIBLE_DIRECTORY_ENABLED);
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index c2f5871..872a9c2 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -923,14 +923,6 @@
         throw new UnsupportedOperationException("Picker result handler is not implemented.");
     }
 
-    // TODO integrate into picker fragments
-//    protected Uri buildCallingPackageUri(Uri uri) {
-//        String callingPackage = getContext().getCallingPackage();
-//        if (!TextUtils.isEmpty(callingPackage)) {
-//            uri = uri.buildUpon().appendQueryParameter(
-//                    ContactsContract.REQUESTING_PACKAGE_PARAM_KEY, callingPackage).build();
-//        }
-//    }
     private ContactsPreferences.ChangeListener mPreferencesChangeListener =
             new ContactsPreferences.ChangeListener() {
         @Override
diff --git a/src/com/android/contacts/list/ContactPickerFragment.java b/src/com/android/contacts/list/ContactPickerFragment.java
index a0c29e1..bce4355 100644
--- a/src/com/android/contacts/list/ContactPickerFragment.java
+++ b/src/com/android/contacts/list/ContactPickerFragment.java
@@ -170,6 +170,7 @@
         super.configureAdapter();
 
         ContactEntryListAdapter adapter = getAdapter();
+        adapter.setDataRestrictedByCallingPackage(true);
 
         // If "Create new contact" is shown, don't display the empty list UI
         adapter.setEmptyListEnabled(!isCreateContactEnabled());
diff --git a/src/com/android/contacts/list/DefaultContactListAdapter.java b/src/com/android/contacts/list/DefaultContactListAdapter.java
index d74ffd3..7e79b70 100644
--- a/src/com/android/contacts/list/DefaultContactListAdapter.java
+++ b/src/com/android/contacts/list/DefaultContactListAdapter.java
@@ -64,6 +64,7 @@
                 builder.appendQueryParameter(ContactsContract.LIMIT_PARAM_KEY,
                         String.valueOf(getDirectoryResultLimit()));
             }
+            applyDataRestriction(builder);
             loader.setUri(builder.build());
             loader.setProjection(FILTER_PROJECTION);
         } else {
@@ -110,6 +111,8 @@
                     ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT))
                     .build();
         }
+        uri = applyDataRestriction(uri);
+
         loader.setUri(uri);
     }
 
diff --git a/src/com/android/contacts/list/PhoneNumberListAdapter.java b/src/com/android/contacts/list/PhoneNumberListAdapter.java
index f08637b..2677628 100644
--- a/src/com/android/contacts/list/PhoneNumberListAdapter.java
+++ b/src/com/android/contacts/list/PhoneNumberListAdapter.java
@@ -86,6 +86,7 @@
 
             builder.appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
                     String.valueOf(directoryId));
+            applyDataRestriction(builder);
             uri = builder.build();
             // TODO a projection that includes the search snippet
             loader.setProjection(PHONES_PROJECTION);
@@ -96,6 +97,7 @@
             if (isSectionHeaderDisplayEnabled()) {
                 uri = buildSectionIndexerUri(uri);
             }
+            uri = applyDataRestriction(uri);
 
             loader.setProjection(PHONES_PROJECTION);
         }
diff --git a/src/com/android/contacts/list/PostalAddressListAdapter.java b/src/com/android/contacts/list/PostalAddressListAdapter.java
index 797089c..9248ba2 100644
--- a/src/com/android/contacts/list/PostalAddressListAdapter.java
+++ b/src/com/android/contacts/list/PostalAddressListAdapter.java
@@ -62,7 +62,9 @@
 
     @Override
     public void configureLoader(CursorLoader loader, long directoryId) {
-        loader.setUri(buildSectionIndexerUri(StructuredPostal.CONTENT_URI));
+        Uri uri = buildSectionIndexerUri(StructuredPostal.CONTENT_URI);
+        uri = applyDataRestriction(uri);
+        loader.setUri(uri);
         loader.setProjection(POSTALS_PROJECTION);
 
         if (getSortOrder() == ContactsContract.Preferences.SORT_ORDER_PRIMARY) {