mirror of
https://github.com/moparisthebest/k-9
synced 2025-02-17 07:30:16 -05:00
Make MessageListHandler a real Handler that uses Android's message queue
This commit is contained in:
parent
691fb2a84a
commit
75a97a82c0
@ -17,6 +17,7 @@ import android.graphics.Color;
|
|||||||
import android.graphics.Typeface;
|
import android.graphics.Typeface;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
import android.text.Spannable;
|
import android.text.Spannable;
|
||||||
import android.text.SpannableStringBuilder;
|
import android.text.SpannableStringBuilder;
|
||||||
import android.text.style.AbsoluteSizeSpan;
|
import android.text.style.AbsoluteSizeSpan;
|
||||||
@ -348,215 +349,262 @@ public class MessageList
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class MessageListHandler {
|
class MessageListHandler extends Handler {
|
||||||
|
private static final int ACTION_REMOVE_MESSAGES = 1;
|
||||||
|
private static final int ACTION_ADD_MESSAGES = 2;
|
||||||
|
private static final int ACTION_RESET_UNREAD_COUNT = 3;
|
||||||
|
private static final int ACTION_SORT_MESSAGES = 4;
|
||||||
|
private static final int ACTION_FOLDER_LOADING = 5;
|
||||||
|
private static final int ACTION_REFRESH_TITLE = 6;
|
||||||
|
private static final int ACTION_PROGRESS = 7;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param messages Never {@code null}.
|
* @param messages Never {@code null}.
|
||||||
*/
|
*/
|
||||||
public void removeMessages(final List<MessageInfoHolder> messages) {
|
public void removeMessages(final List<MessageInfoHolder> messages) {
|
||||||
if (messages.isEmpty()) {
|
android.os.Message msg = android.os.Message.obtain(this, ACTION_REMOVE_MESSAGES, messages);
|
||||||
return;
|
sendMessage(msg);
|
||||||
}
|
|
||||||
runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
for (MessageInfoHolder message : messages) {
|
|
||||||
if (message != null && (mFolderName == null || (
|
|
||||||
message.folder != null &&
|
|
||||||
message.folder.name.equals(mFolderName)))) {
|
|
||||||
if (message.selected && mSelectedCount > 0) {
|
|
||||||
mSelectedCount--;
|
|
||||||
}
|
|
||||||
mAdapter.messages.remove(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
resetUnreadCountOnThread();
|
|
||||||
|
|
||||||
mAdapter.notifyDataSetChanged();
|
|
||||||
toggleBatchButtons();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param messages Never {@code null}.
|
* @param messages Never {@code null}.
|
||||||
*/
|
*/
|
||||||
public void addMessages(final List<MessageInfoHolder> messages) {
|
public void addMessages(final List<MessageInfoHolder> messages) {
|
||||||
if (messages.isEmpty()) {
|
android.os.Message msg = android.os.Message.obtain(this, ACTION_ADD_MESSAGES, messages);
|
||||||
return;
|
sendMessage(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetUnreadCount() {
|
||||||
|
android.os.Message msg = android.os.Message.obtain(this, ACTION_RESET_UNREAD_COUNT);
|
||||||
|
sendMessage(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sortMessages() {
|
||||||
|
android.os.Message msg = android.os.Message.obtain(this, ACTION_SORT_MESSAGES);
|
||||||
|
sendMessage(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void folderLoading(String folder, boolean loading) {
|
||||||
|
android.os.Message msg = android.os.Message.obtain(this, ACTION_FOLDER_LOADING,
|
||||||
|
(loading) ? 1 : 0, 0, folder);
|
||||||
|
sendMessage(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void refreshTitle() {
|
||||||
|
android.os.Message msg = android.os.Message.obtain(this, ACTION_REFRESH_TITLE);
|
||||||
|
sendMessage(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void progress(final boolean progress) {
|
||||||
|
android.os.Message msg = android.os.Message.obtain(this, ACTION_PROGRESS,
|
||||||
|
(progress) ? 1 : 0, 0);
|
||||||
|
sendMessage(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public void handleMessage(android.os.Message msg) {
|
||||||
|
switch (msg.what) {
|
||||||
|
case ACTION_REMOVE_MESSAGES: {
|
||||||
|
List<MessageInfoHolder> messages = (List<MessageInfoHolder>) msg.obj;
|
||||||
|
MessageList.this.removeMessages(messages);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ACTION_ADD_MESSAGES: {
|
||||||
|
List<MessageInfoHolder> messages = (List<MessageInfoHolder>) msg.obj;
|
||||||
|
MessageList.this.addMessages(messages);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ACTION_RESET_UNREAD_COUNT: {
|
||||||
|
MessageList.this.resetUnreadCount();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ACTION_SORT_MESSAGES: {
|
||||||
|
MessageList.this.sortMessages();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ACTION_FOLDER_LOADING: {
|
||||||
|
String folder = (String) msg.obj;
|
||||||
|
boolean loading = (msg.arg1 == 1);
|
||||||
|
MessageList.this.folderLoading(folder, loading);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ACTION_REFRESH_TITLE: {
|
||||||
|
MessageList.this.refreshTitle();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ACTION_PROGRESS: {
|
||||||
|
boolean progress = (msg.arg1 == 1);
|
||||||
|
MessageList.this.progress(progress);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
final boolean wasEmpty = mAdapter.messages.isEmpty();
|
}
|
||||||
runOnUiThread(new Runnable() {
|
}
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
for (final MessageInfoHolder message : messages) {
|
|
||||||
if (mFolderName == null || (message.folder != null && message.folder.name.equals(mFolderName))) {
|
|
||||||
int index;
|
|
||||||
synchronized (mAdapter.messages) {
|
|
||||||
index = Collections.binarySearch(mAdapter.messages, message, getComparator());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index < 0) {
|
private void removeMessages(final List<MessageInfoHolder> messages) {
|
||||||
index = (index * -1) - 1;
|
if (messages.isEmpty()) {
|
||||||
}
|
return;
|
||||||
|
|
||||||
mAdapter.messages.add(index, message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wasEmpty) {
|
|
||||||
mListView.setSelection(0);
|
|
||||||
}
|
|
||||||
resetUnreadCountOnThread();
|
|
||||||
|
|
||||||
mAdapter.notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resetUnreadCount() {
|
for (MessageInfoHolder message : messages) {
|
||||||
runOnUiThread(new Runnable() {
|
if (message != null && (mFolderName == null || (
|
||||||
@Override
|
message.folder != null &&
|
||||||
public void run() {
|
message.folder.name.equals(mFolderName)))) {
|
||||||
resetUnreadCountOnThread();
|
if (message.selected && mSelectedCount > 0) {
|
||||||
|
mSelectedCount--;
|
||||||
}
|
}
|
||||||
});
|
mAdapter.messages.remove(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resetUnreadCount();
|
||||||
|
|
||||||
|
mAdapter.notifyDataSetChanged();
|
||||||
|
toggleBatchButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addMessages(final List<MessageInfoHolder> messages) {
|
||||||
|
if (messages.isEmpty()) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resetUnreadCountOnThread() {
|
final boolean wasEmpty = mAdapter.messages.isEmpty();
|
||||||
if (mQueryString != null) {
|
|
||||||
int unreadCount = 0;
|
for (final MessageInfoHolder message : messages) {
|
||||||
|
if (mFolderName == null || (message.folder != null && message.folder.name.equals(mFolderName))) {
|
||||||
|
int index;
|
||||||
synchronized (mAdapter.messages) {
|
synchronized (mAdapter.messages) {
|
||||||
for (MessageInfoHolder holder : mAdapter.messages) {
|
index = Collections.binarySearch(mAdapter.messages, message, getComparator());
|
||||||
unreadCount += holder.read ? 0 : 1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
mUnreadMessageCount = unreadCount;
|
|
||||||
refreshTitleOnThread();
|
if (index < 0) {
|
||||||
|
index = (index * -1) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mAdapter.messages.add(index, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sortMessages() {
|
if (wasEmpty) {
|
||||||
final Comparator<MessageInfoHolder> chainComparator = getComparator();
|
mListView.setSelection(0);
|
||||||
|
}
|
||||||
|
resetUnreadCount();
|
||||||
|
|
||||||
runOnUiThread(new Runnable() {
|
mAdapter.notifyDataSetChanged();
|
||||||
@Override
|
}
|
||||||
public void run() {
|
|
||||||
synchronized (mAdapter.messages) {
|
private void resetUnreadCount() {
|
||||||
Collections.sort(mAdapter.messages, chainComparator);
|
if (mQueryString != null) {
|
||||||
}
|
int unreadCount = 0;
|
||||||
mAdapter.notifyDataSetChanged();
|
synchronized (mAdapter.messages) {
|
||||||
|
for (MessageInfoHolder holder : mAdapter.messages) {
|
||||||
|
unreadCount += holder.read ? 0 : 1;
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
mUnreadMessageCount = unreadCount;
|
||||||
|
refreshTitle();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sortMessages() {
|
||||||
|
final Comparator<MessageInfoHolder> chainComparator = getComparator();
|
||||||
|
|
||||||
|
synchronized (mAdapter.messages) {
|
||||||
|
Collections.sort(mAdapter.messages, chainComparator);
|
||||||
|
}
|
||||||
|
mAdapter.notifyDataSetChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The comparator to use to display messages in an ordered
|
||||||
|
* fashion. Never <code>null</code>.
|
||||||
|
*/
|
||||||
|
protected Comparator<MessageInfoHolder> getComparator() {
|
||||||
|
final List<Comparator<MessageInfoHolder>> chain = new ArrayList<Comparator<MessageInfoHolder>>(2 /* we add 2 comparators at most */);
|
||||||
|
|
||||||
|
{
|
||||||
|
// add the specified comparator
|
||||||
|
final Comparator<MessageInfoHolder> comparator = SORT_COMPARATORS.get(mSortType);
|
||||||
|
if (mSortAscending) {
|
||||||
|
chain.add(comparator);
|
||||||
|
} else {
|
||||||
|
chain.add(new ReverseComparator<MessageInfoHolder>(comparator));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
{
|
||||||
* @return The comparator to use to display messages in an ordered
|
// add the date comparator if not already specified
|
||||||
* fashion. Never <code>null</code>.
|
if (mSortType != SortType.SORT_DATE && mSortType != SortType.SORT_ARRIVAL) {
|
||||||
*/
|
final Comparator<MessageInfoHolder> comparator = SORT_COMPARATORS.get(SortType.SORT_DATE);
|
||||||
protected Comparator<MessageInfoHolder> getComparator() {
|
if (mSortDateAscending) {
|
||||||
final List<Comparator<MessageInfoHolder>> chain = new ArrayList<Comparator<MessageInfoHolder>>(2 /* we add 2 comparators at most */);
|
|
||||||
|
|
||||||
{
|
|
||||||
// add the specified comparator
|
|
||||||
final Comparator<MessageInfoHolder> comparator = SORT_COMPARATORS.get(mSortType);
|
|
||||||
if (mSortAscending) {
|
|
||||||
chain.add(comparator);
|
chain.add(comparator);
|
||||||
} else {
|
} else {
|
||||||
chain.add(new ReverseComparator<MessageInfoHolder>(comparator));
|
chain.add(new ReverseComparator<MessageInfoHolder>(comparator));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{
|
// build the comparator chain
|
||||||
// add the date comparator if not already specified
|
final Comparator<MessageInfoHolder> chainComparator = new ComparatorChain<MessageInfoHolder>(chain);
|
||||||
if (mSortType != SortType.SORT_DATE && mSortType != SortType.SORT_ARRIVAL) {
|
|
||||||
final Comparator<MessageInfoHolder> comparator = SORT_COMPARATORS.get(SortType.SORT_DATE);
|
return chainComparator;
|
||||||
if (mSortDateAscending) {
|
}
|
||||||
chain.add(comparator);
|
|
||||||
} else {
|
private void folderLoading(String folder, boolean loading) {
|
||||||
chain.add(new ReverseComparator<MessageInfoHolder>(comparator));
|
if (mCurrentFolder != null && mCurrentFolder.name.equals(folder)) {
|
||||||
}
|
mCurrentFolder.loading = loading;
|
||||||
|
}
|
||||||
|
updateFooterView();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshTitle() {
|
||||||
|
setWindowTitle();
|
||||||
|
setWindowProgress();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setWindowProgress() {
|
||||||
|
int level = Window.PROGRESS_END;
|
||||||
|
|
||||||
|
if (mCurrentFolder != null && mCurrentFolder.loading && mAdapter.mListener.getFolderTotal() > 0) {
|
||||||
|
int divisor = mAdapter.mListener.getFolderTotal();
|
||||||
|
if (divisor != 0) {
|
||||||
|
level = (Window.PROGRESS_END / divisor) * (mAdapter.mListener.getFolderCompleted()) ;
|
||||||
|
if (level > Window.PROGRESS_END) {
|
||||||
|
level = Window.PROGRESS_END;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// build the comparator chain
|
|
||||||
final Comparator<MessageInfoHolder> chainComparator = new ComparatorChain<MessageInfoHolder>(chain);
|
|
||||||
|
|
||||||
return chainComparator;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void folderLoading(String folder, boolean loading) {
|
getWindow().setFeatureInt(Window.FEATURE_PROGRESS, level);
|
||||||
if (mCurrentFolder != null && mCurrentFolder.name.equals(folder)) {
|
}
|
||||||
mCurrentFolder.loading = loading;
|
|
||||||
}
|
|
||||||
runOnUiThread(new Runnable() {
|
|
||||||
@Override public void run() {
|
|
||||||
updateFooterView();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void refreshTitle() {
|
private void setWindowTitle() {
|
||||||
runOnUiThread(new Runnable() {
|
String displayName;
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
refreshTitleOnThread();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void refreshTitleOnThread() {
|
if (mFolderName != null) {
|
||||||
setWindowTitle();
|
displayName = mFolderName;
|
||||||
setWindowProgress();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setWindowProgress() {
|
if (mAccount.getInboxFolderName().equalsIgnoreCase(displayName)) {
|
||||||
int level = Window.PROGRESS_END;
|
displayName = getString(R.string.special_mailbox_name_inbox);
|
||||||
|
} else if (mAccount.getOutboxFolderName().equals(displayName)) {
|
||||||
if (mCurrentFolder != null && mCurrentFolder.loading && mAdapter.mListener.getFolderTotal() > 0) {
|
displayName = getString(R.string.special_mailbox_name_outbox);
|
||||||
int divisor = mAdapter.mListener.getFolderTotal();
|
|
||||||
if (divisor != 0) {
|
|
||||||
level = (Window.PROGRESS_END / divisor) * (mAdapter.mListener.getFolderCompleted()) ;
|
|
||||||
if (level > Window.PROGRESS_END) {
|
|
||||||
level = Window.PROGRESS_END;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getWindow().setFeatureInt(Window.FEATURE_PROGRESS, level);
|
String dispString = mAdapter.mListener.formatHeader(MessageList.this, getString(R.string.message_list_title, mAccount.getDescription(), displayName), mUnreadMessageCount, getTimeFormat());
|
||||||
}
|
setTitle(dispString);
|
||||||
|
} else if (mQueryString != null) {
|
||||||
private void setWindowTitle() {
|
if (mTitle != null) {
|
||||||
String displayName;
|
String dispString = mAdapter.mListener.formatHeader(MessageList.this, mTitle, mUnreadMessageCount, getTimeFormat());
|
||||||
|
|
||||||
if (mFolderName != null) {
|
|
||||||
displayName = mFolderName;
|
|
||||||
|
|
||||||
if (mAccount.getInboxFolderName().equalsIgnoreCase(displayName)) {
|
|
||||||
displayName = getString(R.string.special_mailbox_name_inbox);
|
|
||||||
} else if (mAccount.getOutboxFolderName().equals(displayName)) {
|
|
||||||
displayName = getString(R.string.special_mailbox_name_outbox);
|
|
||||||
}
|
|
||||||
|
|
||||||
String dispString = mAdapter.mListener.formatHeader(MessageList.this, getString(R.string.message_list_title, mAccount.getDescription(), displayName), mUnreadMessageCount, getTimeFormat());
|
|
||||||
setTitle(dispString);
|
setTitle(dispString);
|
||||||
} else if (mQueryString != null) {
|
} else {
|
||||||
if (mTitle != null) {
|
setTitle(getString(R.string.search_results) + ": " + mQueryString);
|
||||||
String dispString = mAdapter.mListener.formatHeader(MessageList.this, mTitle, mUnreadMessageCount, getTimeFormat());
|
|
||||||
setTitle(dispString);
|
|
||||||
} else {
|
|
||||||
setTitle(getString(R.string.search_results) + ": " + mQueryString);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void progress(final boolean progress) {
|
private void progress(final boolean progress) {
|
||||||
runOnUiThread(new Runnable() {
|
showProgressIndicator(progress);
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
showProgressIndicator(progress);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user