Merge change 25270 into eclair

* changes:
  Use Resources to load search icons with android.resource URIs
diff --git a/core/java/android/app/SuggestionsAdapter.java b/core/java/android/app/SuggestionsAdapter.java
index 8f7e8ca..4f9531e 100644
--- a/core/java/android/app/SuggestionsAdapter.java
+++ b/core/java/android/app/SuggestionsAdapter.java
@@ -20,14 +20,15 @@
 import android.content.ComponentName;
 import android.content.ContentResolver;
 import android.content.Context;
+import android.content.ContentResolver.OpenResourceIdResult;
 import android.content.pm.ActivityInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Resources;
 import android.database.Cursor;
+import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
-import android.graphics.drawable.DrawableContainer;
 import android.graphics.drawable.StateListDrawable;
 import android.net.Uri;
 import android.os.Bundle;
@@ -38,14 +39,15 @@
 import android.util.SparseArray;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.Filter;
 import android.widget.ImageView;
 import android.widget.ResourceCursorAdapter;
 import android.widget.TextView;
-import android.widget.Filter;
 
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.List;
 import java.util.WeakHashMap;
 
 /**
@@ -580,14 +582,26 @@
             // Not cached, try using it as a plain resource ID in the provider's context.
             int resourceId = Integer.parseInt(drawableId);
             drawable = mProviderContext.getResources().getDrawable(resourceId);
-            if (DBG) Log.d(LOG_TAG, "Found icon by resource ID: " + drawableId);
         } catch (NumberFormatException nfe) {
-            // The id was not an integer resource id.
-            // Let the ContentResolver handle content, android.resource and file URIs.
+            // The id was not an integer resource id, use it as a URI
             try {
                 Uri uri = Uri.parse(drawableId);
-                InputStream stream = mProviderContext.getContentResolver().openInputStream(uri);
-                if (stream != null) {
+                String scheme = uri.getScheme();
+                if (ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)) {
+                    // Load drawables through Resources, to get the source density information
+                    OpenResourceIdResult r =
+                            mProviderContext.getContentResolver().getResourceId(uri);
+                    try {
+                        drawable = r.r.getDrawable(r.id);
+                    } catch (Resources.NotFoundException ex) {
+                        throw new FileNotFoundException("Resource does not exist: " + uri);
+                    }
+                } else {
+                    // Let the ContentResolver handle content and file URIs.
+                    InputStream stream = mProviderContext.getContentResolver().openInputStream(uri);
+                    if (stream == null) {
+                        throw new FileNotFoundException("Failed to open " + uri);
+                    }
                     try {
                         drawable = Drawable.createFromStream(stream, null);
                     } finally {
@@ -598,22 +612,25 @@
                         }
                     }
                 }
-                if (DBG) Log.d(LOG_TAG, "Opened icon input stream: " + drawableId);
             } catch (FileNotFoundException fnfe) {
-                if (DBG) Log.d(LOG_TAG, "Icon stream not found: " + drawableId);
+                Log.w(LOG_TAG, "Icon not found: " + drawableId + ", " + fnfe.getMessage());
                 // drawable = null;
             }
-
-            // If we got a drawable for this resource id, then stick it in the
-            // map so we don't do this lookup again.
-            if (drawable != null) {
-                mOutsideDrawablesCache.put(drawableId, drawable.getConstantState());
-            }
         } catch (Resources.NotFoundException nfe) {
-            if (DBG) Log.d(LOG_TAG, "Icon resource not found: " + drawableId);
+            Log.w(LOG_TAG, "Icon resource not found: " + drawableId);
             // drawable = null;
         }
 
+        if (drawable == null) {
+            if (DBG) Log.d(LOG_TAG, "Didn't find icon: " + drawableId);
+        } else {
+            if (DBG) {
+                Log.d(LOG_TAG, "Found icon: " + drawableId);
+            }
+            // Cache it so we don't do this lookup again
+            mOutsideDrawablesCache.put(drawableId, drawable.getConstantState());
+        }
+
         return drawable;
     }
 
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 88a4d02f..307899a 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -527,12 +527,22 @@
         }
     }
 
-    class OpenResourceIdResult {
-        Resources r;
-        int id;
+    /**
+     * A resource identified by the {@link Resources} that contains it, and a resource id.
+     *
+     * @hide
+     */
+    public class OpenResourceIdResult {
+        public Resources r;
+        public int id;
     }
-    
-    OpenResourceIdResult getResourceId(Uri uri) throws FileNotFoundException {
+
+    /**
+     * Resolves an android.resource URI to a {@link Resources} and a resource id.
+     *
+     * @hide
+     */
+    public OpenResourceIdResult getResourceId(Uri uri) throws FileNotFoundException {
         String authority = uri.getAuthority();
         Resources r;
         if (TextUtils.isEmpty(authority)) {