Bug 975055 - Show previous filter for back row item. r=lucasr

This commit is contained in:
Josh Dover 2014-03-04 15:15:44 -08:00
parent 6722fa3c22
commit 766efc96ab
8 changed files with 210 additions and 5 deletions

View File

@ -0,0 +1,30 @@
/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko.home;
import org.mozilla.gecko.R;
import android.content.Context;
import android.view.LayoutInflater;
import android.widget.LinearLayout;
import android.widget.TextView;
class PanelBackItemView extends LinearLayout {
private final TextView title;
public PanelBackItemView(Context context) {
super(context);
LayoutInflater.from(context).inflate(R.layout.panel_back_item, this);
setOrientation(HORIZONTAL);
title = (TextView) findViewById(R.id.title);
}
public void updateFromFilter(String filter) {
title.setText(filter);
}
}

View File

@ -13,6 +13,7 @@ import org.mozilla.gecko.home.HomeConfig.ItemHandler;
import org.mozilla.gecko.home.HomeConfig.ViewConfig; import org.mozilla.gecko.home.HomeConfig.ViewConfig;
import org.mozilla.gecko.home.HomePager.OnUrlOpenListener; import org.mozilla.gecko.home.HomePager.OnUrlOpenListener;
import org.mozilla.gecko.home.PanelLayout.DatasetBacked; import org.mozilla.gecko.home.PanelLayout.DatasetBacked;
import org.mozilla.gecko.home.PanelLayout.FilterManager;
import org.mozilla.gecko.home.PanelLayout.PanelView; import org.mozilla.gecko.home.PanelLayout.PanelView;
import android.content.Context; import android.content.Context;
@ -57,6 +58,12 @@ public class PanelGridView extends GridView
mUrlHandler.setOnUrlOpenListener(listener); mUrlHandler.setOnUrlOpenListener(listener);
} }
@Override
public void setFilterManager(FilterManager filterManager) {
mAdapter.setFilterManager(filterManager);
mUrlHandler.setFilterManager(filterManager);
}
private class PanelGridItemClickListener implements AdapterView.OnItemClickListener { private class PanelGridItemClickListener implements AdapterView.OnItemClickListener {
@Override @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

View File

@ -20,7 +20,6 @@ import android.view.KeyEvent;
import android.view.View; import android.view.View;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import java.util.Deque;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Map; import java.util.Map;
@ -74,6 +73,7 @@ abstract class PanelLayout extends FrameLayout {
*/ */
public interface DatasetBacked { public interface DatasetBacked {
public void setDataset(Cursor cursor); public void setDataset(Cursor cursor);
public void setFilterManager(FilterManager manager);
} }
/** /**
@ -143,6 +143,12 @@ abstract class PanelLayout extends FrameLayout {
public void setOnUrlOpenListener(OnUrlOpenListener listener); public void setOnUrlOpenListener(OnUrlOpenListener listener);
} }
public interface FilterManager {
public String getPreviousFilter();
public boolean canGoBack();
public void goBack();
}
public PanelLayout(Context context, PanelConfig panelConfig, DatasetHandler datasetHandler, OnUrlOpenListener urlOpenListener) { public PanelLayout(Context context, PanelConfig panelConfig, DatasetHandler datasetHandler, OnUrlOpenListener urlOpenListener) {
super(context); super(context);
mViewStateMap = new WeakHashMap<View, ViewState>(); mViewStateMap = new WeakHashMap<View, ViewState>();
@ -217,6 +223,11 @@ abstract class PanelLayout extends FrameLayout {
((PanelView) view).setOnUrlOpenListener(new PanelUrlOpenListener(state)); ((PanelView) view).setOnUrlOpenListener(new PanelUrlOpenListener(state));
view.setOnKeyListener(new PanelKeyListener(state)); view.setOnKeyListener(new PanelKeyListener(state));
if (view instanceof DatasetBacked) {
DatasetBacked datasetBacked = (DatasetBacked) view;
datasetBacked.setFilterManager(new PanelFilterManager(state));
}
return view; return view;
} }
@ -268,7 +279,7 @@ abstract class PanelLayout extends FrameLayout {
*/ */
protected static class ViewState { protected static class ViewState {
private final ViewConfig mViewConfig; private final ViewConfig mViewConfig;
private Deque<String> mFilterStack; private LinkedList<String> mFilterStack;
public ViewState(ViewConfig viewConfig) { public ViewState(ViewConfig viewConfig) {
mViewConfig = viewConfig; mViewConfig = viewConfig;
@ -289,6 +300,17 @@ abstract class PanelLayout extends FrameLayout {
} }
} }
/**
* Get the previous filter that this view was displaying, or null if none.
*/
public String getPreviousFilter() {
if (!canPopFilter()) {
return null;
}
return mFilterStack.get(1);
}
/** /**
* Adds a filter to the history stack for this view. * Adds a filter to the history stack for this view.
*/ */
@ -383,4 +405,27 @@ abstract class PanelLayout extends FrameLayout {
return false; return false;
} }
} }
private class PanelFilterManager implements FilterManager {
private final ViewState mViewState;
public PanelFilterManager(ViewState viewState) {
mViewState = viewState;
}
@Override
public String getPreviousFilter() {
return mViewState.getPreviousFilter();
}
@Override
public boolean canGoBack() {
return mViewState.canPopFilter();
}
@Override
public void goBack() {
popFilterOnView(mViewState);
}
}
} }

