mirror of
https://github.com/moparisthebest/k-9
synced 2025-02-11 20:50:19 -05:00
FolderMessageList performance improvement from debauchedsloth++ (Partial application of his patch from Issue 285)
This commit is contained in:
parent
92a8c174cc
commit
f2fa5ae2f6
@ -61,6 +61,14 @@ import com.android.email.mail.store.LocalStore;
|
|||||||
import com.android.email.mail.store.LocalStore.LocalFolder;
|
import com.android.email.mail.store.LocalStore.LocalFolder;
|
||||||
import com.android.email.mail.store.LocalStore.LocalMessage;
|
import com.android.email.mail.store.LocalStore.LocalMessage;
|
||||||
|
|
||||||
|
import android.os.PowerManager;
|
||||||
|
import android.os.PowerManager.WakeLock;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
import java.util.concurrent.ThreadPoolExecutor;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FolderMessageList is the primary user interface for the program. This
|
* FolderMessageList is the primary user interface for the program. This
|
||||||
* Activity shows a two level list of the Account's folders and each folder's
|
* Activity shows a two level list of the Account's folders and each folder's
|
||||||
@ -160,6 +168,8 @@ public class FolderMessageList extends ExpandableListActivity
|
|||||||
private boolean sortAscending = true;
|
private boolean sortAscending = true;
|
||||||
private boolean sortDateAscending = false;
|
private boolean sortDateAscending = false;
|
||||||
|
|
||||||
|
private static final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1, 120000L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue());
|
||||||
|
|
||||||
private DateFormat getDateFormat()
|
private DateFormat getDateFormat()
|
||||||
{
|
{
|
||||||
if (dateFormat == null)
|
if (dateFormat == null)
|
||||||
@ -434,7 +444,7 @@ public class FolderMessageList extends ExpandableListActivity
|
|||||||
class FolderUpdateWorker implements Runnable
|
class FolderUpdateWorker implements Runnable
|
||||||
{
|
{
|
||||||
String mFolder;
|
String mFolder;
|
||||||
|
FolderInfoHolder mHolder;
|
||||||
boolean mSynchronizeRemote;
|
boolean mSynchronizeRemote;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -444,9 +454,10 @@ public class FolderMessageList extends ExpandableListActivity
|
|||||||
* @param folder
|
* @param folder
|
||||||
* @param synchronizeRemote
|
* @param synchronizeRemote
|
||||||
*/
|
*/
|
||||||
public FolderUpdateWorker(String folder, boolean synchronizeRemote)
|
public FolderUpdateWorker(FolderInfoHolder folder, boolean synchronizeRemote)
|
||||||
{
|
{
|
||||||
mFolder = folder;
|
mFolder = folder.name;
|
||||||
|
mHolder = folder;
|
||||||
mSynchronizeRemote = synchronizeRemote;
|
mSynchronizeRemote = synchronizeRemote;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -454,35 +465,46 @@ public class FolderMessageList extends ExpandableListActivity
|
|||||||
{
|
{
|
||||||
// Lower our priority
|
// Lower our priority
|
||||||
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
|
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
|
||||||
|
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
|
||||||
|
WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Email - UpdateWorker");
|
||||||
|
wakeLock.setReferenceCounted(false);
|
||||||
|
wakeLock.acquire(Email.WAKE_LOCK_TIMEOUT);
|
||||||
// Synchronously load the list of local messages
|
// Synchronously load the list of local messages
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Store localStore = Store.getInstance(mAccount.getLocalStoreUri(),
|
try
|
||||||
getApplication());
|
|
||||||
LocalFolder localFolder = (LocalFolder) localStore.getFolder(mFolder);
|
|
||||||
if (localFolder.getMessageCount() == 0 && localFolder.getLastChecked() <= 0)
|
|
||||||
{
|
{
|
||||||
mSynchronizeRemote = true;
|
Store localStore = Store.getInstance(mAccount.getLocalStoreUri(),
|
||||||
|
getApplication());
|
||||||
|
LocalFolder localFolder = (LocalFolder) localStore.getFolder(mFolder);
|
||||||
|
if (localFolder.getMessageCount() == 0 && localFolder.getLastChecked() <= 0)
|
||||||
|
{
|
||||||
|
mSynchronizeRemote = true;
|
||||||
|
}
|
||||||
|
} catch (MessagingException me)
|
||||||
|
{
|
||||||
|
Log.e(Email.LOG_TAG,
|
||||||
|
"Unable to get count of local messages for folder " + mFolder, me);
|
||||||
}
|
}
|
||||||
} catch (MessagingException me)
|
|
||||||
{
|
|
||||||
Log.e(Email.LOG_TAG,
|
|
||||||
"Unable to get count of local messages for folder " + mFolder, me);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mSynchronizeRemote)
|
if (mSynchronizeRemote)
|
||||||
{
|
{
|
||||||
// Tell the MessagingController to run a remote update of this folder
|
// Tell the MessagingController to run a remote update of this folder
|
||||||
// at it's leisure
|
// at it's leisure
|
||||||
MessagingController.getInstance(getApplication()).synchronizeMailbox(
|
MessagingController.getInstance(getApplication()).synchronizeMailbox(
|
||||||
mAccount, mFolder, mAdapter.mListener);
|
mAccount, mFolder, mAdapter.mListener);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MessagingController.getInstance(getApplication()).listLocalMessages(
|
MessagingController.getInstance(getApplication()).listLocalMessages(
|
||||||
mAccount, mFolder, mAdapter.mListener);
|
mAccount, mFolder, mAdapter.mListener);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
wakeLock.release();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -689,12 +711,10 @@ public class FolderMessageList extends ExpandableListActivity
|
|||||||
mListView.setSelectionFromTop(position, 0);
|
mListView.setSelectionFromTop(position, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
final FolderInfoHolder folder = (FolderInfoHolder) mAdapter.getGroup(groupPosition);
|
final FolderInfoHolder folder = (FolderInfoHolder)
|
||||||
if (folder.messages.size() == 0 || folder.needsRefresh)
|
mAdapter.getGroup(groupPosition);
|
||||||
{
|
if (folder.messages.size() == 0 || folder.needsRefresh)
|
||||||
folder.needsRefresh = false;
|
threadPool.execute(new FolderUpdateWorker(folder, false));
|
||||||
new Thread(new FolderUpdateWorker(folder.name, false)).start();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1052,6 +1072,7 @@ public class FolderMessageList extends ExpandableListActivity
|
|||||||
holder.message.getFolder().getName(), holder.message, folder.name, null);
|
holder.message.getFolder().getName(), holder.message, folder.name, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void onReply(MessageInfoHolder holder)
|
private void onReply(MessageInfoHolder holder)
|
||||||
{
|
{
|
||||||
MessageCompose.actionReply(this, mAccount, holder.message, false);
|
MessageCompose.actionReply(this, mAccount, holder.message, false);
|
||||||
@ -1319,8 +1340,8 @@ public class FolderMessageList extends ExpandableListActivity
|
|||||||
MessagingController.getInstance(getApplication()).sendPendingMessages(mAccount, null);
|
MessagingController.getInstance(getApplication()).sendPendingMessages(mAccount, null);
|
||||||
break;
|
break;
|
||||||
case R.id.check_mail:
|
case R.id.check_mail:
|
||||||
Log.i(Email.LOG_TAG, "refresh folder " + folder.name);
|
Log.i(Email.LOG_TAG, "refresh folder " + folder.name);
|
||||||
new Thread(new FolderUpdateWorker(folder.name, true)).start();
|
threadPool.execute(new FolderUpdateWorker(folder, true));
|
||||||
break;
|
break;
|
||||||
case R.id.folder_settings:
|
case R.id.folder_settings:
|
||||||
Log.i(Email.LOG_TAG, "edit folder settings for " + folder.name);
|
Log.i(Email.LOG_TAG, "edit folder settings for " + folder.name);
|
||||||
@ -1334,7 +1355,6 @@ public class FolderMessageList extends ExpandableListActivity
|
|||||||
Log.i(Email.LOG_TAG, "mark all unread messages as read " + folder.name);
|
Log.i(Email.LOG_TAG, "mark all unread messages as read " + folder.name);
|
||||||
onMarkAllAsRead(mAccount, folder);
|
onMarkAllAsRead(mAccount, folder);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1400,9 +1420,7 @@ public class FolderMessageList extends ExpandableListActivity
|
|||||||
.getGroup(groupPosition);
|
.getGroup(groupPosition);
|
||||||
|
|
||||||
if (!folder.name.equals(mAccount.getTrashFolderName()))
|
if (!folder.name.equals(mAccount.getTrashFolderName()))
|
||||||
{
|
|
||||||
menu.findItem(R.id.empty_trash).setVisible(false);
|
menu.findItem(R.id.empty_trash).setVisible(false);
|
||||||
}
|
|
||||||
if (folder.outbox)
|
if (folder.outbox)
|
||||||
{
|
{
|
||||||
menu.findItem(R.id.check_mail).setVisible(false);
|
menu.findItem(R.id.check_mail).setVisible(false);
|
||||||
@ -1614,13 +1632,9 @@ public class FolderMessageList extends ExpandableListActivity
|
|||||||
*/
|
*/
|
||||||
for (int i = 0, count = getGroupCount(); i < count; i++)
|
for (int i = 0, count = getGroupCount(); i < count; i++)
|
||||||
{
|
{
|
||||||
if (mListView.isGroupExpanded(i))
|
final FolderInfoHolder folder = (FolderInfoHolder) mAdapter.getGroup(i);
|
||||||
{
|
if(mListView.isGroupExpanded(i))
|
||||||
final FolderInfoHolder folder = (FolderInfoHolder) mAdapter
|
threadPool.execute(new FolderUpdateWorker(folder, mRefreshRemote));
|
||||||
.getGroup(i);
|
|
||||||
new Thread(new FolderUpdateWorker(folder.name, mRefreshRemote))
|
|
||||||
.start();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
mRefreshRemote = false;
|
mRefreshRemote = false;
|
||||||
}
|
}
|
||||||
@ -2268,7 +2282,7 @@ public class FolderMessageList extends ExpandableListActivity
|
|||||||
public boolean lastCheckFailed;
|
public boolean lastCheckFailed;
|
||||||
|
|
||||||
public boolean needsRefresh = false;
|
public boolean needsRefresh = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Outbox is handled differently from any other folder.
|
* Outbox is handled differently from any other folder.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user