Merge change 22011 into eclair

* changes:
  fix [2063336] Surface.lockSurface throws IllegalArgumentException when out of memory
diff --git a/api/current.xml b/api/current.xml
index e9082bc..ec76edb 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -175196,6 +175196,39 @@
  deprecated="not deprecated"
  visibility="public"
 >
+<method name="canPause"
+ return="boolean"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="canSeekBackward"
+ return="boolean"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="canSeekForward"
+ return="boolean"
+ abstract="true"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getBufferPercentage"
  return="int"
  abstract="true"
@@ -183524,6 +183557,39 @@
 <parameter name="defStyle" type="int">
 </parameter>
 </constructor>
+<method name="canPause"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="canSeekBackward"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
+<method name="canSeekForward"
+ return="boolean"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+</method>
 <method name="getBufferPercentage"
  return="int"
  abstract="false"
diff --git a/core/java/android/pim/ContactsAsyncHelper.java b/core/java/android/pim/ContactsAsyncHelper.java
index a21281e..342d208 100644
--- a/core/java/android/pim/ContactsAsyncHelper.java
+++ b/core/java/android/pim/ContactsAsyncHelper.java
@@ -27,8 +27,7 @@
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.Message;
-import android.provider.Contacts;
-import android.provider.Contacts.People;
+import android.provider.ContactsContract.Contacts;
 import android.util.Log;
 import android.view.View;
 import android.widget.ImageView;
