blob: 4febab1899af98281fada945bb533116c58d0bb8 [file] [log] [blame]
/*
* Copyright (C) 2014 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;
import android.view.View;
import android.view.ViewPropertyAnimator;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import java.util.HashMap;
import java.util.Map;
/**
* A state of a {@link com.android.systemui.statusbar.SpeedBumpDotsLayout}
*/
public class SpeedBumpDotsState {
public static final int HIDDEN = 1;
public static final int SHOWN = 2;
private static final int VISIBILITY_ANIMATION_DELAY_PER_ELEMENT = 80;
private final SpeedBumpDotsLayout mHostView;
private final HashMap<View, ViewState> mStateMap = new HashMap<View, ViewState>();
private final Interpolator mFastOutSlowInInterpolator;
private int mActiveState = 0;
public SpeedBumpDotsState(SpeedBumpDotsLayout hostLayout) {
mHostView = hostLayout;
mFastOutSlowInInterpolator = AnimationUtils
.loadInterpolator(hostLayout.getContext(),
android.R.interpolator.fast_out_slow_in);
}
public SpeedBumpDotsLayout getHostView() {
return mHostView;
}
public void resetViewStates() {
int numChildren = mHostView.getChildCount();
for (int i = 0; i < numChildren; i++) {
View child = mHostView.getChildAt(i);
ViewState viewState = mStateMap.get(child);
if (viewState == null) {
viewState = new ViewState();
mStateMap.put(child, viewState);
}
}
}
public ViewState getViewStateForView(View requestedView) {
return mStateMap.get(requestedView);
}
public void apply() {
int childCount = mHostView.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = mHostView.getChildAt(i);
ViewState viewState = mStateMap.get(child);
child.setTranslationX(viewState.xTranslation);
child.setTranslationY(viewState.yTranslation);
child.setScaleX(viewState.scale);
child.setScaleY(viewState.scale);
child.setAlpha(viewState.alpha);
}
}
public void animateToState() {
int childCount = mHostView.getChildCount();
int middleIndex = (childCount - 1) / 2;
long delayPerElement = VISIBILITY_ANIMATION_DELAY_PER_ELEMENT;
boolean isAppearing = getActiveState() == SHOWN;
boolean isDisappearing = getActiveState() == HIDDEN;
for (int i = 0; i < childCount; i++) {
int delayIndex;
if (i <= middleIndex) {
delayIndex = i * 2;
} else {
int distToMiddle = i - middleIndex;
delayIndex = (childCount - 1) - (distToMiddle - 1) * 2;
}
long startDelay = 0;
if (isAppearing || isDisappearing) {
if (isDisappearing) {
delayIndex = childCount - 1 - delayIndex;
}
startDelay = delayIndex * delayPerElement;
}
View child = mHostView.getChildAt(i);
ViewState viewState = mStateMap.get(child);
child.animate().setInterpolator(mFastOutSlowInInterpolator)
.setStartDelay(startDelay)
.alpha(viewState.alpha)
.translationX(viewState.xTranslation)
.translationY(viewState.yTranslation)
.scaleX(viewState.scale).scaleY(viewState.scale);
}
}
public int getActiveState() {
return mActiveState;
}
public void setActiveState(int mActiveState) {
this.mActiveState = mActiveState;
}
public static class ViewState {
float xTranslation;
float yTranslation;
float alpha;
float scale;
}
}