am 5bba632d: - hide Entity and all its references - remove updateEntity and insertEntity, since they are not   used - add the RawContacts.Entity class, which is used in lieu of the   android.content.Entity

Merge commit '5bba632d877c2878384ff21566c8eb6a1a22f37b' into eclair-plus-aosp

* commit '5bba632d877c2878384ff21566c8eb6a1a22f37b':
  - hide Entity and all its references
diff --git a/api/current.xml b/api/current.xml
index df69ede..207c133 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -27216,88 +27216,6 @@
 </package>
 <package name="android.content"
 >
-<class name="AbstractCursorEntityIterator"
- extends="java.lang.Object"
- abstract="true"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<implements name="android.content.EntityIterator">
-</implements>
-<constructor name="AbstractCursorEntityIterator"
- type="android.content.AbstractCursorEntityIterator"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="db" type="android.database.sqlite.SQLiteDatabase">
-</parameter>
-<parameter name="entityCursor" type="android.database.Cursor">
-</parameter>
-</constructor>
-<method name="close"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="hasNext"
- return="boolean"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="newEntityFromCursorLocked"
- return="android.content.Entity"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="cursor" type="android.database.Cursor">
-</parameter>
-</method>
-<method name="next"
- return="android.content.Entity"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="reset"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<exception name="RemoteException" type="android.os.RemoteException">
-</exception>
-</method>
-</class>
 <class name="ActivityNotFoundException"
  extends="java.lang.RuntimeException"
  abstract="false"
@@ -27420,23 +27338,6 @@
 <parameter name="cursor" type="android.database.Cursor">
 </parameter>
 </method>
-<method name="onQueryEntitiesComplete"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="protected"
->
-<parameter name="token" type="int">
-</parameter>
-<parameter name="cookie" type="java.lang.Object">
-</parameter>
-<parameter name="iterator" type="android.content.EntityIterator">
-</parameter>
-</method>
 <method name="onUpdateComplete"
  return="void"
  abstract="false"
@@ -28323,21 +28224,6 @@
 <parameter name="values" type="android.content.ContentValues">
 </parameter>
 </method>
-<method name="insertEntity"
- return="android.net.Uri"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="uri" type="android.net.Uri">
-</parameter>
-<parameter name="entity" type="android.content.Entity">
-</parameter>
-</method>
 <method name="isTemporary"
  return="boolean"
  abstract="false"
@@ -28456,25 +28342,6 @@
 <parameter name="sortOrder" type="java.lang.String">
 </parameter>
 </method>
-<method name="queryEntities"
- return="android.content.EntityIterator"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="uri" type="android.net.Uri">
-</parameter>
-<parameter name="selection" type="java.lang.String">
-</parameter>
-<parameter name="selectionArgs" type="java.lang.String[]">
-</parameter>
-<parameter name="sortOrder" type="java.lang.String">
-</parameter>
-</method>
 <method name="setPathPermissions"
  return="void"
  abstract="false"
@@ -28533,21 +28400,6 @@
 <parameter name="selectionArgs" type="java.lang.String[]">
 </parameter>
 </method>
-<method name="updateEntity"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="uri" type="android.net.Uri">
-</parameter>
-<parameter name="entity" type="android.content.Entity">
-</parameter>
-</method>
 </class>
 <class name="ContentProviderClient"
  extends="java.lang.Object"
@@ -28653,23 +28505,6 @@
 <exception name="RemoteException" type="android.os.RemoteException">
 </exception>
 </method>
-<method name="insertEntity"
- return="android.net.Uri"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="uri" type="android.net.Uri">
-</parameter>
-<parameter name="entity" type="android.content.Entity">
-</parameter>
-<exception name="RemoteException" type="android.os.RemoteException">
-</exception>
-</method>
 <method name="openAssetFile"
  return="android.content.res.AssetFileDescriptor"
  abstract="false"
@@ -28731,27 +28566,6 @@
 <exception name="RemoteException" type="android.os.RemoteException">
 </exception>
 </method>
-<method name="queryEntities"
- return="android.content.EntityIterator"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="uri" type="android.net.Uri">
-</parameter>
-<parameter name="selection" type="java.lang.String">
-</parameter>
-<parameter name="selectionArgs" type="java.lang.String[]">
-</parameter>
-<parameter name="sortOrder" type="java.lang.String">
-</parameter>
-<exception name="RemoteException" type="android.os.RemoteException">
-</exception>
-</method>
 <method name="release"
  return="boolean"
  abstract="false"
