VolumeDialogMotion.java revision 22def3d4ebe47d39a03447f46a945228f565a1bf
122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock/* 222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock * Copyright (C) 2015 The Android Open Source Project 322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock * 422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock * you may not use this file except in compliance with the License. 622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock * You may obtain a copy of the License at 722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock * 822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock * http://www.apache.org/licenses/LICENSE-2.0 922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock * 1022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock * Unless required by applicable law or agreed to in writing, software 1122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 1222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock * See the License for the specific language governing permissions and 1422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock * limitations under the License. 1522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock */ 1622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 1722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockpackage com.android.systemui.volume; 1822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 1922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.animation.Animator; 2022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.animation.AnimatorListenerAdapter; 2122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.animation.TimeInterpolator; 2222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.animation.ValueAnimator; 2322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.animation.ValueAnimator.AnimatorUpdateListener; 2422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.app.Dialog; 2522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.content.DialogInterface; 2622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.content.DialogInterface.OnDismissListener; 2722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.content.DialogInterface.OnShowListener; 2822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.os.Handler; 2922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.util.Log; 3022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.view.View; 3122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.view.ViewGroup; 3222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockimport android.view.animation.PathInterpolator; 3322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 3422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlockpublic class VolumeDialogMotion { 3522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private static final String TAG = Util.logTag(VolumeDialogMotion.class); 3622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 3722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private static final float ANIMATION_SCALE = 1.0f; 3822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private static final int PRE_DISMISS_DELAY = 50; 3922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private static final int POST_SHOW_DELAY = 200; 4022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 4122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final Dialog mDialog; 4222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final View mDialogView; 4322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final ViewGroup mContents; // volume rows + zen footer 4422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final View mChevron; 4522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final Handler mHandler = new Handler(); 4622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final Callback mCallback; 4722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 4822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private boolean mAnimating; // show or dismiss animation is running 4922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private boolean mShowing; // show animation is running 5022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private boolean mDismissing; // dismiss animation is running 5122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private ValueAnimator mChevronPositionAnimator; 5222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private ValueAnimator mContentsPositionAnimator; 5322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 5422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public VolumeDialogMotion(Dialog dialog, View dialogView, ViewGroup contents, View chevron, 5522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock Callback callback) { 5622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialog = dialog; 5722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialogView = dialogView; 5822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContents = contents; 5922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevron = chevron; 6022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mCallback = callback; 6122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialog.setOnDismissListener(new OnDismissListener() { 6222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 6322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onDismiss(DialogInterface dialog) { 6422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mDialog.onDismiss"); 6522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 6622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }); 6722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialog.setOnShowListener(new OnShowListener() { 6822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 6922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onShow(DialogInterface dialog) { 7022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mDialog.onShow"); 7122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock final int h = mDialogView.getHeight(); 7222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialogView.setTranslationY(-h); 7322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mHandler.postDelayed(new Runnable() { 7422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 7522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void run() { 7622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock startShowAnimation(); 7722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 7822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }, POST_SHOW_DELAY); 7922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 8022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }); 8122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 8222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 8322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public boolean isAnimating() { 8422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return mAnimating; 8522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 8622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 8722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private void setShowing(boolean showing) { 8822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (showing == mShowing) return; 8922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mShowing = showing; 9022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mShowing = " + mShowing); 9122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock updateAnimating(); 9222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 9322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 9422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private void setDismissing(boolean dismissing) { 9522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (dismissing == mDismissing) return; 9622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDismissing = dismissing; 9722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mDismissing = " + mDismissing); 9822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock updateAnimating(); 9922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 10022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 10122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private void updateAnimating() { 10222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock final boolean animating = mShowing || mDismissing; 10322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (animating == mAnimating) return; 10422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mAnimating = animating; 10522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mAnimating = " + mAnimating); 10622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mCallback != null) { 10722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mCallback.onAnimatingChanged(mAnimating); 10822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 10922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 11022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 11122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void startShow() { 11222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "startShow"); 11322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mShowing) return; 11422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock setShowing(true); 11522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mDismissing) { 11622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialogView.animate().cancel(); 11722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock setDismissing(false); 11822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock startShowAnimation(); 11922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return; 12022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 12122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mDialog.show()"); 12222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialog.show(); 12322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 12422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 12522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private int chevronDistance() { 12622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return mChevron.getHeight() / 6; 12722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 12822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 12922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private void startShowAnimation() { 13022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "startShowAnimation"); 13122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialogView.animate() 13222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .translationY(0) 13322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setDuration(scaledDuration(300)) 13422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setInterpolator(new LogDecelerateInterpolator()) 13522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setListener(null) 13622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setUpdateListener(new AnimatorUpdateListener() { 13722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 13822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationUpdate(ValueAnimator animation) { 13922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mChevronPositionAnimator == null) return; 14022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock // reposition chevron 14122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock final float v = (Float) mChevronPositionAnimator.getAnimatedValue(); 14222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock final int posY = (Integer) mChevron.getTag(); 14322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevron.setTranslationY(posY + v + -mDialogView.getTranslationY()); 14422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }}) 14522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .start(); 14622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 14722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContentsPositionAnimator = ValueAnimator.ofFloat(-chevronDistance(), 0) 14822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setDuration(scaledDuration(400)); 14922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContentsPositionAnimator.addListener(new AnimatorListenerAdapter() { 15022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private boolean mCancelled; 15122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 15222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 15322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationEnd(Animator animation) { 15422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mCancelled) return; 15522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "show.onAnimationEnd"); 15622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock setShowing(false); 15722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 15822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 15922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationCancel(Animator animation) { 16022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "show.onAnimationCancel"); 16122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mCancelled = true; 16222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 16322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }); 16422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContentsPositionAnimator.addUpdateListener(new AnimatorUpdateListener() { 16522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 16622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationUpdate(ValueAnimator animation) { 16722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock float v = (Float) animation.getAnimatedValue(); 16822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContents.setTranslationY(v + -mDialogView.getTranslationY()); 16922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 17022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }); 17122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContentsPositionAnimator.setInterpolator(new LogDecelerateInterpolator()); 17222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContentsPositionAnimator.start(); 17322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 17422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContents.setAlpha(0); 17522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContents.animate() 17622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .alpha(1) 17722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setDuration(scaledDuration(150)) 17822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setInterpolator(new PathInterpolator(0f, 0f, .2f, 1f)) 17922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .start(); 18022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 18122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevronPositionAnimator = ValueAnimator.ofFloat(-chevronDistance(), 0) 18222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setDuration(scaledDuration(250)); 18322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevronPositionAnimator.setInterpolator(new PathInterpolator(.4f, 0f, .2f, 1f)); 18422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevronPositionAnimator.start(); 18522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 18622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevron.setAlpha(0); 18722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevron.animate() 18822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .alpha(1) 18922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setStartDelay(scaledDuration(50)) 19022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setDuration(scaledDuration(150)) 19122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setInterpolator(new PathInterpolator(.4f, 0f, 1f, 1f)) 19222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .start(); 19322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 19422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 19522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void startDismiss(final Runnable onComplete) { 19622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "startDismiss"); 19722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mDismissing) return; 19822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock setDismissing(true); 19922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mShowing) { 20022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialogView.animate().cancel(); 20122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContentsPositionAnimator.cancel(); 20222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContents.animate().cancel(); 20322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevronPositionAnimator.cancel(); 20422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevron.animate().cancel(); 20522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock setShowing(false); 20622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 20722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialogView.animate() 20822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .translationY(-mDialogView.getHeight()) 20922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setDuration(scaledDuration(250)) 21022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setInterpolator(new LogAccelerateInterpolator()) 21122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setUpdateListener(new AnimatorUpdateListener() { 21222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 21322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationUpdate(ValueAnimator animation) { 21422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContents.setTranslationY(-mDialogView.getTranslationY()); 21522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock int posY = (Integer) mChevron.getTag(); 21622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevron.setTranslationY(posY + -mDialogView.getTranslationY()); 21722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 21822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }) 21922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setListener(new AnimatorListenerAdapter() { 22022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private boolean mCancelled; 22122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 22222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationEnd(Animator animation) { 22322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mCancelled) return; 22422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "dismiss.onAnimationEnd"); 22522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mHandler.postDelayed(new Runnable() { 22622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 22722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void run() { 22822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mDialog.dismiss()"); 22922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialog.dismiss(); 23022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock onComplete.run(); 23122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock setDismissing(false); 23222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 23322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }, PRE_DISMISS_DELAY); 23422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 23522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 23622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 23722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationCancel(Animator animation) { 23822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "dismiss.onAnimationCancel"); 23922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mCancelled = true; 24022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 24122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }).start(); 24222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 24322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 24422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private static int scaledDuration(int base) { 24522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return (int) (base * ANIMATION_SCALE); 24622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 24722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 24822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private static final class LogDecelerateInterpolator implements TimeInterpolator { 24922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final float mBase; 25022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final float mDrift; 25122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final float mTimeScale; 25222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final float mOutputScale; 25322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 25422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private LogDecelerateInterpolator() { 25522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock this(400f, 1.4f, 0); 25622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 25722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 25822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private LogDecelerateInterpolator(float base, float timeScale, float drift) { 25922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mBase = base; 26022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDrift = drift; 26122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mTimeScale = 1f / timeScale; 26222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 26322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mOutputScale = 1f / computeLog(1f); 26422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 26522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 26622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private float computeLog(float t) { 26722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return 1f - (float) Math.pow(mBase, -t * mTimeScale) + (mDrift * t); 26822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 26922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 27022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 27122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public float getInterpolation(float t) { 27222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return computeLog(t) * mOutputScale; 27322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 27422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 27522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 27622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private static final class LogAccelerateInterpolator implements TimeInterpolator { 27722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final int mBase; 27822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final int mDrift; 27922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final float mLogScale; 28022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 28122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private LogAccelerateInterpolator() { 28222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock this(100, 0); 28322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 28422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 28522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private LogAccelerateInterpolator(int base, int drift) { 28622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mBase = base; 28722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDrift = drift; 28822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mLogScale = 1f / computeLog(1, mBase, mDrift); 28922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 29022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 29122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private static float computeLog(float t, int base, int drift) { 29222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return (float) -Math.pow(base, -t) + 1 + (drift * t); 29322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 29422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 29522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 29622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public float getInterpolation(float t) { 29722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return 1 - computeLog(1 - t, mBase, mDrift) * mLogScale; 29822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 29922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 30022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 30122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public interface Callback { 30222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock void onAnimatingChanged(boolean animating); 30322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 30422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock} 305