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