SystemBarScrimViews.java revision 2536c7ed446203ea12b38cf05a88e603f8d1b768
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.app.Activity; 20import android.content.Context; 21import android.view.View; 22import android.view.animation.AnimationUtils; 23import android.view.animation.Interpolator; 24import com.android.systemui.R; 25import com.android.systemui.recents.RecentsActivityLaunchState; 26import com.android.systemui.recents.RecentsConfiguration; 27 28/** Manages the scrims for the various system bars. */ 29public class SystemBarScrimViews { 30 31 Context mContext; 32 RecentsConfiguration mConfig; 33 34 View mStatusBarScrimView; 35 View mNavBarScrimView; 36 37 boolean mHasNavBarScrim; 38 boolean mShouldAnimateStatusBarScrim; 39 boolean mHasStatusBarScrim; 40 boolean mShouldAnimateNavBarScrim; 41 42 int mNavBarScrimEnterDuration; 43 44 Interpolator mFastOutSlowInInterpolator; 45 Interpolator mQuintOutInterpolator; 46 47 public SystemBarScrimViews(Activity activity) { 48 mContext = activity; 49 mConfig = RecentsConfiguration.getInstance(); 50 mStatusBarScrimView = activity.findViewById(R.id.status_bar_scrim); 51 mNavBarScrimView = activity.findViewById(R.id.nav_bar_scrim); 52 mNavBarScrimEnterDuration = activity.getResources().getInteger( 53 R.integer.recents_nav_bar_scrim_enter_duration); 54 mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(activity, 55 com.android.internal.R.interpolator.fast_out_slow_in); 56 mQuintOutInterpolator = AnimationUtils.loadInterpolator(activity, 57 com.android.internal.R.interpolator.decelerate_quint); 58 } 59 60 /** 61 * Prepares the scrim views for animating when entering Recents. This will be called before 62 * the first draw. 63 */ 64 public void prepareEnterRecentsAnimation() { 65 RecentsActivityLaunchState launchState = mConfig.getLaunchState(); 66 mHasNavBarScrim = launchState.hasNavBarScrim(); 67 mShouldAnimateNavBarScrim = launchState.shouldAnimateNavBarScrim(); 68 mHasStatusBarScrim = launchState.hasStatusBarScrim(); 69 mShouldAnimateStatusBarScrim = launchState.shouldAnimateStatusBarScrim(); 70 71 mNavBarScrimView.setVisibility(mHasNavBarScrim && !mShouldAnimateNavBarScrim ? 72 View.VISIBLE : View.INVISIBLE); 73 mStatusBarScrimView.setVisibility(mHasStatusBarScrim && !mShouldAnimateStatusBarScrim ? 74 View.VISIBLE : View.INVISIBLE); 75 } 76 77 /** 78 * Starts animating the scrim views when entering Recents. 79 */ 80 public void startEnterRecentsAnimation() { 81 RecentsActivityLaunchState launchState = mConfig.getLaunchState(); 82 int transitionEnterFromAppDelay = mContext.getResources().getInteger( 83 R.integer.recents_enter_from_app_transition_duration); 84 int transitionEnterFromHomeDelay = mContext.getResources().getInteger( 85 R.integer.recents_enter_from_home_transition_duration); 86 87 if (mHasStatusBarScrim && mShouldAnimateStatusBarScrim) { 88 mStatusBarScrimView.setTranslationY(-mStatusBarScrimView.getMeasuredHeight()); 89 mStatusBarScrimView.animate() 90 .translationY(0) 91 .setStartDelay(launchState.launchedFromHome ? 92 transitionEnterFromHomeDelay : 93 transitionEnterFromAppDelay) 94 .setDuration(mNavBarScrimEnterDuration) 95 .setInterpolator(mQuintOutInterpolator) 96 .withStartAction(new Runnable() { 97 @Override 98 public void run() { 99 mStatusBarScrimView.setVisibility(View.VISIBLE); 100 } 101 }) 102 .start(); 103 } 104 if (mHasNavBarScrim && mShouldAnimateNavBarScrim) { 105 mNavBarScrimView.setTranslationY(mNavBarScrimView.getMeasuredHeight()); 106 mNavBarScrimView.animate() 107 .translationY(0) 108 .setStartDelay(launchState.launchedFromHome ? 109 transitionEnterFromHomeDelay : 110 transitionEnterFromAppDelay) 111 .setDuration(mNavBarScrimEnterDuration) 112 .setInterpolator(mQuintOutInterpolator) 113 .withStartAction(new Runnable() { 114 @Override 115 public void run() { 116 mNavBarScrimView.setVisibility(View.VISIBLE); 117 } 118 }) 119 .start(); 120 } 121 } 122 123 /** 124 * Starts animating the scrim views when leaving Recents (either via launching a task, or 125 * going home). 126 */ 127 public void startExitRecentsAnimation() { 128 int taskViewExitToAppDuration = mContext.getResources().getInteger( 129 R.integer.recents_task_exit_to_app_duration); 130 if (mHasStatusBarScrim && mShouldAnimateStatusBarScrim) { 131 mStatusBarScrimView.animate() 132 .translationY(-mStatusBarScrimView.getMeasuredHeight()) 133 .setStartDelay(0) 134 .setDuration(taskViewExitToAppDuration) 135 .setInterpolator(mFastOutSlowInInterpolator) 136 .start(); 137 } 138 if (mHasNavBarScrim && mShouldAnimateNavBarScrim) { 139 mNavBarScrimView.animate() 140 .translationY(mNavBarScrimView.getMeasuredHeight()) 141 .setStartDelay(0) 142 .setDuration(taskViewExitToAppDuration) 143 .setInterpolator(mFastOutSlowInInterpolator) 144 .start(); 145 } 146 } 147} 148