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