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