Home | History | Annotate | Download | only in notification
      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
     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
     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
     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 
    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
    110     public void recycle() {
    111         super.recycle();
    112         sInstancePool.release(this);
    113     }
    114 
    115     @Override
    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
    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
    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