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
24a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggiimport com.android.systemui.statusbar.phone.PhoneStatusBar;
25a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
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    private boolean mWillBeGone;
36a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
37a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public StackScrollerDecorView(Context context, AttributeSet attrs) {
38a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        super(context, attrs);
39a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
40a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
41a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    @Override
42a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    protected void onFinishInflate() {
43a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        super.onFinishInflate();
44a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        mContent = findContentView();
45a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        setInvisible();
46a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
47a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
48a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    @Override
49a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
50a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        super.onLayout(changed, left, top, right, bottom);
51a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        setOutlineProvider(null);
52a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
53a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
54a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    @Override
55a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public boolean isTransparent() {
56a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        return true;
57a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
58a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
59a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public void performVisibilityAnimation(boolean nowVisible) {
60a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        animateText(nowVisible, null /* onFinishedRunnable */);
61a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
62a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
63a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public void performVisibilityAnimation(boolean nowVisible, Runnable onFinishedRunnable) {
64a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        animateText(nowVisible, onFinishedRunnable);
65a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
66a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
67a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public boolean isVisible() {
68a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        return mIsVisible || mAnimating;
69a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
70a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
71a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    /**
72a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi     * Animate the text to a new visibility.
73a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi     *
74a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi     * @param nowVisible should it now be visible
75a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi     * @param onFinishedRunnable A runnable which should be run when the animation is
76a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi     *        finished.
77a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi     */
78a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    private void animateText(boolean nowVisible, final Runnable onFinishedRunnable) {
79a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        if (nowVisible != mIsVisible) {
80a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            // Animate text
81a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            float endValue = nowVisible ? 1.0f : 0.0f;
82a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            Interpolator interpolator;
83a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            if (nowVisible) {
84a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                interpolator = PhoneStatusBar.ALPHA_IN;
85a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            } else {
86a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                interpolator = PhoneStatusBar.ALPHA_OUT;
87a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            }
88a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            mAnimating = true;
89a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            mContent.animate()
90a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                    .alpha(endValue)
91a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                    .setInterpolator(interpolator)
92a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                    .setDuration(260)
93a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                    .withEndAction(new Runnable() {
94a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                        @Override
95a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                        public void run() {
96a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                            mAnimating = false;
97a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                            if (onFinishedRunnable != null) {
98a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                                onFinishedRunnable.run();
99a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                            }
100a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                        }
101a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                    });
102a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            mIsVisible = nowVisible;
103a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        } else {
104a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            if (onFinishedRunnable != null) {
105a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi                onFinishedRunnable.run();
106a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            }
107a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        }
108a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
109a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
110a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public void setInvisible() {
111a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        mContent.setAlpha(0.0f);
112a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        mIsVisible = false;
113a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
114a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
115a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    @Override
116a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public void performRemoveAnimation(long duration, float translationDirection,
117a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi            Runnable onFinishedRunnable) {
118a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        // TODO: Use duration
119a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        performVisibilityAnimation(false);
120a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
121a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
122a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    @Override
123a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public void performAddAnimation(long delay, long duration) {
124a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        // TODO: use delay and duration
125a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        performVisibilityAnimation(true);
126a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
127a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
128a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    @Override
129a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public boolean hasOverlappingRendering() {
130a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        return false;
131a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
132a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
133a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public void cancelAnimation() {
134a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        mContent.animate().cancel();
135a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
136a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
137a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public boolean willBeGone() {
138a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        return mWillBeGone;
139a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
140a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
141a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    public void setWillBeGone(boolean willBeGone) {
142a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi        mWillBeGone = willBeGone;
143a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    }
144a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi
145a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi    protected abstract View findContentView();
146a2052ea218386877e6d5d2136483a62b2b31f774Jorim Jaggi}
147