19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.text.style;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.Bitmap;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.BitmapFactory;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.BitmapDrawable;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.graphics.drawable.Drawable;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ImageSpan extends DynamicDrawableSpan {
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Drawable mDrawable;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Uri mContentUri;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mResourceId;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Context mContext;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mSource;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
360cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn    /**
370cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn     * @deprecated Use {@link #ImageSpan(Context, Bitmap)} instead.
380cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn     */
394a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn    @Deprecated
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ImageSpan(Bitmap b) {
410cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn        this(null, b, ALIGN_BOTTOM);
420cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn    }
430cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn
440cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn    /**
450cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn     * @deprecated Use {@link #ImageSpan(Context, Bitmap, int) instead.
460cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn     */
474a51c20ce607c74914f90fd897f04080121ac13bDianne Hackborn    @Deprecated
480cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn    public ImageSpan(Bitmap b, int verticalAlignment) {
490cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn        this(null, b, verticalAlignment);
500cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn    }
510cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn
520cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn    public ImageSpan(Context context, Bitmap b) {
530cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn        this(context, b, ALIGN_BOTTOM);
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param verticalAlignment one of {@link DynamicDrawableSpan#ALIGN_BOTTOM} or
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link DynamicDrawableSpan#ALIGN_BASELINE}.
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
600cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn    public ImageSpan(Context context, Bitmap b, int verticalAlignment) {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(verticalAlignment);
620cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn        mContext = context;
630cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn        mDrawable = context != null
640cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn                ? new BitmapDrawable(context.getResources(), b)
650cd6376fa14089cee42991f751962ffd7f455797Dianne Hackborn                : new BitmapDrawable(b);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int width = mDrawable.getIntrinsicWidth();
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int height = mDrawable.getIntrinsicHeight();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDrawable.setBounds(0, 0, width > 0 ? width : 0, height > 0 ? height : 0);
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ImageSpan(Drawable d) {
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(d, ALIGN_BOTTOM);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param verticalAlignment one of {@link DynamicDrawableSpan#ALIGN_BOTTOM} or
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link DynamicDrawableSpan#ALIGN_BASELINE}.
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ImageSpan(Drawable d, int verticalAlignment) {
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(verticalAlignment);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDrawable = d;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ImageSpan(Drawable d, String source) {
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(d, source, ALIGN_BOTTOM);
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param verticalAlignment one of {@link DynamicDrawableSpan#ALIGN_BOTTOM} or
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link DynamicDrawableSpan#ALIGN_BASELINE}.
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ImageSpan(Drawable d, String source, int verticalAlignment) {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(verticalAlignment);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mDrawable = d;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mSource = source;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ImageSpan(Context context, Uri uri) {
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, uri, ALIGN_BOTTOM);
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param verticalAlignment one of {@link DynamicDrawableSpan#ALIGN_BOTTOM} or
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link DynamicDrawableSpan#ALIGN_BASELINE}.
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ImageSpan(Context context, Uri uri, int verticalAlignment) {
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(verticalAlignment);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContentUri = uri;
110ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project        mSource = uri.toString();
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ImageSpan(Context context, int resourceId) {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        this(context, resourceId, ALIGN_BOTTOM);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param verticalAlignment one of {@link DynamicDrawableSpan#ALIGN_BOTTOM} or
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * {@link DynamicDrawableSpan#ALIGN_BASELINE}.
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public ImageSpan(Context context, int resourceId, int verticalAlignment) {
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super(verticalAlignment);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mResourceId = resourceId;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Drawable getDrawable() {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Drawable drawable = null;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mDrawable != null) {
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            drawable = mDrawable;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else  if (mContentUri != null) {
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Bitmap bitmap = null;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InputStream is = mContext.getContentResolver().openInputStream(
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mContentUri);
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                bitmap = BitmapFactory.decodeStream(is);
13911ea33471e1a14a8594f0b2cd012d86340dd3bd8Dianne Hackborn                drawable = new BitmapDrawable(mContext.getResources(), bitmap);
140ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
141ba87e3e6c985e7175152993b5efcc7dd2f0e1c93The Android Open Source Project                        drawable.getIntrinsicHeight());
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                is.close();
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e("sms", "Failed to loaded content " + mContentUri, e);
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                drawable = mContext.getResources().getDrawable(mResourceId);
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        drawable.getIntrinsicHeight());
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (Exception e) {
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.e("sms", "Unable to find resource: " + mResourceId);
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return drawable;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Returns the source string that was saved during construction.
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String getSource() {
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mSource;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
167