17f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung/*
27f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * Copyright (C) 2013 The Android Open Source Project
37f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung *
47f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * Licensed under the Apache License, Version 2.0 (the "License");
57f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * you may not use this file except in compliance with the License.
67f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * You may obtain a copy of the License at
77f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung *
87f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung *      http://www.apache.org/licenses/LICENSE-2.0
97f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung *
107f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * Unless required by applicable law or agreed to in writing, software
117f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * distributed under the License is distributed on an "AS IS" BASIS,
127f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * See the License for the specific language governing permissions and
147f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * limitations under the License.
157f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung */
167f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung
177f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kungpackage com.android.colorpicker;
187f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung
197f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kungimport android.graphics.Color;
207f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kungimport android.graphics.PorterDuff;
217f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kungimport android.graphics.drawable.Drawable;
227f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kungimport android.graphics.drawable.LayerDrawable;
237f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung
247f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung/**
257f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * A drawable which sets its color filter to a color specified by the user, and changes to a
267f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * slightly darker color when pressed or focused.
277f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung */
287f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kungpublic class ColorStateDrawable extends LayerDrawable {
297f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung
307f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung    private static final float PRESSED_STATE_MULTIPLIER = 0.70f;
317f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung
327f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung    private int mColor;
337f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung
347f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung    public ColorStateDrawable(Drawable[] layers, int color) {
357f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        super(layers);
367f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        mColor = color;
377f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung    }
387f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung
397f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung    @Override
407f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung    protected boolean onStateChange(int[] states) {
417f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        boolean pressedOrFocused = false;
427f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        for (int state : states) {
437f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung            if (state == android.R.attr.state_pressed || state == android.R.attr.state_focused) {
447f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung                pressedOrFocused = true;
457f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung                break;
467f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung            }
477f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        }
487f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung
497f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        if (pressedOrFocused) {
507f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung            super.setColorFilter(getPressedColor(mColor), PorterDuff.Mode.SRC_ATOP);
517f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        } else {
527f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung            super.setColorFilter(mColor, PorterDuff.Mode.SRC_ATOP);
537f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        }
547f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung
557f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        return super.onStateChange(states);
567f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung    }
577f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung
587f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung    /**
597f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung     * Given a particular color, adjusts its value by a multiplier.
607f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung     */
6152f6c4fb384a3937b54c72fcddcc0ed77344f90cScott Kennedy    private static int getPressedColor(int color) {
627f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        float[] hsv = new float[3];
637f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        Color.colorToHSV(color, hsv);
647f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        hsv[2] = hsv[2] * PRESSED_STATE_MULTIPLIER;
657f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        return Color.HSVToColor(hsv);
667f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung    }
677f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung
687f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung    @Override
697f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung    public boolean isStateful() {
707f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung        return true;
717f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung    }
727f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung}
73