17da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler/*******************************************************************************
27da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *      Copyright (C) 2014 Google Inc.
37da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *      Licensed to The Android Open Source Project.
47da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *
57da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *      Licensed under the Apache License, Version 2.0 (the "License");
67da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *      you may not use this file except in compliance with the License.
77da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *      You may obtain a copy of the License at
87da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *
97da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *           http://www.apache.org/licenses/LICENSE-2.0
107da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *
117da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *      Unless required by applicable law or agreed to in writing, software
127da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *      distributed under the License is distributed on an "AS IS" BASIS,
137da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
147da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *      See the License for the specific language governing permissions and
157da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *      limitations under the License.
167da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler *******************************************************************************/
177da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
187da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerpackage com.android.mail.ui.settings;
197da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
2094ae7d5daa3b34cc3c155ac02f40d61d718663e1Tony Mantlerimport android.app.ActionBar;
217da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport android.app.Fragment;
22e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport android.app.LoaderManager.LoaderCallbacks;
23e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport android.content.CursorLoader;
24e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport android.content.Loader;
25e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport android.database.Cursor;
267da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport android.os.Bundle;
277da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport android.preference.PreferenceActivity;
28e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport android.text.TextUtils;
297da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
307da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport com.android.mail.R;
31e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport com.android.mail.providers.Account;
32e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport com.android.mail.providers.MailAppProvider;
33e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport com.android.mail.providers.UIProvider;
348b85a9b88244bd910d63a7a0f594f3792b157aa0Tony Mantlerimport com.android.mail.providers.UIProvider.AccountCapabilities;
357da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport com.google.common.annotations.VisibleForTesting;
367da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
377da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport java.lang.ref.WeakReference;
387da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport java.util.List;
397da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
407da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerpublic class MailPreferenceActivity extends PreferenceActivity {
417da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
42dc24fceb82fa01f7c58abd2a1191f0b2cc64c6faTony Mantler    public static final String PREFERENCE_FRAGMENT_ID = "preference_fragment_id";
43dc24fceb82fa01f7c58abd2a1191f0b2cc64c6faTony Mantler
44e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    private static final int ACCOUNT_LOADER_ID = 0;
45e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
467da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    private WeakReference<GeneralPrefsFragment> mGeneralPrefsFragmentRef;
477da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
48e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    private Cursor mAccountsCursor;
49e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
507da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    @Override
517da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    protected void onCreate(Bundle savedInstanceState) {
527da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler        super.onCreate(savedInstanceState);
53e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
5494ae7d5daa3b34cc3c155ac02f40d61d718663e1Tony Mantler        final ActionBar actionBar = getActionBar();
5594ae7d5daa3b34cc3c155ac02f40d61d718663e1Tony Mantler        if (actionBar != null) {
5694ae7d5daa3b34cc3c155ac02f40d61d718663e1Tony Mantler            // Hide the app icon.
5794ae7d5daa3b34cc3c155ac02f40d61d718663e1Tony Mantler            actionBar.setIcon(android.R.color.transparent);
5894ae7d5daa3b34cc3c155ac02f40d61d718663e1Tony Mantler            actionBar.setDisplayUseLogoEnabled(false);
5994ae7d5daa3b34cc3c155ac02f40d61d718663e1Tony Mantler        }
6094ae7d5daa3b34cc3c155ac02f40d61d718663e1Tony Mantler
61e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        getLoaderManager().initLoader(ACCOUNT_LOADER_ID, null, new AccountLoaderCallbacks());
62e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    }
63e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
64e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    private class AccountLoaderCallbacks implements LoaderCallbacks<Cursor> {
65e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        @Override
66e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
67e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            return new CursorLoader(MailPreferenceActivity.this,
68e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    MailAppProvider.getAccountsUri(), UIProvider.ACCOUNTS_PROJECTION,
69e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    null, null, null);
70e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        }
71e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
72e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        @Override
73e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
74e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            mAccountsCursor = data;
75e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            invalidateHeaders();
76e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        }
77e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
78e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        @Override
79e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        public void onLoaderReset(Loader<Cursor> loader) {
80e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            mAccountsCursor = null;
81e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            invalidateHeaders();
82e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        }
837da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    }
847da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
857da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    @VisibleForTesting
867da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    GeneralPrefsFragment getGeneralPrefsFragment() {
877da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler        return mGeneralPrefsFragmentRef != null ? mGeneralPrefsFragmentRef.get() : null;
887da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    }
897da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
907da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    @Override
917da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    public void onAttachFragment(Fragment fragment) {
927da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler        super.onAttachFragment(fragment);
937da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler        if (fragment instanceof GeneralPrefsFragment) {
947da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler            mGeneralPrefsFragmentRef =
957da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler                    new WeakReference<GeneralPrefsFragment>((GeneralPrefsFragment) fragment);
967da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler        }
977da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    }
987da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
997da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    @Override
1007da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    protected boolean isValidFragment(String fragmentName) {
101e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        // TODO: STOPSHIP fix Email to use the PublicPreferenceActivity trampoline
102e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        return true;
1037da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    }
1047da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
1057da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    @Override
1067da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    public void onBuildHeaders(List<Header> target) {
1077da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler        loadHeadersFromResource(R.xml.preference_headers, target);
108e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        if (mAccountsCursor != null && mAccountsCursor.moveToFirst()) {
109e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            do {
1104b0c0127d24e387a4f49d442b63b5c60cedb6922Ray Chen                final Account account = Account.builder().buildFrom(mAccountsCursor);
1118b85a9b88244bd910d63a7a0f594f3792b157aa0Tony Mantler                // TODO: This will no longer be needed when the Combined view is moved to Unified
1128b85a9b88244bd910d63a7a0f594f3792b157aa0Tony Mantler                if (!account.supportsCapability(AccountCapabilities.VIRTUAL_ACCOUNT)) {
113e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    final Header header = new Header();
114e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    if (TextUtils.isEmpty(account.getDisplayName()) ||
115e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                            TextUtils.equals(account.getDisplayName(), account.getEmailAddress())) {
116e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                        // No (useful) display name, just use the email address
117e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                        header.title = account.getEmailAddress();
118e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    } else {
119e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                        header.title = account.getDisplayName();
120e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                        header.summary = account.getEmailAddress();
121e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    }
122e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    header.fragment = account.settingsFragmentClass;
123e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    final Bundle accountBundle = new Bundle(1);
124e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    accountBundle.putString(MailAccountPrefsFragment.ARG_ACCOUNT_EMAIL,
125e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                            account.getEmailAddress());
126e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    header.fragmentArguments = accountBundle;
127e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
128e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    target.add(header);
129e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                }
130e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            } while (mAccountsCursor.moveToNext());
131e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        }
132e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        onBuildExtraHeaders(target);
133e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    }
134e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
135e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    /**
136e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler     * Override this in a subclass to add extra headers besides "General Settings" and accounts
137e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler     * @param target List of headers to mutate
138e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler     */
139e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    public void onBuildExtraHeaders(List<Header> target) {
1407da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    }
1417da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler}
142