SystemBarScrimViews.java revision cdbbb7e33033d7ae368aa5b7007ec2b20ebdaff1
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.view.Gravity;
20import android.view.LayoutInflater;
21import android.view.View;
22import android.view.ViewGroup;
23import android.widget.FrameLayout;
24import com.android.systemui.R;
25import com.android.systemui.recents.RecentsConfiguration;
26
27/** Manages the scrims for the various system bars. */
28public class SystemBarScrimViews {
29
30    RecentsConfiguration mConfig;
31
32    View mStatusBarScrimView;
33    View mNavBarScrimView;
34
35    boolean mHasNavBarScrim;
36    boolean mShouldAnimateStatusBarScrim;
37    boolean mHasStatusBarScrim;
38    boolean mShouldAnimateNavBarScrim;
39
40    public SystemBarScrimViews(RecentsConfiguration config) {
41        mConfig = config;
42    }
43
44    /** Inflates the scrim views */
45    public void inflate(LayoutInflater inflater, ViewGroup parent) {
46        mStatusBarScrimView = inflater.inflate(R.layout.recents_status_bar_scrim, parent, false);
47        mStatusBarScrimView.setLayoutParams(new FrameLayout.LayoutParams(
48                ViewGroup.LayoutParams.MATCH_PARENT,
49                ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.TOP));
50        mNavBarScrimView = inflater.inflate(R.layout.recents_nav_bar_scrim, parent, false);
51        mNavBarScrimView.setLayoutParams(new FrameLayout.LayoutParams(
52                ViewGroup.LayoutParams.MATCH_PARENT,
53                ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM));
54    }
55
56    /**
57     * Prepares the scrim views for animating when entering Recents. This will be called before
58     * the first draw.
59     */
60    public void prepareEnterRecentsAnimation() {
61        mHasNavBarScrim = mConfig.hasNavBarScrim();
62        mShouldAnimateNavBarScrim = mConfig.shouldAnimateNavBarScrim();
63        mHasStatusBarScrim = mConfig.hasStatusBarScrim();
64        mShouldAnimateStatusBarScrim = mConfig.shouldAnimateStatusBarScrim();
65
66        mNavBarScrimView.setVisibility(mHasNavBarScrim && !mShouldAnimateNavBarScrim ?
67                View.VISIBLE : View.INVISIBLE);
68        mStatusBarScrimView.setVisibility(mHasStatusBarScrim && !mShouldAnimateStatusBarScrim ?
69                View.VISIBLE : View.INVISIBLE);
70    }
71
72    /**
73     * Starts animating the scrim views when entering Recents.
74     */
75    public void startEnterRecentsAnimation() {
76        if (mHasStatusBarScrim && mShouldAnimateStatusBarScrim) {
77            mStatusBarScrimView.setTranslationY(-mStatusBarScrimView.getMeasuredHeight());
78            mStatusBarScrimView.animate()
79                    .translationY(0)
80                    .setStartDelay(mConfig.taskBarEnterAnimDelay)
81                    .setDuration(mConfig.navBarScrimEnterDuration)
82                    .setInterpolator(mConfig.quintOutInterpolator)
83                    .withStartAction(new Runnable() {
84                        @Override
85                        public void run() {
86                            mStatusBarScrimView.setVisibility(View.VISIBLE);
87                        }
88                    })
89                    .start();
90        }
91        if (mHasNavBarScrim && mShouldAnimateNavBarScrim) {
92            mNavBarScrimView.setTranslationY(mNavBarScrimView.getMeasuredHeight());
93            mNavBarScrimView.animate()
94                    .translationY(0)
95                    .setStartDelay(mConfig.taskBarEnterAnimDelay)
96                    .setDuration(mConfig.navBarScrimEnterDuration)
97                    .setInterpolator(mConfig.quintOutInterpolator)
98                    .withStartAction(new Runnable() {
99                        @Override
100                        public void run() {
101                            mNavBarScrimView.setVisibility(View.VISIBLE);
102                        }
103                    })
104                    .start();
105        }
106    }
107
108    /**
109     * Starts animating the scrim views when leaving Recents (either via launching a task, or
110     * going home).
111     */
112    public void startExitRecentsAnimation() {
113        if (mHasNavBarScrim && mShouldAnimateNavBarScrim) {
114            mNavBarScrimView.animate()
115                    .translationY(mNavBarScrimView.getMeasuredHeight())
116                    .setStartDelay(0)
117                    .setDuration(mConfig.taskBarExitAnimDuration)
118                    .setInterpolator(mConfig.fastOutSlowInInterpolator)
119                    .start();
120        }
121    }
122
123    /** Returns the status bar scrim view. */
124    public View getStatusBarScrimView() {
125        return mStatusBarScrimView;
126    }
127
128    /** Returns the nav bar scrim view. */
129    public View getNavBarScrimView() {
130        return mNavBarScrimView;
131    }
132}
133