@@ -28784,23 +28598,6 @@
 <exception name="RemoteException" type="android.os.RemoteException">
 </exception>
 </method>
-<method name="updateEntity"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="uri" type="android.net.Uri">
-</parameter>
-<parameter name="entity" type="android.content.Entity">
-</parameter>
-<exception name="RemoteException" type="android.os.RemoteException">
-</exception>
-</method>
 </class>
 <class name="ContentProviderOperation"
  extends="java.lang.Object"
@@ -29689,27 +29486,6 @@
 <parameter name="sortOrder" type="java.lang.String">
 </parameter>
 </method>
-<method name="queryEntities"
- return="android.content.EntityIterator"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="uri" type="android.net.Uri">
-</parameter>
-<parameter name="selection" type="java.lang.String">
-</parameter>
-<parameter name="selectionArgs" type="java.lang.String[]">
-</parameter>
-<parameter name="sortOrder" type="java.lang.String">
-</parameter>
-<exception name="RemoteException" type="android.os.RemoteException">
-</exception>
-</method>
 <method name="registerContentObserver"
  return="void"
  abstract="false"
@@ -33171,199 +32947,6 @@
 </parameter>
 </method>
 </interface>
-<class name="Entity"
- extends="java.lang.Object"
- abstract="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-<implements name="android.os.Parcelable">
-</implements>
-<constructor name="Entity"
- type="android.content.Entity"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="values" type="android.content.ContentValues">
-</parameter>
-</constructor>
-<method name="addSubValue"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="uri" type="android.net.Uri">
-</parameter>
-<parameter name="values" type="android.content.ContentValues">
-</parameter>
-</method>
-<method name="describeContents"
- return="int"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getEntityValues"
- return="android.content.ContentValues"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="getSubValues"
- return="java.util.ArrayList&lt;android.content.Entity.NamedContentValues&gt;"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="writeToParcel"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="dest" type="android.os.Parcel">
-</parameter>
-<parameter name="flags" type="int">
-</parameter>
-</method>
-<field name="CREATOR"
- type="android.os.Parcelable.Creator"
- transient="false"
- volatile="false"
- static="true"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-</class>
-<class name="Entity.NamedContentValues"
- extends="java.lang.Object"
- abstract="false"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<constructor name="Entity.NamedContentValues"
- type="android.content.Entity.NamedContentValues"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="uri" type="android.net.Uri">
-</parameter>
-<parameter name="values" type="android.content.ContentValues">
-</parameter>
-</constructor>
-<field name="uri"
- type="android.net.Uri"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-<field name="values"
- type="android.content.ContentValues"
- transient="false"
- volatile="false"
- static="false"
- final="true"
- deprecated="not deprecated"
- visibility="public"
->
-</field>
-</class>
-<interface name="EntityIterator"
- abstract="true"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<method name="close"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-</method>
-<method name="hasNext"
- return="boolean"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<exception name="RemoteException" type="android.os.RemoteException">
-</exception>
-</method>
-<method name="next"
- return="android.content.Entity"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<exception name="RemoteException" type="android.os.RemoteException">
-</exception>
-</method>
-<method name="reset"
- return="void"
- abstract="true"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<exception name="RemoteException" type="android.os.RemoteException">
-</exception>
-</method>
-</interface>
 <class name="Intent"
  extends="java.lang.Object"
  abstract="false"
@@ -115542,6 +115125,82 @@
 >
 </field>
 </class>
+<class name="ContactsContract.RawContacts.Entity"
+ extends="java.lang.Object"
+ abstract="false"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<implements name="android.provider.BaseColumns">
+</implements>
+<field name="CONTENT_DIRECTORY"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;entity&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="DATA_ID"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;data_id&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
+<class name="ContactsContract.RawContactsEntity"
+ extends="java.lang.Object"
+ abstract="false"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<implements name="android.provider.BaseColumns">
+</implements>
+<field name="CONTENT_TYPE"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;vnd.android.cursor.dir/raw_contact_entity&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="CONTENT_URI"
+ type="android.net.Uri"
+ transient="false"
+ volatile="false"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+<field name="DATA_ID"
+ type="java.lang.String"
+ transient="false"
+ volatile="false"
+ value="&quot;data_id&quot;"
+ static="true"
+ final="true"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</field>
+</class>
 <class name="ContactsContract.Settings"
  extends="java.lang.Object"
  abstract="false"
