SystemBarScrimViews.java revision 8873754f66527d2cc9feab295dd4eef23298212a
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 17package com.android.systemui.recents.views; 18 19import android.animation.AnimatorListenerAdapter; 20import android.app.Activity; 21import android.content.Context; 22import android.view.View; 23import android.view.ViewPropertyAnimator; 24 25import com.android.systemui.Interpolators; 26import com.android.systemui.R; 27import com.android.systemui.recents.events.activity.DismissRecentsToHomeAnimationStarted; 28import com.android.systemui.recents.events.activity.EnterRecentsWindowAnimationCompletedEvent; 29 30/** Manages the scrims for the various system bars. */ 31public class SystemBarScrimViews { 32 33 Context mContext; 34 35 View mNavBarScrimView; 36 37 boolean mHasNavBarScrim; 38 boolean mShouldAnimateNavBarScrim; 39 40 int mNavBarScrimEnterDuration; 41 42 public SystemBarScrimViews(Activity activity) { 43 mContext = activity; 44 mNavBarScrimView = activity.findViewById(R.id.nav_bar_scrim); 45 mNavBarScrimEnterDuration = activity.getResources().getInteger( 46 R.integer.recents_nav_bar_scrim_enter_duration); 47 } 48 49 /** 50 * Prepares the scrim views for animating when entering Recents. This will be called before 51 * the first draw. 52 */ 53 public void prepareEnterRecentsAnimation(boolean hasNavBarScrim, boolean animateNavBarScrim) { 54 mHasNavBarScrim = hasNavBarScrim; 55 mShouldAnimateNavBarScrim = animateNavBarScrim; 56 57 mNavBarScrimView.setVisibility(mHasNavBarScrim && !mShouldAnimateNavBarScrim ? 58 View.VISIBLE : View.INVISIBLE); 59 } 60 61 /** 62 * Animates the nav bar scrim visibility. 63 */ 64 public void animateNavBarScrimVisibility(boolean visible, AnimationProps animation) { 65 int toY = 0; 66 if (visible) { 67 mNavBarScrimView.setVisibility(View.VISIBLE); 68 mNavBarScrimView.setTranslationY(mNavBarScrimView.getMeasuredHeight()); 69 } else { 70 toY = mNavBarScrimView.getMeasuredHeight(); 71 } 72 if (animation != AnimationProps.IMMEDIATE) { 73 mNavBarScrimView.animate() 74 .translationY(toY) 75 .setDuration(animation.getDuration(AnimationProps.BOUNDS)) 76 .setInterpolator(animation.getInterpolator(AnimationProps.BOUNDS)) 77 .start(); 78 } else { 79 mNavBarScrimView.setTranslationY(toY); 80 } 81 } 82 83 /**** EventBus events ****/ 84 85 /** 86 * Starts animating the scrim views when entering Recents. 87 */ 88 public final void onBusEvent(EnterRecentsWindowAnimationCompletedEvent event) { 89 if (mHasNavBarScrim) { 90 AnimationProps animation = mShouldAnimateNavBarScrim 91 ? new AnimationProps() 92 .setDuration(AnimationProps.BOUNDS, mNavBarScrimEnterDuration) 93 .setInterpolator(AnimationProps.BOUNDS, Interpolators.DECELERATE_QUINT) 94 : AnimationProps.IMMEDIATE; 95 animateNavBarScrimVisibility(true, animation); 96 } 97 } 98 99 /** 100 * Starts animating the scrim views when leaving Recents (either via launching a task, or 101 * going home). 102 */ 103 public final void onBusEvent(DismissRecentsToHomeAnimationStarted event) { 104 if (mHasNavBarScrim) { 105 AnimationProps animation = new AnimationProps() 106 .setDuration(AnimationProps.BOUNDS, 107 TaskStackAnimationHelper.EXIT_TO_HOME_TRANSLATION_DURATION) 108 .setInterpolator(AnimationProps.BOUNDS, Interpolators.FAST_OUT_SLOW_IN); 109 animateNavBarScrimVisibility(false, animation); 110 } 111 } 112} 113