| // Copyright 2012 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.components.embedder_support.delegate; |
| |
| import android.app.AlertDialog; |
| import android.app.Dialog; |
| import android.content.Context; |
| import android.content.DialogInterface; |
| import android.view.LayoutInflater; |
| import android.view.View; |
| import android.widget.Button; |
| import android.widget.TextView; |
| |
| /** |
| * UI for the color chooser that shows on the Android platform as a result of |
| * <input type=color > form element. |
| */ |
| public class ColorPickerDialog extends AlertDialog implements OnColorChangedListener { |
| private final ColorPickerAdvanced mAdvancedColorPicker; |
| |
| private final ColorPickerSimple mSimpleColorPicker; |
| |
| private final Button mMoreButton; |
| |
| // The view up in the corner that shows the user the color they've currently selected. |
| private final View mCurrentColorView; |
| |
| private final OnColorChangedListener mListener; |
| |
| private final int mInitialColor; |
| |
| private int mCurrentColor; |
| |
| /** |
| * @param context The context the dialog is to run in. |
| * @param listener The object to notify when the color is set. |
| * @param color The initial color to set. |
| * @param suggestions The list of suggestions. |
| */ |
| public ColorPickerDialog(Context context, OnColorChangedListener listener, int color, |
| ColorSuggestion[] suggestions) { |
| super(context, 0); |
| |
| mListener = listener; |
| mInitialColor = color; |
| mCurrentColor = mInitialColor; |
| |
| // Initialize title |
| LayoutInflater inflater = |
| (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); |
| View title = inflater.inflate(R.layout.color_picker_dialog_title, null); |
| setCustomTitle(title); |
| |
| mCurrentColorView = title.findViewById(R.id.selected_color_view); |
| |
| TextView titleText = (TextView) title.findViewById(R.id.title); |
| titleText.setText(R.string.color_picker_dialog_title); |
| |
| // Initialize Set/Cancel buttons |
| String positiveButtonText = context.getString(R.string.color_picker_button_set); |
| setButton(BUTTON_POSITIVE, positiveButtonText, new Dialog.OnClickListener() { |
| @Override |
| public void onClick(DialogInterface dialogInterface, int i) { |
| tryNotifyColorSet(mCurrentColor); |
| } |
| }); |
| |
| // Note that with the color picker there's not really any such thing as |
| // "cancelled". |
| // The color picker flow only finishes when we return a color, so we |
| // have to always |
| // return something. The concept of "cancelled" in this case just means |
| // returning |
| // the color that we were initialized with. |
| String negativeButtonText = context.getString(R.string.color_picker_button_cancel); |
| setButton(BUTTON_NEGATIVE, negativeButtonText, new Dialog.OnClickListener() { |
| @Override |
| public void onClick(DialogInterface dialogInterface, int i) { |
| tryNotifyColorSet(mInitialColor); |
| } |
| }); |
| |
| setOnCancelListener(new DialogInterface.OnCancelListener() { |
| @Override |
| public void onCancel(DialogInterface arg0) { |
| tryNotifyColorSet(mInitialColor); |
| } |
| }); |
| |
| // Initialize main content view |
| View content = inflater.inflate(R.layout.color_picker_dialog_content, null); |
| setView(content); |
| |
| // Initialize More button. |
| mMoreButton = (Button) content.findViewById(R.id.more_colors_button); |
| mMoreButton.setOnClickListener(new Button.OnClickListener() { |
| @Override |
| public void onClick(View v) { |
| showAdvancedView(); |
| } |
| }); |
| |
| // Initialize advanced color view (hidden initially). |
| mAdvancedColorPicker = |
| (ColorPickerAdvanced) content.findViewById(R.id.color_picker_advanced); |
| mAdvancedColorPicker.setVisibility(View.GONE); |
| |
| // Initialize simple color view (default view). |
| mSimpleColorPicker = (ColorPickerSimple) content.findViewById(R.id.color_picker_simple); |
| mSimpleColorPicker.init(suggestions, this); |
| |
| updateCurrentColor(mInitialColor); |
| } |
| |
| /** |
| * Listens to the ColorPicker for when the user has changed the selected color, and |
| * updates the current color (the color shown in the title) accordingly. |
| * |
| * @param color The new color chosen by the user. |
| */ |
| @Override |
| public void onColorChanged(int color) { |
| updateCurrentColor(color); |
| } |
| |
| /** |
| * Hides the simple view (the default) and shows the advanced one instead, hiding the |
| * "More" button at the same time. |
| */ |
| private void showAdvancedView() { |
| // Only need to hide the borders, not the Views themselves, since the Views are |
| // contained within the borders. |
| View buttonBorder = findViewById(R.id.more_colors_button_border); |
| buttonBorder.setVisibility(View.GONE); |
| |
| View simpleView = findViewById(R.id.color_picker_simple); |
| simpleView.setVisibility(View.GONE); |
| |
| mAdvancedColorPicker.setVisibility(View.VISIBLE); |
| mAdvancedColorPicker.setListener(this); |
| mAdvancedColorPicker.setColor(mCurrentColor); |
| } |
| |
| /** |
| * Tries to notify any listeners that the color has been set. |
| */ |
| private void tryNotifyColorSet(int color) { |
| if (mListener != null) mListener.onColorChanged(color); |
| } |
| |
| /** |
| * Updates the internal cache of the currently selected color, updating the colorful little |
| * box in the title at the same time. |
| */ |
| private void updateCurrentColor(int color) { |
| mCurrentColor = color; |
| if (mCurrentColorView != null) mCurrentColorView.setBackgroundColor(color); |
| } |
| } |