@@ -39,35 +38,35 @@
  * Helper class for async access of images.
  */
 public class ContactsAsyncHelper extends Handler {
-    
+
     private static final boolean DBG = false;
     private static final String LOG_TAG = "ContactsAsyncHelper";
-    
+
     /**
      * Interface for a WorkerHandler result return.
      */
     public interface OnImageLoadCompleteListener {
         /**
          * Called when the image load is complete.
-         * 
+         *
          * @param imagePresent true if an image was found
-         */  
+         */
         public void onImageLoadComplete(int token, Object cookie, ImageView iView,
                 boolean imagePresent);
     }
-     
+
     // constants
     private static final int EVENT_LOAD_IMAGE = 1;
     private static final int DEFAULT_TOKEN = -1;
-    
+
     // static objects
     private static Handler sThreadHandler;
     private static ContactsAsyncHelper sInstance;
-    
+
     static {
         sInstance = new ContactsAsyncHelper();
     }
-    
+
     private static final class WorkerArgs {
         public Context context;
         public ImageView view;
@@ -78,12 +77,12 @@
         public OnImageLoadCompleteListener listener;
         public CallerInfo info;
     }
-    
+
     /**
-     * public inner class to help out the ContactsAsyncHelper callers 
-     * with tracking the state of the CallerInfo Queries and image 
+     * public inner class to help out the ContactsAsyncHelper callers
+     * with tracking the state of the CallerInfo Queries and image
      * loading.
-     * 
+     *
      * Logic contained herein is used to remove the race conditions
      * that exist as the CallerInfo queries run and mix with the image
      * loads, which then mix with the Phone state changes.
@@ -94,11 +93,11 @@
         public static final int DISPLAY_UNDEFINED = 0;
         public static final int DISPLAY_IMAGE = -1;
         public static final int DISPLAY_DEFAULT = -2;
-        
+
         // State of the image on the imageview.
         private CallerInfo mCurrentCallerInfo;
         private int displayMode;
-        
+
         public ImageTracker() {
             mCurrentCallerInfo = null;
             displayMode = DISPLAY_UNDEFINED;
@@ -107,17 +106,17 @@
         /**
          * Used to see if the requested call / connection has a
          * different caller attached to it than the one we currently
-         * have in the CallCard. 
+         * have in the CallCard.
          */
         public boolean isDifferentImageRequest(CallerInfo ci) {
             // note, since the connections are around for the lifetime of the
-            // call, and the CallerInfo-related items as well, we can 
+            // call, and the CallerInfo-related items as well, we can
             // definitely use a simple != comparison.
             return (mCurrentCallerInfo != ci);
         }
-        
+
         public boolean isDifferentImageRequest(Connection connection) {
-            // if the connection does not exist, see if the 
+            // if the connection does not exist, see if the
             // mCurrentCallerInfo is also null to match.
             if (connection == null) {
                 if (DBG) Log.d(LOG_TAG, "isDifferentImageRequest: connection is null");
@@ -133,57 +132,58 @@
             }
             return runQuery;
         }
-        
+
         /**
-         * Simple setter for the CallerInfo object. 
+         * Simple setter for the CallerInfo object.
          */
         public void setPhotoRequest(CallerInfo ci) {
-            mCurrentCallerInfo = ci; 
+            mCurrentCallerInfo = ci;
         }
-        
+
         /**
-         * Convenience method used to retrieve the URI 
-         * representing the Photo file recorded in the attached 
-         * CallerInfo Object. 
+         * Convenience method used to retrieve the URI
+         * representing the Photo file recorded in the attached
+         * CallerInfo Object.
          */
         public Uri getPhotoUri() {
             if (mCurrentCallerInfo != null) {
-                return ContentUris.withAppendedId(People.CONTENT_URI, 
+                return ContentUris.withAppendedId(Contacts.CONTENT_URI,
                         mCurrentCallerInfo.person_id);
             }
-            return null; 
+            return null;
         }
-        
+
         /**
-         * Simple setter for the Photo state. 
+         * Simple setter for the Photo state.
          */
         public void setPhotoState(int state) {
             displayMode = state;
         }
-        
+
         /**
-         * Simple getter for the Photo state. 
+         * Simple getter for the Photo state.
          */
         public int getPhotoState() {
             return displayMode;
         }
     }
-    
+
     /**
-     * Thread worker class that handles the task of opening the stream and loading 
+     * Thread worker class that handles the task of opening the stream and loading
      * the images.
      */
     private class WorkerHandler extends Handler {
         public WorkerHandler(Looper looper) {
             super(looper);
         }
-        
+
+        @Override
         public void handleMessage(Message msg) {
             WorkerArgs args = (WorkerArgs) msg.obj;
-            
+
             switch (msg.arg1) {
                 case EVENT_LOAD_IMAGE:
-                    InputStream inputStream = Contacts.People.openContactPhotoInputStream(
+                    InputStream inputStream = Contacts.openContactPhotoInputStream(
                             args.context.getContentResolver(), args.uri);
                     if (inputStream != null) {
                         args.result = Drawable.createFromStream(inputStream, args.uri.toString());
@@ -192,22 +192,22 @@
                                 " token: " + msg.what + " image URI: " + args.uri);
                     } else {
                         args.result = null;
-                        if (DBG) Log.d(LOG_TAG, "Problem with image: " + msg.arg1 + 
-                                " token: " + msg.what + " image URI: " + args.uri + 
+                        if (DBG) Log.d(LOG_TAG, "Problem with image: " + msg.arg1 +
+                                " token: " + msg.what + " image URI: " + args.uri +
                                 ", using default image.");
                     }
                     break;
                 default:
             }
-            
-            // send the reply to the enclosing class. 
+
+            // send the reply to the enclosing class.
             Message reply = ContactsAsyncHelper.this.obtainMessage(msg.what);
             reply.arg1 = msg.arg1;
             reply.obj = msg.obj;
             reply.sendToTarget();
         }
     }
-    
+
     /**
      * Private constructor for static class
      */
@@ -216,14 +216,14 @@
         thread.start();
         sThreadHandler = new WorkerHandler(thread.getLooper());
     }
-    
+
     /**
      * Convenience method for calls that do not want to deal with listeners and tokens.
      */
-    public static final void updateImageViewWithContactPhotoAsync(Context context, 
+    public static final void updateImageViewWithContactPhotoAsync(Context context,
             ImageView imageView, Uri person, int placeholderImageResource) {
         // Added additional Cookie field in the callee.
-        updateImageViewWithContactPhotoAsync (null, DEFAULT_TOKEN, null, null, context, 
+        updateImageViewWithContactPhotoAsync (null, DEFAULT_TOKEN, null, null, context,
                 imageView, person, placeholderImageResource);
     }
 
@@ -231,24 +231,24 @@
      * Convenience method for calls that do not want to deal with listeners and tokens, but have
      * a CallerInfo object to cache the image to.
      */
-    public static final void updateImageViewWithContactPhotoAsync(CallerInfo info, Context context, 
+    public static final void updateImageViewWithContactPhotoAsync(CallerInfo info, Context context,
             ImageView imageView, Uri person, int placeholderImageResource) {
         // Added additional Cookie field in the callee.
-        updateImageViewWithContactPhotoAsync (info, DEFAULT_TOKEN, null, null, context, 
+        updateImageViewWithContactPhotoAsync (info, DEFAULT_TOKEN, null, null, context,
                 imageView, person, placeholderImageResource);
     }
 
-    
+
     /**
      * Start an image load, attach the result to the specified CallerInfo object.
      * Note, when the query is started, we make the ImageView INVISIBLE if the
      * placeholderImageResource value is -1.  When we're given a valid (!= -1)
      * placeholderImageResource value, we make sure the image is visible.
      */
-    public static final void updateImageViewWithContactPhotoAsync(CallerInfo info, int token, 
-            OnImageLoadCompleteListener listener, Object cookie, Context context, 
+    public static final void updateImageViewWithContactPhotoAsync(CallerInfo info, int token,
+            OnImageLoadCompleteListener listener, Object cookie, Context context,
             ImageView imageView, Uri person, int placeholderImageResource) {
-        
+
         // in case the source caller info is null, the URI will be null as well.
         // just update using the placeholder image in this case.
         if (person == null) {
@@ -257,10 +257,10 @@
             imageView.setImageResource(placeholderImageResource);
             return;
         }
-        
+
         // Added additional Cookie field in the callee to handle arguments
         // sent to the callback function.
-        
+
         // setup arguments
         WorkerArgs args = new WorkerArgs();
         args.cookie = cookie;
@@ -270,15 +270,15 @@
         args.defaultResource = placeholderImageResource;
         args.listener = listener;
         args.info = info;
-        
+
         // setup message arguments
         Message msg = sThreadHandler.obtainMessage(token);
         msg.arg1 = EVENT_LOAD_IMAGE;
         msg.obj = args;
-        
-        if (DBG) Log.d(LOG_TAG, "Begin loading image: " + args.uri + 
+
+        if (DBG) Log.d(LOG_TAG, "Begin loading image: " + args.uri +
                 ", displaying default image for now.");
-        
+
         // set the default image first, when the query is complete, we will
         // replace the image with the correct one.
         if (placeholderImageResource != -1) {
@@ -287,11 +287,11 @@
         } else {
             imageView.setVisibility(View.INVISIBLE);
         }
-        
+
         // notify the thread to begin working
         sThreadHandler.sendMessage(msg);
     }
-    
+
     /**
      * Called when loading is done.
      */
@@ -316,21 +316,21 @@
                     args.view.setVisibility(View.VISIBLE);
                     args.view.setImageResource(args.defaultResource);
                 }
-                
+
                 // Note that the data is cached.
                 if (args.info != null) {
                     args.info.isCachedPhotoCurrent = true;
                 }
-                
+
                 // notify the listener if it is there.
                 if (args.listener != null) {
-                    if (DBG) Log.d(LOG_TAG, "Notifying listener: " + args.listener.toString() + 
+                    if (DBG) Log.d(LOG_TAG, "Notifying listener: " + args.listener.toString() +
                             " image: " + args.uri + " completed");
                     args.listener.onImageLoadComplete(msg.what, args.cookie, args.view,
                             imagePresent);
                 }
                 break;
-            default:    
+            default:
         }
     }
 }
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 50c9c8c..5932040 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -19,15 +19,21 @@
 import android.accounts.Account;
 import android.content.ContentProviderClient;
 import android.content.ContentProviderOperation;
+import android.content.ContentResolver;
+import android.content.ContentUris;
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.Resources;
+import android.database.Cursor;
 import android.graphics.BitmapFactory;
 import android.net.Uri;
 import android.os.RemoteException;
 import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
 import android.text.TextUtils;
 
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
 /**
  * The contract between the contacts provider and applications. Contains definitions
  * for the supported URIs and columns.
@@ -299,6 +305,55 @@
              */
             public static final String CONTENT_DIRECTORY = "suggestions";
         }
+
+        /**
+         * Returns a URI that can be used to retrieve the contact's default photo.
+         *
+         * @param contactUri the contact whose photo should be used
+         */
+        public static Uri getPhotoUri(ContentResolver cr, Uri contactUri) {
+            long photoId = -1;
+            Cursor cursor = cr.query(contactUri, new String[]{Contacts.PHOTO_ID}, null, null, null);
+            try {
+                if (!cursor.moveToNext()) {
+                    return null;
+                }
+
+                if (cursor.isNull(0)) {
+                    return null;
+                }
+
+                photoId = cursor.getLong(0);
+            } finally {
+                cursor.close();
+            }
+
+            return ContentUris.withAppendedId(ContactsContract.Data.CONTENT_URI, photoId);
+        }
+
+        /**
+         * Opens an InputStream for the person's default photo and returns the
+         * photo as a Bitmap stream.
+         *
+         * @param contactUri the contact whose photo should be used
+         */
+        public static InputStream openContactPhotoInputStream(ContentResolver cr, Uri contactUri) {
+            Uri photoUri = getPhotoUri(cr, contactUri);
+            Cursor cursor = cr.query(photoUri,
+                    new String[]{ContactsContract.CommonDataKinds.Photo.PHOTO}, null, null, null);
+            try {
+                if (!cursor.moveToNext()) {
+                    return null;
+                }
+                byte[] data = cursor.getBlob(0);
+                if (data == null) {
+                    return null;
+                }
+                return new ByteArrayInputStream(data);
+            } finally {
+                cursor.close();
+            }
+        }
     }
 
     private interface RawContactsColumns {
@@ -1557,14 +1612,6 @@
         public static final String SHOULD_SYNC = "should_sync";
 
         /**
-         * Overriding flag indicating if contacts from this source should be
-         * visible in any user interface.
-         * <p>
-         * Type: INTEGER (boolean)
-         */
-        public static final String SOURCE_VISIBLE = "source_visible";
-
-        /**
          * Flag indicating if contacts without any {@link GroupMembership}
          * entries should be visible in any user interface.
          * <p>
diff --git a/core/java/android/widget/MediaController.java b/core/java/android/widget/MediaController.java
index 0c9d980..9910c37 100644
--- a/core/java/android/widget/MediaController.java
+++ b/core/java/android/widget/MediaController.java
@@ -250,6 +250,29 @@
     }
 
     /**
+     * Disable pause or seek buttons if the stream cannot be paused or seeked.
+     * This requires the control interface to be a MediaPlayerControlExt
+     */
+    private void disableUnsupportedButtons() {
+        try {
+            if (mPauseButton != null && !mPlayer.canPause()) {
+                mPauseButton.setEnabled(false);
+            }
+            if (mRewButton != null && !mPlayer.canSeekBackward()) {
+                mRewButton.setEnabled(false);
+            }
+            if (mFfwdButton != null && !mPlayer.canSeekForward()) {
+                mFfwdButton.setEnabled(false);
+            }
+        } catch (IncompatibleClassChangeError ex) {
+            // We were given an old version of the interface, that doesn't have
+            // the canPause/canSeekXYZ methods. This is OK, it just means we
+            // assume the media can be paused and seeked, and so we don't disable
+            // the buttons.
+        }
+    }
+    
+    /**
      * Show the controller on screen. It will go away
      * automatically after 'timeout' milliseconds of inactivity.
      * @param timeout The timeout in milliseconds. Use 0 to show
@@ -259,6 +282,7 @@
 
         if (!mShowing && mAnchor != null) {
             setProgress();
+            disableUnsupportedButtons();
 
             int [] anchorpos = new int[2];
             mAnchor.getLocationOnScreen(anchorpos);
@@ -421,17 +445,13 @@
     };
 
     private void updatePausePlay() {
-        if (mRoot == null)
-            return;
-
-        ImageButton button = (ImageButton) mRoot.findViewById(com.android.internal.R.id.pause);
-        if (button == null)
+        if (mRoot == null || mPauseButton == null)
             return;
 
         if (mPlayer.isPlaying()) {
-            button.setImageResource(com.android.internal.R.drawable.ic_media_pause);
+            mPauseButton.setImageResource(com.android.internal.R.drawable.ic_media_pause);
         } else {
-            button.setImageResource(com.android.internal.R.drawable.ic_media_play);
+            mPauseButton.setImageResource(com.android.internal.R.drawable.ic_media_play);
         }
     }
 
@@ -516,7 +536,7 @@
         if (mProgress != null) {
             mProgress.setEnabled(enabled);
         }
-
+        disableUnsupportedButtons();
         super.setEnabled(enabled);
     }
 
@@ -579,5 +599,8 @@
         void    seekTo(int pos);
         boolean isPlaying();
         int     getBufferPercentage();
-    };
+        boolean canPause();
+        boolean canSeekBackward();
+        boolean canSeekForward();
+    }
 }
diff --git a/core/java/android/widget/VideoView.java b/core/java/android/widget/VideoView.java
index 5bc2507..e60ff25 100644
--- a/core/java/android/widget/VideoView.java
+++ b/core/java/android/widget/VideoView.java
@@ -23,6 +23,7 @@
 import android.content.res.Resources;
 import android.media.AudioManager;
 import android.media.MediaPlayer;
+import android.media.Metadata;
 import android.media.MediaPlayer.OnCompletionListener;
 import android.media.MediaPlayer.OnErrorListener;
 import android.net.Uri;
@@ -34,7 +35,7 @@
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
 import android.view.View;
-import android.widget.MediaController.MediaPlayerControl;
+import android.widget.MediaController.*;
 
 import java.io.IOException;
 
@@ -81,6 +82,9 @@
     private int         mCurrentBufferPercentage;
     private OnErrorListener mOnErrorListener;
     private int         mSeekWhenPrepared;  // recording the seek position while preparing
+    private boolean     mCanPause;
+    private boolean     mCanSeekBack;
+    private boolean     mCanSeekForward;
 
     public VideoView(Context context) {
         super(context);
@@ -259,6 +263,17 @@
     MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() {
         public void onPrepared(MediaPlayer mp) {
             mCurrentState = STATE_PREPARED;
+
+            // Get the capabilities of the player for this stream
+            Metadata data = mp.getMetadata(MediaPlayer.METADATA_ALL,
+                                      MediaPlayer.BYPASS_METADATA_FILTER);
+            mCanPause = !data.has(Metadata.PAUSE_AVAILABLE)
+                    || data.getBoolean(Metadata.PAUSE_AVAILABLE);
+            mCanSeekBack = !data.has(Metadata.SEEK_BACKWARD_AVAILABLE)
+                    || data.getBoolean(Metadata.SEEK_BACKWARD_AVAILABLE);
+            mCanSeekForward = !data.has(Metadata.SEEK_FORWARD_AVAILABLE)
+                    || data.getBoolean(Metadata.SEEK_FORWARD_AVAILABLE);
+
             if (mOnPreparedListener != null) {
                 mOnPreparedListener.onPrepared(mMediaPlayer);
             }
@@ -267,6 +282,7 @@
             }
             mVideoWidth = mp.getVideoWidth();
             mVideoHeight = mp.getVideoHeight();
+
             int seekToPosition = mSeekWhenPrepared;  // mSeekWhenPrepared may be changed after seekTo() call
             if (seekToPosition != 0) {
                 seekTo(seekToPosition);
@@ -580,4 +596,16 @@
                 mCurrentState != STATE_IDLE &&
                 mCurrentState != STATE_PREPARING);
     }
+
+    public boolean canPause() {
+        return mCanPause;
+    }
+
+    public boolean canSeekBackward() {
+        return mCanSeekBack;
+    }
+
+    public boolean canSeekForward() {
+        return mCanSeekForward;
+    }
 }
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 22f9136..c14ecc0 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1350,7 +1350,7 @@
 
     <!-- When the battery is low, this is the label of the button to go to the
          power usage activity to find out what drained the battery. -->
-    <string name="battery_low_why">Why?</string>
+    <string name="battery_low_why">Battery use</string>
 
     <!-- Title of the alert when something went wrong in the factory test. -->
     <string name="factorytest_failed">Factory test failed</string>
diff --git a/libs/rs/java/Fall/res/raw/fall.c b/libs/rs/java/Fall/res/raw/fall.c
index a67764e..4f8377f 100644
--- a/libs/rs/java/Fall/res/raw/fall.c
+++ b/libs/rs/java/Fall/res/raw/fall.c
@@ -240,7 +240,7 @@
             n2y = v3y - v1y;
             n2z = v3z - v1z;
 
-            // Avegare of previous normal and N1 x N2
+            // Average of previous normal and N1 x N2
             n3x = n3x / 2.0f + (n1y * n2z - n1z * n2y) / 2.0f;
             n3y = n3y / 2.0f + (n1z * n2x - n1x * n2z) / 2.0f;
             n3z = n3z / 2.0f + (n1x * n2y - n1y * n2x) / 2.0f;
@@ -264,10 +264,10 @@
 float averageZ(float x1, float x2, float y1, float y2, float* vertices,
         int meshWidth, int meshHeight, float glWidth, float glHeight) {
 
-    x1 = ((x1 + glWidth / 2.0f) / glWidth) * meshWidth;
-    x2 = ((x2 + glWidth / 2.0f) / glWidth) * meshWidth;
-    y1 = ((y1 + glHeight / 2.0f) / glHeight) * meshHeight;
-    y2 = ((y2 + glHeight / 2.0f) / glHeight) * meshHeight;
+    x1 = ((x1 + glWidth * 0.5f) / glWidth) * meshWidth;
+    x2 = ((x2 + glWidth * 0.5f) / glWidth) * meshWidth;
+    y1 = ((y1 + glHeight * 0.5f) / glHeight) * meshHeight;
+    y2 = ((y2 + glHeight * 0.5f) / glHeight) * meshHeight;
 
     int quadX1 = clamp(x1, 0, meshWidth);
     int quadX2 = clamp(x2, 0, meshWidth);
@@ -319,10 +319,10 @@
     if (a > 0.0f) {
         tz = -a;
     } else {
-        z1 = averageZ(x1, x, y1, y, vertices, meshWidth, meshHeight, glWidth, glHeight);
-        z2 = averageZ(x, x2, y1, y, vertices, meshWidth, meshHeight, glWidth, glHeight);
-        z3 = averageZ(x, x2, y, y2, vertices, meshWidth, meshHeight, glWidth, glHeight);
-        z4 = averageZ(x1, x, y, y2, vertices, meshWidth, meshHeight, glWidth, glHeight);
+//        z1 = averageZ(x1, x, y1, y, vertices, meshWidth, meshHeight, glWidth, glHeight);
+//        z2 = averageZ(x, x2, y1, y, vertices, meshWidth, meshHeight, glWidth, glHeight);
+//        z3 = averageZ(x, x2, y, y2, vertices, meshWidth, meshHeight, glWidth, glHeight);
+//        z4 = averageZ(x1, x, y, y2, vertices, meshWidth, meshHeight, glWidth, glHeight);
     }
 
     x1 -= x;
@@ -454,6 +454,34 @@
     drawTriangleMesh(NAMED_WaterMesh);
 }
 
+void drawNormals() {
+    int width = State_meshWidth;
+    int height = State_meshHeight;
+
+    float *vertices = loadTriangleMeshVerticesF(NAMED_WaterMesh);
+
+    bindProgramVertex(NAMED_PVSky);
+    bindProgramFragment(NAMED_PFLighting);
+
+    color(1.0f, 0.0f, 0.0f, 1.0f);
+
+    int y = 0;
+    for ( ; y < height; y++) {
+        int yOffset = y * width;
+        int x = 0;
+        for ( ; x < width; x++) {
+            int offset = (yOffset + x) * 8;
+            float vx = vertices[offset + 5];
+            float vy = vertices[offset + 6];
+            float vz = vertices[offset + 7];
+            float nx = vertices[offset + 0];
+            float ny = vertices[offset + 1];
+            float nz = vertices[offset + 2];
+            drawLine(vx, vy, vz, vx + nx / 10.0f, vy + ny / 10.0f, vz + nz / 10.0f);
+        }
+    }
+}
+
 int main(int index) {
     int dropX = Drop_dropX;
     if (dropX != -1) {
@@ -471,6 +499,7 @@
     drawSky();
     drawLighting();
     drawLeaves();
+    //drawNormals();
 
     return 1;
 }
diff --git a/libs/rs/java/Fall/src/com/android/fall/rs/FallRS.java b/libs/rs/java/Fall/src/com/android/fall/rs/FallRS.java
index 02d4737..3b13bed 100644
--- a/libs/rs/java/Fall/src/com/android/fall/rs/FallRS.java
+++ b/libs/rs/java/Fall/src/com/android/fall/rs/FallRS.java
@@ -177,22 +177,37 @@
         hResolution += 2;        
         
         for (int y = 0; y <= hResolution; y++) {
+            final boolean shift = (y & 0x1) == 0;
             final float yOffset = y * quadHeight - glHeight / 2.0f - quadHeight;
             final float t = 1.0f - y / (float) hResolution;
             for (int x = 0; x <= wResolution; x++) {
-                rs.triangleMeshAddVertex_XYZ_ST_NORM(
-                        -1.0f + x * quadWidth - quadWidth, yOffset, 0.0f,
-                        x / (float) wResolution, t,
-                        0.0f, 0.0f, -1.0f);
+                if (shift) {
+                    rs.triangleMeshAddVertex_XYZ_ST_NORM(
+                            -1.0f + x * quadWidth - quadWidth, yOffset, 0.0f,
+                            x / (float) wResolution, t,
+                            0.0f, 0.0f, -1.0f);
+                } else {
+                    rs.triangleMeshAddVertex_XYZ_ST_NORM(
+                            -1.0f + x * quadWidth - quadWidth * 0.5f, yOffset, 0.0f,
+                            x / (float) wResolution, t,
+                            0.0f, 0.0f, -1.0f);
+                }
             }
         }
 
         for (int y = 0; y < hResolution; y++) {
+            final boolean shift = (y & 0x1) == 0;
+            final int yOffset = y * (wResolution + 1);
             for (int x = 0; x < wResolution; x++) {
-                final int index = y * (wResolution + 1) + x;
+                final int index = yOffset + x;
                 final int iWR1 = index + wResolution + 1;
-                rs.triangleMeshAddTriangle(index, index + 1, iWR1);
-                rs.triangleMeshAddTriangle(index + 1, iWR1, iWR1 + 1);
+                if (shift) {
+                    rs.triangleMeshAddTriangle(index, index + 1, iWR1);
+                    rs.triangleMeshAddTriangle(index + 1, iWR1 + 1, iWR1);
+                } else {
+                    rs.triangleMeshAddTriangle(index, iWR1 + 1, iWR1);
+                    rs.triangleMeshAddTriangle(index, index + 1, iWR1 + 1);
+                }
             }
         }
 
diff --git a/libs/rs/java/Galaxy/res/raw/galaxy.c b/libs/rs/java/Galaxy/res/raw/galaxy.c
index 59c31a1..9ff449f 100644
--- a/libs/rs/java/Galaxy/res/raw/galaxy.c
+++ b/libs/rs/java/Galaxy/res/raw/galaxy.c
@@ -19,11 +19,13 @@
 
 #define RSID_PARTICLES 1
 
-#define PARTICLE_STRUCT_FIELDS_COUNT 4
+#define PARTICLE_STRUCT_FIELDS_COUNT 6
 #define PARTICLE_STRUCT_ANGLE 0
 #define PARTICLE_STRUCT_DISTANCE 1
 #define PARTICLE_STRUCT_SPEED 2
 #define PARTICLE_STRUCT_RADIUS 3
+#define PARTICLE_STRUCT_S 4
+#define PARTICLE_STRUCT_T 5
 
 #define RSID_PARTICLES_BUFFER 2
 #define PARTICLE_BUFFER_COMPONENTS_COUNT 5
@@ -31,19 +33,14 @@
 #define PARTICLES_TEXTURES_COUNT 2
 
 #define ELLIPSE_RATIO 0.892f
-#define ELLIPSE_TWIST 0.02333333333f
 
 void drawSpace(int width, int height) {
     bindTexture(NAMED_PFBackground, 0, NAMED_TSpace);
     drawQuadTexCoords(
-            0.0f, 0.0f, 0.0f,
-            0.0f, 1.0f,
-            width, 0.0f, 0.0f,
-            2.0f, 1.0f,
-            width, height, 0.0f,
-            2.0f, 0.0f,
-            0.0f, height, 0.0f,
-            0.0f, 0.0f);
+            0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
+            width, 0.0f, 0.0f, 2.0f, 1.0f,
+            width, height, 0.0f, 2.0f, 0.0f,
+            0.0f, height, 0.0f, 0.0f, 0.0f);
 }
 
 void drawLights(int width, int height) {
@@ -61,39 +58,34 @@
              x + 512.0f * 1.1f, y + 512.0f, 0.0f);
 }
 
-void drawParticle(float *particle, int index, float *particleBuffer, int bufferIndex,
-        float w, float h) {
-
-    float distance = particle[index + PARTICLE_STRUCT_DISTANCE];
-    float angle = particle[index + PARTICLE_STRUCT_ANGLE];
-    float speed = particle[index + PARTICLE_STRUCT_SPEED];
-    float r = particle[index + PARTICLE_STRUCT_RADIUS];
+void drawParticle(float *particle, float *particleBuffer, float w, float h) {
+    float distance = particle[PARTICLE_STRUCT_DISTANCE];
+    float angle = particle[PARTICLE_STRUCT_ANGLE];
+    float speed = particle[PARTICLE_STRUCT_SPEED];
+    float r = particle[PARTICLE_STRUCT_RADIUS];
 
     float a = angle + speed;
     float x = distance * sinf_fast(a);
     float y = distance * cosf_fast(a) * ELLIPSE_RATIO;
-    float z = distance * ELLIPSE_TWIST;
-    float s = cosf_fast(z);
-    float t = sinf_fast(z);
+    float s = particle[PARTICLE_STRUCT_S];
+    float t = particle[PARTICLE_STRUCT_T];
 
     float sX = t * x + s * y + w;
     float sY = s * x - t * y + h;
 
     // lower left vertex of the particle's triangle
-    particleBuffer[bufferIndex + 1] = sX - r;     // X
-    particleBuffer[bufferIndex + 2] = sY + r;     // Y
+    particleBuffer[1] = sX - r;     // X
+    particleBuffer[2] = sY + r;     // Y
 
     // lower right vertex of the particle's triangle
-    bufferIndex += PARTICLE_BUFFER_COMPONENTS_COUNT;
-    particleBuffer[bufferIndex + 1] = sX + r;     // X
-    particleBuffer[bufferIndex + 2] = sY + r;     // Y
+    particleBuffer[6] = sX + r;     // X
+    particleBuffer[7] = sY + r;     // Y
 
     // upper middle vertex of the particle's triangle
-    bufferIndex += PARTICLE_BUFFER_COMPONENTS_COUNT;
-    particleBuffer[bufferIndex + 1] = sX;         // X
-    particleBuffer[bufferIndex + 2] = sY - r;     // Y
+    particleBuffer[11] = sX;         // X
+    particleBuffer[12] = sY - r;     // Y
 
-    particle[index + PARTICLE_STRUCT_ANGLE] = a;
+    particle[PARTICLE_STRUCT_ANGLE] = a;
 }
 
 void drawParticles(int width, int height) {
@@ -103,7 +95,6 @@
 
     int radius = State_galaxyRadius;
     int particlesCount = State_particlesCount;
-    int count = particlesCount * PARTICLE_STRUCT_FIELDS_COUNT;
 
     float *particle = loadArrayF(RSID_PARTICLES, 0);
     float *particleBuffer = loadArrayF(RSID_PARTICLES_BUFFER, 0);
@@ -112,11 +103,11 @@
     float h = height * 0.5f;
 
     int i = 0;
-    int bufferIndex = 0;
-    for ( ; i < count; i += PARTICLE_STRUCT_FIELDS_COUNT) {
-        drawParticle(particle, i, particleBuffer, bufferIndex, w, h);
-        // each particle is a triangle (3 vertices) of 6 properties (ABGR, X, Y, Z, S, T)
-        bufferIndex += 3 * PARTICLE_BUFFER_COMPONENTS_COUNT;
+    for ( ; i < particlesCount; i++) {
+        drawParticle(particle, particleBuffer, w, h);
+        particle += PARTICLE_STRUCT_FIELDS_COUNT;
+        // each particle is a triangle (3 vertices) of 5 properties (ABGR, X, Y, S, T)
+        particleBuffer += 3 * PARTICLE_BUFFER_COMPONENTS_COUNT;
     }
 
     uploadToBufferObject(NAMED_ParticlesBuffer);
diff --git a/libs/rs/java/Galaxy/src/com/android/galaxy/rs/GalaxyRS.java b/libs/rs/java/Galaxy/src/com/android/galaxy/rs/GalaxyRS.java
index 717100d..c6f5816 100644
--- a/libs/rs/java/Galaxy/src/com/android/galaxy/rs/GalaxyRS.java
+++ b/libs/rs/java/Galaxy/src/com/android/galaxy/rs/GalaxyRS.java
@@ -42,9 +42,11 @@
 
 import java.util.TimeZone;
 
+@SuppressWarnings({"FieldCanBeLocal"})
 class GalaxyRS {
     private static final int GALAXY_RADIUS = 300;
     private static final int PARTICLES_COUNT = 12000;
+    private static final float ELLIPSE_TWIST = 0.023333333f;
 
     private static final int RSID_STATE = 0;
 
@@ -54,11 +56,13 @@
     private static final int RSID_TEXTURE_FLARES = 2;
 
     private static final int RSID_PARTICLES = 1;
-    private static final int PARTICLE_STRUCT_FIELDS_COUNT = 4;
+    private static final int PARTICLE_STRUCT_FIELDS_COUNT = 6;
     private static final int PARTICLE_STRUCT_ANGLE = 0;
     private static final int PARTICLE_STRUCT_DISTANCE = 1;
     private static final int PARTICLE_STRUCT_SPEED = 2;
     private static final int PARTICLE_STRUCT_RADIUS = 3;
+    private static final int PARTICLE_STRUCT_S = 4;
+    private static final int PARTICLE_STRUCT_T = 5;
 
     private static final int RSID_PARTICLES_BUFFER = 2;
 
@@ -103,35 +107,6 @@
         initRS();
     }
 
-    public void destroy() {
-        mScript.destroy();
-        mSampler.destroy();
-        mLightSampler.destroy();
-        mPfBackground.destroy();
-        mPfsBackground.destroy();
-        mPvBackground.destroy();
-        mPvOrthoAlloc.mAlloc.destroy();
-        for (Allocation a : mTextures) {
-            a.destroy();
-        }
-        mState.destroy();
-        mPfLighting.destroy();
-        mParticles.destroy();
-        mPfsLights.destroy();
-        mParticlesMesh.destroy();
-        mParticlesBuffer.destroy();
-        mStateType.destroy();
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        try {
-            destroy();
-        } finally {
-            super.finalize();
-        }
-    }
-
     private void initRS() {
         createProgramVertex();
         createProgramFragmentStore();
@@ -218,13 +193,16 @@
         float d = abs(randomGauss()) * GALAXY_RADIUS / 2.0f + random(-4.0f, 4.0f);
         float z = randomGauss() * 0.5f * 0.8f * ((GALAXY_RADIUS - d) / (float) GALAXY_RADIUS);
         z += 1.0f;
+        float p = d * ELLIPSE_TWIST;
 
         particles[index + PARTICLE_STRUCT_ANGLE] = random(0.0f, (float) (Math.PI * 2.0));
         particles[index + PARTICLE_STRUCT_DISTANCE] = d;
         particles[index + PARTICLE_STRUCT_SPEED] = random(0.0015f, 0.0025f) *
                 (0.5f + (0.5f * (float) GALAXY_RADIUS / d)) * 0.7f;
         particles[index + PARTICLE_STRUCT_RADIUS] = z * random(1.2f, 2.1f);
-
+        particles[index + PARTICLE_STRUCT_S] = (float) Math.cos(p);
+        particles[index + PARTICLE_STRUCT_T] = (float) Math.sin(p);
+        
         int red, green, blue;
         if (d < GALAXY_RADIUS / 3.0f) {
             red = (int) (220 + (d / (float) GALAXY_RADIUS) * 35);
diff --git a/libs/rs/java/Galaxy/src/com/android/galaxy/rs/GalaxyView.java b/libs/rs/java/Galaxy/src/com/android/galaxy/rs/GalaxyView.java
index 341293b..4f6d3f0 100644
--- a/libs/rs/java/Galaxy/src/com/android/galaxy/rs/GalaxyView.java
+++ b/libs/rs/java/Galaxy/src/com/android/galaxy/rs/GalaxyView.java
@@ -22,8 +22,6 @@
 import android.renderscript.RSSurfaceView;
 
 class GalaxyView extends RSSurfaceView {
-    private GalaxyRS mRender;
-
     public GalaxyView(Context context) {
         super(context);
         setFocusable(true);
@@ -34,12 +32,7 @@
         super.surfaceChanged(holder, format, w, h);
 
         RenderScript RS = createRenderScript();
-        mRender = new GalaxyRS(w, h);
-        mRender.init(RS, getResources());
-    }
-
-    @Override
-    public void surfaceDestroyed(SurfaceHolder holder) {
-        if (mRender != null) mRender.destroy();
+        GalaxyRS render = new GalaxyRS(w, h);
+        render.init(RS, getResources());
     }
 }
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 05b68d4..0a1b142 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -1391,21 +1391,26 @@
             } else if (action.equals(BluetoothIntent.HEADSET_STATE_CHANGED_ACTION)) {
                 int state = intent.getIntExtra(BluetoothIntent.HEADSET_STATE,
                                                BluetoothHeadset.STATE_ERROR);
-                BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothIntent.DEVICE);
-                String address = btDevice.getAddress();
                 int device = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO;
-                int btClass = btDevice.getBluetoothClass();
-                if (BluetoothClass.Device.Major.getDeviceMajor(btClass) == BluetoothClass.Device.Major.AUDIO_VIDEO) {
-                    switch (BluetoothClass.Device.getDevice(btClass)) {
-                    case BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET:
-                    case BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE:
-                        device = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET;
-                        break;
-                    case BluetoothClass.Device.AUDIO_VIDEO_CAR_AUDIO:
-                        device = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
-                        break;
-                    default:
-                        break;
+                BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothIntent.DEVICE);
+                String address = null;
+                int btClass = BluetoothClass.ERROR;
+                if (btDevice != null) {
+                    address = btDevice.getAddress();
+                    btClass = btDevice.getBluetoothClass();
+                    if (BluetoothClass.Device.Major.getDeviceMajor(btClass) ==
+                                BluetoothClass.Device.Major.AUDIO_VIDEO) {
+                        switch (BluetoothClass.Device.getDevice(btClass)) {
+                        case BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET:
+                        case BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE:
+                            device = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET;
+                            break;
+                        case BluetoothClass.Device.AUDIO_VIDEO_CAR_AUDIO:
+                            device = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
+                            break;
+                        default:
+                            break;
+                        }
                     }
                 }
 
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 70ab0b5..1774eaf 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -30,6 +30,7 @@
 #include <media/stagefright/MetaData.h>
 #include <media/stagefright/MmapSource.h>
 #include <media/stagefright/OMXCodec.h>
+#include <media/stagefright/Utils.h>
 #include <utils/Vector.h>
 
 #include <OMX_Audio.h>
@@ -116,6 +117,39 @@
     return NULL;
 }
 
+enum {
+    kAVCProfileBaseline      = 0x42,
+    kAVCProfileMain          = 0x4d,
+    kAVCProfileExtended      = 0x58,
+    kAVCProfileHigh          = 0x64,
+    kAVCProfileHigh10        = 0x6e,
+    kAVCProfileHigh422       = 0x7a,
+    kAVCProfileHigh444       = 0xf4,
+    kAVCProfileCAVLC444Intra = 0x2c
+};
+
+static const char *AVCProfileToString(uint8_t profile) {
+    switch (profile) {
+        case kAVCProfileBaseline:
+            return "Baseline";
+        case kAVCProfileMain:
+            return "Main";
+        case kAVCProfileExtended:
+            return "Extended";
+        case kAVCProfileHigh:
+            return "High";
+        case kAVCProfileHigh10:
+            return "High 10";
+        case kAVCProfileHigh422:
+            return "High 422";
+        case kAVCProfileHigh444:
+            return "High 444";
+        case kAVCProfileCAVLC444Intra:
+            return "CAVLC 444 Intra";
+        default:   return "Unknown";
+    }
+}
+
 // static
 sp<OMXCodec> OMXCodec::Create(
         const sp<IOMX> &omx,
@@ -189,29 +223,72 @@
     } else if (meta->findData(kKeyAVCC, &type, &data, &size)) {
         printf("found avcc of size %d\n", size);
 
-        const uint8_t *ptr = (const uint8_t *)data + 6;
+        // Parse the AVCDecoderConfigurationRecord
+
+        const uint8_t *ptr = (const uint8_t *)data;
+
+        CHECK(size >= 7);
+        CHECK_EQ(ptr[0], 1);  // configurationVersion == 1
+        uint8_t profile = ptr[1];
+        uint8_t level = ptr[3];
+
+        CHECK((ptr[4] >> 2) == 0x3f);  // reserved
+
+        size_t lengthSize = 1 + (ptr[4] & 3);
+
+        // commented out check below as H264_QVGA_500_NO_AUDIO.3gp
+        // violates it...
+        // CHECK((ptr[5] >> 5) == 7);  // reserved
+
+        size_t numSeqParameterSets = ptr[5] & 31;
+
+        ptr += 6;
         size -= 6;
-        while (size >= 2) {
-            size_t length = ptr[0] << 8 | ptr[1];
+
+        for (size_t i = 0; i < numSeqParameterSets; ++i) {
+            CHECK(size >= 2);
+            size_t length = U16_AT(ptr);
 
             ptr += 2;
             size -= 2;
 
-            // printf("length = %d, size = %d\n", length, size);
-
             CHECK(size >= length);
 
             codec->addCodecSpecificData(ptr, length);
 
             ptr += length;
             size -= length;
+        }
 
-            if (size <= 1) {
-                break;
-            }
+        CHECK(size >= 1);
+        size_t numPictureParameterSets = *ptr;
+        ++ptr;
+        --size;
 
-            ptr++;  // XXX skip trailing 0x01 byte???
-            --size;
+        for (size_t i = 0; i < numPictureParameterSets; ++i) {
+            CHECK(size >= 2);
+            size_t length = U16_AT(ptr);
+
+            ptr += 2;
+            size -= 2;
+
+            CHECK(size >= length);
+
+            codec->addCodecSpecificData(ptr, length);
+
+            ptr += length;
+            size -= length;
+        }
+
+        LOGI("AVC profile = %d (%s), level = %d",
+             (int)profile, AVCProfileToString(profile), (int)level / 10);
+
+        if (!strcmp(componentName, "OMX.TI.Video.Decoder")
+            && (profile != kAVCProfileBaseline || level > 39)) {
+            // This stream exceeds the decoder's capabilities.
+
+            LOGE("Profile and/or level exceed the decoder's capabilities.");
+            return NULL;
         }
     }
 
@@ -529,7 +606,7 @@
 
 OMXCodec::OMXCodec(
         const sp<IOMX> &omx, IOMX::node_id node, uint32_t quirks,
-        bool isEncoder, 
+        bool isEncoder,
         const char *mime,
         const char *componentName,
         const sp<MediaSource> &source)
@@ -569,7 +646,7 @@
 
     free(mComponentName);
     mComponentName = NULL;
-    
+
     free(mMIME);
     mMIME = NULL;
 }
@@ -772,7 +849,7 @@
                 mBufferFilled.signal();
             } else if (mPortStatus[kPortIndexOutput] != SHUTTING_DOWN) {
                 CHECK_EQ(mPortStatus[kPortIndexOutput], ENABLED);
-                
+
                 MediaBuffer *buffer = info->mMediaBuffer;
 
                 buffer->set_range(
@@ -1383,7 +1460,7 @@
     CHECK_EQ(def.eDomain, OMX_PortDomainImage);
 
     OMX_IMAGE_PORTDEFINITIONTYPE *imageDef = &def.format.image;
-    
+
     CHECK_EQ(imageDef->eCompressionFormat, OMX_IMAGE_CodingUnused);
     imageDef->eColorFormat = format;
     imageDef->nFrameWidth = width;
@@ -1460,7 +1537,7 @@
     if (mState != LOADED) {
         return UNKNOWN_ERROR;
     }
-    
+
     sp<MetaData> params = new MetaData;
     if (mQuirks & kWantsNALFragments) {
         params->setInt32(kKeyWantsNALFragments, true);
@@ -1630,7 +1707,7 @@
         "OMX_COLOR_Format16bitBGR565",
         "OMX_COLOR_Format18bitRGB666",
         "OMX_COLOR_Format18bitARGB1665",
-        "OMX_COLOR_Format19bitARGB1666", 
+        "OMX_COLOR_Format19bitARGB1666",
         "OMX_COLOR_Format24bitRGB888",
         "OMX_COLOR_Format24bitBGR888",
         "OMX_COLOR_Format24bitARGB1887",
@@ -1653,11 +1730,11 @@
         "OMX_COLOR_FormatRawBayer8bit",
         "OMX_COLOR_FormatRawBayer10bit",
         "OMX_COLOR_FormatRawBayer8bitcompressed",
-        "OMX_COLOR_FormatL2", 
-        "OMX_COLOR_FormatL4", 
-        "OMX_COLOR_FormatL8", 
-        "OMX_COLOR_FormatL16", 
-        "OMX_COLOR_FormatL24", 
+        "OMX_COLOR_FormatL2",
+        "OMX_COLOR_FormatL4",
+        "OMX_COLOR_FormatL8",
+        "OMX_COLOR_FormatL16",
+        "OMX_COLOR_FormatL24",
         "OMX_COLOR_FormatL32",
         "OMX_COLOR_FormatYUV420PackedSemiPlanar",
         "OMX_COLOR_FormatYUV422PackedSemiPlanar",
diff --git a/telephony/java/com/android/internal/telephony/CallerInfo.java b/telephony/java/com/android/internal/telephony/CallerInfo.java
index afc8b62..bda2d22 100644
--- a/telephony/java/com/android/internal/telephony/CallerInfo.java
+++ b/telephony/java/com/android/internal/telephony/CallerInfo.java
@@ -20,9 +20,8 @@
 import android.database.Cursor;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
-import android.provider.Contacts;
-import android.provider.Contacts.People;
-import android.provider.Contacts.Phones;
+import android.provider.ContactsContract.PhoneLookup;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.text.TextUtils;
 import android.telephony.TelephonyManager;
 import android.telephony.PhoneNumberUtils;
@@ -134,44 +133,39 @@
                 int columnIndex;
 
                 // Look for the name
-                columnIndex = cursor.getColumnIndex(People.NAME);
+                columnIndex = cursor.getColumnIndex(PhoneLookup.DISPLAY_NAME);
                 if (columnIndex != -1) {
                     info.name = cursor.getString(columnIndex);
                 }
 
                 // Look for the number
-                columnIndex = cursor.getColumnIndex(Phones.NUMBER);
+                columnIndex = cursor.getColumnIndex(PhoneLookup.NUMBER);
                 if (columnIndex != -1) {
                     info.phoneNumber = cursor.getString(columnIndex);
                 }
 
                 // Look for the label/type combo
-                columnIndex = cursor.getColumnIndex(Phones.LABEL);
+                columnIndex = cursor.getColumnIndex(PhoneLookup.LABEL);
                 if (columnIndex != -1) {
-                    int typeColumnIndex = cursor.getColumnIndex(Phones.TYPE);
+                    int typeColumnIndex = cursor.getColumnIndex(PhoneLookup.TYPE);
                     if (typeColumnIndex != -1) {
                         info.numberType = cursor.getInt(typeColumnIndex);
                         info.numberLabel = cursor.getString(columnIndex);
-                        info.phoneLabel = Contacts.Phones.getDisplayLabel(context,
+                        info.phoneLabel = Phone.getDisplayLabel(context,
                                 info.numberType, info.numberLabel)
                                 .toString();
                     }
                 }
 
                 // Look for the person ID
-                columnIndex = cursor.getColumnIndex(Phones.PERSON_ID);
+                columnIndex = cursor.getColumnIndex(PhoneLookup._ID);
                 if (columnIndex != -1) {
                     info.person_id = cursor.getLong(columnIndex);
-                } else {
-                    columnIndex = cursor.getColumnIndex(People._ID);
-                    if (columnIndex != -1) {
-                        info.person_id = cursor.getLong(columnIndex);
-                    }
                 }
 
                 // look for the custom ringtone, create from the string stored
                 // in the database.
-                columnIndex = cursor.getColumnIndex(People.CUSTOM_RINGTONE);
+                columnIndex = cursor.getColumnIndex(PhoneLookup.CUSTOM_RINGTONE);
                 if ((columnIndex != -1) && (cursor.getString(columnIndex) != null)) {
                     info.contactRingtoneUri = Uri.parse(cursor.getString(columnIndex));
                 } else {
@@ -180,7 +174,7 @@
 
                 // look for the send to voicemail flag, set it to true only
                 // under certain circumstances.
-                columnIndex = cursor.getColumnIndex(People.SEND_TO_VOICEMAIL);
+                columnIndex = cursor.getColumnIndex(PhoneLookup.SEND_TO_VOICEMAIL);
                 info.shouldSendToVoicemail = (columnIndex != -1) &&
                         ((cursor.getInt(columnIndex)) == 1);
                 info.contactExists = true;
@@ -256,8 +250,7 @@
             }
         }
 
-        Uri contactUri = Uri.withAppendedPath(Contacts.Phones.CONTENT_FILTER_URL,
-                                              Uri.encode(number));
+        Uri contactUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, number);
 
         CallerInfo info = getCallerInfo(context, contactUri);
 
diff --git a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
index f81f42a..ef456f0 100644
--- a/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
+++ b/telephony/java/com/android/internal/telephony/CallerInfoAsyncQuery.java
@@ -24,7 +24,7 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.provider.Contacts;
+import android.provider.ContactsContract.PhoneLookup;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
@@ -303,7 +303,7 @@
     public static CallerInfoAsyncQuery startQuery(int token, Context context, String number,
             OnQueryCompleteListener listener, Object cookie) {
         //contruct the URI object and start Query.
-        Uri contactRef = Uri.withAppendedPath(Contacts.Phones.CONTENT_FILTER_URL, number);
+        Uri contactRef = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, number);
 
         CallerInfoAsyncQuery c = new CallerInfoAsyncQuery();
         c.allocate(context, contactRef);
diff --git a/telephony/java/com/android/internal/telephony/IccCard.java b/telephony/java/com/android/internal/telephony/IccCard.java
index c2bed88..6657060 100644
--- a/telephony/java/com/android/internal/telephony/IccCard.java
+++ b/telephony/java/com/android/internal/telephony/IccCard.java
@@ -595,7 +595,7 @@
 
         // this is common for all radio technologies
         if (!mIccCardStatus.getCardState().isCardPresent()) {
-            return IccCard.State.NOT_READY;
+            return IccCard.State.ABSENT;
         }
 
         RadioState currentRadioState = mPhone.mCM.getRadioState();