// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.ui; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.LayerDrawable; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.LinearLayout; import org.chromium.base.ApiCompatibilityUtils; /** * The adapter used to populate ColorPickerSimple. */ public class ColorSuggestionListAdapter extends BaseAdapter implements View.OnClickListener { private Context mContext; private ColorSuggestion[] mSuggestions; private OnColorSuggestionClickListener mListener; /** * The callback used to indicate the user has clicked on a suggestion. */ public interface OnColorSuggestionClickListener { /** * Called upon a click on a suggestion. * * @param suggestion The suggestion that was clicked. */ void onColorSuggestionClick(ColorSuggestion suggestion); } private static final int COLORS_PER_ROW = 4; ColorSuggestionListAdapter(Context context, ColorSuggestion[] suggestions) { mContext = context; mSuggestions = suggestions; } /** * Sets the listener that will be notified upon a click on a suggestion. */ public void setOnColorSuggestionClickListener(OnColorSuggestionClickListener listener) { mListener = listener; } /** * Sets up the color button to represent a color suggestion. * * @param button The button view to set up. * @param index The index of the suggestion in mSuggestions. */ private void setUpColorButton(View button, int index) { if (index >= mSuggestions.length) { button.setTag(null); button.setContentDescription(null); button.setVisibility(View.INVISIBLE); return; } button.setTag(mSuggestions[index]); button.setVisibility(View.VISIBLE); ColorSuggestion suggestion = mSuggestions[index]; LayerDrawable layers = (LayerDrawable) button.getBackground(); GradientDrawable swatch = (GradientDrawable) layers.findDrawableByLayerId(R.id.color_button_swatch); swatch.setColor(suggestion.mColor); String description = suggestion.mLabel; if (TextUtils.isEmpty(description)) { description = String.format("#%06X", (0xFFFFFF & suggestion.mColor)); } button.setContentDescription(description); button.setOnClickListener(this); } @Override public void onClick(View v) { if (mListener == null) { return; } ColorSuggestion suggestion = (ColorSuggestion) v.getTag(); if (suggestion == null) { return; } mListener.onColorSuggestionClick(suggestion); } @Override public View getView(int position, View convertView, ViewGroup parent) { LinearLayout layout; if (convertView != null && convertView instanceof LinearLayout) { layout = (LinearLayout) convertView; } else { layout = new LinearLayout(mContext); layout.setLayoutParams(new AbsListView.LayoutParams( AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT)); layout.setOrientation(LinearLayout.HORIZONTAL); layout.setBackgroundColor(Color.WHITE); int buttonHeight = mContext.getResources().getDimensionPixelOffset(R.dimen.color_button_height); for (int i = 0; i < COLORS_PER_ROW; ++i) { View button = new View(mContext); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, buttonHeight, 1f); ApiCompatibilityUtils.setMarginStart(layoutParams, -1); if (i == COLORS_PER_ROW - 1) { ApiCompatibilityUtils.setMarginEnd(layoutParams, -1); } button.setLayoutParams(layoutParams); button.setBackgroundResource(R.drawable.color_button_background); layout.addView(button); } } for (int i = 0; i < COLORS_PER_ROW; ++i) { setUpColorButton(layout.getChildAt(i), position * COLORS_PER_ROW + i); } return layout; } @Override public long getItemId(int position) { return position; } @Override public Object getItem(int position) { return null; } @Override public int getCount() { return (mSuggestions.length + COLORS_PER_ROW - 1) / COLORS_PER_ROW; } }