/* -*- 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.HomeConfig.PageEntry; import org.mozilla.gecko.home.HomeConfig.PageType; import org.mozilla.gecko.home.HomePager; 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.HashMap; import java.util.List; class HomeAdapter extends FragmentStatePagerAdapter { private final Context mContext; private final ArrayList mPageInfos; private final HashMap mPages; private boolean mCanLoadHint; private OnAddPageListener mAddPageListener; interface OnAddPageListener { public void onAddPage(String title); } public HomeAdapter(Context context, FragmentManager fm) { super(fm); mContext = context; mCanLoadHint = HomeFragment.DEFAULT_CAN_LOAD_HINT; mPageInfos = new ArrayList(); mPages = new HashMap(); } @Override public int getCount() { return mPageInfos.size(); } @Override public Fragment getItem(int position) { PageInfo info = mPageInfos.get(position); return Fragment.instantiate(mContext, info.getClassName(), info.getArgs()); } @Override public CharSequence getPageTitle(int position) { if (mPageInfos.size() > 0) { PageInfo info = mPageInfos.get(position); return info.getTitle().toUpperCase(); } return null; } @Override public Object instantiateItem(ViewGroup container, int position) { Fragment fragment = (Fragment) super.instantiateItem(container, position); mPages.put(mPageInfos.get(position).getId(), fragment); return fragment; } @Override public void destroyItem(ViewGroup container, int position, Object object) { super.destroyItem(container, position, object); mPages.remove(mPageInfos.get(position).getId()); } public void setOnAddPageListener(OnAddPageListener listener) { mAddPageListener = listener; } public int getItemPosition(String pageId) { for (int i = 0; i < mPageInfos.size(); i++) { final String id = mPageInfos.get(i).getId(); if (id.equals(pageId)) { return i; } } return -1; } public String getPageIdAtPosition(int position) { // getPageAtPosition() might be called before HomeAdapter // has got its initial list of PageEntries. Just bail. if (mPageInfos.isEmpty()) { return null; } return mPageInfos.get(position).getId(); } private void addPage(PageInfo info) { mPageInfos.add(info); if (mAddPageListener != null) { mAddPageListener.onAddPage(info.getTitle()); } } public void update(List pageEntries) { mPages.clear(); mPageInfos.clear(); if (pageEntries != null) { for (PageEntry pageEntry : pageEntries) { final PageInfo info = new PageInfo(pageEntry); addPage(info); } } notifyDataSetChanged(); } public boolean getCanLoadHint() { return mCanLoadHint; } public void setCanLoadHint(boolean canLoadHint) { // We cache the last hint value so that we can use it when // creating new pages. See PageInfo.getArgs(). mCanLoadHint = canLoadHint; // Enable/disable loading on all existing pages for (Fragment page : mPages.values()) { final HomeFragment homePage = (HomeFragment) page; homePage.setCanLoadHint(canLoadHint); } } private final class PageInfo { private final PageEntry mPageEntry; PageInfo(PageEntry pageEntry) { mPageEntry = pageEntry; } public String getId() { return mPageEntry.getId(); } public String getTitle() { return mPageEntry.getTitle(); } public String getClassName() { final PageType type = mPageEntry.getType(); return type.getPageClass().getName(); } public Bundle getArgs() { final Bundle args = new Bundle(); args.putBoolean(HomePager.CAN_LOAD_ARG, mCanLoadHint); // Only list pages need the page entry if (mPageEntry.getType() == PageType.LIST) { args.putParcelable(HomePager.PAGE_ENTRY_ARG, mPageEntry); } return args; } } }