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