1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/mobile/android/base/home/HomeAdapter.java Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,178 @@ 1.4 +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- 1.5 + * This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +package org.mozilla.gecko.home; 1.10 + 1.11 +import org.mozilla.gecko.home.HomeConfig.PanelConfig; 1.12 +import org.mozilla.gecko.home.HomeConfig.PanelType; 1.13 +import org.mozilla.gecko.home.HomePager; 1.14 + 1.15 +import android.content.Context; 1.16 +import android.os.Bundle; 1.17 +import android.support.v4.app.Fragment; 1.18 +import android.support.v4.app.FragmentManager; 1.19 +import android.support.v4.app.FragmentStatePagerAdapter; 1.20 +import android.view.ViewGroup; 1.21 + 1.22 +import java.util.ArrayList; 1.23 +import java.util.HashMap; 1.24 +import java.util.List; 1.25 + 1.26 +class HomeAdapter extends FragmentStatePagerAdapter { 1.27 + 1.28 + private final Context mContext; 1.29 + private final ArrayList<PanelInfo> mPanelInfos; 1.30 + private final HashMap<String, Fragment> mPanels; 1.31 + 1.32 + private boolean mCanLoadHint; 1.33 + 1.34 + private OnAddPanelListener mAddPanelListener; 1.35 + 1.36 + interface OnAddPanelListener { 1.37 + public void onAddPanel(String title); 1.38 + } 1.39 + 1.40 + public HomeAdapter(Context context, FragmentManager fm) { 1.41 + super(fm); 1.42 + 1.43 + mContext = context; 1.44 + mCanLoadHint = HomeFragment.DEFAULT_CAN_LOAD_HINT; 1.45 + 1.46 + mPanelInfos = new ArrayList<PanelInfo>(); 1.47 + mPanels = new HashMap<String, Fragment>(); 1.48 + } 1.49 + 1.50 + @Override 1.51 + public int getCount() { 1.52 + return mPanelInfos.size(); 1.53 + } 1.54 + 1.55 + @Override 1.56 + public Fragment getItem(int position) { 1.57 + PanelInfo info = mPanelInfos.get(position); 1.58 + return Fragment.instantiate(mContext, info.getClassName(), info.getArgs()); 1.59 + } 1.60 + 1.61 + @Override 1.62 + public CharSequence getPageTitle(int position) { 1.63 + if (mPanelInfos.size() > 0) { 1.64 + PanelInfo info = mPanelInfos.get(position); 1.65 + return info.getTitle().toUpperCase(); 1.66 + } 1.67 + 1.68 + return null; 1.69 + } 1.70 + 1.71 + @Override 1.72 + public Object instantiateItem(ViewGroup container, int position) { 1.73 + Fragment fragment = (Fragment) super.instantiateItem(container, position); 1.74 + mPanels.put(mPanelInfos.get(position).getId(), fragment); 1.75 + 1.76 + return fragment; 1.77 + } 1.78 + 1.79 + @Override 1.80 + public void destroyItem(ViewGroup container, int position, Object object) { 1.81 + super.destroyItem(container, position, object); 1.82 + mPanels.remove(mPanelInfos.get(position).getId()); 1.83 + } 1.84 + 1.85 + public void setOnAddPanelListener(OnAddPanelListener listener) { 1.86 + mAddPanelListener = listener; 1.87 + } 1.88 + 1.89 + public int getItemPosition(String panelId) { 1.90 + for (int i = 0; i < mPanelInfos.size(); i++) { 1.91 + final String id = mPanelInfos.get(i).getId(); 1.92 + if (id.equals(panelId)) { 1.93 + return i; 1.94 + } 1.95 + } 1.96 + 1.97 + return -1; 1.98 + } 1.99 + 1.100 + public String getPanelIdAtPosition(int position) { 1.101 + // getPanelIdAtPosition() might be called before HomeAdapter 1.102 + // has got its initial list of PanelConfigs. Just bail. 1.103 + if (mPanelInfos.isEmpty()) { 1.104 + return null; 1.105 + } 1.106 + 1.107 + return mPanelInfos.get(position).getId(); 1.108 + } 1.109 + 1.110 + private void addPanel(PanelInfo info) { 1.111 + mPanelInfos.add(info); 1.112 + 1.113 + if (mAddPanelListener != null) { 1.114 + mAddPanelListener.onAddPanel(info.getTitle()); 1.115 + } 1.116 + } 1.117 + 1.118 + public void update(List<PanelConfig> panelConfigs) { 1.119 + mPanels.clear(); 1.120 + mPanelInfos.clear(); 1.121 + 1.122 + if (panelConfigs != null) { 1.123 + for (PanelConfig panelConfig : panelConfigs) { 1.124 + final PanelInfo info = new PanelInfo(panelConfig); 1.125 + addPanel(info); 1.126 + } 1.127 + } 1.128 + 1.129 + notifyDataSetChanged(); 1.130 + } 1.131 + 1.132 + public boolean getCanLoadHint() { 1.133 + return mCanLoadHint; 1.134 + } 1.135 + 1.136 + public void setCanLoadHint(boolean canLoadHint) { 1.137 + // We cache the last hint value so that we can use it when 1.138 + // creating new panels. See PanelInfo.getArgs(). 1.139 + mCanLoadHint = canLoadHint; 1.140 + 1.141 + // Enable/disable loading on all existing panels 1.142 + for (Fragment panelFragment : mPanels.values()) { 1.143 + final HomeFragment panel = (HomeFragment) panelFragment; 1.144 + panel.setCanLoadHint(canLoadHint); 1.145 + } 1.146 + } 1.147 + 1.148 + private final class PanelInfo { 1.149 + private final PanelConfig mPanelConfig; 1.150 + 1.151 + PanelInfo(PanelConfig panelConfig) { 1.152 + mPanelConfig = panelConfig; 1.153 + } 1.154 + 1.155 + public String getId() { 1.156 + return mPanelConfig.getId(); 1.157 + } 1.158 + 1.159 + public String getTitle() { 1.160 + return mPanelConfig.getTitle(); 1.161 + } 1.162 + 1.163 + public String getClassName() { 1.164 + final PanelType type = mPanelConfig.getType(); 1.165 + return type.getPanelClass().getName(); 1.166 + } 1.167 + 1.168 + public Bundle getArgs() { 1.169 + final Bundle args = new Bundle(); 1.170 + 1.171 + args.putBoolean(HomePager.CAN_LOAD_ARG, mCanLoadHint); 1.172 + 1.173 + // Only DynamicPanels need the PanelConfig argument 1.174 + if (mPanelConfig.isDynamic()) { 1.175 + args.putParcelable(HomePager.PANEL_CONFIG_ARG, mPanelConfig); 1.176 + } 1.177 + 1.178 + return args; 1.179 + } 1.180 + } 1.181 +}