mirror of https://github.com/M66B/FairEmail.git
296 lines
10 KiB
Java
296 lines
10 KiB
Java
package com.flask.colorpicker.builder;
|
|
|
|
import androidx.appcompat.app.AlertDialog;
|
|
import android.content.Context;
|
|
import android.content.DialogInterface;
|
|
import android.graphics.Color;
|
|
import android.graphics.drawable.ColorDrawable;
|
|
import android.text.InputFilter;
|
|
import android.view.Gravity;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.EditText;
|
|
import android.widget.ImageView;
|
|
import android.widget.LinearLayout;
|
|
|
|
import com.flask.colorpicker.ColorPickerView;
|
|
import com.flask.colorpicker.OnColorChangedListener;
|
|
import com.flask.colorpicker.OnColorSelectedListener;
|
|
import com.flask.colorpicker.R;
|
|
import com.flask.colorpicker.Utils;
|
|
import com.flask.colorpicker.renderer.ColorWheelRenderer;
|
|
import com.flask.colorpicker.slider.AlphaSlider;
|
|
import com.flask.colorpicker.slider.LightnessSlider;
|
|
|
|
public class ColorPickerDialogBuilder {
|
|
private AlertDialog.Builder builder;
|
|
private LinearLayout pickerContainer;
|
|
private ColorPickerView colorPickerView;
|
|
private LightnessSlider lightnessSlider;
|
|
private AlphaSlider alphaSlider;
|
|
private EditText colorEdit;
|
|
private LinearLayout colorPreview;
|
|
|
|
private boolean isLightnessSliderEnabled = true;
|
|
private boolean isAlphaSliderEnabled = true;
|
|
private boolean isBorderEnabled = true;
|
|
private boolean isColorEditEnabled = false;
|
|
private boolean isPreviewEnabled = false;
|
|
private int pickerCount = 1;
|
|
private int defaultMargin = 0;
|
|
private int defaultMarginTop = 0;
|
|
private Integer[] initialColor = new Integer[]{null, null, null, null, null};
|
|
|
|
private ColorPickerDialogBuilder(Context context) {
|
|
this(context, 0);
|
|
}
|
|
|
|
private ColorPickerDialogBuilder(Context context, int theme) {
|
|
defaultMargin = getDimensionAsPx(context, R.dimen.default_slider_margin);
|
|
defaultMarginTop = getDimensionAsPx(context, R.dimen.default_margin_top);
|
|
|
|
builder = new AlertDialog.Builder(context, theme);
|
|
pickerContainer = new LinearLayout(context);
|
|
pickerContainer.setOrientation(LinearLayout.VERTICAL);
|
|
pickerContainer.setGravity(Gravity.CENTER_HORIZONTAL);
|
|
pickerContainer.setPadding(defaultMargin, defaultMarginTop, defaultMargin, 0);
|
|
|
|
LinearLayout.LayoutParams layoutParamsForColorPickerView = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 0);
|
|
layoutParamsForColorPickerView.weight = 1;
|
|
colorPickerView = new ColorPickerView(context);
|
|
|
|
pickerContainer.addView(colorPickerView, layoutParamsForColorPickerView);
|
|
|
|
builder.setView(pickerContainer);
|
|
}
|
|
|
|
public static ColorPickerDialogBuilder with(Context context) {
|
|
return new ColorPickerDialogBuilder(context);
|
|
}
|
|
|
|
public static ColorPickerDialogBuilder with(Context context, int theme) {
|
|
return new ColorPickerDialogBuilder(context, theme);
|
|
}
|
|
|
|
public ColorPickerDialogBuilder setTitle(String title) {
|
|
builder.setTitle(title);
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder setTitle(int titleId) {
|
|
builder.setTitle(titleId);
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder initialColor(int initialColor) {
|
|
this.initialColor[0] = initialColor;
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder initialColors(int[] initialColor) {
|
|
for (int i = 0; i < initialColor.length && i < this.initialColor.length; i++) {
|
|
this.initialColor[i] = initialColor[i];
|
|
}
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder wheelType(ColorPickerView.WHEEL_TYPE wheelType) {
|
|
ColorWheelRenderer renderer = ColorWheelRendererBuilder.getRenderer(wheelType);
|
|
colorPickerView.setRenderer(renderer);
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder density(int density) {
|
|
colorPickerView.setDensity(density);
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder setOnColorChangedListener(OnColorChangedListener onColorChangedListener) {
|
|
colorPickerView.addOnColorChangedListener(onColorChangedListener);
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder setOnColorSelectedListener(OnColorSelectedListener onColorSelectedListener) {
|
|
colorPickerView.addOnColorSelectedListener(onColorSelectedListener);
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder setPositiveButton(CharSequence text, final ColorPickerClickListener onClickListener) {
|
|
builder.setPositiveButton(text, new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
positiveButtonOnClick(dialog, onClickListener);
|
|
}
|
|
});
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder setPositiveButton(int textId, final ColorPickerClickListener onClickListener) {
|
|
builder.setPositiveButton(textId, new DialogInterface.OnClickListener() {
|
|
@Override
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
positiveButtonOnClick(dialog, onClickListener);
|
|
}
|
|
});
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder setNegativeButton(CharSequence text, DialogInterface.OnClickListener onClickListener) {
|
|
builder.setNegativeButton(text, onClickListener);
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder setNegativeButton(int textId, DialogInterface.OnClickListener onClickListener) {
|
|
builder.setNegativeButton(textId, onClickListener);
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder noSliders() {
|
|
isLightnessSliderEnabled = false;
|
|
isAlphaSliderEnabled = false;
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder alphaSliderOnly() {
|
|
isLightnessSliderEnabled = false;
|
|
isAlphaSliderEnabled = true;
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder lightnessSliderOnly() {
|
|
isLightnessSliderEnabled = true;
|
|
isAlphaSliderEnabled = false;
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder showAlphaSlider(boolean showAlpha) {
|
|
isAlphaSliderEnabled = showAlpha;
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder showLightnessSlider(boolean showLightness) {
|
|
isLightnessSliderEnabled = showLightness;
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder showBorder(boolean showBorder) {
|
|
isBorderEnabled = showBorder;
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder showColorEdit(boolean showEdit) {
|
|
isColorEditEnabled = showEdit;
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder setColorEditTextColor(int argb) {
|
|
colorPickerView.setColorEditTextColor(argb);
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder showColorPreview(boolean showPreview) {
|
|
isPreviewEnabled = showPreview;
|
|
if (!showPreview)
|
|
pickerCount = 1;
|
|
return this;
|
|
}
|
|
|
|
public ColorPickerDialogBuilder setPickerCount(int pickerCount) throws IndexOutOfBoundsException {
|
|
if (pickerCount < 1 || pickerCount > 5)
|
|
throw new IndexOutOfBoundsException("Picker Can Only Support 1-5 Colors");
|
|
this.pickerCount = pickerCount;
|
|
if (this.pickerCount > 1)
|
|
this.isPreviewEnabled = true;
|
|
return this;
|
|
}
|
|
|
|
public AlertDialog build() {
|
|
Context context = builder.getContext();
|
|
colorPickerView.setInitialColors(initialColor, getStartOffset(initialColor));
|
|
colorPickerView.setShowBorder(isBorderEnabled);
|
|
|
|
if (isLightnessSliderEnabled) {
|
|
LinearLayout.LayoutParams layoutParamsForLightnessBar = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getDimensionAsPx(context, R.dimen.default_slider_height));
|
|
lightnessSlider = new LightnessSlider(context);
|
|
lightnessSlider.setLayoutParams(layoutParamsForLightnessBar);
|
|
pickerContainer.addView(lightnessSlider);
|
|
colorPickerView.setLightnessSlider(lightnessSlider);
|
|
lightnessSlider.setColor(getStartColor(initialColor));
|
|
lightnessSlider.setShowBorder(isBorderEnabled);
|
|
}
|
|
if (isAlphaSliderEnabled) {
|
|
LinearLayout.LayoutParams layoutParamsForAlphaBar = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getDimensionAsPx(context, R.dimen.default_slider_height));
|
|
alphaSlider = new AlphaSlider(context);
|
|
alphaSlider.setLayoutParams(layoutParamsForAlphaBar);
|
|
pickerContainer.addView(alphaSlider);
|
|
colorPickerView.setAlphaSlider(alphaSlider);
|
|
alphaSlider.setColor(getStartColor(initialColor));
|
|
alphaSlider.setShowBorder(isBorderEnabled);
|
|
}
|
|
if (isColorEditEnabled) {
|
|
LinearLayout.LayoutParams layoutParamsForColorEdit = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
|
colorEdit = (EditText) View.inflate(context, R.layout.color_edit, null);
|
|
colorEdit.setFilters(new InputFilter[]{new InputFilter.AllCaps()});
|
|
colorEdit.setSingleLine();
|
|
colorEdit.setVisibility(View.GONE);
|
|
|
|
// limit number of characters to hexColors
|
|
int maxLength = isAlphaSliderEnabled ? 9 : 7;
|
|
colorEdit.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxLength)});
|
|
|
|
pickerContainer.addView(colorEdit, layoutParamsForColorEdit);
|
|
|
|
colorEdit.setText(Utils.getHexString(getStartColor(initialColor), isAlphaSliderEnabled));
|
|
colorPickerView.setColorEdit(colorEdit);
|
|
}
|
|
if (isPreviewEnabled) {
|
|
colorPreview = (LinearLayout) View.inflate(context, R.layout.color_preview, null);
|
|
colorPreview.setVisibility(View.GONE);
|
|
pickerContainer.addView(colorPreview);
|
|
|
|
if (initialColor.length == 0) {
|
|
ImageView colorImage = (ImageView) View.inflate(context, R.layout.color_selector, null);
|
|
colorImage.setImageDrawable(new ColorDrawable(Color.WHITE));
|
|
} else {
|
|
for (int i = 0; i < initialColor.length && i < this.pickerCount; i++) {
|
|
if (initialColor[i] == null)
|
|
break;
|
|
LinearLayout colorLayout = (LinearLayout) View.inflate(context, R.layout.color_selector, null);
|
|
ImageView colorImage = (ImageView) colorLayout.findViewById(R.id.image_preview);
|
|
colorImage.setImageDrawable(new ColorDrawable(initialColor[i]));
|
|
colorPreview.addView(colorLayout);
|
|
}
|
|
}
|
|
colorPreview.setVisibility(View.VISIBLE);
|
|
colorPickerView.setColorPreview(colorPreview, getStartOffset(initialColor));
|
|
}
|
|
|
|
return builder.create();
|
|
}
|
|
|
|
private Integer getStartOffset(Integer[] colors) {
|
|
Integer start = 0;
|
|
for (int i = 0; i < colors.length; i++) {
|
|
if (colors[i] == null) {
|
|
return start;
|
|
}
|
|
start = (i + 1) / 2;
|
|
}
|
|
return start;
|
|
}
|
|
|
|
private int getStartColor(Integer[] colors) {
|
|
Integer startColor = getStartOffset(colors);
|
|
return startColor == null ? Color.WHITE : colors[startColor];
|
|
}
|
|
|
|
private static int getDimensionAsPx(Context context, int rid) {
|
|
return (int) (context.getResources().getDimension(rid) + .5f);
|
|
}
|
|
|
|
private void positiveButtonOnClick(DialogInterface dialog, ColorPickerClickListener onClickListener) {
|
|
int selectedColor = colorPickerView.getEnteredColor();
|
|
Integer[] allColors = colorPickerView.getAllColors();
|
|
onClickListener.onClick(dialog, selectedColor, allColors);
|
|
}
|
|
} |