1a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi/*
2a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi * Copyright (C) 2014 The Android Open Source Project
3a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi *
4a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License");
5a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi * you may not use this file except in compliance with the License.
6a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi * You may obtain a copy of the License at
7a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi *
8a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi *      http://www.apache.org/licenses/LICENSE-2.0
9a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi *
10a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi * Unless required by applicable law or agreed to in writing, software
11a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS,
12a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi * See the License for the specific language governing permissions and
14a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi * limitations under the License
15a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi */
16a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
17a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggipackage com.android.systemui.statusbar;
18a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
19a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggiimport android.content.Context;
20a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggiimport android.util.AttributeSet;
21a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggiimport android.view.View;
22a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggiimport android.view.animation.Interpolator;
23a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
24c0d7058b14c24cd07912f5629c26b39b7b4673d5Winsonimport com.android.systemui.Interpolators;
25c0d7058b14c24cd07912f5629c26b39b7b4673d5Winson
26a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi/**
27a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi * A common base class for all views in the notification stack scroller which don't have a
28a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi * background.
29a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi */
30a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggipublic abstract class StackScrollerDecorView extends ExpandableView {
31a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
32a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    protected View mContent;
33a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    private boolean mIsVisible;
34a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    private boolean mAnimating;
35a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
36a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public StackScrollerDecorView(Context context, AttributeSet attrs) {
37a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        super(context, attrs);
38a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
39a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
40a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    @Override
41a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    protected void onFinishInflate() {
42a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        super.onFinishInflate();
43a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        mContent = findContentView();
44a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        setInvisible();
45a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
46a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
47a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    @Override
48a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
49a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        super.onLayout(changed, left, top, right, bottom);
50a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        setOutlineProvider(null);
51a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
52a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
53a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    @Override
54a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public boolean isTransparent() {
55a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        return true;
56a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
57a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
58a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public void performVisibilityAnimation(boolean nowVisible) {
59a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        animateText(nowVisible, null /* onFinishedRunnable */);
60a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
61a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
62a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public void performVisibilityAnimation(boolean nowVisible, Runnable onFinishedRunnable) {
63a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        animateText(nowVisible, onFinishedRunnable);
64a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
65a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
66a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public boolean isVisible() {
67a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        return mIsVisible || mAnimating;
68a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
69a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
70a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    /**
71a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi     * Animate the text to a new visibility.
72a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi     *
73a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi     * @param nowVisible should it now be visible
74a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi     * @param onFinishedRunnable A runnable which should be run when the animation is
75a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi     *        finished.
76a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi     */
77a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    private void animateText(boolean nowVisible, final Runnable onFinishedRunnable) {
78a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        if (nowVisible != mIsVisible) {
79a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            // Animate text
80a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            float endValue = nowVisible ? 1.0f : 0.0f;
81a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            Interpolator interpolator;
82a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            if (nowVisible) {
83c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek                interpolator = Interpolators.ALPHA_IN;
84a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            } else {
85c18010f6720f606003cde3cd376ddacaca30f6e5Selim Cinek                interpolator = Interpolators.ALPHA_OUT;
86a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            }
87a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            mAnimating = true;
88a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            mContent.animate()
89a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                    .alpha(endValue)
90a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                    .setInterpolator(interpolator)
91a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                    .setDuration(260)
92a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                    .withEndAction(new Runnable() {
93a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                        @Override
94a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                        public void run() {
95a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                            mAnimating = false;
96a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                            if (onFinishedRunnable != null) {
97a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                                onFinishedRunnable.run();
98a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                            }
99a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                        }
100a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                    });
101a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            mIsVisible = nowVisible;
102a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        } else {
103a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            if (onFinishedRunnable != null) {
104a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                onFinishedRunnable.run();
105a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            }
106a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        }
107a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
108a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
109a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public void setInvisible() {
110a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        mContent.setAlpha(0.0f);
111a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        mIsVisible = false;
112a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
113a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
114a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    @Override
115a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public void performRemoveAnimation(long duration, float translationDirection,
116a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            Runnable onFinishedRunnable) {
117a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        // TODO: Use duration
118a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        performVisibilityAnimation(false);
119a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
120a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
121a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    @Override
122a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public void performAddAnimation(long delay, long duration) {
123a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        // TODO: use delay and duration
124a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        performVisibilityAnimation(true);
125a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
126a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
127a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    @Override
128a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public boolean hasOverlappingRendering() {
129a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        return false;
130a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
131a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
132a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public void cancelAnimation() {
133a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        mContent.animate().cancel();
134a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
135a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
136a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    protected abstract View findContentView();
137a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi}
138