summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--res/drawable/compose_button.xml1
-rw-r--r--res/layout/conversation_list.xml2
-rw-r--r--res/layout/conversation_view.xml6
-rw-r--r--res/layout/folder_list.xml4
-rw-r--r--res/layout/mini_drawer_recent_account_item.xml7
-rw-r--r--res/layout/search_results_view.xml1
-rw-r--r--res/values/styles.xml24
-rw-r--r--src/com/android/mail/ui/ConversationListFragment.java43
-rw-r--r--src/com/android/mail/ui/FolderListFragment.java1
-rw-r--r--src/com/android/mail/ui/TwoPaneController.java17
10 files changed, 78 insertions, 28 deletions
diff --git a/res/drawable/compose_button.xml b/res/drawable/compose_button.xml
index f75886948..a550835ca 100644
--- a/res/drawable/compose_button.xml
+++ b/res/drawable/compose_button.xml
@@ -18,5 +18,6 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/ic_compose_pressed_56dp" />
+ <item android:state_focused="true" android:drawable="@drawable/ic_compose_pressed_56dp" />
<item android:drawable="@drawable/ic_compose_56dp" />
</selector>
diff --git a/res/layout/conversation_list.xml b/res/layout/conversation_list.xml
index 654092ce7..64f8fde8e 100644
--- a/res/layout/conversation_list.xml
+++ b/res/layout/conversation_list.xml
@@ -38,7 +38,7 @@
<include layout="@layout/conversation_list_empty_view" />
<com.android.mail.ui.SwipeableListView
- android:id="@android:id/list"
+ android:id="@+id/conversation_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
style="@style/ConversationListFade" />
diff --git a/res/layout/conversation_view.xml b/res/layout/conversation_view.xml
index 9bcd4f9ce..14289a9cd 100644
--- a/res/layout/conversation_view.xml
+++ b/res/layout/conversation_view.xml
@@ -28,8 +28,10 @@
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 -->
diff --git a/res/layout/folder_list.xml b/res/layout/folder_list.xml
index 19336d858..3632f9c66 100644
--- a/res/layout/folder_list.xml
+++ b/res/layout/folder_list.xml
@@ -24,6 +24,7 @@
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
+ android:nextFocusRight="@+id/conversation_list_view"
android:fadingEdge="none" />
<com.android.mail.ui.MiniDrawerView
@@ -42,8 +43,7 @@
android:paddingBottom="16dp"
android:paddingLeft="20dp"
android:paddingRight="20dp"
- android:background="?android:attr/selectableItemBackground"
- android:scaleType="fitCenter" />
+ style="@style/MiniDrawerItemStyleBase" />
<ImageView
android:id="@+id/dotdotdot"
diff --git a/res/layout/mini_drawer_recent_account_item.xml b/res/layout/mini_drawer_recent_account_item.xml
index 8a04bb35b..f348d190e 100644
--- a/res/layout/mini_drawer_recent_account_item.xml
+++ b/res/layout/mini_drawer_recent_account_item.xml
@@ -19,9 +19,4 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="68dp"
- android:paddingTop="18dp"
- android:paddingBottom="18dp"
- android:paddingLeft="20dp"
- android:paddingRight="20dp"
- android:background="?android:attr/selectableItemBackground"
- android:scaleType="fitCenter" />
+ style="@style/MiniDrawerAccountStyle" />
diff --git a/res/layout/search_results_view.xml b/res/layout/search_results_view.xml
index 9d8cfa3c2..2a02605a3 100644
--- a/res/layout/search_results_view.xml
+++ b/res/layout/search_results_view.xml
@@ -22,6 +22,7 @@
android:layout_width="match_parent"
android:layout_height="@dimen/notification_view_height"
android:background="@color/search_banner_bg"
+ android:focusable="false"
android:minHeight="@dimen/notification_view_height"
android:paddingLeft="@dimen/search_results_padding"
android:paddingRight="@dimen/search_results_padding">
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 5732a7ac6..91820d08b 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -615,14 +615,26 @@
<item name="android:layout_marginRight">@dimen/conversation_border_margin_side</item>
</style>
- <style name="MiniDrawerFolderStyle">
- <item name="android:paddingLeft">24dp</item>
- <item name="android:paddingRight">24dp</item>
+ <style name="MiniDrawerItemStyleBase">
+ <item name="android:background">?android:attr/selectableItemBackground</item>
+ <item name="android:focusable">true</item>
+ <item name="android:nextFocusRight">@+id/conversation_list_view</item>
+ <item name="android:scaleType">fitCenter</item>
+ </style>
+
+ <style name="MiniDrawerFolderStyle" parent="@style/MiniDrawerItemStyleBase">
<item name="android:paddingTop">16dp</item>
<item name="android:paddingBottom">16dp</item>
- <item name="android:scaleType">fitCenter</item>
- <item name="android:background">?android:attr/selectableItemBackground</item>
- </style>
+ <item name="android:paddingLeft">24dp</item>
+ <item name="android:paddingRight">24dp</item>
+ </style>
+
+ <style name="MiniDrawerAccountStyle" parent="@style/MiniDrawerItemStyleBase">
+ <item name="android:paddingTop">18dp</item>
+ <item name="android:paddingBottom">18dp</item>
+ <item name="android:paddingLeft">20dp</item>
+ <item name="android:paddingRight">20dp</item>
+ </style>
<style name="FolderListItemStartStyle">
<item name="android:layout_marginLeft">@dimen/folder_list_item_start_margin</item>
diff --git a/src/com/android/mail/ui/ConversationListFragment.java b/src/com/android/mail/ui/ConversationListFragment.java
index 84d46c3b9..9192de24d 100644
--- a/src/com/android/mail/ui/ConversationListFragment.java
+++ b/src/com/android/mail/ui/ConversationListFragment.java
@@ -19,14 +19,14 @@ package com.android.mail.ui;
import android.animation.LayoutTransition;
import android.app.Activity;
-import android.app.ListFragment;
+import android.app.Fragment;
import android.app.LoaderManager;
-import android.content.Context;
import android.content.res.Resources;
import android.database.DataSetObserver;
import android.os.Bundle;
import android.os.Handler;
import android.os.Parcelable;
+import android.support.annotation.IdRes;
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
import android.view.KeyEvent;
import android.view.LayoutInflater;
@@ -74,9 +74,9 @@ import static android.view.View.OnKeyListener;
/**
* The conversation list UI component.
*/
-public final class ConversationListFragment extends ListFragment implements
+public final class ConversationListFragment extends Fragment implements
OnItemLongClickListener, ModeChangeListener, ListItemSwipedListener, OnRefreshListener,
- SwipeListener, OnKeyListener {
+ SwipeListener, OnKeyListener, AdapterView.OnItemClickListener {
/** Key used to pass data to {@link ConversationListFragment}. */
private static final String CONVERSATION_LIST_KEY = "conversation-list";
/** Key used to keep track of the scroll state of the list. */
@@ -155,6 +155,8 @@ public final class ConversationListFragment extends ListFragment implements
// True if NO DATA has returned, false if we either partially or fully loaded the data
private boolean mInitialCursorLoading;
+ private @IdRes int mNextFocusLeftId;
+
/** Duration, in milliseconds, of the CAB mode (peek icon) animation. */
private static long sSelectionModeAnimationDuration = -1;
@@ -448,13 +450,17 @@ public final class ConversationListFragment extends ListFragment implements
mLoadingView = rootView.findViewById(R.id.background_view);
mLoadingView.setVisibility(View.GONE);
mLoadingView.findViewById(R.id.loading_progress).setVisibility(View.VISIBLE);
- mListView = (SwipeableListView) rootView.findViewById(android.R.id.list);
+ mListView = (SwipeableListView) rootView.findViewById(R.id.conversation_list_view);
mListView.setHeaderDividersEnabled(false);
mListView.setOnItemLongClickListener(this);
mListView.enableSwipe(mAccount.supportsCapability(AccountCapabilities.UNDO));
mListView.setListItemSwipedListener(this);
mListView.setSwipeListener(this);
mListView.setOnKeyListener(this);
+ mListView.setOnItemClickListener(this);
+ if (mNextFocusLeftId != 0) {
+ mListView.setNextFocusLeftId(mNextFocusLeftId);
+ }
// enable animateOnLayout (equivalent of setLayoutTransition) only for >=JB (b/14302062)
if (Utils.isRunningJellybeanOrLater()) {
@@ -584,7 +590,7 @@ public final class ConversationListFragment extends ListFragment implements
* {@inheritDoc}
*/
@Override
- public void onListItemClick(ListView l, View view, int position, long id) {
+ public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
onListItemSelected(view, position);
}
@@ -710,6 +716,15 @@ public final class ConversationListFragment extends ListFragment implements
if (mFooterView != null) {
mFooterView.onViewModeChanged(newMode);
}
+
+ // Set default navigation
+ if (ViewMode.isListMode(newMode)) {
+ mListView.setNextFocusRightId(R.id.conversation_list_view);
+ mListView.requestFocus();
+ } else if (ViewMode.isConversationMode(newMode)) {
+ // This would only happen in two_pane
+ mListView.setNextFocusRightId(R.id.conversation_pager);
+ }
}
public boolean isAnimating() {
@@ -857,9 +872,8 @@ public final class ConversationListFragment extends ListFragment implements
action.performAction();
}
};
- final SwipeableListView listView = (SwipeableListView) getListView();
- if (listView.getSwipeAction() == actionId) {
- if (!listView.destroyItems(conversations, listener)) {
+ if (mListView.getSwipeAction() == actionId) {
+ if (!mListView.destroyItems(conversations, listener)) {
// The listView failed to destroy the items, perform the action manually
LogUtils.e(LOG_TAG, "ConversationListFragment.requestDelete: " +
"listView failed to destroy items.");
@@ -1194,4 +1208,15 @@ public final class ConversationListFragment extends ListFragment implements
private boolean isCursorReadyToShow() {
return ConversationCursor.isCursorReadyToShow(getConversationListCursor());
}
+
+ public ListView getListView() {
+ return mListView;
+ }
+
+ public void setNextFocusLeftId(@IdRes int id) {
+ mNextFocusLeftId = id;
+ if (mListView != null) {
+ mListView.setNextFocusLeftId(mNextFocusLeftId);
+ }
+ }
}
diff --git a/src/com/android/mail/ui/FolderListFragment.java b/src/com/android/mail/ui/FolderListFragment.java
index 17e1789e2..67bd14174 100644
--- a/src/com/android/mail/ui/FolderListFragment.java
+++ b/src/com/android/mail/ui/FolderListFragment.java
@@ -750,6 +750,7 @@ public class FolderListFragment extends ListFragment implements
} else {
mMiniDrawerView.setVisibility(View.INVISIBLE);
mListView.setVisibility(View.VISIBLE);
+ mListView.requestFocus();
}
}
diff --git a/src/com/android/mail/ui/TwoPaneController.java b/src/com/android/mail/ui/TwoPaneController.java
index 781efa3d4..0f08cdfb6 100644
--- a/src/com/android/mail/ui/TwoPaneController.java
+++ b/src/com/android/mail/ui/TwoPaneController.java
@@ -23,6 +23,7 @@ import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
+import android.support.annotation.IdRes;
import android.support.annotation.LayoutRes;
import android.support.v7.app.ActionBar;
import android.view.View;
@@ -109,11 +110,14 @@ public final class TwoPaneController extends AbstractActivityController implemen
FragmentTransaction fragmentTransaction = mActivity.getFragmentManager().beginTransaction();
// Use cross fading animation.
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
- final Fragment conversationListFragment =
+ final ConversationListFragment conversationListFragment =
ConversationListFragment.newInstance(mConvListContext);
fragmentTransaction.replace(R.id.conversation_list_pane, conversationListFragment,
TAG_CONVERSATION_LIST);
fragmentTransaction.commitAllowingStateLoss();
+ // Set default navigation here once the ConversationListFragment is created.
+ conversationListFragment.setNextFocusLeftId(
+ getClfNextFocusLeftId(getFolderListFragment().isMinimized()));
}
@Override
@@ -147,7 +151,7 @@ public final class TwoPaneController extends AbstractActivityController implemen
@Override
public boolean onCreate(Bundle savedState) {
mLayout = (TwoPaneLayout) mActivity.findViewById(R.id.two_pane_activity);
- if (mLayout == null) {
+ if (mLayout == null) {
// We need the layout for everything. Crash/Return early if it is null.
LogUtils.wtf(LOG_TAG, "mLayout is null!");
return false;
@@ -242,6 +246,11 @@ public final class TwoPaneController extends AbstractActivityController implemen
flf.setMinimized(!flf.isMinimized());
mLayout.requestLayout();
resetActionBarIcon();
+
+ final ConversationListFragment clf = getConversationListFragment();
+ if (clf != null) {
+ clf.setNextFocusLeftId(getClfNextFocusLeftId(flf.isMinimized()));
+ }
}
@Override
@@ -273,6 +282,10 @@ public final class TwoPaneController extends AbstractActivityController implemen
}
}
+ private @IdRes int getClfNextFocusLeftId(boolean drawerMinimized) {
+ return (drawerMinimized) ? R.id.current_account_avatar : android.R.id.list;
+ }
+
@Override
public void onConversationVisibilityChanged(boolean visible) {
super.onConversationVisibilityChanged(visible);