Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarControlLayout.java

Issue 2850063002: ❄ Split off RadioButtonLayout from InfoBarControls (Closed)
Patch Set: Fix again Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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.infobar; 5 package org.chromium.chrome.browser.infobar;
6 6
7 import android.content.Context; 7 import android.content.Context;
8 import android.content.res.Resources; 8 import android.content.res.Resources;
9 import android.graphics.Paint; 9 import android.graphics.Paint;
10 import android.support.annotation.Nullable; 10 import android.support.annotation.Nullable;
11 import android.support.v7.widget.SwitchCompat; 11 import android.support.v7.widget.SwitchCompat;
12 import android.text.method.LinkMovementMethod; 12 import android.text.method.LinkMovementMethod;
13 import android.util.AttributeSet;
13 import android.view.LayoutInflater; 14 import android.view.LayoutInflater;
14 import android.view.View; 15 import android.view.View;
15 import android.view.ViewGroup; 16 import android.view.ViewGroup;
16 import android.widget.ArrayAdapter; 17 import android.widget.ArrayAdapter;
17 import android.widget.ImageView; 18 import android.widget.ImageView;
18 import android.widget.LinearLayout; 19 import android.widget.LinearLayout;
19 import android.widget.RadioButton;
20 import android.widget.RadioGroup;
21 import android.widget.RatingBar; 20 import android.widget.RatingBar;
22 import android.widget.Spinner; 21 import android.widget.Spinner;
23 import android.widget.TextView; 22 import android.widget.TextView;
24 23
25 import org.chromium.base.ApiCompatibilityUtils; 24 import org.chromium.base.ApiCompatibilityUtils;
26 import org.chromium.base.VisibleForTesting; 25 import org.chromium.base.VisibleForTesting;
27 import org.chromium.chrome.R; 26 import org.chromium.chrome.R;
28 import org.chromium.chrome.browser.widget.DualControlLayout; 27 import org.chromium.chrome.browser.widget.DualControlLayout;
28 import org.chromium.chrome.browser.widget.RadioButtonLayout;
29 29
30 import java.util.List; 30 import java.util.List;
31 31
32 /** 32 /**
33 * Lays out a group of controls (e.g. switches, spinners, or additional text) fo r InfoBars that need 33 * Lays out a group of controls (e.g. switches, spinners, or additional text) fo r InfoBars that need
34 * more than the normal pair of buttons. 34 * more than the normal pair of buttons.
35 * 35 *
36 * This class works with the {@link InfoBarLayout} to define a standard set of c ontrols with 36 * This class works with the {@link InfoBarLayout} to define a standard set of c ontrols with
37 * standardized spacings and text styling that gets laid out in grid form: https ://crbug.com/543205 37 * standardized spacings and text styling that gets laid out in grid form: https ://crbug.com/543205
38 * 38 *
39 * Manually specified margins on the children managed by this layout are EXPLICI TLY ignored to 39 * Manually specified margins on the children managed by this layout are EXPLICI TLY ignored to
40 * enforce a uniform margin between controls across all InfoBar types. Do NOT c ircumvent this 40 * enforce a uniform margin between controls across all InfoBar types. Do NOT c ircumvent this
41 * restriction with creative layout definitions. If the layout algorithm doesn' t work for your new 41 * restriction with creative layout definitions. If the layout algorithm doesn' t work for your new
42 * InfoBar, convince Chrome for Android's UX team to amend the master spec and t hen change the 42 * InfoBar, convince Chrome for Android's UX team to amend the master spec and t hen change the
43 * layout algorithm to match. 43 * layout algorithm to match.
44 * 44 *
45 * TODO(dfalcantara): The line spacing multiplier is applied to all lines in JB & KK, even if the 45 * TODO(dfalcantara): The line spacing multiplier is applied to all lines in JB & KK, even if the
46 * TextView has only one line. This throws off vertical alig nment. Find a 46 * TextView has only one line. This throws off vertical alig nment. Find a
47 * solution that hopefully doesn't involve subclassing the Te xtView. 47 * solution that hopefully doesn't involve subclassing the Te xtView.
48 *
49 * TODO(dfalcantara): Move this to a more general location.
50 */ 48 */
51 public final class InfoBarControlLayout extends ViewGroup { 49 public final class InfoBarControlLayout extends ViewGroup {
52 public static final int INVALID_INDEX = -1;
53
54 /** 50 /**
55 * ArrayAdapter that automatically determines what size make its Views to ac commodate all of 51 * ArrayAdapter that automatically determines what size make its Views to ac commodate all of
56 * its potential values. 52 * its potential values.
57 * @param <T> Type of object that the ArrayAdapter stores. 53 * @param <T> Type of object that the ArrayAdapter stores.
58 */ 54 */
59 public static final class InfoBarArrayAdapter<T> extends ArrayAdapter<T> { 55 public static final class InfoBarArrayAdapter<T> extends ArrayAdapter<T> {
60 private final String mLabel; 56 private final String mLabel;
61 private int mMinWidthRequiredForValues; 57 private int mMinWidthRequiredForValues;
62 58
63 public InfoBarArrayAdapter(Context context, String label) { 59 public InfoBarArrayAdapter(Context context, String label) {
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 } 152 }
157 } 153 }
158 154
159 private final int mMarginBetweenRows; 155 private final int mMarginBetweenRows;
160 private final int mMarginBetweenColumns; 156 private final int mMarginBetweenColumns;
161 157
162 /** 158 /**
163 * Do not call this method directly; use {@link InfoBarLayout#addControlLayo ut()}. 159 * Do not call this method directly; use {@link InfoBarLayout#addControlLayo ut()}.
164 */ 160 */
165 public InfoBarControlLayout(Context context) { 161 public InfoBarControlLayout(Context context) {
166 super(context); 162 this(context, null);
163 }
164
165 public InfoBarControlLayout(Context context, AttributeSet attrs) {
166 super(context, attrs);
167 167
168 Resources resources = context.getResources(); 168 Resources resources = context.getResources();
169 mMarginBetweenRows = 169 mMarginBetweenRows =
170 resources.getDimensionPixelSize(R.dimen.infobar_control_margin_b etween_rows); 170 resources.getDimensionPixelSize(R.dimen.infobar_control_margin_b etween_rows);
171 mMarginBetweenColumns = 171 mMarginBetweenColumns =
172 resources.getDimensionPixelSize(R.dimen.infobar_control_margin_b etween_columns); 172 resources.getDimensionPixelSize(R.dimen.infobar_control_margin_b etween_columns);
173 } 173 }
174 174
175 @Override 175 @Override
176 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 176 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 (SwitchCompat) switchLayout.findViewById(R.id.control_toggle_swi tch); 354 (SwitchCompat) switchLayout.findViewById(R.id.control_toggle_swi tch);
355 switchView.setId(toggleId); 355 switchView.setId(toggleId);
356 switchView.setChecked(isChecked); 356 switchView.setChecked(isChecked);
357 357
358 return switchLayout; 358 return switchLayout;
359 } 359 }
360 360
361 /** 361 /**
362 * Creates a set of standard radio buttons and adds it to the layout. 362 * Creates a set of standard radio buttons and adds it to the layout.
363 * 363 *
364 * -------------------------------------------------
365 * | O | MESSAGE #1 |
366 * | O | MESSAGE #N |
367 * -------------------------------------------------
368 *
369 * @param messages Messages to display for the options. 364 * @param messages Messages to display for the options.
370 * @param tags Optional list of tags to attach to the buttons. 365 * @param tags Optional list of tags to attach to the buttons.
371 * @param selectedIndex Which index to mark as being selected.
372 */ 366 */
373 public RadioGroup addRadioButtons( 367 public RadioButtonLayout addRadioButtons(List<CharSequence> messages, @Nulla ble List<?> tags) {
374 List<CharSequence> messages, @Nullable List<?> tags, int selectedInd ex) {
375 if (tags != null) assert tags.size() == messages.size();
376
377 ControlLayoutParams params = new ControlLayoutParams(); 368 ControlLayoutParams params = new ControlLayoutParams();
378 params.mMustBeFullWidth = true; 369 params.mMustBeFullWidth = true;
379 370
380 RadioGroup radioLayout = new RadioGroup(getContext()); 371 RadioButtonLayout radioLayout = new RadioButtonLayout(getContext());
372 radioLayout.addOptions(messages, tags);
373
381 addView(radioLayout, params); 374 addView(radioLayout, params);
382
383 for (int i = 0; i < messages.size(); i++) {
384 RadioButton button =
385 (RadioButton) LayoutInflater.from(getContext())
386 .inflate(R.layout.infobar_control_radio, radioLayout , false);
387 button.setText(messages.get(i));
388 if (tags != null) button.setTag(tags.get(i));
389 button.setChecked(i == selectedIndex);
390 radioLayout.addView(button);
391
392 // Add margins between each of the radio buttons.
393 if (i < messages.size() - 1) {
394 ((MarginLayoutParams) button.getLayoutParams()).bottomMargin = m MarginBetweenRows;
395 }
396 }
397
398 return radioLayout; 375 return radioLayout;
399 } 376 }
400 377
401 /** 378 /**
402 * Creates a standard spinner and adds it to the layout. 379 * Creates a standard spinner and adds it to the layout.
403 */ 380 */
404 public <T> Spinner addSpinner(int spinnerId, ArrayAdapter<T> arrayAdapter) { 381 public <T> Spinner addSpinner(int spinnerId, ArrayAdapter<T> arrayAdapter) {
405 Spinner spinner = (Spinner) LayoutInflater.from(getContext()).inflate( 382 Spinner spinner = (Spinner) LayoutInflater.from(getContext()).inflate(
406 R.layout.infobar_control_spinner, this, false); 383 R.layout.infobar_control_spinner, this, false);
407 spinner.setAdapter(arrayAdapter); 384 spinner.setAdapter(arrayAdapter);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 439
463 /** 440 /**
464 * @return The {@link ControlLayoutParams} for the given child. 441 * @return The {@link ControlLayoutParams} for the given child.
465 */ 442 */
466 @VisibleForTesting 443 @VisibleForTesting
467 static ControlLayoutParams getControlLayoutParams(View child) { 444 static ControlLayoutParams getControlLayoutParams(View child) {
468 return (ControlLayoutParams) child.getLayoutParams(); 445 return (ControlLayoutParams) child.getLayoutParams();
469 } 446 }
470 447
471 } 448 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698