Bug 942231 - Factor out HomePager's adapter into a separate file (r=margaret)

This commit is contained in:
Lucas Rocha 2013-12-12 12:02:50 +00:00
parent e5e1880667
commit d6ffeec24d
3 changed files with 172 additions and 125 deletions

View 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);
}
}
}

View File

@ -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) {

View File

@ -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',