TransitionHelperKitkat.java revision 95400e6d31a1ac09e48cb8944a79b7250484aa4c
155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout/*
255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Copyright (C) 2014 The Android Open Source Project
355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout *
455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * in compliance with the License. You may obtain a copy of the License at
655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout *
755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * http://www.apache.org/licenses/LICENSE-2.0
855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout *
955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * Unless required by applicable law or agreed to in writing, software distributed under the License
1055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
1155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * or implied. See the License for the specific language governing permissions and limitations under
1255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout * the License.
1355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout */
1495400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gupackage android.support.v17.leanback.transition;
1555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
163c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.animation.Animator;
176f8c0cb076a103d044b18fc58117e37d2319d9ebCraig Stoutimport android.animation.TimeInterpolator;
1855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.content.Context;
199240e796bc63422c28f2707840bd99c48573279bDake Guimport android.transition.AutoTransition;
203c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.transition.ChangeBounds;
213c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.transition.Fade;
2255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.transition.Scene;
2355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.transition.Transition;
2455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.transition.TransitionManager;
253c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.transition.TransitionSet;
263c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.transition.TransitionValues;
273c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.util.SparseBooleanArray;
283c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.util.SparseIntArray;
299240e796bc63422c28f2707840bd99c48573279bDake Guimport android.view.View;
3055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.view.ViewGroup;
3155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
323c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport java.util.ArrayList;
333c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport java.util.HashMap;
343c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
3595400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gufinal class TransitionHelperKitkat {
363c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
37e34cae48707e70442aca13e1b4ab55757292828dDake Gu    TransitionHelperKitkat() {
3855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
3955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
409240e796bc63422c28f2707840bd99c48573279bDake Gu    Object createScene(ViewGroup sceneRoot, Runnable enterAction) {
4155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        Scene scene = new Scene(sceneRoot);
429240e796bc63422c28f2707840bd99c48573279bDake Gu        scene.setEnterAction(enterAction);
439240e796bc63422c28f2707840bd99c48573279bDake Gu        return scene;
4455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
4555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
463c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    Object createTransitionSet(boolean sequential) {
473c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        TransitionSet set = new TransitionSet();
483c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        set.setOrdering(sequential ? TransitionSet.ORDERING_SEQUENTIAL :
493c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            TransitionSet.ORDERING_TOGETHER);
503c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        return set;
513c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
523c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
533c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void addTransition(Object transitionSet, Object transition) {
543c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((TransitionSet) transitionSet).addTransition((Transition) transition);
553c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
563c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
579240e796bc63422c28f2707840bd99c48573279bDake Gu    Object createAutoTransition() {
589240e796bc63422c28f2707840bd99c48573279bDake Gu        return new AutoTransition();
599240e796bc63422c28f2707840bd99c48573279bDake Gu    }
609240e796bc63422c28f2707840bd99c48573279bDake Gu
612f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    Object createSlide(SlideCallback callback) {
622f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu        Slide slide = new Slide();
632f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu        slide.setCallback(callback);
642f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu        return slide;
652f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    }
662f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu
673c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    Object createFadeTransition(int fadingMode) {
683c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        Fade fade = new Fade(fadingMode);
693c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        return fade;
703c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
713c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
723c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    /**
733c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu     * change bounds that support customized start delay.
743c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu     */
7595400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gu    static class CustomChangeBounds extends ChangeBounds {
763c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
773c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        int mDefaultStartDelay;
783c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        // View -> delay
793c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        final HashMap<View, Integer> mViewStartDelays = new HashMap<View, Integer>();
803c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        // id -> delay
813c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        final SparseIntArray mIdStartDelays = new SparseIntArray();
823c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        // Class.getName() -> delay
833c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        final HashMap<String, Integer> mClassStartDelays = new HashMap<String, Integer>();
843c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
853c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        private int getDelay(View view) {
863c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            Integer delay = mViewStartDelays.get(view);
873c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            if (delay != null) {
883c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu                return delay;
893c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            }
903c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            int idStartDelay = mIdStartDelays.get(view.getId(), -1);
913c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            if (idStartDelay != -1) {
923c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu                return idStartDelay;
933c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            }
943c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            delay = mClassStartDelays.get(view.getClass().getName());
953c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            if (delay != null) {
963c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu                return delay;
973c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            }
983c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            return mDefaultStartDelay;
993c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        }
1003c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1013c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        @Override
1023c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
1033c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu                TransitionValues endValues) {
1043c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            Animator animator = super.createAnimator(sceneRoot, startValues, endValues);
1053c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            if (animator != null && endValues != null && endValues.view != null) {
1063c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu                animator.setStartDelay(getDelay(endValues.view));
1073c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            }
1083c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            return animator;
1093c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        }
1103c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1113c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        public void setStartDelay(View view, int startDelay) {
1123c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            mViewStartDelays.put(view, startDelay);
1133c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        }
1143c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1153c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        public void setStartDelay(int viewId, int startDelay) {
1163c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            mIdStartDelays.put(viewId, startDelay);
1173c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        }
1183c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1193c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        public void setStartDelay(String className, int startDelay) {
1203c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            mClassStartDelays.put(className, startDelay);
1213c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        }
1223c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1233c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        public void setDefaultStartDelay(int startDelay) {
1243c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            mDefaultStartDelay = startDelay;
1253c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        }
1263c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1273c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1283c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    Object createChangeBounds(boolean reparent) {
1293c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        CustomChangeBounds changeBounds = new CustomChangeBounds();
1303c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        changeBounds.setReparent(reparent);
1313c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        return changeBounds;
1323c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1333c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1343c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) {
1353c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((CustomChangeBounds) changeBounds).setStartDelay(viewId, startDelay);
1363c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1373c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1383c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) {
1393c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((CustomChangeBounds) changeBounds).setStartDelay(view, startDelay);
1403c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1413c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1423c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void setChangeBoundsStartDelay(Object changeBounds, String className, int startDelay) {
1433c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((CustomChangeBounds) changeBounds).setStartDelay(className, startDelay);
1443c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1453c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1463c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) {
1473c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((CustomChangeBounds) changeBounds).setDefaultStartDelay(startDelay);
1483c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1493c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1502f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    void setStartDelay(Object transition, long startDelay) {
1512f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu        ((Transition)transition).setStartDelay(startDelay);
1522f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    }
1532f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu
1542f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    void setDuration(Object transition, long duration) {
1552f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu        ((Transition)transition).setDuration(duration);
1562f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    }
1572f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu
1583c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void exclude(Object transition, int targetId, boolean exclude) {
1593c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((Transition) transition).excludeTarget(targetId, exclude);
1603c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1613c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1623c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void exclude(Object transition, View targetView, boolean exclude) {
1633c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((Transition) transition).excludeTarget(targetView, exclude);
1643c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1653c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1669240e796bc63422c28f2707840bd99c48573279bDake Gu    void excludeChildren(Object transition, int targetId, boolean exclude) {
1679240e796bc63422c28f2707840bd99c48573279bDake Gu        ((Transition) transition).excludeChildren(targetId, exclude);
1689240e796bc63422c28f2707840bd99c48573279bDake Gu    }
1699240e796bc63422c28f2707840bd99c48573279bDake Gu
1709240e796bc63422c28f2707840bd99c48573279bDake Gu    void excludeChildren(Object transition, View targetView, boolean exclude) {
1719240e796bc63422c28f2707840bd99c48573279bDake Gu        ((Transition) transition).excludeChildren(targetView, exclude);
1729240e796bc63422c28f2707840bd99c48573279bDake Gu    }
1739240e796bc63422c28f2707840bd99c48573279bDake Gu
1743c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void include(Object transition, int targetId) {
1753c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((Transition) transition).addTarget(targetId);
1763c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1773c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1783c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void include(Object transition, View targetView) {
1793c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((Transition) transition).addTarget(targetView);
1803c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1813c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1822f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    public void setTransitionListener(Object transition, final TransitionListener listener) {
1839240e796bc63422c28f2707840bd99c48573279bDake Gu        Transition t = (Transition) transition;
1849240e796bc63422c28f2707840bd99c48573279bDake Gu        t.addListener(new Transition.TransitionListener() {
1859240e796bc63422c28f2707840bd99c48573279bDake Gu
1869240e796bc63422c28f2707840bd99c48573279bDake Gu            @Override
1879240e796bc63422c28f2707840bd99c48573279bDake Gu            public void onTransitionStart(Transition transition) {
1882f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu                listener.onTransitionStart(transition);
1899240e796bc63422c28f2707840bd99c48573279bDake Gu            }
1909240e796bc63422c28f2707840bd99c48573279bDake Gu
1919240e796bc63422c28f2707840bd99c48573279bDake Gu            @Override
1929240e796bc63422c28f2707840bd99c48573279bDake Gu            public void onTransitionResume(Transition transition) {
1939240e796bc63422c28f2707840bd99c48573279bDake Gu            }
1949240e796bc63422c28f2707840bd99c48573279bDake Gu
1959240e796bc63422c28f2707840bd99c48573279bDake Gu            @Override
1969240e796bc63422c28f2707840bd99c48573279bDake Gu            public void onTransitionPause(Transition transition) {
1979240e796bc63422c28f2707840bd99c48573279bDake Gu            }
1989240e796bc63422c28f2707840bd99c48573279bDake Gu
1999240e796bc63422c28f2707840bd99c48573279bDake Gu            @Override
2009240e796bc63422c28f2707840bd99c48573279bDake Gu            public void onTransitionEnd(Transition transition) {
2012f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu                listener.onTransitionEnd(transition);
2029240e796bc63422c28f2707840bd99c48573279bDake Gu            }
2039240e796bc63422c28f2707840bd99c48573279bDake Gu
2049240e796bc63422c28f2707840bd99c48573279bDake Gu            @Override
2059240e796bc63422c28f2707840bd99c48573279bDake Gu            public void onTransitionCancel(Transition transition) {
2069240e796bc63422c28f2707840bd99c48573279bDake Gu            }
2079240e796bc63422c28f2707840bd99c48573279bDake Gu        });
2089240e796bc63422c28f2707840bd99c48573279bDake Gu    }
2099240e796bc63422c28f2707840bd99c48573279bDake Gu
2109240e796bc63422c28f2707840bd99c48573279bDake Gu    void runTransition(Object scene, Object transition) {
2119240e796bc63422c28f2707840bd99c48573279bDake Gu        TransitionManager.go((Scene) scene, (Transition) transition);
21255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
2136f8c0cb076a103d044b18fc58117e37d2319d9ebCraig Stout
2146f8c0cb076a103d044b18fc58117e37d2319d9ebCraig Stout    void setInterpolator(Object transition, Object timeInterpolator) {
2156f8c0cb076a103d044b18fc58117e37d2319d9ebCraig Stout        ((Transition) transition).setInterpolator((TimeInterpolator) timeInterpolator);
2166f8c0cb076a103d044b18fc58117e37d2319d9ebCraig Stout    }
21755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout}
218