17922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein/* 27922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * Copyright (C) 2013 Google Inc. 37922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * Licensed to The Android Open Source Project. 47922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * 57922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * Licensed under the Apache License, Version 2.0 (the "License"); 67922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * you may not use this file except in compliance with the License. 77922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * You may obtain a copy of the License at 87922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * 97922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * http://www.apache.org/licenses/LICENSE-2.0 107922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * 117922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * Unless required by applicable law or agreed to in writing, software 127922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * distributed under the License is distributed on an "AS IS" BASIS, 137922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 147922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * See the License for the specific language governing permissions and 157922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein * limitations under the License. 167922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein */ 177922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein 18f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sappersteinpackage com.android.mail.browse; 19f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein 20376294bbb5ded471ad577fdb492875a837021d08Andrew Sappersteinimport android.app.ActionBar; 21f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sappersteinimport android.app.Activity; 224ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sappersteinimport android.app.FragmentTransaction; 237638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sappersteinimport android.app.LoaderManager; 247638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sappersteinimport android.content.Context; 25f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sappersteinimport android.content.Intent; 267638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sappersteinimport android.content.Loader; 277638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sappersteinimport android.net.Uri; 28f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sappersteinimport android.os.Bundle; 297638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sappersteinimport android.view.Menu; 30376294bbb5ded471ad577fdb492875a837021d08Andrew Sappersteinimport android.view.MenuItem; 31f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein 32f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sappersteinimport com.android.mail.R; 337638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sappersteinimport com.android.mail.content.CursorCreator; 347638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sappersteinimport com.android.mail.content.ObjectCursor; 357638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sappersteinimport com.android.mail.content.ObjectCursorLoader; 367638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sappersteinimport com.android.mail.providers.Account; 377638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sappersteinimport com.android.mail.providers.UIProvider; 387638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sappersteinimport com.android.mail.ui.FeedbackEnabledActivity; 39f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sappersteinimport com.android.mail.utils.LogTag; 40f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sappersteinimport com.android.mail.utils.LogUtils; 41f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sappersteinimport com.android.mail.utils.MimeType; 427638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sappersteinimport com.android.mail.utils.Utils; 437638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 443de76eca03ed7ec1d40f2cce23cbbbe8e5e6d70fAndrew Sappersteinpublic class EmlViewerActivity extends Activity implements FeedbackEnabledActivity, 453de76eca03ed7ec1d40f2cce23cbbbe8e5e6d70fAndrew Sapperstein ConversationAccountController { 467638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein public static final String EXTRA_ACCOUNT_URI = "extra-account-uri"; 47f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein 48f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein private static final String LOG_TAG = LogTag.getLogTag(); 49f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein 504ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein private static final String FRAGMENT_TAG = "eml_message_fragment"; 51376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein 527638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein private static final int ACCOUNT_LOADER = 0; 537638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 547638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein private static final String SAVED_ACCOUNT = "saved-account"; 557638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 567638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein private MenuItem mHelpItem; 577638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein private MenuItem mSendFeedbackItem; 587638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 597638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein private Uri mAccountUri; 607638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein private Account mAccount; 617638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 627638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein private final AccountLoadCallbacks mAccountLoadCallbacks = new AccountLoadCallbacks(); 637638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 64aa27bc0e1c3bb6be4609b00007637a9d3e960f5eScott Kennedy @Override 65aa27bc0e1c3bb6be4609b00007637a9d3e960f5eScott Kennedy protected void onCreate(Bundle savedInstanceState) { 66f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein super.onCreate(savedInstanceState); 67f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein setContentView(R.layout.eml_viewer_activity); 68376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein 69376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein final ActionBar actionBar = getActionBar(); 70376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein actionBar.setDisplayHomeAsUpEnabled(true); 71f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein 72f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein final Intent intent = getIntent(); 73f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein final String action = intent.getAction(); 74f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein final String type = intent.getType(); 757638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein mAccountUri = intent.getParcelableExtra(EXTRA_ACCOUNT_URI); 76f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein 777638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein if (savedInstanceState == null) { 787638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein if (Intent.ACTION_VIEW.equals(action) && 797638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein MimeType.isEmlMimeType(type)) { 807638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein final FragmentTransaction transaction = getFragmentManager().beginTransaction(); 817638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein transaction.add(R.id.eml_root, EmlMessageViewFragment.newInstance( 827638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein intent.getData(), mAccountUri), FRAGMENT_TAG); 834ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein transaction.commit(); 847638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein } else { 857638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein LogUtils.wtf(LOG_TAG, 867638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein "Entered EmlViewerActivity with wrong intent action or type: %s, %s", 877638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein action, type); 887638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein finish(); // we should not be here. bail out. bail out. 897638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein return; 904ddda2f0a4ee5381a90779a6939b05b064ce5d11Andrew Sapperstein } 91f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein } else { 927638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein if (savedInstanceState.containsKey(SAVED_ACCOUNT)) { 937638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein mAccount = savedInstanceState.getParcelable(SAVED_ACCOUNT); 947638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein } 95f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein } 967638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 97c9524ef7a38c0f949fe614e96af3a5313f36aa0fAndrew Sapperstein // Account uri will be null if we launched from outside of the app. 98c9524ef7a38c0f949fe614e96af3a5313f36aa0fAndrew Sapperstein // So just don't load an account at all. 99c9524ef7a38c0f949fe614e96af3a5313f36aa0fAndrew Sapperstein if (mAccountUri != null) { 100c9524ef7a38c0f949fe614e96af3a5313f36aa0fAndrew Sapperstein getLoaderManager().initLoader(ACCOUNT_LOADER, Bundle.EMPTY, mAccountLoadCallbacks); 101c9524ef7a38c0f949fe614e96af3a5313f36aa0fAndrew Sapperstein } 102f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein } 103f86e023107de3647d6c862cc6d6b45a3d7887e77Andrew Sapperstein 1047922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein 1057638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein @Override 1067638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein public boolean onCreateOptionsMenu(Menu menu) { 107c9524ef7a38c0f949fe614e96af3a5313f36aa0fAndrew Sapperstein if (mAccountUri == null) { 108c9524ef7a38c0f949fe614e96af3a5313f36aa0fAndrew Sapperstein return false; 109c9524ef7a38c0f949fe614e96af3a5313f36aa0fAndrew Sapperstein } 110c9524ef7a38c0f949fe614e96af3a5313f36aa0fAndrew Sapperstein 1117638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein getMenuInflater().inflate(R.menu.eml_viewer_menu, menu); 1127638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein mHelpItem = menu.findItem(R.id.help_info_menu_item); 1137638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein mSendFeedbackItem = menu.findItem(R.id.feedback_menu_item); 1147638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein return true; 1157638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein } 1167638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 1177638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein @Override 1187638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein public boolean onPrepareOptionsMenu(Menu menu) { 1197638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein if (mHelpItem != null) { 1207638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein mHelpItem.setVisible(mAccount != null 1217638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein && mAccount.supportsCapability(UIProvider.AccountCapabilities.HELP_CONTENT)); 1227638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein } 1237638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein if (mSendFeedbackItem != null) { 1247638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein mSendFeedbackItem.setVisible(mAccount != null 1257638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein && mAccount.supportsCapability(UIProvider.AccountCapabilities.SEND_FEEDBACK)); 1267638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein } 1277638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 1287638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein return true; 1297638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein } 130376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein 131376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein @Override 132376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein public boolean onOptionsItemSelected(MenuItem item) { 1332b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy final int itemId = item.getItemId(); 1342b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy if (itemId == android.R.id.home) { 1352b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy finish(); 1362b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy return true; 1372b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy } else if (itemId == R.id.settings) { 1382b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy Utils.showSettings(this, mAccount); 1392b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy } else if (itemId == R.id.help_info_menu_item) { 1402b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy Utils.showHelp(this, mAccount, getString(R.string.main_help_context)); 1412b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy } else if (itemId == R.id.feedback_menu_item) { 1422b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy Utils.sendFeedback(this, mAccount, false); 1432b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy } else { 1442b9d80eb16156173f11a02eae4f770d8c975927cScott Kennedy return super.onOptionsItemSelected(item); 1457638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein } 1467638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 1477638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein return true; 1487638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein } 1497638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 1507638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein @Override 1517638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein public Context getActivityContext() { 1527638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein return this; 1537638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein } 1547638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 1553de76eca03ed7ec1d40f2cce23cbbbe8e5e6d70fAndrew Sapperstein @Override 1563de76eca03ed7ec1d40f2cce23cbbbe8e5e6d70fAndrew Sapperstein public Account getAccount() { 1573de76eca03ed7ec1d40f2cce23cbbbe8e5e6d70fAndrew Sapperstein return mAccount; 1583de76eca03ed7ec1d40f2cce23cbbbe8e5e6d70fAndrew Sapperstein } 1593de76eca03ed7ec1d40f2cce23cbbbe8e5e6d70fAndrew Sapperstein 1607638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein private class AccountLoadCallbacks 1617638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein implements LoaderManager.LoaderCallbacks<ObjectCursor<Account>> { 1627638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 1637638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein @Override 1647638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein public Loader<ObjectCursor<Account>> onCreateLoader(int id, Bundle args) { 1657638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein final String[] projection = UIProvider.ACCOUNTS_PROJECTION; 1667638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein final CursorCreator<Account> factory = Account.FACTORY; 1677638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein return new ObjectCursorLoader<Account>( 1687638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein EmlViewerActivity.this, mAccountUri, projection, factory); 169376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein } 170376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein 1717638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein @Override 1727638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein public void onLoadFinished(Loader<ObjectCursor<Account>> loader, 1737638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein ObjectCursor<Account> data) { 1747638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein if (data != null && data.moveToFirst()) { 1757638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein mAccount = data.getModel(); 1767638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein } 1777638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein } 1787638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein 1797638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein @Override 1807638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein public void onLoaderReset(Loader<ObjectCursor<Account>> loader) { 1817638a1004e7c8ed7a85620243da3b051b60217e8Andrew Sapperstein } 182376294bbb5ded471ad577fdb492875a837021d08Andrew Sapperstein } 1837922528d9d4b4926f1ed3e1322d14b8e00a03465Andrew Sapperstein} 184