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 4022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final Dialog mDialog; 4122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final View mDialogView; 4222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final ViewGroup mContents; // volume rows + zen footer 4322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final View mChevron; 4422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final Handler mHandler = new Handler(); 4522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final Callback mCallback; 4622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 4722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private boolean mAnimating; // show or dismiss animation is running 4822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private boolean mShowing; // show animation is running 4922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private boolean mDismissing; // dismiss animation is running 5022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private ValueAnimator mChevronPositionAnimator; 5122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private ValueAnimator mContentsPositionAnimator; 5222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 5322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public VolumeDialogMotion(Dialog dialog, View dialogView, ViewGroup contents, View chevron, 5422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock Callback callback) { 5522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialog = dialog; 5622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialogView = dialogView; 5722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContents = contents; 5822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevron = chevron; 5922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mCallback = callback; 6022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialog.setOnDismissListener(new OnDismissListener() { 6122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 6222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onDismiss(DialogInterface dialog) { 6322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mDialog.onDismiss"); 6422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 6522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }); 6622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialog.setOnShowListener(new OnShowListener() { 6722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 6822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onShow(DialogInterface dialog) { 6922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mDialog.onShow"); 7022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock final int h = mDialogView.getHeight(); 7122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialogView.setTranslationY(-h); 726d712e06f7c35d4120ce8ded5961d3bb97c44cabJorim Jaggi startShowAnimation(); 7322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 7422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }); 7522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 7622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 7722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public boolean isAnimating() { 7822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return mAnimating; 7922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 8022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 8122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private void setShowing(boolean showing) { 8222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (showing == mShowing) return; 8322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mShowing = showing; 8422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mShowing = " + mShowing); 8522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock updateAnimating(); 8622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 8722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 8822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private void setDismissing(boolean dismissing) { 8922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (dismissing == mDismissing) return; 9022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDismissing = dismissing; 9122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mDismissing = " + mDismissing); 9222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock updateAnimating(); 9322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 9422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 9522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private void updateAnimating() { 9622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock final boolean animating = mShowing || mDismissing; 9722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (animating == mAnimating) return; 9822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mAnimating = animating; 9922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mAnimating = " + mAnimating); 10022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mCallback != null) { 10122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mCallback.onAnimatingChanged(mAnimating); 10222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 10322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 10422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 10522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void startShow() { 10622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "startShow"); 10722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mShowing) return; 10822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock setShowing(true); 10922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mDismissing) { 11022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialogView.animate().cancel(); 11122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock setDismissing(false); 11222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock startShowAnimation(); 11322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return; 11422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 11522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mDialog.show()"); 11622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialog.show(); 11722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 11822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 11922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private int chevronDistance() { 12022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return mChevron.getHeight() / 6; 12122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 12222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 1231a830f0d80433747399e72a98b3b6bfad4f321c3John Spurlock private int chevronPosY() { 1241a830f0d80433747399e72a98b3b6bfad4f321c3John Spurlock final Object tag = mChevron == null ? null : mChevron.getTag(); 1251a830f0d80433747399e72a98b3b6bfad4f321c3John Spurlock return tag == null ? 0 : (Integer) tag; 1261a830f0d80433747399e72a98b3b6bfad4f321c3John Spurlock } 1271a830f0d80433747399e72a98b3b6bfad4f321c3John Spurlock 12822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private void startShowAnimation() { 12922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "startShowAnimation"); 13022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialogView.animate() 13122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .translationY(0) 13222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setDuration(scaledDuration(300)) 13322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setInterpolator(new LogDecelerateInterpolator()) 13422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setListener(null) 13522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setUpdateListener(new AnimatorUpdateListener() { 13622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 13722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationUpdate(ValueAnimator animation) { 13822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mChevronPositionAnimator == null) return; 13922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock // reposition chevron 14022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock final float v = (Float) mChevronPositionAnimator.getAnimatedValue(); 1411a830f0d80433747399e72a98b3b6bfad4f321c3John Spurlock final int posY = chevronPosY(); 14222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevron.setTranslationY(posY + v + -mDialogView.getTranslationY()); 143027c7499d00ca880b9db0d35157e9e1a28323b58Julia Reynolds } 144027c7499d00ca880b9db0d35157e9e1a28323b58Julia Reynolds }) 145027c7499d00ca880b9db0d35157e9e1a28323b58Julia Reynolds .withEndAction(new Runnable() { 146027c7499d00ca880b9db0d35157e9e1a28323b58Julia Reynolds @Override 147027c7499d00ca880b9db0d35157e9e1a28323b58Julia Reynolds public void run() { 148027c7499d00ca880b9db0d35157e9e1a28323b58Julia Reynolds if (mChevronPositionAnimator == null) return; 149027c7499d00ca880b9db0d35157e9e1a28323b58Julia Reynolds // reposition chevron 150027c7499d00ca880b9db0d35157e9e1a28323b58Julia Reynolds final int posY = chevronPosY(); 151027c7499d00ca880b9db0d35157e9e1a28323b58Julia Reynolds mChevron.setTranslationY(posY + -mDialogView.getTranslationY()); 152027c7499d00ca880b9db0d35157e9e1a28323b58Julia Reynolds } 153027c7499d00ca880b9db0d35157e9e1a28323b58Julia Reynolds }) 15422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .start(); 15522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 15622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContentsPositionAnimator = ValueAnimator.ofFloat(-chevronDistance(), 0) 15722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setDuration(scaledDuration(400)); 15822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContentsPositionAnimator.addListener(new AnimatorListenerAdapter() { 15922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private boolean mCancelled; 16022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 16122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 16222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationEnd(Animator animation) { 16322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mCancelled) return; 16422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "show.onAnimationEnd"); 16522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock setShowing(false); 16622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 16722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 16822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationCancel(Animator animation) { 16922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "show.onAnimationCancel"); 17022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mCancelled = true; 17122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 17222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }); 17322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContentsPositionAnimator.addUpdateListener(new AnimatorUpdateListener() { 17422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 17522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationUpdate(ValueAnimator animation) { 17622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock float v = (Float) animation.getAnimatedValue(); 17722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContents.setTranslationY(v + -mDialogView.getTranslationY()); 17822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 17922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }); 18022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContentsPositionAnimator.setInterpolator(new LogDecelerateInterpolator()); 18122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContentsPositionAnimator.start(); 18222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 18322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContents.setAlpha(0); 18422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContents.animate() 18522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .alpha(1) 18622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setDuration(scaledDuration(150)) 18722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setInterpolator(new PathInterpolator(0f, 0f, .2f, 1f)) 18822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .start(); 18922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 19022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevronPositionAnimator = ValueAnimator.ofFloat(-chevronDistance(), 0) 19122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setDuration(scaledDuration(250)); 19222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevronPositionAnimator.setInterpolator(new PathInterpolator(.4f, 0f, .2f, 1f)); 19322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevronPositionAnimator.start(); 19422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 19522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevron.setAlpha(0); 19622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevron.animate() 19722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .alpha(1) 19822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setStartDelay(scaledDuration(50)) 19922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setDuration(scaledDuration(150)) 20022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setInterpolator(new PathInterpolator(.4f, 0f, 1f, 1f)) 20122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .start(); 20222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 20322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 20422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void startDismiss(final Runnable onComplete) { 20522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "startDismiss"); 20622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mDismissing) return; 20722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock setDismissing(true); 20822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mShowing) { 20922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialogView.animate().cancel(); 210dc005a8965133232c9605363c137405549819ab3John Spurlock if (mContentsPositionAnimator != null) { 211dc005a8965133232c9605363c137405549819ab3John Spurlock mContentsPositionAnimator.cancel(); 212dc005a8965133232c9605363c137405549819ab3John Spurlock } 21322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContents.animate().cancel(); 214dc005a8965133232c9605363c137405549819ab3John Spurlock if (mChevronPositionAnimator != null) { 215dc005a8965133232c9605363c137405549819ab3John Spurlock mChevronPositionAnimator.cancel(); 216dc005a8965133232c9605363c137405549819ab3John Spurlock } 21722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevron.animate().cancel(); 21822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock setShowing(false); 21922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 22022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialogView.animate() 22122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .translationY(-mDialogView.getHeight()) 22222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setDuration(scaledDuration(250)) 22322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setInterpolator(new LogAccelerateInterpolator()) 22422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setUpdateListener(new AnimatorUpdateListener() { 22522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 22622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationUpdate(ValueAnimator animation) { 22722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mContents.setTranslationY(-mDialogView.getTranslationY()); 2281a830f0d80433747399e72a98b3b6bfad4f321c3John Spurlock final int posY = chevronPosY(); 22922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mChevron.setTranslationY(posY + -mDialogView.getTranslationY()); 23022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 23122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }) 23222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock .setListener(new AnimatorListenerAdapter() { 23322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private boolean mCancelled; 23422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 23522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationEnd(Animator animation) { 23622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (mCancelled) return; 23722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "dismiss.onAnimationEnd"); 23822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mHandler.postDelayed(new Runnable() { 23922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 24022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void run() { 24122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "mDialog.dismiss()"); 24222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDialog.dismiss(); 24322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock onComplete.run(); 24422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock setDismissing(false); 24522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 24622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }, PRE_DISMISS_DELAY); 24722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 24822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 24922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 25022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public void onAnimationCancel(Animator animation) { 25122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock if (D.BUG) Log.d(TAG, "dismiss.onAnimationCancel"); 25222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mCancelled = true; 25322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 25422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock }).start(); 25522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 25622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 25722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private static int scaledDuration(int base) { 25822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return (int) (base * ANIMATION_SCALE); 25922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 26022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 26122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private static final class LogDecelerateInterpolator implements TimeInterpolator { 26222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final float mBase; 26322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final float mDrift; 26422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final float mTimeScale; 26522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final float mOutputScale; 26622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 26722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private LogDecelerateInterpolator() { 26822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock this(400f, 1.4f, 0); 26922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 27022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 27122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private LogDecelerateInterpolator(float base, float timeScale, float drift) { 27222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mBase = base; 27322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDrift = drift; 27422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mTimeScale = 1f / timeScale; 27522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 27622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mOutputScale = 1f / computeLog(1f); 27722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 27822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 27922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private float computeLog(float t) { 28022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return 1f - (float) Math.pow(mBase, -t * mTimeScale) + (mDrift * t); 28122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 28222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 28322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 28422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public float getInterpolation(float t) { 28522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return computeLog(t) * mOutputScale; 28622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 28722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 28822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 28922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private static final class LogAccelerateInterpolator implements TimeInterpolator { 29022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final int mBase; 29122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final int mDrift; 29222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private final float mLogScale; 29322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 29422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private LogAccelerateInterpolator() { 29522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock this(100, 0); 29622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 29722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 29822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private LogAccelerateInterpolator(int base, int drift) { 29922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mBase = base; 30022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mDrift = drift; 30122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock mLogScale = 1f / computeLog(1, mBase, mDrift); 30222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 30322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 30422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock private static float computeLog(float t, int base, int drift) { 30522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return (float) -Math.pow(base, -t) + 1 + (drift * t); 30622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 30722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 30822def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock @Override 30922def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public float getInterpolation(float t) { 31022def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock return 1 - computeLog(1 - t, mBase, mDrift) * mLogScale; 31122def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 31222def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 31322def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock 31422def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock public interface Callback { 31522def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock void onAnimatingChanged(boolean animating); 31622def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock } 31722def3d4ebe47d39a03447f46a945228f565a1bfJohn Spurlock} 318