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 +}