diff --git a/core/java/android/content/AbstractCursorEntityIterator.java b/core/java/android/content/AbstractCursorEntityIterator.java
index c2b13a4..a804f3c 100644
--- a/core/java/android/content/AbstractCursorEntityIterator.java
+++ b/core/java/android/content/AbstractCursorEntityIterator.java
@@ -8,6 +8,7 @@
  * An abstract class that makes it easy to implement an EntityIterator over a cursor.
  * The user must implement {@link #newEntityFromCursorLocked}, which runs inside of a
  * database transaction.
+ * @hide
  */
 public abstract class AbstractCursorEntityIterator implements EntityIterator {
     private final Cursor mEntityCursor;
diff --git a/core/java/android/content/AsyncQueryHandler.java b/core/java/android/content/AsyncQueryHandler.java
index 5e88de0..aa8b42a 100644
--- a/core/java/android/content/AsyncQueryHandler.java
+++ b/core/java/android/content/AsyncQueryHandler.java
@@ -344,6 +344,7 @@
      * @param token The token to identify the query.
      * @param cookie The cookie object.
      * @param iterator The iterator holding the query results.
+     * @hide
      */
     protected void onQueryEntitiesComplete(int token, Object cookie, EntityIterator iterator) {
         // Empty
diff --git a/core/java/android/content/ContentProvider.java b/core/java/android/content/ContentProvider.java
index 5b29b97..a341c9b 100644
--- a/core/java/android/content/ContentProvider.java
+++ b/core/java/android/content/ContentProvider.java
@@ -131,6 +131,9 @@
                     selectionArgs, sortOrder);
         }
 
+        /**
+         * @hide
+         */
         public EntityIterator queryEntities(Uri uri, String selection, String[] selectionArgs,
                 String sortOrder) {
             enforceReadPermission(uri);
@@ -152,11 +155,6 @@
             return ContentProvider.this.bulkInsert(uri, initialValues);
         }
 
-        public Uri insertEntity(Uri uri, Entity entities) {
-            enforceWritePermission(uri);
-            return ContentProvider.this.insertEntity(uri, entities);
-        }
-
         public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
                 throws OperationApplicationException {
             for (ContentProviderOperation operation : operations) {
@@ -182,11 +180,6 @@
             return ContentProvider.this.update(uri, values, selection, selectionArgs);
         }
 
-        public int updateEntity(Uri uri, Entity entity) {
-            enforceWritePermission(uri);
-            return ContentProvider.this.updateEntity(uri, entity);
-        }
-
         public ParcelFileDescriptor openFile(Uri uri, String mode)
                 throws FileNotFoundException {
             if (mode != null && mode.startsWith("rw")) enforceWritePermission(uri);
@@ -451,6 +444,9 @@
     public abstract Cursor query(Uri uri, String[] projection,
             String selection, String[] selectionArgs, String sortOrder);
 
+    /**
+     * @hide
+     */
     public EntityIterator queryEntities(Uri uri, String selection, String[] selectionArgs,
             String sortOrder) {
         throw new UnsupportedOperationException();
@@ -506,10 +502,6 @@
         return numValues;
     }
 
-    public Uri insertEntity(Uri uri, Entity entity) {
-        throw new UnsupportedOperationException();
-    }
-
     /**
      * A request to delete one or more rows. The selection clause is applied when performing
      * the deletion, allowing the operation to affect multiple rows in a
@@ -554,14 +546,10 @@
     public abstract int update(Uri uri, ContentValues values, String selection,
             String[] selectionArgs);
 
-    public int updateEntity(Uri uri, Entity entity) {
-        throw new UnsupportedOperationException();
-    }
-
     /**
      * Open a file blob associated with a content URI.
      * This method can be called from multiple
-     * threads, as described in
+     * threads, as described inentity
      * <a href="{@docRoot}guide/topics/fundamentals.html#procthread">Application Fundamentals:
      * Processes and Threads</a>.
      * 
diff --git a/core/java/android/content/ContentProviderClient.java b/core/java/android/content/ContentProviderClient.java
index 452653e..403c4d8 100644
--- a/core/java/android/content/ContentProviderClient.java
+++ b/core/java/android/content/ContentProviderClient.java
@@ -89,22 +89,15 @@
         return mContentProvider.openAssetFile(url, mode);
     }
 
-    /** see {@link ContentProvider#queryEntities} */
+    /**
+     * see {@link ContentProvider#queryEntities}
+     * @hide
+     */
     public EntityIterator queryEntities(Uri uri, String selection, String[] selectionArgs,
             String sortOrder) throws RemoteException {
         return mContentProvider.queryEntities(uri, selection, selectionArgs, sortOrder);
     }
 
-    /** see {@link ContentProvider#insertEntity} */
-    public Uri insertEntity(Uri uri, Entity entity) throws RemoteException {
-        return mContentProvider.insertEntity(uri, entity);
-    }
-
-    /** see {@link ContentProvider#updateEntity} */
-    public int updateEntity(Uri uri, Entity entity) throws RemoteException {
-        return mContentProvider.updateEntity(uri, entity);
-    }
-
     /** see {@link ContentProvider#applyBatch} */
     public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
             throws RemoteException, OperationApplicationException {
diff --git a/core/java/android/content/ContentProviderNative.java b/core/java/android/content/ContentProviderNative.java
index e367ceb..adc3f60 100644
--- a/core/java/android/content/ContentProviderNative.java
+++ b/core/java/android/content/ContentProviderNative.java
@@ -155,28 +155,6 @@
                     return true;
                 }
 
-                case INSERT_ENTITIES_TRANSACTION:
-                {
-                    data.enforceInterface(IContentProvider.descriptor);
-                    Uri uri = Uri.CREATOR.createFromParcel(data);
-                    Entity entity = (Entity) data.readParcelable(null);
-                    Uri newUri = insertEntity(uri, entity);
-                    reply.writeNoException();
-                    Uri.writeToParcel(reply, newUri);
-                    return true;
-                }
-
-                case UPDATE_ENTITIES_TRANSACTION:
-                {
-                    data.enforceInterface(IContentProvider.descriptor);
-                    Uri uri = Uri.CREATOR.createFromParcel(data);
-                    Entity entity = (Entity) data.readParcelable(null);
-                    int count = updateEntity(uri, entity);
-                    reply.writeNoException();
-                    reply.writeInt(count);
-                    return true;
-                }
-
                 case APPLY_BATCH_TRANSACTION:
                 {
                     data.enforceInterface(IContentProvider.descriptor);
@@ -267,6 +245,9 @@
         return super.onTransact(code, data, reply, flags);
     }
 
+    /**
+     * @hide
+     */
     private class IEntityIteratorImpl extends IEntityIterator.Stub {
         private final EntityIterator mEntityIterator;
 
@@ -371,6 +352,9 @@
         return adaptor;
     }
 
+    /**
+     * @hide
+     */
     public EntityIterator queryEntities(Uri url, String selection, String[] selectionArgs,
             String sortOrder)
             throws RemoteException {
@@ -396,6 +380,9 @@
         return new RemoteEntityIterator(IEntityIterator.Stub.asInterface(entityIteratorBinder));
     }
 
+    /**
+     * @hide
+     */
     static class RemoteEntityIterator implements EntityIterator {
         private final IEntityIterator mEntityIterator;
         RemoteEntityIterator(IEntityIterator entityIterator) {
@@ -506,44 +493,6 @@
         return results;
     }
 
-    public Uri insertEntity(Uri uri, Entity entity) throws RemoteException {
-        Parcel data = Parcel.obtain();
-        Parcel reply = Parcel.obtain();
-
-        try {
-            data.writeInterfaceToken(IContentProvider.descriptor);
-            uri.writeToParcel(data, 0);
-            data.writeParcelable(entity, 0);
-
-            mRemote.transact(IContentProvider.INSERT_ENTITIES_TRANSACTION, data, reply, 0);
-
-            DatabaseUtils.readExceptionFromParcel(reply);
-            return Uri.CREATOR.createFromParcel(reply);
-        } finally {
-            data.recycle();
-            reply.recycle();
-        }
-    }
-
-    public int updateEntity(Uri uri, Entity entity) throws RemoteException {
-        Parcel data = Parcel.obtain();
-        Parcel reply = Parcel.obtain();
-
-        try {
-            data.writeInterfaceToken(IContentProvider.descriptor);
-            uri.writeToParcel(data, 0);
-            data.writeParcelable(entity, 0);
-
-            mRemote.transact(IContentProvider.UPDATE_ENTITIES_TRANSACTION, data, reply, 0);
-
-            DatabaseUtils.readExceptionFromParcel(reply);
-            return reply.readInt();
-        } finally {
-            data.recycle();
-            reply.recycle();
-        }
-    }
-
     public int delete(Uri url, String selection, String[] selectionArgs)
             throws RemoteException {
         Parcel data = Parcel.obtain();
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index c9edc41..c4b0807 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -218,6 +218,7 @@
     /**
      * EntityIterator wrapper that releases the associated ContentProviderClient when the
      * iterator is closed.
+     * @hide
      */
     private class EntityIteratorWrapper implements EntityIterator {
         private final EntityIterator mInner;
@@ -283,6 +284,7 @@
      * @throws RemoteException thrown if a RemoteException is encountered while attempting
      *   to communicate with a remote provider.
      * @throws IllegalArgumentException thrown if there is no provider that matches the uri
+     * @hide
      */
     public final EntityIterator queryEntities(Uri uri,
             String selection, String[] selectionArgs, String sortOrder) throws RemoteException {
diff --git a/core/java/android/content/Entity.java b/core/java/android/content/Entity.java
index 325dce5..ee8112e 100644
--- a/core/java/android/content/Entity.java
+++ b/core/java/android/content/Entity.java
@@ -26,6 +26,7 @@
 /**
  * Objects that pass through the ContentProvider and ContentResolver's methods that deal with
  * Entities must implement this abstract base class and thus themselves be Parcelable.
+ * @hide
  */
 public final class Entity implements Parcelable {
     final private ContentValues mValues;
diff --git a/core/java/android/content/EntityIterator.java b/core/java/android/content/EntityIterator.java
index 3cc1040..1b73439 100644
--- a/core/java/android/content/EntityIterator.java
+++ b/core/java/android/content/EntityIterator.java
@@ -18,6 +18,9 @@
 
 import android.os.RemoteException;
 
+/**
+ * @hide
+ */
 public interface EntityIterator {
     /**
      * Returns whether there are more elements to iterate, i.e. whether the
diff --git a/core/java/android/content/IContentProvider.java b/core/java/android/content/IContentProvider.java
index 7e5aba5..0798adf 100644
--- a/core/java/android/content/IContentProvider.java
+++ b/core/java/android/content/IContentProvider.java
@@ -44,6 +44,9 @@
             CursorWindow window) throws RemoteException;
     public Cursor query(Uri url, String[] projection, String selection,
             String[] selectionArgs, String sortOrder) throws RemoteException;
+    /**
+     * @hide
+     */
     public EntityIterator queryEntities(Uri url, String selection,
             String[] selectionArgs, String sortOrder)
             throws RemoteException;
@@ -51,12 +54,10 @@
     public Uri insert(Uri url, ContentValues initialValues)
             throws RemoteException;
     public int bulkInsert(Uri url, ContentValues[] initialValues) throws RemoteException;
-    public Uri insertEntity(Uri uri, Entity entities) throws RemoteException;
     public int delete(Uri url, String selection, String[] selectionArgs)
             throws RemoteException;
     public int update(Uri url, ContentValues values, String selection,
             String[] selectionArgs) throws RemoteException;
-    public int updateEntity(Uri uri, Entity entity) throws RemoteException;
     public ParcelFileDescriptor openFile(Uri url, String mode)
             throws RemoteException, FileNotFoundException;
     public AssetFileDescriptor openAssetFile(Uri url, String mode)
@@ -75,8 +76,9 @@
     static final int BULK_INSERT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 12;
     static final int OPEN_FILE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 13;
     static final int OPEN_ASSET_FILE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 14;
-    static final int INSERT_ENTITIES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 16;
-    static final int UPDATE_ENTITIES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 17;
+    /**
+     * @hide
+     */
     static final int QUERY_ENTITIES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 18;
     static final int APPLY_BATCH_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION + 19;
 }
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 1d6c8ef..5ea6539 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -673,6 +673,30 @@
              */
             public static final String CONTENT_DIRECTORY = "data";
         }
+
+        /**
+         * A sub-directory of a single raw contact that contains all of their {@link Data} rows.
+         * To access this directory append {@link Entity#CONTENT_DIRECTORY} to the contact URI.
+         */
+        public static final class Entity implements BaseColumns, DataColumns {
+            /**
+             * no public constructor since this is a utility class
+             */
+            private Entity() {
+            }
+
+            /**
+             * The directory twig for this sub-table
+             */
+            public static final String CONTENT_DIRECTORY = "entity";
+
+            /**
+             * The ID of the data column. The value will be null if this raw contact has no
+             * data rows.
+             * <P>Type: INTEGER</P>
+             */
+            public static final String DATA_ID = "data_id";
+        }
     }
 
     private interface StatusColumns extends Im.CommonPresenceColumns {
@@ -869,6 +893,51 @@
         }
     }
 
+    /**
+     * Constants for the raw contacts entities table, which can be though of as an outer join
+     * of the raw_contacts table with the data table.
+     */
+    public final static class RawContactsEntity
+            implements BaseColumns, DataColumns, RawContactsColumns {
+        /**
+         * This utility class cannot be instantiated
+         */
+        private RawContactsEntity() {}
+
+        /**
+         * The content:// style URI for this table
+         */
+        public static final Uri CONTENT_URI =
+                Uri.withAppendedPath(AUTHORITY_URI, "raw_contact_entities");
+
+        /**
+         * The MIME type of {@link #CONTENT_URI} providing a directory of raw contact entities.
+         */
+        public static final String CONTENT_TYPE = "vnd.android.cursor.dir/raw_contact_entity";
+
+        /**
+         * If {@link #FOR_EXPORT_ONLY} is explicitly set to "1", returned Cursor toward
+         * Data.CONTENT_URI contains only exportable data.
+         *
+         * This flag is useful (currently) only for vCard exporter in Contacts app, which
+         * needs to exclude "un-exportable" data from available data to export, while
+         * Contacts app itself has priviledge to access all data including "un-expotable"
+         * ones and providers return all of them regardless of the callers' intention.
+         * <P>Type: INTEGER</p>
+         *
+         * @hide Maybe available only in Eclair and not really ready for public use.
+         * TODO: remove, or implement this feature completely. As of now (Eclair),
+         * we only use this flag in queryEntities(), not query().
+         */
+        public static final String FOR_EXPORT_ONLY = "for_export_only";
+
+        /**
+         * The ID of the data column. The value will be null if this raw contact has no data rows.
+         * <P>Type: INTEGER</P>
+         */
+        public static final String DATA_ID = "data_id";
+    }
+
     private interface PhoneLookupColumns {
         /**
          * The phone number as the user entered it.
diff --git a/test-runner/android/test/mock/MockContentProvider.java b/test-runner/android/test/mock/MockContentProvider.java
index 74f86d8..c3fe9c0 100644
--- a/test-runner/android/test/mock/MockContentProvider.java
+++ b/test-runner/android/test/mock/MockContentProvider.java
@@ -53,10 +53,6 @@
         return 0;
     }
 
-    public Uri insertEntity(Uri uri, Entity entities) throws RemoteException {
-        throw new UnsupportedOperationException("unimplemented mock method");
-    }
-
     @SuppressWarnings("unused")
     public IBulkCursor bulkQuery(Uri url, String[] projection, String selection,
             String[] selectionArgs, String sortOrder, IContentObserver observer, 
@@ -103,6 +99,9 @@
         throw new UnsupportedOperationException("unimplemented mock method");
     }
 
+    /**
+     * @hide
+     */
     public EntityIterator queryEntities(Uri url, String selection, String[] selectionArgs,
             String sortOrder) throws RemoteException {
         throw new UnsupportedOperationException("unimplemented mock method");
@@ -114,10 +113,6 @@
         throw new UnsupportedOperationException("unimplemented mock method");
     }
 
-    public int updateEntity(Uri uri, Entity entity) throws RemoteException {
-        throw new UnsupportedOperationException("unimplemented mock method");
-    }
-
     public IBinder asBinder() {
         throw new UnsupportedOperationException("unimplemented mock method");
     }