diff options
Diffstat (limited to 'src/com/android/mail/ui/FolderListFragment.java')
-rw-r--r-- | src/com/android/mail/ui/FolderListFragment.java | 202 |
1 files changed, 52 insertions, 150 deletions
diff --git a/src/com/android/mail/ui/FolderListFragment.java b/src/com/android/mail/ui/FolderListFragment.java index 75bf21322..dbbc12b08 100644 --- a/src/com/android/mail/ui/FolderListFragment.java +++ b/src/com/android/mail/ui/FolderListFragment.java @@ -34,18 +34,18 @@ import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; -import android.widget.TextView; import com.android.bitmap.BitmapCache; import com.android.bitmap.UnrefedBitmapCache; import com.android.mail.R; -import com.android.mail.adapter.DrawerItem; import com.android.mail.analytics.Analytics; import com.android.mail.bitmap.AccountAvatarDrawable; import com.android.mail.bitmap.ContactResolver; import com.android.mail.browse.MergedAdapter; import com.android.mail.content.ObjectCursor; import com.android.mail.content.ObjectCursorLoader; +import com.android.mail.drawer.DrawerItem; +import com.android.mail.drawer.FooterItem; import com.android.mail.providers.Account; import com.android.mail.providers.AccountObserver; import com.android.mail.providers.AllAccountObserver; @@ -185,7 +185,7 @@ public class FolderListFragment extends ListFragment implements * {@link DrawerItem#FOLDER_RECENT} or {@link DrawerItem#FOLDER_OTHER}. * Set as {@link DrawerItem#UNSET} to begin with, as there is nothing selected yet. */ - private int mSelectedDrawerItemType = DrawerItem.UNSET; + private int mSelectedDrawerItemCategory = DrawerItem.UNSET; /** The FolderType of the selected folder {@link FolderType} */ private int mSelectedFolderType = FolderType.INBOX; @@ -406,7 +406,7 @@ public class FolderListFragment extends ListFragment implements mListView.setChoiceMode(getListViewChoiceMode()); - mMergedAdapter = new MergedAdapter<ListAdapter>(); + mMergedAdapter = new MergedAdapter<>(); if (mAccountsAdapter != null) { mMergedAdapter.setAdapters(mAccountsAdapter, mFolderAdapter, mFooterAdapter); } else { @@ -465,7 +465,7 @@ public class FolderListFragment extends ListFragment implements if (savedState != null && savedState.containsKey(BUNDLE_SELECTED_FOLDER)) { mSelectedFolderUri = new FolderUri(Uri.parse(savedState.getString(BUNDLE_SELECTED_FOLDER))); - mSelectedDrawerItemType = savedState.getInt(BUNDLE_SELECTED_ITEM_TYPE); + mSelectedDrawerItemCategory = savedState.getInt(BUNDLE_SELECTED_ITEM_TYPE); mSelectedFolderType = savedState.getInt(BUNDLE_SELECTED_TYPE); } else if (mParentFolder != null) { mSelectedFolderUri = mParentFolder.folderUri; @@ -510,7 +510,7 @@ public class FolderListFragment extends ListFragment implements if (mSelectedFolderUri != null) { outState.putString(BUNDLE_SELECTED_FOLDER, mSelectedFolderUri.toString()); } - outState.putInt(BUNDLE_SELECTED_ITEM_TYPE, mSelectedDrawerItemType); + outState.putInt(BUNDLE_SELECTED_ITEM_TYPE, mSelectedDrawerItemCategory); outState.putInt(BUNDLE_SELECTED_TYPE, mSelectedFolderType); outState.putBoolean(BUNDLE_INBOX_PRESENT, mInboxPresent); } @@ -569,7 +569,7 @@ public class FolderListFragment extends ListFragment implements protected void changeAccount(final Account account) { // Switching accounts takes you to the default inbox for that account. - mSelectedDrawerItemType = DrawerItem.FOLDER_INBOX; + mSelectedDrawerItemCategory = DrawerItem.FOLDER_INBOX; mSelectedFolderType = FolderType.INBOX; mNextAccount = account; mAccountController.closeDrawer(true, mNextAccount, getDefaultInbox(mNextAccount)); @@ -585,12 +585,12 @@ public class FolderListFragment extends ListFragment implements final Object item = getListView().getAdapter().getItem(position); LogUtils.d(LOG_TAG, "viewFolderOrChangeAccount(%d): %s", position, item); final Folder folder; - int folderType = DrawerItem.UNSET; + @DrawerItem.DrawerItemCategory int itemCategory = DrawerItem.UNSET; if (item instanceof DrawerItem) { final DrawerItem drawerItem = (DrawerItem) item; - // Could be a folder or account. - final int itemType = drawerItem.mType; + // Could be a folder or account or footer + final @DrawerItem.DrawerItemType int itemType = drawerItem.getType(); if (itemType == DrawerItem.VIEW_ACCOUNT) { // Account, so switch. folder = null; @@ -598,10 +598,14 @@ public class FolderListFragment extends ListFragment implements } else if (itemType == DrawerItem.VIEW_FOLDER) { // Folder type, so change folders only. folder = drawerItem.mFolder; - mSelectedDrawerItemType = folderType = drawerItem.mFolderType; + mSelectedDrawerItemCategory = itemCategory = drawerItem.mItemCategory; mSelectedFolderType = folder.type; LogUtils.d(LOG_TAG, "FLF.viewFolderOrChangeAccount folder=%s, type=%d", - folder, mSelectedDrawerItemType); + folder, mSelectedDrawerItemCategory); + } else if (itemType == DrawerItem.VIEW_FOOTER_HELP || + itemType == DrawerItem.VIEW_FOOTER_SETTINGS) { + folder = null; + drawerItem.onClick(null /* unused */); } else { // Do nothing. LogUtils.d(LOG_TAG, "FolderListFragment: viewFolderOrChangeAccount():" @@ -610,16 +614,13 @@ public class FolderListFragment extends ListFragment implements } } else if (item instanceof Folder) { folder = (Folder) item; - } else if (item instanceof FooterItem) { - folder = null; - ((FooterItem) item).onClick(null /* unused */); } else { // Don't know how we got here. LogUtils.wtf(LOG_TAG, "viewFolderOrChangeAccount(): invalid item"); folder = null; } if (folder != null) { - final String label = (folderType == DrawerItem.FOLDER_RECENT) ? "recent" : "normal"; + final String label = (itemCategory == DrawerItem.FOLDER_RECENT) ? "recent" : "normal"; onFolderSelected(folder, label); } } @@ -677,7 +678,7 @@ public class FolderListFragment extends ListFragment implements LogUtils.wtf(LOG_TAG, "FLF.onCreateLoader() with weird type"); return null; } - return new ObjectCursorLoader<Folder>(mActivity.getActivityContext(), folderListUri, + return new ObjectCursorLoader<>(mActivity.getActivityContext(), folderListUri, UIProvider.FOLDERS_PROJECTION, Folder.FACTORY); } @@ -797,7 +798,7 @@ public class FolderListFragment extends ListFragment implements * {@link FolderListFragment#mIsDivided} for more information */ private final boolean mIsDivided; /** All the items */ - private List<DrawerItem> mItemList = new ArrayList<DrawerItem>(); + private List<DrawerItem> mItemList = new ArrayList<>(); /** Cursor into the folder list. This might be null. */ private ObjectCursor<Folder> mCursor = null; /** Cursor into the all folder list. This might be null. */ @@ -824,9 +825,9 @@ public class FolderListFragment extends ListFragment implements public View getView(int position, View convertView, ViewGroup parent) { final DrawerItem item = (DrawerItem) getItem(position); final View view = item.getView(convertView, parent); - final int type = item.mType; + final @DrawerItem.DrawerItemType int type = item.getType(); final boolean isSelected = - item.isHighlighted(mSelectedFolderUri, mSelectedDrawerItemType); + item.isHighlighted(mSelectedFolderUri, mSelectedDrawerItemCategory); if (type == DrawerItem.VIEW_FOLDER) { mListView.setItemChecked((mAccountsAdapter != null ? mAccountsAdapter.getCount() : 0) + @@ -847,12 +848,12 @@ public class FolderListFragment extends ListFragment implements @Override public int getViewTypeCount() { // Accounts, headers, folders (all parts of drawer view types) - return DrawerItem.getViewTypes(); + return DrawerItem.getViewTypeCount(); } @Override public int getItemViewType(int position) { - return ((DrawerItem) getItem(position)).mType; + return ((DrawerItem) getItem(position)).getType(); } @Override @@ -878,7 +879,7 @@ public class FolderListFragment extends ListFragment implements * @return a valid list of folders, which are all recent folders. */ private List<Folder> getRecentFolders(RecentFolderList recentList) { - final List<Folder> folderList = new ArrayList<Folder>(); + final List<Folder> folderList = new ArrayList<>(); if (recentList == null) { return folderList; } @@ -916,7 +917,7 @@ public class FolderListFragment extends ListFragment implements * This method modifies all the three lists on every single invocation. */ private List<DrawerItem> recalculateListFolders() { - final List<DrawerItem> itemList = new ArrayList<DrawerItem>(); + final List<DrawerItem> itemList = new ArrayList<>(); // If we are waiting for folder initialization, we don't have any kinds of folders, // just the "Waiting for initialization" item. Note, this should only be done // when we're waiting for account initialization or initial sync. @@ -938,8 +939,8 @@ public class FolderListFragment extends ListFragment implements // Recalculate folder list intended to be flat (no hearders or sections shown). // This is commonly used for the widget or other simple folder selections private List<DrawerItem> recalculateFlatListFolders(List<DrawerItem> itemList) { - final List<DrawerItem> inboxFolders = new ArrayList<DrawerItem>(); - final List<DrawerItem> allFoldersList = new ArrayList<DrawerItem>(); + final List<DrawerItem> inboxFolders = new ArrayList<>(); + final List<DrawerItem> allFoldersList = new ArrayList<>(); do { final Folder f = mCursor.getModel(); if (!isFolderTypeExcluded(f)) { @@ -961,8 +962,8 @@ public class FolderListFragment extends ListFragment implements // Recalculate folder list divided by sections (inboxes, recents, all, etc...) // This is primarily used by the drawer private List<DrawerItem> recalculateDividedListFolders(List<DrawerItem> itemList) { - final List<DrawerItem> allFoldersList = new ArrayList<DrawerItem>(); - final List<DrawerItem> inboxFolders = new ArrayList<DrawerItem>(); + final List<DrawerItem> allFoldersList = new ArrayList<>(); + final List<DrawerItem> inboxFolders = new ArrayList<>(); do { final Folder f = mCursor.getModel(); if (!isFolderTypeExcluded(f)) { @@ -1265,7 +1266,7 @@ public class FolderListFragment extends ListFragment implements */ private List<DrawerItem> buildAccountListDrawerItems() { final Account[] allAccounts = getAllAccounts(); - final List<DrawerItem> accountList = new ArrayList<DrawerItem>(allAccounts.length); + final List<DrawerItem> accountList = new ArrayList<>(allAccounts.length); // Add all accounts and then the current account final Uri currentAccountUri = getCurrentAccountUri(); for (final Account account : allAccounts) { @@ -1291,17 +1292,13 @@ public class FolderListFragment extends ListFragment implements return mMergedAdapter; } - public Account getCurrentAccount() { - return mCurrentAccount; - } - public ObjectCursor<Folder> getFoldersCursor() { return (mFolderAdapter != null) ? mFolderAdapter.getCursor() : null; } private class FooterAdapter extends BaseAdapter { - private final List<Object> mFooterItems = Lists.newArrayList(); + private final List<DrawerItem> mFooterItems = Lists.newArrayList(); private FooterAdapter() { update(); @@ -1313,7 +1310,7 @@ public class FolderListFragment extends ListFragment implements } @Override - public Object getItem(int position) { + public DrawerItem getItem(int position) { return mFooterItems.get(position); } @@ -1322,6 +1319,17 @@ public class FolderListFragment extends ListFragment implements return position; } + @Override + public int getViewTypeCount() { + // Accounts, headers, folders (all parts of drawer view types) + return DrawerItem.getViewTypeCount(); + } + + @Override + public int getItemViewType(int position) { + return getItem(position).getType(); + } + /** * @param convertView a view, possibly null, to be recycled. * @param parent the parent hosting this view. @@ -1329,35 +1337,7 @@ public class FolderListFragment extends ListFragment implements */ @Override public View getView(int position, View convertView, ViewGroup parent) { - final Object item = getItem(position); - if (item instanceof FooterItem) { - final ViewGroup footerItemView; - if (convertView != null) { - footerItemView = (ViewGroup) convertView; - } else { - footerItemView = (ViewGroup) getActivity().getLayoutInflater(). - inflate(R.layout.drawer_footer_item, parent, false); - } - - final FooterItem footerItem = (FooterItem) item; - - // adjust the text of the footer item - final TextView textView = (TextView) footerItemView. - findViewById(R.id.drawer_footer_text); - textView.setText(footerItem.getTextResourceID()); - - // adjust the icon of the footer item - final ImageView imageView = (ImageView) footerItemView. - findViewById(R.id.drawer_footer_image); - imageView.setImageResource(footerItem.getImageResourceID()); - return footerItemView; - } else if (item instanceof DrawerItem) { - final DrawerItem drawerItem = (DrawerItem) item; - return drawerItem.getView(convertView, parent); - } else { - throw new IllegalStateException("Only DrawerItems and FooterItems allowed, " + - item.toString()); - } + return getItem(position).getView(convertView, parent); } /** @@ -1374,11 +1354,13 @@ public class FolderListFragment extends ListFragment implements mFooterItems.clear(); if (mCurrentAccount != null) { - mFooterItems.add(new SettingsItem()); + mFooterItems.add(DrawerItem.ofSettingsItem(mActivity, mCurrentAccount, + mDrawerListener)); } if (mCurrentAccount != null && !Utils.isEmpty(mCurrentAccount.helpIntentUri)) { - mFooterItems.add(new HelpItem()); + mFooterItems.add(DrawerItem.ofHelpItem(mActivity, mCurrentAccount, + mDrawerListener)); } if (!mFooterItems.isEmpty()) { @@ -1412,9 +1394,9 @@ public class FolderListFragment extends ListFragment implements // any folder will take you to the default inbox for that account. (If you are in the // default inbox already, back exits the app.) // In both these cases, the selected folder type is not set, and must be set. - if (mSelectedDrawerItemType == DrawerItem.UNSET || (mCurrentAccount != null + if (mSelectedDrawerItemCategory == DrawerItem.UNSET || (mCurrentAccount != null && folder.folderUri.equals(mCurrentAccount.settings.defaultInbox))) { - mSelectedDrawerItemType = + mSelectedDrawerItemCategory = folder.isInbox() ? DrawerItem.FOLDER_INBOX : DrawerItem.FOLDER_OTHER; mSelectedFolderType = folder.type; } @@ -1496,91 +1478,11 @@ public class FolderListFragment extends ListFragment implements return mAccountController.getFolderListViewChoiceMode(); } - /** - * The base class of all footer items. Subclasses must fill in the logic of - * {@link #doFooterAction()} which contains the behavior when the item is selected. - */ - private abstract class FooterItem implements View.OnClickListener { - - private final int mImageResourceID; - private final int mTextResourceID; - - private FooterItem(final int imageResourceID, final int textResourceID) { - mImageResourceID = imageResourceID; - mTextResourceID = textResourceID; - } - - private int getImageResourceID() { - return mImageResourceID; - } - - private int getTextResourceID() { - return mTextResourceID; - } - - /** - * Executes the behavior associated with this footer item.<br> - * <br> - * WARNING: you probably don't want to call this directly; use - * {@link #onClick(View)} instead. This method actually performs the action, and its - * execution may be deferred from when the 'click' happens so we can smoothly close the - * drawer beforehand. - */ - abstract void doFooterAction(); - - @Override - public final void onClick(View v) { - final DrawerController dc = mActivity.getDrawerController(); - if (dc.isDrawerEnabled()) { - // close the drawer and defer handling the click until onDrawerClosed - mAccountController.closeDrawer(false /* hasNewFolderOrAccount */, - null /* nextAccount */, null /* nextFolder */); - mDrawerListener.setPendingFooterClick(this); - } else { - doFooterAction(); - } - } - - // for analytics - String getEventLabel() { - final StringBuilder sb = new StringBuilder("drawer_footer"); - sb.append("/"); - sb.append(mActivity.getViewMode().getModeString()); - return sb.toString(); - } - - } - - private class HelpItem extends FooterItem { - protected HelpItem() { - super(R.drawable.ic_drawer_help_24dp, R.string.help_and_feedback); - } - - @Override - void doFooterAction() { - Analytics.getInstance().sendMenuItemEvent(Analytics.EVENT_CATEGORY_MENU_ITEM, - R.id.help_info_menu_item, getEventLabel(), 0); - mActivity.showHelp(mCurrentAccount, ViewMode.CONVERSATION_LIST); - } - } - - private class SettingsItem extends FooterItem { - protected SettingsItem() { - super(R.drawable.ic_drawer_settings_24dp, R.string.menu_settings); - } - - @Override - void doFooterAction() { - Analytics.getInstance().sendMenuItemEvent(Analytics.EVENT_CATEGORY_MENU_ITEM, - R.id.settings, getEventLabel(), 0); - Utils.showSettings(mActivity.getActivityContext(), mCurrentAccount); - } - } /** * Drawer listener for footer functionality to react to drawer state. */ - private class DrawerStateListener implements DrawerLayout.DrawerListener { + public class DrawerStateListener implements DrawerLayout.DrawerListener { private FooterItem mPendingFooterClick; @@ -1597,7 +1499,7 @@ public class FolderListFragment extends ListFragment implements @Override public void onDrawerClosed(View drawerView) { if (mPendingFooterClick != null) { - mPendingFooterClick.doFooterAction(); + mPendingFooterClick.onFooterClicked(); mPendingFooterClick = null; } } |