179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangpackage com.android.mail.bitmap;
279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport android.content.ContentResolver;
479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport android.content.Context;
579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport android.content.res.AssetFileDescriptor;
679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport android.database.Cursor;
779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport android.net.Uri;
879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport android.text.TextUtils;
979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
1079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport com.android.bitmap.DecodeTask;
1179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport com.android.mail.providers.Attachment;
1279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport com.android.mail.providers.UIProvider;
1379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
1479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport java.io.IOException;
1579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangimport java.io.InputStream;
1679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
1779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang/**
1879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang * A request object for image attachment previews.
1979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang * <p>
2079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang * All requests are the same size to promote bitmap reuse.
2179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang */
2279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huangpublic class ImageAttachmentRequest implements DecodeTask.Request {
2379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    private final Context mContext;
2474db99555be46ccf44691805c359839268326d2eAndy Huang    private final String mLookupUri;
2574db99555be46ccf44691805c359839268326d2eAndy Huang    private final int mRendition;
261b6fe5b1181ed3d0d0dde44baf5766db1e9c32e6Andy Huang    public final int mDestW;
2779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
2865b6d180f50922a3393795203cae68a5a2f6a33dMark Wei    public ImageAttachmentRequest(final Context context, final String lookupUri,
2965b6d180f50922a3393795203cae68a5a2f6a33dMark Wei            final int rendition, final int destW) {
3079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        mContext = context;
3174db99555be46ccf44691805c359839268326d2eAndy Huang        mLookupUri = lookupUri;
3274db99555be46ccf44691805c359839268326d2eAndy Huang        mRendition = rendition;
331b6fe5b1181ed3d0d0dde44baf5766db1e9c32e6Andy Huang        mDestW = destW;
3479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
3579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
3679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    @Override
3779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    public boolean equals(Object o) {
3879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        if (o == null || !(o instanceof ImageAttachmentRequest)) {
3979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            return false;
4079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        }
4179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        final ImageAttachmentRequest other = (ImageAttachmentRequest) o;
421b6fe5b1181ed3d0d0dde44baf5766db1e9c32e6Andy Huang        return TextUtils.equals(mLookupUri, other.mLookupUri) && mRendition == other.mRendition
431b6fe5b1181ed3d0d0dde44baf5766db1e9c32e6Andy Huang                && mDestW == other.mDestW;
4479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
4579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
4679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    @Override
4779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    public int hashCode() {
4879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        int hash = 17;
4974db99555be46ccf44691805c359839268326d2eAndy Huang        hash += 31 * hash + mLookupUri.hashCode();
5074db99555be46ccf44691805c359839268326d2eAndy Huang        hash += 31 * hash + mRendition;
511b6fe5b1181ed3d0d0dde44baf5766db1e9c32e6Andy Huang        hash += 31 * hash + mDestW;
5279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        return hash;
5379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
5479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
5579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    @Override
5679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    public String toString() {
5779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        final StringBuilder sb = new StringBuilder("[");
5879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        sb.append(super.toString());
5979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        sb.append(" uri=");
6074db99555be46ccf44691805c359839268326d2eAndy Huang        sb.append(mLookupUri);
6174db99555be46ccf44691805c359839268326d2eAndy Huang        sb.append(" rendition=");
6274db99555be46ccf44691805c359839268326d2eAndy Huang        sb.append(mRendition);
631b6fe5b1181ed3d0d0dde44baf5766db1e9c32e6Andy Huang        sb.append(" w=");
641b6fe5b1181ed3d0d0dde44baf5766db1e9c32e6Andy Huang        sb.append(mDestW);
6579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        sb.append("]");
6679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        return sb.toString();
6779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
6879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
6974db99555be46ccf44691805c359839268326d2eAndy Huang    /**
7074db99555be46ccf44691805c359839268326d2eAndy Huang     * Returns true iff the other request is for the same attachment, and differs only in which
7174db99555be46ccf44691805c359839268326d2eAndy Huang     * rendition is being requested.
7274db99555be46ccf44691805c359839268326d2eAndy Huang     *
7374db99555be46ccf44691805c359839268326d2eAndy Huang     */
7474db99555be46ccf44691805c359839268326d2eAndy Huang    public boolean matches(ImageAttachmentRequest other) {
751b6fe5b1181ed3d0d0dde44baf5766db1e9c32e6Andy Huang        return other != null && TextUtils.equals(mLookupUri, other.mLookupUri)
761b6fe5b1181ed3d0d0dde44baf5766db1e9c32e6Andy Huang                && mDestW == other.mDestW;
7774db99555be46ccf44691805c359839268326d2eAndy Huang    }
7874db99555be46ccf44691805c359839268326d2eAndy Huang
7979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    @Override
8079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    public AssetFileDescriptor createFd() throws IOException {
8179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        AssetFileDescriptor result = null;
8279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        Cursor cursor = null;
8379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        final ContentResolver cr = mContext.getContentResolver();
8479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        try {
8574db99555be46ccf44691805c359839268326d2eAndy Huang            cursor = cr.query(Uri.parse(mLookupUri), UIProvider.ATTACHMENT_PROJECTION, null, null,
8679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang                    null);
8779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            if (cursor != null && cursor.moveToFirst()) {
8879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang                final Attachment a = new Attachment(cursor);
8974db99555be46ccf44691805c359839268326d2eAndy Huang                result = cr.openAssetFileDescriptor(a.getUriForRendition(mRendition), "r");
9079c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            }
9179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        } finally {
9279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            if (cursor != null) {
9379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang                cursor.close();
9479c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang            }
9579c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        }
9679c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        return result;
9779c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
9879c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang
9979c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    @Override
1007b1e10093f127dd3fcc00a7d1a3c5d717a0f1deaMark Wei    public InputStream createInputStream() throws IOException {
10179c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang        return null;
10279c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang    }
10379c3e1ed9cb1e1660c5d34b7bf3f3ab5c5dd5162Andy Huang}
104