TransitionHelperKitkat.java revision 2f97594742886d045ca1ce409ebc6e6e780452f6
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 */
1455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutpackage android.support.v17.leanback.app;
1555c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
163c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.animation.Animator;
1755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.content.Context;
189240e796bc63422c28f2707840bd99c48573279bDake Guimport android.transition.AutoTransition;
193c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.transition.ChangeBounds;
203c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.transition.Fade;
2155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.transition.Scene;
2255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.transition.Transition;
2355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.transition.TransitionManager;
243c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.transition.TransitionSet;
253c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.transition.TransitionValues;
263c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.util.SparseBooleanArray;
273c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport android.util.SparseIntArray;
289240e796bc63422c28f2707840bd99c48573279bDake Guimport android.view.View;
2955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutimport android.view.ViewGroup;
3055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
313c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport java.util.ArrayList;
323c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Guimport java.util.HashMap;
333c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
3455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stoutclass TransitionHelperKitkat {
353c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
36e34cae48707e70442aca13e1b4ab55757292828dDake Gu    TransitionHelperKitkat() {
3755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
3855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
399240e796bc63422c28f2707840bd99c48573279bDake Gu    Object createScene(ViewGroup sceneRoot, Runnable enterAction) {
4055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout        Scene scene = new Scene(sceneRoot);
419240e796bc63422c28f2707840bd99c48573279bDake Gu        scene.setEnterAction(enterAction);
429240e796bc63422c28f2707840bd99c48573279bDake Gu        return scene;
4355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
4455c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout
453c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    Object createTransitionSet(boolean sequential) {
463c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        TransitionSet set = new TransitionSet();
473c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        set.setOrdering(sequential ? TransitionSet.ORDERING_SEQUENTIAL :
483c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            TransitionSet.ORDERING_TOGETHER);
493c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        return set;
503c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
513c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
523c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void addTransition(Object transitionSet, Object transition) {
533c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((TransitionSet) transitionSet).addTransition((Transition) transition);
543c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
553c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
569240e796bc63422c28f2707840bd99c48573279bDake Gu    Object createAutoTransition() {
579240e796bc63422c28f2707840bd99c48573279bDake Gu        return new AutoTransition();
589240e796bc63422c28f2707840bd99c48573279bDake Gu    }
599240e796bc63422c28f2707840bd99c48573279bDake Gu
602f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    Object createSlide(SlideCallback callback) {
612f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu        Slide slide = new Slide();
622f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu        slide.setCallback(callback);
632f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu        return slide;
642f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    }
652f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu
663c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    Object createFadeTransition(int fadingMode) {
673c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        Fade fade = new Fade(fadingMode);
683c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        return fade;
693c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
703c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
713c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    /**
723c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu     * change bounds that support customized start delay.
733c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu     */
743c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    static class CustomChangeBounds extends ChangeBoundsKitKat {
753c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
763c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        int mDefaultStartDelay;
773c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        // View -> delay
783c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        final HashMap<View, Integer> mViewStartDelays = new HashMap<View, Integer>();
793c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        // id -> delay
803c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        final SparseIntArray mIdStartDelays = new SparseIntArray();
813c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        // Class.getName() -> delay
823c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        final HashMap<String, Integer> mClassStartDelays = new HashMap<String, Integer>();
833c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
843c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        private int getDelay(View view) {
853c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            Integer delay = mViewStartDelays.get(view);
863c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            if (delay != null) {
873c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu                return delay;
883c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            }
893c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            int idStartDelay = mIdStartDelays.get(view.getId(), -1);
903c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            if (idStartDelay != -1) {
913c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu                return idStartDelay;
923c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            }
933c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            delay = mClassStartDelays.get(view.getClass().getName());
943c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            if (delay != null) {
953c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu                return delay;
963c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            }
973c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            return mDefaultStartDelay;
983c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        }
993c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1003c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        @Override
1013c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues,
1023c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu                TransitionValues endValues) {
1033c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            Animator animator = super.createAnimator(sceneRoot, startValues, endValues);
1043c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            if (animator != null && endValues != null && endValues.view != null) {
1053c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu                animator.setStartDelay(getDelay(endValues.view));
1063c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            }
1073c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            return animator;
1083c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        }
1093c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1103c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        public void setStartDelay(View view, int startDelay) {
1113c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            mViewStartDelays.put(view, startDelay);
1123c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        }
1133c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1143c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        public void setStartDelay(int viewId, int startDelay) {
1153c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            mIdStartDelays.put(viewId, startDelay);
1163c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        }
1173c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1183c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        public void setStartDelay(String className, int startDelay) {
1193c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            mClassStartDelays.put(className, startDelay);
1203c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        }
1213c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1223c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        public void setDefaultStartDelay(int startDelay) {
1233c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu            mDefaultStartDelay = startDelay;
1243c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        }
1253c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1263c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1273c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    Object createChangeBounds(boolean reparent) {
1283c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        CustomChangeBounds changeBounds = new CustomChangeBounds();
1293c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        changeBounds.setReparent(reparent);
1303c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        return changeBounds;
1313c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1323c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1333c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) {
1343c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((CustomChangeBounds) changeBounds).setStartDelay(viewId, startDelay);
1353c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1363c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1373c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) {
1383c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((CustomChangeBounds) changeBounds).setStartDelay(view, startDelay);
1393c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1403c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1413c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void setChangeBoundsStartDelay(Object changeBounds, String className, int startDelay) {
1423c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((CustomChangeBounds) changeBounds).setStartDelay(className, startDelay);
1433c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1443c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1453c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) {
1463c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((CustomChangeBounds) changeBounds).setDefaultStartDelay(startDelay);
1473c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1483c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1492f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    void setStartDelay(Object transition, long startDelay) {
1502f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu        ((Transition)transition).setStartDelay(startDelay);
1512f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    }
1522f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu
1532f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    void setDuration(Object transition, long duration) {
1542f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu        ((Transition)transition).setDuration(duration);
1552f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    }
1562f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu
1573c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void exclude(Object transition, int targetId, boolean exclude) {
1583c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((Transition) transition).excludeTarget(targetId, exclude);
1593c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1603c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1613c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void exclude(Object transition, View targetView, boolean exclude) {
1623c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((Transition) transition).excludeTarget(targetView, exclude);
1633c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1643c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1659240e796bc63422c28f2707840bd99c48573279bDake Gu    void excludeChildren(Object transition, int targetId, boolean exclude) {
1669240e796bc63422c28f2707840bd99c48573279bDake Gu        ((Transition) transition).excludeChildren(targetId, exclude);
1679240e796bc63422c28f2707840bd99c48573279bDake Gu    }
1689240e796bc63422c28f2707840bd99c48573279bDake Gu
1699240e796bc63422c28f2707840bd99c48573279bDake Gu    void excludeChildren(Object transition, View targetView, boolean exclude) {
1709240e796bc63422c28f2707840bd99c48573279bDake Gu        ((Transition) transition).excludeChildren(targetView, exclude);
1719240e796bc63422c28f2707840bd99c48573279bDake Gu    }
1729240e796bc63422c28f2707840bd99c48573279bDake Gu
1733c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void include(Object transition, int targetId) {
1743c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((Transition) transition).addTarget(targetId);
1753c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1763c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1773c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    void include(Object transition, View targetView) {
1783c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu        ((Transition) transition).addTarget(targetView);
1793c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu    }
1803c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu
1812f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu    public void setTransitionListener(Object transition, final TransitionListener listener) {
1829240e796bc63422c28f2707840bd99c48573279bDake Gu        Transition t = (Transition) transition;
1839240e796bc63422c28f2707840bd99c48573279bDake Gu        t.addListener(new Transition.TransitionListener() {
1849240e796bc63422c28f2707840bd99c48573279bDake Gu
1859240e796bc63422c28f2707840bd99c48573279bDake Gu            @Override
1869240e796bc63422c28f2707840bd99c48573279bDake Gu            public void onTransitionStart(Transition transition) {
1872f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu                listener.onTransitionStart(transition);
1889240e796bc63422c28f2707840bd99c48573279bDake Gu            }
1899240e796bc63422c28f2707840bd99c48573279bDake Gu
1909240e796bc63422c28f2707840bd99c48573279bDake Gu            @Override
1919240e796bc63422c28f2707840bd99c48573279bDake Gu            public void onTransitionResume(Transition transition) {
1929240e796bc63422c28f2707840bd99c48573279bDake Gu            }
1939240e796bc63422c28f2707840bd99c48573279bDake Gu
1949240e796bc63422c28f2707840bd99c48573279bDake Gu            @Override
1959240e796bc63422c28f2707840bd99c48573279bDake Gu            public void onTransitionPause(Transition transition) {
1969240e796bc63422c28f2707840bd99c48573279bDake Gu            }
1979240e796bc63422c28f2707840bd99c48573279bDake Gu
1989240e796bc63422c28f2707840bd99c48573279bDake Gu            @Override
1999240e796bc63422c28f2707840bd99c48573279bDake Gu            public void onTransitionEnd(Transition transition) {
2002f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu                listener.onTransitionEnd(transition);
2019240e796bc63422c28f2707840bd99c48573279bDake Gu            }
2029240e796bc63422c28f2707840bd99c48573279bDake Gu
2039240e796bc63422c28f2707840bd99c48573279bDake Gu            @Override
2049240e796bc63422c28f2707840bd99c48573279bDake Gu            public void onTransitionCancel(Transition transition) {
2059240e796bc63422c28f2707840bd99c48573279bDake Gu            }
2069240e796bc63422c28f2707840bd99c48573279bDake Gu        });
2079240e796bc63422c28f2707840bd99c48573279bDake Gu    }
2089240e796bc63422c28f2707840bd99c48573279bDake Gu
2099240e796bc63422c28f2707840bd99c48573279bDake Gu    void runTransition(Object scene, Object transition) {
2109240e796bc63422c28f2707840bd99c48573279bDake Gu        TransitionManager.go((Scene) scene, (Transition) transition);
21155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout    }
21255c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout}
213