• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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.statusbar.notification;
18 
19 import android.util.Pools;
20 import android.view.NotificationHeaderView;
21 import android.view.View;
22 
23 import com.android.systemui.statusbar.CrossFadeHelper;
24 
25 /**
26  * A transform state of a text view.
27 */
28 public class HeaderTransformState extends TransformState {
29 
30     private static Pools.SimplePool<HeaderTransformState> sInstancePool
31             = new Pools.SimplePool<>(40);
32     private View mExpandButton;
33     private View mWorkProfileIcon;
34     private TransformState mWorkProfileState;
35 
36     @Override
initFrom(View view)37     public void initFrom(View view) {
38         super.initFrom(view);
39         if (view instanceof NotificationHeaderView) {
40             NotificationHeaderView header = (NotificationHeaderView) view;
41             mExpandButton = header.getExpandButton();
42             mWorkProfileState = TransformState.obtain();
43             mWorkProfileIcon = header.getWorkProfileIcon();
44             mWorkProfileState.initFrom(mWorkProfileIcon);
45         }
46     }
47 
48     @Override
transformViewTo(TransformState otherState, float transformationAmount)49     public boolean transformViewTo(TransformState otherState, float transformationAmount) {
50         // if the transforming notification has a header, we have ensured that it looks the same
51         // but the expand button, so lets fade just that one and transform the work profile icon.
52         if (!(mTransformedView instanceof NotificationHeaderView)) {
53             return false;
54         }
55         NotificationHeaderView header = (NotificationHeaderView) mTransformedView;
56         int childCount = header.getChildCount();
57         for (int i = 0; i < childCount; i++) {
58             View headerChild = header.getChildAt(i);
59             if (headerChild.getVisibility() == View.GONE) {
60                 continue;
61             }
62             if (headerChild != mExpandButton) {
63                 headerChild.setVisibility(View.INVISIBLE);
64             } else {
65                 CrossFadeHelper.fadeOut(mExpandButton, transformationAmount);
66             }
67         }
68         return true;
69     }
70 
71     @Override
transformViewFrom(TransformState otherState, float transformationAmount)72     public void transformViewFrom(TransformState otherState, float transformationAmount) {
73         // if the transforming notification has a header, we have ensured that it looks the same
74         // but the expand button, so lets fade just that one and transform the work profile icon.
75         if (!(mTransformedView instanceof NotificationHeaderView)) {
76             return;
77         }
78         NotificationHeaderView header = (NotificationHeaderView) mTransformedView;
79         header.setVisibility(View.VISIBLE);
80         header.setAlpha(1.0f);
81         int childCount = header.getChildCount();
82         for (int i = 0; i < childCount; i++) {
83             View headerChild = header.getChildAt(i);
84             if (headerChild.getVisibility() == View.GONE) {
85                 continue;
86             }
87             if (headerChild == mExpandButton) {
88                 CrossFadeHelper.fadeIn(mExpandButton, transformationAmount);
89             } else {
90                 headerChild.setVisibility(View.VISIBLE);
91                 if (headerChild == mWorkProfileIcon) {
92                     mWorkProfileState.transformViewFullyFrom(
93                             ((HeaderTransformState) otherState).mWorkProfileState,
94                             transformationAmount);
95                 }
96             }
97         }
98         return;
99     }
100 
obtain()101     public static HeaderTransformState obtain() {
102         HeaderTransformState instance = sInstancePool.acquire();
103         if (instance != null) {
104             return instance;
105         }
106         return new HeaderTransformState();
107     }
108 
109     @Override
recycle()110     public void recycle() {
111         super.recycle();
112         sInstancePool.release(this);
113     }
114 
115     @Override
reset()116     protected void reset() {
117         super.reset();
118         mExpandButton = null;
119         mWorkProfileState = null;
120         if (mWorkProfileState != null) {
121             mWorkProfileState.recycle();
122             mWorkProfileState = null;
123         }
124     }
125 
126     @Override
setVisible(boolean visible, boolean force)127     public void setVisible(boolean visible, boolean force) {
128         super.setVisible(visible, force);
129         if (!(mTransformedView instanceof NotificationHeaderView)) {
130             return;
131         }
132         NotificationHeaderView header = (NotificationHeaderView) mTransformedView;
133         int childCount = header.getChildCount();
134         for (int i = 0; i < childCount; i++) {
135             View headerChild = header.getChildAt(i);
136             if (!force && headerChild.getVisibility() == View.GONE) {
137                 continue;
138             }
139             headerChild.animate().cancel();
140             if (headerChild.getVisibility() != View.GONE) {
141                 headerChild.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
142             }
143             if (headerChild == mExpandButton) {
144                 headerChild.setAlpha(visible ? 1.0f : 0.0f);
145             }
146             if (headerChild == mWorkProfileIcon) {
147                 headerChild.setTranslationX(0);
148                 headerChild.setTranslationY(0);
149             }
150         }
151     }
152 
153     @Override
prepareFadeIn()154     public void prepareFadeIn() {
155         super.prepareFadeIn();
156         if (!(mTransformedView instanceof NotificationHeaderView)) {
157             return;
158         }
159         NotificationHeaderView header = (NotificationHeaderView) mTransformedView;
160         int childCount = header.getChildCount();
161         for (int i = 0; i < childCount; i++) {
162             View headerChild = header.getChildAt(i);
163             if (headerChild.getVisibility() == View.GONE) {
164                 continue;
165             }
166             headerChild.animate().cancel();
167             headerChild.setVisibility(View.VISIBLE);
168             headerChild.setAlpha(1.0f);
169             if (headerChild == mWorkProfileIcon) {
170                 headerChild.setTranslationX(0);
171                 headerChild.setTranslationY(0);
172             }
173         }
174     }
175 }
176