1 /*
2  * Copyright (C) 2015 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.assist;
18 
19 import android.annotation.Nullable;
20 import android.content.Context;
21 import android.util.AttributeSet;
22 import android.view.View;
23 import android.widget.FrameLayout;
24 
25 import com.android.systemui.Interpolators;
26 import com.android.systemui.R;
27 
28 public class AssistOrbContainer extends FrameLayout {
29 
30     private static final long EXIT_START_DELAY = 150;
31 
32     private View mScrim;
33     private View mNavbarScrim;
34     private AssistOrbView mOrb;
35 
36     private boolean mAnimatingOut;
37 
AssistOrbContainer(Context context)38     public AssistOrbContainer(Context context) {
39         this(context, null);
40     }
41 
AssistOrbContainer(Context context, @Nullable AttributeSet attrs)42     public AssistOrbContainer(Context context, @Nullable AttributeSet attrs) {
43         this(context, attrs, 0);
44     }
45 
AssistOrbContainer(Context context, @Nullable AttributeSet attrs, int defStyleAttr)46     public AssistOrbContainer(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
47         super(context, attrs, defStyleAttr);
48     }
49 
50     @Override
onFinishInflate()51     protected void onFinishInflate() {
52         super.onFinishInflate();
53         mScrim = findViewById(R.id.assist_orb_scrim);
54         mNavbarScrim = findViewById(R.id.assist_orb_navbar_scrim);
55         mOrb = (AssistOrbView) findViewById(R.id.assist_orb);
56     }
57 
show(final boolean show, boolean animate)58     public void show(final boolean show, boolean animate) {
59         if (show) {
60             if (getVisibility() != View.VISIBLE) {
61                 setVisibility(View.VISIBLE);
62                 if (animate) {
63                     startEnterAnimation();
64                 } else {
65                     reset();
66                 }
67             }
68         } else {
69             if (animate) {
70                 startExitAnimation(new Runnable() {
71                     @Override
72                     public void run() {
73                         mAnimatingOut = false;
74                         setVisibility(View.GONE);
75                     }
76                 });
77             } else {
78                 setVisibility(View.GONE);
79             }
80         }
81     }
82 
reset()83     private void reset() {
84         mAnimatingOut = false;
85         mOrb.reset();
86         mScrim.setAlpha(1f);
87         mNavbarScrim.setAlpha(1f);
88     }
89 
startEnterAnimation()90     private void startEnterAnimation() {
91         if (mAnimatingOut) {
92             return;
93         }
94         mOrb.startEnterAnimation();
95         mScrim.setAlpha(0f);
96         mNavbarScrim.setAlpha(0f);
97         post(new Runnable() {
98             @Override
99             public void run() {
100                 mScrim.animate()
101                         .alpha(1f)
102                         .setDuration(300)
103                         .setStartDelay(0)
104                         .setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
105                 mNavbarScrim.animate()
106                         .alpha(1f)
107                         .setDuration(300)
108                         .setStartDelay(0)
109                         .setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN);
110             }
111         });
112     }
113 
startExitAnimation(final Runnable endRunnable)114     private void startExitAnimation(final Runnable endRunnable) {
115         if (mAnimatingOut) {
116             if (endRunnable != null) {
117                 endRunnable.run();
118             }
119             return;
120         }
121         mAnimatingOut = true;
122         mOrb.startExitAnimation(EXIT_START_DELAY);
123         mScrim.animate()
124                 .alpha(0f)
125                 .setDuration(250)
126                 .setStartDelay(EXIT_START_DELAY)
127                 .setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
128         mNavbarScrim.animate()
129                 .alpha(0f)
130                 .setDuration(250)
131                 .setStartDelay(EXIT_START_DELAY)
132                 .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
133                 .withEndAction(endRunnable);
134     }
135 
136     /**
137      * Whether the panel is showing, or, if it's animating, whether it will be
138      * when the animation is done.
139      */
isShowing()140     public boolean isShowing() {
141         return getVisibility() == View.VISIBLE && !mAnimatingOut;
142     }
143 
getOrb()144     public AssistOrbView getOrb() {
145         return mOrb;
146     }
147 }
148