TransitionHelperKitkat.java revision 3c23ada8bc25a05bbaa8c479a9df72e8172c4349
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 3655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout private final Context mContext; 3755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 3855c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout TransitionHelperKitkat(Context context) { 3955c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout mContext = context; 4055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 4155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 429240e796bc63422c28f2707840bd99c48573279bDake Gu Object createScene(ViewGroup sceneRoot, Runnable enterAction) { 4355c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout Scene scene = new Scene(sceneRoot); 449240e796bc63422c28f2707840bd99c48573279bDake Gu scene.setEnterAction(enterAction); 459240e796bc63422c28f2707840bd99c48573279bDake Gu return scene; 4655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 4755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout 483c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Object createTransitionSet(boolean sequential) { 493c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu TransitionSet set = new TransitionSet(); 503c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu set.setOrdering(sequential ? TransitionSet.ORDERING_SEQUENTIAL : 513c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu TransitionSet.ORDERING_TOGETHER); 523c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return set; 533c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 543c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 553c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void addTransition(Object transitionSet, Object transition) { 563c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((TransitionSet) transitionSet).addTransition((Transition) transition); 573c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 583c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 599240e796bc63422c28f2707840bd99c48573279bDake Gu Object createAutoTransition() { 609240e796bc63422c28f2707840bd99c48573279bDake Gu return new AutoTransition(); 619240e796bc63422c28f2707840bd99c48573279bDake Gu } 629240e796bc63422c28f2707840bd99c48573279bDake Gu 633c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Object createFadeTransition(int fadingMode) { 643c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Fade fade = new Fade(fadingMode); 653c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return fade; 663c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 673c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 683c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu /** 693c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu * change bounds that support customized start delay. 703c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu */ 713c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu static class CustomChangeBounds extends ChangeBoundsKitKat { 723c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 733c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu int mDefaultStartDelay; 743c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu // View -> delay 753c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu final HashMap<View, Integer> mViewStartDelays = new HashMap<View, Integer>(); 763c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu // id -> delay 773c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu final SparseIntArray mIdStartDelays = new SparseIntArray(); 783c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu // Class.getName() -> delay 793c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu final HashMap<String, Integer> mClassStartDelays = new HashMap<String, Integer>(); 803c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 813c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu private int getDelay(View view) { 823c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Integer delay = mViewStartDelays.get(view); 833c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (delay != null) { 843c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return delay; 853c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 863c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu int idStartDelay = mIdStartDelays.get(view.getId(), -1); 873c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (idStartDelay != -1) { 883c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return idStartDelay; 893c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 903c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu delay = mClassStartDelays.get(view.getClass().getName()); 913c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (delay != null) { 923c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return delay; 933c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 943c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return mDefaultStartDelay; 953c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 963c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 973c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu @Override 983c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, 993c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu TransitionValues endValues) { 1003c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Animator animator = super.createAnimator(sceneRoot, startValues, endValues); 1013c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (animator != null && endValues != null && endValues.view != null) { 1023c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu animator.setStartDelay(getDelay(endValues.view)); 1033c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1043c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return animator; 1053c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1063c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1073c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public void setStartDelay(View view, int startDelay) { 1083c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mViewStartDelays.put(view, startDelay); 1093c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1103c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1113c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public void setStartDelay(int viewId, int startDelay) { 1123c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mIdStartDelays.put(viewId, startDelay); 1133c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1143c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1153c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public void setStartDelay(String className, int startDelay) { 1163c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mClassStartDelays.put(className, startDelay); 1173c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1183c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1193c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public void setDefaultStartDelay(int startDelay) { 1203c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mDefaultStartDelay = startDelay; 1213c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1223c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1233c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1243c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Object createChangeBounds(boolean reparent) { 1253c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu CustomChangeBounds changeBounds = new CustomChangeBounds(); 1263c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu changeBounds.setReparent(reparent); 1273c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return changeBounds; 1283c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1293c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1303c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) { 1313c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((CustomChangeBounds) changeBounds).setStartDelay(viewId, startDelay); 1323c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1333c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1343c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) { 1353c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((CustomChangeBounds) changeBounds).setStartDelay(view, startDelay); 1363c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1373c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1383c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void setChangeBoundsStartDelay(Object changeBounds, String className, int startDelay) { 1393c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((CustomChangeBounds) changeBounds).setStartDelay(className, startDelay); 1403c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1413c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1423c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) { 1433c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((CustomChangeBounds) changeBounds).setDefaultStartDelay(startDelay); 1443c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1453c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1463c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void exclude(Object transition, int targetId, boolean exclude) { 1473c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((Transition) transition).excludeTarget(targetId, exclude); 1483c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1493c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1503c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void exclude(Object transition, View targetView, boolean exclude) { 1513c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((Transition) transition).excludeTarget(targetView, exclude); 1523c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1533c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1549240e796bc63422c28f2707840bd99c48573279bDake Gu void excludeChildren(Object transition, int targetId, boolean exclude) { 1559240e796bc63422c28f2707840bd99c48573279bDake Gu ((Transition) transition).excludeChildren(targetId, exclude); 1569240e796bc63422c28f2707840bd99c48573279bDake Gu } 1579240e796bc63422c28f2707840bd99c48573279bDake Gu 1589240e796bc63422c28f2707840bd99c48573279bDake Gu void excludeChildren(Object transition, View targetView, boolean exclude) { 1599240e796bc63422c28f2707840bd99c48573279bDake Gu ((Transition) transition).excludeChildren(targetView, exclude); 1609240e796bc63422c28f2707840bd99c48573279bDake Gu } 1619240e796bc63422c28f2707840bd99c48573279bDake Gu 1623c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void include(Object transition, int targetId) { 1633c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((Transition) transition).addTarget(targetId); 1643c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1653c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1663c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu void include(Object transition, View targetView) { 1673c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((Transition) transition).addTarget(targetView); 1683c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1693c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1709240e796bc63422c28f2707840bd99c48573279bDake Gu public void setTransitionCompleteListener(Object transition, Runnable listener) { 1719240e796bc63422c28f2707840bd99c48573279bDake Gu Transition t = (Transition) transition; 1729240e796bc63422c28f2707840bd99c48573279bDake Gu final Runnable completeListener = listener; 1739240e796bc63422c28f2707840bd99c48573279bDake Gu t.addListener(new Transition.TransitionListener() { 1749240e796bc63422c28f2707840bd99c48573279bDake Gu 1759240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 1769240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionStart(Transition transition) { 1779240e796bc63422c28f2707840bd99c48573279bDake Gu } 1789240e796bc63422c28f2707840bd99c48573279bDake Gu 1799240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 1809240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionResume(Transition transition) { 1819240e796bc63422c28f2707840bd99c48573279bDake Gu } 1829240e796bc63422c28f2707840bd99c48573279bDake Gu 1839240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 1849240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionPause(Transition transition) { 1859240e796bc63422c28f2707840bd99c48573279bDake Gu } 1869240e796bc63422c28f2707840bd99c48573279bDake Gu 1879240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 1889240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionEnd(Transition transition) { 1899240e796bc63422c28f2707840bd99c48573279bDake Gu completeListener.run(); 1909240e796bc63422c28f2707840bd99c48573279bDake Gu } 1919240e796bc63422c28f2707840bd99c48573279bDake Gu 1929240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 1939240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionCancel(Transition transition) { 1949240e796bc63422c28f2707840bd99c48573279bDake Gu } 1959240e796bc63422c28f2707840bd99c48573279bDake Gu }); 1969240e796bc63422c28f2707840bd99c48573279bDake Gu } 1979240e796bc63422c28f2707840bd99c48573279bDake Gu 1989240e796bc63422c28f2707840bd99c48573279bDake Gu void runTransition(Object scene, Object transition) { 1999240e796bc63422c28f2707840bd99c48573279bDake Gu TransitionManager.go((Scene) scene, (Transition) transition); 20055c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 20155c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout} 202