Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 57384101 authored by Android (Google) Code Review's avatar Android (Google) Code Review
Browse files

Merge change 25270 into eclair

* changes:
  Use Resources to load search icons with android.resource URIs
parents 46ad7961 4c87a3f2
Loading
Loading
Loading
Loading
+33 −16
Original line number Diff line number Diff line
@@ -20,14 +20,15 @@ import android.app.SearchManager.DialogCursorProtocol;
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.Log;
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 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
            // 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);
                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) {
                    if (stream == null) {
                        throw new FileNotFoundException("Failed to open " + uri);
                    }
                    try {
                        drawable = Drawable.createFromStream(stream, null);
                    } finally {
@@ -598,22 +612,25 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
                        }
                    }
                }
                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;
    }

+15 −5
Original line number Diff line number Diff line
@@ -527,12 +527,22 @@ public abstract class ContentResolver {
        }
    }

    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)) {