1c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes/*
2c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Copyright 2015 The Android Open Source Project
3c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes *
4c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Licensed under the Apache License, Version 2.0 (the "License");
5c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * you may not use this file except in compliance with the License.
6c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * You may obtain a copy of the License at
7c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes *
8c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes *       http://www.apache.org/licenses/LICENSE-2.0
9c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes *
10c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Unless required by applicable law or agreed to in writing, software
11c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * distributed under the License is distributed on an "AS IS" BASIS,
12c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * See the License for the specific language governing permissions and
14c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * limitations under the License.
15c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */
16c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
17c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banespackage android.support.v7.graphics;
18c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
19c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banesimport android.support.annotation.FloatRange;
20c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
21c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes/**
22c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * A class which allows custom selection of colors in a {@link Palette}'s generation. Instances
23c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * can be created via the {@link Builder} class.
24c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes *
25c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * <p>To use the target, use the {@link Palette.Builder#addTarget(Target)} API when building a
26c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Palette.</p>
27c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */
28c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banespublic final class Target {
29c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
30c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float TARGET_DARK_LUMA = 0.26f;
31c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float MAX_DARK_LUMA = 0.45f;
32c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
33c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float MIN_LIGHT_LUMA = 0.55f;
34c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float TARGET_LIGHT_LUMA = 0.74f;
35c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
36c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float MIN_NORMAL_LUMA = 0.3f;
37c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float TARGET_NORMAL_LUMA = 0.5f;
38c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float MAX_NORMAL_LUMA = 0.7f;
39c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
40c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float TARGET_MUTED_SATURATION = 0.3f;
41c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float MAX_MUTED_SATURATION = 0.4f;
42c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
43c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float TARGET_VIBRANT_SATURATION = 1f;
44c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float MIN_VIBRANT_SATURATION = 0.35f;
45c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
46c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float WEIGHT_SATURATION = 0.24f;
47c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float WEIGHT_LUMA = 0.52f;
48c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final float WEIGHT_POPULATION = 0.24f;
49c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
50c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final int INDEX_MIN = 0;
51c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final int INDEX_TARGET = 1;
52c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final int INDEX_MAX = 2;
53c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
54c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final int INDEX_WEIGHT_SAT = 0;
55c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final int INDEX_WEIGHT_LUMA = 1;
56c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static final int INDEX_WEIGHT_POP = 2;
57c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
58c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
59c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * A target which has the characteristics of a vibrant color which is light in luminance.
60c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    */
61c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public static final Target LIGHT_VIBRANT;
62c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
63c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
64c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * A target which has the characteristics of a vibrant color which is neither light or dark.
65c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
66c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public static final Target VIBRANT;
67c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
68c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
69c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * A target which has the characteristics of a vibrant color which is dark in luminance.
70c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
71c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public static final Target DARK_VIBRANT;
72c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
73c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
74c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * A target which has the characteristics of a muted color which is light in luminance.
75c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
76c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public static final Target LIGHT_MUTED;
77c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
78c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
79c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * A target which has the characteristics of a muted color which is neither light or dark.
80c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
81c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public static final Target MUTED;
82c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
83c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
84c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * A target which has the characteristics of a muted color which is dark in luminance.
85c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
86c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public static final Target DARK_MUTED;
87c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
88c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    static {
89c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        LIGHT_VIBRANT = new Target();
90c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setDefaultLightLightnessValues(LIGHT_VIBRANT);
91c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setDefaultVibrantSaturationValues(LIGHT_VIBRANT);
92c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
93c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        VIBRANT = new Target();
94c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setDefaultNormalLightnessValues(VIBRANT);
95c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setDefaultVibrantSaturationValues(VIBRANT);
96c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
97c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        DARK_VIBRANT = new Target();
98c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setDefaultDarkLightnessValues(DARK_VIBRANT);
99c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setDefaultVibrantSaturationValues(DARK_VIBRANT);
100c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
101c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        LIGHT_MUTED = new Target();
102c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setDefaultLightLightnessValues(LIGHT_MUTED);
103c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setDefaultMutedSaturationValues(LIGHT_MUTED);
104c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
105c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        MUTED = new Target();
106c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setDefaultNormalLightnessValues(MUTED);
107c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setDefaultMutedSaturationValues(MUTED);
108c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
109c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        DARK_MUTED = new Target();
110c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setDefaultDarkLightnessValues(DARK_MUTED);
111c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setDefaultMutedSaturationValues(DARK_MUTED);
112c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
113c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
114c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private final float[] mSaturationTargets = new float[3];
115c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private final float[] mLightnessTargets = new float[3];
116c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private final float[] mWeights = new float[3];
117c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private boolean mIsExclusive = true; // default to true
118c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
119c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private Target() {
120c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setTargetDefaultValues(mSaturationTargets);
121c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setTargetDefaultValues(mLightnessTargets);
122c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        setDefaultWeights();
123c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
124c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
125c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private Target(Target from) {
126c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        System.arraycopy(from.mSaturationTargets, 0, mSaturationTargets, 0,
127c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes                mSaturationTargets.length);
128c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        System.arraycopy(from.mLightnessTargets, 0, mLightnessTargets, 0,
129c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes                mLightnessTargets.length);
130c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        System.arraycopy(from.mWeights, 0, mWeights, 0, mWeights.length);
131c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
132c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
133c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
134c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * The minimum saturation value for this target.
135c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
136c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    @FloatRange(from = 0, to = 1)
137c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public float getMinimumSaturation() {
138c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        return mSaturationTargets[INDEX_MIN];
139c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
140c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
141c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
142c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * The target saturation value for this target.
143c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
144c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    @FloatRange(from = 0, to = 1)
145c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public float getTargetSaturation() {
146c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        return mSaturationTargets[INDEX_TARGET];
147c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
148c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
149c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
150c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * The maximum saturation value for this target.
151c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
152c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    @FloatRange(from = 0, to = 1)
153c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public float getMaximumSaturation() {
154c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        return mSaturationTargets[INDEX_MAX];
155c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
156c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
157c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
158c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * The minimum lightness value for this target.
159c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
160c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    @FloatRange(from = 0, to = 1)
161c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public float getMinimumLightness() {
162c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        return mLightnessTargets[INDEX_MIN];
163c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
164c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
165c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
166c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * The target lightness value for this target.
167c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
168c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    @FloatRange(from = 0, to = 1)
169c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public float getTargetLightness() {
170c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        return mLightnessTargets[INDEX_TARGET];
171c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
172c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
173c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
174c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * The maximum lightness value for this target.
175c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
176c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    @FloatRange(from = 0, to = 1)
177c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public float getMaximumLightness() {
178c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        return mLightnessTargets[INDEX_MAX];
179c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
180c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
181c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
182b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * Returns the weight of importance that this target places on a color's saturation within
183b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * the image.
184b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     *
185b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * <p>The larger the weight, relative to the other weights, the more important that a color
186b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * being close to the target value has on selection.</p>
187b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     *
188b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * @see #getTargetSaturation()
189c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
190c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public float getSaturationWeight() {
191c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        return mWeights[INDEX_WEIGHT_SAT];
192c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
193c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
194c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
195b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * Returns the weight of importance that this target places on a color's lightness within
196b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * the image.
197b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     *
198b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * <p>The larger the weight, relative to the other weights, the more important that a color
199b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * being close to the target value has on selection.</p>
200b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     *
201b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * @see #getTargetLightness()
202c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
203c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public float getLightnessWeight() {
204c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        return mWeights[INDEX_WEIGHT_LUMA];
205c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
206c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
207c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
208b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * Returns the weight of importance that this target places on a color's population within
209b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * the image.
210b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     *
211b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * <p>The larger the weight, relative to the other weights, the more important that a
212b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes     * color's population being close to the most populous has on selection.</p>
213c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
214c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public float getPopulationWeight() {
215c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        return mWeights[INDEX_WEIGHT_POP];
216c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
217c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
218c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
219c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * Returns whether any color selected for this target is exclusive for this target only.
220c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     *
221c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * <p>If false, then the color can be selected for other targets.</p>
222c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
223c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public boolean isExclusive() {
224c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        return mIsExclusive;
225c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
226c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
227c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static void setTargetDefaultValues(final float[] values) {
228c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        values[INDEX_MIN] = 0f;
229c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        values[INDEX_TARGET] = 0.5f;
230c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        values[INDEX_MAX] = 1f;
231c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
232c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
233c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private void setDefaultWeights() {
234c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        mWeights[INDEX_WEIGHT_SAT] = WEIGHT_SATURATION;
235c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        mWeights[INDEX_WEIGHT_LUMA] = WEIGHT_LUMA;
236c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        mWeights[INDEX_WEIGHT_POP] = WEIGHT_POPULATION;
237c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
238c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
239c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    void normalizeWeights() {
240c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        float sum = 0;
241c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        for (int i = 0, z = mWeights.length; i < z; i++) {
242c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            float weight = mWeights[i];
243c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            if (weight > 0) {
244c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes                sum += weight;
245c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            }
246c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
247c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        if (sum != 0) {
248c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            for (int i = 0, z = mWeights.length; i < z; i++) {
249c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes                if (mWeights[i] > 0) {
250c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes                    mWeights[i] /= sum;
251c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes                }
252c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            }
253c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
254c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
255c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
256c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static void setDefaultDarkLightnessValues(Target target) {
257c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        target.mLightnessTargets[INDEX_TARGET] = TARGET_DARK_LUMA;
258c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        target.mLightnessTargets[INDEX_MAX] = MAX_DARK_LUMA;
259c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
260c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
261c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static void setDefaultNormalLightnessValues(Target target) {
262c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        target.mLightnessTargets[INDEX_MIN] = MIN_NORMAL_LUMA;
263c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        target.mLightnessTargets[INDEX_TARGET] = TARGET_NORMAL_LUMA;
264c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        target.mLightnessTargets[INDEX_MAX] = MAX_NORMAL_LUMA;
265c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
266c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
267c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static void setDefaultLightLightnessValues(Target target) {
268c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        target.mLightnessTargets[INDEX_MIN] = MIN_LIGHT_LUMA;
269c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        target.mLightnessTargets[INDEX_TARGET] = TARGET_LIGHT_LUMA;
270c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
271c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
272c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static void setDefaultVibrantSaturationValues(Target target) {
273c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        target.mSaturationTargets[INDEX_MIN] = MIN_VIBRANT_SATURATION;
274c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        target.mSaturationTargets[INDEX_TARGET] = TARGET_VIBRANT_SATURATION;
275c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
276c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
277c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    private static void setDefaultMutedSaturationValues(Target target) {
278c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        target.mSaturationTargets[INDEX_TARGET] = TARGET_MUTED_SATURATION;
279c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        target.mSaturationTargets[INDEX_MAX] = MAX_MUTED_SATURATION;
280c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
281c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
282c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    /**
283c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     * Builder class for generating custom {@link Target} instances.
284c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes     */
285c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    public final static class Builder {
286c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        private final Target mTarget;
287c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
288c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        /**
289c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         * Create a new {@link Target} builder from scratch.
290c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         */
291c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        public Builder() {
292c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            mTarget = new Target();
293c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
294c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
295c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        /**
296c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         * Create a new builder based on an existing {@link Target}.
297c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         */
298c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        public Builder(Target target) {
299c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            mTarget = new Target(target);
300c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
301c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
302c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        /**
303c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         * Set the minimum saturation value for this target.
304c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         */
305c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        public Builder setMinimumSaturation(@FloatRange(from = 0, to = 1) float value) {
306c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            mTarget.mSaturationTargets[INDEX_MIN] = value;
307c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            return this;
308c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
309c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
310c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        /**
311c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         * Set the target/ideal saturation value for this target.
312c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         */
313c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        public Builder setTargetSaturation(@FloatRange(from = 0, to = 1) float value) {
314c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            mTarget.mSaturationTargets[INDEX_TARGET] = value;
315c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            return this;
316c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
317c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
318c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        /**
319c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         * Set the maximum saturation value for this target.
320c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         */
321c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        public Builder setMaximumSaturation(@FloatRange(from = 0, to = 1) float value) {
322c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            mTarget.mSaturationTargets[INDEX_MAX] = value;
323c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            return this;
324c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
325c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
326c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        /**
327c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         * Set the minimum lightness value for this target.
328c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         */
329c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        public Builder setMinimumLightness(@FloatRange(from = 0, to = 1) float value) {
330c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            mTarget.mLightnessTargets[INDEX_MIN] = value;
331c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            return this;
332c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
333c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
334c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        /**
335c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         * Set the target/ideal lightness value for this target.
336c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         */
337c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        public Builder setTargetLightness(@FloatRange(from = 0, to = 1) float value) {
338c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            mTarget.mLightnessTargets[INDEX_TARGET] = value;
339c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            return this;
340c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
341c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
342c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        /**
343c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         * Set the maximum lightness value for this target.
344c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         */
345c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        public Builder setMaximumLightness(@FloatRange(from = 0, to = 1) float value) {
346c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            mTarget.mLightnessTargets[INDEX_MAX] = value;
347c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            return this;
348c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
349c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
350c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        /**
351b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * Set the weight of importance that this target will place on saturation values.
352b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         *
353b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * <p>The larger the weight, relative to the other weights, the more important that a color
354b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * being close to the target value has on selection.</p>
355b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         *
356b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * <p>A weight of 0 means that it has no weight, and thus has no
357b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * bearing on the selection.</p>
358b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         *
359b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * @see #setTargetSaturation(float)
360c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         */
361c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        public Builder setSaturationWeight(@FloatRange(from = 0) float weight) {
362c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            mTarget.mWeights[INDEX_WEIGHT_SAT] = weight;
363c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            return this;
364c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
365c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
366c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        /**
367b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * Set the weight of importance that this target will place on lightness values.
368b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         *
369b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * <p>The larger the weight, relative to the other weights, the more important that a color
370b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * being close to the target value has on selection.</p>
371b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         *
372b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * <p>A weight of 0 means that it has no weight, and thus has no
373b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * bearing on the selection.</p>
374b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         *
375b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * @see #setTargetLightness(float)
376c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         */
377c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        public Builder setLightnessWeight(@FloatRange(from = 0) float weight) {
378c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            mTarget.mWeights[INDEX_WEIGHT_LUMA] = weight;
379c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            return this;
380c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
381c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
382c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        /**
383b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * Set the weight of importance that this target will place on a color's population within
384b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * the image.
385b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         *
386b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * <p>The larger the weight, relative to the other weights, the more important that a
387b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * color's population being close to the most populous has on selection.</p>
388b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         *
389b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * <p>A weight of 0 means that it has no weight, and thus has no
390b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes         * bearing on the selection.</p>
391c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         */
392c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        public Builder setPopulationWeight(@FloatRange(from = 0) float weight) {
393c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            mTarget.mWeights[INDEX_WEIGHT_POP] = weight;
394c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            return this;
395c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
396c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
397c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        /**
398c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         * Set whether any color selected for this target is exclusive to this target only.
399c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         * Defaults to true.
400c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         *
401c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         * @param exclusive true if any the color is exclusive to this target, or false is the
402c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         *                  color can be selected for other targets.
403c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         */
404c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        public Builder setExclusive(boolean exclusive) {
405c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            mTarget.mIsExclusive = exclusive;
406c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            return this;
407c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
408c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
409c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        /**
410c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         * Builds and returns the resulting {@link Target}.
411c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes         */
412c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        public Target build() {
413c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes            return mTarget;
414c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes        }
415c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes    }
416c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes
417c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes}