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