180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright (C) 2014 The Android Open Source Project
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * in compliance with the License. You may obtain a copy of the License at
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * http://www.apache.org/licenses/LICENSE-2.0
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software distributed under the License
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * or implied. See the License for the specific language governing permissions and limitations under
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * the License.
13 */
14package android.support.v17.leanback.transition;
15
16import android.content.Context;
17import android.os.Build;
18import android.view.Gravity;
19import android.view.View;
20import android.view.ViewGroup;
21import android.view.Window;
22
23/**
24 * Helper for view transitions.
25 * @hide
26 */
27public final class TransitionHelper {
28
29    public static final int FADE_IN = 0x1;
30    public static final int FADE_OUT = 0x2;
31
32    public static final int SLIDE_LEFT = Gravity.LEFT;
33    public static final int SLIDE_TOP = Gravity.TOP;
34    public static final int SLIDE_RIGHT = Gravity.RIGHT;
35    public static final int SLIDE_BOTTOM = Gravity.BOTTOM;
36
37    private final static TransitionHelper sHelper = new TransitionHelper();
38    TransitionHelperVersionImpl mImpl;
39
40    /**
41     * Gets whether the system supports Transition animations.
42     *
43     * @return True if Transition animations are supported.
44     */
45    public static boolean systemSupportsTransitions() {
46        if (Build.VERSION.SDK_INT >= 19) {
47            // Supported on Android 4.4 or later.
48            return true;
49        }
50        return false;
51    }
52
53    /**
54     * Returns true if system supports entrance Transition animations.
55     */
56    public static boolean systemSupportsEntranceTransitions() {
57        return Build.VERSION.SDK_INT >= 21;
58    }
59
60    /**
61     * Interface implemented by classes that support Transition animations.
62     */
63    static interface TransitionHelperVersionImpl {
64
65        public Object getSharedElementEnterTransition(Window window);
66
67        public Object getSharedElementReturnTransition(Window window);
68
69        public Object getSharedElementExitTransition(Window window);
70
71        public Object getSharedElementReenterTransition(Window window);
72
73        public Object getEnterTransition(Window window);
74
75        public Object getReturnTransition(Window window);
76
77        public Object getExitTransition(Window window);
78
79        public Object getReenterTransition(Window window);
80
81        public Object createScene(ViewGroup sceneRoot, Runnable r);
82
83        public Object createAutoTransition();
84
85        public Object createSlide(int slideEdge);
86
87        public Object createScale();
88
89        public Object createFadeTransition(int fadingMode);
90
91        public Object createChangeBounds(boolean reparent);
92
93        public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay);
94
95        public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay);
96
97        public void setChangeBoundsStartDelay(Object changeBounds, String className,
98                int startDelay);
99
100        public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay);
101
102        public Object createTransitionSet(boolean sequential);
103
104        public void addTransition(Object transitionSet, Object transition);
105
106        public void setTransitionListener(Object transition, TransitionListener listener);
107
108        public void runTransition(Object scene, Object transition);
109
110        public void exclude(Object transition, int targetId, boolean exclude);
111
112        public void exclude(Object transition, View targetView, boolean exclude);
113
114        public void excludeChildren(Object transition, int targetId, boolean exclude);
115
116        public void excludeChildren(Object transition, View target, boolean exclude);
117
118        public void include(Object transition, int targetId);
119
120        public void include(Object transition, View targetView);
121
122        public void setStartDelay(Object transition, long startDelay);
123
124        public void setDuration(Object transition, long duration);
125
126        public void setInterpolator(Object transition, Object timeInterpolator);
127
128        public void addTarget(Object transition, View view);
129
130        public Object createDefaultInterpolator(Context context);
131
132        public Object loadTransition(Context context, int resId);
133    }
134
135    /**
136     * Interface used when we do not support Transition animations.
137     */
138    private static final class TransitionHelperStubImpl implements TransitionHelperVersionImpl {
139
140        private static class TransitionStub {
141            TransitionListener mTransitionListener;
142        }
143
144        @Override
145        public Object getSharedElementEnterTransition(Window window) {
146            return null;
147        }
148
149        @Override
150        public Object getSharedElementReturnTransition(Window window) {
151            return null;
152        }
153
154        @Override
155        public Object getSharedElementExitTransition(Window window) {
156            return null;
157        }
158
159        @Override
160        public Object getSharedElementReenterTransition(Window window) {
161            return null;
162        }
163
164        @Override
165        public Object getEnterTransition(Window window) {
166            return null;
167        }
168
169        @Override
170        public Object getReturnTransition(Window window) {
171            return null;
172        }
173
174        @Override
175        public Object getExitTransition(Window window) {
176            return null;
177        }
178
179        @Override
180        public Object getReenterTransition(Window window) {
181            return null;
182        }
183
184        @Override
185        public Object createScene(ViewGroup sceneRoot, Runnable r) {
186            return r;
187        }
188
189        @Override
190        public Object createAutoTransition() {
191            return new TransitionStub();
192        }
193
194        @Override
195        public Object createFadeTransition(int fadingMode) {
196            return new TransitionStub();
197        }
198
199        @Override
200        public Object createChangeBounds(boolean reparent) {
201            return new TransitionStub();
202        }
203
204        @Override
205        public Object createSlide(int slideEdge) {
206            return new TransitionStub();
207        }
208
209        @Override
210        public Object createScale() {
211            return new TransitionStub();
212        }
213
214        @Override
215        public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) {
216        }
217
218        @Override
219        public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) {
220        }
221
222        @Override
223        public void setChangeBoundsStartDelay(Object changeBounds, String className,
224                int startDelay) {
225        }
226
227        @Override
228        public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) {
229        }
230
231        @Override
232        public Object createTransitionSet(boolean sequential) {
233            return new TransitionStub();
234        }
235
236        @Override
237        public void addTransition(Object transitionSet, Object transition) {
238        }
239
240        @Override
241        public void exclude(Object transition, int targetId, boolean exclude) {
242        }
243
244        @Override
245        public void exclude(Object transition, View targetView, boolean exclude) {
246        }
247
248        @Override
249        public void excludeChildren(Object transition, int targetId, boolean exclude) {
250        }
251
252        @Override
253        public void excludeChildren(Object transition, View targetView, boolean exclude) {
254        }
255
256        @Override
257        public void include(Object transition, int targetId) {
258        }
259
260        @Override
261        public void include(Object transition, View targetView) {
262        }
263
264        @Override
265        public void setStartDelay(Object transition, long startDelay) {
266        }
267
268        @Override
269        public void setDuration(Object transition, long duration) {
270        }
271
272        @Override
273        public void setTransitionListener(Object transition, TransitionListener listener) {
274            ((TransitionStub) transition).mTransitionListener = listener;
275        }
276
277        @Override
278        public void runTransition(Object scene, Object transition) {
279            TransitionStub transitionStub = (TransitionStub) transition;
280            if (transitionStub != null && transitionStub.mTransitionListener != null) {
281                transitionStub.mTransitionListener.onTransitionStart(transition);
282            }
283            Runnable r = ((Runnable) scene);
284            if (r != null) {
285                r.run();
286            }
287            if (transitionStub != null && transitionStub.mTransitionListener != null) {
288                transitionStub.mTransitionListener.onTransitionEnd(transition);
289            }
290        }
291
292        @Override
293        public void setInterpolator(Object transition, Object timeInterpolator) {
294        }
295
296        @Override
297        public void addTarget(Object transition, View view) {
298        }
299
300        @Override
301        public Object createDefaultInterpolator(Context context) {
302            return null;
303        }
304
305        @Override
306        public Object loadTransition(Context context, int resId) {
307            return new TransitionStub();
308        }
309    }
310
311    /**
312     * Implementation used on KitKat (and above).
313     */
314    private static class TransitionHelperKitkatImpl implements TransitionHelperVersionImpl {
315
316        @Override
317        public Object getSharedElementEnterTransition(Window window) {
318            return null;
319        }
320
321        @Override
322        public Object getSharedElementReturnTransition(Window window) {
323            return null;
324        }
325
326        @Override
327        public Object getSharedElementExitTransition(Window window) {
328            return null;
329        }
330
331        @Override
332        public Object getSharedElementReenterTransition(Window window) {
333            return null;
334        }
335
336        @Override
337        public Object getEnterTransition(Window window) {
338            return null;
339        }
340
341        @Override
342        public Object getReturnTransition(Window window) {
343            return null;
344        }
345
346        @Override
347        public Object getExitTransition(Window window) {
348            return null;
349        }
350
351        @Override
352        public Object getReenterTransition(Window window) {
353            return null;
354        }
355
356        @Override
357        public Object createScene(ViewGroup sceneRoot, Runnable r) {
358            return TransitionHelperKitkat.createScene(sceneRoot, r);
359        }
360
361        @Override
362        public Object createAutoTransition() {
363            return TransitionHelperKitkat.createAutoTransition();
364        }
365
366        @Override
367        public Object createFadeTransition(int fadingMode) {
368            return TransitionHelperKitkat.createFadeTransition(fadingMode);
369        }
370
371        @Override
372        public Object createChangeBounds(boolean reparent) {
373            return TransitionHelperKitkat.createChangeBounds(reparent);
374        }
375
376        @Override
377        public Object createSlide(int slideEdge) {
378            return TransitionHelperKitkat.createSlide(slideEdge);
379        }
380
381        @Override
382        public Object createScale() {
383            return TransitionHelperKitkat.createScale();
384        }
385
386        @Override
387        public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) {
388            TransitionHelperKitkat.setChangeBoundsStartDelay(changeBounds, view, startDelay);
389        }
390
391        @Override
392        public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) {
393            TransitionHelperKitkat.setChangeBoundsStartDelay(changeBounds, viewId, startDelay);
394        }
395
396        @Override
397        public void setChangeBoundsStartDelay(Object changeBounds, String className,
398                int startDelay) {
399            TransitionHelperKitkat.setChangeBoundsStartDelay(changeBounds, className, startDelay);
400        }
401
402        @Override
403        public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) {
404            TransitionHelperKitkat.setChangeBoundsDefaultStartDelay(changeBounds, startDelay);
405        }
406
407        @Override
408        public Object createTransitionSet(boolean sequential) {
409            return TransitionHelperKitkat.createTransitionSet(sequential);
410        }
411
412        @Override
413        public void addTransition(Object transitionSet, Object transition) {
414            TransitionHelperKitkat.addTransition(transitionSet, transition);
415        }
416
417        @Override
418        public void exclude(Object transition, int targetId, boolean exclude) {
419            TransitionHelperKitkat.exclude(transition, targetId, exclude);
420        }
421
422        @Override
423        public void exclude(Object transition, View targetView, boolean exclude) {
424            TransitionHelperKitkat.exclude(transition, targetView, exclude);
425        }
426
427        @Override
428        public void excludeChildren(Object transition, int targetId, boolean exclude) {
429            TransitionHelperKitkat.excludeChildren(transition, targetId, exclude);
430        }
431
432        @Override
433        public void excludeChildren(Object transition, View targetView, boolean exclude) {
434            TransitionHelperKitkat.excludeChildren(transition, targetView, exclude);
435        }
436
437        @Override
438        public void include(Object transition, int targetId) {
439            TransitionHelperKitkat.include(transition, targetId);
440        }
441
442        @Override
443        public void include(Object transition, View targetView) {
444            TransitionHelperKitkat.include(transition, targetView);
445        }
446
447        @Override
448        public void setStartDelay(Object transition, long startDelay) {
449            TransitionHelperKitkat.setStartDelay(transition, startDelay);
450        }
451
452        @Override
453        public void setDuration(Object transition, long duration) {
454            TransitionHelperKitkat.setDuration(transition, duration);
455        }
456
457        @Override
458        public void setTransitionListener(Object transition, TransitionListener listener) {
459            TransitionHelperKitkat.setTransitionListener(transition, listener);
460        }
461
462        @Override
463        public void runTransition(Object scene, Object transition) {
464            TransitionHelperKitkat.runTransition(scene, transition);
465        }
466
467        @Override
468        public void setInterpolator(Object transition, Object timeInterpolator) {
469            TransitionHelperKitkat.setInterpolator(transition, timeInterpolator);
470        }
471
472        @Override
473        public void addTarget(Object transition, View view) {
474            TransitionHelperKitkat.addTarget(transition, view);
475        }
476
477        @Override
478        public Object createDefaultInterpolator(Context context) {
479            return null;
480        }
481
482        @Override
483        public Object loadTransition(Context context, int resId) {
484            return TransitionHelperKitkat.loadTransition(context, resId);
485        }
486    }
487
488    private static final class TransitionHelperApi21Impl extends TransitionHelperKitkatImpl {
489
490        @Override
491        public Object getSharedElementEnterTransition(Window window) {
492            return TransitionHelperApi21.getSharedElementEnterTransition(window);
493        }
494
495        @Override
496        public Object getSharedElementReturnTransition(Window window) {
497            return TransitionHelperApi21.getSharedElementReturnTransition(window);
498        }
499
500        @Override
501        public Object getSharedElementExitTransition(Window window) {
502            return TransitionHelperApi21.getSharedElementExitTransition(window);
503        }
504
505        @Override
506        public Object getSharedElementReenterTransition(Window window) {
507            return TransitionHelperApi21.getSharedElementReenterTransition(window);
508        }
509
510        @Override
511        public Object getEnterTransition(Window window) {
512            return TransitionHelperApi21.getEnterTransition(window);
513        }
514
515        @Override
516        public Object getReturnTransition(Window window) {
517            return TransitionHelperApi21.getReturnTransition(window);
518        }
519
520        @Override
521        public Object getExitTransition(Window window) {
522            return TransitionHelperApi21.getExitTransition(window);
523        }
524
525        @Override
526        public Object getReenterTransition(Window window) {
527            return TransitionHelperApi21.getReenterTransition(window);
528        }
529
530        @Override
531        public Object createScale() {
532            return TransitionHelperApi21.createScale();
533        }
534
535        @Override
536        public Object createDefaultInterpolator(Context context) {
537            return TransitionHelperApi21.createDefaultInterpolator(context);
538        }
539    }
540
541    /**
542     * Returns the TransitionHelper that can be used to perform Transition
543     * animations.
544     */
545    public static TransitionHelper getInstance() {
546        return sHelper;
547    }
548
549    private TransitionHelper() {
550        if (Build.VERSION.SDK_INT >= 21) {
551            mImpl = new TransitionHelperApi21Impl();
552        } else  if (systemSupportsTransitions()) {
553            mImpl = new TransitionHelperKitkatImpl();
554        } else {
555            mImpl = new TransitionHelperStubImpl();
556        }
557    }
558
559    public Object getSharedElementEnterTransition(Window window) {
560        return mImpl.getSharedElementEnterTransition(window);
561    }
562
563    public Object getSharedElementReturnTransition(Window window) {
564        return mImpl.getSharedElementReturnTransition(window);
565    }
566
567    public Object getSharedElementExitTransition(Window window) {
568        return mImpl.getSharedElementExitTransition(window);
569    }
570
571    public Object getSharedElementReenterTransition(Window window) {
572        return mImpl.getSharedElementReenterTransition(window);
573    }
574
575    public Object getEnterTransition(Window window) {
576        return mImpl.getEnterTransition(window);
577    }
578
579    public Object getReturnTransition(Window window) {
580        return mImpl.getReturnTransition(window);
581    }
582
583    public Object getExitTransition(Window window) {
584        return mImpl.getExitTransition(window);
585    }
586
587    public Object getReenterTransition(Window window) {
588        return mImpl.getReenterTransition(window);
589    }
590
591    public Object createScene(ViewGroup sceneRoot, Runnable r) {
592        return mImpl.createScene(sceneRoot, r);
593    }
594
595    public Object createChangeBounds(boolean reparent) {
596        return mImpl.createChangeBounds(reparent);
597    }
598
599    public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) {
600        mImpl.setChangeBoundsStartDelay(changeBounds, view, startDelay);
601    }
602
603    public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) {
604        mImpl.setChangeBoundsStartDelay(changeBounds, viewId, startDelay);
605    }
606
607    public void setChangeBoundsStartDelay(Object changeBounds, String className, int startDelay) {
608        mImpl.setChangeBoundsStartDelay(changeBounds, className, startDelay);
609    }
610
611    public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) {
612        mImpl.setChangeBoundsDefaultStartDelay(changeBounds, startDelay);
613    }
614
615    public Object createTransitionSet(boolean sequential) {
616        return mImpl.createTransitionSet(sequential);
617    }
618
619    public Object createSlide(int slideEdge) {
620        return mImpl.createSlide(slideEdge);
621    }
622
623    public Object createScale() {
624        return mImpl.createScale();
625    }
626
627    public void addTransition(Object transitionSet, Object transition) {
628        mImpl.addTransition(transitionSet, transition);
629    }
630
631    public void exclude(Object transition, int targetId, boolean exclude) {
632        mImpl.exclude(transition, targetId, exclude);
633    }
634
635    public void exclude(Object transition, View targetView, boolean exclude) {
636        mImpl.exclude(transition, targetView, exclude);
637    }
638
639    public void excludeChildren(Object transition, int targetId, boolean exclude) {
640        mImpl.excludeChildren(transition, targetId, exclude);
641    }
642
643    public void excludeChildren(Object transition, View targetView, boolean exclude) {
644        mImpl.excludeChildren(transition, targetView, exclude);
645    }
646
647    public void include(Object transition, int targetId) {
648        mImpl.include(transition, targetId);
649    }
650
651    public void include(Object transition, View targetView) {
652        mImpl.include(transition, targetView);
653    }
654
655    public void setStartDelay(Object transition, long startDelay) {
656        mImpl.setStartDelay(transition, startDelay);
657    }
658
659    public void setDuration(Object transition, long duration) {
660        mImpl.setDuration(transition, duration);
661    }
662
663    public Object createAutoTransition() {
664        return mImpl.createAutoTransition();
665    }
666
667    public Object createFadeTransition(int fadeMode) {
668        return mImpl.createFadeTransition(fadeMode);
669    }
670
671    public void setTransitionListener(Object transition, TransitionListener listener) {
672        mImpl.setTransitionListener(transition, listener);
673    }
674
675    public void runTransition(Object scene, Object transition) {
676        mImpl.runTransition(scene, transition);
677    }
678
679    public void setInterpolator(Object transition, Object timeInterpolator) {
680        mImpl.setInterpolator(transition, timeInterpolator);
681    }
682
683    public void addTarget(Object transition, View view) {
684        mImpl.addTarget(transition, view);
685    }
686
687    public Object createDefaultInterpolator(Context context) {
688        return mImpl.createDefaultInterpolator(context);
689    }
690
691    public Object loadTransition(Context context, int resId) {
692        return mImpl.loadTransition(context, resId);
693    }
694}
695