mobile/android/base/home/HomeAdapter.java

changeset 0
6474c204b198
     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 +}

mercurial