diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5255d32ae..16c3457c2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -398,6 +398,11 @@ save attachment.
You have declined this invitation
+
+
+ Viewing
+ %s
+
Discard message
diff --git a/src/com/android/email/Utility.java b/src/com/android/email/Utility.java
index 775f18877..069e6bb14 100644
--- a/src/com/android/email/Utility.java
+++ b/src/com/android/email/Utility.java
@@ -44,6 +44,7 @@ import android.os.Environment;
import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
+import android.provider.OpenableColumns;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Base64;
@@ -1165,4 +1166,22 @@ public class Utility {
}
});
}
+
+ private static final String[] ATTACHMENT_META_NAME_PROJECTION = {
+ OpenableColumns.DISPLAY_NAME
+ };
+ private static final int ATTACHMENT_META_NAME_COLUMN_DISPLAY_NAME = 0;
+
+ /**
+ * @return Filename of a content of {@code contentUri}. If the provider doesn't provide the
+ * filename, returns the last path segment of the URI.
+ */
+ public static String getContentFileName(Context context, Uri contentUri) {
+ String name = getFirstRowString(context, contentUri, ATTACHMENT_META_NAME_PROJECTION, null,
+ null, null, ATTACHMENT_META_NAME_COLUMN_DISPLAY_NAME);
+ if (name == null) {
+ name = contentUri.getLastPathSegment();
+ }
+ return name;
+ }
}
diff --git a/src/com/android/email/activity/MessageCompose.java b/src/com/android/email/activity/MessageCompose.java
index afe7a0ef7..6315f91ef 100644
--- a/src/com/android/email/activity/MessageCompose.java
+++ b/src/com/android/email/activity/MessageCompose.java
@@ -36,13 +36,11 @@ import com.android.email.provider.EmailContent.MessageColumns;
import android.app.ActionBar;
import android.app.Activity;
import android.app.ActivityManager;
-import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.database.Cursor;
@@ -109,11 +107,6 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
private static final int ACTIVITY_REQUEST_PICK_ATTACHMENT = 1;
- private static final String[] ATTACHMENT_META_NAME_PROJECTION = {
- OpenableColumns.DISPLAY_NAME
- };
- private static final int ATTACHMENT_META_NAME_COLUMN_DISPLAY_NAME = 0;
-
private static final String[] ATTACHMENT_META_SIZE_PROJECTION = {
OpenableColumns.SIZE
};
@@ -1073,22 +1066,12 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
private Attachment loadAttachmentInfo(Uri uri) {
long size = -1;
- String name = null;
ContentResolver contentResolver = getContentResolver();
// Load name & size independently, because not all providers support both
- Cursor metadataCursor = contentResolver.query(uri, ATTACHMENT_META_NAME_PROJECTION,
- null, null, null);
- if (metadataCursor != null) {
- try {
- if (metadataCursor.moveToFirst()) {
- name = metadataCursor.getString(ATTACHMENT_META_NAME_COLUMN_DISPLAY_NAME);
- }
- } finally {
- metadataCursor.close();
- }
- }
- metadataCursor = contentResolver.query(uri, ATTACHMENT_META_SIZE_PROJECTION,
+ final String name = Utility.getContentFileName(this, uri);
+
+ Cursor metadataCursor = contentResolver.query(uri, ATTACHMENT_META_SIZE_PROJECTION,
null, null, null);
if (metadataCursor != null) {
try {
@@ -1100,10 +1083,7 @@ public class MessageCompose extends Activity implements OnClickListener, OnFocus
}
}
- // When the name or size are not provided, we need to generate them locally.
- if (name == null) {
- name = uri.getLastPathSegment();
- }
+ // When the size is not provided, we need to determine it locally.
if (size < 0) {
// if the URI is a file: URI, ask file system for its size
if ("file".equalsIgnoreCase(uri.getScheme())) {
diff --git a/src/com/android/email/activity/MessageFileView.java b/src/com/android/email/activity/MessageFileView.java
index e7e1009ab..59f628904 100644
--- a/src/com/android/email/activity/MessageFileView.java
+++ b/src/com/android/email/activity/MessageFileView.java
@@ -18,11 +18,15 @@ package com.android.email.activity;
import com.android.email.Email;
import com.android.email.R;
+import com.android.email.Utility;
+import android.app.ActionBar;
import android.content.Intent;
import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
+import android.view.MenuItem;
/**
* Activity to show file-based messages. (i.e. *.eml files, and possibly *.msg files).
@@ -37,6 +41,9 @@ import android.util.Log;
* See {@link MessageViewBase} for the class relation diagram.
*/
public class MessageFileView extends MessageViewBase {
+
+ private ActionBar mActionBar;
+
/**
* URI to the email (i.e. *.eml files, and possibly *.msg files) file that's being
*/
@@ -44,6 +51,8 @@ public class MessageFileView extends MessageViewBase {
private MessageFileViewFragment mFragment;
+ private LoadFilenameTask mLoadFilenameTask;
+
@Override
protected int getLayoutId() {
return R.layout.message_file_view;
@@ -53,6 +62,10 @@ public class MessageFileView extends MessageViewBase {
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
+ mActionBar = getActionBar();
+ mActionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_HOME_AS_UP
+ | ActionBar.DISPLAY_SHOW_TITLE);
+
mFragment = (MessageFileViewFragment) getFragmentManager().findFragmentById(
R.id.message_file_view_fragment);
mFragment.setCallback(this);
@@ -65,10 +78,12 @@ public class MessageFileView extends MessageViewBase {
return;
}
- // TODO set title here: "Viewing XXX.eml".
-
// Load message.
getFragment().openMessage(mFileEmailUri);
+
+ // Set title.
+ mLoadFilenameTask = new LoadFilenameTask(mFileEmailUri);
+ mLoadFilenameTask.execute();
}
@Override
@@ -76,6 +91,23 @@ public class MessageFileView extends MessageViewBase {
super.onResume();
}
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ Utility.cancelTaskInterrupt(mLoadFilenameTask);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ onBackPressed(); // Treat as "back".
+ return true;
+ }
+
+ return super.onOptionsItemSelected(item);
+ }
+
/** @return always -1, as no accounts are associated with EML files. */
@Override
protected long getAccountId() {
@@ -87,4 +119,35 @@ public class MessageFileView extends MessageViewBase {
protected MessageFileViewFragment getFragment() {
return mFragment;
}
+
+ /**
+ * Set the activity title. ("Viewing FILENAME")
+ */
+ private void setTitle(String filename) {
+ mActionBar.setTitle(getString(R.string.eml_view_title, filename));
+ }
+
+ /**
+ * Load the filename of the EML, and update the activity title.
+ */
+ private class LoadFilenameTask extends AsyncTask {
+ private final Uri mContentUri;
+
+ public LoadFilenameTask(Uri contentUri) {
+ mContentUri = contentUri;
+ }
+
+ @Override
+ protected String doInBackground(Void... params) {
+ return Utility.getContentFileName(MessageFileView.this, mContentUri);
+ }
+
+ @Override
+ protected void onPostExecute(String filename) {
+ if (filename == null || isCancelled()) {
+ return;
+ }
+ setTitle(filename);
+ }
+ }
}
diff --git a/tests/src/com/android/email/DBTestHelper.java b/tests/src/com/android/email/DBTestHelper.java
index c2f1697e0..feaea48d8 100644
--- a/tests/src/com/android/email/DBTestHelper.java
+++ b/tests/src/com/android/email/DBTestHelper.java
@@ -16,6 +16,7 @@
package com.android.email;
+import com.android.email.provider.AttachmentProvider;
import com.android.email.provider.EmailContent;
import com.android.email.provider.EmailProvider;
@@ -185,8 +186,7 @@ public final class DBTestHelper {
}
// Based on ProviderTestCase2.setUp().
- public static Context getProviderContext(
- Context context, Class providerClass) throws Exception {
+ public static Context getProviderContext(Context context) throws Exception {
MockContentResolver resolver = new MockContentResolver();
final String filenamePrefix = "test.";
RenamingDelegatingContext targetContextWrapper = new RenamingDelegatingContext(
@@ -196,10 +196,14 @@ public final class DBTestHelper {
final Context providerContext = new MyIsolatedContext(resolver, targetContextWrapper);
providerContext.getContentResolver();
- final T provider = providerClass.newInstance();
- provider.attachInfo(providerContext, null);
- Assert.assertNotNull(provider);
- resolver.addProvider(EmailContent.AUTHORITY, provider);
+ // register EmailProvider and AttachmentProvider.
+ final EmailProvider ep = new EmailProvider();
+ ep.attachInfo(providerContext, null);
+ resolver.addProvider(EmailContent.AUTHORITY, ep);
+
+ final AttachmentProvider ap = new AttachmentProvider();
+ ap.attachInfo(providerContext, null);
+ resolver.addProvider(AttachmentProvider.AUTHORITY, ap);
return providerContext;
}
}
diff --git a/tests/src/com/android/email/RefreshManagerTest.java b/tests/src/com/android/email/RefreshManagerTest.java
index 7d002eab0..2bad82ccc 100644
--- a/tests/src/com/android/email/RefreshManagerTest.java
+++ b/tests/src/com/android/email/RefreshManagerTest.java
@@ -18,7 +18,6 @@ package com.android.email;
import com.android.email.mail.MessagingException;
import com.android.email.provider.EmailContent.Account;
-import com.android.email.provider.EmailProvider;
import com.android.email.provider.ProviderTestUtils;
import android.content.Context;
@@ -57,8 +56,7 @@ public class RefreshManagerTest extends InstrumentationTestCase {
mContext = getInstrumentation().getTargetContext();
mController = new MockController(mContext);
mListener = new RefreshListener();
- mProviderContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext(
- mContext, EmailProvider.class);
+ mProviderContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext(mContext);
mTarget = new RefreshManager(mProviderContext, mController, mClock, null);
mTarget.registerListener(mListener);
}
diff --git a/tests/src/com/android/email/UtilityLargeTest.java b/tests/src/com/android/email/UtilityLargeTest.java
index d5cae535f..0b030c61e 100644
--- a/tests/src/com/android/email/UtilityLargeTest.java
+++ b/tests/src/com/android/email/UtilityLargeTest.java
@@ -17,7 +17,6 @@
package com.android.email;
import com.android.email.provider.EmailContent.Account;
-import com.android.email.provider.EmailProvider;
import com.android.email.provider.ProviderTestUtils;
import android.content.Context;
@@ -42,7 +41,7 @@ public class UtilityLargeTest extends InstrumentationTestCase {
protected void setUp() throws Exception {
super.setUp();
mProviderContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext(
- getInstrumentation().getTargetContext(), EmailProvider.class);
+ getInstrumentation().getTargetContext());
}
diff --git a/tests/src/com/android/email/UtilityUnitTests.java b/tests/src/com/android/email/UtilityUnitTests.java
index 4cb16ae1f..85856fb59 100644
--- a/tests/src/com/android/email/UtilityUnitTests.java
+++ b/tests/src/com/android/email/UtilityUnitTests.java
@@ -17,10 +17,15 @@
package com.android.email;
import com.android.email.Utility.NewFileCreator;
+import com.android.email.provider.AttachmentProvider;
+import com.android.email.provider.EmailContent.Account;
+import com.android.email.provider.EmailContent.Attachment;
import com.android.email.provider.EmailContent.Mailbox;
+import com.android.email.provider.ProviderTestUtils;
import android.content.Context;
import android.graphics.drawable.Drawable;
+import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Parcel;
@@ -397,6 +402,31 @@ public class UtilityUnitTests extends AndroidTestCase {
assertEquals(4, two[1]);
}
+ public void testGetContentFileName() throws Exception {
+ Context providerContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext(
+ mContext);
+
+ final long ACCOUNT_ID = 1;
+ final long MESSAGE_ID = 10;
+
+ Account account = ProviderTestUtils.setupAccount("account", true, providerContext);
+ Mailbox mailbox = ProviderTestUtils.setupMailbox("box", account.mId, true, providerContext);
+
+ // Set up an attachment.
+ Attachment att = ProviderTestUtils.setupAttachment(mailbox.mId, "name", 123, true,
+ providerContext);
+ long attachmentId = att.mId;
+ Uri uri = AttachmentProvider.getAttachmentUri(account.mId, attachmentId);
+
+ // Case 1: exists in the provider.
+ assertEquals("name", Utility.getContentFileName(providerContext, uri));
+
+ // Case 2: doesn't exist in the provider
+ Uri notExistUri = AttachmentProvider.getAttachmentUri(account.mId, 123456789);
+ String lastPathSegment = notExistUri.getLastPathSegment();
+ assertEquals(lastPathSegment, Utility.getContentFileName(providerContext, notExistUri));
+ }
+
private static Collection createLongCollection(long... values) {
ArrayList ret = new ArrayList();
for (long value : values) {
diff --git a/tests/src/com/android/email/activity/AccountSelectorAdapterAccountsLoaderTest.java b/tests/src/com/android/email/activity/AccountSelectorAdapterAccountsLoaderTest.java
index 81deacb1a..142d5a8ad 100644
--- a/tests/src/com/android/email/activity/AccountSelectorAdapterAccountsLoaderTest.java
+++ b/tests/src/com/android/email/activity/AccountSelectorAdapterAccountsLoaderTest.java
@@ -18,7 +18,6 @@ package com.android.email.activity;
import com.android.email.DBTestHelper;
import com.android.email.provider.EmailContent.Account;
-import com.android.email.provider.EmailProvider;
import com.android.email.provider.ProviderTestUtils;
import android.content.Context;
@@ -37,8 +36,7 @@ public class AccountSelectorAdapterAccountsLoaderTest extends LoaderTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
- mProviderContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext(
- mContext, EmailProvider.class);
+ mProviderContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext(mContext);
}
/**
diff --git a/tests/src/com/android/email/activity/MailboxFinderTest.java b/tests/src/com/android/email/activity/MailboxFinderTest.java
index 4e4cc9c1c..a83622d9b 100644
--- a/tests/src/com/android/email/activity/MailboxFinderTest.java
+++ b/tests/src/com/android/email/activity/MailboxFinderTest.java
@@ -24,7 +24,6 @@ import com.android.email.mail.MessagingException;
import com.android.email.provider.EmailContent;
import com.android.email.provider.EmailContent.Account;
import com.android.email.provider.EmailContent.Mailbox;
-import com.android.email.provider.EmailProvider;
import com.android.email.provider.ProviderTestUtils;
import android.content.Context;
@@ -63,7 +62,7 @@ public class MailboxFinderTest extends InstrumentationTestCase {
super.setUp();
mProviderContext = DBTestHelper.ProviderContextSetupHelper.getProviderContext(
- getInstrumentation().getTargetContext(), EmailProvider.class);
+ getInstrumentation().getTargetContext());
mCallback = new MockCallback();
mMockController = new MockController(getContext());
Controller.injectMockControllerForTest(mMockController);
diff --git a/tests/src/com/android/email/activity/MessageFileViewTest.java b/tests/src/com/android/email/activity/MessageFileViewTest.java
index 04485760b..5cf407a6a 100644
--- a/tests/src/com/android/email/activity/MessageFileViewTest.java
+++ b/tests/src/com/android/email/activity/MessageFileViewTest.java
@@ -19,7 +19,6 @@ package com.android.email.activity;
import com.android.email.DBTestHelper;
import com.android.email.TestUtils;
import com.android.email.provider.EmailContent.Message;
-import com.android.email.provider.EmailProvider;
import com.android.email.provider.ProviderTestUtils;
import android.content.Context;
@@ -46,7 +45,7 @@ public class MessageFileViewTest extends ActivityInstrumentationTestCase2