1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5package org.chromium.ui;
6
7import android.content.Context;
8import android.graphics.Color;
9import android.graphics.drawable.GradientDrawable;
10import android.graphics.drawable.LayerDrawable;
11import android.text.TextUtils;
12import android.view.View;
13import android.view.ViewGroup;
14import android.widget.AbsListView;
15import android.widget.BaseAdapter;
16import android.widget.LinearLayout;
17
18import org.chromium.base.ApiCompatibilityUtils;
19
20/**
21 * The adapter used to populate ColorPickerSimple.
22 */
23public class ColorSuggestionListAdapter extends BaseAdapter implements View.OnClickListener {
24    private Context mContext;
25    private ColorSuggestion[] mSuggestions;
26    private OnColorSuggestionClickListener mListener;
27
28    /**
29     * The callback used to indicate the user has clicked on a suggestion.
30     */
31    public interface OnColorSuggestionClickListener {
32
33        /**
34         * Called upon a click on a suggestion.
35         *
36         * @param suggestion The suggestion that was clicked.
37         */
38        void onColorSuggestionClick(ColorSuggestion suggestion);
39    }
40
41    private static final int COLORS_PER_ROW = 4;
42
43    ColorSuggestionListAdapter(Context context, ColorSuggestion[] suggestions) {
44        mContext = context;
45        mSuggestions = suggestions;
46    }
47
48    /**
49     * Sets the listener that will be notified upon a click on a suggestion.
50     */
51    public void setOnColorSuggestionClickListener(OnColorSuggestionClickListener listener) {
52        mListener = listener;
53    }
54
55    /**
56     * Sets up the color button to represent a color suggestion.
57     *
58     * @param button The button view to set up.
59     * @param index The index of the suggestion in mSuggestions.
60     */
61    private void setUpColorButton(View button, int index) {
62        if (index >= mSuggestions.length) {
63            button.setTag(null);
64            button.setContentDescription(null);
65            button.setVisibility(View.INVISIBLE);
66            return;
67        }
68        button.setTag(mSuggestions[index]);
69        button.setVisibility(View.VISIBLE);
70        ColorSuggestion suggestion = mSuggestions[index];
71        LayerDrawable layers = (LayerDrawable) button.getBackground();
72        GradientDrawable swatch =
73                (GradientDrawable) layers.findDrawableByLayerId(R.id.color_button_swatch);
74        swatch.setColor(suggestion.mColor);
75        String description = suggestion.mLabel;
76        if (TextUtils.isEmpty(description)) {
77            description = String.format("#%06X", (0xFFFFFF & suggestion.mColor));
78        }
79        button.setContentDescription(description);
80        button.setOnClickListener(this);
81    }
82
83    @Override
84    public void onClick(View v) {
85        if (mListener == null) {
86            return;
87        }
88        ColorSuggestion suggestion = (ColorSuggestion) v.getTag();
89        if (suggestion == null) {
90            return;
91        }
92        mListener.onColorSuggestionClick(suggestion);
93    }
94
95    @Override
96    public View getView(int position, View convertView, ViewGroup parent) {
97        LinearLayout layout;
98        if (convertView != null && convertView instanceof LinearLayout) {
99            layout = (LinearLayout) convertView;
100        } else {
101            layout = new LinearLayout(mContext);
102            layout.setLayoutParams(new AbsListView.LayoutParams(
103                    AbsListView.LayoutParams.MATCH_PARENT,
104                    AbsListView.LayoutParams.WRAP_CONTENT));
105            layout.setOrientation(LinearLayout.HORIZONTAL);
106            layout.setBackgroundColor(Color.WHITE);
107            int buttonHeight =
108                mContext.getResources().getDimensionPixelOffset(R.dimen.color_button_height);
109            for (int i = 0; i < COLORS_PER_ROW; ++i) {
110                View button = new View(mContext);
111                LinearLayout.LayoutParams layoutParams =
112                        new LinearLayout.LayoutParams(0, buttonHeight, 1f);
113                ApiCompatibilityUtils.setMarginStart(layoutParams, -1);
114                if (i == COLORS_PER_ROW - 1) {
115                    ApiCompatibilityUtils.setMarginEnd(layoutParams, -1);
116                }
117                button.setLayoutParams(layoutParams);
118                button.setBackgroundResource(R.drawable.color_button_background);
119                layout.addView(button);
120            }
121        }
122        for (int i = 0; i < COLORS_PER_ROW; ++i) {
123            setUpColorButton(layout.getChildAt(i), position * COLORS_PER_ROW + i);
124        }
125        return layout;
126    }
127
128    @Override
129    public long getItemId(int position) {
130        return position;
131    }
132
133    @Override
134    public Object getItem(int position) {
135        return null;
136    }
137
138    @Override
139    public int getCount() {
140        return (mSuggestions.length + COLORS_PER_ROW - 1) / COLORS_PER_ROW;
141    }
142}
143