Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.chrome.browser; | 5 package org.chromium.chrome.browser; |
| 6 | 6 |
| 7 import android.app.Dialog; | 7 import android.app.Dialog; |
| 8 import android.content.Context; | 8 import android.content.Context; |
| 9 import android.content.DialogInterface; | |
| 9 import android.graphics.Color; | 10 import android.graphics.Color; |
| 10 import android.graphics.drawable.ColorDrawable; | 11 import android.graphics.drawable.ColorDrawable; |
| 11 import android.text.SpannableString; | 12 import android.text.SpannableString; |
| 12 import android.text.method.LinkMovementMethod; | 13 import android.text.method.LinkMovementMethod; |
| 13 import android.util.DisplayMetrics; | 14 import android.util.DisplayMetrics; |
| 14 import android.view.Gravity; | 15 import android.view.Gravity; |
| 15 import android.view.LayoutInflater; | 16 import android.view.LayoutInflater; |
| 16 import android.view.View; | 17 import android.view.View; |
| 17 import android.view.ViewGroup; | 18 import android.view.ViewGroup; |
| 18 import android.view.ViewGroup.LayoutParams; | 19 import android.view.ViewGroup.LayoutParams; |
| 19 import android.view.Window; | 20 import android.view.Window; |
| 20 import android.view.WindowManager; | 21 import android.view.WindowManager; |
| 21 import android.widget.AdapterView; | 22 import android.widget.AdapterView; |
| 22 import android.widget.ArrayAdapter; | 23 import android.widget.ArrayAdapter; |
| 23 import android.widget.Button; | 24 import android.widget.Button; |
| 24 import android.widget.LinearLayout; | 25 import android.widget.LinearLayout; |
| 25 import android.widget.ListView; | 26 import android.widget.ListView; |
| 26 import android.widget.ProgressBar; | 27 import android.widget.ProgressBar; |
| 27 import android.widget.TextView; | 28 import android.widget.TextView; |
| 28 | 29 |
| 29 import org.chromium.chrome.R; | 30 import org.chromium.chrome.R; |
| 30 import org.chromium.ui.base.DeviceFormFactor; | 31 import org.chromium.ui.base.DeviceFormFactor; |
| 31 import org.chromium.ui.widget.TextViewWithClickableSpans; | 32 import org.chromium.ui.widget.TextViewWithClickableSpans; |
| 32 | 33 |
| 34 import java.util.HashSet; | |
| 33 import java.util.List; | 35 import java.util.List; |
| 36 import java.util.Set; | |
| 34 | 37 |
| 35 /** | 38 /** |
| 36 * A general-purpose dialog for presenting a list of things to pick from. | 39 * A general-purpose dialog for presenting a list of things to pick from. |
| 37 */ | 40 */ |
| 38 public class ItemChooserDialog { | 41 public class ItemChooserDialog { |
| 39 /** | 42 /** |
| 40 * An interface to implement to get a callback when something has been | 43 * An interface to implement to get a callback when something has been |
| 41 * selected. | 44 * selected. |
| 42 */ | 45 */ |
| 43 public interface ItemSelectedCallback { | 46 public interface ItemSelectedCallback { |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 68 */ | 71 */ |
| 69 public static class ItemChooserLabels { | 72 public static class ItemChooserLabels { |
| 70 // The title at the top of the dialog. | 73 // The title at the top of the dialog. |
| 71 public final SpannableString mTitle; | 74 public final SpannableString mTitle; |
| 72 // The message to show while results are trickling in. | 75 // The message to show while results are trickling in. |
| 73 public final String mSearching; | 76 public final String mSearching; |
| 74 // The message to show when no results were produced. | 77 // The message to show when no results were produced. |
| 75 public final SpannableString mNoneFound; | 78 public final SpannableString mNoneFound; |
| 76 // A status message to show above the button row. | 79 // A status message to show above the button row. |
| 77 public final SpannableString mStatus; | 80 public final SpannableString mStatus; |
| 81 // An error state. | |
| 82 public final SpannableString mErrorMessage; | |
| 83 // A status message to go with the error state. | |
| 84 public final SpannableString mErrorStatus; | |
| 78 // The label for the positive button (e.g. Select/Pair). | 85 // The label for the positive button (e.g. Select/Pair). |
| 79 public final String mPositiveButton; | 86 public final String mPositiveButton; |
| 80 | 87 |
| 81 public ItemChooserLabels(SpannableString title, String searching, Spanna bleString noneFound, | 88 public ItemChooserLabels(SpannableString title, String searching, Spanna bleString noneFound, |
| 82 SpannableString status, String positiveButton) { | 89 SpannableString status, SpannableString errorMessage, SpannableS tring errorStatus, |
| 90 String positiveButton) { | |
| 83 mTitle = title; | 91 mTitle = title; |
| 84 mSearching = searching; | 92 mSearching = searching; |
| 85 mNoneFound = noneFound; | 93 mNoneFound = noneFound; |
| 86 mStatus = status; | 94 mStatus = status; |
| 95 mErrorMessage = errorMessage; | |
| 96 mErrorStatus = errorStatus; | |
| 87 mPositiveButton = positiveButton; | 97 mPositiveButton = positiveButton; |
| 88 } | 98 } |
| 89 } | 99 } |
| 90 | 100 |
| 91 /** | 101 /** |
| 102 * The various states the dialog can represent. | |
| 103 */ | |
| 104 private enum State { | |
| 105 STARTING, | |
| 106 PROGRESS_UPDATE_AVAILABLE, | |
| 107 SHOWING_ERROR, | |
| 108 } | |
| 109 | |
| 110 /** | |
| 92 * An adapter for keeping track of which items to show in the dialog. | 111 * An adapter for keeping track of which items to show in the dialog. |
| 93 */ | 112 */ |
| 94 private class ItemAdapter extends ArrayAdapter<ItemChooserRow> | 113 private class ItemAdapter extends ArrayAdapter<ItemChooserRow> |
| 95 implements AdapterView.OnItemClickListener { | 114 implements AdapterView.OnItemClickListener { |
| 96 private final LayoutInflater mInflater; | 115 private final LayoutInflater mInflater; |
| 97 | 116 |
| 98 // The background color of the highlighted item. | 117 // The background color of the highlighted item. |
| 99 private final int mBackgroundHighlightColor; | 118 private final int mBackgroundHighlightColor; |
| 100 | 119 |
| 101 // The color of the non-highlighted text. | 120 // The color of the non-highlighted text. |
| 102 private final int mDefaultTextColor; | 121 private final int mDefaultTextColor; |
| 103 | 122 |
| 104 // The zero-based index of the item currently selected in the dialog, | 123 // The zero-based index of the item currently selected in the dialog, |
| 105 // or -1 (INVALID_POSITION) if nothing is selected. | 124 // or -1 (INVALID_POSITION) if nothing is selected. |
| 106 private int mSelectedItem = ListView.INVALID_POSITION; | 125 private int mSelectedItem = ListView.INVALID_POSITION; |
| 107 | 126 |
| 127 // A set of keys that are marked as disabled in the dialog. | |
| 128 private Set<String> mDisabledEntries = new HashSet<String>(); | |
| 129 | |
| 108 public ItemAdapter(Context context, int resource) { | 130 public ItemAdapter(Context context, int resource) { |
| 109 super(context, resource); | 131 super(context, resource); |
| 110 | 132 |
| 111 mInflater = LayoutInflater.from(context); | 133 mInflater = LayoutInflater.from(context); |
| 112 | 134 |
| 113 mBackgroundHighlightColor = getContext().getResources().getColor( | 135 mBackgroundHighlightColor = getContext().getResources().getColor( |
| 114 R.color.light_active_color); | 136 R.color.light_active_color); |
| 115 mDefaultTextColor = getContext().getResources().getColor( | 137 mDefaultTextColor = getContext().getResources().getColor( |
| 116 R.color.default_text_color); | 138 R.color.default_text_color); |
| 117 } | 139 } |
| 118 | 140 |
| 119 @Override | 141 @Override |
| 120 public void clear() { | 142 public void clear() { |
| 121 mSelectedItem = ListView.INVALID_POSITION; | 143 mSelectedItem = ListView.INVALID_POSITION; |
| 122 mConfirmButton.setEnabled(false); | 144 mConfirmButton.setEnabled(false); |
| 123 super.clear(); | 145 super.clear(); |
| 124 } | 146 } |
| 125 | 147 |
| 126 /** | 148 /** |
| 127 * Returns the key of the currently selected item or blank if nothing is | 149 * Returns the key of the currently selected item or blank if nothing is |
| 128 * selected. | 150 * selected. |
| 129 */ | 151 */ |
| 130 public String getSelectedItemKey() { | 152 public String getSelectedItemKey() { |
| 131 ItemChooserRow row = getItem(mSelectedItem); | 153 ItemChooserRow row = getItem(mSelectedItem); |
| 132 if (row == null) return ""; | 154 if (row == null) return ""; |
| 133 return row.mKey; | 155 return row.mKey; |
| 134 } | 156 } |
| 135 | 157 |
| 158 /** | |
| 159 * Sets whether the itam is enabled. Disabled items are grayed out. | |
| 160 * @param id The id of the item to affect. | |
| 161 * @param enabled Whether the item should be enabled or not. | |
| 162 */ | |
| 163 public void setEnabled(String id, boolean enabled) { | |
| 164 if (enabled) { | |
| 165 mDisabledEntries.remove(id); | |
| 166 } else { | |
| 167 mDisabledEntries.add(id); | |
| 168 } | |
| 169 notifyDataSetChanged(); | |
| 170 } | |
| 171 | |
| 172 @Override | |
| 173 public boolean isEnabled(int position) { | |
| 174 ItemChooserRow item = getItem(position); | |
| 175 return !mDisabledEntries.contains(item.mKey); | |
| 176 } | |
| 177 | |
| 136 @Override | 178 @Override |
| 137 public int getViewTypeCount() { | 179 public int getViewTypeCount() { |
| 138 return 1; | 180 return 1; |
| 139 } | 181 } |
| 140 | 182 |
| 141 @Override | 183 @Override |
| 142 public long getItemId(int position) { | 184 public long getItemId(int position) { |
| 143 return position; | 185 return position; |
| 144 } | 186 } |
| 145 | 187 |
| 146 @Override | 188 @Override |
| 147 public View getView(int position, View convertView, ViewGroup parent) { | 189 public View getView(int position, View convertView, ViewGroup parent) { |
| 148 TextView view; | 190 TextView view; |
| 149 if (convertView instanceof TextView) { | 191 if (convertView instanceof TextView) { |
| 150 view = (TextView) convertView; | 192 view = (TextView) convertView; |
| 151 } else { | 193 } else { |
| 152 view = (TextView) mInflater.inflate( | 194 view = (TextView) mInflater.inflate( |
| 153 R.layout.item_chooser_dialog_row, parent, false); | 195 R.layout.item_chooser_dialog_row, parent, false); |
| 154 } | 196 } |
| 155 | 197 |
| 156 // Set highlighting for currently selected item. | 198 // Set highlighting for currently selected item. |
| 157 if (position == mSelectedItem) { | 199 if (position == mSelectedItem) { |
| 158 view.setBackgroundColor(mBackgroundHighlightColor); | 200 view.setBackgroundColor(mBackgroundHighlightColor); |
| 159 view.setTextColor(Color.WHITE); | 201 view.setTextColor(Color.WHITE); |
| 160 } else { | 202 } else { |
| 161 view.setBackground(null); | 203 view.setBackground(null); |
| 162 view.setTextColor(mDefaultTextColor); | 204 if (!isEnabled(position)) { |
| 205 view.setTextColor(getContext().getResources().getColor( | |
| 206 R.color.primary_text_disabled_material_light)); | |
| 207 } else { | |
| 208 view.setTextColor(mDefaultTextColor); | |
| 209 } | |
| 163 } | 210 } |
| 164 | 211 |
| 165 ItemChooserRow item = getItem(position); | 212 ItemChooserRow item = getItem(position); |
| 166 view.setText(item.mDescription); | 213 view.setText(item.mDescription); |
| 167 return view; | 214 return view; |
| 168 } | 215 } |
| 169 | 216 |
| 170 @Override | 217 @Override |
| 171 public void onItemClick(AdapterView<?> adapter, View view, int position, long id) { | 218 public void onItemClick(AdapterView<?> adapter, View view, int position, long id) { |
| 172 mSelectedItem = position; | 219 mSelectedItem = position; |
| 173 mConfirmButton.setEnabled(true); | 220 mConfirmButton.setEnabled(true); |
| 174 mItemAdapter.notifyDataSetChanged(); | 221 mItemAdapter.notifyDataSetChanged(); |
| 175 } | 222 } |
| 176 } | 223 } |
| 177 | 224 |
| 178 private Context mContext; | 225 private Context mContext; |
| 179 | 226 |
| 180 // The dialog this class encapsulates. | 227 // The dialog this class encapsulates. |
| 181 private Dialog mDialog; | 228 private Dialog mDialog; |
| 182 | 229 |
| 183 // The callback to notify when the user selected an item. | 230 // The callback to notify when the user selected an item. |
| 184 private ItemSelectedCallback mItemSelectedCallback; | 231 private ItemSelectedCallback mItemSelectedCallback; |
| 185 | 232 |
| 186 // Individual UI elements. | 233 // Individual UI elements. |
| 187 private TextViewWithClickableSpans mTitle; | 234 private TextViewWithClickableSpans mTitle; |
| 188 private TextViewWithClickableSpans mNotFoundMessage; | 235 private TextViewWithClickableSpans mEmptyMessage; |
| 189 private ProgressBar mProgressBar; | 236 private ProgressBar mProgressBar; |
| 190 private ListView mListView; | 237 private ListView mListView; |
| 191 private TextView mStatus; | 238 private TextView mStatus; |
| 192 private Button mConfirmButton; | 239 private Button mConfirmButton; |
| 193 | 240 |
| 194 // The labels to display in the dialog. | 241 // The labels to display in the dialog. |
| 195 private ItemChooserLabels mLabels; | 242 private ItemChooserLabels mLabels; |
| 196 | 243 |
| 197 // The adapter containing the items to show in the dialog. | 244 // The adapter containing the items to show in the dialog. |
| 198 private ItemAdapter mItemAdapter; | 245 private ItemAdapter mItemAdapter; |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 218 mLabels = labels; | 265 mLabels = labels; |
| 219 | 266 |
| 220 LinearLayout dialogContainer = (LinearLayout) LayoutInflater.from( | 267 LinearLayout dialogContainer = (LinearLayout) LayoutInflater.from( |
| 221 mContext).inflate(R.layout.item_chooser_dialog, null); | 268 mContext).inflate(R.layout.item_chooser_dialog, null); |
| 222 | 269 |
| 223 mListView = (ListView) dialogContainer.findViewById(R.id.items); | 270 mListView = (ListView) dialogContainer.findViewById(R.id.items); |
| 224 mProgressBar = (ProgressBar) dialogContainer.findViewById(R.id.progress) ; | 271 mProgressBar = (ProgressBar) dialogContainer.findViewById(R.id.progress) ; |
| 225 mStatus = (TextView) dialogContainer.findViewById(R.id.status); | 272 mStatus = (TextView) dialogContainer.findViewById(R.id.status); |
| 226 mTitle = (TextViewWithClickableSpans) dialogContainer.findViewById( | 273 mTitle = (TextViewWithClickableSpans) dialogContainer.findViewById( |
| 227 R.id.dialog_title); | 274 R.id.dialog_title); |
| 228 mNotFoundMessage = | 275 mEmptyMessage = |
| 229 (TextViewWithClickableSpans) dialogContainer.findViewById( | 276 (TextViewWithClickableSpans) dialogContainer.findViewById(R.id.n ot_found_message); |
| 230 R.id.not_found_message); | |
| 231 | 277 |
| 232 mTitle.setText(labels.mTitle); | 278 mTitle.setText(labels.mTitle); |
| 233 mTitle.setMovementMethod(LinkMovementMethod.getInstance()); | 279 mTitle.setMovementMethod(LinkMovementMethod.getInstance()); |
| 234 | 280 |
| 235 mNotFoundMessage.setText(labels.mNoneFound); | 281 mEmptyMessage.setMovementMethod(LinkMovementMethod.getInstance()); |
| 236 mNotFoundMessage.setMovementMethod(LinkMovementMethod.getInstance()); | |
| 237 | |
| 238 mStatus.setText(labels.mSearching); | |
| 239 mStatus.setMovementMethod(LinkMovementMethod.getInstance()); | 282 mStatus.setMovementMethod(LinkMovementMethod.getInstance()); |
| 240 | 283 |
| 241 mConfirmButton = (Button) dialogContainer.findViewById(R.id.positive); | 284 mConfirmButton = (Button) dialogContainer.findViewById(R.id.positive); |
| 242 mConfirmButton.setText(labels.mPositiveButton); | 285 mConfirmButton.setText(labels.mPositiveButton); |
| 243 mConfirmButton.setEnabled(false); | 286 mConfirmButton.setEnabled(false); |
| 244 mConfirmButton.setOnClickListener(new View.OnClickListener() { | 287 mConfirmButton.setOnClickListener(new View.OnClickListener() { |
| 245 @Override | 288 @Override |
| 246 public void onClick(View v) { | 289 public void onClick(View v) { |
| 247 mItemSelectedCallback.onItemSelected( | 290 mItemSelectedCallback.onItemSelected( |
| 248 mItemAdapter.getSelectedItemKey()); | 291 mItemAdapter.getSelectedItemKey()); |
| 249 mDialog.dismiss(); | 292 mDialog.dismiss(); |
| 250 } | 293 } |
| 251 }); | 294 }); |
| 252 | 295 |
| 253 mItemAdapter = new ItemAdapter(mContext, R.layout.item_chooser_dialog_ro w); | 296 mItemAdapter = new ItemAdapter(mContext, R.layout.item_chooser_dialog_ro w); |
| 254 mListView.setAdapter(mItemAdapter); | 297 mListView.setAdapter(mItemAdapter); |
| 255 mListView.setEmptyView(mNotFoundMessage); | 298 mListView.setEmptyView(mEmptyMessage); |
| 256 mNotFoundMessage.setVisibility(View.GONE); | |
| 257 mListView.setOnItemClickListener(mItemAdapter); | 299 mListView.setOnItemClickListener(mItemAdapter); |
| 258 mListView.setDivider(null); | 300 mListView.setDivider(null); |
| 301 setState(State.STARTING); | |
| 259 | 302 |
| 260 // The list is the main element in the dialog and it should grow and | 303 // The list is the main element in the dialog and it should grow and |
| 261 // shrink according to the size of the screen available (clamped to a | 304 // shrink according to the size of the screen available (clamped to a |
| 262 // min and a max). | 305 // min and a max). |
| 263 View listViewContainer = dialogContainer.findViewById(R.id.container); | 306 View listViewContainer = dialogContainer.findViewById(R.id.container); |
| 264 DisplayMetrics metrics = new DisplayMetrics(); | 307 DisplayMetrics metrics = new DisplayMetrics(); |
| 265 WindowManager manager = (WindowManager) mContext.getSystemService( | 308 WindowManager manager = (WindowManager) mContext.getSystemService( |
| 266 Context.WINDOW_SERVICE); | 309 Context.WINDOW_SERVICE); |
| 267 manager.getDefaultDisplay().getMetrics(metrics); | 310 manager.getDefaultDisplay().getMetrics(metrics); |
| 268 | 311 |
| 269 float density = context.getResources().getDisplayMetrics().density; | 312 float density = context.getResources().getDisplayMetrics().density; |
| 270 int height = (int) (metrics.heightPixels * LISTVIEW_HEIGHT_PERCENT); | 313 int height = (int) (metrics.heightPixels * LISTVIEW_HEIGHT_PERCENT); |
| 271 height = Math.min(height, Math.round(MAX_HEIGHT_DP * density)); | 314 height = Math.min(height, Math.round(MAX_HEIGHT_DP * density)); |
| 272 height = Math.max(height, Math.round(MIN_HEIGHT_DP * density)); | 315 height = Math.max(height, Math.round(MIN_HEIGHT_DP * density)); |
| 273 listViewContainer.setLayoutParams( | 316 listViewContainer.setLayoutParams( |
| 274 new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, height) ); | 317 new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, height) ); |
| 275 | 318 |
| 276 showDialogForView(dialogContainer); | 319 showDialogForView(dialogContainer); |
| 277 } | 320 } |
| 278 | 321 |
| 279 private void showDialogForView(View view) { | 322 private void showDialogForView(View view) { |
| 280 mDialog = new Dialog(mContext); | 323 mDialog = new Dialog(mContext); |
| 281 mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); | 324 mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); |
| 282 mDialog.addContentView(view, | 325 mDialog.addContentView(view, |
| 283 new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PA RENT, | 326 new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PA RENT, |
| 284 LinearLayout.LayoutParams.MATCH_PA RENT)); | 327 LinearLayout.LayoutParams.MATCH_PA RENT)); |
| 328 mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { | |
| 329 @Override | |
| 330 public void onDismiss(DialogInterface dialog) { | |
| 331 mItemSelectedCallback.onItemSelected(""); | |
|
newt (away)
2015/09/02 17:48:42
Seems like you'll end up calling onItemSelected()
Finnur
2015/09/03 11:51:45
Both handlers do, indeed, fire, but the second mes
| |
| 332 } | |
| 333 }); | |
| 285 | 334 |
| 286 Window window = mDialog.getWindow(); | 335 Window window = mDialog.getWindow(); |
| 287 if (!DeviceFormFactor.isTablet(mContext)) { | 336 if (!DeviceFormFactor.isTablet(mContext)) { |
| 288 // On smaller screens, make the dialog fill the width of the screen, | 337 // On smaller screens, make the dialog fill the width of the screen, |
| 289 // and appear at the top. | 338 // and appear at the top. |
| 290 window.setBackgroundDrawable(new ColorDrawable(Color.WHITE)); | 339 window.setBackgroundDrawable(new ColorDrawable(Color.WHITE)); |
| 291 window.setGravity(Gravity.TOP); | 340 window.setGravity(Gravity.TOP); |
| 292 window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, | 341 window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, |
| 293 ViewGroup.LayoutParams.WRAP_CONTENT); | 342 ViewGroup.LayoutParams.WRAP_CONTENT); |
| 294 } | 343 } |
| 295 | 344 |
| 296 mDialog.show(); | 345 mDialog.show(); |
| 297 } | 346 } |
| 298 | 347 |
| 348 public void dismiss() { | |
| 349 mDialog.dismiss(); | |
| 350 } | |
| 351 | |
| 299 /** | 352 /** |
| 300 * Add items to show in the dialog. | 353 * Add items to show in the dialog. |
| 301 * | 354 * |
| 302 * @param list The list of items to show. This function can be called | 355 * @param list The list of items to show. This function can be called |
| 303 * multiple times to add more items and new items will be appended to | 356 * multiple times to add more items and new items will be appended to |
| 304 * the end of the list. An empty list should be used if there are no | 357 * the end of the list. An empty list should be used if there are no |
| 305 * items to show. | 358 * items to show. |
| 306 */ | 359 */ |
| 307 public void showList(List<ItemChooserRow> list) { | 360 public void showList(List<ItemChooserRow> list) { |
| 308 mProgressBar.setVisibility(View.GONE); | 361 mProgressBar.setVisibility(View.GONE); |
| 309 mStatus.setText(mLabels.mStatus); | |
| 310 | 362 |
| 311 if (list.isEmpty()) { | 363 if (!list.isEmpty()) { |
| 312 boolean showEmptyMessage = mItemAdapter.isEmpty(); | |
| 313 mNotFoundMessage.setVisibility( | |
| 314 showEmptyMessage ? View.VISIBLE : View.GONE); | |
| 315 mListView.setVisibility(showEmptyMessage ? View.GONE : View.VISIBLE) ; | |
| 316 } else { | |
| 317 mListView.setVisibility(View.VISIBLE); | |
| 318 mItemAdapter.addAll(list); | 364 mItemAdapter.addAll(list); |
| 319 } | 365 } |
| 366 setState(State.PROGRESS_UPDATE_AVAILABLE); | |
| 320 } | 367 } |
| 321 | 368 |
| 322 /** | 369 /** |
| 370 * Sets whether the item is enabled. | |
| 371 * @param id The id of the item to affect. | |
| 372 * @param enabled Whether the item should be enabled or not. | |
| 373 */ | |
| 374 public void setEnabled(String id, boolean enabled) { | |
| 375 mItemAdapter.setEnabled(id, enabled); | |
| 376 } | |
| 377 | |
| 378 /** | |
| 323 * Clear all items from the dialog. | 379 * Clear all items from the dialog. |
| 324 */ | 380 */ |
| 325 public void clear() { | 381 public void clear() { |
| 326 mItemAdapter.clear(); | 382 mItemAdapter.clear(); |
| 383 setState(State.STARTING); | |
| 384 } | |
| 385 | |
| 386 /** | |
| 387 * Set the error state for the dialog. | |
| 388 */ | |
| 389 public void setErrorState() { | |
| 390 setState(State.SHOWING_ERROR); | |
| 391 } | |
| 392 | |
| 393 private void setState(State state) { | |
| 394 switch (state) { | |
| 395 case STARTING: | |
| 396 mStatus.setText(mLabels.mSearching); | |
| 397 mListView.setVisibility(View.GONE); | |
| 398 mProgressBar.setVisibility(View.VISIBLE); | |
| 399 break; | |
| 400 case SHOWING_ERROR: | |
| 401 mProgressBar.setVisibility(View.GONE); | |
| 402 mEmptyMessage.setText(mLabels.mErrorMessage); | |
| 403 mStatus.setText(mLabels.mErrorStatus); | |
| 404 break; | |
| 405 case PROGRESS_UPDATE_AVAILABLE: | |
| 406 mStatus.setText(mLabels.mStatus); | |
| 407 mProgressBar.setVisibility(View.GONE); | |
| 408 mListView.setVisibility(View.VISIBLE); | |
| 409 | |
| 410 boolean showEmptyMessage = mItemAdapter.isEmpty(); | |
| 411 mEmptyMessage.setText(mLabels.mNoneFound); | |
| 412 mEmptyMessage.setVisibility(showEmptyMessage ? View.VISIBLE : Vi ew.GONE); | |
| 413 break; | |
| 414 } | |
| 327 } | 415 } |
| 328 } | 416 } |
| OLD | NEW |