| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License |
| */ |
| |
| package com.android.systemui.statusbar; |
| |
| import android.content.Context; |
| import android.util.AttributeSet; |
| import android.view.animation.AnimationUtils; |
| import android.view.animation.Interpolator; |
| import com.android.systemui.R; |
| |
| /** |
| * The view representing the separation between important and less important notifications |
| */ |
| public class SpeedBumpView extends ExpandableView { |
| |
| private final int mSpeedBumpHeight; |
| private AlphaOptimizedView mLine; |
| private boolean mIsVisible = true; |
| private final Interpolator mFastOutSlowInInterpolator; |
| |
| public SpeedBumpView(Context context, AttributeSet attrs) { |
| super(context, attrs); |
| mSpeedBumpHeight = getResources() |
| .getDimensionPixelSize(R.dimen.speed_bump_height); |
| mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(getContext(), |
| android.R.interpolator.fast_out_slow_in); |
| } |
| |
| @Override |
| protected void onFinishInflate() { |
| super.onFinishInflate(); |
| mLine = (AlphaOptimizedView) findViewById(R.id.speedbump_line); |
| } |
| |
| @Override |
| protected int getInitialHeight() { |
| return mSpeedBumpHeight; |
| } |
| |
| @Override |
| public int getIntrinsicHeight() { |
| return mSpeedBumpHeight; |
| } |
| |
| @Override |
| protected void onLayout(boolean changed, int left, int top, int right, int bottom) { |
| super.onLayout(changed, left, top, right, bottom); |
| mLine.setPivotX(mLine.getWidth() / 2); |
| mLine.setPivotY(mLine.getHeight() / 2); |
| setOutlineProvider(null); |
| } |
| |
| @Override |
| protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { |
| measureChildren(widthMeasureSpec, heightMeasureSpec); |
| int height = mSpeedBumpHeight; |
| setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), height); |
| } |
| |
| @Override |
| public boolean isTransparent() { |
| return true; |
| } |
| |
| public void performVisibilityAnimation(boolean nowVisible, long delay) { |
| animateDivider(nowVisible, delay, null /* onFinishedRunnable */); |
| } |
| |
| /** |
| * Animate the divider to a new visibility. |
| * |
| * @param nowVisible should it now be visible |
| * @param delay the delay after the animation should start |
| * @param onFinishedRunnable A runnable which should be run when the animation is |
| * finished. |
| */ |
| public void animateDivider(boolean nowVisible, long delay, Runnable onFinishedRunnable) { |
| if (nowVisible != mIsVisible) { |
| // Animate dividers |
| float endValue = nowVisible ? 1.0f : 0.0f; |
| mLine.animate() |
| .alpha(endValue) |
| .setStartDelay(delay) |
| .scaleX(endValue) |
| .scaleY(endValue) |
| .setInterpolator(mFastOutSlowInInterpolator) |
| .withEndAction(onFinishedRunnable); |
| mIsVisible = nowVisible; |
| } else { |
| if (onFinishedRunnable != null) { |
| onFinishedRunnable.run(); |
| } |
| } |
| } |
| |
| public void setInvisible() { |
| mLine.setAlpha(0.0f); |
| mLine.setScaleX(0.0f); |
| mLine.setScaleY(0.0f); |
| mIsVisible = false; |
| } |
| |
| @Override |
| public void performRemoveAnimation(long duration, float translationDirection, |
| Runnable onFinishedRunnable) { |
| // TODO: Use duration |
| performVisibilityAnimation(false, 0 /* delay */); |
| } |
| |
| @Override |
| public void performAddAnimation(long delay, long duration) { |
| // TODO: Use duration |
| performVisibilityAnimation(true, delay); |
| } |
| } |