summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Hibdon <mhibdon@google.com>2014-02-19 13:55:28 -0800
committerMartin Hibdon <mhibdon@google.com>2014-02-26 10:52:44 -0800
commit371a71c7f41155a83526e4745c993585c236b9d7 (patch)
treeb704a3832a6befb8eb2af5fbb9d200ab76fb457d
parenta97dda6f9bd716c862311cc84ab174835ba97660 (diff)
downloadandroid_packages_apps_UnifiedEmail-371a71c7f41155a83526e4745c993585c236b9d7.tar.gz
android_packages_apps_UnifiedEmail-371a71c7f41155a83526e4745c993585c236b9d7.tar.bz2
android_packages_apps_UnifiedEmail-371a71c7f41155a83526e4745c993585c236b9d7.zip
Make drawer available in Search and ConversationView
b/8737446 This is more complicated to do correctly than it seems like it should be: When we are viewing search results, there is actually a separate activity instance on top of the main conversation list activity. This is true for both one and two pane layouts. So now, when we launch the search activity, we do it with startActivityForResult. If the result is set upon return, then the parent activity will know to navigate to a different folder or account. Change-Id: I5b780c4ce5bb0a1e55364cc4df280346900c5df5
-rw-r--r--src/com/android/mail/ui/AbstractActivityController.java65
-rw-r--r--src/com/android/mail/ui/FolderListFragment.java28
-rw-r--r--src/com/android/mail/ui/OnePaneController.java13
-rw-r--r--src/com/android/mail/ui/TwoPaneController.java33
4 files changed, 109 insertions, 30 deletions
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java
index 28b696d04..031b00dc6 100644
--- a/src/com/android/mail/ui/AbstractActivityController.java
+++ b/src/com/android/mail/ui/AbstractActivityController.java
@@ -418,6 +418,12 @@ public abstract class AbstractActivityController implements ActivityController,
private static final int ADD_ACCOUNT_REQUEST_CODE = 1;
/** Code returned when the user has to enter the new password on an existing account. */
private static final int REAUTHENTICATE_REQUEST_CODE = 2;
+ /** Code returned when the previous activity needs to navigate to a different folder
+ * or account */
+ private static final int CHANGE_NAVIGATION_REQUEST_CODE = 3;
+
+ public static final String EXTRA_FOLDER = "extra-folder";
+ public static final String EXTRA_ACCOUNT = "extra-account";
/** The pending destructive action to be carried out before swapping the conversation cursor.*/
private DestructiveAction mPendingDestruction;
@@ -654,6 +660,17 @@ public abstract class AbstractActivityController implements ActivityController,
@Override
public void switchToDefaultInboxOrChangeAccount(Account account) {
LogUtils.d(LOG_TAG, "AAC.switchToDefaultAccount(%s)", account);
+ if (mViewMode.getMode() == ViewMode.SEARCH_RESULTS_LIST ||
+ mViewMode.getMode() == ViewMode.SEARCH_RESULTS_CONVERSATION) {
+ // We are in an activity on top of the main navigation activity.
+ // We need to return to it with a result code that indicates it should navigate to
+ // a different folder.
+ final Intent intent = new Intent();
+ intent.putExtra(AbstractActivityController.EXTRA_ACCOUNT, account);
+ mActivity.setResult(Activity.RESULT_OK, intent);
+ mActivity.finish();
+ return;
+ }
final boolean firstLoad = mAccount == null;
final boolean switchToDefaultInbox = !firstLoad && account.uri.equals(mAccount.uri);
// If the active account has been clicked in the drawer, go to default inbox
@@ -846,8 +863,7 @@ public abstract class AbstractActivityController implements ActivityController,
final int mode = mViewMode.getMode();
mDrawerToggle.setDrawerIndicatorEnabled(
getShouldShowDrawerIndicator(mode, isTopLevel));
- mDrawerContainer.setDrawerLockMode(getShouldAllowDrawerPull(mode)
- ? DrawerLayout.LOCK_MODE_UNLOCKED : DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
+ mDrawerContainer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
mDrawerContainer.closeDrawers();
@@ -1077,6 +1093,22 @@ public abstract class AbstractActivityController implements ActivityController,
}
}
break;
+ case CHANGE_NAVIGATION_REQUEST_CODE:
+ if (resultCode == Activity.RESULT_OK && data != null) {
+ // We have have received a result that indicates we need to navigate to a
+ // different folder or account. This happens if someone navigates using the
+ // drawer on the search results activity.
+ final Folder folder = data.getParcelableExtra(EXTRA_FOLDER);
+ final Account account = data.getParcelableExtra(EXTRA_ACCOUNT);
+ if (folder != null) {
+ onFolderSelected(folder);
+ mViewMode.enterConversationListMode();
+ } else if (account != null) {
+ switchToDefaultInboxOrChangeAccount(account);
+ mViewMode.enterConversationListMode();
+ }
+ }
+ break;
}
}
@@ -2071,7 +2103,9 @@ public abstract class AbstractActivityController implements ActivityController,
intent.putExtra(Utils.EXTRA_ACCOUNT, mAccount);
intent.setComponent(mActivity.getComponentName());
mActionBarView.collapseSearch();
- mActivity.startActivity(intent);
+ // Call startActivityForResult here so we can tell if we have navigated to a different folder
+ // or account from search results.
+ mActivity.startActivityForResult(intent, CHANGE_NAVIGATION_REQUEST_CODE);
}
@Override
@@ -2126,8 +2160,7 @@ public abstract class AbstractActivityController implements ActivityController,
final boolean isTopLevel = (mFolder == null) || (mFolder.parent == Uri.EMPTY);
mDrawerToggle.setDrawerIndicatorEnabled(
getShouldShowDrawerIndicator(newMode, isTopLevel));
- mDrawerContainer.setDrawerLockMode(getShouldAllowDrawerPull(newMode)
- ? DrawerLayout.LOCK_MODE_UNLOCKED : DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
+ mDrawerContainer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
closeDrawerIfOpen();
}
}
@@ -2146,21 +2179,6 @@ public abstract class AbstractActivityController implements ActivityController,
&& (viewMode == ViewMode.CONVERSATION_LIST && isTopLevel);
}
- /**
- * Returns true if the left-screen swipe action (or Home icon tap) should pull a drawer out.
- * @param viewMode the current view mode.
- * @return whether the drawer can be opened using a swipe action or action bar tap.
- */
- private static boolean getShouldAllowDrawerPull(final int viewMode) {
- // if search list/conv mode, disable drawer pull
- // allow drawer pull everywhere except conversation mode where the list is hidden
- return !ViewMode.isSearchMode(viewMode) && !ViewMode.isConversationMode(viewMode) &&
- !ViewMode.isAdMode(viewMode);
-
- // TODO(ath): get this to work to allow drawer pull in 2-pane conv mode.
- /* && !isConversationListVisible() */
- }
-
public void disablePagerUpdates() {
mPagerController.stopListening();
}
@@ -4211,8 +4229,13 @@ public abstract class AbstractActivityController implements ActivityController,
*/
@Override
public void onDrawerStateChanged(int newState) {
+ LogUtils.d(LOG_TAG, "AAC onDrawerStateChanged %d", newState);
mDrawerState = newState;
mDrawerToggle.onDrawerStateChanged(mDrawerState);
+ if (mViewMode.getMode() == ViewMode.SEARCH_RESULTS_LIST ||
+ mViewMode.getMode() == ViewMode.SEARCH_RESULTS_CONVERSATION) {
+ return;
+ }
if (mDrawerState == DrawerLayout.STATE_IDLE) {
if (mHasNewAccountOrFolder) {
refreshDrawer();
@@ -4257,7 +4280,7 @@ public abstract class AbstractActivityController implements ActivityController,
@Override
public boolean isDrawerPullEnabled() {
- return getShouldAllowDrawerPull(mViewMode.getMode());
+ return true;
}
@Override
diff --git a/src/com/android/mail/ui/FolderListFragment.java b/src/com/android/mail/ui/FolderListFragment.java
index 3332d4e42..361da9056 100644
--- a/src/com/android/mail/ui/FolderListFragment.java
+++ b/src/com/android/mail/ui/FolderListFragment.java
@@ -135,6 +135,7 @@ public class FolderListFragment extends ListFragment implements
private static final String BUNDLE_LIST_STATE = "flf-list-state";
private static final String BUNDLE_SELECTED_FOLDER = "flf-selected-folder";
+ private static final String BUNDLE_SELECTED_ITEM_TYPE = "flf-selected-item-type";
private static final String BUNDLE_SELECTED_TYPE = "flf-selected-type";
/** Adapter used by the list that wraps both the folder adapter and the accounts adapter. */
@@ -156,7 +157,10 @@ 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 mSelectedFolderType = DrawerItem.UNSET;
+ private int mSelectedDrawerItemType = DrawerItem.UNSET;
+
+ /** The FolderType of the selected folder {@link FolderType} */
+ private int mSelectedFolderType = FolderType.INBOX;
/** The current account according to the controller */
protected Account mCurrentAccount;
/** The account we will change to once the drawer (if any) is closed */
@@ -384,6 +388,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);
mSelectedFolderType = savedState.getInt(BUNDLE_SELECTED_TYPE);
} else if (mParentFolder != null) {
mSelectedFolderUri = mParentFolder.folderUri;
@@ -417,6 +422,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_TYPE, mSelectedFolderType);
}
@@ -467,7 +473,8 @@ public class FolderListFragment extends ListFragment implements
private void changeAccount(final Account account) {
// Switching accounts takes you to the default inbox for that account.
- mSelectedFolderType = DrawerItem.FOLDER_INBOX;
+ mSelectedDrawerItemType = DrawerItem.FOLDER_INBOX;
+ mSelectedFolderType = FolderType.INBOX;
mNextAccount = account;
mAccountController.closeDrawer(true, mNextAccount, getDefaultInbox(mNextAccount));
Analytics.getInstance().sendEvent("switch_account", "drawer_account_switch", null, 0);
@@ -494,9 +501,10 @@ public class FolderListFragment extends ListFragment implements
} else if (itemType == DrawerItem.VIEW_FOLDER) {
// Folder type, so change folders only.
folder = drawerItem.mFolder;
- mSelectedFolderType = folderType = drawerItem.mFolderType;
+ mSelectedDrawerItemType = folderType = drawerItem.mFolderType;
+ mSelectedFolderType = folder.type;
LogUtils.d(LOG_TAG, "FLF.viewFolderOrChangeAccount folder=%s, type=%d",
- folder, mSelectedFolderType);
+ folder, mSelectedDrawerItemType);
} else {
// Do nothing.
LogUtils.d(LOG_TAG, "FolderListFragment: viewFolderOrChangeAccount():"
@@ -663,7 +671,7 @@ public class FolderListFragment extends ListFragment implements
final DrawerItem item = (DrawerItem) getItem(position);
final View view = item.getView(convertView, parent);
final int type = item.mType;
- final boolean isSelected = item.isHighlighted(mSelectedFolderUri, mSelectedFolderType);
+ final boolean isSelected = item.isHighlighted(mSelectedFolderUri, mSelectedDrawerItemType);
if (type == DrawerItem.VIEW_FOLDER) {
mListView.setItemChecked(mAccountsAdapter.getCount() + position, isSelected);
}
@@ -801,7 +809,10 @@ public class FolderListFragment extends ListFragment implements
} while (!currentFolderFound && mAllFolderListCursor.moveToNext());
}
- if (!currentFolderFound && mSelectedFolderUri != FolderUri.EMPTY
+ // The search folder will not be found here because it is excluded from the drawer.
+ // Don't switch off from the current folder if it's search.
+ if (!currentFolderFound && !Folder.isType(FolderType.SEARCH, mSelectedFolderType)
+ && mSelectedFolderUri != FolderUri.EMPTY
&& mCurrentAccount != null && mAccountController != null
&& mAccountController.isDrawerPullEnabled()) {
LogUtils.d(LOG_TAG, "Current folder (%1$s) has disappeared for %2$s",
@@ -1087,10 +1098,11 @@ 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 (mSelectedFolderType == DrawerItem.UNSET || (mCurrentAccount != null
+ if (mSelectedDrawerItemType == DrawerItem.UNSET || (mCurrentAccount != null
&& folder.folderUri.equals(mCurrentAccount.settings.defaultInbox))) {
- mSelectedFolderType =
+ mSelectedDrawerItemType =
folder.isInbox() ? DrawerItem.FOLDER_INBOX : DrawerItem.FOLDER_OTHER;
+ mSelectedFolderType = folder.type;
}
mCurrentFolderForUnreadCheck = folder;
diff --git a/src/com/android/mail/ui/OnePaneController.java b/src/com/android/mail/ui/OnePaneController.java
index 57f6d36d5..5d3759143 100644
--- a/src/com/android/mail/ui/OnePaneController.java
+++ b/src/com/android/mail/ui/OnePaneController.java
@@ -17,9 +17,11 @@
package com.android.mail.ui;
+import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
+import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
@@ -338,6 +340,17 @@ public final class OnePaneController extends AbstractActivityController {
@Override
public void onFolderSelected(Folder folder) {
+ if (mViewMode.getMode() == ViewMode.SEARCH_RESULTS_LIST ||
+ mViewMode.getMode() == ViewMode.SEARCH_RESULTS_CONVERSATION) {
+ // We are in an activity on top of the main navigation activity.
+ // We need to return to it with a result code that indicates it should navigate to
+ // a different folder.
+ final Intent intent = new Intent();
+ intent.putExtra(AbstractActivityController.EXTRA_FOLDER, folder);
+ mActivity.setResult(Activity.RESULT_OK, intent);
+ mActivity.finish();
+ return;
+ }
setHierarchyFolder(folder);
super.onFolderSelected(folder);
}
diff --git a/src/com/android/mail/ui/TwoPaneController.java b/src/com/android/mail/ui/TwoPaneController.java
index fd1ac3d61..134cd1c83 100644
--- a/src/com/android/mail/ui/TwoPaneController.java
+++ b/src/com/android/mail/ui/TwoPaneController.java
@@ -17,6 +17,7 @@
package com.android.mail.ui;
+import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
@@ -30,6 +31,7 @@ import android.widget.ListView;
import com.android.mail.ConversationListContext;
import com.android.mail.R;
+import com.android.mail.providers.Account;
import com.android.mail.providers.Conversation;
import com.android.mail.providers.Folder;
import com.android.mail.providers.UIProvider.ConversationListIcon;
@@ -159,9 +161,38 @@ public final class TwoPaneController extends AbstractActivityController {
}
@Override
+ public void switchToDefaultInboxOrChangeAccount(Account account) {
+ if (mViewMode.getMode() == ViewMode.SEARCH_RESULTS_LIST ||
+ mViewMode.getMode() == ViewMode.SEARCH_RESULTS_CONVERSATION) {
+ // We are in an activity on top of the main navigation activity.
+ // We need to return to it with a result code that indicates it should navigate to
+ // a different folder.
+ final Intent intent = new Intent();
+ intent.putExtra(AbstractActivityController.EXTRA_ACCOUNT, account);
+ mActivity.setResult(Activity.RESULT_OK, intent);
+ mActivity.finish();
+ return;
+ }
+ if (mViewMode.getMode() != ViewMode.CONVERSATION_LIST) {
+ mViewMode.enterConversationListMode();
+ }
+ super.switchToDefaultInboxOrChangeAccount(account);
+ }
+
+ @Override
public void onFolderSelected(Folder folder) {
// It's possible that we are not in conversation list mode
- if (mViewMode.getMode() != ViewMode.CONVERSATION_LIST) {
+ if (mViewMode.getMode() == ViewMode.SEARCH_RESULTS_LIST ||
+ mViewMode.getMode() == ViewMode.SEARCH_RESULTS_CONVERSATION) {
+ // We are in an activity on top of the main navigation activity.
+ // We need to return to it with a result code that indicates it should navigate to
+ // a different folder.
+ final Intent intent = new Intent();
+ intent.putExtra(AbstractActivityController.EXTRA_FOLDER, folder);
+ mActivity.setResult(Activity.RESULT_OK, intent);
+ mActivity.finish();
+ return;
+ } else if (mViewMode.getMode() != ViewMode.CONVERSATION_LIST) {
mViewMode.enterConversationListMode();
}