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