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