1990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount/*
2990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * Copyright (C) 2016 The Android Open Source Project
3990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount *
4990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * Licensed under the Apache License, Version 2.0 (the "License");
5990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * you may not use this file except in compliance with the License.
6990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * You may obtain a copy of the License at
7990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount *
8990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount *      http://www.apache.org/licenses/LICENSE-2.0
9990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount *
10990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * Unless required by applicable law or agreed to in writing, software
11990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * distributed under the License is distributed on an "AS IS" BASIS,
12990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * See the License for the specific language governing permissions and
14990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * limitations under the License.
15990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount */
16990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountpackage android.support.v4.app;
17990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
18990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.animation.Animator;
19990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.graphics.Rect;
20990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.transition.Transition;
21990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.transition.TransitionValues;
22990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.view.View;
23990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport android.view.ViewGroup;
24990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
25990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountimport java.util.ArrayList;
26990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
27990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount/**
28990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * A transition that tracks which targets are applied to it.
29990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * It will assume any target that it applies to will have differences
30990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * between the start and end state, regardless of the differences
31990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * that actually exist. In other words, it doesn't actually check
32990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * any size or position differences or any other property of the view.
33990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * It just records the difference.
34990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * <p>
35990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * Both start and end value Views are recorded, but no actual animation
36990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount * is created.
37990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount */
38990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mountclass TrackingTransition extends Transition implements TargetTracking {
39990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public final ArrayList<View> targets = new ArrayList<>();
40990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    private final Rect[] mEpicenter = new Rect[1];
41990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    private static final String PROP = "tracking:prop";
42990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    private static final String[] PROPS = { PROP };
43990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
44990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Override
45990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public String[] getTransitionProperties() {
46990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        return PROPS;
47990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
48990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
49990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Override
50990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void captureStartValues(TransitionValues transitionValues) {
51990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        transitionValues.values.put(PROP, 0);
52990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
53990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
54990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Override
55990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void captureEndValues(TransitionValues transitionValues) {
56990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        transitionValues.values.put(PROP, 1);
57990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
58990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
59990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Override
60990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
61990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            TransitionValues endValues) {
62990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (startValues != null) {
63990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            targets.add(startValues.view);
64990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
65990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (endValues != null) {
66990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            targets.add(endValues.view);
67990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
68990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        Rect epicenter = getEpicenter();
69990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        if (epicenter != null) {
70990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            mEpicenter[0] = new Rect(epicenter);
71990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        } else {
72990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount            mEpicenter[0] = null;
73990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        }
74990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        return null;
75990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
76990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
77990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Override
78990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public ArrayList<View> getTrackedTargets() {
79990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        return targets;
80990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
81990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
82990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Override
83990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public void clearTargets() {
84990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        targets.clear();
85990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
86990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount
87990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    @Override
88990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    public Rect getCapturedEpicenter() {
89990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount        return mEpicenter[0];
90990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount    }
91990e6fc0326f5948736650c0cb71b6002d443c9cGeorge Mount}
92