mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 975055 - Show previous filter for back row item. r=lucasr
This commit is contained in:
parent
6722fa3c22
commit
766efc96ab
30
mobile/android/base/home/PanelBackItemView.java
Normal file
30
mobile/android/base/home/PanelBackItemView.java
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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',
|
||||||
|
19
mobile/android/base/resources/layout/panel_back_item.xml
Normal file
19
mobile/android/base/resources/layout/panel_back_item.xml
Normal 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>
|
Loading…
Reference in New Issue
Block a user