Home | History | Annotate | Download | only in statusbar
      1 /*
      2  * Copyright (C) 2014 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License
     15  */
     16 
     17 package com.android.systemui.statusbar;
     18 
     19 import android.content.Context;
     20 import android.util.AttributeSet;
     21 import android.view.animation.AnimationUtils;
     22 import android.view.animation.Interpolator;
     23 import com.android.systemui.R;
     24 
     25 /**
     26  * The view representing the separation between important and less important notifications
     27  */
     28 public class SpeedBumpView extends ExpandableView {
     29 
     30     private final int mSpeedBumpHeight;
     31     private AlphaOptimizedView mLine;
     32     private boolean mIsVisible = true;
     33     private final Interpolator mFastOutSlowInInterpolator;
     34 
     35     public SpeedBumpView(Context context, AttributeSet attrs) {
     36         super(context, attrs);
     37         mSpeedBumpHeight = getResources()
     38                 .getDimensionPixelSize(R.dimen.speed_bump_height);
     39         mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(getContext(),
     40                 android.R.interpolator.fast_out_slow_in);
     41     }
     42 
     43     @Override
     44     protected void onFinishInflate() {
     45         super.onFinishInflate();
     46         mLine = (AlphaOptimizedView) findViewById(R.id.speedbump_line);
     47     }
     48 
     49     @Override
     50     protected int getInitialHeight() {
     51         return mSpeedBumpHeight;
     52     }
     53 
     54     @Override
     55     public int getIntrinsicHeight() {
     56         return mSpeedBumpHeight;
     57     }
     58 
     59     @Override
     60     protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
     61         super.onLayout(changed, left, top, right, bottom);
     62         mLine.setPivotX(mLine.getWidth() / 2);
     63         mLine.setPivotY(mLine.getHeight() / 2);
     64         setOutlineProvider(null);
     65     }
     66 
     67     @Override
     68     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
     69         measureChildren(widthMeasureSpec, heightMeasureSpec);
     70         int height = mSpeedBumpHeight;
     71         setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), height);
     72     }
     73 
     74     @Override
     75     public boolean isTransparent() {
     76         return true;
     77     }
     78 
     79     public void performVisibilityAnimation(boolean nowVisible, long delay) {
     80         animateDivider(nowVisible, delay, null /* onFinishedRunnable */);
     81     }
     82 
     83     /**
     84      * Animate the divider to a new visibility.
     85      *
     86      * @param nowVisible should it now be visible
     87      * @param delay the delay after the animation should start
     88      * @param onFinishedRunnable A runnable which should be run when the animation is
     89      *        finished.
     90      */
     91     public void animateDivider(boolean nowVisible, long delay, Runnable onFinishedRunnable) {
     92         if (nowVisible != mIsVisible) {
     93             // Animate dividers
     94             float endValue = nowVisible ? 1.0f : 0.0f;
     95             mLine.animate()
     96                     .alpha(endValue)
     97                     .setStartDelay(delay)
     98                     .scaleX(endValue)
     99                     .scaleY(endValue)
    100                     .setInterpolator(mFastOutSlowInInterpolator)
    101                     .withEndAction(onFinishedRunnable);
    102             mIsVisible = nowVisible;
    103         } else {
    104             if (onFinishedRunnable != null) {
    105                 onFinishedRunnable.run();
    106             }
    107         }
    108     }
    109 
    110     public void setInvisible() {
    111         mLine.setAlpha(0.0f);
    112         mLine.setScaleX(0.0f);
    113         mLine.setScaleY(0.0f);
    114         mIsVisible = false;
    115     }
    116 
    117     @Override
    118     public void performRemoveAnimation(long duration, float translationDirection,
    119             Runnable onFinishedRunnable) {
    120         // TODO: Use duration
    121         performVisibilityAnimation(false, 0 /* delay */);
    122     }
    123 
    124     @Override
    125     public void performAddAnimation(long delay, long duration) {
    126         // TODO: Use duration
    127         performVisibilityAnimation(true, delay);
    128     }
    129 }
    130