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