EmailProvider now supports query and getType for cached file urls

b/17573792
This is needed so that we can send cached files as attachments.
This case comes up if you edit a draft with an attachment,
view the attachment, and then share that with Email.
Also, update the manifest so that EmailProvider grants
uri permission for cachedFiles.

Change-Id: Ib32ae8360b627823af9361cba05e0e5dbd0ae4ca
This commit is contained in:
Martin Hibdon 2014-10-09 13:41:47 -07:00
parent 1927361b25
commit 89272781fa
2 changed files with 79 additions and 1 deletions

View File

@ -672,7 +672,9 @@
android:exported="true"
android:permission="com.android.email.permission.ACCESS_PROVIDER"
android:label="@string/app_name"
/>
android:grantUriPermissions="true">
<grant-uri-permission android:pathPrefix="/attachment/cachedFile"/>
</provider>
<!-- Legacy authenticators, etc. can be added below. OEMs may remove these -->

View File

@ -355,6 +355,12 @@ public class EmailProvider extends ContentProvider
private static final String SYNC_STATUS_CALLBACK_METHOD = "sync_status";
private static final String[] MIME_TYPE_PROJECTION = new String[]{AttachmentColumns.MIME_TYPE};
private static final String[] CACHED_FILE_QUERY_PROJECTION = new String[]
{ AttachmentColumns._ID, AttachmentColumns.FILENAME, AttachmentColumns.SIZE,
AttachmentColumns.CONTENT_URI };
/**
* Wrap the UriMatcher call so we can throw a runtime exception if an unknown Uri is passed in
* @param uri the Uri to match
@ -843,6 +849,23 @@ public class EmailProvider extends ContentProvider
return "vnd.android.cursor.dir/email-hostauth";
case HOSTAUTH_ID:
return "vnd.android.cursor.item/email-hostauth";
case ATTACHMENTS_CACHED_FILE_ACCESS: {
SQLiteDatabase db = getDatabase(getContext());
Cursor c = db.query(Attachment.TABLE_NAME, MIME_TYPE_PROJECTION,
AttachmentColumns.CACHED_FILE + "=?", new String[]{uri.toString()},
null, null, null, null);
try {
if (c != null && c.moveToFirst()) {
return c.getString(0);
} else {
return null;
}
} finally {
if (c != null) {
c.close();
}
}
}
default:
return null;
}
@ -1423,6 +1446,59 @@ public class EmailProvider extends ContentProvider
id = uri.getPathSegments().get(2);
c = uiQuickResponseAccount(projection, id);
break;
case ATTACHMENTS_CACHED_FILE_ACCESS:
if (projection == null) {
projection =
new String[] {
AttachmentUtilities.Columns._ID,
AttachmentUtilities.Columns.DATA,
};
}
// Map the columns of our attachment table to the columns defined in
// AttachmentUtils. These are a superset of OpenableColumns.
// This mirrors similar code in AttachmentProvider.
c = db.query(Attachment.TABLE_NAME,
CACHED_FILE_QUERY_PROJECTION, AttachmentColumns.CACHED_FILE + "=?",
new String[]{uri.toString()}, null, null, null, null);
try {
if (c.getCount() > 1) {
LogUtils.e(TAG, "multiple results querying CACHED_FILE_ACCESS %s", uri);
}
if (c != null && c.moveToFirst()) {
MatrixCursor ret = new MatrixCursorWithCachedColumns(projection);
Object[] values = new Object[projection.length];
for (int i = 0, count = projection.length; i < count; i++) {
String column = projection[i];
if (AttachmentUtilities.Columns._ID.equals(column)) {
values[i] = c.getLong(
c.getColumnIndexOrThrow(AttachmentColumns._ID));
}
else if (AttachmentUtilities.Columns.DATA.equals(column)) {
values[i] = c.getString(
c.getColumnIndexOrThrow(AttachmentColumns.CONTENT_URI));
}
else if (AttachmentUtilities.Columns.DISPLAY_NAME.equals(column)) {
values[i] = c.getString(
c.getColumnIndexOrThrow(AttachmentColumns.FILENAME));
}
else if (AttachmentUtilities.Columns.SIZE.equals(column)) {
values[i] = c.getInt(
c.getColumnIndexOrThrow(AttachmentColumns.SIZE));
} else {
LogUtils.e(TAG,
"unexpected column %s requested for CACHED_FILE",
column);
}
}
ret.addRow(values);
return ret;
}
} finally {
if (c != null) {
c.close();
}
}
return null;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}