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