View File

@ -12,6 +12,7 @@ import org.mozilla.gecko.home.HomeConfig.ItemHandler;
import org.mozilla.gecko.home.HomeConfig.ViewConfig; import org.mozilla.gecko.home.HomeConfig.ViewConfig;
import org.mozilla.gecko.home.HomePager.OnUrlOpenListener; import org.mozilla.gecko.home.HomePager.OnUrlOpenListener;
import org.mozilla.gecko.home.PanelLayout.DatasetBacked; import org.mozilla.gecko.home.PanelLayout.DatasetBacked;
import org.mozilla.gecko.home.PanelLayout.FilterManager;
import org.mozilla.gecko.home.PanelLayout.PanelView; import org.mozilla.gecko.home.PanelLayout.PanelView;
import android.content.Context; import android.content.Context;
@ -53,6 +54,12 @@ public class PanelListView extends HomeListView
mUrlHandler.setOnUrlOpenListener(listener); mUrlHandler.setOnUrlOpenListener(listener);
} }
@Override
public void setFilterManager(FilterManager filterManager) {
mAdapter.setFilterManager(filterManager);
mUrlHandler.setFilterManager(filterManager);
}
private class PanelListItemClickListener implements AdapterView.OnItemClickListener { private class PanelListItemClickListener implements AdapterView.OnItemClickListener {
@Override @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

View File

@ -6,6 +6,9 @@
package org.mozilla.gecko.home; package org.mozilla.gecko.home;
import org.mozilla.gecko.home.HomeConfig.ItemType; import org.mozilla.gecko.home.HomeConfig.ItemType;
import org.mozilla.gecko.home.PanelLayout.FilterManager;
import org.mozilla.gecko.R;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
@ -14,8 +17,12 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
class PanelViewAdapter extends CursorAdapter { class PanelViewAdapter extends CursorAdapter {
private static final int VIEW_TYPE_ITEM = 0;
private static final int VIEW_TYPE_BACK = 1;
private final Context mContext; private final Context mContext;
private final ItemType mItemType; private final ItemType mItemType;
private FilterManager mFilterManager;
public PanelViewAdapter(Context context, ItemType itemType) { public PanelViewAdapter(Context context, ItemType itemType) {
super(context, null, 0); super(context, null, 0);
@ -23,14 +30,83 @@ class PanelViewAdapter extends CursorAdapter {
mItemType = itemType; mItemType = itemType;
} }
public void setFilterManager(FilterManager manager) {
mFilterManager = manager;
}
@Override @Override
public void bindView(View view, Context context, Cursor cursor) { public final int getViewTypeCount() {
return 2;
}
@Override
public int getCount() {
return super.getCount() + (isShowingBack() ? 1 : 0);
}
@Override
public int getItemViewType(int position) {
if (isShowingBack() && position == 0) {
return VIEW_TYPE_BACK;
} else {
return VIEW_TYPE_ITEM;
}
}
@Override
public final View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = newView(parent.getContext(), position, parent);
}
bindView(convertView, position);
return convertView;
}
private View newView(Context context, int position, ViewGroup parent) {
if (getItemViewType(position) == VIEW_TYPE_BACK) {
return new PanelBackItemView(context);
} else {
return PanelItemView.create(context, mItemType);
}
}
private void bindView(View view, int position) {
if (isShowingBack()) {
if (position == 0) {
final PanelBackItemView item = (PanelBackItemView) view;
item.updateFromFilter(mFilterManager.getPreviousFilter());
return;
}
position--;
}
final Cursor cursor = getCursor(position);
final PanelItemView item = (PanelItemView) view; final PanelItemView item = (PanelItemView) view;
item.updateFromCursor(cursor); item.updateFromCursor(cursor);
} }
private boolean isShowingBack() {
return (mFilterManager != null ? mFilterManager.canGoBack() : false);
}
private final Cursor getCursor(int position) {
final Cursor cursor = getCursor();
if (cursor == null || !cursor.moveToPosition(position)) {
throw new IllegalStateException("Couldn't move cursor to position " + position);
}
return cursor;
}
@Override @Override
public View newView(Context context, Cursor cursor, ViewGroup parent) { public final void bindView(View view, Context context, Cursor cursor) {
return PanelItemView.create(mContext, mItemType); // Do nothing.
}
@Override
public final View newView(Context context, Cursor cursor, ViewGroup parent) {
return null;
} }
} }

View File

@ -9,6 +9,7 @@ import org.mozilla.gecko.db.BrowserContract.HomeItems;
import org.mozilla.gecko.home.HomeConfig.ItemHandler; import org.mozilla.gecko.home.HomeConfig.ItemHandler;
import org.mozilla.gecko.home.HomeConfig.ViewConfig; import org.mozilla.gecko.home.HomeConfig.ViewConfig;
import org.mozilla.gecko.home.HomePager.OnUrlOpenListener; import org.mozilla.gecko.home.HomePager.OnUrlOpenListener;
import org.mozilla.gecko.home.PanelLayout.FilterManager;
import android.database.Cursor; import android.database.Cursor;
@ -17,6 +18,7 @@ import java.util.EnumSet;
class PanelViewUrlHandler { class PanelViewUrlHandler {
private final ViewConfig mViewConfig; private final ViewConfig mViewConfig;
private OnUrlOpenListener mUrlOpenListener; private OnUrlOpenListener mUrlOpenListener;
private FilterManager mFilterManager;
public PanelViewUrlHandler(ViewConfig viewConfig) { public PanelViewUrlHandler(ViewConfig viewConfig) {
mViewConfig = viewConfig; mViewConfig = viewConfig;
@ -26,7 +28,25 @@ class PanelViewUrlHandler {
mUrlOpenListener = listener; mUrlOpenListener = listener;
} }
public void setFilterManager(FilterManager manager) {
mFilterManager = manager;
}
/**
* If item at this position is a back item, perform the go back action via the
* {@code FilterManager}. Otherwise, prepare the url to be opened by the
* {@code OnUrlOpenListener}.
*/
public void openUrlAtPosition(Cursor cursor, int position) { public void openUrlAtPosition(Cursor cursor, int position) {
if (mFilterManager != null && mFilterManager.canGoBack()) {
if (position == 0) {
mFilterManager.goBack();
return;
}
position--;
}
if (cursor == null || !cursor.moveToPosition(position)) { if (cursor == null || !cursor.moveToPosition(position)) {
throw new IllegalStateException("Couldn't move cursor to position " + position); throw new IllegalStateException("Couldn't move cursor to position " + position);
} }

View File

@ -246,6 +246,7 @@ gbjar.sources += [
'home/LastTabsPanel.java', 'home/LastTabsPanel.java',
'home/MostRecentPanel.java', 'home/MostRecentPanel.java',
'home/MultiTypeCursorAdapter.java', 'home/MultiTypeCursorAdapter.java',
'home/PanelBackItemView.java',
'home/PanelGridView.java', 'home/PanelGridView.java',
'home/PanelItemView.java', 'home/PanelItemView.java',
'home/PanelLayout.java', 'home/PanelLayout.java',

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView android:id="@+id/title"
style="@style/Widget.PanelItemView.Title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingTop="5dip"
android:paddingBottom="5dip"
android:paddingLeft="10dip"
android:paddingRight="10dip"
android:minHeight="@dimen/page_row_height"
android:gravity="center_vertical"/>
</merge>