1
0
mirror of https://github.com/moparisthebest/k-9 synced 2024-11-30 13:12:25 -05:00

Implements new "Batch ops" option menu in Message List. Provides for

flag/unflag, mark as read/unread and delete.  Also provides explicit
mode changing, and select/deselect all.  Move and copy are partially
implemented, but disabled.

Desperately needs a new icon.

The "Sort by..." menu now toggles ascending/descending when the
currently selected sort mode is clicked.

Also, an ineffective change to setting the title in the Message List.
A bit more work is in order on that.
This commit is contained in:
Daniel Applebaum 2009-12-10 05:26:16 +00:00
parent 5b1c5b2289
commit 0cd2dfb77d
3 changed files with 327 additions and 55 deletions

View File

@ -38,10 +38,60 @@
</menu> </menu>
</item> </item>
<item <item
android:id="@+id/reverse_sort" android:id="@+id/batch_ops"
android:title="@string/reverse_sort_action" android:title="@string/batch_ops"
android:icon="@drawable/ic_menu_reverse_sort" android:icon="@drawable/ic_menu_reverse_sort">
<menu>
<item
android:id="@+id/batch_delete_op"
android:title="@string/batch_delete_op"
/> />
<item
android:id="@+id/batch_mark_read_op"
android:title="@string/batch_mark_read_op"
/>
<item
android:id="@+id/batch_flag_op"
android:title="@string/batch_flag_op"
/>
<item
android:id="@+id/batch_mark_unread_op"
android:title="@string/batch_mark_unread_op"
/>
<item
android:id="@+id/batch_unflag_op"
android:title="@string/batch_unflag_op"
/>
<item
android:id="@+id/batch_move_op"
android:title="@string/batch_move_op"
/>
<item
android:id="@+id/batch_copy_op"
android:title="@string/batch_copy_op"
/>
<item
android:id="@+id/batch_flag_mode"
android:title="@string/batch_flag_mode"
/>
<item
android:id="@+id/batch_select_mode"
android:title="@string/batch_select_mode"
/>
<item
android:id="@+id/batch_plain_mode"
android:title="@string/batch_plain_mode"
/>
<item
android:id="@+id/batch_select_all"
android:title="@string/batch_select_all"
/>
<item
android:id="@+id/batch_deselect_all"
android:title="@string/batch_deselect_all"
/>
</menu>
</item>
<item <item
android:id="@+id/list_folders" android:id="@+id/list_folders"
android:alphabeticShortcut="f" android:alphabeticShortcut="f"

View File

@ -573,5 +573,18 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
<string name="date_format_common">dd-MMM-yyyy</string> <string name="date_format_common">dd-MMM-yyyy</string>
<string name="date_format_iso8601">yyyy-MM-dd</string> <string name="date_format_iso8601">yyyy-MM-dd</string>
<string name="batch_ops">Batch Ops</string>
<string name="batch_delete_op">Delete selected</string>
<string name="batch_mark_read_op">Mark selected read</string>
<string name="batch_mark_unread_op">Mark selected unread</string>
<string name="batch_flag_op">Flag selected</string>
<string name="batch_unflag_op">Unflag selected</string>
<string name="batch_move_op">Move selected</string>
<string name="batch_copy_op">Copy selected</string>
<string name="batch_flag_mode">Star mode</string>
<string name="batch_select_mode">Select mode</string>
<string name="batch_plain_mode">Plain mode</string>
<string name="batch_select_all">Select all</string>
<string name="batch_deselect_all">Deselect all</string>
</resources> </resources>

View File

