package com.fsck.k9.activity.loader; import java.io.File; import android.content.AsyncTaskLoader; import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.OpenableColumns; import timber.log.Timber; import com.fsck.k9.K9; import com.fsck.k9.activity.misc.Attachment; import com.fsck.k9.activity.misc.Attachment.LoadingState; import com.fsck.k9.mail.internet.MimeUtility; /** * Loader to fetch metadata of an attachment. */ public class AttachmentInfoLoader extends AsyncTaskLoader<Attachment> { private final Attachment sourceAttachment; private Attachment cachedResultAttachment; public AttachmentInfoLoader(Context context, Attachment attachment) { super(context); if (attachment.state != LoadingState.URI_ONLY) { throw new IllegalArgumentException("Attachment provided to metadata loader must be in URI_ONLY state"); } sourceAttachment = attachment; } @Override protected void onStartLoading() { if (cachedResultAttachment != null) { deliverResult(cachedResultAttachment); } if (takeContentChanged() || cachedResultAttachment == null) { forceLoad(); } } @Override public Attachment loadInBackground() { Uri uri = sourceAttachment.uri; String contentType = sourceAttachment.contentType; long size = -1; String name = null; ContentResolver contentResolver = getContext().getContentResolver(); Cursor metadataCursor = contentResolver.query( uri, new String[] { OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE }, null, null, null); if (metadataCursor != null) { try { if (metadataCursor.moveToFirst()) { name = metadataCursor.getString(0); size = metadataCursor.getInt(1); } } finally { metadataCursor.close(); } } if (name == null) { name = uri.getLastPathSegment(); } String usableContentType = contentResolver.getType(uri); if (usableContentType == null && contentType != null && contentType.indexOf('*') != -1) { usableContentType = contentType; } if (usableContentType == null) { usableContentType = MimeUtility.getMimeTypeByExtension(name); } if (size <= 0) { String uriString = uri.toString(); if (uriString.startsWith("file://")) { File f = new File(uriString.substring("file://".length())); size = f.length(); } else { Timber.v("Not a file: %s", uriString); } } else { Timber.v("old attachment.size: %d", size); } Timber.v("new attachment.size: %d", size); cachedResultAttachment = sourceAttachment.deriveWithMetadataLoaded(usableContentType, name, size); return cachedResultAttachment; } }