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