@ -434,6 +434,7 @@ public class MessageList
onRestoreListState(savedInstanceState); onRestoreListState(savedInstanceState);
} }
setTitle();
} }
private void onRestoreListState(Bundle savedInstanceState) private void onRestoreListState(Bundle savedInstanceState)
@ -485,13 +486,17 @@ public class MessageList
notifMgr.cancel(mAccount.getAccountNumber()); notifMgr.cancel(mAccount.getAccountNumber());
notifMgr.cancel(-1000 - mAccount.getAccountNumber()); notifMgr.cancel(-1000 - mAccount.getAccountNumber());
setTitle();
}
private void setTitle()
{
setTitle( setTitle(
mAccount.getDescription() mAccount.getDescription()
+ " - " + + " - " +
mCurrentFolder.displayName mCurrentFolder.displayName
); );
} }
@Override @Override
@ -702,13 +707,11 @@ public class MessageList
case WIDGET_FLAG: case WIDGET_FLAG:
{ {
mSelectedWidget = WIDGET_MULTISELECT; mSelectedWidget = WIDGET_MULTISELECT;
showBatchButtons();
break; break;
} }
case WIDGET_MULTISELECT: case WIDGET_MULTISELECT:
{ {
mSelectedWidget = WIDGET_NONE; mSelectedWidget = WIDGET_NONE;
hideBatchButtons();
break; break;
} }
case WIDGET_NONE: case WIDGET_NONE:
@ -731,13 +734,11 @@ public class MessageList
case WIDGET_NONE: case WIDGET_NONE:
{ {
mSelectedWidget=WIDGET_MULTISELECT; mSelectedWidget=WIDGET_MULTISELECT;
showBatchButtons();
break; break;
} }
case WIDGET_MULTISELECT: case WIDGET_MULTISELECT:
{ {
mSelectedWidget=WIDGET_FLAG; mSelectedWidget=WIDGET_FLAG;
hideBatchButtons();
break; break;
} }
@ -745,6 +746,24 @@ public class MessageList
} }
configureWidgets();
}
private void configureWidgets()
{
switch (mSelectedWidget)
{
case WIDGET_FLAG:
hideBatchButtons();
break;
case WIDGET_NONE:
hideBatchButtons();
break;
case WIDGET_MULTISELECT:
showBatchButtons();
break;
}
int count = mListView.getChildCount(); int count = mListView.getChildCount();
for (int i=0; i<count; i++) for (int i=0; i<count; i++)
@ -810,6 +829,12 @@ public class MessageList
} }
private void changeSort(SORT_TYPE newSortType) private void changeSort(SORT_TYPE newSortType)
{
if (sortType == newSortType)
{
onToggleSortAscending();
}
else
{ {
sortType = newSortType; sortType = newSortType;
MessagingController.getInstance(getApplication()).setSortType(sortType); MessagingController.getInstance(getApplication()).setSortType(sortType);
@ -817,6 +842,7 @@ public class MessageList
sortDateAscending = MessagingController.getInstance(getApplication()).isSortAscending(SORT_TYPE.SORT_DATE); sortDateAscending = MessagingController.getInstance(getApplication()).isSortAscending(SORT_TYPE.SORT_DATE);
reSort(); reSort();
} }
}
private void reSort() private void reSort()
{ {
@ -1119,7 +1145,8 @@ public class MessageList
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) public boolean onOptionsItemSelected(MenuItem item)
{ {
switch (item.getItemId()) int itemId = item.getItemId();
switch (itemId)
{ {
case R.id.check_mail: case R.id.check_mail:
checkMail(mAccount, mFolderName); checkMail(mAccount, mFolderName);
@ -1168,11 +1195,6 @@ public class MessageList
return true; return true;
case R.id.reverse_sort:
onToggleSortAscending();
return true;
case R.id.list_folders: case R.id.list_folders:
onShowFolderList(); onShowFolderList();
@ -1193,16 +1215,121 @@ public class MessageList
return true; return true;
case R.id.batch_select_all:
setAllSelected(true);
return true;
case R.id.batch_deselect_all:
setAllSelected(false);
return true;
case R.id.batch_copy_op:
moveOrCopySelected(false);
return true;
case R.id.batch_move_op:
moveOrCopySelected(true);
return true;
case R.id.batch_delete_op:
deleteSelected();
return true;
case R.id.batch_mark_read_op:
flagSelected(Flag.SEEN, true);
return true;
case R.id.batch_mark_unread_op:
flagSelected(Flag.SEEN, false);
return true;
case R.id.batch_flag_op:
flagSelected(Flag.FLAGGED, true);
return true;
case R.id.batch_unflag_op:
flagSelected(Flag.FLAGGED, false);
return true;
case R.id.batch_plain_mode:
mSelectedWidget = WIDGET_NONE;
configureWidgets();
return true;
case R.id.batch_select_mode:
mSelectedWidget = WIDGET_MULTISELECT;
configureWidgets();
return true;
case R.id.batch_flag_mode:
mSelectedWidget = WIDGET_FLAG;
configureWidgets();
return true;
default: default:
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
} }
@Override private final int[] batch_ops = { R.id.batch_copy_op, R.id.batch_delete_op, R.id.batch_flag_op,
public boolean onCreateOptionsMenu(Menu menu) R.id.batch_unflag_op, R.id.batch_mark_read_op, R.id.batch_mark_unread_op, R.id.batch_move_op ,
R.id.batch_select_all, R.id.batch_deselect_all };
private final int[] batch_modes = { R.id.batch_flag_mode, R.id.batch_select_mode, R.id.batch_plain_mode };
private void setOpsState(Menu menu, boolean state, boolean enabled)
{ {
super.onCreateOptionsMenu(menu); for (int id : batch_ops)
getMenuInflater().inflate(R.menu.message_list_option, menu); {
menu.findItem(id).setVisible(state);
menu.findItem(id).setEnabled(enabled);
}
}
private void setOpsMode(Menu menu, int currentModeId)
{
for (int id : batch_modes)
{
menu.findItem(id).setVisible(id != currentModeId);
}
}
@Override
public boolean onPrepareOptionsMenu(Menu menu)
{
switch (mSelectedWidget)
{
case WIDGET_FLAG:
{
setOpsState(menu, false, false);
setOpsMode(menu, R.id.batch_flag_mode);
break;
}
case WIDGET_MULTISELECT:
{
boolean anySelected = anySelected();
setOpsState(menu, true, anySelected);
setOpsMode(menu, R.id.batch_select_mode);
boolean newFlagState = computeBatchDirection(true);
boolean newReadState = computeBatchDirection(false);
menu.findItem(R.id.batch_flag_op).setVisible(newFlagState);
menu.findItem(R.id.batch_unflag_op).setVisible(!newFlagState);
menu.findItem(R.id.batch_mark_read_op).setVisible(newReadState);
menu.findItem(R.id.batch_mark_unread_op).setVisible(!newReadState);
menu.findItem(R.id.batch_deselect_all).setEnabled(anySelected);
menu.findItem(R.id.batch_select_all).setEnabled(true);
// TODO: batch move and copy not yet implemented
menu.findItem(R.id.batch_move_op).setVisible(false);
menu.findItem(R.id.batch_copy_op).setVisible(false);
break;
}
case WIDGET_NONE:
{
setOpsState(menu, false, false);
setOpsMode(menu, R.id.batch_plain_mode);
break;
}
}
if (mCurrentFolder.outbox) if (mCurrentFolder.outbox)
{ {
@ -1212,6 +1339,16 @@ public class MessageList
{ {
menu.findItem(R.id.send_messages).setVisible(false); menu.findItem(R.id.send_messages).setVisible(false);
} }
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.message_list_option, menu);
return true; return true;
} }
@ -1343,16 +1480,6 @@ public class MessageList
} }
} }
private String truncateStatus(String mess)
{
if (mess != null && mess.length() > 27)
{
mess = mess.substring(0, 27);
}
return mess;
}
class MessageListAdapter extends BaseAdapter class MessageListAdapter extends BaseAdapter
{ {
private List<MessageInfoHolder> messages = java.util.Collections.synchronizedList(new ArrayList<MessageInfoHolder>()); private List<MessageInfoHolder> messages = java.util.Collections.synchronizedList(new ArrayList<MessageInfoHolder>());
@ -2227,43 +2354,66 @@ public class MessageList
} }
} }
public void onClick(View v) private boolean computeBatchDirection(boolean flagged)
{ {
boolean newState = false; boolean newState = false;
List<Message> messageList = new ArrayList<Message>();
for (MessageInfoHolder holder : mAdapter.messages) for (MessageInfoHolder holder : mAdapter.messages)
{ {
if (holder.selected) if (holder.selected)
{ {
if (v == mBatchDeleteButton) if (flagged)
{
mAdapter.removeMessage(holder);
}
else if (v == mBatchFlagButton)
{ {
if (!holder.flagged) if (!holder.flagged)
{ {
newState = true; newState = true;
} }
} }
else if (v == mBatchReadButton) else
{ {
if (!holder.read) if (!holder.read)
{ {
newState = true; newState = true;
} }
} }
messageList.add(holder.message);
} }
} }
return newState;
}
private boolean anySelected()
{
for (MessageInfoHolder holder : mAdapter.messages)
{
if (holder.selected)
{
return true;
}
}
return false;
}
public void onClick(View v)
{
boolean newState = false;
List<Message> messageList = new ArrayList<Message>();
List<MessageInfoHolder> removeHolderList = new ArrayList<MessageInfoHolder>();
if (v == mBatchFlagButton)
{
newState = computeBatchDirection(true);
}
else
{
newState = computeBatchDirection(false);
}
for (MessageInfoHolder holder : mAdapter.messages) for (MessageInfoHolder holder : mAdapter.messages)
{ {
if (holder.selected) if (holder.selected)
{ {
if (v == mBatchDeleteButton) if (v == mBatchDeleteButton)
{ {
//nothing removeHolderList.add(holder);
} }
else if (v == mBatchFlagButton) else if (v == mBatchFlagButton)
{ {
@ -2273,8 +2423,10 @@ public class MessageList
{ {
holder.read = newState; holder.read = newState;
} }
messageList.add(holder.message);
} }
} }
mAdapter.removeMessages(removeHolderList);
if (!messageList.isEmpty()) if (!messageList.isEmpty())
{ {
@ -2298,5 +2450,62 @@ public class MessageList
mHandler.sortMessages(); mHandler.sortMessages();
} }
private void setAllSelected(boolean isSelected)
{
mSelectedCount = 0;
for (MessageInfoHolder holder : mAdapter.messages)
{
holder.selected = isSelected;
mSelectedCount += (isSelected ? 1 : 0);
}
mAdapter.notifyDataSetChanged();
showBatchButtons();
}
private void flagSelected(Flag flag, boolean newState)
{
List<Message> messageList = new ArrayList<Message>();
for (MessageInfoHolder holder : mAdapter.messages)
{
if (holder.selected)
{
messageList.add(holder.message);
if (flag == Flag.SEEN)
{
holder.read = newState;
}
else if (flag == Flag.FLAGGED)
{
holder.flagged = newState;
}
}
}
MessagingController.getInstance(getApplication()).setFlag(mAccount, mCurrentFolder.name, messageList.toArray(new Message[0]),
flag , newState);
mHandler.sortMessages();
}
private void deleteSelected()
{
List<Message> messageList = new ArrayList<Message>();
List<MessageInfoHolder> removeHolderList = new ArrayList<MessageInfoHolder>();
for (MessageInfoHolder holder : mAdapter.messages)
{
if (holder.selected)
{
removeHolderList.add(holder);
messageList.add(holder.message);
}
}
mAdapter.removeMessages(removeHolderList);
MessagingController.getInstance(getApplication()).deleteMessages(mAccount, mCurrentFolder.name, messageList.toArray(new Message[0]), null);
mSelectedCount = 0;
configureBatchButtons();
}
private void moveOrCopySelected(boolean isMove)
{
} }
}