Visibility.java revision 9562a3b639225d406d736b64a12e2d75459259e3
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.os.Build;
21733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakiimport android.support.annotation.NonNull;
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 */
36733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Arakipublic abstract class Visibility extends Transition implements VisibilityInterface {
37733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
38733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    public Visibility() {
39733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki        this(false);
40733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
41733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
42733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    Visibility(boolean deferred) {
43733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki        super(true);
44733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki        if (!deferred) {
45733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki            if (Build.VERSION.SDK_INT >= 19) {
46733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki                mImpl = new VisibilityKitKat();
47733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki            } else {
48733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki                mImpl = new VisibilityIcs();
49733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki            }
50733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki            mImpl.init(this);
51733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki        }
52733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
53733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
54733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    @Override
55733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    public void captureEndValues(@NonNull TransitionValues transitionValues) {
56733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki        mImpl.captureEndValues(transitionValues);
57733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
58733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
59733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    @Override
60733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    public void captureStartValues(@NonNull TransitionValues transitionValues) {
61733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki        mImpl.captureStartValues(transitionValues);
62733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
63733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
64733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    /**
65733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * Returns whether the view is 'visible' according to the given values
66733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * object. This is determined by testing the same properties in the values
67733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * object that are used to determine whether the object is appearing or
68733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * disappearing in the {@link
69733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * Transition#createAnimator(ViewGroup, TransitionValues, TransitionValues)}
70733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * method. This method can be called by, for example, subclasses that want
71733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * to know whether the object is visible in the same way that Visibility
72733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * determines it for the actual animation.
73733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     *
74733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param values The TransitionValues object that holds the information by
75733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     *               which visibility is determined.
76733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @return True if the view reference by <code>values</code> is visible,
77733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * false otherwise.
78733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     */
79733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    @Override
80733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    public boolean isVisible(TransitionValues values) {
81733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki        return ((VisibilityImpl) mImpl).isVisible(values);
82733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
83733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
84733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    /**
85733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * The default implementation of this method does nothing. Subclasses
86733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * should override if they need to create an Animator when targets appear.
87733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * The method should only be called by the Visibility class; it is
88733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * not intended to be called from external classes.
89733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     *
90733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param sceneRoot       The root of the transition hierarchy
91733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param startValues     The target values in the start scene
92733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param startVisibility The target visibility in the start scene
93733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param endValues       The target values in the end scene
94733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param endVisibility   The target visibility in the end scene
95733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @return An Animator to be started at the appropriate time in the
96733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * overall transition for this scene change. A null value means no animation
97733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * should be run.
98733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     */
99733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    @Override
100733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    public Animator onAppear(ViewGroup sceneRoot, TransitionValues startValues, int startVisibility,
101733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki            TransitionValues endValues, int endVisibility) {
102733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki        return ((VisibilityImpl) mImpl).onAppear(sceneRoot, startValues, startVisibility,
103733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki                endValues, endVisibility);
104733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
105733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
106733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    /**
107733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * The default implementation of this method does nothing. Subclasses
108733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * should override if they need to create an Animator when targets disappear.
109733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * The method should only be called by the Visibility class; it is
110733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * not intended to be called from external classes.
111733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     *
112733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param sceneRoot       The root of the transition hierarchy
113733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param startValues     The target values in the start scene
114733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param startVisibility The target visibility in the start scene
115733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param endValues       The target values in the end scene
116733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @param endVisibility   The target visibility in the end scene
117733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * @return An Animator to be started at the appropriate time in the
118733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * overall transition for this scene change. A null value means no animation
119733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     * should be run.
120733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki     */
121733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    @Override
122733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    public Animator onDisappear(ViewGroup sceneRoot, TransitionValues startValues,
123733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki            int startVisibility, TransitionValues endValues, int endVisibility) {
124733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki        return ((VisibilityImpl) mImpl).onDisappear(sceneRoot, startValues, startVisibility,
125733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki                endValues, endVisibility);
126733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    }
127733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
128733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    // TODO: Implement API 21; onAppear (4 params), onDisappear (4 params), getMode, setMode
129733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki    // TODO: Implement API 23; isTransitionRequired
130733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki
131733b5aaadf1b1f5dc3038876dbfbabb79f649b03Yuichi Araki}
132