summaryrefslogtreecommitdiffstats
path: root/src/com/android/mail/ui/FolderListFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/mail/ui/FolderListFragment.java')
-rw-r--r--src/com/android/mail/ui/FolderListFragment.java202
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;
}
}