Add hotkeys from MessageView to MessageList

This commit is contained in:
cketti 2013-01-28 16:15:03 +01:00
parent 0a14d584e9
commit 77b8e62d64
4 changed files with 240 additions and 56 deletions

View File

@ -356,22 +356,66 @@ public class MessageList extends K9FragmentActivity implements MessageListFragme
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
public boolean dispatchKeyEvent(KeyEvent event) {
boolean ret = false;
if (KeyEvent.ACTION_DOWN == event.getAction()) {
ret = onCustomKeyDown(event.getKeyCode(), event);
}
if (!ret) {
ret = super.dispatchKeyEvent(event);
}
return ret;
}
/**
* Handle hotkeys
*
* <p>
* This method is called by {@link #dispatchKeyEvent(KeyEvent)} before any view had the chance
* to consume this key event.
* </p>
*
* @param keyCode
* The value in {@code event.getKeyCode()}.
* @param event
* Description of the key event.
*
* @return {@code true} if this event was consumed.
*/
public boolean onCustomKeyDown(final int keyCode, final KeyEvent event) {
// Shortcuts that work no matter what is selected
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP: {
if (K9.useVolumeKeysForListNavigationEnabled()) {
if (mMessageViewFragment != null && mDisplayMode != DisplayMode.MESSAGE_LIST &&
K9.useVolumeKeysForNavigationEnabled()) {
MessageReference ref = mMessageViewFragment.getMessageReference();
if (ref != null) {
mMessageListFragment.openPrevious(ref);
}
return true;
} else if (mDisplayMode != DisplayMode.MESSAGE_VIEW &&
K9.useVolumeKeysForListNavigationEnabled()) {
mMessageListFragment.onMoveUp();
return true;
}
return false;
break;
}
case KeyEvent.KEYCODE_VOLUME_DOWN: {
if (K9.useVolumeKeysForListNavigationEnabled()) {
if (mMessageViewFragment != null && mDisplayMode != DisplayMode.MESSAGE_LIST &&
K9.useVolumeKeysForNavigationEnabled()) {
MessageReference ref = mMessageViewFragment.getMessageReference();
if (ref != null) {
mMessageListFragment.openNext(ref);
}
return true;
} else if (mDisplayMode != DisplayMode.MESSAGE_VIEW &&
K9.useVolumeKeysForListNavigationEnabled()) {
mMessageListFragment.onMoveDown();
return true;
}
return false;
break;
}
case KeyEvent.KEYCODE_C: {
mMessageListFragment.onCompose();
@ -389,50 +433,107 @@ public class MessageList extends K9FragmentActivity implements MessageListFragme
mMessageListFragment.onReverseSort();
return true;
}
case KeyEvent.KEYCODE_DEL:
case KeyEvent.KEYCODE_D: {
if (mDisplayMode == DisplayMode.MESSAGE_LIST) {
mMessageListFragment.onDelete();
} else if (mMessageViewFragment != null) {
mMessageViewFragment.onDelete();
}
return true;
}
case KeyEvent.KEYCODE_S: {
mMessageListFragment.toggleMessageSelect();
return true;
}
case KeyEvent.KEYCODE_G: {
if (mDisplayMode == DisplayMode.MESSAGE_LIST) {
mMessageListFragment.onToggleFlagged();
} else if (mMessageViewFragment != null) {
mMessageViewFragment.onToggleFlagged();
}
return true;
}
case KeyEvent.KEYCODE_M: {
if (mDisplayMode == DisplayMode.MESSAGE_LIST) {
mMessageListFragment.onMove();
} else if (mMessageViewFragment != null) {
mMessageViewFragment.onMove();
}
return true;
}
case KeyEvent.KEYCODE_V: {
if (mDisplayMode == DisplayMode.MESSAGE_LIST) {
mMessageListFragment.onArchive();
} else if (mMessageViewFragment != null) {
mMessageViewFragment.onArchive();
}
return true;
}
case KeyEvent.KEYCODE_Y: {
if (mDisplayMode == DisplayMode.MESSAGE_LIST) {
mMessageListFragment.onCopy();
} else if (mMessageViewFragment != null) {
mMessageViewFragment.onCopy();
}
return true;
}
case KeyEvent.KEYCODE_Z: {
if (mDisplayMode == DisplayMode.MESSAGE_LIST) {
mMessageListFragment.onToggleRead();
} else if (mMessageViewFragment != null) {
mMessageViewFragment.onToggleRead();
}
return true;
}
case KeyEvent.KEYCODE_F: {
if (mMessageViewFragment != null) {
mMessageViewFragment.onForward();
}
return true;
}
case KeyEvent.KEYCODE_A: {
if (mMessageViewFragment != null) {
mMessageViewFragment.onReplyAll();
}
return true;
}
case KeyEvent.KEYCODE_R: {
if (mMessageViewFragment != null) {
mMessageViewFragment.onReply();
}
return true;
}
case KeyEvent.KEYCODE_J:
case KeyEvent.KEYCODE_P: {
MessageReference ref = mMessageViewFragment.getMessageReference();
if (ref != null) {
mMessageListFragment.openPrevious(ref);
}
return true;
}
case KeyEvent.KEYCODE_N:
case KeyEvent.KEYCODE_K: {
MessageReference ref = mMessageViewFragment.getMessageReference();
if (ref != null) {
mMessageListFragment.openNext(ref);
}
return true;
}
/* FIXME
case KeyEvent.KEYCODE_Z: {
mMessageViewFragment.zoom(event);
return true;
}*/
case KeyEvent.KEYCODE_H: {
Toast toast = Toast.makeText(this, R.string.message_list_help_key, Toast.LENGTH_LONG);
toast.show();
return true;
}
}
boolean retval = true;
try {
switch (keyCode) {
case KeyEvent.KEYCODE_DEL:
case KeyEvent.KEYCODE_D: {
mMessageListFragment.onDelete();
return true;
}
case KeyEvent.KEYCODE_S: {
mMessageListFragment.toggleMessageSelect();
return true;
}
case KeyEvent.KEYCODE_G: {
mMessageListFragment.onToggleFlagged();
return true;
}
case KeyEvent.KEYCODE_M: {
mMessageListFragment.onMove();
return true;
}
case KeyEvent.KEYCODE_V: {
mMessageListFragment.onArchive();
return true;
}
case KeyEvent.KEYCODE_Y: {
mMessageListFragment.onCopy();
return true;
}
case KeyEvent.KEYCODE_Z: {
mMessageListFragment.onToggleRead();
return true;
}
}
} finally {
retval = super.onKeyDown(keyCode, event);
}
return retval;
return false;
}
@Override

View File

@ -318,7 +318,7 @@ public class MessageView extends K9FragmentActivity implements MessageViewFragme
return true;
}
case KeyEvent.KEYCODE_G: {
mMessageViewFragment.onFlag();
mMessageViewFragment.onToggleFlagged();
return true;
}
case KeyEvent.KEYCODE_M: {

View File

@ -431,6 +431,7 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
private static final int ACTION_PROGRESS = 3;
private static final int ACTION_REMOTE_SEARCH_FINISHED = 4;
private static final int ACTION_GO_BACK = 5;
private static final int ACTION_OPEN_MESSAGE = 6;
public void folderLoading(String folder, boolean loading) {
@ -469,6 +470,12 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
sendMessage(msg);
}
public void openMessage(MessageReference messageReference) {
android.os.Message msg = android.os.Message.obtain(this, ACTION_OPEN_MESSAGE,
messageReference);
sendMessage(msg);
}
@Override
public void handleMessage(android.os.Message msg) {
// The following messages don't need an attached activity.
@ -505,6 +512,11 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
mFragmentListener.goBack();
break;
}
case ACTION_OPEN_MESSAGE: {
MessageReference messageReference = (MessageReference) msg.obj;
mFragmentListener.openMessage(messageReference);
break;
}
}
}
}
@ -663,22 +675,17 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
if (mSelectedCount > 0) {
toggleMessageSelect(position);
} else {
Account account = getAccountFromCursor(cursor);
long folderId = cursor.getLong(FOLDER_ID_COLUMN);
String folderName = getFolderNameById(account, folderId);
if (mThreadedList && cursor.getInt(THREAD_COUNT_COLUMN) > 1) {
Account account = getAccountFromCursor(cursor);
long folderId = cursor.getLong(FOLDER_ID_COLUMN);
String folderName = getFolderNameById(account, folderId);
// If threading is enabled and this item represents a thread, display the thread contents.
long rootId = cursor.getLong(THREAD_ROOT_COLUMN);
mFragmentListener.showThread(account, folderName, rootId);
} else {
// This item represents a message; just display the message.
MessageReference ref = new MessageReference();
ref.accountUuid = account.getUuid();
ref.folderName = folderName;
ref.uid = cursor.getString(UID_COLUMN);
onOpenMessage(ref);
openMessageAtPosition(listViewToAdapterPosition(position));
}
}
}
@ -1507,6 +1514,14 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
return AdapterView.INVALID_POSITION;
}
private int adapterToListViewPosition(int position) {
if (position >= 0 && position < mAdapter.getCount()) {
return position + 1;
}
return AdapterView.INVALID_POSITION;
}
class MessageListActivityListener extends ActivityListener {
@Override
public void remoteSearchFailed(Account acct, String folder, final String err) {
@ -2750,6 +2765,63 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
}
}
public void openPrevious(MessageReference messageReference) {
int position = getPosition(messageReference);
if (position <= 0) {
return;
}
openMessageAtPosition(position - 1);
}
public void openNext(MessageReference messageReference) {
int position = getPosition(messageReference);
if (position < 0 || position == mAdapter.getCount() - 1) {
return;
}
openMessageAtPosition(position + 1);
}
private void openMessageAtPosition(int position) {
// Scroll message into view if necessary
int listViewPosition = adapterToListViewPosition(position);
if (listViewPosition != AdapterView.INVALID_POSITION &&
(listViewPosition < mListView.getFirstVisiblePosition() ||
listViewPosition > mListView.getLastVisiblePosition())) {
mListView.setSelection(listViewPosition);
}
Cursor cursor = (Cursor) mAdapter.getItem(position);
MessageReference ref = new MessageReference();
ref.accountUuid = cursor.getString(ACCOUNT_UUID_COLUMN);
ref.folderName = cursor.getString(FOLDER_NAME_COLUMN);
ref.uid = cursor.getString(UID_COLUMN);
// For some reason the mListView.setSelection() above won't do anything when we call
// onOpenMessage() (and consequently mAdapter.notifyDataSetChanged()) right away. So we
// defer the call using MessageListHandler.
mHandler.openMessage(ref);
}
private int getPosition(MessageReference messageReference) {
for (int i = 0, len = mAdapter.getCount(); i < len; i++) {
Cursor cursor = (Cursor) mAdapter.getItem(i);
String accountUuid = cursor.getString(ACCOUNT_UUID_COLUMN);
String folderName = cursor.getString(FOLDER_NAME_COLUMN);
String uid = cursor.getString(UID_COLUMN);
if (accountUuid.equals(messageReference.accountUuid) &&
folderName.equals(messageReference.folderName) &&
uid.equals(messageReference.uid)) {
return i;
}
}
return -1;
}
public interface MessageListFragmentListener {
void enableActionBarProgress(boolean enable);
void setMessageListProgress(int level);

View File

@ -326,7 +326,7 @@ public class MessageViewFragment extends SherlockFragment implements OnClickList
}
}
public void onFlag() {
public void onToggleFlagged() {
if (mMessage != null) {
boolean newState = !mMessage.isSet(Flag.FLAGGED);
mController.setFlag(mAccount, mMessage.getFolder().getName(),
@ -364,6 +364,10 @@ public class MessageViewFragment extends SherlockFragment implements OnClickList
startRefileActivity(ACTIVITY_CHOOSE_FOLDER_COPY);
}
public void onArchive() {
onRefile(mAccount.getArchiveFolderName());
}
private void onToggleColors() {
if (K9.getK9MessageViewTheme() == K9.THEME_DARK) {
K9.setK9MessageViewTheme(K9.THEME_LIGHT);
@ -453,7 +457,7 @@ public class MessageViewFragment extends SherlockFragment implements OnClickList
}
}
private void onToggleRead() {
public void onToggleRead() {
if (mMessage != null) {
mController.setFlag(mAccount, mMessage.getFolder().getName(),
new Message[] { mMessage }, Flag.SEEN, !mMessage.isSet(Flag.SEEN));
@ -667,7 +671,7 @@ public class MessageViewFragment extends SherlockFragment implements OnClickList
mMessageView.setOnFlagListener(new OnClickListener() {
@Override
public void onClick(View v) {
onFlag();
onToggleFlagged();
}
});
}
@ -898,6 +902,13 @@ public class MessageViewFragment extends SherlockFragment implements OnClickList
/* do nothing */
}
/**
* Get the {@link MessageReference} of the currently displayed message.
*/
public MessageReference getMessageReference() {
return mMessageReference;
}
public interface MessageViewFragmentListener {
public void onForward(Message mMessage, PgpData mPgpData);