mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 942231 - Factor out HomePager's adapter into a separate file (r=margaret)
This commit is contained in:
parent
e5e1880667
commit
d6ffeec24d
139
mobile/android/base/home/HomeAdapter.java
Normal file
139
mobile/android/base/home/HomeAdapter.java
Normal file
@ -0,0 +1,139 @@
|
||||
/* -*- 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.home.HomePager;
|
||||
import org.mozilla.gecko.home.HomePager.Page;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.app.FragmentStatePagerAdapter;
|
||||
import android.view.ViewGroup;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumMap;
|
||||
|
||||
class HomeAdapter extends FragmentStatePagerAdapter {
|
||||
|
||||
private final Context mContext;
|
||||
private final ArrayList<TabInfo> mTabs;
|
||||
private final EnumMap<Page, Fragment> mPages;
|
||||
|
||||
private OnAddTabListener mAddTabListener;
|
||||
|
||||
interface OnAddTabListener {
|
||||
public void onAddTab(String title);
|
||||
}
|
||||
|
||||
final class TabInfo {
|
||||
private final Page page;
|
||||
private final Class<?> clss;
|
||||
private final Bundle args;
|
||||
private final String title;
|
||||
|
||||
TabInfo(Page page, Class<?> clss, Bundle args, String title) {
|
||||
this.page = page;
|
||||
this.clss = clss;
|
||||
this.args = args;
|
||||
this.title = title;
|
||||
}
|
||||
}
|
||||
|
||||
public HomeAdapter(Context context, FragmentManager fm) {
|
||||
super(fm);
|
||||
|
||||
mContext = context;
|
||||
|
||||
mTabs = new ArrayList<TabInfo>();
|
||||
mPages = new EnumMap<Page, Fragment>(Page.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return mTabs.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
TabInfo info = mTabs.get(position);
|
||||
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getPageTitle(int position) {
|
||||
TabInfo info = mTabs.get(position);
|
||||
return info.title.toUpperCase();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object instantiateItem(ViewGroup container, int position) {
|
||||
Fragment fragment = (Fragment) super.instantiateItem(container, position);
|
||||
mPages.put(mTabs.get(position).page, fragment);
|
||||
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroyItem(ViewGroup container, int position, Object object) {
|
||||
super.destroyItem(container, position, object);
|
||||
mPages.remove(mTabs.get(position).page);
|
||||
}
|
||||
|
||||
public void setOnAddTabListener(OnAddTabListener listener) {
|
||||
mAddTabListener = listener;
|
||||
}
|
||||
|
||||
public void addTab(Page page, Class<?> clss, Bundle args, String title) {
|
||||
addTab(-1, page, clss, args, title);
|
||||
}
|
||||
|
||||
public void addTab(int index, Page page, Class<?> clss, Bundle args, String title) {
|
||||
TabInfo info = new TabInfo(page, clss, args, title);
|
||||
|
||||
if (index >= 0) {
|
||||
mTabs.add(index, info);
|
||||
} else {
|
||||
mTabs.add(info);
|
||||
}
|
||||
|
||||
notifyDataSetChanged();
|
||||
|
||||
if (mAddTabListener != null) {
|
||||
mAddTabListener.onAddTab(title);
|
||||
}
|
||||
}
|
||||
|
||||
public int getItemPosition(Page page) {
|
||||
for (int i = 0; i < mTabs.size(); i++) {
|
||||
TabInfo info = mTabs.get(i);
|
||||
if (info.page == page) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
public Page getPageAtPosition(int position) {
|
||||
TabInfo info = mTabs.get(position);
|
||||
return info.page;
|
||||
}
|
||||
|
||||
public void setCanLoadHint(boolean canLoadHint) {
|
||||
// Update fragment arguments for future instances
|
||||
for (TabInfo info : mTabs) {
|
||||
info.args.putBoolean(HomePager.CAN_LOAD_ARG, canLoadHint);
|
||||
}
|
||||
|
||||
// Enable/disable loading on all existing pages
|
||||
for (Fragment page : mPages.values()) {
|
||||
final HomeFragment homePage = (HomeFragment) page;
|
||||
homePage.setCanLoadHint(canLoadHint);
|
||||
}
|
||||
}
|
||||
}
|
@ -8,6 +8,7 @@ package org.mozilla.gecko.home;
|
||||
import org.mozilla.gecko.R;
|
||||
import org.mozilla.gecko.animation.PropertyAnimator;
|
||||
import org.mozilla.gecko.animation.ViewHelper;
|
||||
import org.mozilla.gecko.home.HomeAdapter.OnAddTabListener;
|
||||
import org.mozilla.gecko.mozglue.RobocopTarget;
|
||||
import org.mozilla.gecko.util.HardwareUtils;
|
||||
|
||||
@ -16,8 +17,6 @@ import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.support.v4.app.Fragment;
|
||||
import android.support.v4.app.FragmentManager;
|
||||
import android.support.v4.app.FragmentStatePagerAdapter;
|
||||
import android.support.v4.view.PagerAdapter;
|
||||
import android.support.v4.view.ViewPager;
|
||||
import android.view.ViewGroup.LayoutParams;
|
||||
import android.util.AttributeSet;
|
||||
@ -25,15 +24,16 @@ import android.view.MotionEvent;
|
||||
import android.view.ViewGroup;
|
||||
import android.view.View;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumMap;
|
||||
import java.util.EnumSet;
|
||||
|
||||
public class HomePager extends ViewPager {
|
||||
|
||||
private final Context mContext;
|
||||
private volatile boolean mLoaded;
|
||||
private Decor mDecor;
|
||||
|
||||
private final OnAddTabListener mAddTabListener;
|
||||
|
||||
// List of pages in order.
|
||||
@RobocopTarget
|
||||
public enum Page {
|
||||
@ -53,8 +53,6 @@ public class HomePager extends ViewPager {
|
||||
static final String LIST_TAG_LAST_TABS = "last_tabs";
|
||||
static final String LIST_TAG_BROWSER_SEARCH = "browser_search";
|
||||
|
||||
private EnumMap<Page, Fragment> mPages = new EnumMap<Page, Fragment>(Page.class);
|
||||
|
||||
public interface OnUrlOpenListener {
|
||||
public enum Flags {
|
||||
ALLOW_SWITCH_TO_TAB
|
||||
@ -92,6 +90,15 @@ public class HomePager extends ViewPager {
|
||||
super(context, attrs);
|
||||
mContext = context;
|
||||
|
||||
mAddTabListener = new OnAddTabListener() {
|
||||
@Override
|
||||
public void onAddTab(String title) {
|
||||
if (mDecor != null) {
|
||||
mDecor.onAddPagerView(title);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// This is to keep all 4 pages in memory after they are
|
||||
// selected in the pager.
|
||||
setOffscreenPageLimit(3);
|
||||
@ -109,6 +116,14 @@ public class HomePager extends ViewPager {
|
||||
if (child instanceof Decor) {
|
||||
((ViewPager.LayoutParams) params).isDecor = true;
|
||||
mDecor = (Decor) child;
|
||||
|
||||
mDecor.setOnTitleClickListener(new OnTitleClickListener() {
|
||||
@Override
|
||||
public void onTitleClicked(int index) {
|
||||
setCurrentItem(index, true);
|
||||
}
|
||||
});
|
||||
|
||||
setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
||||
@Override
|
||||
public void onPageSelected(int position) {
|
||||
@ -129,8 +144,10 @@ public class HomePager extends ViewPager {
|
||||
}
|
||||
|
||||
public void redisplay(FragmentManager fm) {
|
||||
final TabsAdapter adapter = (TabsAdapter) getAdapter();
|
||||
show(fm, adapter.getCurrentPage(), null);
|
||||
final HomeAdapter adapter = (HomeAdapter) getAdapter();
|
||||
final Page currentPage = adapter.getPageAtPosition(getCurrentItem());
|
||||
|
||||
show(fm, currentPage, null);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -140,7 +157,13 @@ public class HomePager extends ViewPager {
|
||||
*/
|
||||
public void show(FragmentManager fm, Page page, PropertyAnimator animator) {
|
||||
mLoaded = true;
|
||||
final TabsAdapter adapter = new TabsAdapter(fm);
|
||||
|
||||
if (mDecor != null) {
|
||||
mDecor.removeAllPagerViews();
|
||||
}
|
||||
|
||||
final HomeAdapter adapter = new HomeAdapter(mContext, fm);
|
||||
adapter.setOnAddTabListener(mAddTabListener);
|
||||
|
||||
// Only animate on post-HC devices, when a non-null animator is given
|
||||
final boolean shouldAnimate = (animator != null && Build.VERSION.SDK_INT >= 11);
|
||||
@ -222,122 +245,6 @@ public class HomePager extends ViewPager {
|
||||
}
|
||||
}
|
||||
|
||||
class TabsAdapter extends FragmentStatePagerAdapter
|
||||
implements OnTitleClickListener {
|
||||
private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();
|
||||
|
||||
final class TabInfo {
|
||||
private final Page page;
|
||||
private final Class<?> clss;
|
||||
private final Bundle args;
|
||||
private final String title;
|
||||
|
||||
TabInfo(Page page, Class<?> clss, Bundle args, String title) {
|
||||
this.page = page;
|
||||
this.clss = clss;
|
||||
this.args = args;
|
||||
this.title = title;
|
||||
}
|
||||
}
|
||||
|
||||
public TabsAdapter(FragmentManager fm) {
|
||||
super(fm);
|
||||
|
||||
if (mDecor != null) {
|
||||
mDecor.removeAllPagerViews();
|
||||
mDecor.setOnTitleClickListener(this);
|
||||
}
|
||||
}
|
||||
|
||||
public void addTab(Page page, Class<?> clss, Bundle args, String title) {
|
||||
addTab(-1, page, clss, args, title);
|
||||
}
|
||||
|
||||
public void addTab(int index, Page page, Class<?> clss, Bundle args, String title) {
|
||||
TabInfo info = new TabInfo(page, clss, args, title);
|
||||
|
||||
if (index >= 0) {
|
||||
mTabs.add(index, info);
|
||||
} else {
|
||||
mTabs.add(info);
|
||||
}
|
||||
|
||||
notifyDataSetChanged();
|
||||
|
||||
if (mDecor != null) {
|
||||
mDecor.onAddPagerView(title);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTitleClicked(int index) {
|
||||
setCurrentItem(index, true);
|
||||
}
|
||||
|
||||
public int getItemPosition(Page page) {
|
||||
for (int i = 0; i < mTabs.size(); i++) {
|
||||
TabInfo info = mTabs.get(i);
|
||||
if (info.page == page) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
public Page getCurrentPage() {
|
||||
int currentItem = getCurrentItem();
|
||||
TabInfo info = mTabs.get(currentItem);
|
||||
return info.page;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getCount() {
|
||||
return mTabs.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Fragment getItem(int position) {
|
||||
TabInfo info = mTabs.get(position);
|
||||
return Fragment.instantiate(mContext, info.clss.getName(), info.args);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CharSequence getPageTitle(int position) {
|
||||
TabInfo info = mTabs.get(position);
|
||||
return info.title.toUpperCase();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object instantiateItem(ViewGroup container, int position) {
|
||||
Fragment fragment = (Fragment) super.instantiateItem(container, position);
|
||||
|
||||
mPages.put(mTabs.get(position).page, fragment);
|
||||
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void destroyItem(ViewGroup container, int position, Object object) {
|
||||
super.destroyItem(container, position, object);
|
||||
|
||||
mPages.remove(mTabs.get(position).page);
|
||||
}
|
||||
|
||||
public void setCanLoadHint(boolean canLoadHint) {
|
||||
// Update fragment arguments for future instances
|
||||
for (TabInfo info : mTabs) {
|
||||
info.args.putBoolean(CAN_LOAD_ARG, canLoadHint);
|
||||
}
|
||||
|
||||
// Enable/disable loading on all existing pages
|
||||
for (Fragment page : mPages.values()) {
|
||||
final HomeFragment homePage = (HomeFragment) page;
|
||||
homePage.setCanLoadHint(canLoadHint);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onInterceptTouchEvent(MotionEvent event) {
|
||||
if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
|
||||
|
@ -208,6 +208,7 @@ gbjar.sources += [
|
||||
'home/BrowserSearch.java',
|
||||
'home/FadedTextView.java',
|
||||
'home/HistoryPage.java',
|
||||
'home/HomeAdapter.java',
|
||||
'home/HomeBanner.java',
|
||||
'home/HomeFragment.java',
|
||||
'home/HomeListView.java',
|
||||
|
Loading…
Reference in New Issue
Block a user