12cfe25aefb32ed215f1c661d9670baf276fb7776James Kung/*
22cfe25aefb32ed215f1c661d9670baf276fb7776James Kung * Copyright (C) 2013 The Android Open Source Project
32cfe25aefb32ed215f1c661d9670baf276fb7776James Kung *
42cfe25aefb32ed215f1c661d9670baf276fb7776James Kung * Licensed under the Apache License, Version 2.0 (the "License");
52cfe25aefb32ed215f1c661d9670baf276fb7776James Kung * you may not use this file except in compliance with the License.
62cfe25aefb32ed215f1c661d9670baf276fb7776James Kung * You may obtain a copy of the License at
72cfe25aefb32ed215f1c661d9670baf276fb7776James Kung *
82cfe25aefb32ed215f1c661d9670baf276fb7776James Kung *      http://www.apache.org/licenses/LICENSE-2.0
92cfe25aefb32ed215f1c661d9670baf276fb7776James Kung *
102cfe25aefb32ed215f1c661d9670baf276fb7776James Kung * Unless required by applicable law or agreed to in writing, software
112cfe25aefb32ed215f1c661d9670baf276fb7776James Kung * distributed under the License is distributed on an "AS IS" BASIS,
122cfe25aefb32ed215f1c661d9670baf276fb7776James Kung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132cfe25aefb32ed215f1c661d9670baf276fb7776James Kung * See the License for the specific language governing permissions and
142cfe25aefb32ed215f1c661d9670baf276fb7776James Kung * limitations under the License.
152cfe25aefb32ed215f1c661d9670baf276fb7776James Kung */
162cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
172cfe25aefb32ed215f1c661d9670baf276fb7776James Kungpackage com.android.colorpicker;
182cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
192cfe25aefb32ed215f1c661d9670baf276fb7776James Kungimport android.app.Activity;
202cfe25aefb32ed215f1c661d9670baf276fb7776James Kungimport android.app.AlertDialog;
212cfe25aefb32ed215f1c661d9670baf276fb7776James Kungimport android.app.Dialog;
222cfe25aefb32ed215f1c661d9670baf276fb7776James Kungimport android.app.DialogFragment;
232cfe25aefb32ed215f1c661d9670baf276fb7776James Kungimport android.os.Bundle;
242cfe25aefb32ed215f1c661d9670baf276fb7776James Kungimport android.view.LayoutInflater;
252cfe25aefb32ed215f1c661d9670baf276fb7776James Kungimport android.view.View;
262cfe25aefb32ed215f1c661d9670baf276fb7776James Kungimport android.widget.ProgressBar;
272cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
282cfe25aefb32ed215f1c661d9670baf276fb7776James Kungimport com.android.colorpicker.ColorPickerSwatch.OnColorSelectedListener;
292cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
302cfe25aefb32ed215f1c661d9670baf276fb7776James Kung/**
312cfe25aefb32ed215f1c661d9670baf276fb7776James Kung * A dialog which takes in as input an array of colors and creates a palette allowing the user to
322cfe25aefb32ed215f1c661d9670baf276fb7776James Kung * select a specific color swatch, which invokes a listener.
332cfe25aefb32ed215f1c661d9670baf276fb7776James Kung */
342cfe25aefb32ed215f1c661d9670baf276fb7776James Kungpublic class ColorPickerDialog extends DialogFragment implements OnColorSelectedListener {
352cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
362cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public static final int SIZE_LARGE = 1;
372cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public static final int SIZE_SMALL = 2;
382cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
392cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    protected AlertDialog mAlertDialog;
402cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
41dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    protected static final String KEY_TITLE_ID = "title_id";
42dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    protected static final String KEY_COLORS = "colors";
431f20a74925ab5ca73b451a437a718eb72f9a22b3Kaikai Wang    protected static final String KEY_COLOR_CONTENT_DESCRIPTIONS = "color_content_descriptions";
44dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    protected static final String KEY_SELECTED_COLOR = "selected_color";
45dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    protected static final String KEY_COLUMNS = "columns";
46dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    protected static final String KEY_SIZE = "size";
47dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
48dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    protected int mTitleResId = R.string.color_picker_default_title;
49dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    protected int[] mColors = null;
501f20a74925ab5ca73b451a437a718eb72f9a22b3Kaikai Wang    protected String[] mColorContentDescriptions = null;
512cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    protected int mSelectedColor;
522cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    protected int mColumns;
532cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    protected int mSize;
54dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
552cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    private ColorPickerPalette mPalette;
562cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    private ProgressBar mProgress;
572cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
582cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    protected OnColorSelectedListener mListener;
592cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
602cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public ColorPickerDialog() {
612cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        // Empty constructor required for dialog fragments.
622cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
632cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
64dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public static ColorPickerDialog newInstance(int titleResId, int[] colors, int selectedColor,
652cfe25aefb32ed215f1c661d9670baf276fb7776James Kung            int columns, int size) {
66dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        ColorPickerDialog ret = new ColorPickerDialog();
67dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        ret.initialize(titleResId, colors, selectedColor, columns, size);
68dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        return ret;
69dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    }
70dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
71dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public void initialize(int titleResId, int[] colors, int selectedColor, int columns, int size) {
72dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        setArguments(titleResId, columns, size);
73dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        setColors(colors, selectedColor);
74dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    }
75dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
76dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public void setArguments(int titleResId, int columns, int size) {
77dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        Bundle bundle = new Bundle();
78dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        bundle.putInt(KEY_TITLE_ID, titleResId);
79dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        bundle.putInt(KEY_COLUMNS, columns);
80dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        bundle.putInt(KEY_SIZE, size);
81dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        setArguments(bundle);
822cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
832cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
842cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public void setOnColorSelectedListener(OnColorSelectedListener listener) {
852cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        mListener = listener;
862cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
872cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
882cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    @Override
892cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public void onCreate(Bundle savedInstanceState) {
902cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        super.onCreate(savedInstanceState);
91dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
92dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (getArguments() != null) {
93dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mTitleResId = getArguments().getInt(KEY_TITLE_ID);
94dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mColumns = getArguments().getInt(KEY_COLUMNS);
95dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mSize = getArguments().getInt(KEY_SIZE);
96dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        }
97dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
98dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (savedInstanceState != null) {
99dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mColors = savedInstanceState.getIntArray(KEY_COLORS);
100dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mSelectedColor = (Integer) savedInstanceState.getSerializable(KEY_SELECTED_COLOR);
1011f20a74925ab5ca73b451a437a718eb72f9a22b3Kaikai Wang            mColorContentDescriptions = savedInstanceState.getStringArray(
1021f20a74925ab5ca73b451a437a718eb72f9a22b3Kaikai Wang                    KEY_COLOR_CONTENT_DESCRIPTIONS);
103dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        }
1042cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1052cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1062cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    @Override
1072cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public Dialog onCreateDialog(Bundle savedInstanceState) {
1082cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        final Activity activity = getActivity();
1092cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1102cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        View view = LayoutInflater.from(getActivity()).inflate(R.layout.color_picker_dialog, null);
1112cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        mProgress = (ProgressBar) view.findViewById(android.R.id.progress);
1122cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        mPalette = (ColorPickerPalette) view.findViewById(R.id.color_picker);
1132cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        mPalette.init(mSize, mColumns, this);
1142cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1152cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        if (mColors != null) {
116dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            showPaletteView();
1172cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        }
1182cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1192cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        mAlertDialog = new AlertDialog.Builder(activity)
120dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            .setTitle(mTitleResId)
1212cfe25aefb32ed215f1c661d9670baf276fb7776James Kung            .setView(view)
1222cfe25aefb32ed215f1c661d9670baf276fb7776James Kung            .create();
1232cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1242cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        return mAlertDialog;
1252cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1262cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1272cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    @Override
1282cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public void onColorSelected(int color) {
1292cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        if (mListener != null) {
1302cfe25aefb32ed215f1c661d9670baf276fb7776James Kung            mListener.onColorSelected(color);
1312cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        }
1322cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1332cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        if (getTargetFragment() instanceof OnColorSelectedListener) {
1342cfe25aefb32ed215f1c661d9670baf276fb7776James Kung            final OnColorSelectedListener listener =
1352cfe25aefb32ed215f1c661d9670baf276fb7776James Kung                    (OnColorSelectedListener) getTargetFragment();
1362cfe25aefb32ed215f1c661d9670baf276fb7776James Kung            listener.onColorSelected(color);
1372cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        }
1382cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1397f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        if (color != mSelectedColor) {
1407f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung            mSelectedColor = color;
1417f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung            // Redraw palette to show checkmark on newly selected color before dismissing.
1427f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung            mPalette.drawPalette(mColors, mSelectedColor);
1437f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        }
1447f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung
1452cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        dismiss();
1462cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1472cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
148dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public void showPaletteView() {
149dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (mProgress != null && mPalette != null) {
150dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mProgress.setVisibility(View.GONE);
151dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            refreshPalette();
152dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mPalette.setVisibility(View.VISIBLE);
153dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        }
1542cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1552cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
156dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public void showProgressBarView() {
157dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (mProgress != null && mPalette != null) {
158dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mProgress.setVisibility(View.VISIBLE);
159dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mPalette.setVisibility(View.GONE);
160dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        }
1612cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1622cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
163dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public void setColors(int[] colors, int selectedColor) {
164dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (mColors != colors || mSelectedColor != selectedColor) {
165dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mColors = colors;
166dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mSelectedColor = selectedColor;
167dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            refreshPalette();
1682cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        }
1692cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1702cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
171dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public void setColors(int[] colors) {
172dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (mColors != colors) {
173dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mColors = colors;
174dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            refreshPalette();
175dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        }
1762cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1772cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1782cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public void setSelectedColor(int color) {
1792cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        if (mSelectedColor != color) {
180dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mSelectedColor = color;
181dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            refreshPalette();
182dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        }
183dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    }
184dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
1851f20a74925ab5ca73b451a437a718eb72f9a22b3Kaikai Wang    public void setColorContentDescriptions(String[] colorContentDescriptions) {
1861f20a74925ab5ca73b451a437a718eb72f9a22b3Kaikai Wang        if (mColorContentDescriptions != colorContentDescriptions) {
1871f20a74925ab5ca73b451a437a718eb72f9a22b3Kaikai Wang            mColorContentDescriptions = colorContentDescriptions;
1881f20a74925ab5ca73b451a437a718eb72f9a22b3Kaikai Wang            refreshPalette();
1891f20a74925ab5ca73b451a437a718eb72f9a22b3Kaikai Wang        }
1901f20a74925ab5ca73b451a437a718eb72f9a22b3Kaikai Wang    }
1911f20a74925ab5ca73b451a437a718eb72f9a22b3Kaikai Wang
192dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    private void refreshPalette() {
193dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (mPalette != null && mColors != null) {
1941f20a74925ab5ca73b451a437a718eb72f9a22b3Kaikai Wang            mPalette.drawPalette(mColors, mSelectedColor, mColorContentDescriptions);
1952cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        }
1962cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1972cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1982cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public int[] getColors() {
1992cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        return mColors;
2002cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
2012cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
2022cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public int getSelectedColor() {
2032cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        return mSelectedColor;
2042cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
2052cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
2062cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    @Override
2072cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public void onSaveInstanceState(Bundle outState) {
2082cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        super.onSaveInstanceState(outState);
209dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        outState.putIntArray(KEY_COLORS, mColors);
210dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        outState.putSerializable(KEY_SELECTED_COLOR, mSelectedColor);
2111f20a74925ab5ca73b451a437a718eb72f9a22b3Kaikai Wang        outState.putStringArray(KEY_COLOR_CONTENT_DESCRIPTIONS, mColorContentDescriptions);
2122cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
2132cfe25aefb32ed215f1c661d9670baf276fb7776James Kung}
214