diff options
author | Jin Cao <jinyan@google.com> | 2014-08-05 14:03:59 -0700 |
---|---|---|
committer | Jin Cao <jinyan@google.com> | 2014-08-08 17:57:43 -0700 |
commit | a7404589b03ac9dd0d07b3f7d0a1ec92ac9acb62 (patch) | |
tree | 0d8e9613760c7ffff1a6ca24b910671a231f38cb | |
parent | 094986e3c824d705909af10464954532c377adc3 (diff) | |
download | android_packages_apps_UnifiedEmail-a7404589b03ac9dd0d07b3f7d0a1ec92ac9acb62.tar.gz android_packages_apps_UnifiedEmail-a7404589b03ac9dd0d07b3f7d0a1ec92ac9acb62.tar.bz2 android_packages_apps_UnifiedEmail-a7404589b03ac9dd0d07b3f7d0a1ec92ac9acb62.zip |
[KBNav CV] basic support for CV keyboard nav
Support basic navigation via keyboard in CV.
b/16636060
Change-Id: I66dbcd8015d722244b57c4e24579d0d854d3ee74
-rw-r--r-- | res/layout/conversation_footer.xml | 3 | ||||
-rw-r--r-- | res/layout/conversation_message_footer.xml | 3 | ||||
-rw-r--r-- | res/layout/conversation_message_header.xml | 35 | ||||
-rw-r--r-- | res/layout/conversation_message_upper_header.xml | 5 | ||||
-rw-r--r-- | res/layout/conversation_message_upper_header_actions.xml | 21 | ||||
-rw-r--r-- | res/layout/conversation_message_upper_header_text.xml | 7 | ||||
-rw-r--r-- | res/layout/conversation_view.xml | 12 | ||||
-rw-r--r-- | res/layout/conversation_view_header.xml | 3 | ||||
-rw-r--r-- | res/layout/super_collapsed_block.xml | 3 | ||||
-rw-r--r-- | src/com/android/mail/browse/ConversationContainer.java | 1 | ||||
-rw-r--r-- | src/com/android/mail/browse/ConversationOverlayItem.java | 17 | ||||
-rw-r--r-- | src/com/android/mail/browse/ConversationViewAdapter.java | 84 | ||||
-rw-r--r-- | src/com/android/mail/ui/ConversationViewFragment.java | 32 | ||||
-rw-r--r-- | src/com/android/mail/ui/TwoPaneController.java | 11 | ||||
-rw-r--r-- | src/com/android/mail/ui/TwoPaneLayout.java | 13 |
15 files changed, 198 insertions, 52 deletions
diff --git a/res/layout/conversation_footer.xml b/res/layout/conversation_footer.xml index c8eb691cc..edd270a87 100644 --- a/res/layout/conversation_footer.xml +++ b/res/layout/conversation_footer.xml @@ -33,18 +33,21 @@ <TextView android:id="@+id/reply_button" android:drawableTop="@drawable/ic_reply_24dp" + android:focusable="true" android:text="@string/reply" style="@style/ConversationFooterButtonStyle" /> <TextView android:id="@+id/reply_all_button" android:drawableTop="@drawable/ic_reply_all_24dp" + android:focusable="true" android:text="@string/reply_all" style="@style/ConversationFooterButtonStyle" /> <TextView android:id="@+id/forward_button" android:drawableTop="@drawable/ic_forward_24dp" + android:focusable="true" android:text="@string/forward" style="@style/ConversationFooterButtonStyle" /> diff --git a/res/layout/conversation_message_footer.xml b/res/layout/conversation_message_footer.xml index 367801ed5..e3667bd06 100644 --- a/res/layout/conversation_message_footer.xml +++ b/res/layout/conversation_message_footer.xml @@ -20,13 +20,14 @@ android:id="@+id/attachments" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" > + android:orientation="vertical"> <TextView android:id="@+id/view_entire_message_prompt" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/selectableItemBackground" + android:focusable="true" android:paddingTop="12dp" android:paddingBottom="12dp" android:text="@string/view_entire_message" diff --git a/res/layout/conversation_message_header.xml b/res/layout/conversation_message_header.xml index 7a8489179..0f9dce2d7 100644 --- a/res/layout/conversation_message_header.xml +++ b/res/layout/conversation_message_header.xml @@ -19,24 +19,27 @@ xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:visibility="visible" - android:orientation="vertical"> + android:orientation="vertical" + android:visibility="visible"> - <include android:id="@+id/message_header_border" layout="@layout/conversation_view_border" /> + <include layout="@layout/conversation_view_border" + android:id="@+id/message_header_border" /> <include layout="@layout/conversation_message_upper_header" - android:id="@+id/upper_header" /> - - <LinearLayout android:id="@+id/header_extra_content" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@color/message_header_background_color" - android:orientation="vertical" /> - - <View android:id="@+id/snap_header_bottom_border" - android:layout_width="match_parent" - android:layout_height="12dp" - android:background="@drawable/snap_header_gradient" - android:visibility="gone" /> + android:id="@+id/upper_header" /> + + <LinearLayout + android:id="@+id/header_extra_content" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:background="@color/message_header_background_color" + android:orientation="vertical" /> + + <View + android:id="@+id/snap_header_bottom_border" + android:layout_width="match_parent" + android:layout_height="12dp" + android:background="@drawable/snap_header_gradient" + android:visibility="gone" /> </com.android.mail.browse.MessageHeaderView> diff --git a/res/layout/conversation_message_upper_header.xml b/res/layout/conversation_message_upper_header.xml index b8552df93..a64122a1b 100644 --- a/res/layout/conversation_message_upper_header.xml +++ b/res/layout/conversation_message_upper_header.xml @@ -18,8 +18,9 @@ <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@color/message_header_background_color" - android:duplicateParentState="true" > + android:addStatesFromChildren="true" + android:background="?android:attr/selectableItemBackground" + android:focusable="true"> <com.android.mail.browse.MessageHeaderContactBadge android:id="@+id/photo" diff --git a/res/layout/conversation_message_upper_header_actions.xml b/res/layout/conversation_message_upper_header_actions.xml index ab98ec3ec..69297ad47 100644 --- a/res/layout/conversation_message_upper_header_actions.xml +++ b/res/layout/conversation_message_upper_header_actions.xml @@ -16,25 +16,30 @@ limitations under the License. --> <merge xmlns:android="http://schemas.android.com/apk/res/android"> + <ImageView android:id="@+id/edit_draft" - style="@style/MessageHeaderActionButtonStyle" - android:visibility="gone" + android:contentDescription="@string/resume_draft" android:src="@drawable/ic_edit_24dp" - android:contentDescription="@string/resume_draft" /> + android:visibility="gone" + style="@style/MessageHeaderActionButtonStyle" /> + <ImageView android:id="@+id/reply" - style="@style/MessageHeaderActionButtonStyle" + android:contentDescription="@string/reply" android:src="@drawable/ic_reply_24dp" - android:contentDescription="@string/reply" /> + style="@style/MessageHeaderActionButtonStyle" /> + <ImageView android:id="@+id/reply_all" - style="@style/MessageHeaderActionButtonStyle" + android:contentDescription="@string/reply_all" android:src="@drawable/ic_reply_all_24dp" - android:contentDescription="@string/reply_all" /> + style="@style/MessageHeaderActionButtonStyle" /> + <ImageView android:id="@+id/overflow" - android:layout_height="@dimen/message_header_action_button_height" android:layout_width="@dimen/message_header_action_button_width" + android:layout_height="@dimen/message_header_action_button_height" style="@style/OverflowButtonStyle" /> + </merge> diff --git a/res/layout/conversation_message_upper_header_text.xml b/res/layout/conversation_message_upper_header_text.xml index eedad010a..e311e644a 100644 --- a/res/layout/conversation_message_upper_header_text.xml +++ b/res/layout/conversation_message_upper_header_text.xml @@ -35,6 +35,7 @@ android:visibility="gone" android:lines="1" style="@style/MessageHeaderUpperDateStyle" /> + <ImageView android:id="@+id/attachment" android:layout_width="wrap_content" @@ -44,6 +45,7 @@ android:layout_toLeftOf="@id/upper_date" android:src="@drawable/ic_attach_file_20dp" style="@style/AttachmentIconStyle" /> + <TextView android:id="@id/sender_name" android:layout_width="wrap_content" @@ -51,12 +53,14 @@ android:layout_toStartOf="@id/attachment" android:layout_toLeftOf="@id/attachment" style="@style/MessageSenderNameStyle" /> + <TextView android:id="@+id/recipient_summary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/sender_name" style="@style/MessageHeaderSubtitleStyle" /> + <TextView android:id="@+id/send_date" android:layout_width="wrap_content" @@ -65,6 +69,7 @@ android:background="?android:attr/selectableItemBackground" android:paddingBottom="@dimen/message_header_margin_bottom" style="@style/MessageHeaderSubtitleStyle" /> + <TextView android:id="@+id/hide_details" android:layout_width="wrap_content" @@ -76,6 +81,7 @@ android:textColor="@color/conversation_view_text_color_link_blue" android:visibility="gone" style="@style/MessageHeaderSubtitleStyle" /> + <TextView android:id="@+id/email_snippet" android:layout_width="wrap_content" @@ -83,4 +89,5 @@ android:layout_marginBottom="16dp" android:layout_below="@id/sender_name" style="@style/MessageHeaderSnippetStyle" /> + </RelativeLayout> diff --git a/res/layout/conversation_view.xml b/res/layout/conversation_view.xml index 9bcd4f9ce..6689ee0cb 100644 --- a/res/layout/conversation_view.xml +++ b/res/layout/conversation_view.xml @@ -18,6 +18,7 @@ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> + <com.android.mail.browse.ConversationContainer android:id="@+id/conversation_container" android:layout_width="match_parent" @@ -28,17 +29,22 @@ android:id="@+id/conversation_webview" android:layout_width="match_parent" android:layout_height="match_parent" - style="@style/ConversationViewPaddingStyle" - android:scrollbars="none" /> + android:focusable="false" + android:focusableInTouchMode="false" + android:scrollbars="none" + style="@style/ConversationViewPaddingStyle" /> <!-- scrolling overlay views go here --> <!-- topmost layer for floating views (e.g. snap header, New Message bar) --> <!-- ConversationContainer draws this child on the very top, above all scrolling views --> + <!-- This is also used to highlight the entire conversation on focus --> <FrameLayout android:id="@+id/conversation_topmost_overlay" android:layout_width="match_parent" - android:layout_height="match_parent" /> + android:layout_height="match_parent" + android:background="?android:attr/selectableItemBackground" + android:focusable="true" /> </com.android.mail.browse.ConversationContainer> diff --git a/res/layout/conversation_view_header.xml b/res/layout/conversation_view_header.xml index cbb2ec4ed..99ab7ed53 100644 --- a/res/layout/conversation_view_header.xml +++ b/res/layout/conversation_view_header.xml @@ -21,8 +21,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/conversation_view_item_background_color" + android:focusable="true" android:orientation="horizontal" android:minHeight="88sp" + android:nextFocusDown="@+id/upper_header" android:paddingTop="16dp" android:paddingBottom="16dp" style="@style/ConversationHeaderStyle" > @@ -33,6 +35,7 @@ android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_weight="1" + android:nextFocusDown="@+id/upper_header" android:textAlignment="viewStart" style="@style/ConversationSubjectStyle" /> diff --git a/res/layout/super_collapsed_block.xml b/res/layout/super_collapsed_block.xml index ad0494b9b..00433fa58 100644 --- a/res/layout/super_collapsed_block.xml +++ b/res/layout/super_collapsed_block.xml @@ -20,8 +20,9 @@ android:id="@+id/super_collapsed_block" android:layout_width="match_parent" android:layout_height="wrap_content" + android:focusable="true" android:background="@color/message_header_background_color" - android:foreground="?android:attr/selectableItemBackground" > + android:foreground="?android:attr/selectableItemBackground"> <LinearLayout android:layout_width="match_parent" diff --git a/src/com/android/mail/browse/ConversationContainer.java b/src/com/android/mail/browse/ConversationContainer.java index a5e82b177..f99bd3731 100644 --- a/src/com/android/mail/browse/ConversationContainer.java +++ b/src/com/android/mail/browse/ConversationContainer.java @@ -29,7 +29,6 @@ import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.webkit.WebView; -import android.widget.Adapter; import android.widget.ListView; import android.widget.ScrollView; diff --git a/src/com/android/mail/browse/ConversationOverlayItem.java b/src/com/android/mail/browse/ConversationOverlayItem.java index e52e9d662..08f2cdfba 100644 --- a/src/com/android/mail/browse/ConversationOverlayItem.java +++ b/src/com/android/mail/browse/ConversationOverlayItem.java @@ -42,6 +42,7 @@ public abstract class ConversationOverlayItem { * @see Adapter#getItemViewType(int) */ public abstract @ConversationViewType int getType(); + /** * Inflate and perform one-time initialization on a view for later binding. */ @@ -55,6 +56,7 @@ public abstract class ConversationOverlayItem { * know they can cut certain corners that do not affect a view's height) */ public abstract void bindView(View v, boolean measureOnly); + /** * Returns true if this overlay view is meant to be positioned right on top of the overlay * below. This special positioning allows {@link ConversationContainer} to stack overlays @@ -63,6 +65,10 @@ public abstract class ConversationOverlayItem { */ public abstract boolean isContiguous(); + public View.OnKeyListener getOnKeyListener() { + return null; + } + /** * Returns true if this overlay view is in its expanded state. */ @@ -181,4 +187,15 @@ public abstract class ConversationOverlayItem { public void rebindView(View view) { // DO NOTHING } + + public void registerOnKeyListeners(View... views) { + final View.OnKeyListener listener = getOnKeyListener(); + if (listener != null) { + for (View v : views) { + if (v != null) { + v.setOnKeyListener(listener); + } + } + } + } } diff --git a/src/com/android/mail/browse/ConversationViewAdapter.java b/src/com/android/mail/browse/ConversationViewAdapter.java index 0ae489694..bda63c136 100644 --- a/src/com/android/mail/browse/ConversationViewAdapter.java +++ b/src/com/android/mail/browse/ConversationViewAdapter.java @@ -110,6 +110,8 @@ public class ConversationViewAdapter extends BaseAdapter { private final BidiFormatter mBidiFormatter; + private final View.OnKeyListener mOnKeyListener; + public class ConversationHeaderItem extends ConversationOverlayItem { public final Conversation mConversation; @@ -124,19 +126,22 @@ public class ConversationViewAdapter extends BaseAdapter { @Override public View createView(Context context, LayoutInflater inflater, ViewGroup parent) { - final ConversationViewHeader headerView = (ConversationViewHeader) inflater.inflate( + final ConversationViewHeader v = (ConversationViewHeader) inflater.inflate( R.layout.conversation_view_header, parent, false); - headerView.setCallbacks( + v.setCallbacks( mConversationCallbacks, mAccountController, mConversationUpdater); - headerView.bind(this); - headerView.setSubject(mConversation.subject); + v.bind(this); + v.setSubject(mConversation.subject); if (mAccountController.getAccount().supportsCapability( UIProvider.AccountCapabilities.MULTIPLE_FOLDERS_PER_CONV)) { - headerView.setFolders(mConversation); + v.setFolders(mConversation); } - headerView.setStarred(mConversation.starred); + v.setStarred(mConversation.starred); + + // Register the onkey listener for all relevant views + registerOnKeyListeners(v, v.findViewById(R.id.subject_and_folder_view)); - return headerView; + return v; } @Override @@ -150,6 +155,11 @@ public class ConversationViewAdapter extends BaseAdapter { return true; } + @Override + public View.OnKeyListener getOnKeyListener() { + return mOnKeyListener; + } + public ConversationViewAdapter getAdapter() { return ConversationViewAdapter.this; } @@ -169,11 +179,16 @@ public class ConversationViewAdapter extends BaseAdapter { @Override public View createView(Context context, LayoutInflater inflater, ViewGroup parent) { - final ConversationFooterView view = (ConversationFooterView) + final ConversationFooterView v = (ConversationFooterView) inflater.inflate(R.layout.conversation_footer, parent, false); - view.setAccountController(mAccountController); - view.setConversationFooterCallbacks(mConversationFooterCallbacks); - return view; + v.setAccountController(mAccountController); + v.setConversationFooterCallbacks(mConversationFooterCallbacks); + + // Register the onkey listener for all relevant views + registerOnKeyListeners(v, v.findViewById(R.id.reply_button), + v.findViewById(R.id.reply_all_button), v.findViewById(R.id.forward_button)); + + return v; } @Override @@ -191,6 +206,11 @@ public class ConversationViewAdapter extends BaseAdapter { return true; } + @Override + public View.OnKeyListener getOnKeyListener() { + return mOnKeyListener; + } + public MessageHeaderItem getLastMessageHeaderItem() { return mLastMessageHeaderItem; } @@ -248,6 +268,12 @@ public class ConversationViewAdapter extends BaseAdapter { v.setCallbacks(mAdapter.mMessageCallbacks); v.setContactInfoSource(mAdapter.mContactInfoSource); v.setVeiledMatcher(mAdapter.mMatcher); + + // Register the onkey listener for all relevant views + registerOnKeyListeners(v, v.findViewById(R.id.upper_header), + v.findViewById(R.id.hide_details), v.findViewById(R.id.edit_draft), + v.findViewById(R.id.reply), v.findViewById(R.id.reply_all), + v.findViewById(R.id.overflow), v.findViewById(R.id.send_date)); return v; } @@ -269,6 +295,11 @@ public class ConversationViewAdapter extends BaseAdapter { } @Override + public View.OnKeyListener getOnKeyListener() { + return mAdapter.getOnKeyListener(); + } + + @Override public boolean isExpanded() { return mExpanded; } @@ -367,6 +398,9 @@ public class ConversationViewAdapter extends BaseAdapter { R.layout.conversation_message_footer, parent, false); v.initialize(mAdapter.mLoaderManager, mAdapter.mFragmentManager, mAdapter.mAccountController, mAdapter.mFooterCallbacks); + + // Register the onkey listener for all relevant views + registerOnKeyListeners(v, v.findViewById(R.id.view_entire_message_prompt)); return v; } @@ -382,6 +416,11 @@ public class ConversationViewAdapter extends BaseAdapter { } @Override + public View.OnKeyListener getOnKeyListener() { + return mAdapter.getOnKeyListener(); + } + + @Override public boolean isExpanded() { return mHeaderItem.isExpanded(); } @@ -427,10 +466,14 @@ public class ConversationViewAdapter extends BaseAdapter { @Override public View createView(Context context, LayoutInflater inflater, ViewGroup parent) { - final SuperCollapsedBlock scb = (SuperCollapsedBlock) inflater.inflate( + final SuperCollapsedBlock v = (SuperCollapsedBlock) inflater.inflate( R.layout.super_collapsed_block, parent, false); - scb.initialize(mSuperCollapsedListener); - return scb; + v.initialize(mSuperCollapsedListener); + v.setOnKeyListener(mOnKeyListener); + + // Register the onkey listener for all relevant views + registerOnKeyListeners(v); + return v; } @Override @@ -445,6 +488,11 @@ public class ConversationViewAdapter extends BaseAdapter { } @Override + public View.OnKeyListener getOnKeyListener() { + return mOnKeyListener; + } + + @Override public boolean isExpanded() { return false; } @@ -479,7 +527,8 @@ public class ConversationViewAdapter extends BaseAdapter { OnClickListener scbListener, Map<String, Address> addressCache, FormattedDateBuilder dateBuilder, - BidiFormatter bidiFormatter) { + BidiFormatter bidiFormatter, + View.OnKeyListener onKeyListener) { mContext = controllableActivity.getActivityContext(); mDateBuilder = dateBuilder; mAccountController = accountController; @@ -499,6 +548,7 @@ public class ConversationViewAdapter extends BaseAdapter { mMatcher = controllableActivity.getAccountController().getVeiledAddressMatcher(); mBidiFormatter = bidiFormatter; + mOnKeyListener = onKeyListener; } @Override @@ -665,4 +715,8 @@ public class ConversationViewAdapter extends BaseAdapter { public BidiFormatter getBidiFormatter() { return mBidiFormatter; } + + public View.OnKeyListener getOnKeyListener() { + return mOnKeyListener; + } } diff --git a/src/com/android/mail/ui/ConversationViewFragment.java b/src/com/android/mail/ui/ConversationViewFragment.java index f5a0cdad7..803574ffc 100644 --- a/src/com/android/mail/ui/ConversationViewFragment.java +++ b/src/com/android/mail/ui/ConversationViewFragment.java @@ -30,6 +30,7 @@ import android.os.SystemClock; import android.support.v4.text.BidiFormatter; import android.support.v4.util.ArrayMap; import android.text.TextUtils; +import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnLayoutChangeListener; @@ -97,7 +98,7 @@ import java.util.Set; public class ConversationViewFragment extends AbstractConversationViewFragment implements SuperCollapsedBlock.OnClickListener, OnLayoutChangeListener, MessageHeaderView.MessageHeaderViewCallbacks, MessageFooterView.MessageFooterCallbacks, - WebViewContextMenu.Callbacks, ConversationFooterCallbacks { + WebViewContextMenu.Callbacks, ConversationFooterCallbacks, View.OnKeyListener { private static final String LOG_TAG = LogTag.getLogTag(); public static final String LAYOUT_TAG = "ConvLayout"; @@ -130,6 +131,8 @@ public class ConversationViewFragment extends AbstractConversationViewFragment i protected ConversationWebView mWebView; + private ViewGroup mTopmostOverlay; + private ConversationViewProgressController mProgressController; private Button mNewMessageBar; @@ -276,7 +279,7 @@ public class ConversationViewFragment extends AbstractConversationViewFragment i mAdapter = new ConversationViewAdapter(mActivity, this, getLoaderManager(), this, this, getContactInfoSource(), this, this, - getListController(), this, mAddressCache, dateBuilder, mBidiFormatter); + getListController(), this, mAddressCache, dateBuilder, mBidiFormatter, this); mConversationContainer.setOverlayAdapter(mAdapter); // set up snap header (the adapter usually does this with the other ones) @@ -354,9 +357,10 @@ public class ConversationViewFragment extends AbstractConversationViewFragment i .findViewById(R.id.conversation_container); mConversationContainer.setAccountController(this); - final ViewGroup topmostOverlay = + mTopmostOverlay = (ViewGroup) mConversationContainer.findViewById(R.id.conversation_topmost_overlay); - inflateSnapHeader(topmostOverlay, inflater); + mTopmostOverlay.setOnKeyListener(this); + inflateSnapHeader(mTopmostOverlay, inflater); mConversationContainer.setupSnapHeader(); setupNewMessageBar(); @@ -1115,6 +1119,26 @@ public class ConversationViewFragment extends AbstractConversationViewFragment i return getMessageCursor().getMessageForId(Long.parseLong(messageId)); } + @Override + public boolean onKey(View view, int keyCode, KeyEvent keyEvent) { + // Only care about enter and esc + View currFocus = mActivity.getWindow().getCurrentFocus(); + if (keyCode == KeyEvent.KEYCODE_BACK && currFocus != null && + currFocus.getId() != R.id.conversation_topmost_overlay) { + if (keyEvent.getAction() == KeyEvent.ACTION_UP) { + mTopmostOverlay.requestFocus(); + } + return true; + } else if (keyCode == KeyEvent.KEYCODE_ENTER && (currFocus == null || + currFocus.getId() == R.id.conversation_topmost_overlay)) { + if (keyEvent.getAction() == KeyEvent.ACTION_UP) { + mConversationContainer.findViewById(R.id.upper_header).requestFocus(); + } + return true; + } + return false; + } + public class ConversationWebViewClient extends AbstractConversationWebViewClient { public ConversationWebViewClient(Account account) { super(account); diff --git a/src/com/android/mail/ui/TwoPaneController.java b/src/com/android/mail/ui/TwoPaneController.java index 781efa3d4..c37137257 100644 --- a/src/com/android/mail/ui/TwoPaneController.java +++ b/src/com/android/mail/ui/TwoPaneController.java @@ -42,7 +42,7 @@ import com.android.mail.utils.Utils; * abounds. */ public final class TwoPaneController extends AbstractActivityController implements - ConversationViewFrame.DownEventListener { + ConversationViewFrame.DownEventListener, TwoPaneLayout.TwoPaneLayoutListener { private static final String SAVED_MISCELLANEOUS_VIEW = "saved-miscellaneous-view"; private static final String SAVED_MISCELLANEOUS_VIEW_TRANSACTION_ID = @@ -153,6 +153,7 @@ public final class TwoPaneController extends AbstractActivityController implemen return false; } mLayout.setController(this, Intent.ACTION_SEARCH.equals(mActivity.getIntent().getAction())); + mLayout.setLayoutListener(this); mActivity.getWindow().setBackgroundDrawable(null); mIsTabletLandscape = !mActivity.getResources().getBoolean(R.bool.list_collapsible); @@ -590,4 +591,12 @@ public final class TwoPaneController extends AbstractActivityController implemen } return false; } + + @Override + public void onListViewLayout(boolean isOnScreen) { + ConversationListFragment clf = getConversationListFragment(); + if (clf != null && clf.getListView() != null) { + clf.getListView().setFocusable(isOnScreen); + } + } } diff --git a/src/com/android/mail/ui/TwoPaneLayout.java b/src/com/android/mail/ui/TwoPaneLayout.java index 5af59ccff..5f29664a7 100644 --- a/src/com/android/mail/ui/TwoPaneLayout.java +++ b/src/com/android/mail/ui/TwoPaneLayout.java @@ -96,6 +96,8 @@ final class TwoPaneLayout extends FrameLayout implements ModeChangeListener { private View mFoldersView; private View mListView; + private TwoPaneLayoutListener mLayoutListener; + public static final int MISCELLANEOUS_VIEW_ID = R.id.miscellaneous_pane; private final Runnable mTransitionCompleteRunnable = new Runnable() { @@ -171,6 +173,10 @@ final class TwoPaneLayout extends FrameLayout implements ModeChangeListener { super.onLayout(changed, l, t, r, b); } + public void setLayoutListener(TwoPaneLayoutListener listener) { + mLayoutListener = listener; + } + /** * Sizes up the three sliding panes. This method will ensure that the LayoutParams of the panes * have the correct widths set for the current overall size and view mode. @@ -238,6 +244,10 @@ final class TwoPaneLayout extends FrameLayout implements ModeChangeListener { } animatePanes(foldersX, listX, convX); + // For keyboard navigation, let's disable focus on the list if it's not visible. + if (mLayoutListener != null) { + mLayoutListener.onListViewLayout(listX >= 0); + } mPositionedMode = mCurrentMode; } @@ -456,4 +466,7 @@ final class TwoPaneLayout extends FrameLayout implements ModeChangeListener { return !mListCollapsible; } + public interface TwoPaneLayoutListener { + public void onListViewLayout(boolean isOnScreen); + } } |