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.view.View;
21faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haaseimport android.view.ViewGroup;
22faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
23faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase/**
24faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * This transition tracks changes to the visibility of target views in the
25faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * start and end scenes. Visibility is determined not just by the
26faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * {@link View#setVisibility(int)} state of views, but also whether
27faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * views exist in the current view hierarchy. The class is intended to be a
28faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * utility for subclasses such as {@link Fade}, which use this visibility
29faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase * information to determine the specific animations to run when visibility
3035a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase * changes occur. Subclasses should implement one or both of the methods
31d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * {@link #onAppear(ViewGroup, TransitionValues, int, TransitionValues, int)},
32d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase * {@link #onDisappear(ViewGroup, TransitionValues, int, TransitionValues, int)},
33faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase */
34faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haasepublic abstract class Visibility extends Transition {
35faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
36faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private static final String PROPNAME_VISIBILITY = "android:visibility:visibility";
37faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    private static final String PROPNAME_PARENT = "android:visibility:parent";
38af78bdd615ecd5ce9d41a6160ce9f53fa269b119Chet Haase    private static final String[] sTransitionProperties = {
39199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase            PROPNAME_VISIBILITY,
40199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase            PROPNAME_PARENT,
41199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    };
42faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
436ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    private static class VisibilityInfo {
446ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        boolean visibilityChange;
456ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        boolean fadeIn;
466ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        int startVisibility;
476ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        int endVisibility;
4835a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase        ViewGroup startParent;
4935a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase        ViewGroup endParent;
506ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
516ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase
52faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
53199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    public String[] getTransitionProperties() {
54199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        return sTransitionProperties;
55199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    }
56199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase
57d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    private void captureValues(TransitionValues transitionValues) {
58d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        int visibility = transitionValues.view.getVisibility();
59d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        transitionValues.values.put(PROPNAME_VISIBILITY, visibility);
60d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        transitionValues.values.put(PROPNAME_PARENT, transitionValues.view.getParent());
61d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
62d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
63d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    @Override
64d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureStartValues(TransitionValues transitionValues) {
65d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        captureValues(transitionValues);
66d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    }
67d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase
68199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    @Override
69d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public void captureEndValues(TransitionValues transitionValues) {
70d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase        captureValues(transitionValues);
71faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
72faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
73199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    /**
74199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase     * Returns whether the view is 'visible' according to the given values
75199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase     * object. This is determined by testing the same properties in the values
76199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase     * object that are used to determine whether the object is appearing or
77199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase     * disappearing in the {@link
78d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * Transition#createAnimator(ViewGroup, TransitionValues, TransitionValues)}
79199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase     * method. This method can be called by, for example, subclasses that want
80199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase     * to know whether the object is visible in the same way that Visibility
81199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase     * determines it for the actual animation.
82199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase     *
83199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase     * @param values The TransitionValues object that holds the information by
84199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase     * which visibility is determined.
85199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase     * @return True if the view reference by <code>values</code> is visible,
86199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase     * false otherwise.
87199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase     */
88199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    public boolean isVisible(TransitionValues values) {
89199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        if (values == null) {
90199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase            return false;
91199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        }
92199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        int visibility = (Integer) values.values.get(PROPNAME_VISIBILITY);
93199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        View parent = (View) values.values.get(PROPNAME_PARENT);
94199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase
95199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase        return visibility == View.VISIBLE && parent != null;
96199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase    }
97199acdfcc98e852975dd7edfbcb822ba5e73146fChet Haase
986ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    private VisibilityInfo getVisibilityChangeInfo(TransitionValues startValues,
99faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            TransitionValues endValues) {
1007660d121b2ef21164ed33e6091e5dd50f5d0f939Chet Haase        final VisibilityInfo visInfo = new VisibilityInfo();
1016ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        visInfo.visibilityChange = false;
1026ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        visInfo.fadeIn = false;
103faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (startValues != null) {
1046ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            visInfo.startVisibility = (Integer) startValues.values.get(PROPNAME_VISIBILITY);
10535a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase            visInfo.startParent = (ViewGroup) startValues.values.get(PROPNAME_PARENT);
106faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        } else {
1076ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            visInfo.startVisibility = -1;
1086ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            visInfo.startParent = null;
109faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
110faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (endValues != null) {
1116ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            visInfo.endVisibility = (Integer) endValues.values.get(PROPNAME_VISIBILITY);
11235a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase            visInfo.endParent = (ViewGroup) endValues.values.get(PROPNAME_PARENT);
113faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        } else {
1146ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            visInfo.endVisibility = -1;
1156ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            visInfo.endParent = null;
116faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
117faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (startValues != null && endValues != null) {
1186ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            if (visInfo.startVisibility == visInfo.endVisibility &&
1196ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                    visInfo.startParent == visInfo.endParent) {
1206ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                return visInfo;
121faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            } else {
1226ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                if (visInfo.startVisibility != visInfo.endVisibility) {
1236ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                    if (visInfo.startVisibility == View.VISIBLE) {
1246ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                        visInfo.fadeIn = false;
1256ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                        visInfo.visibilityChange = true;
1266ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                    } else if (visInfo.endVisibility == View.VISIBLE) {
1276ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                        visInfo.fadeIn = true;
1286ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                        visInfo.visibilityChange = true;
129faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    }
130faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    // no visibilityChange if going between INVISIBLE and GONE
1316ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                } else if (visInfo.startParent != visInfo.endParent) {
1326ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                    if (visInfo.endParent == null) {
1336ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                        visInfo.fadeIn = false;
1346ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                        visInfo.visibilityChange = true;
1356ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                    } else if (visInfo.startParent == null) {
1366ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                        visInfo.fadeIn = true;
1376ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase                        visInfo.visibilityChange = true;
138faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                    }
139faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                }
140faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
141faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
142faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        if (startValues == null) {
1436ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            visInfo.fadeIn = true;
1446ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            visInfo.visibilityChange = true;
145faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        } else if (endValues == null) {
1466ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            visInfo.fadeIn = false;
1476ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            visInfo.visibilityChange = true;
148faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
1496ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        return visInfo;
150faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
151faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
152faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    @Override
153d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
154faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            TransitionValues endValues) {
1556ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        VisibilityInfo visInfo = getVisibilityChangeInfo(startValues, endValues);
1566ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        if (visInfo.visibilityChange) {
15735a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase            // Only transition views that are either targets of this transition
15835a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase            // or whose parent hierarchies remain stable between scenes
15935a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase            boolean isTarget = false;
160d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase            if (mTargets.size() > 0 || mTargetIds.size() > 0) {
16135a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase                View startView = startValues != null ? startValues.view : null;
16235a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase                View endView = endValues != null ? endValues.view : null;
16335a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase                int startId = startView != null ? startView.getId() : -1;
16435a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase                int endId = endView != null ? endView.getId() : -1;
16535a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase                isTarget = isValidTarget(startView, startId) || isValidTarget(endView, endId);
16635a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase            }
167b7a7fc9d233bad507ce893882352618b13647058Chet Haase            if (isTarget || ((visInfo.startParent != null || visInfo.endParent != null))) {
16835a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase                if (visInfo.fadeIn) {
169d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                    return onAppear(sceneRoot, startValues, visInfo.startVisibility,
17035a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase                            endValues, visInfo.endVisibility);
17135a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase                } else {
172d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase                    return onDisappear(sceneRoot, startValues, visInfo.startVisibility,
17335a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase                            endValues, visInfo.endVisibility
17435a457a3bac0851a1fabd6cda58d1ea67f997b33Chet Haase                    );
175faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase                }
176faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase            }
177faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        }
178faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase        return null;
179faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
180faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
181faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
182faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * The default implementation of this method does nothing. Subclasses
183d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * should override if they need to create an Animator when targets appear.
184d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * The method should only be called by the Visibility class; it is
185d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * not intended to be called from external classes.
186faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     *
187d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param sceneRoot The root of the transition hierarchy
188d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param startValues The target values in the start scene
189d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param startVisibility The target visibility in the start scene
190d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param endValues The target values in the end scene
191d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param endVisibility The target visibility in the end scene
192d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return An Animator to be started at the appropriate time in the
193d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * overall transition for this scene change. A null value means no animation
194d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * should be run.
195faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
196d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public Animator onAppear(ViewGroup sceneRoot,
1976ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            TransitionValues startValues, int startVisibility,
1986ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            TransitionValues endValues, int endVisibility) {
1992ea7f8b9c5f903050d42c1af57406bf528979f45Chet Haase        return null;
200faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    }
201faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase
202faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase    /**
203faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     * The default implementation of this method does nothing. Subclasses
204d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * should override if they need to create an Animator when targets disappear.
205d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * The method should only be called by the Visibility class; it is
206d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * not intended to be called from external classes.
207d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     *
2086ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase     *
209d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param sceneRoot The root of the transition hierarchy
210d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param startValues The target values in the start scene
211d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param startVisibility The target visibility in the start scene
212d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param endValues The target values in the end scene
213d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @param endVisibility The target visibility in the end scene
214d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * @return An Animator to be started at the appropriate time in the
215d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * overall transition for this scene change. A null value means no animation
216d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase     * should be run.
217faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase     */
218d82c8ac4db7091d2e976af4c89a1734465d20cd2Chet Haase    public Animator onDisappear(ViewGroup sceneRoot,
2196ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            TransitionValues startValues, int startVisibility,
2206ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase            TransitionValues endValues, int endVisibility) {
2216ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase        return null;
2226ebe3de331efd00ba23bc4191d4a82cfa4c39160Chet Haase    }
223faebd8f0795b7d275fb4e503533c8c0c4a9acc21Chet Haase}
224