blob: 8463e069abc1ebc63e1458b529d4b65891d7910d [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.systemui.statusbar.notification;
import android.util.Pools;
import android.view.NotificationHeaderView;
import android.view.View;
import com.android.systemui.statusbar.CrossFadeHelper;
/**
* A transform state of a text view.
*/
public class HeaderTransformState extends TransformState {
private static Pools.SimplePool<HeaderTransformState> sInstancePool
= new Pools.SimplePool<>(40);
private View mExpandButton;
private View mWorkProfileIcon;
private TransformState mWorkProfileState;
@Override
public void initFrom(View view) {
super.initFrom(view);
if (view instanceof NotificationHeaderView) {
NotificationHeaderView header = (NotificationHeaderView) view;
mExpandButton = header.getExpandButton();
mWorkProfileState = TransformState.obtain();
mWorkProfileIcon = header.getWorkProfileIcon();
mWorkProfileState.initFrom(mWorkProfileIcon);
}
}
@Override
public boolean transformViewTo(TransformState otherState, float transformationAmount) {
// if the transforming notification has a header, we have ensured that it looks the same
// but the expand button, so lets fade just that one and transform the work profile icon.
if (!(mTransformedView instanceof NotificationHeaderView)) {
return false;
}
NotificationHeaderView header = (NotificationHeaderView) mTransformedView;
int childCount = header.getChildCount();
for (int i = 0; i < childCount; i++) {
View headerChild = header.getChildAt(i);
if (headerChild.getVisibility() == View.GONE) {
continue;
}
if (headerChild != mExpandButton) {
headerChild.setVisibility(View.INVISIBLE);
} else {
CrossFadeHelper.fadeOut(mExpandButton, transformationAmount);
}
}
return true;
}
@Override
public void transformViewFrom(TransformState otherState, float transformationAmount) {
// if the transforming notification has a header, we have ensured that it looks the same
// but the expand button, so lets fade just that one and transform the work profile icon.
if (!(mTransformedView instanceof NotificationHeaderView)) {
return;
}
NotificationHeaderView header = (NotificationHeaderView) mTransformedView;
header.setVisibility(View.VISIBLE);
header.setAlpha(1.0f);
int childCount = header.getChildCount();
for (int i = 0; i < childCount; i++) {
View headerChild = header.getChildAt(i);
if (headerChild.getVisibility() == View.GONE) {
continue;
}
if (headerChild == mExpandButton) {
CrossFadeHelper.fadeIn(mExpandButton, transformationAmount);
} else {
headerChild.setVisibility(View.VISIBLE);
if (headerChild == mWorkProfileIcon) {
mWorkProfileState.transformViewFullyFrom(
((HeaderTransformState) otherState).mWorkProfileState,
transformationAmount);
}
}
}
return;
}
public static HeaderTransformState obtain() {
HeaderTransformState instance = sInstancePool.acquire();
if (instance != null) {
return instance;
}
return new HeaderTransformState();
}
@Override
public void recycle() {
super.recycle();
sInstancePool.release(this);
}
@Override
protected void reset() {
super.reset();
mExpandButton = null;
mWorkProfileState = null;
if (mWorkProfileState != null) {
mWorkProfileState.recycle();
mWorkProfileState = null;
}
}
public void setVisible(boolean visible) {
super.setVisible(visible);
if (!(mTransformedView instanceof NotificationHeaderView)) {
return;
}
NotificationHeaderView header = (NotificationHeaderView) mTransformedView;
int childCount = header.getChildCount();
for (int i = 0; i < childCount; i++) {
View headerChild = header.getChildAt(i);
if (headerChild.getVisibility() == View.GONE) {
continue;
}
headerChild.animate().cancel();
headerChild.setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
if (headerChild == mExpandButton) {
headerChild.setAlpha(visible ? 1.0f : 0.0f);
}
if (headerChild == mWorkProfileIcon) {
headerChild.setTranslationX(0);
headerChild.setTranslationY(0);
}
}
}
@Override
public void prepareFadeIn() {
super.prepareFadeIn();
if (!(mTransformedView instanceof NotificationHeaderView)) {
return;
}
NotificationHeaderView header = (NotificationHeaderView) mTransformedView;
int childCount = header.getChildCount();
for (int i = 0; i < childCount; i++) {
View headerChild = header.getChildAt(i);
if (headerChild.getVisibility() == View.GONE) {
continue;
}
headerChild.animate().cancel();
headerChild.setVisibility(View.VISIBLE);
headerChild.setAlpha(1.0f);
if (headerChild == mWorkProfileIcon) {
headerChild.setTranslationX(0);
headerChild.setTranslationY(0);
}
}
}
}