blob: 1130b6de254447059ef29dbe64ebc8e65baa3df7 [file] [log] [blame]
/*
* Copyright (C) 2015 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.phone;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.view.HapticFeedbackConstants;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import com.android.keyguard.AlphaOptimizedImageButton;
import com.android.systemui.Interpolators;
public class SettingsButton extends AlphaOptimizedImageButton {
private static final boolean TUNER_ENABLE_AVAILABLE = false;
private static final long LONG_PRESS_LENGTH = 1000;
private static final long ACCEL_LENGTH = 750;
private static final long FULL_SPEED_LENGTH = 375;
private static final long RUN_DURATION = 350;
private boolean mUpToSpeed;
private ObjectAnimator mAnimator;
private float mSlop;
public SettingsButton(Context context, AttributeSet attrs) {
super(context, attrs);
mSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();
}
public boolean isAnimating() {
return mAnimator != null && mAnimator.isRunning();
}
public boolean isTunerClick() {
return mUpToSpeed;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
if (TUNER_ENABLE_AVAILABLE) postDelayed(mLongPressCallback, LONG_PRESS_LENGTH);
break;
case MotionEvent.ACTION_UP:
if (mUpToSpeed) {
startExitAnimation();
} else {
cancelLongClick();
}
break;
case MotionEvent.ACTION_CANCEL:
cancelLongClick();
break;
case MotionEvent.ACTION_MOVE:
float x = event.getX();
float y = event.getY();
if ((x < -mSlop) || (y < -mSlop) || (x > getWidth() + mSlop)
|| (y > getHeight() + mSlop)) {
cancelLongClick();
}
break;
}
return super.onTouchEvent(event);
}
private void cancelLongClick() {
cancelAnimation();
mUpToSpeed = false;
removeCallbacks(mLongPressCallback);
}
private void cancelAnimation() {
if (mAnimator != null) {
mAnimator.removeAllListeners();
mAnimator.cancel();
mAnimator = null;
}
}
private void startExitAnimation() {
animate()
.translationX(((View) getParent().getParent()).getWidth() - getX())
.alpha(0)
.setDuration(RUN_DURATION)
.setInterpolator(AnimationUtils.loadInterpolator(mContext,
android.R.interpolator.accelerate_cubic))
.setListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
setAlpha(1f);
setTranslationX(0);
cancelLongClick();
}
@Override
public void onAnimationCancel(Animator animation) {
}
})
.start();
}
protected void startAccelSpin() {
cancelAnimation();
mAnimator = ObjectAnimator.ofFloat(this, View.ROTATION, 0, 360);
mAnimator.setInterpolator(AnimationUtils.loadInterpolator(mContext,
android.R.interpolator.accelerate_quad));
mAnimator.setDuration(ACCEL_LENGTH);
mAnimator.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
startContinuousSpin();
}
@Override
public void onAnimationCancel(Animator animation) {
}
});
mAnimator.start();
}
protected void startContinuousSpin() {
cancelAnimation();
performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
mUpToSpeed = true;
mAnimator = ObjectAnimator.ofFloat(this, View.ROTATION, 0, 360);
mAnimator.setInterpolator(Interpolators.LINEAR);
mAnimator.setDuration(FULL_SPEED_LENGTH);
mAnimator.setRepeatCount(Animation.INFINITE);
mAnimator.start();
}
private final Runnable mLongPressCallback = new Runnable() {
@Override
public void run() {
startAccelSpin();
}
};
}