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