1609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira/*
2609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira * Copyright (C) 2012 Google Inc.
3609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira * Licensed to The Android Open Source Project.
4609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira *
5609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira * Licensed under the Apache License, Version 2.0 (the "License");
6609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira * you may not use this file except in compliance with the License.
7609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira * You may obtain a copy of the License at
8609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira *
9609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira *      http://www.apache.org/licenses/LICENSE-2.0
10609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira *
11609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira * Unless required by applicable law or agreed to in writing, software
12609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira * distributed under the License is distributed on an "AS IS" BASIS,
13609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira * See the License for the specific language governing permissions and
15609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira * limitations under the License.
16609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira */
17609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira
18609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereirapackage com.android.mail.ui;
19609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira
20609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereiraimport android.app.Activity;
21609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereiraimport android.content.AsyncTaskLoader;
22609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereiraimport android.net.Uri;
23609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira
24609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereiraimport com.android.mail.browse.ConversationCursor;
2551144944c2088299ebc2584cc09c61c23eb18659Marc Blankimport com.android.mail.providers.Account;
2651144944c2088299ebc2584cc09c61c23eb18659Marc Blankimport com.android.mail.providers.UIProvider.AccountCapabilities;
27b184bfe96fa3512af88260fce4f3cee3066fb28dScott Kennedyimport com.android.mail.utils.LogUtils;
28609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira
29bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrookimport java.util.ArrayList;
30bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook
31609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereirapublic class ConversationCursorLoader extends AsyncTaskLoader<ConversationCursor> {
32bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    private static final String TAG = "ConversationCursorLoader";
3351144944c2088299ebc2584cc09c61c23eb18659Marc Blank    private final Uri mUri;
34bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    private final ConversationCursor mConversationCursor;
35bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    private boolean mInit = false;
36bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    private boolean mClosed = false;
37bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    private boolean mRetain = false;
38bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    private boolean mRetained = false;
39bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    private final String mName;
40bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook
417460a1c7b617a6a67d3f24c699d0b16a78a3c02cVikram Aggarwal    /** Only used for debugging. Turn {@link #DEBUG} on to make this useful. */
42d6020119c71ef9fe38725d0f0291cac7b9df6e79Vikram Aggarwal    private static final boolean DEBUG = false;
43bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    private static final ArrayList<ConversationCursorLoader> sLoaders =
44bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            new ArrayList<ConversationCursorLoader>();
45609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira
465bb4d053519be10324752f323bcf73f13b9a2604Andrew Sapperstein    public ConversationCursorLoader(Activity activity, Account account,
475bb4d053519be10324752f323bcf73f13b9a2604Andrew Sapperstein            Uri uri, String name, boolean ignoreInitialConversationLimit) {
48609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira        super(activity);
49bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        mUri = uri;
50bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        mName = name;
515bb4d053519be10324752f323bcf73f13b9a2604Andrew Sapperstein        final boolean useInitialConversationLimit = ignoreInitialConversationLimit ? false :
5251144944c2088299ebc2584cc09c61c23eb18659Marc Blank                account.supportsCapability(AccountCapabilities.INITIAL_CONVERSATION_LIMIT);
53ff5c757ed2bcf7004a70b0675382ef894196558dPaul Westbrook        // Initialize the state of the conversation cursor
54bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        mConversationCursor = new ConversationCursor(
555bb4d053519be10324752f323bcf73f13b9a2604Andrew Sapperstein                activity, mUri, useInitialConversationLimit, name);
56bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        addLoader();
57bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    }
58bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook
59ff8553f20964f4c31b0c503a9e1daff6ae08a9c7Scott Kennedy    private static void dumpLoaders() {
60bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        if (DEBUG) {
61b184bfe96fa3512af88260fce4f3cee3066fb28dScott Kennedy            LogUtils.d(TAG, "Loaders: ");
62bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            for (ConversationCursorLoader loader: sLoaders) {
63b184bfe96fa3512af88260fce4f3cee3066fb28dScott Kennedy                LogUtils.d(TAG, " >> " + loader.mName + " (" + loader.mUri + ")");
64bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            }
65bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        }
66bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    }
67bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook
68bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    private void addLoader() {
69bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        if (DEBUG) {
70b184bfe96fa3512af88260fce4f3cee3066fb28dScott Kennedy            LogUtils.d(TAG, "Add loader: " + mUri);
717460a1c7b617a6a67d3f24c699d0b16a78a3c02cVikram Aggarwal            sLoaders.add(this);
727460a1c7b617a6a67d3f24c699d0b16a78a3c02cVikram Aggarwal            if (sLoaders.size() > 1) {
737460a1c7b617a6a67d3f24c699d0b16a78a3c02cVikram Aggarwal                dumpLoaders();
747460a1c7b617a6a67d3f24c699d0b16a78a3c02cVikram Aggarwal            }
75bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        }
76bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    }
77bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook
78bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    /**
79bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook     * Indicate whether the loader's cursor should be retained after reset
80bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook     * @param state whether this laoder's cursor should be retained
81bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook     */
82bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    public void retainCursor(boolean state) {
83bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        mRetain = state;
84bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    }
85bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook
86bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    @Override
87bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook    public void onReset() {
88bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        if (!mRetain) {
89741846b4b3a33011cf1913a36114b36717b7f848Marc Blank            // Mark the cursor as disabled
90bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            mConversationCursor.disable();
91bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            mClosed = true;
927460a1c7b617a6a67d3f24c699d0b16a78a3c02cVikram Aggarwal            if (DEBUG) {
93b184bfe96fa3512af88260fce4f3cee3066fb28dScott Kennedy                LogUtils.d(TAG, "Reset loader/disable cursor: " + mName);
947460a1c7b617a6a67d3f24c699d0b16a78a3c02cVikram Aggarwal                sLoaders.remove(this);
957460a1c7b617a6a67d3f24c699d0b16a78a3c02cVikram Aggarwal                if (!sLoaders.isEmpty()) {
967460a1c7b617a6a67d3f24c699d0b16a78a3c02cVikram Aggarwal                    dumpLoaders();
977460a1c7b617a6a67d3f24c699d0b16a78a3c02cVikram Aggarwal                }
98bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            }
99bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        } else {
100bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            if (DEBUG) {
101b184bfe96fa3512af88260fce4f3cee3066fb28dScott Kennedy                LogUtils.d(TAG, "Reset loader/retain cursor: " + mName);
102bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook                mRetained = true;
103bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            }
104bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        }
105609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira    }
106609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira
107609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira    @Override
108609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira    public ConversationCursor loadInBackground() {
109bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        if (!mInit) {
110bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            mConversationCursor.load();
111bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            mInit = true;
112bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        }
113bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        return mConversationCursor;
114609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira    }
115609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira
116609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira    @Override
117609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira    protected void onStartLoading() {
118bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        if (mClosed) {
119bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            mClosed = false;
120bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            mConversationCursor.load();
121bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            addLoader();
122bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            if (DEBUG) {
123b184bfe96fa3512af88260fce4f3cee3066fb28dScott Kennedy                LogUtils.d(TAG, "Restarting reset loader: " + mName);
124bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            }
125bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        } else if (mRetained) {
126bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            mRetained = false;
127bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            if (DEBUG) {
128b184bfe96fa3512af88260fce4f3cee3066fb28dScott Kennedy                LogUtils.d(TAG, "Resuming retained loader: " + mName);
129bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook            }
130bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        }
131609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira        forceLoad();
132bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        mConversationCursor.resume();
133609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira    }
134609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira
135609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira    @Override
136609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira    protected void onStopLoading() {
137609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira        cancelLoad();
138bf232c3735f65b1a4746943e4a134e59e36f0bdePaul Westbrook        mConversationCursor.pause();
139609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira    }
140609480e14d4cb999d9b6bb1c224b3584d3f367f0Mindy Pereira}
141