mobile/android/base/home/HomePanelPicker.java

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/mobile/android/base/home/HomePanelPicker.java	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,257 @@
     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 android.app.Activity;
    1.12 +import android.content.Context;
    1.13 +import android.os.Bundle;
    1.14 +import android.support.v4.app.FragmentActivity;
    1.15 +import android.support.v4.app.LoaderManager;
    1.16 +import android.support.v4.app.LoaderManager.LoaderCallbacks;
    1.17 +import android.support.v4.content.Loader;
    1.18 +import android.view.LayoutInflater;
    1.19 +import android.view.View;
    1.20 +import android.view.View.OnClickListener;
    1.21 +import android.view.ViewGroup;
    1.22 +import android.widget.BaseAdapter;
    1.23 +import android.widget.ListView;
    1.24 +import android.widget.TextView;
    1.25 +import android.widget.Toast;
    1.26 +
    1.27 +import java.util.ArrayList;
    1.28 +import java.util.Arrays;
    1.29 +import java.util.List;
    1.30 +
    1.31 +import org.mozilla.gecko.R;
    1.32 +import org.mozilla.gecko.home.HomeConfig;
    1.33 +import org.mozilla.gecko.home.HomeConfig.PanelConfig;
    1.34 +import org.mozilla.gecko.home.PanelInfoManager.RequestCallback;
    1.35 +import org.mozilla.gecko.home.PanelInfoManager.PanelInfo;
    1.36 +
    1.37 +/**
    1.38 + * Dialog for selecting new home panels to add.
    1.39 + */
    1.40 +public class HomePanelPicker extends FragmentActivity {
    1.41 +    private static final String LOGTAG = "HomePanelPicker";
    1.42 +
    1.43 +    /**
    1.44 +     * Intent extra key for caller to pass in a list of existing panel ids.
    1.45 +     */
    1.46 +    public static final String CURRENT_PANELS_IDS = "currentPanelsIds";
    1.47 +
    1.48 +    /**
    1.49 +     * Request code when starting the activity with startActivityForResult.
    1.50 +     */
    1.51 +    public static final int REQUEST_CODE_ADD_PANEL = 1;
    1.52 +
    1.53 +    private static final int LOADER_ID_CONFIG = 0;
    1.54 +
    1.55 +    private ListView mListView;
    1.56 +    private List<String> mCurrentPanelsIds;
    1.57 +    private List<PanelInfo> mPanelInfos;
    1.58 +
    1.59 +    @Override
    1.60 +    public void onCreate(Bundle savedInstance) {
    1.61 +        super.onCreate(savedInstance);
    1.62 +        setContentView(R.layout.home_panel_picker);
    1.63 +
    1.64 +        // Fetch current panel ids from extras bundle, if provided by caller.
    1.65 +        Bundle intentExtras = getIntent().getExtras();
    1.66 +        if (intentExtras != null) {
    1.67 +            String[] panelIdsArray = intentExtras.getStringArray(CURRENT_PANELS_IDS);
    1.68 +            if (panelIdsArray != null) {
    1.69 +                mCurrentPanelsIds = Arrays.asList(panelIdsArray);
    1.70 +            }
    1.71 +        }
    1.72 +
    1.73 +        mListView = (ListView) findViewById(R.id.list);
    1.74 +
    1.75 +        // Set an empty adapter.
    1.76 +        final PickerAdapter adapter = new PickerAdapter(this);
    1.77 +        mListView.setAdapter(adapter);
    1.78 +
    1.79 +        requestAvailablePanels();
    1.80 +    }
    1.81 +
    1.82 +    /**
    1.83 +     * Get panels and update the adapter to display the ones
    1.84 +     * available for install.
    1.85 +     */
    1.86 +    private void requestAvailablePanels() {
    1.87 +        final PanelInfoManager pm = new PanelInfoManager();
    1.88 +        pm.requestAvailablePanels(new RequestCallback() {
    1.89 +            @Override
    1.90 +            public void onComplete(final List<PanelInfo> panelInfos) {
    1.91 +                mPanelInfos = panelInfos;
    1.92 +
    1.93 +                // Fetch current home panels if necessary.
    1.94 +                if (mCurrentPanelsIds == null) {
    1.95 +                    loadConfig();
    1.96 +                } else {
    1.97 +                    updatePanelsAdapter(mPanelInfos);
    1.98 +                }
    1.99 +            }
   1.100 +        });
   1.101 +    }
   1.102 +
   1.103 +    /**
   1.104 +     * Fetch panels from HomeConfig.
   1.105 +     *
   1.106 +     * This is an async call using Loaders.
   1.107 +     */
   1.108 +    private void loadConfig() {
   1.109 +        final ConfigLoaderCallbacks loaderCallbacks = new ConfigLoaderCallbacks();
   1.110 +        final LoaderManager lm = HomePanelPicker.this.getSupportLoaderManager();
   1.111 +        lm.initLoader(LOADER_ID_CONFIG, null, loaderCallbacks);
   1.112 +    }
   1.113 +
   1.114 +    /**
   1.115 +     * Update the list adapter to contain only available panels (with the
   1.116 +     * installed panels filtered out).
   1.117 +     *
   1.118 +     * @param panelInfos List of all available panels.
   1.119 +     */
   1.120 +    private void updatePanelsAdapter(List<PanelInfo> panelInfos) {
   1.121 +        final List<PanelInfo> availablePanels = new ArrayList<PanelInfo>();
   1.122 +
   1.123 +        // Filter out panels that are already displayed.
   1.124 +        for (PanelInfo panelInfo : panelInfos) {
   1.125 +            if (!mCurrentPanelsIds.contains(panelInfo.getId())) {
   1.126 +                availablePanels.add(panelInfo);
   1.127 +            }
   1.128 +        }
   1.129 +
   1.130 +        if (availablePanels.isEmpty()) {
   1.131 +            setContentView(R.layout.home_panel_picker_empty);
   1.132 +            return;
   1.133 +        }
   1.134 +
   1.135 +        final PickerAdapter adapter = (PickerAdapter) mListView.getAdapter();
   1.136 +        adapter.updateFromPanelInfos(availablePanels);
   1.137 +    }
   1.138 +
   1.139 +    private void installNewPanelAndQuit(PanelInfo panelInfo) {
   1.140 +        final PanelConfig newPanelConfig = panelInfo.toPanelConfig();
   1.141 +        HomePanelsManager.getInstance().installPanel(newPanelConfig);
   1.142 +        showToastForNewPanel(newPanelConfig);
   1.143 +
   1.144 +        setResult(Activity.RESULT_OK);
   1.145 +        finish();
   1.146 +    }
   1.147 +
   1.148 +    private void showToastForNewPanel(PanelConfig panelConfig) {
   1.149 +        String panelName = panelConfig.getTitle();
   1.150 +
   1.151 +        // Display toast.
   1.152 +        final String successMsg = getResources().getString(R.string.home_add_panel_installed, panelName);
   1.153 +        Toast.makeText(this, successMsg, Toast.LENGTH_SHORT).show();
   1.154 +    }
   1.155 +
   1.156 +    // ViewHolder for rows of the panel picker.
   1.157 +    private static class PanelRow {
   1.158 +        final TextView title;
   1.159 +        int position;
   1.160 +
   1.161 +        public PanelRow(View view) {
   1.162 +            title = (TextView) view.findViewById(R.id.title);
   1.163 +        }
   1.164 +    }
   1.165 +
   1.166 +    private class PickerAdapter extends BaseAdapter {
   1.167 +        private final LayoutInflater mInflater;
   1.168 +        private List<PanelInfo> mPanelInfos;
   1.169 +        private final OnClickListener mOnClickListener;
   1.170 +
   1.171 +        public PickerAdapter(Context context) {
   1.172 +            this(context, null);
   1.173 +        }
   1.174 +
   1.175 +        public PickerAdapter(Context context, List<PanelInfo> panelInfos) {
   1.176 +            mInflater = LayoutInflater.from(context);
   1.177 +            mPanelInfos = panelInfos;
   1.178 +
   1.179 +            mOnClickListener = new OnClickListener() {
   1.180 +                @Override
   1.181 +                public void onClick(View view) {
   1.182 +                    final PanelRow panelsRow = (PanelRow) view.getTag();
   1.183 +                    installNewPanelAndQuit(mPanelInfos.get(panelsRow.position));
   1.184 +                }
   1.185 +            };
   1.186 +        }
   1.187 +
   1.188 +        @Override
   1.189 +        public int getCount() {
   1.190 +            if (mPanelInfos == null) {
   1.191 +                return 0;
   1.192 +            }
   1.193 +
   1.194 +            return mPanelInfos.size();
   1.195 +        }
   1.196 +
   1.197 +        @Override
   1.198 +        public PanelInfo getItem(int position) {
   1.199 +            if (mPanelInfos == null) {
   1.200 +                return null;
   1.201 +            }
   1.202 +
   1.203 +            return mPanelInfos.get(position);
   1.204 +        }
   1.205 +
   1.206 +        @Override
   1.207 +        public long getItemId(int position) {
   1.208 +            return position;
   1.209 +        }
   1.210 +
   1.211 +        @Override
   1.212 +        public View getView(int position, View convertView, ViewGroup parent) {
   1.213 +            PanelRow row;
   1.214 +
   1.215 +            if (convertView == null) {
   1.216 +                convertView = mInflater.inflate(R.layout.home_panel_picker_row, null);
   1.217 +                convertView.setOnClickListener(mOnClickListener);
   1.218 +
   1.219 +                row = new PanelRow(convertView);
   1.220 +                convertView.setTag(row);
   1.221 +            } else {
   1.222 +                row = (PanelRow) convertView.getTag();
   1.223 +            }
   1.224 +
   1.225 +            row.title.setText(mPanelInfos.get(position).getTitle());
   1.226 +            row.position = position;
   1.227 +
   1.228 +            return convertView;
   1.229 +        }
   1.230 +
   1.231 +        public void updateFromPanelInfos(List<PanelInfo> panelInfos) {
   1.232 +            mPanelInfos = panelInfos;
   1.233 +            notifyDataSetChanged();
   1.234 +        }
   1.235 +    }
   1.236 +
   1.237 +    /**
   1.238 +     * Fetch installed Home panels and update the adapter for this activity.
   1.239 +     */
   1.240 +    private class ConfigLoaderCallbacks implements LoaderCallbacks<HomeConfig.State> {
   1.241 +        @Override
   1.242 +        public Loader<HomeConfig.State> onCreateLoader(int id, Bundle args) {
   1.243 +            final HomeConfig homeConfig = HomeConfig.getDefault(HomePanelPicker.this);
   1.244 +            return new HomeConfigLoader(HomePanelPicker.this, homeConfig);
   1.245 +        }
   1.246 +
   1.247 +        @Override
   1.248 +        public void onLoadFinished(Loader<HomeConfig.State> loader, HomeConfig.State configState) {
   1.249 +            mCurrentPanelsIds = new ArrayList<String>();
   1.250 +            for (PanelConfig panelConfig : configState) {
   1.251 +                mCurrentPanelsIds.add(panelConfig.getId());
   1.252 +            }
   1.253 +
   1.254 +            updatePanelsAdapter(mPanelInfos);
   1.255 +        }
   1.256 +
   1.257 +        @Override
   1.258 +        public void onLoaderReset(Loader<HomeConfig.State> loader) {}
   1.259 +    }
   1.260 +}

mercurial