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 40116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static 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 46116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static 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 53116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void addTransition(Object transitionSet, Object transition) { 543c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((TransitionSet) transitionSet).addTransition((Transition) transition); 553c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 563c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 57116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static Object createAutoTransition() { 589240e796bc63422c28f2707840bd99c48573279bDake Gu return new AutoTransition(); 599240e796bc63422c28f2707840bd99c48573279bDake Gu } 609240e796bc63422c28f2707840bd99c48573279bDake Gu 61116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static Object createSlide(SlideCallback callback) { 622f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu Slide slide = new Slide(); 632f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu slide.setCallback(callback); 642f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu return slide; 652f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 662f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 67116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static Object createScale() { 680fff85d7f9dee67ec5116f3cba4e8b3961f805a7Craig Stout Scale scale = new Scale(); 690fff85d7f9dee67ec5116f3cba4e8b3961f805a7Craig Stout return scale; 700fff85d7f9dee67ec5116f3cba4e8b3961f805a7Craig Stout } 710fff85d7f9dee67ec5116f3cba4e8b3961f805a7Craig Stout 72116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static Object createFadeTransition(int fadingMode) { 733c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Fade fade = new Fade(fadingMode); 743c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return fade; 753c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 763c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 773c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu /** 783c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu * change bounds that support customized start delay. 793c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu */ 8095400e6d31a1ac09e48cb8944a79b7250484aa4cDake Gu static class CustomChangeBounds extends ChangeBounds { 813c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 823c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu int mDefaultStartDelay; 833c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu // View -> delay 843c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu final HashMap<View, Integer> mViewStartDelays = new HashMap<View, Integer>(); 853c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu // id -> delay 863c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu final SparseIntArray mIdStartDelays = new SparseIntArray(); 873c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu // Class.getName() -> delay 883c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu final HashMap<String, Integer> mClassStartDelays = new HashMap<String, Integer>(); 893c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 903c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu private int getDelay(View view) { 913c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Integer delay = mViewStartDelays.get(view); 923c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (delay != null) { 933c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return delay; 943c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 953c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu int idStartDelay = mIdStartDelays.get(view.getId(), -1); 963c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (idStartDelay != -1) { 973c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return idStartDelay; 983c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 993c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu delay = mClassStartDelays.get(view.getClass().getName()); 1003c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (delay != null) { 1013c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return delay; 1023c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1033c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return mDefaultStartDelay; 1043c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1053c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1063c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu @Override 1073c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, 1083c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu TransitionValues endValues) { 1093c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu Animator animator = super.createAnimator(sceneRoot, startValues, endValues); 1103c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu if (animator != null && endValues != null && endValues.view != null) { 1113c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu animator.setStartDelay(getDelay(endValues.view)); 1123c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1133c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return animator; 1143c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1153c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1163c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public void setStartDelay(View view, int startDelay) { 1173c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mViewStartDelays.put(view, startDelay); 1183c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1193c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1203c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public void setStartDelay(int viewId, int startDelay) { 1213c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mIdStartDelays.put(viewId, startDelay); 1223c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1233c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1243c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public void setStartDelay(String className, int startDelay) { 1253c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mClassStartDelays.put(className, startDelay); 1263c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1273c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 1283c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu public void setDefaultStartDelay(int startDelay) { 1293c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu mDefaultStartDelay = startDelay; 1303c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1313c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1323c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 133116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static Object createChangeBounds(boolean reparent) { 1343c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu CustomChangeBounds changeBounds = new CustomChangeBounds(); 1353c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu changeBounds.setReparent(reparent); 1363c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu return changeBounds; 1373c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1383c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 139116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) { 1403c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((CustomChangeBounds) changeBounds).setStartDelay(viewId, startDelay); 1413c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1423c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 143116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) { 1443c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((CustomChangeBounds) changeBounds).setStartDelay(view, startDelay); 1453c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1463c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 147116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void setChangeBoundsStartDelay(Object changeBounds, String className, int startDelay) { 1483c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((CustomChangeBounds) changeBounds).setStartDelay(className, startDelay); 1493c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1503c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 151116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) { 1523c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((CustomChangeBounds) changeBounds).setDefaultStartDelay(startDelay); 1533c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1543c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 155116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void setStartDelay(Object transition, long startDelay) { 1562f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu ((Transition)transition).setStartDelay(startDelay); 1572f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 1582f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 159116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void setDuration(Object transition, long duration) { 1602f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu ((Transition)transition).setDuration(duration); 1612f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu } 1622f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu 163116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void exclude(Object transition, int targetId, boolean exclude) { 1643c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((Transition) transition).excludeTarget(targetId, exclude); 1653c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1663c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 167116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void exclude(Object transition, View targetView, boolean exclude) { 1683c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((Transition) transition).excludeTarget(targetView, exclude); 1693c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1703c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 171116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void excludeChildren(Object transition, int targetId, boolean exclude) { 1729240e796bc63422c28f2707840bd99c48573279bDake Gu ((Transition) transition).excludeChildren(targetId, exclude); 1739240e796bc63422c28f2707840bd99c48573279bDake Gu } 1749240e796bc63422c28f2707840bd99c48573279bDake Gu 175116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void excludeChildren(Object transition, View targetView, boolean exclude) { 1769240e796bc63422c28f2707840bd99c48573279bDake Gu ((Transition) transition).excludeChildren(targetView, exclude); 1779240e796bc63422c28f2707840bd99c48573279bDake Gu } 1789240e796bc63422c28f2707840bd99c48573279bDake Gu 179116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void include(Object transition, int targetId) { 1803c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((Transition) transition).addTarget(targetId); 1813c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1823c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 183116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void include(Object transition, View targetView) { 1843c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu ((Transition) transition).addTarget(targetView); 1853c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu } 1863c23ada8bc25a05bbaa8c479a9df72e8172c4349Dake Gu 187116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void setTransitionListener(Object transition, final TransitionListener listener) { 1889240e796bc63422c28f2707840bd99c48573279bDake Gu Transition t = (Transition) transition; 1899240e796bc63422c28f2707840bd99c48573279bDake Gu t.addListener(new Transition.TransitionListener() { 1909240e796bc63422c28f2707840bd99c48573279bDake Gu 1919240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 1929240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionStart(Transition transition) { 1932f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu listener.onTransitionStart(transition); 1949240e796bc63422c28f2707840bd99c48573279bDake Gu } 1959240e796bc63422c28f2707840bd99c48573279bDake Gu 1969240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 1979240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionResume(Transition transition) { 1989240e796bc63422c28f2707840bd99c48573279bDake Gu } 1999240e796bc63422c28f2707840bd99c48573279bDake Gu 2009240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 2019240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionPause(Transition transition) { 2029240e796bc63422c28f2707840bd99c48573279bDake Gu } 2039240e796bc63422c28f2707840bd99c48573279bDake Gu 2049240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 2059240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionEnd(Transition transition) { 2062f97594742886d045ca1ce409ebc6e6e780452f6Dake Gu listener.onTransitionEnd(transition); 2079240e796bc63422c28f2707840bd99c48573279bDake Gu } 2089240e796bc63422c28f2707840bd99c48573279bDake Gu 2099240e796bc63422c28f2707840bd99c48573279bDake Gu @Override 2109240e796bc63422c28f2707840bd99c48573279bDake Gu public void onTransitionCancel(Transition transition) { 2119240e796bc63422c28f2707840bd99c48573279bDake Gu } 2129240e796bc63422c28f2707840bd99c48573279bDake Gu }); 2139240e796bc63422c28f2707840bd99c48573279bDake Gu } 2149240e796bc63422c28f2707840bd99c48573279bDake Gu 215116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void runTransition(Object scene, Object transition) { 2169240e796bc63422c28f2707840bd99c48573279bDake Gu TransitionManager.go((Scene) scene, (Transition) transition); 21755c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout } 2186f8c0cb076a103d044b18fc58117e37d2319d9ebCraig Stout 219116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void setInterpolator(Object transition, Object timeInterpolator) { 2206f8c0cb076a103d044b18fc58117e37d2319d9ebCraig Stout ((Transition) transition).setInterpolator((TimeInterpolator) timeInterpolator); 2216f8c0cb076a103d044b18fc58117e37d2319d9ebCraig Stout } 2220fff85d7f9dee67ec5116f3cba4e8b3961f805a7Craig Stout 223116c06a5bc40fd4d1753012582842ecc5cd06aecDake Gu static void addTarget(Object transition, View view) { 2240fff85d7f9dee67ec5116f3cba4e8b3961f805a7Craig Stout ((Transition) transition).addTarget(view); 2250fff85d7f9dee67ec5116f3cba4e8b3961f805a7Craig Stout } 22655c9ee4b612ffc7b4632b1e4b7b7ab4900cd47c7Craig Stout} 227