From 9f14d6b0de74b81f087295bfbaded133f4076dd5 Mon Sep 17 00:00:00 2001 From: Tony Mantler Date: Wed, 13 Aug 2014 14:18:01 -0700 Subject: [PATCH] Extend MailboxSettings to handle full folder list b/16541463 Change-Id: If428413ad258497a5654fa095d51cd60f6ed4e18 --- res/values/strings.xml | 3 + res/xml/account_settings_preferences.xml | 10 +- .../setup/AccountSettingsFragment.java | 31 +++++- .../setup/EmailPreferenceActivity.java | 30 ++---- .../email/activity/setup/MailboxSettings.java | 99 ++++++++++++++++--- 5 files changed, 130 insertions(+), 43 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 9bc0c5943..0e05b1f4e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -822,4 +822,7 @@ Gmail + + + Folder sync settings diff --git a/res/xml/account_settings_preferences.xml b/res/xml/account_settings_preferences.xml index ac443d405..0eba071ca 100755 --- a/res/xml/account_settings_preferences.xml +++ b/res/xml/account_settings_preferences.xml @@ -53,23 +53,23 @@ android:entryValues="@array/account_settings_check_frequency_values" android:dialogTitle="@string/account_settings_mail_check_frequency_label" /> - + @@ -77,7 +77,7 @@ diff --git a/src/com/android/email/activity/setup/AccountSettingsFragment.java b/src/com/android/email/activity/setup/AccountSettingsFragment.java index 61f59aae2..4a9067e78 100644 --- a/src/com/android/email/activity/setup/AccountSettingsFragment.java +++ b/src/com/android/email/activity/setup/AccountSettingsFragment.java @@ -37,9 +37,11 @@ import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceCategory; import android.preference.Preference.OnPreferenceClickListener; +import android.preference.PreferenceScreen; import android.provider.CalendarContract; import android.provider.ContactsContract; import android.provider.Settings; +import android.support.annotation.NonNull; import android.text.TextUtils; import android.view.Menu; import android.view.MenuInflater; @@ -89,6 +91,7 @@ public class AccountSettingsFragment extends MailAccountPrefsFragment private static final String PREFERENCE_QUICK_RESPONSES = "account_quick_responses"; private static final String PREFERENCE_FREQUENCY = "account_check_frequency"; private static final String PREFERENCE_SYNC_WINDOW = "account_sync_window"; + private static final String PREFERENCE_SYNC_SETTINGS = "account_sync_settings"; private static final String PREFERENCE_SYNC_EMAIL = "account_sync_email"; private static final String PREFERENCE_SYNC_CONTACTS = "account_sync_contacts"; private static final String PREFERENCE_SYNC_CALENDAR = "account_sync_calendar"; @@ -121,6 +124,7 @@ public class AccountSettingsFragment extends MailAccountPrefsFragment private EditTextPreference mAccountSignature; private ListPreference mCheckFrequency; private ListPreference mSyncWindow; + private Preference mSyncSettings; private CheckBoxPreference mInboxVibrate; private Preference mInboxRingtone; @@ -211,7 +215,7 @@ public class AccountSettingsFragment extends MailAccountPrefsFragment } @Override - public void onSaveInstanceState(Bundle outstate) { + public void onSaveInstanceState(@NonNull Bundle outstate) { super.onSaveInstanceState(outstate); if (mCheckFrequency != null) { outstate.putCharSequenceArray(SAVESTATE_SYNC_INTERVAL_STRINGS, @@ -269,6 +273,18 @@ public class AccountSettingsFragment extends MailAccountPrefsFragment mInboxRingtone.setSummary(summary); } + @Override + public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, + @NonNull Preference preference) { + final String key = preference.getKey(); + if (key.equals(PREFERENCE_SYNC_SETTINGS)) { + startActivity(MailboxSettings.getIntent(getActivity(), mUiAccount.allFolderListUri)); + return true; + } else { + return super.onPreferenceTreeClick(preferenceScreen, preference); + } + } + /** * Listen to all preference changes in this class. * @param preference The changed Preference @@ -417,7 +433,7 @@ public class AccountSettingsFragment extends MailAccountPrefsFragment @Override public Map loadInBackground() { - final Map map = new HashMap(); + final Map map = new HashMap<>(); final Account account; if (!TextUtils.isEmpty(mAccountEmail)) { @@ -571,7 +587,7 @@ public class AccountSettingsFragment extends MailAccountPrefsFragment @SuppressWarnings("unused") // temporarily unused pending policy UI private ArrayList getSystemPoliciesList(Policy policy) { Resources res = mContext.getResources(); - ArrayList policies = new ArrayList(); + ArrayList policies = new ArrayList<>(); if (policy.mPasswordMode != Policy.PASSWORD_MODE_NONE) { policies.add(res.getString(R.string.policy_require_password)); } @@ -718,6 +734,15 @@ public class AccountSettingsFragment extends MailAccountPrefsFragment // Must correspond to the hole in the XML file that's reserved. mSyncWindow.setOrder(2); mSyncWindow.setOnPreferenceChangeListener(this); + + if (mSyncSettings == null) { + mSyncSettings = new Preference(mContext); + mSyncSettings.setKey(PREFERENCE_SYNC_SETTINGS); + dataUsageCategory.addPreference(mSyncSettings); + } + + mSyncSettings.setTitle(R.string.folder_sync_settings_pref_title); + mSyncSettings.setOrder(3); } final PreferenceCategory folderPrefs = diff --git a/src/com/android/email/activity/setup/EmailPreferenceActivity.java b/src/com/android/email/activity/setup/EmailPreferenceActivity.java index be02bf6bd..4a5dc4ed9 100644 --- a/src/com/android/email/activity/setup/EmailPreferenceActivity.java +++ b/src/com/android/email/activity/setup/EmailPreferenceActivity.java @@ -21,13 +21,13 @@ import android.app.Fragment; import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.support.annotation.NonNull; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import com.android.email.R; import com.android.emailcommon.utility.IntentUtilities; -import com.android.mail.providers.Folder; import com.android.mail.providers.UIProvider.EditSettingsExtras; import com.android.mail.ui.settings.MailPreferenceActivity; import com.android.mail.utils.Utils; @@ -110,8 +110,7 @@ public class EmailPreferenceActivity extends MailPreferenceActivity { // main screen. // android.accounts.Account acct = i.getParcelableExtra("account"); } else if (i.hasExtra(EditSettingsExtras.EXTRA_FOLDER)) { - launchMailboxSettings(i); - return; + throw new IllegalArgumentException("EXTRA_FOLDER is no longer supported"); } else { // Otherwise, we're called from within the Email app and look for our extras final long accountId = IntentUtilities.getAccountIdFromIntent(i); @@ -124,8 +123,11 @@ public class EmailPreferenceActivity extends MailPreferenceActivity { } mShowDebugMenu = i.getBooleanExtra(EXTRA_ENABLE_DEBUG, false); - getActionBar().setDisplayOptions( - ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP); + final ActionBar actionBar = getActionBar(); + if (actionBar != null) { + actionBar.setDisplayOptions( + ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP); + } mFeedbackUri = Utils.getValidUri(getString(R.string.email_feedback_uri)); } @@ -134,7 +136,7 @@ public class EmailPreferenceActivity extends MailPreferenceActivity { * Listen for secret sequence and, if heard, enable debug menu */ @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { + public boolean onKeyDown(int keyCode, @NonNull KeyEvent event) { if (event.getKeyCode() == SECRET_KEY_CODES[mSecretKeyCodeIndex]) { mSecretKeyCodeIndex++; if (mSecretKeyCodeIndex == SECRET_KEY_CODES.length) { @@ -193,20 +195,6 @@ public class EmailPreferenceActivity extends MailPreferenceActivity { return true; } - private void launchMailboxSettings(Intent intent) { - final Folder folder = intent.getParcelableExtra(EditSettingsExtras.EXTRA_FOLDER); - - // TODO: determine from the account if we should navigate to the mailbox settings. - // See bug 6242668 - - // Get the mailbox id from the folder - final long mailboxId = - Long.parseLong(folder.folderUri.fullUri.getPathSegments().get(1)); - - MailboxSettings.start(this, mailboxId); - finish(); - } - private void enableDebugMenu() { mShowDebugMenu = true; invalidateHeaders(); @@ -245,7 +233,7 @@ public class EmailPreferenceActivity extends MailPreferenceActivity { * @param position The header's position in the list. */ @Override - public void onHeaderClick(Header header, int position) { + public void onHeaderClick(@NonNull Header header, int position) { // Secret keys: Click 10x to enable debug settings if (position == 0) { mNumGeneralHeaderClicked++; diff --git a/src/com/android/email/activity/setup/MailboxSettings.java b/src/com/android/email/activity/setup/MailboxSettings.java index 3673ae66f..820f98960 100644 --- a/src/com/android/email/activity/setup/MailboxSettings.java +++ b/src/com/android/email/activity/setup/MailboxSettings.java @@ -17,14 +17,15 @@ package com.android.email.activity.setup; import android.app.ActionBar; -import android.app.Activity; import android.app.LoaderManager; import android.content.ContentUris; import android.content.ContentValues; import android.content.Context; +import android.content.CursorLoader; import android.content.Intent; import android.content.Loader; import android.content.res.Resources; +import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.preference.CheckBoxPreference; @@ -33,6 +34,7 @@ import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; import android.preference.PreferenceActivity; import android.preference.PreferenceFragment; +import android.support.annotation.NonNull; import android.text.TextUtils; import android.view.MenuItem; @@ -45,12 +47,16 @@ import com.android.emailcommon.provider.Mailbox; import com.android.emailcommon.provider.Policy; import com.android.emailcommon.utility.EmailAsyncTask; import com.android.emailcommon.utility.Utility; +import com.android.mail.providers.Folder; +import com.android.mail.providers.UIProvider; import com.android.mail.ui.MailAsyncTaskLoader; import com.android.mail.utils.LogUtils; import com.google.common.base.Preconditions; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -64,18 +70,19 @@ import java.util.Map; * #onDestroy()}, unless it's called for configuration changes. */ public class MailboxSettings extends PreferenceActivity { - private static final String EXTRA_MAILBOX_ID = "MAILBOX_ID"; + private static final String EXTRA_FOLDERS_URI = "FOLDERS_URI"; + + private static final int FOLDERS_LOADER_ID = 0; + private Uri mFoldersUri; + private final List mFolders = new ArrayList<>(); /** - * Starts the activity for a mailbox. + * Starts the activity */ - public static void start(Activity parent, long mailboxId) { - Intent i = new Intent(parent, MailboxSettings.class); - i.putExtra(EXTRA_SHOW_FRAGMENT, MailboxSettingsFragment.class.getName()); - final Bundle b = new Bundle(1); - b.putLong(EXTRA_MAILBOX_ID, mailboxId); - i.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, b); - parent.startActivity(i); + public static Intent getIntent(Context context, Uri foldersUri) { + final Intent i = new Intent(context, MailboxSettings.class); + i.putExtra(EXTRA_FOLDERS_URI, foldersUri); + return i; } @Override @@ -86,11 +93,34 @@ public class MailboxSettings extends PreferenceActivity { if (actionBar != null) { actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP); } + + mFoldersUri = getIntent().getParcelableExtra(EXTRA_FOLDERS_URI); + + if (mFoldersUri != null) { + getLoaderManager().initLoader(FOLDERS_LOADER_ID, null, + new MailboxSettingsFolderLoaderCallbacks()); + } } @Override - public boolean onIsMultiPane() { - return false; + public void onBuildHeaders(List
target) { + if (mFolders.isEmpty()) { + final Header dummy = new Header(); + dummy.titleRes = R.string.mailbox_name_display_inbox; + target.add(dummy); + } else { + for (final Folder f : mFolders) { + final Header h = new Header(); + if (!TextUtils.isEmpty(f.hierarchicalDesc)) { + h.title = f.hierarchicalDesc; + } else { + h.title = f.name; + } + h.fragment = MailboxSettingsFragment.class.getName(); + h.fragmentArguments = MailboxSettingsFragment.getArguments(f.id); + target.add(h); + } + } } @Override @@ -145,7 +175,42 @@ public class MailboxSettings extends PreferenceActivity { pref.setSummary(pref.getEntry()); } + private class MailboxSettingsFolderLoaderCallbacks + implements LoaderManager.LoaderCallbacks { + + @Override + public Loader onCreateLoader(int i, Bundle bundle) { + return new CursorLoader(MailboxSettings.this, mFoldersUri, + UIProvider.FOLDERS_PROJECTION, null, null, null); + } + + @Override + public void onLoadFinished(Loader cursorLoader, Cursor cursor) { + if (cursor == null) { + return; + } + mFolders.clear(); + + while(cursor.moveToNext()) { + final Folder folder = new Folder(cursor); + if (!folder.supportsCapability(UIProvider.FolderCapabilities.IS_VIRTUAL) && + !folder.isTrash() && !folder.isDraft() && !folder.isOutbox()) { + mFolders.add(folder); + } + } + + invalidateHeaders(); + } + + @Override + public void onLoaderReset(Loader cursorLoader) { + mFolders.clear(); + } + } + public static class MailboxSettingsFragment extends PreferenceFragment { + private static final String EXTRA_MAILBOX_ID = "MailboxId"; + private static final String BUNDLE_MAILBOX = "MailboxSettings.mailbox"; private static final String BUNDLE_MAX_LOOKBACK = "MailboxSettings.maxLookback"; private static final String BUNDLE_SYNC_ENABLED_VALUE = "MailboxSettings.syncEnabled"; @@ -161,6 +226,12 @@ public class MailboxSettings extends PreferenceActivity { private CheckBoxPreference mSyncEnabledPref; private ListPreference mSyncLookbackPref; + private static Bundle getArguments(long mailboxId) { + final Bundle b = new Bundle(1); + b.putLong(EXTRA_MAILBOX_ID, mailboxId); + return b; + } + public MailboxSettingsFragment() {} @Override @@ -198,7 +269,7 @@ public class MailboxSettings extends PreferenceActivity { } @Override - public void onSaveInstanceState(Bundle outState) { + public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(BUNDLE_MAILBOX, mMailbox); outState.putInt(BUNDLE_MAX_LOOKBACK, mMaxLookback); @@ -240,7 +311,7 @@ public class MailboxSettings extends PreferenceActivity { @Override public Map loadInBackground() { - final Map result = new HashMap(); + final Map result = new HashMap<>(); final Mailbox mailbox = Mailbox.restoreMailboxWithId(getContext(), mMailboxId); result.put(RESULT_KEY_MAILBOX, mailbox);