michael@0: /* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: package org.mozilla.gecko.home; michael@0: michael@0: import org.mozilla.gecko.home.HomeConfig.PanelConfig; michael@0: import org.mozilla.gecko.home.HomeConfig.PanelType; michael@0: import org.mozilla.gecko.home.HomePager; michael@0: michael@0: import android.content.Context; michael@0: import android.os.Bundle; michael@0: import android.support.v4.app.Fragment; michael@0: import android.support.v4.app.FragmentManager; michael@0: import android.support.v4.app.FragmentStatePagerAdapter; michael@0: import android.view.ViewGroup; michael@0: michael@0: import java.util.ArrayList; michael@0: import java.util.HashMap; michael@0: import java.util.List; michael@0: michael@0: class HomeAdapter extends FragmentStatePagerAdapter { michael@0: michael@0: private final Context mContext; michael@0: private final ArrayList mPanelInfos; michael@0: private final HashMap mPanels; michael@0: michael@0: private boolean mCanLoadHint; michael@0: michael@0: private OnAddPanelListener mAddPanelListener; michael@0: michael@0: interface OnAddPanelListener { michael@0: public void onAddPanel(String title); michael@0: } michael@0: michael@0: public HomeAdapter(Context context, FragmentManager fm) { michael@0: super(fm); michael@0: michael@0: mContext = context; michael@0: mCanLoadHint = HomeFragment.DEFAULT_CAN_LOAD_HINT; michael@0: michael@0: mPanelInfos = new ArrayList(); michael@0: mPanels = new HashMap(); michael@0: } michael@0: michael@0: @Override michael@0: public int getCount() { michael@0: return mPanelInfos.size(); michael@0: } michael@0: michael@0: @Override michael@0: public Fragment getItem(int position) { michael@0: PanelInfo info = mPanelInfos.get(position); michael@0: return Fragment.instantiate(mContext, info.getClassName(), info.getArgs()); michael@0: } michael@0: michael@0: @Override michael@0: public CharSequence getPageTitle(int position) { michael@0: if (mPanelInfos.size() > 0) { michael@0: PanelInfo info = mPanelInfos.get(position); michael@0: return info.getTitle().toUpperCase(); michael@0: } michael@0: michael@0: return null; michael@0: } michael@0: michael@0: @Override michael@0: public Object instantiateItem(ViewGroup container, int position) { michael@0: Fragment fragment = (Fragment) super.instantiateItem(container, position); michael@0: mPanels.put(mPanelInfos.get(position).getId(), fragment); michael@0: michael@0: return fragment; michael@0: } michael@0: michael@0: @Override michael@0: public void destroyItem(ViewGroup container, int position, Object object) { michael@0: super.destroyItem(container, position, object); michael@0: mPanels.remove(mPanelInfos.get(position).getId()); michael@0: } michael@0: michael@0: public void setOnAddPanelListener(OnAddPanelListener listener) { michael@0: mAddPanelListener = listener; michael@0: } michael@0: michael@0: public int getItemPosition(String panelId) { michael@0: for (int i = 0; i < mPanelInfos.size(); i++) { michael@0: final String id = mPanelInfos.get(i).getId(); michael@0: if (id.equals(panelId)) { michael@0: return i; michael@0: } michael@0: } michael@0: michael@0: return -1; michael@0: } michael@0: michael@0: public String getPanelIdAtPosition(int position) { michael@0: // getPanelIdAtPosition() might be called before HomeAdapter michael@0: // has got its initial list of PanelConfigs. Just bail. michael@0: if (mPanelInfos.isEmpty()) { michael@0: return null; michael@0: } michael@0: michael@0: return mPanelInfos.get(position).getId(); michael@0: } michael@0: michael@0: private void addPanel(PanelInfo info) { michael@0: mPanelInfos.add(info); michael@0: michael@0: if (mAddPanelListener != null) { michael@0: mAddPanelListener.onAddPanel(info.getTitle()); michael@0: } michael@0: } michael@0: michael@0: public void update(List panelConfigs) { michael@0: mPanels.clear(); michael@0: mPanelInfos.clear(); michael@0: michael@0: if (panelConfigs != null) { michael@0: for (PanelConfig panelConfig : panelConfigs) { michael@0: final PanelInfo info = new PanelInfo(panelConfig); michael@0: addPanel(info); michael@0: } michael@0: } michael@0: michael@0: notifyDataSetChanged(); michael@0: } michael@0: michael@0: public boolean getCanLoadHint() { michael@0: return mCanLoadHint; michael@0: } michael@0: michael@0: public void setCanLoadHint(boolean canLoadHint) { michael@0: // We cache the last hint value so that we can use it when michael@0: // creating new panels. See PanelInfo.getArgs(). michael@0: mCanLoadHint = canLoadHint; michael@0: michael@0: // Enable/disable loading on all existing panels michael@0: for (Fragment panelFragment : mPanels.values()) { michael@0: final HomeFragment panel = (HomeFragment) panelFragment; michael@0: panel.setCanLoadHint(canLoadHint); michael@0: } michael@0: } michael@0: michael@0: private final class PanelInfo { michael@0: private final PanelConfig mPanelConfig; michael@0: michael@0: PanelInfo(PanelConfig panelConfig) { michael@0: mPanelConfig = panelConfig; michael@0: } michael@0: michael@0: public String getId() { michael@0: return mPanelConfig.getId(); michael@0: } michael@0: michael@0: public String getTitle() { michael@0: return mPanelConfig.getTitle(); michael@0: } michael@0: michael@0: public String getClassName() { michael@0: final PanelType type = mPanelConfig.getType(); michael@0: return type.getPanelClass().getName(); michael@0: } michael@0: michael@0: public Bundle getArgs() { michael@0: final Bundle args = new Bundle(); michael@0: michael@0: args.putBoolean(HomePager.CAN_LOAD_ARG, mCanLoadHint); michael@0: michael@0: // Only DynamicPanels need the PanelConfig argument michael@0: if (mPanelConfig.isDynamic()) { michael@0: args.putParcelable(HomePager.PANEL_CONFIG_ARG, mPanelConfig); michael@0: } michael@0: michael@0: return args; michael@0: } michael@0: } michael@0: }