Visibility.java revision 4e5a72756eb66c31baf1a3054c66520f1c3f5b8c
1733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki/*
2733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * Copyright (C) 2016 The Android Open Source Project
3733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki *
4733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * Licensed under the Apache License, Version 2.0 (the "License");
5733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * you may not use this file except in compliance with the License.
6733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * You may obtain a copy of the License at
7733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki *
8733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki *      http://www.apache.org/licenses/LICENSE-2.0
9733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki *
10733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * Unless required by applicable law or agreed to in writing, software
11733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * distributed under the License is distributed on an "AS IS" BASIS,
12733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * See the License for the specific language governing permissions and
14733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * limitations under the License.
15733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki */
16733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
17733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakipackage android.support.transition;
18733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
19733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakiimport android.animation.Animator;
20733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakiimport android.support.annotation.NonNull;
214e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Arakiimport android.support.annotation.Nullable;
22733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakiimport android.view.View;
23733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakiimport android.view.ViewGroup;
24733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
25733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki/**
26733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * This transition tracks changes to the visibility of target views in the
27733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * start and end scenes. Visibility is determined not just by the
28733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * {@link View#setVisibility(int)} state of views, but also whether
29733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * views exist in the current view hierarchy. The class is intended to be a
309562a3b639225d406d736b64a12e2d75459259e3Alan Viverette * utility for subclasses such as {@link Fade}, which use this visibility
31733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * information to determine the specific animations to run when visibility
32733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * changes occur. Subclasses should implement one or both of the methods
33733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * {@link #onAppear(ViewGroup, TransitionValues, int, TransitionValues, int)},
34733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki * {@link #onDisappear(ViewGroup, TransitionValues, int, TransitionValues, int)},
35733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki */
364e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Arakipublic abstract class Visibility extends Transition {
37733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
384e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    private static final String PROPNAME_VISIBILITY = "android:visibility:visibility";
394e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    private static final String PROPNAME_PARENT = "android:visibility:parent";
404e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
414e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    private static final String[] sTransitionProperties = {
424e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            PROPNAME_VISIBILITY,
434e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            PROPNAME_PARENT,
444e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    };
454e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
464e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    private static class VisibilityInfo {
474e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        boolean mVisibilityChange;
484e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        boolean mFadeIn;
494e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        int mStartVisibility;
504e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        int mEndVisibility;
514e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        ViewGroup mStartParent;
524e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        ViewGroup mEndParent;
53733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
54733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
554e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public Visibility() {
56733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
57733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
584e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Nullable
59733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    @Override
604e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public String[] getTransitionProperties() {
614e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return sTransitionProperties;
624e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
634e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
644e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    private void captureValues(TransitionValues transitionValues) {
654e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        int visibility = transitionValues.view.getVisibility();
664e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        transitionValues.values.put(PROPNAME_VISIBILITY, visibility);
674e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        transitionValues.values.put(PROPNAME_PARENT, transitionValues.view.getParent());
68733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
69733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
70733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    @Override
71733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    public void captureStartValues(@NonNull TransitionValues transitionValues) {
724e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        captureValues(transitionValues);
734e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
744e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
754e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
764e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public void captureEndValues(@NonNull TransitionValues transitionValues) {
774e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        captureValues(transitionValues);
78733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
79733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
80733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    /**
81733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * Returns whether the view is 'visible' according to the given values
82733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * object. This is determined by testing the same properties in the values
83733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * object that are used to determine whether the object is appearing or
84733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * disappearing in the {@link
85733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * Transition#createAnimator(ViewGroup, TransitionValues, TransitionValues)}
86733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * method. This method can be called by, for example, subclasses that want
87733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * to know whether the object is visible in the same way that Visibility
88733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * determines it for the actual animation.
89733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     *
90733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param values The TransitionValues object that holds the information by
91733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     *               which visibility is determined.
92733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @return True if the view reference by <code>values</code> is visible,
93733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * false otherwise.
94733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     */
95733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    public boolean isVisible(TransitionValues values) {
964e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        if (values == null) {
974e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            return false;
984e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
994e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        int visibility = (Integer) values.values.get(PROPNAME_VISIBILITY);
1004e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        View parent = (View) values.values.get(PROPNAME_PARENT);
1014e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
1024e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return visibility == View.VISIBLE && parent != null;
1034e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
1044e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
1054e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    private VisibilityInfo getVisibilityChangeInfo(TransitionValues startValues,
1064e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            TransitionValues endValues) {
1074e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        final VisibilityInfo visInfo = new VisibilityInfo();
1084e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        visInfo.mVisibilityChange = false;
1094e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        visInfo.mFadeIn = false;
1104e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        if (startValues != null) {
1114e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            visInfo.mStartVisibility = (Integer) startValues.values.get(PROPNAME_VISIBILITY);
1124e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            visInfo.mStartParent = (ViewGroup) startValues.values.get(PROPNAME_PARENT);
1134e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        } else {
1144e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            visInfo.mStartVisibility = -1;
1154e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            visInfo.mStartParent = null;
1164e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
1174e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        if (endValues != null) {
1184e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            visInfo.mEndVisibility = (Integer) endValues.values.get(PROPNAME_VISIBILITY);
1194e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            visInfo.mEndParent = (ViewGroup) endValues.values.get(PROPNAME_PARENT);
1204e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        } else {
1214e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            visInfo.mEndVisibility = -1;
1224e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            visInfo.mEndParent = null;
1234e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
1244e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        if (startValues != null && endValues != null) {
1254e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            if (visInfo.mStartVisibility == visInfo.mEndVisibility
1264e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    && visInfo.mStartParent == visInfo.mEndParent) {
1274e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                return visInfo;
1284e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            } else {
1294e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                if (visInfo.mStartVisibility != visInfo.mEndVisibility) {
1304e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    if (visInfo.mStartVisibility == View.VISIBLE) {
1314e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                        visInfo.mFadeIn = false;
1324e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                        visInfo.mVisibilityChange = true;
1334e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    } else if (visInfo.mEndVisibility == View.VISIBLE) {
1344e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                        visInfo.mFadeIn = true;
1354e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                        visInfo.mVisibilityChange = true;
1364e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    }
1374e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    // no visibilityChange if going between INVISIBLE and GONE
1384e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                } else /* if (visInfo.mStartParent != visInfo.mEndParent) */ {
1394e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    if (visInfo.mEndParent == null) {
1404e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                        visInfo.mFadeIn = false;
1414e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                        visInfo.mVisibilityChange = true;
1424e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    } else if (visInfo.mStartParent == null) {
1434e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                        visInfo.mFadeIn = true;
1444e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                        visInfo.mVisibilityChange = true;
1454e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    }
1464e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                }
1474e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            }
1484e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
1494e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        if (startValues == null) {
1504e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            visInfo.mFadeIn = true;
1514e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            visInfo.mVisibilityChange = true;
1524e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        } else if (endValues == null) {
1534e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            visInfo.mFadeIn = false;
1544e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            visInfo.mVisibilityChange = true;
1554e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
1564e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return visInfo;
1574e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    }
1584e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki
1594e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Nullable
1604e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @Override
1614e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    public Animator createAnimator(@NonNull ViewGroup sceneRoot,
1624e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            @Nullable TransitionValues startValues, @Nullable TransitionValues endValues) {
1634e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        VisibilityInfo visInfo = getVisibilityChangeInfo(startValues, endValues);
1644e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        if (visInfo.mVisibilityChange) {
1654e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            // Only transition views that are either targets of this transition
1664e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            // or whose parent hierarchies remain stable between scenes
1674e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            boolean isTarget = false;
1684e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            if (mTargets.size() > 0 || mTargetIds.size() > 0) {
1694e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                View startView = startValues != null ? startValues.view : null;
1704e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                View endView = endValues != null ? endValues.view : null;
1714e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                int startId = startView != null ? startView.getId() : -1;
1724e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                int endId = endView != null ? endView.getId() : -1;
1734e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                isTarget = isValidTarget(startView, startId) || isValidTarget(endView, endId);
1744e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            }
1754e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            if (isTarget || ((visInfo.mStartParent != null || visInfo.mEndParent != null))) {
1764e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                if (visInfo.mFadeIn) {
1774e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    return onAppear(sceneRoot, startValues, visInfo.mStartVisibility,
1784e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                            endValues, visInfo.mEndVisibility);
1794e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                } else {
1804e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    return onDisappear(sceneRoot, startValues, visInfo.mStartVisibility,
1814e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                            endValues, visInfo.mEndVisibility
1824e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                    );
1834e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki                }
1844e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki            }
1854e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        }
1864e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return null;
187733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
188733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
189733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    /**
190733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * The default implementation of this method does nothing. Subclasses
191733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * should override if they need to create an Animator when targets appear.
192733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * The method should only be called by the Visibility class; it is
193733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * not intended to be called from external classes.
194733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     *
195733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param sceneRoot       The root of the transition hierarchy
196733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param startValues     The target values in the start scene
197733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param startVisibility The target visibility in the start scene
198733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param endValues       The target values in the end scene
199733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param endVisibility   The target visibility in the end scene
200733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @return An Animator to be started at the appropriate time in the
201733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * overall transition for this scene change. A null value means no animation
202733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * should be run.
203733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     */
2044e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @SuppressWarnings("UnusedParameters")
205733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    public Animator onAppear(ViewGroup sceneRoot, TransitionValues startValues, int startVisibility,
206733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki            TransitionValues endValues, int endVisibility) {
2074e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return null;
208733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
209733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
210733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    /**
211733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * The default implementation of this method does nothing. Subclasses
212733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * should override if they need to create an Animator when targets disappear.
213733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * The method should only be called by the Visibility class; it is
214733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * not intended to be called from external classes.
215733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     *
216733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param sceneRoot       The root of the transition hierarchy
217733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param startValues     The target values in the start scene
218733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param startVisibility The target visibility in the start scene
219733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param endValues       The target values in the end scene
220733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param endVisibility   The target visibility in the end scene
221733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @return An Animator to be started at the appropriate time in the
222733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * overall transition for this scene change. A null value means no animation
223733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * should be run.
224733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     */
2254e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki    @SuppressWarnings("UnusedParameters")
226733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    public Animator onDisappear(ViewGroup sceneRoot, TransitionValues startValues,
227733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki            int startVisibility, TransitionValues endValues, int endVisibility) {
2284e5a72756eb66c31baf1a3054c66520f1c3f5b8cYuichi Araki        return null;
229733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
230733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
231733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    // TODO: Implement API 21; onAppear (4 params), onDisappear (4 params), getMode, setMode
232733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    // TODO: Implement API 23; isTransitionRequired
233733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
234733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki}
235