11ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki/* 21ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * Copyright (C) 2011 The Android Open Source Project 31ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * 41ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 51ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * you may not use this file except in compliance with the License. 61ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * You may obtain a copy of the License at 71ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * 81ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 91ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * 101ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * Unless required by applicable law or agreed to in writing, software 111ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 121ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * See the License for the specific language governing permissions and 141ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * limitations under the License. 151ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki */ 161ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 171ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onukipackage com.android.email.activity.setup; 181ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 196be8cceaddb93f5f9467854c8d11fa518e95c52bBen Komaloimport android.app.ActionBar; 2010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantlerimport android.app.LoaderManager; 211ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onukiimport android.content.ContentUris; 221ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onukiimport android.content.ContentValues; 231ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onukiimport android.content.Context; 249f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantlerimport android.content.CursorLoader; 251ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onukiimport android.content.Intent; 2610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantlerimport android.content.Loader; 27919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blankimport android.content.res.Resources; 289f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantlerimport android.database.Cursor; 291ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onukiimport android.net.Uri; 301ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onukiimport android.os.Bundle; 31038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Huimport android.preference.CheckBoxPreference; 321ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onukiimport android.preference.ListPreference; 331ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onukiimport android.preference.Preference; 341ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onukiimport android.preference.Preference.OnPreferenceChangeListener; 351ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onukiimport android.preference.PreferenceActivity; 3610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantlerimport android.preference.PreferenceFragment; 379f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantlerimport android.support.annotation.NonNull; 3810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantlerimport android.text.TextUtils; 396be8cceaddb93f5f9467854c8d11fa518e95c52bBen Komaloimport android.view.MenuItem; 406be8cceaddb93f5f9467854c8d11fa518e95c52bBen Komalo 416be8cceaddb93f5f9467854c8d11fa518e95c52bBen Komaloimport com.android.email.R; 426be8cceaddb93f5f9467854c8d11fa518e95c52bBen Komaloimport com.android.emailcommon.Logging; 436be8cceaddb93f5f9467854c8d11fa518e95c52bBen Komaloimport com.android.emailcommon.provider.Account; 443dd85723a1af5537e23e4b05bdc361cce9cd42beTony Mantlerimport com.android.emailcommon.provider.EmailContent.AccountColumns; 456be8cceaddb93f5f9467854c8d11fa518e95c52bBen Komaloimport com.android.emailcommon.provider.EmailContent.MailboxColumns; 466be8cceaddb93f5f9467854c8d11fa518e95c52bBen Komaloimport com.android.emailcommon.provider.Mailbox; 47f419287f22ae44f25e1ba1f757ec33c7941bbfa8Marc Blankimport com.android.emailcommon.provider.Policy; 486be8cceaddb93f5f9467854c8d11fa518e95c52bBen Komaloimport com.android.emailcommon.utility.EmailAsyncTask; 49038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Huimport com.android.emailcommon.utility.Utility; 509f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantlerimport com.android.mail.providers.Folder; 519f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantlerimport com.android.mail.providers.UIProvider; 5210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantlerimport com.android.mail.ui.MailAsyncTaskLoader; 53560bfadc3151f7a06f3b06e9a6c92cfa534c63ecScott Kennedyimport com.android.mail.utils.LogUtils; 546be8cceaddb93f5f9467854c8d11fa518e95c52bBen Komaloimport com.google.common.base.Preconditions; 551ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 569f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantlerimport java.util.ArrayList; 5721b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Huimport java.util.Arrays; 5810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantlerimport java.util.HashMap; 599f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantlerimport java.util.List; 6010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantlerimport java.util.Map; 6121b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu 621ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki/** 631ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * "Mailbox settings" activity. 641ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * 651ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * It's used to update per-mailbox sync settings. It normally updates Mailbox settings, unless 661ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * the target mailbox is Inbox, in which case it updates Account settings instead. 671ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * 681ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * All changes made by the user will not be immediately saved to the database, as changing the 691ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * sync window may result in removal of messages. Instead, we only save to the database in {@link 701ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki * #onDestroy()}, unless it's called for configuration changes. 711ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki */ 721ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onukipublic class MailboxSettings extends PreferenceActivity { 739f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler private static final String EXTRA_FOLDERS_URI = "FOLDERS_URI"; 74ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler private static final String EXTRA_INBOX_ID = "INBOX_ID"; 759f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler 769f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler private static final int FOLDERS_LOADER_ID = 0; 779f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler private Uri mFoldersUri; 78ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler private int mInboxId; 799f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler private final List<Folder> mFolders = new ArrayList<>(); 801ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 811ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki /** 829f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler * Starts the activity 831ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki */ 84ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler public static Intent getIntent(Context context, Uri foldersUri, Folder inbox) { 859f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler final Intent i = new Intent(context, MailboxSettings.class); 869f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler i.putExtra(EXTRA_FOLDERS_URI, foldersUri); 87ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler i.putExtra(EXTRA_INBOX_ID, inbox.id); 889f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler return i; 891ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki } 901ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 911ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki @Override 921ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki protected void onCreate(Bundle savedInstanceState) { 93ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler // This needs to happen before super.onCreate() since that calls onBuildHeaders() 94ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler mInboxId = getIntent().getIntExtra(EXTRA_INBOX_ID, -1); 959f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler mFoldersUri = getIntent().getParcelableExtra(EXTRA_FOLDERS_URI); 969f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler 979f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler if (mFoldersUri != null) { 989f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler getLoaderManager().initLoader(FOLDERS_LOADER_ID, null, 999f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler new MailboxSettingsFolderLoaderCallbacks()); 1009f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } 101ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler 102ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler super.onCreate(savedInstanceState); 103ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler 104ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler // Always show "app up" as we expect our parent to be an Email activity. 105ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler ActionBar actionBar = getActionBar(); 106ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler if (actionBar != null) { 107ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP, ActionBar.DISPLAY_HOME_AS_UP); 1088c6a01f876ae015167dd7b3097453ef97e4c2ae3Tony Mantler // Hide the app icon. 1098c6a01f876ae015167dd7b3097453ef97e4c2ae3Tony Mantler actionBar.setIcon(android.R.color.transparent); 1108c6a01f876ae015167dd7b3097453ef97e4c2ae3Tony Mantler actionBar.setDisplayUseLogoEnabled(false); 111ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler } 1121ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki } 1131ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 1141ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki @Override 1159f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler public void onBuildHeaders(List<Header> target) { 1169f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler if (mFolders.isEmpty()) { 1179f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler final Header dummy = new Header(); 1189f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler dummy.titleRes = R.string.mailbox_name_display_inbox; 119ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler dummy.fragment = MailboxSettingsFragment.class.getName(); 120ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler dummy.fragmentArguments = MailboxSettingsFragment.getArguments(mInboxId); 1219f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler target.add(dummy); 1229f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } else { 1239f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler for (final Folder f : mFolders) { 1249f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler final Header h = new Header(); 1259f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler if (!TextUtils.isEmpty(f.hierarchicalDesc)) { 1269f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler h.title = f.hierarchicalDesc; 1279f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } else { 1289f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler h.title = f.name; 1299f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } 1309f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler h.fragment = MailboxSettingsFragment.class.getName(); 1319f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler h.fragmentArguments = MailboxSettingsFragment.getArguments(f.id); 132ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler if (f.id == mInboxId) { 133ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler target.add(0, h); 134ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler } else { 135ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler target.add(h); 136ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler } 1379f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } 1389f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } 1391ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki } 1401ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 1411ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki @Override 14210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler protected boolean isValidFragment(String fragmentName) { 143ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler // Activity is not exported 144ac4b0efd9fa89f68b1a8b9794bf5c958666f7eb8Tony Mantler return true; 1451ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki } 1461ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 14710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler @Override 14810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler public boolean onOptionsItemSelected(MenuItem item) { 14910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler if (item.getItemId() == android.R.id.home) { 15010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler onBackPressed(); 15110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler return true; 1521ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki } 15310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler return super.onOptionsItemSelected(item); 1541ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki } 1551ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 1561ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki /** 157919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank * Setup the entries and entry values for the sync lookback preference 158919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank * @param context the caller's context 159919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank * @param pref a ListPreference to be set up 160038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu * @param maxLookback The maximum lookback allowed, or 0 if no max. 16121b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu * @param showWithDefault Whether to show the version with default, or without. 162919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank */ 16321b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu public static void setupLookbackPreferenceOptions(final Context context, 164038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu final ListPreference pref, final int maxLookback, final boolean showWithDefault) { 16521b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu final Resources resources = context.getResources(); 166919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank // Load the complete list of entries/values 16721b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu CharSequence[] entries; 16821b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu CharSequence[] values; 16921b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu final int offset; 17021b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu if (showWithDefault) { 17121b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu entries = resources.getTextArray( 17221b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu R.array.account_settings_mail_window_entries_with_default); 17321b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu values = resources.getTextArray( 17421b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu R.array.account_settings_mail_window_values_with_default); 17521b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu offset = 1; 17621b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu } else { 17721b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu entries = resources.getTextArray(R.array.account_settings_mail_window_entries); 17821b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu values = resources.getTextArray(R.array.account_settings_mail_window_values); 17921b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu offset = 0; 18021b2522d7f6b2bce8fc3382e6e532d4b4df1b140Yu Ping Hu } 181919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank // If we have a maximum lookback policy, enforce it 182038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu if (maxLookback > 0) { 183038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu final int size = maxLookback + offset; 184038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu entries = Arrays.copyOf(entries, size); 185038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu values = Arrays.copyOf(values, size); 186919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank } 187919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank // Set up the preference 188919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank pref.setEntries(entries); 189919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank pref.setEntryValues(values); 190038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu pref.setSummary(pref.getEntry()); 191919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank } 192919e59044b5c6a3d3947af05ddf241f51f65def4Marc Blank 1939f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler private class MailboxSettingsFolderLoaderCallbacks 1949f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler implements LoaderManager.LoaderCallbacks<Cursor> { 1959f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler 1969f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler @Override 1979f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { 1989f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler return new CursorLoader(MailboxSettings.this, mFoldersUri, 1999f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler UIProvider.FOLDERS_PROJECTION, null, null, null); 2009f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } 2019f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler 2029f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler @Override 2039f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { 2049f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler if (cursor == null) { 2059f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler return; 2069f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } 2079f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler mFolders.clear(); 2089f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler 2099f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler while(cursor.moveToNext()) { 2109f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler final Folder folder = new Folder(cursor); 2119f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler if (!folder.supportsCapability(UIProvider.FolderCapabilities.IS_VIRTUAL) && 2129f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler !folder.isTrash() && !folder.isDraft() && !folder.isOutbox()) { 2139f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler mFolders.add(folder); 2149f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } 2159f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } 2169f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler 2179f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler invalidateHeaders(); 2189f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } 2199f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler 2209f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler @Override 2219f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler public void onLoaderReset(Loader<Cursor> cursorLoader) { 2229f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler mFolders.clear(); 2239f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } 2249f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } 2259f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler 22610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler public static class MailboxSettingsFragment extends PreferenceFragment { 2279f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler private static final String EXTRA_MAILBOX_ID = "MailboxId"; 2289f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler 22910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private static final String BUNDLE_MAILBOX = "MailboxSettings.mailbox"; 23010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private static final String BUNDLE_MAX_LOOKBACK = "MailboxSettings.maxLookback"; 23110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private static final String BUNDLE_SYNC_ENABLED_VALUE = "MailboxSettings.syncEnabled"; 23210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private static final String BUNDLE_SYNC_WINDOW_VALUE = "MailboxSettings.syncWindow"; 2331ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 23410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private static final String PREF_SYNC_ENABLED_KEY = "sync_enabled"; 23510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private static final String PREF_SYNC_WINDOW_KEY = "sync_window"; 23610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 23710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private Mailbox mMailbox; 23810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler /** The maximum lookback allowed for this mailbox, or 0 if no max. */ 23910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private int mMaxLookback; 24010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 24110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private CheckBoxPreference mSyncEnabledPref; 24210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private ListPreference mSyncLookbackPref; 24310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 2449f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler private static Bundle getArguments(long mailboxId) { 2459f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler final Bundle b = new Bundle(1); 2469f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler b.putLong(EXTRA_MAILBOX_ID, mailboxId); 2479f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler return b; 2489f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler } 2499f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler 25010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler public MailboxSettingsFragment() {} 25110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 25210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler @Override 25310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler public void onActivityCreated(Bundle savedInstanceState) { 25410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler super.onActivityCreated(savedInstanceState); 25510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler final long mailboxId = getArguments().getLong(EXTRA_MAILBOX_ID, Mailbox.NO_MAILBOX); 25610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler if (mailboxId == Mailbox.NO_MAILBOX) { 25710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler getActivity().finish(); 25810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 25910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 26010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler addPreferencesFromResource(R.xml.mailbox_preferences); 26110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 26210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mSyncEnabledPref = (CheckBoxPreference) findPreference(PREF_SYNC_ENABLED_KEY); 26310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mSyncLookbackPref = (ListPreference) findPreference(PREF_SYNC_WINDOW_KEY); 26410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 26510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mSyncLookbackPref.setOnPreferenceChangeListener(mPreferenceChanged); 26610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 26710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler if (savedInstanceState != null) { 26810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mMailbox = savedInstanceState.getParcelable(BUNDLE_MAILBOX); 26910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mMaxLookback = savedInstanceState.getInt(BUNDLE_MAX_LOOKBACK); 27010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mSyncEnabledPref 27110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler .setChecked(savedInstanceState.getBoolean(BUNDLE_SYNC_ENABLED_VALUE)); 27210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mSyncLookbackPref.setValue(savedInstanceState.getString(BUNDLE_SYNC_WINDOW_VALUE)); 27310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler onDataLoaded(); 27410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } else { 27510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler // Make them disabled until we load data 27610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler enablePreferences(false); 27710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler getLoaderManager().initLoader(0, getArguments(), new MailboxLoaderCallbacks()); 27810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 2796be8cceaddb93f5f9467854c8d11fa518e95c52bBen Komalo } 2806be8cceaddb93f5f9467854c8d11fa518e95c52bBen Komalo 28110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private void enablePreferences(boolean enabled) { 28210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mSyncEnabledPref.setEnabled(enabled); 28310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mSyncLookbackPref.setEnabled(enabled); 28410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 2851ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 28610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler @Override 2879f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler public void onSaveInstanceState(@NonNull Bundle outState) { 28810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler super.onSaveInstanceState(outState); 28910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler outState.putParcelable(BUNDLE_MAILBOX, mMailbox); 29010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler outState.putInt(BUNDLE_MAX_LOOKBACK, mMaxLookback); 29110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler outState.putBoolean(BUNDLE_SYNC_ENABLED_VALUE, mSyncEnabledPref.isChecked()); 29210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler outState.putString(BUNDLE_SYNC_WINDOW_VALUE, mSyncLookbackPref.getValue()); 29310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 2941ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 29510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler /** 29610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler * We save all the settings in onDestroy, *unless it's for configuration changes*. 29710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler */ 2981ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki @Override 29910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler public void onDestroy() { 30010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler super.onDestroy(); 30110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler if (!getActivity().isChangingConfigurations()) { 30210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler saveToDatabase(); 30310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 3041ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki } 3051ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 30610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private static class MailboxLoader extends MailAsyncTaskLoader<Map<String, Object>> { 30710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler /** Projection for loading an account's policy key. */ 30810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private static final String[] POLICY_KEY_PROJECTION = 3093dd85723a1af5537e23e4b05bdc361cce9cd42beTony Mantler { AccountColumns.POLICY_KEY }; 31010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private static final int POLICY_KEY_COLUMN = 0; 31110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 31210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler /** Projection for loading the max email lookback. */ 31310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private static final String[] MAX_EMAIL_LOOKBACK_PROJECTION = 31410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler { Policy.MAX_EMAIL_LOOKBACK }; 31510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private static final int MAX_EMAIL_LOOKBACK_COLUMN = 0; 31610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 31710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler public static final String RESULT_KEY_MAILBOX = "mailbox"; 31810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler public static final String RESULT_KEY_MAX_LOOKBACK = "maxLookback"; 31910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 32010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private final long mMailboxId; 32110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 32210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private MailboxLoader(Context context, long mailboxId) { 32310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler super(context); 32410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mMailboxId = mailboxId; 32510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 32610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 32710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler @Override 32810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler public Map<String, Object> loadInBackground() { 3299f14d6b0de74b81f087295bfbaded133f4076dd5Tony Mantler final Map<String, Object> result = new HashMap<>(); 33010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 33110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler final Mailbox mailbox = Mailbox.restoreMailboxWithId(getContext(), mMailboxId); 33210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler result.put(RESULT_KEY_MAILBOX, mailbox); 33310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler result.put(RESULT_KEY_MAX_LOOKBACK, 0); 33410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 33510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler if (mailbox == null) { 33610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler return result; 33710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 33810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 33910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler // Get the max lookback from our policy, if we have one. 34010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler final Long policyKey = Utility.getFirstRowLong(getContext(), 34110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler ContentUris.withAppendedId(Account.CONTENT_URI, mailbox.mAccountKey), 34210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler POLICY_KEY_PROJECTION, null, null, null, POLICY_KEY_COLUMN); 34310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler if (policyKey == null) { 34410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler // No policy, nothing to look up. 34510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler return result; 34610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 34710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 34810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler final int maxLookback = Utility.getFirstRowInt(getContext(), 34910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler ContentUris.withAppendedId(Policy.CONTENT_URI, policyKey), 35010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler MAX_EMAIL_LOOKBACK_PROJECTION, null, null, null, 35110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler MAX_EMAIL_LOOKBACK_COLUMN, 0); 35210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler result.put(RESULT_KEY_MAX_LOOKBACK, maxLookback); 35310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 35410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler return result; 35510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 35610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 35710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler @Override 35810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler protected void onDiscardResult(Map<String, Object> result) {} 35910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 36010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 36110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private class MailboxLoaderCallbacks 36210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler implements LoaderManager.LoaderCallbacks<Map<String, Object>> { 36310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler @Override 36410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler public Loader<Map<String, Object>> onCreateLoader(int id, Bundle args) { 36510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler final long mailboxId = args.getLong(EXTRA_MAILBOX_ID); 36610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler return new MailboxLoader(getActivity(), mailboxId); 36710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 36810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 36910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler @Override 37010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler public void onLoadFinished(Loader<Map<String, Object>> loader, 37110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler Map<String, Object> data) { 37210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler final Mailbox mailbox = (Mailbox) 37310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler (data == null ? null : data.get(MailboxLoader.RESULT_KEY_MAILBOX)); 37410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler if (mailbox == null) { 37510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler getActivity().finish(); 37610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler return; 37710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 37810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 37910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mMailbox = mailbox; 38010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mMaxLookback = (Integer) data.get(MailboxLoader.RESULT_KEY_MAX_LOOKBACK); 38110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 38210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mSyncEnabledPref.setChecked(mMailbox.mSyncInterval != 0); 38310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mSyncLookbackPref.setValue(String.valueOf(mMailbox.mSyncLookback)); 38410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler onDataLoaded(); 38510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler if (mMailbox.mType != Mailbox.TYPE_DRAFTS) { 38610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler enablePreferences(true); 38710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 38810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 38910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 39010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler @Override 39110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler public void onLoaderReset(Loader<Map<String, Object>> loader) {} 39210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 39310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 39410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler /** 39510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler * Called when {@link #mMailbox} is loaded (either by the loader or from the saved state). 39610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler */ 39710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private void onDataLoaded() { 39810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler Preconditions.checkNotNull(mMailbox); 39910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 40010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler // Update the title with the mailbox name. 40110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler final ActionBar actionBar = getActivity().getActionBar(); 40210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler final String mailboxName = mMailbox.mDisplayName; 40310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler if (actionBar != null) { 40410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler actionBar.setTitle(mailboxName); 40510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler actionBar.setSubtitle(getString(R.string.mailbox_settings_activity_title)); 40610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } else { 40710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler getActivity().setTitle( 40810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler getString(R.string.mailbox_settings_activity_title_with_mailbox, 40910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mailboxName)); 41010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 41110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 41210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler MailboxSettings.setupLookbackPreferenceOptions(getActivity(), mSyncLookbackPref, 41310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mMaxLookback, true); 41410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 4151ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki 416038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu 41710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private final OnPreferenceChangeListener mPreferenceChanged = 41810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler new OnPreferenceChangeListener() { 41910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler @Override 42010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler public boolean onPreferenceChange(Preference preference, Object newValue) { 42110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mSyncLookbackPref.setValue((String) newValue); 42210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler mSyncLookbackPref.setSummary(mSyncLookbackPref.getEntry()); 42310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler return false; 42410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 42510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler }; 42610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 42710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler /** 42810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler * Save changes to the database. 42910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler * 43010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler * Note it's called from {@link #onDestroy()}, which is called on the UI thread where we're 43110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler * not allowed to touch the database, so it uses {@link EmailAsyncTask} to do the save on a 43210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler * bg thread. This unfortunately means there's a chance that the app gets killed before the 43310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler * save is finished. 43410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler */ 43510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler private void saveToDatabase() { 43610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler if (mMailbox == null) { 43710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler // We haven't loaded yet, nothing to save. 43810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler return; 43910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 44010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler final int syncInterval = mSyncEnabledPref.isChecked() ? 1 : 0; 44110e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler final int syncLookback = Integer.valueOf(mSyncLookbackPref.getValue()); 44210e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 44310e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler final boolean syncIntervalChanged = syncInterval != mMailbox.mSyncInterval; 44410e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler final boolean syncLookbackChanged = syncLookback != mMailbox.mSyncLookback; 44510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 44610e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler // Only save if a preference has changed value. 44710e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler if (!syncIntervalChanged && !syncLookbackChanged) { 44810e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler return; 44910e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler } 45010e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler 451038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu LogUtils.i(Logging.LOG_TAG, "Saving mailbox settings..."); 452038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu enablePreferences(false); 453038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu 454038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu final long id = mMailbox.mId; 45510e9bd96dedde211a6d5720a8fe74b70343a26afTony Mantler final Context context = getActivity().getApplicationContext(); 456038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu 457038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu new EmailAsyncTask<Void, Void, Void> (null /* no cancel */) { 458038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu @Override 459038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu protected Void doInBackground(Void... params) { 460038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu final ContentValues cv = new ContentValues(2); 461038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu final Uri uri; 462038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu if (syncIntervalChanged) { 463038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu cv.put(MailboxColumns.SYNC_INTERVAL, syncInterval); 464038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu } 465038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu if (syncLookbackChanged) { 466038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu cv.put(MailboxColumns.SYNC_LOOKBACK, syncLookback); 467038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu } 468038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu uri = ContentUris.withAppendedId(Mailbox.CONTENT_URI, id); 469038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu context.getContentResolver().update(uri, cv, null, null); 470038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu 471038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu LogUtils.i(Logging.LOG_TAG, "Saved: " + uri); 472038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu return null; 473038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu } 474038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu }.executeSerial((Void [])null); 475038924037bbaae4a62fb167e5ce7ae9e34a129fcYu Ping Hu } 4761ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki } 4771ddc2ca4a7e59189099d273bd1d364838dd7ce35Makoto Onuki} 478