From a5b8ce8064e54b86d24f28f8568c95351bb96b49 Mon Sep 17 00:00:00 2001 From: Sander Bogaert Date: Tue, 28 Aug 2012 15:23:25 -0400 Subject: [PATCH] Add context action bar on FolderList activity. --- res/drawable-hdpi/ic_action_read.png | Bin 0 -> 875 bytes res/drawable-ldpi/ic_action_read.png | Bin 0 -> 430 bytes res/drawable-mdpi/ic_action_read.png | Bin 0 -> 545 bytes res/drawable-xhdpi/ic_action_read.png | Bin 0 -> 1186 bytes res/menu/folder_context.xml | 55 +++--- src/com/fsck/k9/activity/FolderList.java | 216 ++++++++++++----------- 6 files changed, 143 insertions(+), 128 deletions(-) create mode 100644 res/drawable-hdpi/ic_action_read.png create mode 100644 res/drawable-ldpi/ic_action_read.png create mode 100644 res/drawable-mdpi/ic_action_read.png create mode 100644 res/drawable-xhdpi/ic_action_read.png diff --git a/res/drawable-hdpi/ic_action_read.png b/res/drawable-hdpi/ic_action_read.png new file mode 100644 index 0000000000000000000000000000000000000000..d0fa47b286b077f393ce4c98a182590dd9093e5b GIT binary patch literal 875 zcmV-x1C;!UP)Ov3{L{Th?P+Lu!Pq$K3uu|KFNc{y0uHA}O=+Yk`f>ANG1$Jr^)0_VxtoXGjs2I&wbzXo_i*(*4N`7t;hNIxdQ&S zgRTRv1Bw}NOGq(+%FF*<2V$|JaD)0=#KEj#Uk{E*X^k~GBQ@rK$vR>jkdn0GE;Y_~fsDTg zQ`K?tcswK}%-o<-7lO!osZ^R@U0q!>IdabH^vy^B10 z^cXyE5%*;_n|)`@cqkMa3Iqb{{EP18P6n@Na$FbW}4Q8t@E=n>|hFrR|- zQSO6+gJ_PiEpX!8O|aj&Ce4SFo-xeaBymoe-Eu^LLC6}LESk=UcVuK_fNXw-$OY!F zL&hg-xG!@*2Z<#xC&6qoT+!np_6#D&zzkWHnWF-XLh6TZLmvwUgNOV3`==q}HIhL@ zrC2OZ=W;p8{+|y`VUQA(?lx>i+|d%+Ws{Exc}8Z}$>t@zDYTp z&4_nPfb6r4&36zW<#WSAz*7Xg2J;Zi{#MBgt|KL6CP0bYgIJ9Y@_@NUx2fZ*be#Ks zzrPAbeiqpJW2!3xL@?&@ z;H+%UcwXA5yisYbw;A&9Nda}TWv=suLg8&bpWl`-TIW6-IZvyc&|TTH0(4^1HX-}7 zF6yAUt?qdNb_q7acjXW_BcU?y3Q)*UFkpRihB zU|`_?`}gm?AW3$1c92C5Xg>N4)yN7r0O(?%ngc(7{@eu;V`XJ^zHs5fMx1c~H1ylw zzkl~LGc)hz;NW2X{{6cvP_ZM>kZmk1ELT7pf%4iw${S=b(8aqSKYsj2Oiaubs0XBu z3uhdlMeFEH6T9%eYSqgJc+E}zdgyk76R&1Q?i{l*AJTHr>baVv`AdoUQZ$+8?S6bhMPn(zmQ z(k_?lE}P9Z|1qLq{~iE=#9)xe*CvG+1bzZIMc_yz!j{YBFxGc4mh|3&Z-}RzPG?SK zWDi2G06aS!jwl(Z*XtQ%$^)>Qz@<{@jlh*kWgBa|1n#`GUIU%yT1HTo92S~L=RAbZ z5ihn6{9^wM`&GSSYo0UQ1DXVl1EvAZ3>ZzZ-sflU jKcU_?FnZq1fSG|m?OZ({;BzzIPOr6NIsugiMKSUQeHKi_4R#vtk5D1i~q@+|#PEKaTsiXgx<#M@($H&JT zJsyv*rKRQjlmO6_OG`_=EWB-EVxlUJ8SyhYIk}ENJ!@}o{}oNJEYAV@MT8Nfqob9K zS8#cv*<=P}0_@R9fEsc9TP*uo0+5@VyTb4Hztb|%UJ@zLFg(DwhRvs*Yx%Eeb#S6YGg4lY?w(#NW^`lV`EoW*H^tw zIXO8?GBPr%0jP{3cw$O5KsyPt*f<-uLH~!ny}j>^7(vn5hFp~uBP4Rj_*w5mXq{!` zZZ7xpOpT?up;u2)_8CPyFE4L-T3Xs3*4ltvimWvq?*c*AeTfk@7%`|fxTvUTAqEH= z%JnruKxFI*l&#l0P*6}Xk4{sG?rzQau(g9y*v7`j8hUzqz8HYN81SnZ-^Aq(pPvo@ z{;ZEPW5Nj9&BN~QZY`33_m&#rcDpNZs4~<(1KeM0YisKjA?6notyOXls|GYMi;Iib zBXP@(ebQ)4Ys=7oxrnARv0HE1EiqWl5^$~}YPcleHImDlwB+Y*H7=1?s z!rPe@)gvu9n*eAw1&G{5Ko|gkBMeFu&3?@oeY3Eza3$cKi8bQ0Rs+mDf(bWBhganP zZot@YCQItvrw-HtKrsLuk0#H}Wa5DVVqXJ>+?KXQ0XrY5WrbSnIVqyZ9^`q4Qvetm z92`8`-`_uiV_N{>u>PsNvq7x&h}(wWnJKTzEc25A`R+DgS(+(xDJP3f&k64_ zz5Z<&5H5<|8d76tq(f3P&Kk+Y9RQk<@hrkzJf7g6$L;ptxuR!T1Lle&cI{LE*hS7MdWr!~iKJaW z6a(xc=M+7~0H;LKt{;j4c9C<6o??JgB5Bu;-vOg5Uk - - - - + + + android:icon="@drawable/ic_action_refresh" + android:showAsAction="always" + android:title="@string/check_mail_action"/> + + + - + android:showAsAction="never" + android:title="@string/send_messages_action"/> + android:showAsAction="never" + android:title="@string/clear_local_folder_action"/> - - + android:showAsAction="never" + android:title="@string/expunge_action"/> + + \ No newline at end of file diff --git a/src/com/fsck/k9/activity/FolderList.java b/src/com/fsck/k9/activity/FolderList.java index b408aca6f..36bcde1f2 100644 --- a/src/com/fsck/k9/activity/FolderList.java +++ b/src/com/fsck/k9/activity/FolderList.java @@ -19,16 +19,14 @@ import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.util.TypedValue; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; -import android.widget.AdapterView.AdapterContextMenuInfo; import android.widget.AdapterView.OnItemClickListener; +import android.widget.AdapterView.OnItemLongClickListener; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.Filter; @@ -40,11 +38,10 @@ import android.widget.TextView; import android.widget.Toast; import com.actionbarsherlock.app.ActionBar; -import com.actionbarsherlock.app.ActionBar.OnNavigationListener; import com.actionbarsherlock.view.ActionMode; import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; -import com.actionbarsherlock.view.Window; import com.fsck.k9.Account; import com.fsck.k9.Account.FolderMode; import com.fsck.k9.AccountStats; @@ -55,7 +52,6 @@ import com.fsck.k9.Preferences; import com.fsck.k9.R; import com.fsck.k9.SearchSpecification; import com.fsck.k9.activity.FolderList.FolderListAdapter.FolderListFilter; -import com.fsck.k9.activity.misc.ActionBarNavigationSpinner; import com.fsck.k9.activity.setup.AccountSettings; import com.fsck.k9.activity.setup.FolderSettings; import com.fsck.k9.activity.setup.Prefs; @@ -76,7 +72,7 @@ import com.fsck.k9.service.MailService; * Activity shows list of the Account's folders */ -public class FolderList extends K9ListActivity implements OnNavigationListener { +public class FolderList extends K9ListActivity { /* * Constants for showDialog() etc. */ @@ -103,6 +99,8 @@ public class FolderList extends K9ListActivity implements OnNavigationListener { private int mUnreadMessageCount; + private FolderInfoHolder mSelectedContextFolder = null; + private FontSizes mFontSizes = K9.getFontSizes(); private Context context; @@ -306,6 +304,27 @@ public class FolderList extends K9ListActivity implements OnNavigationListener { onOpenFolder(((FolderInfoHolder)mAdapter.getItem(position)).name); } }); + + // Enable context action bar behaviour + mListView.setOnItemLongClickListener(new OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView parent, View view, + int position, long id) { + // is already in selection mode we ignore the next long presses + if (mSelectedContextFolder != null) { + return false; + } + + // this cast will always be safe + mSelectedContextFolder = (FolderInfoHolder) mAdapter.getItem(position); + + mActionMode = FolderList.this.startActionMode(mActionModeCallback); + mActionMode.invalidate(); + mActionMode.setTitle(String.format(getString(R.string.actionbar_string_selected), + mSelectedContextFolder.displayName)); + return true; + }}); + registerForContextMenu(mListView); mListView.setSaveEnabled(true); @@ -329,19 +348,6 @@ public class FolderList extends K9ListActivity implements OnNavigationListener { mActionBar.setDisplayHomeAsUpEnabled(true); } - @Override - public boolean onNavigationItemSelected(int itemPosition, long itemId) { - if (itemId == ActionBarNavigationSpinner.AB_NAVIGATION_INBOX) { - onOpenFolder(mAccount.getInboxFolderName()); - return true; - } else if (itemId == ActionBarNavigationSpinner.AB_NAVIGATION_ACCOUNTS) { - onAccounts(); - return true; - } - - return false; - } - @Override public void onNewIntent(Intent intent) { setIntent(intent); // onNewIntent doesn't autoset our "internal" intent @@ -660,54 +666,6 @@ public class FolderList extends K9ListActivity implements OnNavigationListener { return true; } - @Override public boolean onContextItemSelected(android.view.MenuItem item) { - AdapterContextMenuInfo info = (AdapterContextMenuInfo) item .getMenuInfo(); - FolderInfoHolder folder = (FolderInfoHolder) mAdapter.getItem(info.position); - - switch (item.getItemId()) { - case R.id.open_folder: - onOpenFolder(folder.name); - break; - - case R.id.mark_all_as_read: - onMarkAllAsRead(mAccount, folder.name); - break; - - case R.id.send_messages: - sendMail(mAccount); - - break; - - case R.id.check_mail: - checkMail(folder); - - break; - - case R.id.folder_settings: - onEditFolder(mAccount, folder.name); - - break; - - case R.id.empty_trash: - onEmptyTrash(mAccount); - - break; - case R.id.expunge: - onExpunge(mAccount, folder.name); - - break; - - case R.id.clear_local_folder: - onClearFolder(mAccount, folder.name); - break; - } - - return super.onContextItemSelected(item); - } - - private FolderInfoHolder mSelectedContextFolder = null; - - private void onMarkAllAsRead(final Account account, final String folder) { mSelectedContextFolder = mAdapter.getFolder(folder); if (K9.confirmMarkAllAsRead()) { @@ -820,39 +778,6 @@ public class FolderList extends K9ListActivity implements OnNavigationListener { } } - @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { - super.onCreateContextMenu(menu, v, menuInfo); - AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo; - getMenuInflater().inflate(R.menu.folder_context, menu); - - FolderInfoHolder folder = (FolderInfoHolder) mAdapter.getItem(info.position); - - menu.setHeaderTitle(folder.displayName); - - if (!folder.name.equals(mAccount.getTrashFolderName())) - menu.findItem(R.id.empty_trash).setVisible(false); - - if (folder.name.equals(mAccount.getOutboxFolderName())) { - menu.findItem(R.id.check_mail).setVisible(false); - } else { - menu.findItem(R.id.send_messages).setVisible(false); - } - if (K9.ERROR_FOLDER_NAME.equals(folder.name)) { - menu.findItem(R.id.expunge).setVisible(false); - } - - if (!MessagingController.getInstance(getApplication()).isMoveCapable(mAccount)) { - // FIXME: Really we want to do this for all local-only folders - if (!mAccount.getInboxFolderName().equals(folder.name)) { - menu.findItem(R.id.check_mail).setVisible(false); - } - - menu.findItem(R.id.expunge).setVisible(false); - } - - menu.setHeaderTitle(folder.displayName); - } - class FolderListAdapter extends BaseAdapter implements Filterable { private ArrayList mFolders = new ArrayList(); private List mFilteredFolders = Collections.unmodifiableList(mFolders); @@ -1459,4 +1384,93 @@ public class FolderList extends K9ListActivity implements OnNavigationListener { MessageList.actionHandle(context, description, searchSpec); } + private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { + + @Override + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + FolderInfoHolder folder = mSelectedContextFolder; + + menu.findItem(R.id.empty_trash).setVisible( + folder.name.equals(mAccount.getTrashFolderName()) ? false : true); + + if (folder.name.equals(mAccount.getOutboxFolderName())) { + menu.findItem(R.id.check_mail).setVisible(false); + menu.findItem(R.id.send_messages).setVisible(true); + } else { + menu.findItem(R.id.send_messages).setVisible(false); + menu.findItem(R.id.check_mail).setVisible(true); + } + + menu.findItem(R.id.expunge).setVisible( + K9.ERROR_FOLDER_NAME.equals(folder.name) ? false : true); + + if (!MessagingController.getInstance(getApplication()).isMoveCapable(mAccount)) { + // FIXME: Really we want to do this for all local-only folders + if (!mAccount.getInboxFolderName().equals(folder.name)) { + menu.findItem(R.id.check_mail).setVisible(false); + } else { + menu.findItem(R.id.check_mail).setVisible(true); + } + + menu.findItem(R.id.expunge).setVisible(false); + } else { + menu.findItem(R.id.expunge).setVisible(true); + } + + return true; + } + + @Override + public void onDestroyActionMode(ActionMode mode) { + mSelectedContextFolder = null; + mActionMode = null; + } + + @Override + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + MenuInflater inflater = mode.getMenuInflater(); + inflater.inflate(R.menu.folder_context, menu); + return true; + } + + @Override + public boolean onActionItemClicked(ActionMode mode, MenuItem item) {; + FolderInfoHolder folder= mSelectedContextFolder; + + switch (item.getItemId()) { + case R.id.mark_all_as_read: + onMarkAllAsRead(mAccount, folder.name); + break; + + case R.id.send_messages: + sendMail(mAccount); + + break; + + case R.id.check_mail: + checkMail(folder); + + break; + + case R.id.folder_settings: + onEditFolder(mAccount, folder.name); + + break; + + case R.id.empty_trash: + onEmptyTrash(mAccount); + + break; + case R.id.expunge: + onExpunge(mAccount, folder.name); + + break; + + case R.id.clear_local_folder: + onClearFolder(mAccount, folder.name); + break; + } + return true; + } + }; }