BitmapDrawableImageView.java revision d7654f820a99358a7d2b2afb9b3a174690e213f6
146616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei/*
246616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * Copyright (C) 2013 The Android Open Source Project
346616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei *
446616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * Licensed under the Apache License, Version 2.0 (the "License");
546616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * you may not use this file except in compliance with the License.
646616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * You may obtain a copy of the License at
746616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei *
846616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei *      http://www.apache.org/licenses/LICENSE-2.0
946616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei *
1046616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * Unless required by applicable law or agreed to in writing, software
1146616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * distributed under the License is distributed on an "AS IS" BASIS,
1246616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1346616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * See the License for the specific language governing permissions and
1446616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei * limitations under the License.
1546616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei */
1646616414f6dabb6d57b0ac433a5fabe2abb8b5a9Mark Wei
17a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weipackage com.android.bitmap.view;
18a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei
19a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport android.content.Context;
20a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport android.graphics.Bitmap;
21a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport android.graphics.drawable.Drawable;
22a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport android.net.Uri;
23d7654f820a99358a7d2b2afb9b3a174690e213f6Mark Weiimport android.os.Build;
24a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport android.util.AttributeSet;
25a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport android.widget.ImageView;
26a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei
27a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Weiimport com.android.bitmap.drawable.BasicBitmapDrawable;
28a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei
29a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei/**
30a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei * A helpful ImageView replacement that can generally be used in lieu of ImageView.
319c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei * BitmapDrawableImageView has logic to unbind its BasicBitmapDrawable when it is detached from the
329c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei * window.
33a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei */
349c6ac19d4a3d39b7c2992060957920118ff56a65Mark Weipublic class BitmapDrawableImageView extends ImageView {
35d7654f820a99358a7d2b2afb9b3a174690e213f6Mark Wei    private static final boolean hasTransientStateSupported =
36d7654f820a99358a7d2b2afb9b3a174690e213f6Mark Wei        Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN;
37a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    private BasicBitmapDrawable mDrawable;
389024423249c9b1779f523cc4fe757fda2d205844Mark Wei    private boolean mAttachedToWindow;
39a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei
409c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei    public BitmapDrawableImageView(final Context context) {
41a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei        this(context, null);
42a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    }
43a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei
449c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei    public BitmapDrawableImageView(final Context context, final AttributeSet attrs) {
45a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei        this(context, attrs, 0);
46a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    }
47a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei
489c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei    public BitmapDrawableImageView(final Context context, final AttributeSet attrs,
499c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei            final int defStyle) {
50a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei        super(context, attrs, defStyle);
51a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    }
52a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei
53a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    /**
5489e59f00d67791754e44e65413baa95f94056df4Mark Wei     * Get the source drawable for this BitmapDrawableImageView.
5589e59f00d67791754e44e65413baa95f94056df4Mark Wei     * @return The source drawable casted to the given type, or null if the type does not match.
569c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei     */
5789e59f00d67791754e44e65413baa95f94056df4Mark Wei    @SuppressWarnings("unchecked") // Cast to type parameter.
5889e59f00d67791754e44e65413baa95f94056df4Mark Wei    public <E extends BasicBitmapDrawable> E getTypedDrawable() {
5989e59f00d67791754e44e65413baa95f94056df4Mark Wei        try {
6089e59f00d67791754e44e65413baa95f94056df4Mark Wei            return (E) mDrawable;
6189e59f00d67791754e44e65413baa95f94056df4Mark Wei        } catch (Exception ignored) {
6289e59f00d67791754e44e65413baa95f94056df4Mark Wei            return null;
6389e59f00d67791754e44e65413baa95f94056df4Mark Wei        }
649c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei    }
659c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei
669c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei    /**
6789e59f00d67791754e44e65413baa95f94056df4Mark Wei     * Set the given drawable as the source for this BitmapDrawableImageView.
68a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei     * @param drawable The source drawable.
69a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei     */
7089e59f00d67791754e44e65413baa95f94056df4Mark Wei    public <E extends BasicBitmapDrawable> void setTypedDrawable(E drawable) {
71a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei        super.setImageDrawable(drawable);
729c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei        unbindDrawable();
73a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei        mDrawable = drawable;
74a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    }
75a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei
769c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei    private void unbindDrawable() {
779c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei        if (mDrawable != null) {
789c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei            mDrawable.unbind();
799c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei        }
80a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    }
81a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei
82a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    @Override
839c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei    public void setImageResource(final int resId) {
849c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei        super.setImageResource(resId);
859c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei        unbindDrawable();
86b6ec2afe9710112214d79b36b2233fef6a52845aMark Wei        mDrawable = null;
87a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    }
88a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei
89a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    @Override
909c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei    public void setImageURI(final Uri uri) {
919c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei        super.setImageURI(uri);
929c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei        unbindDrawable();
93b6ec2afe9710112214d79b36b2233fef6a52845aMark Wei        mDrawable = null;
94a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    }
95a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei
96a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    @Override
979c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei    public void setImageDrawable(final Drawable drawable) {
989c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei        super.setImageDrawable(drawable);
999c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei        unbindDrawable();
100b6ec2afe9710112214d79b36b2233fef6a52845aMark Wei        mDrawable = null;
101a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    }
102a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei
103a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    @Override
1049c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei    public void setImageBitmap(final Bitmap bm) {
1059c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei        super.setImageBitmap(bm);
1069c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei        unbindDrawable();
107b6ec2afe9710112214d79b36b2233fef6a52845aMark Wei        mDrawable = null;
108a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    }
109a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei
110a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    @Override
1119024423249c9b1779f523cc4fe757fda2d205844Mark Wei    protected void onAttachedToWindow() {
1129024423249c9b1779f523cc4fe757fda2d205844Mark Wei        super.onAttachedToWindow();
1139024423249c9b1779f523cc4fe757fda2d205844Mark Wei        mAttachedToWindow = true;
1149024423249c9b1779f523cc4fe757fda2d205844Mark Wei    }
1159024423249c9b1779f523cc4fe757fda2d205844Mark Wei
1169024423249c9b1779f523cc4fe757fda2d205844Mark Wei    @Override
1179c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei    protected void onDetachedFromWindow() {
1189c6ac19d4a3d39b7c2992060957920118ff56a65Mark Wei        super.onDetachedFromWindow();
1199024423249c9b1779f523cc4fe757fda2d205844Mark Wei        mAttachedToWindow = false;
120d7654f820a99358a7d2b2afb9b3a174690e213f6Mark Wei        if (hasTransientStateSupported && !hasTransientState()) {
1219024423249c9b1779f523cc4fe757fda2d205844Mark Wei            unbindDrawable();
1229024423249c9b1779f523cc4fe757fda2d205844Mark Wei        }
1239024423249c9b1779f523cc4fe757fda2d205844Mark Wei    }
1249024423249c9b1779f523cc4fe757fda2d205844Mark Wei
1259024423249c9b1779f523cc4fe757fda2d205844Mark Wei    @Override
1269024423249c9b1779f523cc4fe757fda2d205844Mark Wei    public void setHasTransientState(boolean hasTransientState) {
1279024423249c9b1779f523cc4fe757fda2d205844Mark Wei        super.setHasTransientState(hasTransientState);
1289024423249c9b1779f523cc4fe757fda2d205844Mark Wei        if (!hasTransientState && !mAttachedToWindow) {
1299024423249c9b1779f523cc4fe757fda2d205844Mark Wei            unbindDrawable();
1309024423249c9b1779f523cc4fe757fda2d205844Mark Wei        }
131a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei    }
132a23358fbfd62c7aa1c84bfa8395b4dc427a71ce6Mark Wei}
133