blob: dca3c3cdcbd805d0ec27c318a2d6ede1c6cde6f1 [file] [log] [blame]
// 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);
}
}