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