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