blob: 07a1d4edaeaf50c2e5024c7808ae45dd794f5321 [file] [log] [blame]
Winson Chungcdbbb7e2014-06-24 12:11:49 -07001/*
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
Winson35f30502015-09-28 11:24:36 -070019import android.content.Context;
Winson Chungcdbbb7e2014-06-24 12:11:49 -070020import android.view.View;
Winsonc0d70582016-01-29 10:24:39 -080021
22import com.android.systemui.Interpolators;
Winson Chungcdbbb7e2014-06-24 12:11:49 -070023import com.android.systemui.R;
Winson500ba752016-03-30 11:59:22 -070024import com.android.systemui.recents.Recents;
25import com.android.systemui.recents.RecentsActivity;
26import com.android.systemui.recents.events.activity.ConfigurationChangedEvent;
Winson412e1802015-10-20 16:57:57 -070027import com.android.systemui.recents.events.activity.DismissRecentsToHomeAnimationStarted;
Winson3fb67562015-11-11 10:39:03 -080028import com.android.systemui.recents.events.activity.EnterRecentsWindowAnimationCompletedEvent;
Winson3b6ba1a2016-03-22 15:37:54 -070029import com.android.systemui.recents.events.ui.DismissAllTaskViewsEvent;
Winson500ba752016-03-30 11:59:22 -070030import com.android.systemui.recents.events.activity.MultiWindowStateChangedEvent;
31import com.android.systemui.recents.misc.SystemServicesProxy;
Winson Chungcdbbb7e2014-06-24 12:11:49 -070032
33/** Manages the scrims for the various system bars. */
34public class SystemBarScrimViews {
35
Winson500ba752016-03-30 11:59:22 -070036 private static final int DEFAULT_ANIMATION_DURATION = 150;
Winson Chungcdbbb7e2014-06-24 12:11:49 -070037
Winson500ba752016-03-30 11:59:22 -070038 private Context mContext;
Winson Chungcdbbb7e2014-06-24 12:11:49 -070039
Winson500ba752016-03-30 11:59:22 -070040 private View mNavBarScrimView;
Winson Chungcdbbb7e2014-06-24 12:11:49 -070041
Winson500ba752016-03-30 11:59:22 -070042 private boolean mHasNavBarScrim;
43 private boolean mShouldAnimateNavBarScrim;
Winson35f30502015-09-28 11:24:36 -070044
Winson500ba752016-03-30 11:59:22 -070045 private int mNavBarScrimEnterDuration;
46
47 public SystemBarScrimViews(RecentsActivity activity) {
Winson35f30502015-09-28 11:24:36 -070048 mContext = activity;
Winson Chung8e548f72014-06-24 14:40:53 -070049 mNavBarScrimView = activity.findViewById(R.id.nav_bar_scrim);
Winson500ba752016-03-30 11:59:22 -070050 mNavBarScrimView.forceHasOverlappingRendering(false);
Winson35f30502015-09-28 11:24:36 -070051 mNavBarScrimEnterDuration = activity.getResources().getInteger(
52 R.integer.recents_nav_bar_scrim_enter_duration);
Winson Chungcdbbb7e2014-06-24 12:11:49 -070053 }
54
55 /**
Winson500ba752016-03-30 11:59:22 -070056 * Updates the nav bar scrim.
57 */
58 public void updateNavBarScrim(boolean animateNavBarScrim, boolean hasStackTasks,
59 AnimationProps animation) {
60 prepareEnterRecentsAnimation(isNavBarScrimRequired(hasStackTasks), animateNavBarScrim);
61 if (animateNavBarScrim && animation != null) {
62 animateNavBarScrimVisibility(true, animation);
63 }
64 }
65
66 /**
Winson Chungcdbbb7e2014-06-24 12:11:49 -070067 * Prepares the scrim views for animating when entering Recents. This will be called before
Winsona1ededd2016-03-25 12:23:12 -070068 * the first draw, unless we are updating the scrim on configuration change.
Winson Chungcdbbb7e2014-06-24 12:11:49 -070069 */
Winson500ba752016-03-30 11:59:22 -070070 private void prepareEnterRecentsAnimation(boolean hasNavBarScrim, boolean animateNavBarScrim) {
Winson49df4202016-01-25 17:33:34 -080071 mHasNavBarScrim = hasNavBarScrim;
Winson Chung9a742902015-12-11 10:25:40 -050072 mShouldAnimateNavBarScrim = animateNavBarScrim;
Winson Chungcdbbb7e2014-06-24 12:11:49 -070073
74 mNavBarScrimView.setVisibility(mHasNavBarScrim && !mShouldAnimateNavBarScrim ?
75 View.VISIBLE : View.INVISIBLE);
Winson Chungcdbbb7e2014-06-24 12:11:49 -070076 }
77
Winson88737542016-02-17 13:27:33 -080078 /**
79 * Animates the nav bar scrim visibility.
80 */
Winson500ba752016-03-30 11:59:22 -070081 private void animateNavBarScrimVisibility(boolean visible, AnimationProps animation) {
Winson88737542016-02-17 13:27:33 -080082 int toY = 0;
83 if (visible) {
84 mNavBarScrimView.setVisibility(View.VISIBLE);
85 mNavBarScrimView.setTranslationY(mNavBarScrimView.getMeasuredHeight());
86 } else {
87 toY = mNavBarScrimView.getMeasuredHeight();
88 }
89 if (animation != AnimationProps.IMMEDIATE) {
90 mNavBarScrimView.animate()
91 .translationY(toY)
92 .setDuration(animation.getDuration(AnimationProps.BOUNDS))
93 .setInterpolator(animation.getInterpolator(AnimationProps.BOUNDS))
94 .start();
95 } else {
96 mNavBarScrimView.setTranslationY(toY);
97 }
98 }
99
Winson500ba752016-03-30 11:59:22 -0700100 /**
101 * @return Whether to show the nav bar scrim.
102 */
103 private boolean isNavBarScrimRequired(boolean hasStackTasks) {
104 SystemServicesProxy ssp = Recents.getSystemServices();
105 return hasStackTasks && !ssp.hasTransposedNavBar() && !ssp.hasDockedTask();
106 }
107
Winson412e1802015-10-20 16:57:57 -0700108 /**** EventBus events ****/
109
Winson Chungcdbbb7e2014-06-24 12:11:49 -0700110 /**
111 * Starts animating the scrim views when entering Recents.
112 */
Winson3fb67562015-11-11 10:39:03 -0800113 public final void onBusEvent(EnterRecentsWindowAnimationCompletedEvent event) {
Winson88737542016-02-17 13:27:33 -0800114 if (mHasNavBarScrim) {
115 AnimationProps animation = mShouldAnimateNavBarScrim
116 ? new AnimationProps()
117 .setDuration(AnimationProps.BOUNDS, mNavBarScrimEnterDuration)
118 .setInterpolator(AnimationProps.BOUNDS, Interpolators.DECELERATE_QUINT)
119 : AnimationProps.IMMEDIATE;
120 animateNavBarScrimVisibility(true, animation);
Winson Chungcdbbb7e2014-06-24 12:11:49 -0700121 }
122 }
123
124 /**
125 * Starts animating the scrim views when leaving Recents (either via launching a task, or
126 * going home).
127 */
Winson412e1802015-10-20 16:57:57 -0700128 public final void onBusEvent(DismissRecentsToHomeAnimationStarted event) {
Winson88737542016-02-17 13:27:33 -0800129 if (mHasNavBarScrim) {
Winson500ba752016-03-30 11:59:22 -0700130 AnimationProps animation = createBoundsAnimation(
131 TaskStackAnimationHelper.EXIT_TO_HOME_TRANSLATION_DURATION);
Winson88737542016-02-17 13:27:33 -0800132 animateNavBarScrimVisibility(false, animation);
Winson Chungcdbbb7e2014-06-24 12:11:49 -0700133 }
134 }
Winson3b6ba1a2016-03-22 15:37:54 -0700135
136 public final void onBusEvent(DismissAllTaskViewsEvent event) {
137 if (mHasNavBarScrim) {
Winson500ba752016-03-30 11:59:22 -0700138 AnimationProps animation = createBoundsAnimation(
139 TaskStackAnimationHelper.EXIT_TO_HOME_TRANSLATION_DURATION);
Winson3b6ba1a2016-03-22 15:37:54 -0700140 animateNavBarScrimVisibility(false, animation);
141 }
142 }
Winson500ba752016-03-30 11:59:22 -0700143
144 public final void onBusEvent(ConfigurationChangedEvent event) {
145 animateScrimToCurrentNavBarState(event.hasStackTasks);
146 }
147
148 public final void onBusEvent(MultiWindowStateChangedEvent event) {
149 animateScrimToCurrentNavBarState(event.hasStackTasks);
150 }
151
152 /**
153 * Animates the scrim to match the state of the current nav bar.
154 */
155 private void animateScrimToCurrentNavBarState(boolean hasStackTasks) {
156 boolean hasNavBarScrim = isNavBarScrimRequired(hasStackTasks);
157 if (mHasNavBarScrim != hasNavBarScrim) {
158 AnimationProps animation = hasNavBarScrim
159 ? createBoundsAnimation(DEFAULT_ANIMATION_DURATION)
160 : AnimationProps.IMMEDIATE;
161 animateNavBarScrimVisibility(hasNavBarScrim, animation);
162 }
163 mHasNavBarScrim = hasNavBarScrim;
164 }
165
166 /**
167 * @return a default animation to aniamte the bounds of the scrim.
168 */
169 private AnimationProps createBoundsAnimation(int duration) {
170 return new AnimationProps()
171 .setDuration(AnimationProps.BOUNDS, duration)
172 .setInterpolator(AnimationProps.BOUNDS, Interpolators.FAST_OUT_SLOW_IN);
173 }
Winson Chungcdbbb7e2014-06-24 12:11:49 -0700174}