diff options
author | Jin Cao <jinyan@google.com> | 2014-09-05 13:44:58 -0700 |
---|---|---|
committer | Jin Cao <jinyan@google.com> | 2014-09-17 11:37:00 -0700 |
commit | 524ded5f9d27dda75c53d256922a39c867857575 (patch) | |
tree | d40572ba3c0ca1ec00b854ebc4225535b5e84592 /src | |
parent | 92ae766a1eb3182efe5225af224c6ddd7be40931 (diff) | |
download | android_packages_apps_UnifiedEmail-524ded5f9d27dda75c53d256922a39c867857575.tar.gz android_packages_apps_UnifiedEmail-524ded5f9d27dda75c53d256922a39c867857575.tar.bz2 android_packages_apps_UnifiedEmail-524ded5f9d27dda75c53d256922a39c867857575.zip |
[Quantum search] new two-pane land search result list
In two-pane landscape, change the search bar accordingly
when we are in conversation mode (so the menu items are
visible).
b/17361017
Change-Id: Icb07fff91f0533681478d866430fbaa82bc5850c
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/mail/ui/AbstractActivityController.java | 1 | ||||
-rw-r--r-- | src/com/android/mail/ui/ActivityController.java | 2 | ||||
-rw-r--r-- | src/com/android/mail/ui/CustomViewToolbar.java | 45 | ||||
-rw-r--r-- | src/com/android/mail/ui/MailActivity.java | 2 | ||||
-rw-r--r-- | src/com/android/mail/ui/MaterialSearchActionView.java | 68 | ||||
-rw-r--r-- | src/com/android/mail/ui/MaterialSearchViewController.java | 29 | ||||
-rw-r--r-- | src/com/android/mail/ui/OnePaneController.java | 2 | ||||
-rw-r--r-- | src/com/android/mail/ui/TwoPaneController.java | 19 | ||||
-rw-r--r-- | src/com/android/mail/ui/TwoPaneLayout.java | 18 |
9 files changed, 137 insertions, 49 deletions
diff --git a/src/com/android/mail/ui/AbstractActivityController.java b/src/com/android/mail/ui/AbstractActivityController.java index 431b06ca3..c5425e4f7 100644 --- a/src/com/android/mail/ui/AbstractActivityController.java +++ b/src/com/android/mail/ui/AbstractActivityController.java @@ -1322,6 +1322,7 @@ public abstract class AbstractActivityController implements ActivityController, mSearchViewController = new MaterialSearchViewController(mActivity, this, intent, savedState); + addConversationListLayoutListener(mSearchViewController); // Immediately handle a clean launch with intent, and any state restoration // that does not rely on restored fragments or loader data diff --git a/src/com/android/mail/ui/ActivityController.java b/src/com/android/mail/ui/ActivityController.java index 91f4baf4b..3ccdad3f3 100644 --- a/src/com/android/mail/ui/ActivityController.java +++ b/src/com/android/mail/ui/ActivityController.java @@ -285,5 +285,5 @@ public interface ActivityController extends LayoutListener, /** * Attach layout listener so our custom toolbar can listen to thread list layout events. */ - void setConversationListLayoutListener(TwoPaneLayout.ConversationListLayoutListener listener); + void addConversationListLayoutListener(TwoPaneLayout.ConversationListLayoutListener listener); } diff --git a/src/com/android/mail/ui/CustomViewToolbar.java b/src/com/android/mail/ui/CustomViewToolbar.java index 7df8a3837..676321a46 100644 --- a/src/com/android/mail/ui/CustomViewToolbar.java +++ b/src/com/android/mail/ui/CustomViewToolbar.java @@ -41,8 +41,6 @@ public class CustomViewToolbar extends Toolbar implements ViewMode.ModeChangeLis protected TextView mActionBarTitle; protected View mSearchButton; - private boolean mIsTabletLandscape; - public CustomViewToolbar(Context context) { super(context); } @@ -75,8 +73,6 @@ public class CustomViewToolbar extends Toolbar implements ViewMode.ModeChangeLis mController.startSearch(); } }); - - mIsTabletLandscape = getResources().getBoolean(R.bool.is_tablet_landscape); } @Override @@ -93,29 +89,26 @@ public class CustomViewToolbar extends Toolbar implements ViewMode.ModeChangeLis @Override public void onConversationListLayout(int xEnd, boolean drawerOpen) { - // Only reposition in tablet landscape mode. - if (mIsTabletLandscape) { - if (drawerOpen) { - mSearchButton.setVisibility(INVISIBLE); + if (drawerOpen) { + mSearchButton.setVisibility(INVISIBLE); + } else { + mSearchButton.setVisibility(VISIBLE); + // Since we no longer shift the search button when the drawer opens/closes, only set + // the width of the title on the first pass (when width is 0) so we avoid changing + // width during layout passes. + final int[] coords = new int[2]; + mActionBarTitle.getLocationInWindow(coords); + final int newWidth; + if (ViewUtils.isViewRtl(this)) { + newWidth = coords[0] + mActionBarTitle.getWidth() - xEnd - + mSearchButton.getWidth(); } else { - mSearchButton.setVisibility(VISIBLE); - // Since we no longer shift the search button when the drawer opens/closes, only set - // the width of the title on the first pass (when width is 0) so we avoid changing - // width during layout passes. - final int[] coords = new int[2]; - mActionBarTitle.getLocationInWindow(coords); - final int newWidth; - if (ViewUtils.isViewRtl(this)) { - newWidth = coords[0] + mActionBarTitle.getWidth() - xEnd - - mSearchButton.getWidth(); - } else { - newWidth = xEnd - coords[0] - mSearchButton.getWidth(); - } - - // Only set the width if it's different than before so we avoid draw on layout pass. - if (mActionBarTitle.getWidth() != newWidth) { - mActionBarTitle.setWidth(newWidth); - } + newWidth = xEnd - coords[0] - mSearchButton.getWidth(); + } + + // Only set the width if it's different than before so we avoid draw on layout pass. + if (mActionBarTitle.getWidth() != newWidth) { + mActionBarTitle.setWidth(newWidth); } } } diff --git a/src/com/android/mail/ui/MailActivity.java b/src/com/android/mail/ui/MailActivity.java index bcba078c6..1251e8b94 100644 --- a/src/com/android/mail/ui/MailActivity.java +++ b/src/com/android/mail/ui/MailActivity.java @@ -179,7 +179,7 @@ public class MailActivity extends AbstractMailActivity implements ControllableAc // Tablets use CustomViewToolbar to override the default search menu item positioning. final CustomViewToolbar customViewToolbar = (CustomViewToolbar) toolbar; customViewToolbar.setController(this, mController, mViewMode); - mController.setConversationListLayoutListener(customViewToolbar); + mController.addConversationListLayoutListener(customViewToolbar); } setSupportActionBar(toolbar); toolbar.setNavigationOnClickListener(mController.getNavigationViewClickListener()); diff --git a/src/com/android/mail/ui/MaterialSearchActionView.java b/src/com/android/mail/ui/MaterialSearchActionView.java index e9f668355..e9b31e731 100644 --- a/src/com/android/mail/ui/MaterialSearchActionView.java +++ b/src/com/android/mail/ui/MaterialSearchActionView.java @@ -19,11 +19,15 @@ package com.android.mail.ui; import android.content.Context; import android.content.res.Resources; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.support.annotation.DrawableRes; import android.text.Editable; import android.text.TextWatcher; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.View; +import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; @@ -32,27 +36,52 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.android.mail.R; +import com.android.mail.utils.ViewUtils; /** * Custom view for the action bar when search is displayed. */ public class MaterialSearchActionView extends LinearLayout implements TextWatcher, View.OnClickListener, TextView.OnEditorActionListener, View.OnKeyListener { + private Drawable mNormalBackgroundDrawable; + private Drawable mTwoPaneLandConvModeBackgroundDrawable; + private @DrawableRes int mNormalBackButtonDrawable; + private @DrawableRes int mTwoPaneLandConvModeBackButtonDrawable; + private @DrawableRes int mNormalClearTextButtonDrawable; + private @DrawableRes int mTwoPaneLandConvModeClearTextButtonDrawable; + private @DrawableRes int mNormalVoiceButtonDrawable; + private @DrawableRes int mTwoPaneLandConvModeVoiceButtonDrawable; + private int mNormalTextColor; + private int mTwoPaneLandConvModeTextColor; + private MaterialSearchViewController mController; private InputMethodManager mImm; private boolean mShowingClose; private boolean mSupportVoice; - private View mBackButton; + private ImageView mBackButton; private EditText mQueryText; private ImageView mEndingButton; public MaterialSearchActionView(Context context) { - super(context); + this(context, null); } public MaterialSearchActionView(Context context, AttributeSet attrs) { super(context, attrs); + + final Resources res = getResources(); + mNormalBackgroundDrawable = new ColorDrawable(res.getColor(android.R.color.white)); + mTwoPaneLandConvModeBackgroundDrawable = + new ColorDrawable(res.getColor(R.color.actionbar_color)); + mNormalBackButtonDrawable = R.drawable.ic_arrow_back_24dp_with_rtl; + mTwoPaneLandConvModeBackButtonDrawable = R.drawable.ic_arrow_back_wht_24dp; + mNormalClearTextButtonDrawable = R.drawable.ic_close_24dp; + mTwoPaneLandConvModeClearTextButtonDrawable = R.drawable.ic_close_wht_24dp; + mNormalVoiceButtonDrawable = R.drawable.ic_mic_24dp; + mTwoPaneLandConvModeVoiceButtonDrawable = R.drawable.ic_mic_white_24dp; + mNormalTextColor = res.getColor(R.color.search_query_text); + mTwoPaneLandConvModeTextColor = res.getColor(android.R.color.white); } // PUBLIC API @@ -76,12 +105,45 @@ public class MaterialSearchActionView extends LinearLayout implements TextWatche } } + public void adjustViewForTwoPaneLandscape(boolean alignWithTL, int xEnd) { + final ViewGroup.LayoutParams params = getLayoutParams(); + if (alignWithTL) { + setBackgroundDrawable(mTwoPaneLandConvModeBackgroundDrawable); + mBackButton.setImageResource(mTwoPaneLandConvModeBackButtonDrawable); + if (mShowingClose) { + mEndingButton.setImageResource(mTwoPaneLandConvModeClearTextButtonDrawable); + } else { + mEndingButton.setImageResource(mTwoPaneLandConvModeVoiceButtonDrawable); + } + mQueryText.setTextColor(mTwoPaneLandConvModeTextColor); + + if (ViewUtils.isViewRtl(this)) { + int[] coords = new int[2]; + getLocationInWindow(coords); + params.width = coords[0] + getWidth() - xEnd; + } else { + params.width = xEnd; + } + } else { + setBackgroundDrawable(mNormalBackgroundDrawable); + mBackButton.setImageResource(mNormalBackButtonDrawable); + if (mShowingClose) { + mEndingButton.setImageResource(mNormalClearTextButtonDrawable); + } else { + mEndingButton.setImageResource(mNormalVoiceButtonDrawable); + } + mQueryText.setTextColor(mNormalTextColor); + params.width = ViewGroup.LayoutParams.MATCH_PARENT; + } + setLayoutParams(params); + } + @Override protected void onFinishInflate() { super.onFinishInflate(); mImm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - mBackButton = findViewById(R.id.search_actionbar_back_button); + mBackButton = (ImageView) findViewById(R.id.search_actionbar_back_button); mBackButton.setOnClickListener(this); mQueryText = (EditText) findViewById(R.id.search_actionbar_query_text); mQueryText.addTextChangedListener(this); diff --git a/src/com/android/mail/ui/MaterialSearchViewController.java b/src/com/android/mail/ui/MaterialSearchViewController.java index 5014e1901..b5e01afc2 100644 --- a/src/com/android/mail/ui/MaterialSearchViewController.java +++ b/src/com/android/mail/ui/MaterialSearchViewController.java @@ -36,7 +36,8 @@ import java.util.Locale; /** * Controller for interactions between ActivityController and our custom search views. */ -public class MaterialSearchViewController implements ViewMode.ModeChangeListener { +public class MaterialSearchViewController implements ViewMode.ModeChangeListener, + TwoPaneLayout.ConversationListLayoutListener { // The controller is not in search mode. Both search action bar and the suggestion list // are not visible to the user. public static final int SEARCH_VIEW_STATE_GONE = 0; @@ -59,6 +60,7 @@ public class MaterialSearchViewController implements ViewMode.ModeChangeListener private int mViewMode; private int mViewState; + private int mEndXCoordForTabletLandscape; private boolean mWaitToDestroyProvider; @@ -110,6 +112,21 @@ public class MaterialSearchViewController implements ViewMode.ModeChangeListener mViewMode = newMode; } + @Override + public void onConversationListLayout(int xEnd, boolean drawerOpen) { + // Only care about the first layout + if (mEndXCoordForTabletLandscape != xEnd) { + // This is called when we get into tablet landscape mode + mEndXCoordForTabletLandscape = xEnd; + if (ViewMode.isSearchMode(mViewMode)) { + final int defaultVisibility = mController.shouldShowSearchBarByDefault() ? + View.VISIBLE : View.GONE; + mSearchActionView.setVisibility(drawerOpen ? View.INVISIBLE : defaultVisibility); + } + adjustViewForTwoPaneLandscape(); + } + } + public boolean handleBackPress() { final boolean shouldShowSearchBar = mController.shouldShowSearchBarByDefault(); if (shouldShowSearchBar && mSearchSuggestionList.isShown()) { @@ -132,6 +149,7 @@ public class MaterialSearchViewController implements ViewMode.ModeChangeListener mSearchActionView.setVisibility(View.VISIBLE); mSearchSuggestionList.setVisibility(View.GONE); mSearchActionView.focusSearchBar(false); + adjustViewForTwoPaneLandscape(); break; } // Fallthrough to setting everything invisible @@ -146,12 +164,21 @@ public class MaterialSearchViewController implements ViewMode.ModeChangeListener break; case MaterialSearchViewController.SEARCH_VIEW_STATE_VISIBLE: mSearchActionView.setVisibility(View.VISIBLE); + // Set to default layout/assets + mSearchActionView.adjustViewForTwoPaneLandscape(false /* do not align */, 0); mSearchSuggestionList.setVisibility(View.VISIBLE); mSearchActionView.focusSearchBar(true); break; } } + private void adjustViewForTwoPaneLandscape() { + final boolean alignWithTL = mController.isTwoPaneLandscape() && + mViewState == MaterialSearchViewController.SEARCH_VIEW_STATE_ONLY_ACTIONBAR && + ViewMode.isSearchMode(mViewMode); + mSearchActionView.adjustViewForTwoPaneLandscape(alignWithTL, mEndXCoordForTabletLandscape); + } + public void onQueryTextChanged(String query) { mSearchSuggestionList.setQuery(query); } diff --git a/src/com/android/mail/ui/OnePaneController.java b/src/com/android/mail/ui/OnePaneController.java index 196c5ff3c..875bb5a64 100644 --- a/src/com/android/mail/ui/OnePaneController.java +++ b/src/com/android/mail/ui/OnePaneController.java @@ -526,7 +526,7 @@ public final class OnePaneController extends AbstractActivityController { } @Override - public void setConversationListLayoutListener( + public void addConversationListLayoutListener( TwoPaneLayout.ConversationListLayoutListener listener) { // Do nothing } diff --git a/src/com/android/mail/ui/TwoPaneController.java b/src/com/android/mail/ui/TwoPaneController.java index 71d73d691..55b9e5841 100644 --- a/src/com/android/mail/ui/TwoPaneController.java +++ b/src/com/android/mail/ui/TwoPaneController.java @@ -37,6 +37,9 @@ import com.android.mail.providers.Folder; import com.android.mail.providers.UIProvider.ConversationListIcon; import com.android.mail.utils.LogUtils; import com.android.mail.utils.Utils; +import com.google.common.collect.Lists; + +import java.util.List; /** * Controller for two-pane Mail activity. Two Pane is used for tablets, where screen real estate @@ -50,6 +53,8 @@ public final class TwoPaneController extends AbstractActivityController implemen "saved-miscellaneous-view-transaction-id"; private TwoPaneLayout mLayout; + private List<TwoPaneLayout.ConversationListLayoutListener> mConversationListLayoutListeners = + Lists.newArrayList(); @Deprecated private Conversation mConversationToShow; @@ -84,8 +89,6 @@ public final class TwoPaneController extends AbstractActivityController implemen private boolean mIsTabletLandscape; - private TwoPaneLayout.ConversationListLayoutListener mConversationListLayoutListener; - public TwoPaneController(MailActivity activity, ViewMode viewMode) { super(activity, viewMode); } @@ -169,7 +172,6 @@ public final class TwoPaneController extends AbstractActivityController implemen LogUtils.wtf(LOG_TAG, "mLayout is null!"); return false; } - mLayout.setConversationListLayoutListener(mConversationListLayoutListener); mLayout.setController(this); mActivity.getWindow().setBackgroundDrawable(null); mIsTabletLandscape = mActivity.getResources().getBoolean(R.bool.is_tablet_landscape); @@ -685,11 +687,12 @@ public final class TwoPaneController extends AbstractActivityController implemen } @Override - public void setConversationListLayoutListener( + public void addConversationListLayoutListener( TwoPaneLayout.ConversationListLayoutListener listener) { - mConversationListLayoutListener = listener; - if (mLayout != null) { - mLayout.setConversationListLayoutListener(listener); - } + mConversationListLayoutListeners.add(listener); + } + + public List<TwoPaneLayout.ConversationListLayoutListener> getConversationListLayoutListeners() { + return mConversationListLayoutListeners; } } diff --git a/src/com/android/mail/ui/TwoPaneLayout.java b/src/com/android/mail/ui/TwoPaneLayout.java index c4f612ece..d6871144a 100644 --- a/src/com/android/mail/ui/TwoPaneLayout.java +++ b/src/com/android/mail/ui/TwoPaneLayout.java @@ -97,7 +97,6 @@ final class TwoPaneLayout extends FrameLayout implements ModeChangeListener { private TwoPaneController mController; private LayoutListener mListener; - private ConversationListLayoutListener mConversationListLayoutListener; private View mMiscellaneousView; private View mConversationView; @@ -115,6 +114,12 @@ final class TwoPaneLayout extends FrameLayout implements ModeChangeListener { public static final int MISCELLANEOUS_VIEW_ID = R.id.miscellaneous_pane; public interface ConversationListLayoutListener { + /** + * Used for two-pane landscape layout positioning when other views need to align themselves + * to the list view. Should be called only in tablet landscape mode! + * @param xEnd the ending x coordinate of the list view + * @param drawerOpen + */ void onConversationListLayout(int xEnd, boolean drawerOpen); } @@ -279,9 +284,10 @@ final class TwoPaneLayout extends FrameLayout implements ModeChangeListener { final boolean listVisible = isRtl ? listX + mListView.getWidth() >= 0 : listX >= 0; adjustPaneVisibility(folderVisible, listVisible, cvOnScreen); - if (mConversationListLayoutListener != null) { - mConversationListLayoutListener.onConversationListLayout( - isRtl ? listX : convX, isDrawerOpen); + final List<ConversationListLayoutListener> layoutListeners = + mController.getConversationListLayoutListeners(); + for (ConversationListLayoutListener listener : layoutListeners) { + listener.onConversationListLayout(isRtl ? listX : convX, isDrawerOpen); } mPositionedMode = mCurrentMode; @@ -526,10 +532,6 @@ final class TwoPaneLayout extends FrameLayout implements ModeChangeListener { return !mListCollapsible; } - public void setConversationListLayoutListener(ConversationListLayoutListener listener) { - mConversationListLayoutListener = listener; - } - private class PaneAnimationListener extends AnimatorListenerAdapter implements Runnable { @Override |