1faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/*
2faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Copyright (C) 2013 The Android Open Source Project
3faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase *
4faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Licensed under the Apache License, Version 2.0 (the "License");
5faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * you may not use this file except in compliance with the License.
6faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * You may obtain a copy of the License at
7faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase *
8faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase *      http://www.apache.org/licenses/LICENSE-2.0
9faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase *
10faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * Unless required by applicable law or agreed to in writing, software
11faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * distributed under the License is distributed on an "AS IS" BASIS,
12faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * See the License for the specific language governing permissions and
14faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * limitations under the License.
15faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */
166ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase
17d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haasepackage android.transition;
18faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
19faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.animation.Animator;
20faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.animation.ObjectAnimator;
21ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.content.Context;
22faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.graphics.drawable.ColorDrawable;
23faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.graphics.drawable.Drawable;
24ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mountimport android.util.AttributeSet;
25faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.View;
26faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.ViewGroup;
27faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.widget.TextView;
28faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
29faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/**
30faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * This transition tracks changes during scene changes to the
31faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * {@link View#setBackground(android.graphics.drawable.Drawable) background}
32faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * property of its target views (when the background is a
33faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * {@link ColorDrawable}, as well as the
34faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * {@link TextView#setTextColor(android.content.res.ColorStateList)
35faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * color} of the text for target TextViews. If the color changes between
36faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * scenes, the color change is animated.
37d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase *
38d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * @hide
39faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */
40faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haasepublic class Recolor extends Transition {
41faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
42faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private static final String PROPNAME_BACKGROUND = "android:recolor:background";
43faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private static final String PROPNAME_TEXT_COLOR = "android:recolor:textColor";
44faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
45ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    public Recolor() {}
46ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount
47ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    public Recolor(Context context, AttributeSet attrs) {
48ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount        super(context, attrs);
49ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount    }
50ecd857be3946283ebb4306e2c03ae70f5c5bb152George Mount
51d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    private void captureValues(TransitionValues transitionValues) {
52d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        transitionValues.values.put(PROPNAME_BACKGROUND, transitionValues.view.getBackground());
53d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        if (transitionValues.view instanceof TextView) {
54d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            transitionValues.values.put(PROPNAME_TEXT_COLOR,
55d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                    ((TextView)transitionValues.view).getCurrentTextColor());
56faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
57faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
58faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
59faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
60d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureStartValues(TransitionValues transitionValues) {
61d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        captureValues(transitionValues);
62d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
63d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
64d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
65d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureEndValues(TransitionValues transitionValues) {
66d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        captureValues(transitionValues);
67d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
68d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
69d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
70d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
71faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            TransitionValues endValues) {
72faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (startValues == null || endValues == null) {
732ea7f8b9c5f903050d42c1af57406bf528979f45Chet Haase            return null;
74faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
75faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        final View view = endValues.view;
76faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        Drawable startBackground = (Drawable) startValues.values.get(PROPNAME_BACKGROUND);
77faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        Drawable endBackground = (Drawable) endValues.values.get(PROPNAME_BACKGROUND);
78faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        boolean changed = false;
79faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (startBackground instanceof ColorDrawable && endBackground instanceof ColorDrawable) {
80faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            ColorDrawable startColor = (ColorDrawable) startBackground;
81faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            ColorDrawable endColor = (ColorDrawable) endBackground;
82faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            if (startColor.getColor() != endColor.getColor()) {
83faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                endColor.setColor(startColor.getColor());
84faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                changed = true;
851ffb280a7d2c70cc16d709c685f5d31fdb86b5e4George Mount                return ObjectAnimator.ofArgb(endBackground, "color", startColor.getColor(),
861ffb280a7d2c70cc16d709c685f5d31fdb86b5e4George Mount                        endColor.getColor());
87faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
88faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
89faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (view instanceof TextView) {
90faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            TextView textView = (TextView) view;
91faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            int start = (Integer) startValues.values.get(PROPNAME_TEXT_COLOR);
92faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            int end = (Integer) endValues.values.get(PROPNAME_TEXT_COLOR);
93faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            if (start != end) {
94faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                textView.setTextColor(end);
95faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                changed = true;
961ffb280a7d2c70cc16d709c685f5d31fdb86b5e4George Mount                return ObjectAnimator.ofArgb(textView, "textColor", start, end);
97faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
98faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
992ea7f8b9c5f903050d42c1af57406bf528979f45Chet Haase        return null;
100faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
101faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase}
102