MailPreferenceActivity.java revision e01cc8d461dd0cc3dae8b2f03235c32a0b7f865c
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
207da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport android.app.Fragment;
21e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport android.app.LoaderManager.LoaderCallbacks;
22e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport android.content.CursorLoader;
23e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport android.content.Loader;
24e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport android.database.Cursor;
257da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport android.os.Bundle;
267da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport android.preference.PreferenceActivity;
27e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport android.text.TextUtils;
287da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
297da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport com.android.mail.R;
30e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport com.android.mail.providers.Account;
31e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport com.android.mail.providers.MailAppProvider;
32e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantlerimport com.android.mail.providers.UIProvider;
337da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport com.google.common.annotations.VisibleForTesting;
347da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
357da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport java.lang.ref.WeakReference;
367da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerimport java.util.List;
377da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
387da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantlerpublic class MailPreferenceActivity extends PreferenceActivity {
397da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
40dc24fceb82fa01f7c58abd2a1191f0b2cc64c6faTony Mantler    public static final String PREFERENCE_FRAGMENT_ID = "preference_fragment_id";
41dc24fceb82fa01f7c58abd2a1191f0b2cc64c6faTony Mantler
42e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    private static final int ACCOUNT_LOADER_ID = 0;
43e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
447da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    private WeakReference<GeneralPrefsFragment> mGeneralPrefsFragmentRef;
457da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
46e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    private Cursor mAccountsCursor;
47e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
487da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    @Override
497da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    protected void onCreate(Bundle savedInstanceState) {
507da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler        super.onCreate(savedInstanceState);
51e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
52e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        getLoaderManager().initLoader(ACCOUNT_LOADER_ID, null, new AccountLoaderCallbacks());
53e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    }
54e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
55e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    private class AccountLoaderCallbacks implements LoaderCallbacks<Cursor> {
56e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        @Override
57e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
58e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            return new CursorLoader(MailPreferenceActivity.this,
59e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    MailAppProvider.getAccountsUri(), UIProvider.ACCOUNTS_PROJECTION,
60e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    null, null, null);
61e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        }
62e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
63e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        @Override
64e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
65e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            mAccountsCursor = data;
66e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            invalidateHeaders();
67e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        }
68e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
69e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        @Override
70e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        public void onLoaderReset(Loader<Cursor> loader) {
71e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            mAccountsCursor = null;
72e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            invalidateHeaders();
73e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        }
747da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    }
757da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
767da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    @VisibleForTesting
777da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    GeneralPrefsFragment getGeneralPrefsFragment() {
787da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler        return mGeneralPrefsFragmentRef != null ? mGeneralPrefsFragmentRef.get() : null;
797da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    }
807da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
817da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    @Override
827da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    public void onAttachFragment(Fragment fragment) {
837da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler        super.onAttachFragment(fragment);
847da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler        if (fragment instanceof GeneralPrefsFragment) {
857da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler            mGeneralPrefsFragmentRef =
867da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler                    new WeakReference<GeneralPrefsFragment>((GeneralPrefsFragment) fragment);
877da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler        }
887da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    }
897da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
907da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    @Override
917da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    protected boolean isValidFragment(String fragmentName) {
92e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        // TODO: STOPSHIP fix Email to use the PublicPreferenceActivity trampoline
93e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        return true;
947da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    }
957da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler
967da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    @Override
977da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    public void onBuildHeaders(List<Header> target) {
987da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler        loadHeadersFromResource(R.xml.preference_headers, target);
99e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        if (mAccountsCursor != null && mAccountsCursor.moveToFirst()) {
100e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            do {
101e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                final Account account = new Account(mAccountsCursor);
102e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                if (!TextUtils.isEmpty(account.getEmailAddress())) {
103e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    final Header header = new Header();
104e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    if (TextUtils.isEmpty(account.getDisplayName()) ||
105e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                            TextUtils.equals(account.getDisplayName(), account.getEmailAddress())) {
106e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                        // No (useful) display name, just use the email address
107e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                        header.title = account.getEmailAddress();
108e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    } else {
109e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                        header.title = account.getDisplayName();
110e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                        header.summary = account.getEmailAddress();
111e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    }
112e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    header.fragment = account.settingsFragmentClass;
113e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    final Bundle accountBundle = new Bundle(1);
114e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    accountBundle.putString(MailAccountPrefsFragment.ARG_ACCOUNT_EMAIL,
115e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                            account.getEmailAddress());
116e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    header.fragmentArguments = accountBundle;
117e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
118e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                    target.add(header);
119e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler                }
120e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler            } while (mAccountsCursor.moveToNext());
121e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        }
122e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler        onBuildExtraHeaders(target);
123e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    }
124e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler
125e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    /**
126e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler     * Override this in a subclass to add extra headers besides "General Settings" and accounts
127e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler     * @param target List of headers to mutate
128e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler     */
129e01cc8d461dd0cc3dae8b2f03235c32a0b7f865cTony Mantler    public void onBuildExtraHeaders(List<Header> target) {
1307da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler    }
1317da3422697f511ed4aa8aa73462917fbd0cffabfTony Mantler}
132