/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package android.support.v17.leanback.transition; import android.animation.Animator; import android.animation.TimeInterpolator; import android.content.Context; import android.transition.AutoTransition; import android.transition.ChangeBounds; import android.transition.Fade; import android.transition.Scene; import android.transition.Transition; import android.transition.TransitionInflater; import android.transition.TransitionManager; import android.transition.TransitionSet; import android.transition.TransitionValues; import android.util.SparseBooleanArray; import android.util.SparseIntArray; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.HashMap; final class TransitionHelperKitkat { TransitionHelperKitkat() { } static Object createScene(ViewGroup sceneRoot, Runnable enterAction) { Scene scene = new Scene(sceneRoot); scene.setEnterAction(enterAction); return scene; } static Object createTransitionSet(boolean sequential) { TransitionSet set = new TransitionSet(); set.setOrdering(sequential ? TransitionSet.ORDERING_SEQUENTIAL : TransitionSet.ORDERING_TOGETHER); return set; } static void addTransition(Object transitionSet, Object transition) { ((TransitionSet) transitionSet).addTransition((Transition) transition); } static Object createAutoTransition() { return new AutoTransition(); } static Object createSlide(int slideEdge) { SlideKitkat slide = new SlideKitkat(); slide.setSlideEdge(slideEdge); return slide; } static Object createScale() { Scale scale = new Scale(); return scale; } static Object createFadeTransition(int fadingMode) { Fade fade = new Fade(fadingMode); return fade; } /** * change bounds that support customized start delay. */ static class CustomChangeBounds extends ChangeBounds { int mDefaultStartDelay; // View -> delay final HashMap mViewStartDelays = new HashMap(); // id -> delay final SparseIntArray mIdStartDelays = new SparseIntArray(); // Class.getName() -> delay final HashMap mClassStartDelays = new HashMap(); private int getDelay(View view) { Integer delay = mViewStartDelays.get(view); if (delay != null) { return delay; } int idStartDelay = mIdStartDelays.get(view.getId(), -1); if (idStartDelay != -1) { return idStartDelay; } delay = mClassStartDelays.get(view.getClass().getName()); if (delay != null) { return delay; } return mDefaultStartDelay; } @Override public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) { Animator animator = super.createAnimator(sceneRoot, startValues, endValues); if (animator != null && endValues != null && endValues.view != null) { animator.setStartDelay(getDelay(endValues.view)); } return animator; } public void setStartDelay(View view, int startDelay) { mViewStartDelays.put(view, startDelay); } public void setStartDelay(int viewId, int startDelay) { mIdStartDelays.put(viewId, startDelay); } public void setStartDelay(String className, int startDelay) { mClassStartDelays.put(className, startDelay); } public void setDefaultStartDelay(int startDelay) { mDefaultStartDelay = startDelay; } } static Object createChangeBounds(boolean reparent) { CustomChangeBounds changeBounds = new CustomChangeBounds(); changeBounds.setReparent(reparent); return changeBounds; } static void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) { ((CustomChangeBounds) changeBounds).setStartDelay(viewId, startDelay); } static void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) { ((CustomChangeBounds) changeBounds).setStartDelay(view, startDelay); } static void setChangeBoundsStartDelay(Object changeBounds, String className, int startDelay) { ((CustomChangeBounds) changeBounds).setStartDelay(className, startDelay); } static void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) { ((CustomChangeBounds) changeBounds).setDefaultStartDelay(startDelay); } static void setStartDelay(Object transition, long startDelay) { ((Transition)transition).setStartDelay(startDelay); } static void setDuration(Object transition, long duration) { ((Transition)transition).setDuration(duration); } static void exclude(Object transition, int targetId, boolean exclude) { ((Transition) transition).excludeTarget(targetId, exclude); } static void exclude(Object transition, View targetView, boolean exclude) { ((Transition) transition).excludeTarget(targetView, exclude); } static void excludeChildren(Object transition, int targetId, boolean exclude) { ((Transition) transition).excludeChildren(targetId, exclude); } static void excludeChildren(Object transition, View targetView, boolean exclude) { ((Transition) transition).excludeChildren(targetView, exclude); } static void include(Object transition, int targetId) { ((Transition) transition).addTarget(targetId); } static void include(Object transition, View targetView) { ((Transition) transition).addTarget(targetView); } static void setTransitionListener(Object transition, final TransitionListener listener) { Transition t = (Transition) transition; t.addListener(new Transition.TransitionListener() { @Override public void onTransitionStart(Transition transition) { listener.onTransitionStart(transition); } @Override public void onTransitionResume(Transition transition) { } @Override public void onTransitionPause(Transition transition) { } @Override public void onTransitionEnd(Transition transition) { listener.onTransitionEnd(transition); } @Override public void onTransitionCancel(Transition transition) { } }); } static void runTransition(Object scene, Object transition) { TransitionManager.go((Scene) scene, (Transition) transition); } static void setInterpolator(Object transition, Object timeInterpolator) { ((Transition) transition).setInterpolator((TimeInterpolator) timeInterpolator); } static void addTarget(Object transition, View view) { ((Transition) transition).addTarget(view); } static Object loadTransition(Context context, int resId) { return TransitionInflater.from(context).inflateTransition(resId); } }