1*90c8c64dSAndroid Build Coastguard Worker /*
2*90c8c64dSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
3*90c8c64dSAndroid Build Coastguard Worker *
4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*90c8c64dSAndroid Build Coastguard Worker *
8*90c8c64dSAndroid Build Coastguard Worker *     http://www.apache.org/licenses/LICENSE-2.0
9*90c8c64dSAndroid Build Coastguard Worker *
10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License.
15*90c8c64dSAndroid Build Coastguard Worker */
16*90c8c64dSAndroid Build Coastguard Worker 
17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.drawabletinting;
18*90c8c64dSAndroid Build Coastguard Worker 
19*90c8c64dSAndroid Build Coastguard Worker import android.graphics.Color;
20*90c8c64dSAndroid Build Coastguard Worker import android.graphics.PorterDuff;
21*90c8c64dSAndroid Build Coastguard Worker import android.os.Bundle;
22*90c8c64dSAndroid Build Coastguard Worker import android.support.annotation.Nullable;
23*90c8c64dSAndroid Build Coastguard Worker import android.support.v4.app.Fragment;
24*90c8c64dSAndroid Build Coastguard Worker import android.view.LayoutInflater;
25*90c8c64dSAndroid Build Coastguard Worker import android.view.View;
26*90c8c64dSAndroid Build Coastguard Worker import android.view.ViewGroup;
27*90c8c64dSAndroid Build Coastguard Worker import android.widget.AdapterView;
28*90c8c64dSAndroid Build Coastguard Worker import android.widget.ArrayAdapter;
29*90c8c64dSAndroid Build Coastguard Worker import android.widget.ImageView;
30*90c8c64dSAndroid Build Coastguard Worker import android.widget.SeekBar;
31*90c8c64dSAndroid Build Coastguard Worker import android.widget.Spinner;
32*90c8c64dSAndroid Build Coastguard Worker import android.widget.SpinnerAdapter;
33*90c8c64dSAndroid Build Coastguard Worker import android.widget.TextView;
34*90c8c64dSAndroid Build Coastguard Worker 
35*90c8c64dSAndroid Build Coastguard Worker import com.example.android.common.logger.Log;
36*90c8c64dSAndroid Build Coastguard Worker 
37*90c8c64dSAndroid Build Coastguard Worker /**
38*90c8c64dSAndroid Build Coastguard Worker  * Sample that shows tinting of Drawables programmatically and of Drawable resources in XML.
39*90c8c64dSAndroid Build Coastguard Worker  * Tinting is set on a nine-patch drawable through the "tint" and "tintMode" parameters.
40*90c8c64dSAndroid Build Coastguard Worker  * A color state list is referenced as the tint color, which  defines colors for different
41*90c8c64dSAndroid Build Coastguard Worker  * states of a View (for example disabled/enabled, focused, pressed or selected).
42*90c8c64dSAndroid Build Coastguard Worker  * Programmatically, tinting is applied to a Drawable through its "setColorFilter" method, with
43*90c8c64dSAndroid Build Coastguard Worker  * a reference to a color and a PorterDuff blend mode. The color and blend mode can be
44*90c8c64dSAndroid Build Coastguard Worker  * changed from the UI.
45*90c8c64dSAndroid Build Coastguard Worker  *
46*90c8c64dSAndroid Build Coastguard Worker  * @see android.graphics.drawable.Drawable#setColorFilter(int, android.graphics.PorterDuff.Mode)
47*90c8c64dSAndroid Build Coastguard Worker  * @see android.graphics.drawable.Drawable#setTint(android.content.res.ColorStateList, android.graphics.PorterDuff.Mode)
48*90c8c64dSAndroid Build Coastguard Worker  */
49*90c8c64dSAndroid Build Coastguard Worker public class DrawableTintingFragment extends Fragment {
50*90c8c64dSAndroid Build Coastguard Worker 
51*90c8c64dSAndroid Build Coastguard Worker     /**
52*90c8c64dSAndroid Build Coastguard Worker      * String that identifies logging output from this Fragment.
53*90c8c64dSAndroid Build Coastguard Worker      */
54*90c8c64dSAndroid Build Coastguard Worker     private static final String TAG = "DrawableTintingFragment";
55*90c8c64dSAndroid Build Coastguard Worker 
56*90c8c64dSAndroid Build Coastguard Worker     /**
57*90c8c64dSAndroid Build Coastguard Worker      * Image that tinting is applied to programmatically.
58*90c8c64dSAndroid Build Coastguard Worker      */
59*90c8c64dSAndroid Build Coastguard Worker     private ImageView mImage;
60*90c8c64dSAndroid Build Coastguard Worker 
61*90c8c64dSAndroid Build Coastguard Worker     /**
62*90c8c64dSAndroid Build Coastguard Worker      * Seekbar for alpha component of tinting color.
63*90c8c64dSAndroid Build Coastguard Worker      */
64*90c8c64dSAndroid Build Coastguard Worker     private SeekBar mAlphaBar;
65*90c8c64dSAndroid Build Coastguard Worker     /**
66*90c8c64dSAndroid Build Coastguard Worker      * Seekbar for red component of tinting color.
67*90c8c64dSAndroid Build Coastguard Worker      */
68*90c8c64dSAndroid Build Coastguard Worker     private SeekBar mRedBar;
69*90c8c64dSAndroid Build Coastguard Worker     /**
70*90c8c64dSAndroid Build Coastguard Worker      * Seekbar for green bar of tinting color.
71*90c8c64dSAndroid Build Coastguard Worker      */
72*90c8c64dSAndroid Build Coastguard Worker     private SeekBar mGreenBar;
73*90c8c64dSAndroid Build Coastguard Worker     /**
74*90c8c64dSAndroid Build Coastguard Worker      * Seekbar for blue bar of tinting color.
75*90c8c64dSAndroid Build Coastguard Worker      */
76*90c8c64dSAndroid Build Coastguard Worker     private SeekBar mBlueBar;
77*90c8c64dSAndroid Build Coastguard Worker 
78*90c8c64dSAndroid Build Coastguard Worker     /**
79*90c8c64dSAndroid Build Coastguard Worker      * Text label for alpha component seekbar.
80*90c8c64dSAndroid Build Coastguard Worker      */
81*90c8c64dSAndroid Build Coastguard Worker     private TextView mAlphaText;
82*90c8c64dSAndroid Build Coastguard Worker     /**
83*90c8c64dSAndroid Build Coastguard Worker      * Text label for red component seekbar.
84*90c8c64dSAndroid Build Coastguard Worker      */
85*90c8c64dSAndroid Build Coastguard Worker     private TextView mRedText;
86*90c8c64dSAndroid Build Coastguard Worker     /**
87*90c8c64dSAndroid Build Coastguard Worker      * Text label for green component seekbar.
88*90c8c64dSAndroid Build Coastguard Worker      */
89*90c8c64dSAndroid Build Coastguard Worker     private TextView mGreenText;
90*90c8c64dSAndroid Build Coastguard Worker     /**
91*90c8c64dSAndroid Build Coastguard Worker      * Text label for blue component seekbar.
92*90c8c64dSAndroid Build Coastguard Worker      */
93*90c8c64dSAndroid Build Coastguard Worker     private TextView mBlueText;
94*90c8c64dSAndroid Build Coastguard Worker 
95*90c8c64dSAndroid Build Coastguard Worker     /**
96*90c8c64dSAndroid Build Coastguard Worker      * Selector for blend type for color tinting.
97*90c8c64dSAndroid Build Coastguard Worker      */
98*90c8c64dSAndroid Build Coastguard Worker     private Spinner mBlendSpinner;
99*90c8c64dSAndroid Build Coastguard Worker 
100*90c8c64dSAndroid Build Coastguard Worker     /**
101*90c8c64dSAndroid Build Coastguard Worker      * Computed color for tinting of drawable.
102*90c8c64dSAndroid Build Coastguard Worker      */
103*90c8c64dSAndroid Build Coastguard Worker     private int mHintColor;
104*90c8c64dSAndroid Build Coastguard Worker 
105*90c8c64dSAndroid Build Coastguard Worker     /**
106*90c8c64dSAndroid Build Coastguard Worker      * Selected color tinting mode.
107*90c8c64dSAndroid Build Coastguard Worker      */
108*90c8c64dSAndroid Build Coastguard Worker     private PorterDuff.Mode mMode;
109*90c8c64dSAndroid Build Coastguard Worker 
110*90c8c64dSAndroid Build Coastguard Worker     /**
111*90c8c64dSAndroid Build Coastguard Worker      * Identifier for state of blend mod spinner in state bundle.
112*90c8c64dSAndroid Build Coastguard Worker      */
113*90c8c64dSAndroid Build Coastguard Worker     private static final String STATE_BLEND = "DRAWABLETINTING_BLEND";
114*90c8c64dSAndroid Build Coastguard Worker     /**
115*90c8c64dSAndroid Build Coastguard Worker      * Identifier for state of alpha seek bar in state bundle.
116*90c8c64dSAndroid Build Coastguard Worker      */
117*90c8c64dSAndroid Build Coastguard Worker     private static final String STATE_ALPHA = "DRAWABLETINTING_ALPHA";
118*90c8c64dSAndroid Build Coastguard Worker     /**
119*90c8c64dSAndroid Build Coastguard Worker      * Identifier for state of red seek bar in state bundle.
120*90c8c64dSAndroid Build Coastguard Worker      */
121*90c8c64dSAndroid Build Coastguard Worker     private static final String STATE_RED = "DRAWABLETINTING_RED";
122*90c8c64dSAndroid Build Coastguard Worker     /**
123*90c8c64dSAndroid Build Coastguard Worker      * Identifier for state of green seek bar in state bundle.
124*90c8c64dSAndroid Build Coastguard Worker      */
125*90c8c64dSAndroid Build Coastguard Worker     private static final String STATE_GREEN = "DRAWABLETINTING_GREEN";
126*90c8c64dSAndroid Build Coastguard Worker     /**
127*90c8c64dSAndroid Build Coastguard Worker      * Identifier for state of blue seek bar in state bundle.
128*90c8c64dSAndroid Build Coastguard Worker      */
129*90c8c64dSAndroid Build Coastguard Worker     private static final String STATE_BLUE = "DRAWABLETINTING_BLUE";
130*90c8c64dSAndroid Build Coastguard Worker 
131*90c8c64dSAndroid Build Coastguard Worker     /**
132*90c8c64dSAndroid Build Coastguard Worker      * Available tinting modes. Note that this array must be kept in sync with the
133*90c8c64dSAndroid Build Coastguard Worker      * <code>blend_modes</code> string array that provides labels for these modes.
134*90c8c64dSAndroid Build Coastguard Worker      */
135*90c8c64dSAndroid Build Coastguard Worker     private static final PorterDuff.Mode[] MODES = new PorterDuff.Mode[]{
136*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.ADD,
137*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.CLEAR,
138*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.DARKEN,
139*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.DST,
140*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.DST_ATOP,
141*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.DST_IN,
142*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.DST_OUT,
143*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.DST_OVER,
144*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.LIGHTEN,
145*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.MULTIPLY,
146*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.OVERLAY,
147*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.SCREEN,
148*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.SRC,
149*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.SRC_ATOP,
150*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.SRC_IN,
151*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.SRC_OUT,
152*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.SRC_OVER,
153*90c8c64dSAndroid Build Coastguard Worker             PorterDuff.Mode.XOR
154*90c8c64dSAndroid Build Coastguard Worker     };
155*90c8c64dSAndroid Build Coastguard Worker 
156*90c8c64dSAndroid Build Coastguard Worker 
157*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreate(Bundle savedInstanceState)158*90c8c64dSAndroid Build Coastguard Worker     public void onCreate(Bundle savedInstanceState) {
159*90c8c64dSAndroid Build Coastguard Worker         super.onCreate(savedInstanceState);
160*90c8c64dSAndroid Build Coastguard Worker         setHasOptionsMenu(true);
161*90c8c64dSAndroid Build Coastguard Worker     }
162*90c8c64dSAndroid Build Coastguard Worker 
163*90c8c64dSAndroid Build Coastguard Worker     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)164*90c8c64dSAndroid Build Coastguard Worker     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
165*90c8c64dSAndroid Build Coastguard Worker         View v = inflater.inflate(R.layout.tinting_fragment, null);
166*90c8c64dSAndroid Build Coastguard Worker 
167*90c8c64dSAndroid Build Coastguard Worker         // Set a drawable as the image to display
168*90c8c64dSAndroid Build Coastguard Worker         mImage = (ImageView) v.findViewById(R.id.image);
169*90c8c64dSAndroid Build Coastguard Worker         mImage.setImageResource(R.drawable.btn_default_normal_holo);
170*90c8c64dSAndroid Build Coastguard Worker 
171*90c8c64dSAndroid Build Coastguard Worker         // Get text labels and seekbars for the four color components: ARGB
172*90c8c64dSAndroid Build Coastguard Worker         mAlphaBar = (SeekBar) v.findViewById(R.id.alphaSeek);
173*90c8c64dSAndroid Build Coastguard Worker         mAlphaText = (TextView) v.findViewById(R.id.alphaText);
174*90c8c64dSAndroid Build Coastguard Worker         mGreenBar = (SeekBar) v.findViewById(R.id.greenSeek);
175*90c8c64dSAndroid Build Coastguard Worker         mGreenText = (TextView) v.findViewById(R.id.greenText);
176*90c8c64dSAndroid Build Coastguard Worker         mRedBar = (SeekBar) v.findViewById(R.id.redSeek);
177*90c8c64dSAndroid Build Coastguard Worker         mRedText = (TextView) v.findViewById(R.id.redText);
178*90c8c64dSAndroid Build Coastguard Worker         mBlueText = (TextView) v.findViewById(R.id.blueText);
179*90c8c64dSAndroid Build Coastguard Worker         mBlueBar = (SeekBar) v.findViewById(R.id.blueSeek);
180*90c8c64dSAndroid Build Coastguard Worker 
181*90c8c64dSAndroid Build Coastguard Worker         // Set a listener to update tinted image when selections have changed
182*90c8c64dSAndroid Build Coastguard Worker         mAlphaBar.setOnSeekBarChangeListener(mSeekBarListener);
183*90c8c64dSAndroid Build Coastguard Worker         mRedBar.setOnSeekBarChangeListener(mSeekBarListener);
184*90c8c64dSAndroid Build Coastguard Worker         mGreenBar.setOnSeekBarChangeListener(mSeekBarListener);
185*90c8c64dSAndroid Build Coastguard Worker         mBlueBar.setOnSeekBarChangeListener(mSeekBarListener);
186*90c8c64dSAndroid Build Coastguard Worker 
187*90c8c64dSAndroid Build Coastguard Worker 
188*90c8c64dSAndroid Build Coastguard Worker         // Set up the spinner for blend mode selection from a string array resource
189*90c8c64dSAndroid Build Coastguard Worker         mBlendSpinner = (Spinner) v.findViewById(R.id.blendSpinner);
190*90c8c64dSAndroid Build Coastguard Worker         SpinnerAdapter sa = ArrayAdapter.createFromResource(getActivity(),
191*90c8c64dSAndroid Build Coastguard Worker                 R.array.blend_modes, android.R.layout.simple_spinner_dropdown_item);
192*90c8c64dSAndroid Build Coastguard Worker         mBlendSpinner.setAdapter(sa);
193*90c8c64dSAndroid Build Coastguard Worker         // Set a listener to update the tinted image when a blend mode is selected
194*90c8c64dSAndroid Build Coastguard Worker         mBlendSpinner.setOnItemSelectedListener(mBlendListener);
195*90c8c64dSAndroid Build Coastguard Worker         // Select the first item
196*90c8c64dSAndroid Build Coastguard Worker         mBlendSpinner.setSelection(0);
197*90c8c64dSAndroid Build Coastguard Worker         mMode = MODES[0];
198*90c8c64dSAndroid Build Coastguard Worker 
199*90c8c64dSAndroid Build Coastguard Worker         if (savedInstanceState != null) {
200*90c8c64dSAndroid Build Coastguard Worker             // Restore the previous state if this fragment has been restored
201*90c8c64dSAndroid Build Coastguard Worker             mBlendSpinner.setSelection(savedInstanceState.getInt(STATE_BLEND));
202*90c8c64dSAndroid Build Coastguard Worker             mAlphaBar.setProgress(savedInstanceState.getInt(STATE_ALPHA));
203*90c8c64dSAndroid Build Coastguard Worker             mRedBar.setProgress(savedInstanceState.getInt(STATE_RED));
204*90c8c64dSAndroid Build Coastguard Worker             mGreenBar.setProgress(savedInstanceState.getInt(STATE_GREEN));
205*90c8c64dSAndroid Build Coastguard Worker             mBlueBar.setProgress(savedInstanceState.getInt(STATE_BLUE));
206*90c8c64dSAndroid Build Coastguard Worker         }
207*90c8c64dSAndroid Build Coastguard Worker 
208*90c8c64dSAndroid Build Coastguard Worker         // Apply the default blend mode and color
209*90c8c64dSAndroid Build Coastguard Worker         updateTint(getColor(), getTintMode());
210*90c8c64dSAndroid Build Coastguard Worker 
211*90c8c64dSAndroid Build Coastguard Worker         return v;
212*90c8c64dSAndroid Build Coastguard Worker     }
213*90c8c64dSAndroid Build Coastguard Worker 
214*90c8c64dSAndroid Build Coastguard Worker     @Override
onSaveInstanceState(Bundle outState)215*90c8c64dSAndroid Build Coastguard Worker     public void onSaveInstanceState(Bundle outState) {
216*90c8c64dSAndroid Build Coastguard Worker         super.onSaveInstanceState(outState);
217*90c8c64dSAndroid Build Coastguard Worker         Log.d(TAG, "state saved.");
218*90c8c64dSAndroid Build Coastguard Worker         outState.putInt(STATE_BLEND, mBlendSpinner.getSelectedItemPosition());
219*90c8c64dSAndroid Build Coastguard Worker         outState.putInt(STATE_ALPHA, mAlphaBar.getProgress());
220*90c8c64dSAndroid Build Coastguard Worker         outState.putInt(STATE_RED, mRedBar.getProgress());
221*90c8c64dSAndroid Build Coastguard Worker         outState.putInt(STATE_GREEN, mGreenBar.getProgress());
222*90c8c64dSAndroid Build Coastguard Worker         outState.putInt(STATE_BLUE, mBlueBar.getProgress());
223*90c8c64dSAndroid Build Coastguard Worker     }
224*90c8c64dSAndroid Build Coastguard Worker 
225*90c8c64dSAndroid Build Coastguard Worker     /**
226*90c8c64dSAndroid Build Coastguard Worker      * Computes the {@link Color} value from selection on ARGB sliders.
227*90c8c64dSAndroid Build Coastguard Worker      *
228*90c8c64dSAndroid Build Coastguard Worker      * @return color computed from selected ARGB values
229*90c8c64dSAndroid Build Coastguard Worker      */
getColor()230*90c8c64dSAndroid Build Coastguard Worker     public int getColor() {
231*90c8c64dSAndroid Build Coastguard Worker         final int alpha = mAlphaBar.getProgress();
232*90c8c64dSAndroid Build Coastguard Worker         final int red = mRedBar.getProgress();
233*90c8c64dSAndroid Build Coastguard Worker         final int green = mGreenBar.getProgress();
234*90c8c64dSAndroid Build Coastguard Worker         final int blue = mBlueBar.getProgress();
235*90c8c64dSAndroid Build Coastguard Worker 
236*90c8c64dSAndroid Build Coastguard Worker         return Color.argb(alpha, red, green, blue);
237*90c8c64dSAndroid Build Coastguard Worker     }
238*90c8c64dSAndroid Build Coastguard Worker 
239*90c8c64dSAndroid Build Coastguard Worker     /**
240*90c8c64dSAndroid Build Coastguard Worker      * Returns the {@link android.graphics.PorterDuff.Mode} for the selected tint mode option.
241*90c8c64dSAndroid Build Coastguard Worker      *
242*90c8c64dSAndroid Build Coastguard Worker      * @return selected tint mode
243*90c8c64dSAndroid Build Coastguard Worker      */
getTintMode()244*90c8c64dSAndroid Build Coastguard Worker     public PorterDuff.Mode getTintMode() {
245*90c8c64dSAndroid Build Coastguard Worker         return MODES[mBlendSpinner.getSelectedItemPosition()];
246*90c8c64dSAndroid Build Coastguard Worker     }
247*90c8c64dSAndroid Build Coastguard Worker 
248*90c8c64dSAndroid Build Coastguard Worker     /**
249*90c8c64dSAndroid Build Coastguard Worker      * Update the tint of the image with the color set in the seekbars and selected blend mode.
250*90c8c64dSAndroid Build Coastguard Worker      * The seekbars are set to a maximum of 255, with one for each of the four components of the
251*90c8c64dSAndroid Build Coastguard Worker      * ARGB color. (Alpha, Red, Green, Blue.) Once a color has been computed using
252*90c8c64dSAndroid Build Coastguard Worker      * {@link Color#argb(int, int, int, int)}, it is set togethe with the blend mode on the background
253*90c8c64dSAndroid Build Coastguard Worker      * image using
254*90c8c64dSAndroid Build Coastguard Worker      * {@link android.widget.ImageView#setColorFilter(int, android.graphics.PorterDuff.Mode)}.
255*90c8c64dSAndroid Build Coastguard Worker      */
updateTint(int color, PorterDuff.Mode mode)256*90c8c64dSAndroid Build Coastguard Worker     public void updateTint(int color, PorterDuff.Mode mode) {
257*90c8c64dSAndroid Build Coastguard Worker         // Set the color hint of the image: ARGB
258*90c8c64dSAndroid Build Coastguard Worker         mHintColor = color;
259*90c8c64dSAndroid Build Coastguard Worker 
260*90c8c64dSAndroid Build Coastguard Worker         // Set the color tint mode based on the selection of the Spinner
261*90c8c64dSAndroid Build Coastguard Worker         mMode = mode;
262*90c8c64dSAndroid Build Coastguard Worker 
263*90c8c64dSAndroid Build Coastguard Worker         // Log selection
264*90c8c64dSAndroid Build Coastguard Worker         Log.d(TAG, String.format("Updating tint with color [ARGB: %d,%d,%d,%d] and mode [%s]",
265*90c8c64dSAndroid Build Coastguard Worker                 Color.alpha(color), Color.red(color), Color.green(color), Color.blue(color),
266*90c8c64dSAndroid Build Coastguard Worker                 mode.toString()));
267*90c8c64dSAndroid Build Coastguard Worker 
268*90c8c64dSAndroid Build Coastguard Worker         // Apply the color tint for the selected tint mode
269*90c8c64dSAndroid Build Coastguard Worker         mImage.setColorFilter(mHintColor, mMode);
270*90c8c64dSAndroid Build Coastguard Worker 
271*90c8c64dSAndroid Build Coastguard Worker         // Update the text for each label with the value of each channel
272*90c8c64dSAndroid Build Coastguard Worker         mAlphaText.setText(getString(R.string.value_alpha, Color.alpha(color)));
273*90c8c64dSAndroid Build Coastguard Worker         mRedText.setText(getString(R.string.value_red, Color.red(color)));
274*90c8c64dSAndroid Build Coastguard Worker         mGreenText.setText(getString(R.string.value_green, Color.green(color)));
275*90c8c64dSAndroid Build Coastguard Worker         mBlueText.setText(getString(R.string.value_blue, Color.blue(color)));
276*90c8c64dSAndroid Build Coastguard Worker     }
277*90c8c64dSAndroid Build Coastguard Worker 
278*90c8c64dSAndroid Build Coastguard Worker     /**
279*90c8c64dSAndroid Build Coastguard Worker      * Listener that updates the tint when a blend mode is selected.
280*90c8c64dSAndroid Build Coastguard Worker      */
281*90c8c64dSAndroid Build Coastguard Worker     private AdapterView.OnItemSelectedListener mBlendListener =
282*90c8c64dSAndroid Build Coastguard Worker             new AdapterView.OnItemSelectedListener() {
283*90c8c64dSAndroid Build Coastguard Worker 
284*90c8c64dSAndroid Build Coastguard Worker                 @Override
285*90c8c64dSAndroid Build Coastguard Worker                 public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
286*90c8c64dSAndroid Build Coastguard Worker                     // Selected a blend mode and update the tint of image
287*90c8c64dSAndroid Build Coastguard Worker                     updateTint(getColor(), getTintMode());
288*90c8c64dSAndroid Build Coastguard Worker                 }
289*90c8c64dSAndroid Build Coastguard Worker 
290*90c8c64dSAndroid Build Coastguard Worker                 @Override
291*90c8c64dSAndroid Build Coastguard Worker                 public void onNothingSelected(AdapterView<?> adapterView) {
292*90c8c64dSAndroid Build Coastguard Worker 
293*90c8c64dSAndroid Build Coastguard Worker                 }
294*90c8c64dSAndroid Build Coastguard Worker 
295*90c8c64dSAndroid Build Coastguard Worker             };
296*90c8c64dSAndroid Build Coastguard Worker 
297*90c8c64dSAndroid Build Coastguard Worker     /**
298*90c8c64dSAndroid Build Coastguard Worker      * Seekbar listener that updates the tinted color when the progress bar has changed.
299*90c8c64dSAndroid Build Coastguard Worker      */
300*90c8c64dSAndroid Build Coastguard Worker     private SeekBar.OnSeekBarChangeListener mSeekBarListener =
301*90c8c64dSAndroid Build Coastguard Worker             new SeekBar.OnSeekBarChangeListener() {
302*90c8c64dSAndroid Build Coastguard Worker                 @Override
303*90c8c64dSAndroid Build Coastguard Worker                 public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
304*90c8c64dSAndroid Build Coastguard Worker                     // Update the tinted color from all selections in the UI
305*90c8c64dSAndroid Build Coastguard Worker                     updateTint(getColor(), getTintMode());
306*90c8c64dSAndroid Build Coastguard Worker                 }
307*90c8c64dSAndroid Build Coastguard Worker 
308*90c8c64dSAndroid Build Coastguard Worker                 @Override
309*90c8c64dSAndroid Build Coastguard Worker                 public void onStartTrackingTouch(SeekBar seekBar) {
310*90c8c64dSAndroid Build Coastguard Worker                 }
311*90c8c64dSAndroid Build Coastguard Worker 
312*90c8c64dSAndroid Build Coastguard Worker                 @Override
313*90c8c64dSAndroid Build Coastguard Worker                 public void onStopTrackingTouch(SeekBar seekBar) {
314*90c8c64dSAndroid Build Coastguard Worker                 }
315*90c8c64dSAndroid Build Coastguard Worker             };
316*90c8c64dSAndroid Build Coastguard Worker }
317