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