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";
43dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    protected static final String KEY_SELECTED_COLOR = "selected_color";
44dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    protected static final String KEY_COLUMNS = "columns";
45dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    protected static final String KEY_SIZE = "size";
46dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
47dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    protected int mTitleResId = R.string.color_picker_default_title;
48dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    protected int[] mColors = null;
492cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    protected int mSelectedColor;
502cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    protected int mColumns;
512cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    protected int mSize;
52dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
532cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    private ColorPickerPalette mPalette;
542cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    private ProgressBar mProgress;
552cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
562cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    protected OnColorSelectedListener mListener;
572cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
582cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public ColorPickerDialog() {
592cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        // Empty constructor required for dialog fragments.
602cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
612cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
62dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public static ColorPickerDialog newInstance(int titleResId, int[] colors, int selectedColor,
632cfe25aefb32ed215f1c661d9670baf276fb7776James Kung            int columns, int size) {
64dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        ColorPickerDialog ret = new ColorPickerDialog();
65dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        ret.initialize(titleResId, colors, selectedColor, columns, size);
66dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        return ret;
67dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    }
68dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
69dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public void initialize(int titleResId, int[] colors, int selectedColor, int columns, int size) {
70dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        setArguments(titleResId, columns, size);
71dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        setColors(colors, selectedColor);
72dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    }
73dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
74dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public void setArguments(int titleResId, int columns, int size) {
75dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        Bundle bundle = new Bundle();
76dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        bundle.putInt(KEY_TITLE_ID, titleResId);
77dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        bundle.putInt(KEY_COLUMNS, columns);
78dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        bundle.putInt(KEY_SIZE, size);
79dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        setArguments(bundle);
802cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
812cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
822cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public void setOnColorSelectedListener(OnColorSelectedListener listener) {
832cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        mListener = listener;
842cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
852cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
862cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    @Override
872cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public void onCreate(Bundle savedInstanceState) {
882cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        super.onCreate(savedInstanceState);
89dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
90dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (getArguments() != null) {
91dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mTitleResId = getArguments().getInt(KEY_TITLE_ID);
92dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mColumns = getArguments().getInt(KEY_COLUMNS);
93dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mSize = getArguments().getInt(KEY_SIZE);
94dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        }
95dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
96dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (savedInstanceState != null) {
97dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mColors = savedInstanceState.getIntArray(KEY_COLORS);
98dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mSelectedColor = (Integer) savedInstanceState.getSerializable(KEY_SELECTED_COLOR);
99dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        }
1002cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1012cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1022cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    @Override
1032cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public Dialog onCreateDialog(Bundle savedInstanceState) {
1042cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        final Activity activity = getActivity();
1052cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1062cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        View view = LayoutInflater.from(getActivity()).inflate(R.layout.color_picker_dialog, null);
1072cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        mProgress = (ProgressBar) view.findViewById(android.R.id.progress);
1082cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        mPalette = (ColorPickerPalette) view.findViewById(R.id.color_picker);
1092cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        mPalette.init(mSize, mColumns, this);
1102cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1112cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        if (mColors != null) {
112dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            showPaletteView();
1132cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        }
1142cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1152cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        mAlertDialog = new AlertDialog.Builder(activity)
116dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            .setTitle(mTitleResId)
1172cfe25aefb32ed215f1c661d9670baf276fb7776James Kung            .setView(view)
1182cfe25aefb32ed215f1c661d9670baf276fb7776James Kung            .create();
1192cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1202cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        return mAlertDialog;
1212cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1222cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1232cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    @Override
1242cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public void onColorSelected(int color) {
1252cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        if (mListener != null) {
1262cfe25aefb32ed215f1c661d9670baf276fb7776James Kung            mListener.onColorSelected(color);
1272cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        }
1282cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1292cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        if (getTargetFragment() instanceof OnColorSelectedListener) {
1302cfe25aefb32ed215f1c661d9670baf276fb7776James Kung            final OnColorSelectedListener listener =
1312cfe25aefb32ed215f1c661d9670baf276fb7776James Kung                    (OnColorSelectedListener) getTargetFragment();
1322cfe25aefb32ed215f1c661d9670baf276fb7776James Kung            listener.onColorSelected(color);
1332cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        }
1342cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1357f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        if (color != mSelectedColor) {
1367f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung            mSelectedColor = color;
1377f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung            // Redraw palette to show checkmark on newly selected color before dismissing.
1387f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung            mPalette.drawPalette(mColors, mSelectedColor);
1397f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        }
1407f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung
1412cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        dismiss();
1422cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1432cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
144dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public void showPaletteView() {
145dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (mProgress != null && mPalette != null) {
146dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mProgress.setVisibility(View.GONE);
147dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            refreshPalette();
148dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mPalette.setVisibility(View.VISIBLE);
149dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        }
1502cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1512cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
152dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public void showProgressBarView() {
153dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (mProgress != null && mPalette != null) {
154dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mProgress.setVisibility(View.VISIBLE);
155dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mPalette.setVisibility(View.GONE);
156dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        }
1572cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1582cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
159dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public void setColors(int[] colors, int selectedColor) {
160dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (mColors != colors || mSelectedColor != selectedColor) {
161dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mColors = colors;
162dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mSelectedColor = selectedColor;
163dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            refreshPalette();
1642cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        }
1652cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1662cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
167dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    public void setColors(int[] colors) {
168dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (mColors != colors) {
169dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mColors = colors;
170dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            refreshPalette();
171dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        }
1722cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1732cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1742cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public void setSelectedColor(int color) {
1752cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        if (mSelectedColor != color) {
176dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mSelectedColor = color;
177dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            refreshPalette();
178dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        }
179dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    }
180dddee2781386a459c0cb8579ef66866e1792e06cJames Kung
181dddee2781386a459c0cb8579ef66866e1792e06cJames Kung    private void refreshPalette() {
182dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        if (mPalette != null && mColors != null) {
183dddee2781386a459c0cb8579ef66866e1792e06cJames Kung            mPalette.drawPalette(mColors, mSelectedColor);
1842cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        }
1852cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1862cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1872cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public int[] getColors() {
1882cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        return mColors;
1892cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1902cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1912cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public int getSelectedColor() {
1922cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        return mSelectedColor;
1932cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
1942cfe25aefb32ed215f1c661d9670baf276fb7776James Kung
1952cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    @Override
1962cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    public void onSaveInstanceState(Bundle outState) {
1972cfe25aefb32ed215f1c661d9670baf276fb7776James Kung        super.onSaveInstanceState(outState);
198dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        outState.putIntArray(KEY_COLORS, mColors);
199dddee2781386a459c0cb8579ef66866e1792e06cJames Kung        outState.putSerializable(KEY_SELECTED_COLOR, mSelectedColor);
2002cfe25aefb32ed215f1c661d9670baf276fb7776James Kung    }
2012cfe25aefb32ed215f1c661d9670baf276fb7776James Kung}
202